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 ¶meters, 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 ¶meters, 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 ¶meters)
|
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 }
|