マルチメディアAPI(MME)利用してマイクから録音する
(その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 )
{
//! サウンド出力デバイスをクローズする.
CloseSoundOutputDevice();
//! サウンド入力デバイスをクローズする.
CloseSoundInputDevice();
//! WAVファイルをクローズする.
CloseWaveFile();
//! 録画中フラグをクリアする.
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 CloseSoundInputDevice( void )
{
if( hWI ){
//! -1.サウンド入力を停止する.
waveInStop( hWI );
for( int i = 0; i < 2; i++ ){
//! -2.入力デバイスに登録したデータブロックを解放する.
waveInUnprepareHeader( hWI, &InHdr[i], sizeof(WAVEHDR) );
//! -3.データバッファを解放する.
if( InHdr[i].lpData ){
delete [] InHdr[i].lpData;
InHdr[i].lpData = NULL;
}
}
//! -4.入力デバイスをクローズする.
waveInClose( hWI );
hWI = NULL;
}
}
waveInStop()を呼び出して、現在動作中のサウンド入力を停止します。
MMRESULT waveInStop( HWAVEIN hwi )
引数 | 説明 |
---|---|
hwi | サウンド入力デバイスのハンドル |
waveInStop()からの戻り値がMMSYSERR_NOERRORであれば、サウンド入力は停止されます。
※ 音声データを格納中のデータブロックのみ解放され、未処理のデータブロックはキュー内に残ります。
データブロックをサウンド入力デバイスから切り離す(クリーンアップ)
waveInUnprepareHeader()を呼び出して、waveInPrepareHeader()にて関連付けたデータブロックを切り離します。
MMRESULT waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh )
引数 | 説明 |
---|---|
hwi | サウンド入力デバイスのハンドル |
pwh | クリーンアップするデータブロック(WAVEHDR構造体)のポインタ |
cbwh | WAVEHDR構造体のバイト数 |
waveInUnprepareHeader()からの戻り値がMMSYSERR_NOERRORであれば、データブロックの切り離しは完了です。
データブロックのクリーンアップが完了すれば、データブロックに割り付けていたデータバッファ等は解放できます。
waveInClose()を呼び出して、サウンド入力デバイスをクローズします。
MMRESULT waveInClose( HWAVEIN hwi )
引数 | 説明 |
---|---|
hwi | サウンド入力デバイスのハンドル。 |
waveInClose()からの戻り値がMMSYSERR_NOERRORであれば、デバイスのクローズは完了です。
サンプルプログラムのソースコードを以下からダウンロードできます。
開発環境 | Visual Studio 2005 |
---|---|
開発言語 | C言語 |
ファイル名 | sample_0010.zip |