マルチメディア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構造体)のポインタ
cbwhWAVEHDR構造体のバイト数

waveInUnprepareHeader()からの戻り値がMMSYSERR_NOERRORであれば、データブロックの切り離しは完了です。

データブロックのクリーンアップが完了すれば、データブロックに割り付けていたデータバッファ等は解放できます。

サウンド入力デバイスをクローズする

waveInClose()を呼び出して、サウンド入力デバイスをクローズします。


    MMRESULT waveInClose( HWAVEIN hwi )
	

引数説明
hwiサウンド入力デバイスのハンドル。

waveInClose()からの戻り値がMMSYSERR_NOERRORであれば、デバイスのクローズは完了です。

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

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

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



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