DirectSoundを利用してWAVファイルを再生する
(その4)
WAVファイル再生中にダイアログの[一時再生]ボタンを押されたら、WAVファイルの再生を一時停止します。
WAVファイルの再生を一時停止させる場合、サウンド出力処理を停止します。
サンプルコードを以下に示します。
/****************************************************************************/
/*!
* @brief WAVファイルの再生を一時停止する.
*
* @param [in] hDlg ダイアログのウインドウ・ハンドル.
*
* @retval なし.
*/
static void PauseSoundOutput( HWND hDlg )
{
//! サウンド出力を停止する.
if( OutBuf ){
OutBuf->Stop();
}
EnableWindow( GetDlgItem( hDlg, IDC_PLAY ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_PAUSE ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_STOP ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_FILENAME ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_FILE_SELECT ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_OUTPUT_DEVICE ), TRUE );
}
IDirectSoundBuffer8のメソッドStop()を呼び出して、現在動作中のサウンド出力処理を停止します。
HRESULT IDirectSoundBuffer8::Stop( void )
Stop()からの戻り値がDS_OKであれば、サウンド出力は停止されます。
※ セカンダリ・バッファの再生を停止した場合、再生カーソルは、最後に再生されたサンプルの直後のサンプルに設定されます。
※ プライマリ・バッファの再生を停止した場合、再生カーソルは、バッファの先頭にリセットされます。
WAVファイル再生中にダイアログの[停止]ボタンを押されたら、WAVファイルの再生を停止します。
WAVファイルの再生を停止させる場合、サウンド出力を終了させてからWAVファイルをクローズします。
サウンド出力の終了は以下の手順で行います。
- サウンド出力を停止。
- イベント監視タスクを停止。
- ストリームバッファ・オブジェクトの解放。
- 再生オブジェクトの解放。
- 再生イベントの解放。
サンプルコードを以下に示します。
/****************************************************************************/
/*!
* @brief WAVファイルの再生を停止する.
*
* @param なし.
*
* @retval なし.
*/
static void StopSoundOutput( HWND hDlg )
{
//! サウンド出力デバイスをクローズする.
CloseSoundOutputDevice();
//! 再生したWAVファイルをクローズする.
CloseWaveFile();
//! WAVファイルの読み込み用バッファを解放する.
if( DataBuff ){
delete [] DataBuff;
DataBuff = NULL;
}
EnableWindow( GetDlgItem( hDlg, IDC_PLAY ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_PAUSE ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_STOP ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_FILENAME ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_FILE_SELECT ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_OUTPUT_DEVICE ), TRUE );
}
/****************************************************************************/
/*!
* @brief サウンド出力デバイスをクローズする.
*
* @param なし.
*
* @retval なし.
*/
static void CloseSoundOutputDevice( void )
{
if( OutDev || OutBuf ){
//! サウンド出力を停止する.
if( OutBuf ){
OutBuf->Stop();
}
//! イベント監視タスクを停止する.
OutState = FALSE;
if( OutEvent[0] ){
SetEvent( OutEvent[0] );
Sleep( 500 );
}
//! DirectSoundのストリームバッファを解放する.
if( OutBuf ){
OutBuf->Release();
OutBuf = NULL;
}
//! DirectSoundの再生オブジェクトを解放する.
if( OutDev ){
OutDev->Release();
OutDev = NULL;
}
//! 再生イベントのオブジェクトを解放する.
for( int i = 0; i < 2; i++ ){
if( OutEvent[i] ){
CloseHandle( OutEvent[i] );
OutEvent[i] = NULL;
}
}
}
}
IDirectSoundBuffer8のメソッドRelease()を呼び出して、ストリームバッファ・オブジェクトを解放します。
ULONG IDirectSoundBuffer8::Release( void )
Release()からの戻り値としてRelease()実行後のオブジェクトへの参照カウントが返ります。
IDirectSound8のメソッドRelease()を呼び出して、再生オブジェクトを解放します。
ULONG IDirectSound8::Release( void )
Release()からの戻り値としてRelease()実行後のオブジェクトへの参照カウントが返ります。
再生イベントのオブジェクトを解放する
CloseHandle()を呼び出して、再生イベントで使用したイベントハンドルを解放します。