Platform SDK: DirectX

再生バッファの通知

[C++]

データがセカンダリ バッファにストリーミングされる場合、カレント プレイ ポジションがバッファ内のある点に到達したときや、再生が停止したときに、アプリケーションへの通知を発生させたいことがある。IDirectSoundNotify::SetNotificationPositions メソッドを使うと、イベントのシグナルを送信するポイントをバッファ内にいくつでも設定できる。ただし、バッファの再生中はイベント ポイントの設定を行えない。

最初に IDirectSoundNotify インターフェイスへのポインタを取得しなければならない。この取得は、バッファ オブジェクトの QueryInterface メソッドを使って行う。次に C++ による例を示す。lpDsbSecondaryIDirectSoundBuffer インターフェイス ポインタである。

LPDIRECTSOUNDNOTIFY lpDsNotify; 
 
HRESULT hr = lpDsbSecondary->QueryInterface(IID_IDirectSoundNotify, 
                                            (LPVOID *)&lpDsNotify); 
if SUCCEEDED(hr) 
{ 
    // 先に進んで、lpDsNotify->SetNotificationPositions を使う。
} 
 

IDirectSoundNotify インターフェイスは、ポインタを取得したバッファに関連付けられている。新しいインターフェイスのメソッドは自動的にこのバッファに適用される。

ここで Win32 の CreateEvent 関数を使ってイベント オブジェクトを作成する。このイベントのハンドルを DSBPOSITIONNOTIFY 構造体の hEventNotify メンバに書き込む。この構造体の dwOffset メンバで、バッファ内でイベントのシグナルを送信したい位置のオフセットを指定する。次にこの構造体のアドレスを、または複数の通知位置を設定したい場合は構造体の配列を、IDirectSoundNotify::SetNotificationPositions メソッドに渡す。

次の例は、1 つの通知位置を設定する。ループしない条件でバッファの終了位置に到達したか、アプリケーションが IDirectSoundBuffer::Stop メソッドを呼び出したか、どちらかの理由で再生が停止したときに、イベントのシグナルが送信される。

DSBPOSITIONNOTIFY PositionNotify;
 
PositionNotify.Offset = DSBPN_OFFSETSTOP;
PositionNotify.hEventNotify = hMyEvent;
// hMyEvent は、CreateEvent() が返したハンドルである。
 
lpDsNotify->SetNotificationPositions(1, &PositionNotify);
 

ボイス管理を使っている場合は、通知位置に到達する前にバッファを終了できる。DSBPOSITIONNOTIFY の注意を参照すること。

[Visual Basic]

データがセカンダリ バッファにストリーミングされる場合、カレント プレイ ポジションがバッファ内のある点に到達したときや、再生が停止したときに、アプリケーションへの通知を発生させたいことがある。DirectSoundBuffer.SetNotificationPositions メソッドを使うと、イベントのシグナルを送信するポイントをバッファ内にいくつでも設定できる。ただし、バッファの再生中はイベント ポイントの設定を行えない。

バッファに通知イベントを設定するには、バッファのコードを保持するフォームに DirectXEvent オブジェクトを実装しなくてはならない。そして DirectX7.CreateEvent メソッドを呼び出して、イベント ハンドルを作成する。このイベント ハンドルを DSBPOSITIONNOTIFY 型の hEventNotify メンバに配置する。この型を DirectSoundBuffer.SetNotificationPositions メソッドに渡す。

再生位置がバッファの通知位置に到達すると、DirectXEvent.DXCallback が呼び出される。

ボイス管理を使っている場合は、通知位置に到達する前にバッファを終了できる。DSBPOSITIONNOTIFY の注意を参照すること。

次のコードの例で、単一の通知位置の設定方法を示す。以下は、モジュールの宣言セクションの行である。

Dim gDX As New DirectX7
Dim gDSB As DirectSoundBuffer
Dim dsbpn(0) As DSBPOSITIONNOTIFY
Dim endEvent As Long
Implements DirectXEvent

dsbpn は単一の通知位置だけを保持するが、配列でなくてはならないことに注意すること。

フォームがロードされると、イベントが作成される。

endEvent = gDX.CreateEvent(Me)

DirectSoundBuffer オブジェクトの作成後、通知位置が設定され、次のようにイベントに関連付けられる。

With dsbpbn(0)
  .hEventNotify = endEvent
  .lOffset = DSBPN_OFFSETSTOP
End With
gDX.SetEvent endEvent
gDSB.SetNotificationPositions 1, dsbpn()

ループしない条件でバッファの終了位置に到達したか、アプリケーションが DirectSoundBuffer.Stop メソッドを呼び出したか、どちらかの理由でバッファが再生を停止したとき、通知のオフセットは DSBPN_OFFSETSTOP または –1 という、イベントが設定されることを示す特別な値を取る。これが発生すると、アプリケーション定義のコールバック関数が自動的に呼び出され、パラメータとして endEvent イベント識別子が渡される。

Private Sub DirectXEvent_DXCallback(ByVal eventid As Long)
  If eventid = endEvent Then
    lblStatusDesc.Caption = "Buffer stopped."
  End If
End Sub