マルチメディアAPI(MME)を利用してWAVファイルを再生する
(その1)

概要

Windowsにて、MME(Multi Media Extention)を利用して音声ファイル(WAVファイル)を再生する簡単なサンプルプログラムです。

MMEを利点としては、従来のWindowsに標準で搭載されている機能なので、動作環境を選ばずにサウンド出力ができます。

欠点として、2チャンネルまでしか対応していなかったり、データビット長が16ビットまでだったりして、高音質の多チャンネル出力には対応していません。
また、レイテンシー(出力要求してから実際に出力されるまでの遅延)は比較的大きいです。

MMEを利用したサウンド出力の処理の流れを簡単に説明すると、以下のようになります。

  • サウンド出力を行うデバイスをオープンします。
  • サウンド出力するデータを、オープンしたサウンド出力デバイスに投入します。
  • (2)で投入したサウンド出力が完了すると、完了通知が受けられるので、引き続きサウンド出力を行う場合、(2)から繰り返します。
  • 出力するデータがなくなった場合、サウンド出力を終了します。

MMEを利用するには、以下のインクルードファイルとライブラリが必要になります。

追加するインクルード

mmsystem.h

追加するライブラリ

winmm.lib

サンプルプログラムの仕様

作成するサンプルプログラムは以下の仕様にします。

  • ウインドウ・スタイルはダイアログにする。
  • サウンドを出力するデバイスが複数ある場合、ユーザーが選択できる。
  • 再生するWAVファイルは、ユーザーが選択できる。
  • WAVファイルを選択後、[再生]ボタンで再生を開始する。
  • WAVファイルの再生中に[一時停止]ボタンを押すと、再生を一時中断し、[再生]ボタンを押すと中断した時点から、再生を再開する。
  • [停止]ボタンを押すと再生を終了し、[再生]ボタンを押すとファイルの先頭から再生を開始する。
  • 音量調節をダイアログから行えるようにする。

サンプルプログラムの外観は以下のようにします。

ダイアログの初期処理

WM_INITDIALOGメッセージを受けたときに、ダイアログの初期処理を行います。

ダイアログの初期処理では、サウンド出力デバイスのリストの作成と、音量ボリュームのトラックバーの初期化を行います。

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


/****************************************************************************/
/*!
 *  @brief  ダイアログの初期処理.
 *
 *  @param  [in]    hDlg    ダイアログのウインドウ・ハンドル.
 *
 *  @retval なし.
 */
static void     OnInitDialog( HWND hDlg )
{
    //! 出力デバイスリストを作成する.
    DWORD dev_num = waveOutGetNumDevs();
    if( dev_num != 0 ){
        HWND hlist = GetDlgItem( hDlg, IDC_OUTPUT_DEVICE );

        ComboBox_ResetContent( hlist );
        for( DWORD i = 0; i < dev_num; i++ ){
            // 出力デバイスの性能を取得する.
            WAVEOUTCAPS caps;
            if( waveOutGetDevCaps( i, &caps, sizeof(caps) ) == MMSYSERR_NOERROR ){
                ComboBox_AddString( hlist, caps.szPname );
            }
        }
        ComboBox_SetCurSel( hlist, 0 );
    }
    //! 音量ボリュームのトラックバーを設定する.
    HWND hbar = GetDlgItem( hDlg, IDC_VOLUME );
    SendMessage( hbar, TBM_SETRANGE, TRUE, MAKELONG( 0, 100 ) );
    SendMessage( hbar, TBM_SETPOS  , TRUE, 50 );
}
	

サウンド出力デバイスの個数を取得する

waveOutGetNumDevs()を呼び出して、サウンド出力デバイスの個数を取得します。


    UINT waveOutGetNumDevs( VOID )
	

waveOutGetNumDevs()からの戻り値としてサウンド出力デバイスの数が返ります。
エラーまたはデバイスが存在しない場合、0が返ります。

サウンド出力デバイス名を取得する

取得したサウンド出力デバイスの個数分、waveOutGetDevCaps()を呼び出してサウンド出力デバイス名を取得します。


    MMRESULT waveOutGetDevCaps( UINT uDeviceID, LPWAVEOUTCAPS pwoc, UINT cbwoc )
	

引数説明
uDeviceID

次のいずれかを指定。
 - サウンド出力デバイスの識別子(0~デバイスの個数-1の値)
 - オープンしているサウンド出力デバイスのハンドル
 - WAVE_MAPPER定数

pwocWAVEOUTCAPS構造体のポインタ
cbwocWAVEOUTCAPS構造体のバイト数

waveOutGetDevCaps()からの戻り値がMMSYSERR_NOERRORであれば、デバイス性能に関する情報の取得は完了です。

デバイス性能に関する情報(WAVEOUTCAPS構造体)は以下のとおりです。

メンバ名説明
wMidベンダID
wPidプロダクトID
vDriverVersionドライバのバージョン
szPname[MAXPNAMELEN]デバイス名の文字列
dwFormatsサポートしているオーディオ形式
wChannelsサポートしているチャンネル数
dwSupportデバイスのサポート情報

waveOutGetDevCaps()の第1引数で指定するデバイス番号は、waveOutOpen()の第2引数で指定する 「オープンするサウンド出力デバイスの識別子」と同じ値になります。



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