Platform SDK: DirectX |
ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectSound Visual Basic チュートリアル」を参照すること。
ここまででストリーム バッファの作成に成功したので、次はカレント プレイ ポジションがバッファ内の特定の位置に達したときに通知を受け、他のデータをストリームする時期を把握できるようにする。この例では、これらの位置をバッファの先頭と中間に設定する。
最初に、必要な数のイベントを作成し、それらのハンドルを rghEvent 配列に保存する。
for (int i = 0; i < NUMEVENTS; i++) { rghEvent[i] = CreateEvent(NULL, FALSE, FALSE, NULL); if (NULL == rghEvent[i]) return FALSE; }
次に、DSBPOSITIONNOTIFY 構造体の配列を作成する。各構造体は、バッファ内の位置をイベント ハンドルに関連付ける。
rgdsbpn[0].dwOffset = 0; rgdsbpn[0].hEventNotify = rghEvent[0]; rgdsbpn[1].dwOffset = (dsbdesc.dwBufferBytes/2); rgdsbpn[1].hEventNotify = rghEvent[1];
さらにセカンダリ バッファから IDirectSoundNotify インターフェイスを取得し、DSBPOSITIONNOTIFY 配列を SetNotificationPositions メソッドに渡す。
if FAILED(IDirectSoundBuffer_QueryInterface(lpdsb, IID_IDirectSoundNotify, (VOID **)&lpdsNotify)) return FALSE; if FAILED(IDirectSoundNotify_SetNotificationPositions( lpdsNotify, NUMEVENTS, rgdsbpn)) { IDirectSoundNotify_Release(lpdsNotify); return FALSE; }
これで、ストリーム バッファの設定が完了する。既にウェーブ ファイルを開き、データのストリーミングを開始する準備ができているので、ここでバッファの設定を順次実施できる。サウンド全体の再生が終わるまで動作を続けたいので、DSBPLAY_LOOPING フラグをセットする。
IDirectSoundBuffer_Play(lpdsb, 0, 0, DSBPLAY_LOOPING); return TRUE; } // SetupStreamBuffer() の終わり。
次項 : ステップ 5 : 再生の通知の処理