Platform SDK: DirectX

ステップ 4 : 再生の通知の設定

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectSound Visual Basic チュートリアル」を参照すること。

[C++]

ここまででストリーム バッファの作成に成功したので、次はカレント プレイ ポジションがバッファ内の特定の位置に達したときに通知を受け、他のデータをストリームする時期を把握できるようにする。この例では、これらの位置をバッファの先頭と中間に設定する。

最初に、必要な数のイベントを作成し、それらのハンドルを 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 : 再生の通知の処理