Chris@4
|
1 #ifndef INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
|
Chris@4
|
2 #define INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
|
Chris@4
|
3
|
Chris@4
|
4 // ---------------------------------------------------------------------------------------
|
Chris@4
|
5
|
Chris@4
|
6 #include "portaudio.h"
|
Chris@4
|
7
|
Chris@4
|
8 #include "portaudiocpp/CallbackStream.hxx"
|
Chris@4
|
9 #include "portaudiocpp/CallbackInterface.hxx"
|
Chris@4
|
10 #include "portaudiocpp/StreamParameters.hxx"
|
Chris@4
|
11 #include "portaudiocpp/Exception.hxx"
|
Chris@4
|
12 #include "portaudiocpp/InterfaceCallbackStream.hxx"
|
Chris@4
|
13
|
Chris@4
|
14 // ---------------------------------------------------------------------------------------
|
Chris@4
|
15
|
Chris@4
|
16 namespace portaudio
|
Chris@4
|
17 {
|
Chris@4
|
18
|
Chris@4
|
19
|
Chris@4
|
20 //////
|
Chris@4
|
21 /// @brief Callback stream using a class's member function as a callback. Template argument T is the type of the
|
Chris@4
|
22 /// class of which a member function is going to be used.
|
Chris@4
|
23 ///
|
Chris@4
|
24 /// Example usage:
|
Chris@4
|
25 /// @verbatim MemFunCallback<MyClass> stream = MemFunCallbackStream(parameters, *this, &MyClass::myCallbackFunction); @endverbatim
|
Chris@4
|
26 //////
|
Chris@4
|
27 template<typename T>
|
Chris@4
|
28 class MemFunCallbackStream : public CallbackStream
|
Chris@4
|
29 {
|
Chris@4
|
30 public:
|
Chris@4
|
31 typedef int (T::*CallbackFunPtr)(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *,
|
Chris@4
|
32 PaStreamCallbackFlags);
|
Chris@4
|
33
|
Chris@4
|
34 // -------------------------------------------------------------------------------
|
Chris@4
|
35
|
Chris@4
|
36 MemFunCallbackStream()
|
Chris@4
|
37 {
|
Chris@4
|
38 }
|
Chris@4
|
39
|
Chris@4
|
40 MemFunCallbackStream(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) : adapter_(instance, memFun)
|
Chris@4
|
41 {
|
Chris@4
|
42 open(parameters);
|
Chris@4
|
43 }
|
Chris@4
|
44
|
Chris@4
|
45 ~MemFunCallbackStream()
|
Chris@4
|
46 {
|
Chris@4
|
47 close();
|
Chris@4
|
48 }
|
Chris@4
|
49
|
Chris@4
|
50 void open(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun)
|
Chris@4
|
51 {
|
Chris@4
|
52 // XXX: need to check if already open?
|
Chris@4
|
53
|
Chris@4
|
54 adapter_.init(instance, memFun);
|
Chris@4
|
55 open(parameters);
|
Chris@4
|
56 }
|
Chris@4
|
57
|
Chris@4
|
58 private:
|
Chris@4
|
59 MemFunCallbackStream(const MemFunCallbackStream &); // non-copyable
|
Chris@4
|
60 MemFunCallbackStream &operator=(const MemFunCallbackStream &); // non-copyable
|
Chris@4
|
61
|
Chris@4
|
62 //////
|
Chris@4
|
63 /// @brief Inner class which adapts a member function callback to a CallbackInterface compliant
|
Chris@4
|
64 /// class (so it can be adapted using the paCallbackAdapter function).
|
Chris@4
|
65 //////
|
Chris@4
|
66 class MemFunToCallbackInterfaceAdapter : public CallbackInterface
|
Chris@4
|
67 {
|
Chris@4
|
68 public:
|
Chris@4
|
69 MemFunToCallbackInterfaceAdapter() {}
|
Chris@4
|
70 MemFunToCallbackInterfaceAdapter(T &instance, CallbackFunPtr memFun) : instance_(&instance), memFun_(memFun) {}
|
Chris@4
|
71
|
Chris@4
|
72 void init(T &instance, CallbackFunPtr memFun)
|
Chris@4
|
73 {
|
Chris@4
|
74 instance_ = &instance;
|
Chris@4
|
75 memFun_ = memFun;
|
Chris@4
|
76 }
|
Chris@4
|
77
|
Chris@4
|
78 int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames,
|
Chris@4
|
79 const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags)
|
Chris@4
|
80 {
|
Chris@4
|
81 return (instance_->*memFun_)(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags);
|
Chris@4
|
82 }
|
Chris@4
|
83
|
Chris@4
|
84 private:
|
Chris@4
|
85 T *instance_;
|
Chris@4
|
86 CallbackFunPtr memFun_;
|
Chris@4
|
87 };
|
Chris@4
|
88
|
Chris@4
|
89 MemFunToCallbackInterfaceAdapter adapter_;
|
Chris@4
|
90
|
Chris@4
|
91 void open(const StreamParameters ¶meters)
|
Chris@4
|
92 {
|
Chris@4
|
93 PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(),
|
Chris@4
|
94 parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter,
|
Chris@4
|
95 static_cast<void *>(&adapter_));
|
Chris@4
|
96
|
Chris@4
|
97 if (err != paNoError)
|
Chris@4
|
98 throw PaException(err);
|
Chris@4
|
99 }
|
Chris@4
|
100 };
|
Chris@4
|
101
|
Chris@4
|
102
|
Chris@4
|
103 } // portaudio
|
Chris@4
|
104
|
Chris@4
|
105 // ---------------------------------------------------------------------------------------
|
Chris@4
|
106
|
Chris@4
|
107 #endif // INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
|