annotate src/portaudio_20140130/bindings/cpp/include/portaudiocpp/MemFunCallbackStream.hxx @ 39:7ddb4fc30dac

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