00001 #include "waveAPI.h"
00007 int samplingRate = 44100,
00008 channels = 1;
00009 HWND targetWindow;
00010
00011 WAVEFORMATEX format;
00012
00013 HWAVEOUT waveOutHandle;
00014 WAVEHDR waveOutHeader;
00015 bool waveOutWriteStart;
00016 int waveOutDoneCount;
00017 WAVEHDR waveOutHeaders[WIBLSIZE];
00018
00019 HWAVEIN waveInHandle;
00020 WAVEHDR waveInHeaders[WIBLSIZE];
00021 short int ** waveInBuffers;
00022 int wiblCount,
00023 wiblIndex;
00024 int waveInStatus;
00025
00026
00027 bool waveAPIInitialized = false;
00028
00029
00030 void waveAPIInit()
00031 {
00032 if (waveAPIInitialized)
00033 return;
00034
00035 waveInBuffers = new short int *[WIBLSIZE];
00036 for(int i = 0; i < WIBLSIZE; i++)
00037 waveInBuffers[i] = new short int[FRAMESIZE];
00038 waveAPIInitialized = true;
00039
00040 waveOutHandle = NULL;
00041 waveInHandle = NULL;
00042 }
00043
00044
00051 bool OpenWaveIn()
00052 {
00053 if (!waveAPIInitialized)
00054 waveAPIInit();
00055
00056 format.wFormatTag = WAVE_FORMAT_PCM;
00057 format.nChannels = channels;
00058 format.nSamplesPerSec = samplingRate;
00059 format.wBitsPerSample = 16;
00060 format.nBlockAlign = format.wBitsPerSample * format.nChannels / 8;
00061 format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
00062 format.cbSize = 0;
00063
00064 if (AssertWaveError(
00065 WAVE_IN,
00066 waveInOpen( &waveInHandle, WAVE_MAPPER, &format, (DWORD)waveInProc, NULL, CALLBACK_FUNCTION)
00067 ) != MMSYSERR_NOERROR)
00068 return false;
00069
00070 waveInStatus = 0;
00071 return true;
00072 }
00073
00074
00082 void StartWaveIn()
00083 {
00084 waveInStatus = 1;
00085 AssertWaveError( WAVE_IN, waveInStart( waveInHandle ));
00086
00087 WAVEHDR * _h;
00088 for( int i = 0; i < WIBLSIZE; i++)
00089 {
00090 memset( waveInBuffers[i], 0, FRAMESIZE * 2 );
00091
00092 _h = &(waveInHeaders[i]);
00093 _h->lpData = (char *)(waveInBuffers[i]);
00094 _h->dwBufferLength = FRAMESIZE * 2;
00095 _h->dwBytesRecorded = 0;
00096 _h->dwUser = 0;
00097 _h->dwFlags = 0;
00098 _h->dwLoops = 1;
00099 _h->lpNext = NULL;
00100 _h->reserved = 0;
00101 AssertWaveError(WAVE_IN, waveInPrepareHeader( waveInHandle, _h, sizeof(WAVEHDR) ));
00102 }
00103
00104 AssertWaveError(WAVE_IN, waveInAddBuffer( waveInHandle, &(waveInHeaders[0]), sizeof(WAVEHDR) ));
00105 AssertWaveError(WAVE_IN, waveInAddBuffer( waveInHandle, &(waveInHeaders[1]), sizeof(WAVEHDR) ));
00106 wiblCount = 2;
00107 }
00108
00109
00120 void OpenWaveOut()
00121 {
00122 if (!waveAPIInitialized)
00123 waveAPIInit();
00124
00125 format.wFormatTag = WAVE_FORMAT_PCM;
00126 format.nChannels = channels;
00127 format.nSamplesPerSec = samplingRate;
00128 format.wBitsPerSample = 16;
00129 format.nBlockAlign = format.wBitsPerSample * format.nChannels / 8;
00130 format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
00131 format.cbSize = 0;
00132
00133 AssertWaveError(
00134 WAVE_OUT,
00135 waveOutOpen( &waveOutHandle, WAVE_MAPPER, &format, (DWORD)waveOutProc, NULL, CALLBACK_FUNCTION));
00136
00137 WAVEHDR * _h;
00138 for( int i = 0; i < WIBLSIZE; i++)
00139 {
00140 _h = &(waveOutHeaders[i]);
00141 _h->dwBytesRecorded = 0;
00142 _h->dwUser = 0;
00143 _h->dwFlags = 0;
00144 _h->dwLoops = 1;
00145 _h->lpNext = NULL;
00146 _h->reserved = 0;
00147 _h->lpData = (char *)(waveInBuffers[i]);;
00148 _h->dwBufferLength = FRAMESIZE * 2;
00149 AssertWaveError( WAVE_OUT, waveOutPrepareHeader( waveOutHandle, _h, sizeof(WAVEHDR) ));
00150 }
00151
00152 waveOutWriteStart = false;
00153 waveOutDoneCount = 0;
00154 }
00155
00156
00162 void CloseWaveOut()
00163 {
00164 AssertWaveError( WAVE_OUT, waveOutReset( waveOutHandle ));
00165
00166 WAVEHDR * _h;
00167 for( int i = 0; i < WIBLSIZE; i++)
00168 {
00169 _h = &(waveOutHeaders[i]);
00170 AssertWaveError( WAVE_OUT, waveOutUnprepareHeader( waveOutHandle, _h, sizeof(WAVEHDR) ));
00171 }
00172
00173 AssertWaveError( WAVE_OUT, waveOutClose( waveOutHandle ));
00174 }
00175
00176
00183 void CloseWaveIn()
00184 {
00185
00186
00187 waveInStatus = 0;
00188 AssertWaveError( WAVE_IN, waveInReset( waveInHandle ));
00189
00190 WAVEHDR * _h;
00191 for( int i = 0; i < WIBLSIZE; i++)
00192 {
00193 _h = &(waveInHeaders[i]);
00194 AssertWaveError(WAVE_IN, waveInUnprepareHeader( waveInHandle, _h, sizeof(WAVEHDR) ));
00195 }
00196
00197 AssertWaveError( WAVE_IN, waveInClose( waveInHandle ));
00198 wiblIndex = 0;
00199 }
00200
00201
00205 void CALLBACK waveOutProc(
00206 HWAVEOUT hwi,
00207 UINT uMsg,
00208 DWORD dwInstance,
00209 DWORD dwParam1,
00210 DWORD dwParam2)
00211 {
00212 switch (uMsg)
00213 {
00214 case WOM_CLOSE:
00215 break;
00216 case WOM_DONE:
00217 PostMessage( targetWindow, MSG_BUFFER_DONE, dwParam1, dwParam2 );
00218 waveOutDoneCount++;
00219 break;
00220 }
00221 }
00222
00223
00231 void CALLBACK waveInProc(
00232 HWAVEIN hwi,
00233 UINT uMsg,
00234 DWORD dwInstance,
00235 DWORD dwParam1,
00236 DWORD dwParam2)
00237 {
00238 switch (uMsg)
00239 {
00240 case WIM_DATA :
00241 {
00242 ++wiblIndex;
00243 WAVEHDR * _h;
00244
00245 if (waveInStatus == 0)
00246 return;
00247
00248
00249 _h = &(waveInHeaders[wiblCount % WIBLSIZE]);
00250 AssertWaveError( 0, waveInAddBuffer( waveInHandle, _h, sizeof(WAVEHDR) ));
00251 PostMessage( targetWindow, MSG_BUFFER_IN, 0, 0 );
00252 ++wiblCount;
00253
00254
00255 if (!waveOutWriteStart)
00256 if (wiblIndex == 2)
00257 {
00258 waveOutWriteStart = true;
00259 _h = &(waveOutHeaders[0]);
00260 WaveProcessor(_h, waveInBuffers[0], FRAMESIZE);
00261 if (waveOutHandle)
00262 AssertWaveError( 1, waveOutWrite( waveOutHandle, _h, sizeof(WAVEHDR) ));
00263 WavePostProcessor(_h, waveInBuffers[0], FRAMESIZE);
00264 }
00265 else
00266 return;
00267
00268 int _i = (wiblIndex - 1) % WIBLSIZE;
00269 _h = &(waveOutHeaders[_i]);
00270 WaveProcessor(_h, waveInBuffers[_i], FRAMESIZE);
00271 if (waveOutHandle)
00272 AssertWaveError( 2, waveOutWrite( waveOutHandle, _h, sizeof(WAVEHDR) ));
00273 WavePostProcessor(_h, waveInBuffers[_i], FRAMESIZE);
00274 break;
00275 }
00276 case WIM_OPEN :
00277 break;
00278 case WIM_CLOSE :
00279 break;
00280 }
00281 }
00282
00283