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 &parameters, 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 &parameters, 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 &parameters)
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