annotate src/portaudio_20140130/bindings/cpp/include/portaudiocpp/MemFunCallbackStream.hxx @ 124:e3d5853d5918

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