マルチメディアAPI(MME)を利用してWAVファイルを再生する
(その3)
waveOutWrite()にてサウンド出力デバイスにキューイングされたデータブロックの出力データが全て出力されると、サウンド出力デバイスより WM_WOM_DONEメッセージが、waveOutOpen()の第4引数で指定したウインドウハンドルでメッセージ待ちをしているアプリケーションに送られます。
WM_WOM_DONEメッセージの、第1パラメータ(WPARAM)にサウンド出力デバイスのハンドル、 第2パラメータ(LPARAM)にデータ出力が完了したデータブロック(WAVEHDR構造体)のアドレスが通知されます。
データ出力が完了したデータブロック(WAVEHDR構造体)のdwFlagsメンバはWHDR_DONEビットがセットされます。
サンプルコードでは再生するWAVデータが終了したときに、データブロックにマークを付けて無音データを出力デバイスに投入します。
その後、投入した無音データの再生がデータ出力が完了した時点でWAVファイル再生の終了処理を行います。
サンプルコードを以下に示します。
/****************************************************************************/
/*!
* @brief サウンド出力データの出力完了通知.
*
* @param [in] hDlg ダイアログのウインドウ・ハンドル.
* @param [in] wh データブロック構造体のポインタ.
*
* @retval なし.
*/
static void SoundOutputDone( HWND hDlg, WAVEHDR* wh )
{
if( hWO ){
if( wh->dwUser == 1 ){
//! 最後のデータの再生が終了したので、WAVファイルの再生を終了にする.
StopSoundOutput( hDlg );
}else{
memset( wh->lpData, 0, DataSize );
//! 次にサウンド出力するデータをファイルから読み込む.
DWORD len = ReadWaveFile( wh->lpData, DataSize );
//! 出力するデータがない場合、データブロックにマークを付ける.
wh->dwUser = 0;
if( len == 0 ){
wh->dwUser = 1;
}
//! サウンド出力するデータのバイト数をデータブロックにセットする.
wh->dwBufferLength = DataSize;
//! 次にサウンド出力するデータブロックを投入する.
waveOutWrite( hWO, wh, sizeof(WAVEHDR) );
}
}
}
waveOutWrite()を呼び出して、データブロックをサウンド出力デバイスのデータ・キューにキューイングします。
MMRESULT waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh )
引数 | 説明 |
---|---|
hwo | サウンド出力デバイスのハンドル |
pwh | オーディオ・データを格納したデータブロック(WAVEHDR構造体)のポインタ |
cbwh | WAVEHDR構造体のバイト数 |
waveOutWrite()からの戻り値がMMSYSERR_NOERRORであれば、データブロックがキューイングされ、サウンド出力デバイスからデータ出力が開始されます。