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