00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "PACLAMCallbacks.hxx"
00023 #include "DoubleBuffer.hxx"
00024 #include "CLAM_windows.h"
00025 #include "PAAudioStream.hxx"
00026 #undef GetClassName
00027 #include <iostream>
00028
00029 namespace CLAM
00030 {
00031 int monoOutCallback( const void *inputBuffer, void *outputBuffer,
00032 unsigned long framesPerBuffer,
00033 const PaStreamCallbackTimeInfo *timeInfo,
00034 PaStreamCallbackFlags statusFlags, void *userData )
00035 {
00036 DoubleBuffer* dblBuff = ( DoubleBuffer* ) userData;
00037 static unsigned short last_time_token = 1;
00038 static unsigned short time_token = 1;
00039
00040 WaitForSingleObject( dblBuff->mBackBufferReady, INFINITE );
00041
00042 short* dst = (short*) outputBuffer;
00043 short* src = (short*) dblBuff->mBackBuffer;
00044 unsigned bufflen = dblBuff->mLen;
00045
00046
00047
00048
00049 while ( bufflen-- )
00050 {
00051 *dst++ = *src++;
00052 }
00053
00054 ResetEvent( dblBuff->mBackBufferReady );
00055
00056 return 0;
00057 }
00058
00059 int stereoOutCallback( const void *inputBuffer, void *outputBuffer,
00060 unsigned long framesPerBuffer,
00061 const PaStreamCallbackTimeInfo *timeInfo,
00062 PaStreamCallbackFlags statusFlags, void *userData )
00063 {
00064 DoubleBuffer* dblBuff = ( DoubleBuffer* ) userData;
00065
00066
00067 WaitForSingleObject( dblBuff->mBackBufferReady, INFINITE );
00068
00069 short* dst = (short*) outputBuffer;
00070 short* src = (short*) dblBuff->mBackBuffer;
00071
00072
00073
00074
00075
00076
00077
00078 unsigned bufflen = dblBuff->mLen >> 1;
00079
00080 while ( bufflen-- )
00081 {
00082 *dst++ = *src++;
00083 *dst++ = *src++;
00084 }
00085
00086 ResetEvent( dblBuff->mBackBufferReady );
00087
00088 return 0;
00089 }
00090
00091 int multiOutCallback( const void *inputBuffer, void *outputBuffer,
00092 unsigned long framesPerBuffer,
00093 const PaStreamCallbackTimeInfo *timeInfo,
00094 PaStreamCallbackFlags statusFlags, void *userData )
00095 {
00096 DoubleBuffer* dblBuff = ( DoubleBuffer* ) userData;
00097
00098 WaitForSingleObject( dblBuff->mBackBufferReady, INFINITE );
00099
00100 short* dst = (short*) outputBuffer;
00101 short* src = (short*) dblBuff->mBackBuffer;
00102
00103
00104
00105
00106 unsigned bufflen = dblBuff->mLen;
00107 while ( bufflen-- )
00108 {
00109 *dst++ = *src++;
00110 }
00111
00112 ResetEvent( dblBuff->mBackBufferReady );
00113
00114 return 0;
00115
00116 }
00117
00118 int monoInCallback( const void *inputBuffer, void *outputBuffer,
00119 unsigned long framesPerBuffer,
00120 const PaStreamCallbackTimeInfo *timeInfo,
00121 PaStreamCallbackFlags statusFlags, void *userData )
00122 {
00123 DoubleBuffer* dblBuff = ((PAAudioStreamConfig*) userData)->GetInputDblBuffer();
00124
00125 short* src = (short*) inputBuffer;
00126 short* dst = (short*) dblBuff->mFrontBuffer;
00127
00128 unsigned bufflen = dblBuff->mLen;
00129
00130 while ( bufflen-- )
00131 *dst++ = *src++;
00132
00133 dblBuff->SwapBuffers();
00134
00135 return 0;
00136 }
00137
00138 int stereoInCallback( const void *inputBuffer, void *outputBuffer,
00139 unsigned long framesPerBuffer,
00140 const PaStreamCallbackTimeInfo *timeInfo,
00141 PaStreamCallbackFlags statusFlags, void *userData )
00142 {
00143 DoubleBuffer* dblBuff = ((PAAudioStreamConfig*) userData)->GetInputDblBuffer();
00144
00145 short* src = (short*) inputBuffer;
00146 short* dst = (short*) dblBuff->mFrontBuffer;
00147
00148
00149 unsigned bufflen = dblBuff->mLen >> 1;
00150
00151
00152 while ( bufflen-- )
00153 {
00154 *dst++ = *src++;
00155 *dst++ = *src++;
00156 }
00157
00158 dblBuff->SwapBuffers();
00159 return 0;
00160 }
00161
00162 int multiInCallback( const void *inputBuffer, void *outputBuffer,
00163 unsigned long framesPerBuffer,
00164 const PaStreamCallbackTimeInfo *timeInfo,
00165 PaStreamCallbackFlags statusFlags, void *userData )
00166 {
00167 PAAudioStreamConfig *stream = (PAAudioStreamConfig*) userData;
00168
00169 short* dst = (short*) stream->GetInputDblBuffer()->mFrontBuffer;
00170 unsigned long bufferSize = framesPerBuffer;
00171 bufferSize *= (stream->GetChannelNumber() << 1);
00172
00173 memcpy(dst, inputBuffer, bufferSize);
00174 stream->GetInputDblBuffer()->SwapBuffers();
00175
00176 return paContinue;
00177 }
00178
00179 int stereoFDCallback( const void *inputBuffer, void *outputBuffer,
00180 unsigned long framesPerBuffer,
00181 const PaStreamCallbackTimeInfo *timeInfo,
00182 PaStreamCallbackFlags statusFlags, void *userData )
00183 {
00184
00185 FullDuplexDoubleBuffer* buff = ( FullDuplexDoubleBuffer*) userData;
00186
00187 short* src = (short*) inputBuffer;
00188 short* dst = (short*) buff->mInputDblBuff->mFrontBuffer;
00189
00190
00191 unsigned bufflen = buff->mInputDblBuff->mLen >> 1;
00192
00193
00194 while ( bufflen-- )
00195 {
00196 *dst++ = *src++;
00197 *dst++ = *src++;
00198 }
00199
00200 buff->mInputDblBuff->SwapBuffers();
00201
00202 WaitForSingleObject( buff->mOutputDblBuff->mBackBufferReady, INFINITE );
00203
00204
00205
00206 dst = (short*) outputBuffer;
00207 src = (short*) buff->mInputDblBuff->mBackBuffer;
00208
00209
00210
00211
00212
00213
00214
00215 bufflen = buff->mOutputDblBuff->mLen >> 1;
00216
00217 while ( bufflen-- )
00218 {
00219 *dst++ = *src++;
00220 *dst++ = *src++;
00221 }
00222
00223 ResetEvent( buff->mOutputDblBuff->mBackBufferReady );
00224
00225 return 0;
00226
00227 }
00228
00229 }
00230