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であれば、キャプチャは停止されます。
IDirectSoundCaptureBuffer8のメソッドRelease()を呼び出して、キャプチャバッファ・オブジェクトを解放します。
ULONG IDirectSoundCaptureBuffer8::Release( void )
Release()からの戻り値としてRelease()実行後のオブジェクトへの参照カウントが返ります。
IDirectSoundCapture8のメソッドRelease()を呼び出して、キャプチャ・オブジェクトを解放します。
ULONG IDirectSoundCapture8::Release( void )
Release()からの戻り値としてRelease()実行後のオブジェクトへの参照カウントが返ります。
キャプチャ完了イベントのオブジェクトを解放する
CloseHandle()を呼び出して、キャプチャ完了イベントで使用したイベントハンドルを解放します。
サンプルプログラムのソースコードを以下からダウンロードできます。
開発環境 | Visual Studio 2005 + DirectX SDK |
---|---|
開発言語 | C言語 |
ファイル名 | sample_0011.zip |