00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "syn/Core/SampleBufferQueue.h"
00032 #include "syn/Module/OpenALOutputModule.h"
00033 #ifdef HAVE_VPR
00034 #include <vpr/Thread/Thread.h>
00035 #endif
00036
00037 namespace syn
00038 {
00039 syn::OpenALAudioContext OpenALOutputModule::ctx;
00040 bool OpenALOutputModule::mCtxInit = false;
00041
00042 OpenALOutputModule::OpenALOutputModule() : Module(), mReadBuf( NULL ),
00043 mBufSize( 4096 )
00044 {
00045
00046 if (OpenALOutputModule::mCtxInit == false)
00047 {
00048 OpenALOutputModule::ctx.open();
00049 OpenALOutputModule::mCtxInit = true;
00050 }
00051
00052 mWavStream.setContext( ctx );
00053
00054
00055 mAmplitudeControlInput = this->createInput( "amplitude" );
00056 mMonoAudioInput = this->createInput( "mono audio" );
00057 }
00058
00059
00060
00061 bool OpenALOutputModule::open()
00062 {
00063 mTempBuf.resize( mBufSize );
00064 mTempBufIt = 0;
00065
00066
00067
00068 mOutputFmt = AudioFormat( AudioFormat::SIGNED16, 1, 44100 );
00069 mWavStream.open( mOutputFmt );
00070 return mWavStream.isOpen();
00071 }
00072
00073 void OpenALOutputModule::close()
00074 {
00075 mWavStream.close();
00076 }
00077
00078 void OpenALOutputModule::writeSomeSilence()
00079 {
00080
00081 assert( mTempBuf.bytes() > 0 );
00082 memset( mTempBuf.data(), 0, mTempBuf.bytes() );
00083
00084 while (mWavStream.canAcceptMoreData() == false)
00085 {
00086 #ifdef HAVE_VPR
00087 vpr::Thread::yield();
00088 #endif
00089
00090 }
00091
00092 mWavStream.write( mTempBuf.data(), mTempBuf.size() );
00093
00094 this->setPutCount( mWavStream.pcount() );
00095
00096 }
00097
00098 void OpenALOutputModule::update()
00099 {
00100
00101 this->setPutCount( 0 );
00102
00103
00104
00105 if (mMonoAudioInput->empty() ||
00106 !this->isOpen())
00107 {
00108 this->writeSomeSilence();
00109
00110 return;
00111 }
00112
00114
00115
00116
00117 while (mWavStream.canAcceptMoreData() == false)
00118 {
00119 #ifdef HAVE_VPR
00120 vpr::Thread::yield();
00121 #endif
00122 }
00123
00124
00125 if (mReadBuf == NULL)
00126 {
00127 mReadBuf = mMonoAudioInput->front();
00128 mMonoAudioInput->pop();
00129 mReadBufIt = 0;
00130 }
00131
00132 while (mTempBufIt < mTempBuf.size() && mReadBufIt < mReadBuf->size())
00133 {
00134 syn::audio_convert( (*mReadBuf)[mReadBufIt], mTempBuf[mTempBufIt] );
00135 ++mTempBufIt;
00136 ++mReadBufIt;
00137 }
00138
00139
00140 if (mTempBufIt >= mTempBuf.size())
00141 {
00142 mWavStream.write( mTempBuf.data(), mTempBuf.size() );
00143 mTempBufIt = 0;
00144 this->setPutCount( mWavStream.pcount() );
00145 }
00146
00147
00148 if (mReadBufIt >= mReadBuf->size())
00149 {
00150 mReadBufIt = 0;
00151 SampleBufferRepos::instance()->putback( mReadBuf );
00152 mReadBuf = NULL;
00153 }
00154
00155
00156
00157
00158
00159
00160
00161
00162 }
00163
00164 }
00165