Microsoft DirectX 8.0 (Visual Basic)

再生バッファの通知

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

バッファに通知イベントを設定するには、バッファのコードを保持するフォームに DirectXEvent8 クラスを最初に実装しなければならない。ドロップダウン クラス リストから DirectXEvent8 を選択して DirectXEvent8.DXCallback メソッドを作成し、イベントが通知されたときに実行するコードを追加する。

DirectX8.CreateEvent メソッドを呼び出してイベント ハンドルを作成し、そのイベントハンドルを DSBPOSITIONNOTIFY 型の hEventNotify メンバに渡す。この型を DirectSoundBuffer8.SetNotificationPositions メソッドに渡す。これで、再生カーソルが特定の位置に到達するたびに、イベント ハンドルが DirectXEvent8.DXCallback に渡される。

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

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

Implements DirectXEvent8
 
Dim gDX As New DirectX8
Dim gDSB As DirectSoundSecondaryBuffer8
Dim endEvent As Long
Dim dsbpn(0) As DSBPOSITIONNOTIFY

dsbpn は引数を 1 つしか持っていないが、配列でなくてはならないことに注意すること。

Form_Load サブルーチンで、イベントが作成される。

endEvent = gDX.CreateEvent(Me)

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

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

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

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