annotate src/portaudio_20140130/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx @ 124:e3d5853d5918

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