DirectSoundを利用してWAVファイルを再生する
(その4)

WAVファイルの再生を一時停止する

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ファイルの再生を停止させる場合、サウンド出力を終了させてから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;
            }
        }
    }
}
	

DirectSoundのストリームバッファを解放する

IDirectSoundBuffer8のメソッドRelease()を呼び出して、ストリームバッファ・オブジェクトを解放します。


    ULONG IDirectSoundBuffer8::Release( void )
	

Release()からの戻り値としてRelease()実行後のオブジェクトへの参照カウントが返ります。

DirectSoundの再生オブジェクトを解放する

IDirectSound8のメソッドRelease()を呼び出して、再生オブジェクトを解放します。


    ULONG IDirectSound8::Release( void )
	

Release()からの戻り値としてRelease()実行後のオブジェクトへの参照カウントが返ります。

再生イベントのオブジェクトを解放する

CloseHandle()を呼び出して、再生イベントで使用したイベントハンドルを解放します。



商標に関する表示