annotate src/portaudio_20140130/bindings/cpp/include/portaudiocpp/MemFunCallbackStream.hxx @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 7ddb4fc30dac
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