Chris@4: #include "portaudiocpp/CppFunCallbackStream.hxx" Chris@4: Chris@4: #include "portaudiocpp/StreamParameters.hxx" Chris@4: #include "portaudiocpp/Exception.hxx" Chris@4: Chris@4: namespace portaudio Chris@4: { Chris@4: namespace impl Chris@4: { Chris@4: ////// Chris@4: /// Adapts any a C++ callback to a C-callable function (ie this function). A Chris@4: /// pointer to a struct with the C++ function pointer and the actual user data should be Chris@4: /// passed as the ``userData'' parameter when setting up the callback. Chris@4: ////// Chris@4: int cppCallbackToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, Chris@4: const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData) Chris@4: { Chris@4: FunCallbackStream::CppToCCallbackData *data = static_cast(userData); Chris@4: return data->funPtr(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags, data->userData); Chris@4: } Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: FunCallbackStream::CppToCCallbackData::CppToCCallbackData() Chris@4: { Chris@4: } Chris@4: Chris@4: FunCallbackStream::CppToCCallbackData::CppToCCallbackData(CallbackFunPtr funPtr, void *userData) : funPtr(funPtr), userData(userData) Chris@4: { Chris@4: } Chris@4: Chris@4: void FunCallbackStream::CppToCCallbackData::init(CallbackFunPtr funPtr, void *userData) Chris@4: { Chris@4: this->funPtr = funPtr; Chris@4: this->userData = userData; Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: FunCallbackStream::FunCallbackStream() Chris@4: { Chris@4: } Chris@4: Chris@4: FunCallbackStream::FunCallbackStream(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData) : adapterData_(funPtr, userData) Chris@4: { Chris@4: open(parameters); Chris@4: } Chris@4: Chris@4: FunCallbackStream::~FunCallbackStream() Chris@4: { Chris@4: try Chris@4: { Chris@4: close(); Chris@4: } Chris@4: catch (...) Chris@4: { Chris@4: // ignore all errors Chris@4: } Chris@4: } Chris@4: Chris@4: void FunCallbackStream::open(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData) Chris@4: { Chris@4: adapterData_.init(funPtr, userData); Chris@4: open(parameters); Chris@4: } Chris@4: Chris@4: void FunCallbackStream::open(const StreamParameters ¶meters) Chris@4: { Chris@4: PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), Chris@4: parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::cppCallbackToPaCallbackAdapter, Chris@4: static_cast(&adapterData_)); Chris@4: Chris@4: if (err != paNoError) Chris@4: { Chris@4: throw PaException(err); Chris@4: } Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: }