annotate src/portaudio_20161030/bindings/cpp/include/portaudiocpp/MemFunCallbackStream.hxx @ 169:223a55898ab9 tip default

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