cannam@124: #ifndef INCLUDED_PORTAUDIO_CPPFUNCALLBACKSTREAM_HXX cannam@124: #define INCLUDED_PORTAUDIO_CPPFUNCALLBACKSTREAM_HXX cannam@124: cannam@124: // --------------------------------------------------------------------------------------- cannam@124: cannam@124: #include "portaudio.h" cannam@124: cannam@124: #include "portaudiocpp/CallbackStream.hxx" cannam@124: cannam@124: // --------------------------------------------------------------------------------------- cannam@124: cannam@124: // Forward declaration(s): cannam@124: namespace portaudio cannam@124: { cannam@124: class StreamParameters; cannam@124: } cannam@124: cannam@124: // --------------------------------------------------------------------------------------- cannam@124: cannam@124: // Declaration(s): cannam@124: namespace portaudio cannam@124: { cannam@124: cannam@124: cannam@124: namespace impl cannam@124: { cannam@124: extern "C" cannam@124: { cannam@124: int cppCallbackToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, cannam@124: const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, cannam@124: void *userData); cannam@124: } // extern "C" cannam@124: } cannam@124: cannam@124: // ----------------------------------------------------------------------------------- cannam@124: cannam@124: ////// cannam@124: /// @brief Callback stream using a C++ function (either a free function or a static function) cannam@124: /// callback. cannam@124: ////// cannam@124: class FunCallbackStream : public CallbackStream cannam@124: { cannam@124: public: cannam@124: typedef int (*CallbackFunPtr)(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, cannam@124: const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, cannam@124: void *userData); cannam@124: cannam@124: // ------------------------------------------------------------------------------- cannam@124: cannam@124: ////// cannam@124: /// @brief Simple structure containing a function pointer to the C++ callback function and a cannam@124: /// (void) pointer to the user supplied data. cannam@124: ////// cannam@124: struct CppToCCallbackData cannam@124: { cannam@124: CppToCCallbackData(); cannam@124: CppToCCallbackData(CallbackFunPtr funPtr, void *userData); cannam@124: void init(CallbackFunPtr funPtr, void *userData); cannam@124: cannam@124: CallbackFunPtr funPtr; cannam@124: void *userData; cannam@124: }; cannam@124: cannam@124: // ------------------------------------------------------------------------------- cannam@124: cannam@124: FunCallbackStream(); cannam@124: FunCallbackStream(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData); cannam@124: ~FunCallbackStream(); cannam@124: cannam@124: void open(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData); cannam@124: cannam@124: private: cannam@124: FunCallbackStream(const FunCallbackStream &); // non-copyable cannam@124: FunCallbackStream &operator=(const FunCallbackStream &); // non-copyable cannam@124: cannam@124: CppToCCallbackData adapterData_; cannam@124: cannam@124: void open(const StreamParameters ¶meters); cannam@124: }; cannam@124: cannam@124: cannam@124: } // portaudio cannam@124: cannam@124: // --------------------------------------------------------------------------------------- cannam@124: cannam@124: #endif // INCLUDED_PORTAUDIO_CPPFUNCALLBACKSTREAM_HXX