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