annotate src/portaudio_20161030/bindings/cpp/include/portaudiocpp/MemFunCallbackStream.hxx @ 55:284acf908dcd

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