annotate src/portaudio/bindings/cpp/include/portaudiocpp/MemFunCallbackStream.hxx @ 89:8a15ff55d9af

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