00001 #ifndef INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
00002 #define INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
00003
00004
00005
00006 #include "pa_common/portaudio.h"
00007
00008 #include "portaudiocpp/CallbackStream.hxx"
00009 #include "portaudiocpp/CallbackInterface.hxx"
00010 #include "portaudiocpp/StreamParameters.hxx"
00011 #include "portaudiocpp/Exception.hxx"
00012 #include "portaudiocpp/InterfaceCallbackStream.hxx"
00013
00014
00015
00016 namespace portaudio
00017 {
00018
00019
00027 template<typename T>
00028 class MemFunCallbackStream : public CallbackStream
00029 {
00030 public:
00031 typedef int (T::*CallbackFunPtr)(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *,
00032 PaStreamCallbackFlags);
00033
00034
00035
00036 MemFunCallbackStream()
00037 {
00038 }
00039
00040 MemFunCallbackStream(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) : adapter_(instance, memFun)
00041 {
00042 open(parameters);
00043 }
00044
00045 ~MemFunCallbackStream()
00046 {
00047 close();
00048 }
00049
00050 void open(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun)
00051 {
00052
00053
00054 adapter_.init(instance, memFun);
00055 open(parameters);
00056 }
00057
00058 private:
00059 MemFunCallbackStream(const MemFunCallbackStream &);
00060 MemFunCallbackStream &operator=(const MemFunCallbackStream &);
00061
00066 class MemFunToCallbackInterfaceAdapter : public CallbackInterface
00067 {
00068 public:
00069 MemFunToCallbackInterfaceAdapter() {}
00070 MemFunToCallbackInterfaceAdapter(T &instance, CallbackFunPtr memFun) : instance_(&instance), memFun_(memFun) {}
00071
00072 void init(T &instance, CallbackFunPtr memFun)
00073 {
00074 instance_ = &instance;
00075 memFun_ = memFun;
00076 }
00077
00078 int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames,
00079 const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags)
00080 {
00081 return (instance_->*memFun_)(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags);
00082 }
00083
00084 private:
00085 T *instance_;
00086 CallbackFunPtr memFun_;
00087 };
00088
00089 MemFunToCallbackInterfaceAdapter adapter_;
00090
00091 void open(const StreamParameters ¶meters)
00092 {
00093 PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(),
00094 parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter,
00095 static_cast<void *>(&adapter_));
00096
00097 if (err != paNoError)
00098 throw PaException(err);
00099 }
00100 };
00101
00102
00103 }
00104
00105
00106
00107 #endif // INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX