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