00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MARSYAS_AUDIOSINK_H
00021 #define MARSYAS_AUDIOSINK_H
00022
00023
00024 #ifdef MARSYAS_AUDIOIO
00025 #include "RtAudio.h"
00026 #endif
00027 #include "MarSystem.h"
00028
00029
00030
00031 class RtAudio;
00032
00033
00034
00035 namespace Marsyas
00036 {
00050 class AudioSink:public MarSystem
00051 {
00052 private:
00053
00054 struct OutputData
00055 {
00056 mrs_realvec* ringBuffer;
00057 unsigned int wp;
00058 unsigned int rp;
00059 unsigned int samplesInBuffer;
00060 unsigned int ringBufferSize;
00061 unsigned int inchannels;
00062 unsigned int high_watermark;
00063 unsigned int low_watermark;
00064 int srate;
00065 AudioSink* myself;
00066
00067 } odata_;
00068
00069
00070
00071 RtAudio* audio_;
00072
00073 int bufferSize_;
00074 int rtSrate_;
00075 int rtChannels_;
00076 int srate_;
00077 unsigned int rtDevice_;
00078
00079 bool isInitialized_;
00080 bool stopped_;
00081
00082 mrs_natural nChannels_;
00083 mrs_real *data_;
00084 realvec ringBuffer_;
00085 mrs_natural ringBufferSize_;
00086 mrs_natural pringBufferSize_;
00087 mrs_natural pnChannels_;
00088
00089
00090 void addControls();
00091 void myUpdate(MarControlPtr sender);
00092
00093 void initRtAudio();
00094
00095 void start();
00096 void stop();
00097
00098 unsigned int getSpaceAvailable();
00099 unsigned int getSamplesAvailable();
00100 void localActivate(bool state);
00101
00102
00103 static int playCallback(void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, unsigned int status, void *userData);
00104
00105
00106 public:
00107 AudioSink(std::string name);
00108 ~AudioSink();
00109 MarSystem* clone() const;
00110
00111 void myProcess(realvec& in, realvec& out);
00112 };
00113
00114 }
00115
00116 #endif
00117
00118
00119
00120
00121