プログラミングメモ →目次

ダブルバッファで連続録音(VC++)

マイクからオーディオデータを録音する為に、winmm.libをリンクして、mmsystem.hをインクルードします。ダブルバッファを使って、片方のバッファで音声データを記録しながら、既に記録したもう片方の内容を別の場所に保存したり、処理したりすることが同時にできます。

1.録音の初期化。WINMMAPI MMRESULT WINAPI waveInOpen(LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen)関数で、録音のためのPCMデバイスを開きます。WINMMAPI MMRESULT WINAPI waveInPrepareHeader(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)関数で、録音データバッファをPCMデバイスに関連付けます。WINMMAPI MMRESULT WINAPI waveInAddBuffer(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);関数で、データバッファへの録音を開始させます。

2.一つのバッファへの録音終了を通知するMM_WIM_DATAメッセージ処理を実装します。片方のバッファに録音データをいっぱい入れたら、もう片方のバッファへの記録に入る直前に、MM_WIM_DATAメッセージを受け取れます。このタイミングで、記録済みのバッファの内容を別の場所に保存したり、処理したりします。メッセージのハンドルとメッセージ マップ エントリは、下記のそれぞれのようです。

afx_msg LRESULT OnRecordData(WPARAM wParam, LPARAM lParam)
ON_MESSAGE(MM_WIM_DATA, OnRecordData)

ハンドル関数の中で、waveInAddBuffer()を繰り返して呼び出して、二つのバッファを交替して音声データを記録し、そして、記録したデータを保存したり、処理したりします。

3.録音を停止する処理。WINMMAPI MMRESULT WINAPI waveInReset(HWAVEIN hwi)関数で、録音を停止させます。WINMMAPI MMRESULT WINAPI waveInUnprepareHeader(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)関数を2回に呼び出して、ダブルバッファをデバイスから切り離します。WINMMAPI MMRESULT WINAPI waveInClose(HWAVEIN hwi)関数でデバイスの使用を終了させます。

4.サンプル。マイクから録音データを大きいバッファに一時保存します。再生ボタンに録音した音声を再生します。サンプルの中で、サンプル周波数は44100HZで、データのビット数は16で、チャンネル数は1で、バッファのデータ数は4000点です。ソースコード再生についてのメモ