D:/work/code_by/Wave/waveAPI.cpp

查看本檔案說明文件.
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; // how many wibl items has been returned from waveOut
00017 WAVEHDR       waveOutHeaders[WIBLSIZE];
00018 
00019 HWAVEIN       waveInHandle;
00020 WAVEHDR       waveInHeaders[WIBLSIZE];
00021 short int **  waveInBuffers;
00022 int           wiblCount, // how many wibl items has been added
00023               wiblIndex; // how many wibl items has been returned
00024 int           waveInStatus; // 1: for recording, 0: else
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; // defined in mmreg.h
00057   format.nChannels = channels;
00058   format.nSamplesPerSec = samplingRate;
00059   format.wBitsPerSample = 16;
00060   format.nBlockAlign = format.wBitsPerSample * format.nChannels / 8; // only for WAVE_FORMAT_PCM
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; // defined in mmreg.h
00126   format.nChannels = channels;
00127   format.nSamplesPerSec = samplingRate;
00128   format.wBitsPerSample = 16;
00129   format.nBlockAlign = format.wBitsPerSample * format.nChannels / 8; // only for WAVE_FORMAT_PCM
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   // exception handling mechanism not implemented yet
00186   // opened and active mechanism not implemented yet
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       //add one waveIn buffer
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       // accumulate at least two buffers to start waveOutWrite
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 

產生日期:Tue Jul 11 11:52:19 2006, 專案:cbmr, 產生器:  doxygen 1.4.7