annotate src/portaudio_20161030/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx @ 169:223a55898ab9 tip default

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