annotate src/portaudio/bindings/cpp/include/portaudiocpp/MemFunCallbackStream.hxx @ 23:619f715526df sv_v2.1

Update Vamp plugin SDK to 2.5
author Chris Cannam
date Thu, 09 May 2013 10:52:46 +0100
parents e13257ea84a4
children
rev   line source
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 &parameters, 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 &parameters, 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 &parameters)
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