comparison src/portaudio/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx @ 4:e13257ea84a4

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