マルチメディア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構造体)のポインタ

cbwhWAVEHDR構造体のバイト数

waveOutWrite()からの戻り値がMMSYSERR_NOERRORであれば、データブロックがキューイングされ、サウンド出力デバイスからデータ出力が開始されます。



Windowsは米国Microsoft Corporationの登録商標です。