マルチメディア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 |
次のいずれかを指定。 |
pwoc | WAVEOUTCAPS構造体のポインタ |
cbwoc | WAVEOUTCAPS構造体のバイト数 |
waveOutGetDevCaps()からの戻り値がMMSYSERR_NOERRORであれば、デバイス性能に関する情報の取得は完了です。
デバイス性能に関する情報(WAVEOUTCAPS構造体)は以下のとおりです。
メンバ名 | 説明 |
---|---|
wMid | ベンダID |
wPid | プロダクトID |
vDriverVersion | ドライバのバージョン |
szPname | デバイス名の文字列 |
dwFormats | サポートしているオーディオ形式 |
wChannels | サポートしているチャンネル数 |
dwSupport | デバイスのサポート情報 |
※ waveOutGetDevCaps()の第1引数で指定するデバイス番号は、waveOutOpen()の第2引数で指定する 「オープンするサウンド出力デバイスの識別子」と同じ値になります。