Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members

MemFunCallbackStream.hxx

Go to the documentation of this file.
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 &parameters, 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 &parameters, T &instance, CallbackFunPtr memFun)
00051         {
00052             // XXX: need to check if already open?
00053 
00054             adapter_.init(instance, memFun);
00055             open(parameters);
00056         }
00057 
00058     private:
00059         MemFunCallbackStream(const MemFunCallbackStream &); // non-copyable
00060         MemFunCallbackStream &operator=(const MemFunCallbackStream &); // non-copyable
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 &parameters)
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 } // portaudio
00104 
00105 // ---------------------------------------------------------------------------------------
00106 
00107 #endif // INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX

Generated on Fri Apr 2 20:22:15 2004 for PortAudioCpp by doxygen 1.3.6