annotate src/portaudio/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx @ 19:891f60ab2af1

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