annotate src/portaudio_20161030/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx @ 55:284acf908dcd

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