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



商標に関する表示