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