Wave音源の録音

これまでWave音源の波形をバッファに生成し再生してみましたが、今回はバッファに外部から取り込んだ音を「録音」してみましょう。録音も再生と似たような手順で行うので、バッファの設定さえ出来れば簡単に処理できるようです。

録音の手順

録音の手順は、再生の手順にバッファの登録が入るだけです。再生の時は、波形データが入ったバッファを指定したヘッダをデバイスに渡してオープンしましたが、録音はバッファを指定したヘッダをデバイスに渡し、そのバッファをwaveInAddBuffer()で録音用バッファに登録します。これは、複数のバッファを切り替えながら録音するための仕組みのようですが、今回はバッファを一つしか使わないのでこの辺の処理はあまり考慮する必要はないでしょう。
 録音用バッファとバッファを指定したWAVEHDRヘッダは、再生用のものと共用にします。今回の形式も8KHz/16Bitで、録音時間は3秒(16*8000*3=384000Bit=48000Byte)としました。

  static short int lpBuf[24000];
  static WAVEHDR wh;
  static WAVEFORMATEX wf;

  wf.wFormatTag=WAVE_FORMAT_PCM;
  wf.nChannels=1;
  wf.nSamplesPerSec=8000;
  wf.nAvgBytesPerSec=16000;
  wf.nBlockAlign=1;
  wf.wBitsPerSample=16;
  wf.cbSize=0;

  wh.lpData=(char *)lpBuf;
  wh.dwBufferLength=48000;
  wh.dwBytesRecorded=0;
  wh.dwUser=0;
  wh.dwFlags=0;
  wh.dwLoops=1;
  wh.lpNext=NULL;
  wh.reserved=0 ;

 ヘッダの設定が出来たら、デバイスをオープンしてそのヘッダを渡し録音を開始します。

  waveInOpen(&hWIn,WAVE_MAPPER,&wf,(DWORD)hwnd,0,CALLBACK_WINDOW);
  waveInPrepareHeader(hWIn,&wh,sizeof(WAVEHDR));
  waveInAddBuffer(hWIn,&wh,sizeof(WAVEHDR));
  waveInStart(hWIn);

 大体再生の時に呼び出したwaveOutAPIと同じような構造ですね。今回はCALLBACK_WINDOWを指定しているので、録音が終了するとウインドウにMM_WIM_DATAメッセージが送られてきます。このメッセージを捉えて終了処理(バッファのUnprepareとデバイスクローズ)を行います。

  case MM_WIM_DATA: /* 録音終了 */

      waveOutUnprepareHeader(hWOut,&wh,sizeof(WAVEHDR));
      waveInClose(hWOut);

プログラム

プログラムソース表示

 まずサウンド入力に適当な音源を接続し、「録音」ボタンで録音を開始してください。録音を開始すると3秒後に録音が終了し「再生」ボタンが有効になるので、再生ボタンをクリックして録音結果を確認してみましょう。


画像処理研究室