annotate src/portaudio_20140130/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx @ 39:7ddb4fc30dac

Current stable PortAudio source
author Chris Cannam
date Tue, 18 Oct 2016 13:11:05 +0100
parents
children
rev   line source
Chris@39 1 #include "portaudiocpp/CppFunCallbackStream.hxx"
Chris@39 2
Chris@39 3 #include "portaudiocpp/StreamParameters.hxx"
Chris@39 4 #include "portaudiocpp/Exception.hxx"
Chris@39 5
Chris@39 6 namespace portaudio
Chris@39 7 {
Chris@39 8 namespace impl
Chris@39 9 {
Chris@39 10 //////
Chris@39 11 /// Adapts any a C++ callback to a C-callable function (ie this function). A
Chris@39 12 /// pointer to a struct with the C++ function pointer and the actual user data should be
Chris@39 13 /// passed as the ``userData'' parameter when setting up the callback.
Chris@39 14 //////
Chris@39 15 int cppCallbackToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames,
Chris@39 16 const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
Chris@39 17 {
Chris@39 18 FunCallbackStream::CppToCCallbackData *data = static_cast<FunCallbackStream::CppToCCallbackData *>(userData);
Chris@39 19 return data->funPtr(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags, data->userData);
Chris@39 20 }
Chris@39 21 }
Chris@39 22
Chris@39 23 // -----------------------------------------------------------------------------------
Chris@39 24
Chris@39 25 FunCallbackStream::CppToCCallbackData::CppToCCallbackData()
Chris@39 26 {
Chris@39 27 }
Chris@39 28
Chris@39 29 FunCallbackStream::CppToCCallbackData::CppToCCallbackData(CallbackFunPtr funPtr, void *userData) : funPtr(funPtr), userData(userData)
Chris@39 30 {
Chris@39 31 }
Chris@39 32
Chris@39 33 void FunCallbackStream::CppToCCallbackData::init(CallbackFunPtr funPtr, void *userData)
Chris@39 34 {
Chris@39 35 this->funPtr = funPtr;
Chris@39 36 this->userData = userData;
Chris@39 37 }
Chris@39 38
Chris@39 39 // -----------------------------------------------------------------------------------
Chris@39 40
Chris@39 41 FunCallbackStream::FunCallbackStream()
Chris@39 42 {
Chris@39 43 }
Chris@39 44
Chris@39 45 FunCallbackStream::FunCallbackStream(const StreamParameters &parameters, CallbackFunPtr funPtr, void *userData) : adapterData_(funPtr, userData)
Chris@39 46 {
Chris@39 47 open(parameters);
Chris@39 48 }
Chris@39 49
Chris@39 50 FunCallbackStream::~FunCallbackStream()
Chris@39 51 {
Chris@39 52 try
Chris@39 53 {
Chris@39 54 close();
Chris@39 55 }
Chris@39 56 catch (...)
Chris@39 57 {
Chris@39 58 // ignore all errors
Chris@39 59 }
Chris@39 60 }
Chris@39 61
Chris@39 62 void FunCallbackStream::open(const StreamParameters &parameters, CallbackFunPtr funPtr, void *userData)
Chris@39 63 {
Chris@39 64 adapterData_.init(funPtr, userData);
Chris@39 65 open(parameters);
Chris@39 66 }
Chris@39 67
Chris@39 68 void FunCallbackStream::open(const StreamParameters &parameters)
Chris@39 69 {
Chris@39 70 PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(),
Chris@39 71 parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::cppCallbackToPaCallbackAdapter,
Chris@39 72 static_cast<void *>(&adapterData_));
Chris@39 73
Chris@39 74 if (err != paNoError)
Chris@39 75 {
Chris@39 76 throw PaException(err);
Chris@39 77 }
Chris@39 78 }
Chris@39 79
Chris@39 80 // -----------------------------------------------------------------------------------
Chris@39 81 }