[Win32 API プログラマーズ リファレンス] の補足的ななにか:
//---------------------------------------------------------------------------
wav再生
//---------------------------------------------------------------------------
<mmsystem.h>
MMRESULT waveOutOpen(lphWaveOut, IDDevice, lpwf, dwCallback, dwCallbackInstance, fdwOpen)
デバイスをオープンして、
MMRESULT waveOutPrepareHeader(hWaveOut, lpwh, cbwh)
バッファを準備して、
MMRESULT waveOutWrite(hWaveOut, lpwh, cbwh)
データを渡すと再生が始まる。
MMRESULT waveOutReset(hWaveOut)
再生を止めて、
MMRESULT waveOutUnprepareHeader(hWaveOut, lpwh, cbwh)
バッファの後始末をして、
MMRESULT waveOutClose(hWaveOut)
デバイスをクローズする。
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
デバイスをオープン
//---------------------------------------------------------------------------
-- 引用始め --
MMRESULT waveOutOpen(lphWaveOut, IDDevice, lpwf, dwCallback, dwCallbackInstance, fdwOpen)
LPHWAVEOUT lphWaveOut; /* 出力デバイスのハンドルを取得する変数 */
UINT IDDevice; /* デバイスのID */
LPWAVEFORMAT lpwf; /* デバイス形式用の構造体のアドレス */
DWORD dwCallback; /* コールバックのアドレスまたはウィンドウ ハンドル */
DWORD dwCallbackInstance; /* インスタンス データ */
DWORD fdwOpen; /* オープン オプション */
waveOutOpen関数は、 指定されたウェーブフォーム出力デバイスを再生用にオープンします。
-- 引用終り --
lphWaveOut
waveOutOpen() でセットされる。以降の関数はこのハンドルでアクセスする。
DDevice
デバイスの「番号」を指定する。WAVE_MAPPER(-1:「規定のデバイス」) 以外の指定は後述
lpwf
WAVEFORMAT 構造体 のポインタ WAVEFORMATEX というヤツもある 後述
dwCallback
「C++メンバ関数のポインタ取得」がうまくゆかなかったので、「ウィンドウ(フォーム)のハンドル」を渡す。
(非メンバ関数ならポインタを渡すだけでOKたが、「インスタンス別にコールバック」したかったので今回非採用)
dwCallbackInstance
「コールバック関数で使うユーザーインスタンスデータ」と書いてある。
これを使えば「インスタンス別にコールバック」的な事が出来るのかな?未確認
flags
dwCallback は CALLBACK_WINDOW「ウィンドウのハンドルだよ」
//---------------------------------------------------------------------------
dwCallback に ウィンドウのハンドル をわたすと、MM_WOM_OPEN / MM_WOM_CLOSE / MM_WOM_DONE の
メッセージが来るので、受けられる様にしておく。
C++Builderの場合
void __fastcall MmWomOpen(TMessage &Message);
void __fastcall MmWomClose(TMessage &Message);
void __fastcall MmWomDone(TMessage &Message);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(MM_WOM_OPEN, TMessage, MmWomOpen);
VCL_MESSAGE_HANDLER(MM_WOM_CLOSE, TMessage, MmWomClose);
VCL_MESSAGE_HANDLER(MM_WOM_DONE, TMessage, MmWomDone);
END_MESSAGE_MAP(TControl)
分割したほうかいいかな?