[kaze's test] プログラミングメモ →目次

waveファイルの再生(VC++)

mmio関数群を利用して、waveファイルを取り出して再生することについてのメモです。mmio関数群を利用する為に、winmm.libをリンクして、mmsystem.hをインクルードする必要があります。waveファイルの再生をするために、下記の処理が必要です。 

1.ファイルオープン。WINMMAPI HMMIO WINAPI mmioOpen(LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)というAPI関数を呼び出して、waveファイルを開きます。

2.各情報チャンクの検索。WINMMAPI FOURCC WINAPI mmioStringToFOURCC(LPCSTR sz, UINT uFlags)関数を使って、各情報を保存する為の「チャンク」の番地を検索します。下記の三つのチャンクから必要な情報を取得します。RIFFチャンクで、WAV形式のデータファイルであるかを確認します。フォーマットチャンクは、サンプリング周波数などの音声制御情報(WAVEFORMATEX)を管理しています。データチャンクは、音声データの塊りです。

3.PCMデバイスを初期化して、再生します。再生のメモは、http://www.softist.com/programming/waveout/waveout.htmのページに載っています。フォーマットチャンクで取得したWAVEFORMATEX情報とデータチャンクで取得したデータを設定します。下のようです。

whOut.lpData = lpData;
whOut.dwBufferLength = dwSize;
whOut.dwBytesRecorded = 0;
whOut.dwUser = 0;
whOut.dwFlags = 0;
whOut.dwLoops = 0;
whOut.lpNext = NULL;
whOut.reserved = 0 ;
MMRESULT mmrError = waveOutOpen(&hWOut,WAVE_MAPPER,&wf, 
                                (DWORD)m_hWnd,0,CALLBACK_WINDOW);
waveOutPrepareHeader(hWOut, &whOut, sizeof(WAVEHDR));
waveOutWrite(hWOut, &whOut, sizeof(WAVEHDR));

4.サンプル。Dドライブのルートフォルダにある「file1.wav」を再生します。ソースコード