これまでWave音源の波形をバッファに生成し再生してみましたが、今回はバッファに外部から取り込んだ音を「録音」してみましょう。録音も再生と似たような手順で行うので、バッファの設定さえ出来れば簡単に処理できるようです。 録音の手順録音の手順は、再生の手順にバッファの登録が入るだけです。再生の時は、波形データが入ったバッファを指定したヘッダをデバイスに渡してオープンしましたが、録音はバッファを指定したヘッダをデバイスに渡し、そのバッファをwaveInAddBuffer()で録音用バッファに登録します。これは、複数のバッファを切り替えながら録音するための仕組みのようですが、今回はバッファを一つしか使わないのでこの辺の処理はあまり考慮する必要はないでしょう。 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); 大体再生の時に呼び出したwaveOut系APIと同じような構造ですね。今回はCALLBACK_WINDOWを指定しているので、録音が終了するとウインドウにMM_WIM_DATAメッセージが送られてきます。このメッセージを捉えて終了処理(バッファのUnprepareとデバイスクローズ)を行います。 case MM_WIM_DATA: /* 録音終了 */ waveOutUnprepareHeader(hWOut,&wh,sizeof(WAVEHDR)); waveInClose(hWOut); プログラムまずサウンド入力に適当な音源を接続し、「録音」ボタンで録音を開始してください。録音を開始すると3秒後に録音が終了し「再生」ボタンが有効になるので、再生ボタンをクリックして録音結果を確認してみましょう。 |