DirectSoundを利用してマイクから録音する
(その4)

マイクからの録音を一時停止する

録音中にダイアログの[一時再生]ボタンを押されたら、マイクからの録音を一時停止します。

入力音声データをファイルに保存しないように録画中フラグをクリアしておきます。

マイクからの録音を一時停止しても、マイクからの入力音声はモニタ出力し続けるので、サウンドの入出力処理は継続させます。

サンプルコードを以下に示します。


/****************************************************************************/
/*!
 *  @brief  外部音声の録音を一時停止する.
 *
 *  @param  [in]    hDlg    ダイアログのウインドウ・ハンドル.
 *
 *  @retval なし.
 */
static void     PauseSound( HWND hDlg )
{
    //! 録画中フラグをクリアする.
    RecFlag = FALSE;

    EnableWindow( GetDlgItem( hDlg, IDC_REC           ), 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  );
    EnableWindow( GetDlgItem( hDlg, IDC_INPUT_DEVICE  ), TRUE  );
}
	

マイクからの録音を停止する

録音中にダイアログの[停止]ボタンを押されたら、マイクからの録音を停止します。

サウンド入出力デバイスをクローズとWEVファイルのクローズを行います。

キャプチャ終了は、以下のような流れになります。

サンプルコードを以下に示します。


/****************************************************************************/
/*!
 *  @brief  外部音声の録音を停止する.
 *
 *  @param  なし.
 *
 *  @retval なし.
 */
static void     StopSound( HWND hDlg )
{
    //! サウンド出力デバイスをクローズする.
    CloseSoundCapDevice();

    //! サウンド出力デバイスをクローズする.
    CloseSoundOutDevice();

    //! 再生したWAVファイルをクローズする.
    CloseWaveFile();

    //! 読み込みバッファを解放する.
    if( DataBuff ){
        delete [] DataBuff;
        DataBuff = NULL;
    }
    //! 録画中フラグをクリアする.
    RecFlag = FALSE;

    EnableWindow( GetDlgItem( hDlg, IDC_REC           ), 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  );
    EnableWindow( GetDlgItem( hDlg, IDC_INPUT_DEVICE  ), TRUE  );
}
	


/****************************************************************************/
/*!
 *  @brief  サウンド入力デバイスをクローズする.
 *
 *  @param  なし.
 *
 *  @retval なし.
 */
static void     CloseSoundCapDevice( void )
{
    if( CapDev || CapBuf ){
        // キャプチャ処理を停止する.
        if( CapBuf ){
            CapBuf->Stop();
        }
        // イベント監視タスクを停止する.
        CapState = FALSE;
        if( CapEvent[0] ){
            SetEvent( CapEvent[0] );
            Sleep( 500 );
        }
        // DirectSoundのキャプチャ用オブジェクトを解放する.
        if( CapBuf ){
            CapBuf->Release();
            CapBuf = NULL;
        }
        if( CapDev ){
            CapDev->Release();
            CapDev = NULL;
        }
        // キャプチャ・イベントのオブジェクトを解放する.
        for( int i = 0; i < 2; i++ ){
            if( CapEvent[i] ){
                CloseHandle( CapEvent[i] );
                CapEvent[i] = NULL;
            }
        }
    }
}
	

サウンド・キャプチャ処理を停止する

IDirectSoundCaptureBuffer8のメソッドStop()を呼び出して、現在動作中のサウンド・キャプチャ処理を停止します。


    HRESULT IDirectSoundCaptureBuffer8::Stop( void )
	

Stop()からの戻り値がDS_OKであれば、キャプチャは停止されます。

DirectSoundのキャプチャバッファを解放する

IDirectSoundCaptureBuffer8のメソッドRelease()を呼び出して、キャプチャバッファ・オブジェクトを解放します。


    ULONG IDirectSoundCaptureBuffer8::Release( void )
	

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

DirectSoundのキャプチャ・オブジェクトを解放する

IDirectSoundCapture8のメソッドRelease()を呼び出して、キャプチャ・オブジェクトを解放します。


    ULONG IDirectSoundCapture8::Release( void )
	

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

キャプチャ完了イベントのオブジェクトを解放する

CloseHandle()を呼び出して、キャプチャ完了イベントで使用したイベントハンドルを解放します。

サンプルプログラムのダウンロード

サンプルプログラムのソースコードを以下からダウンロードできます。

開発環境 開発言語 ファイル名
Visual Studio 2005
+ DirectX SDK
C++ sample_0011.zip



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