Microsoft DirectX 8.0 (Visual Basic)

通知とイベントの処理

アプリケーションでパフォーマンス イベントに応答しなければならない場合がある。たとえば、セグメントの終了に到達したことを知る必要がある場合や、グラフィックスを音楽の拍に同期させたい場合がある。特定のタイプのイベントが発生したときに、そのことを通知するよう DirectMusic に指示して、必要な情報を取得することができる。

  パフォーマンス通知と DirectSound のバッファ通知を混同してはならない。DirectSound のバッファ通知は、バッファに対して直接ウェーブ データをストリーミングするアプリケーションでのみ使用される。「再生バッファの通知」および「キャプチャ バッファの通知」を参照すること。

通知を受けたいイベントの種類を指定するには、イベントの種類ごとに一度だけ DirectMusicPerformance8.AddNotificationType メソッドを呼び出す。次のサンプル コードでは、DirectMusic にセグメント イベントを要求している。perfDirectMusicPerformance8 オブジェクトである。イベントの種類 (セグメントの開始やセグメントの終了など) は、通知メッセージから得られる。

Call perf.AddNotificationType(DMUS_NOTIFY_ON_SEGMENT)

通知は、DMUS_NOTIFICATION_PMSG メッセージ タイプの形式で送られる。Sub MainDirectMusicPerformance8.GetNotificationPMsg メソッドを呼び出して、保留中の通知メッセージをポーリングすることができる。また、メッセージが保留中のときに、DirectMusic に別のスレッドでイベント オブジェクトを通知させることもできる。

DirectMusic にイベントを通知させるには、DirectX8.CreateEvent を使用してイベント ハンドルを取得し、このハンドルを DirectMusicPerformance8.SetNotificationHandle に渡す。CreateEvent に渡すモジュールは DirectXEvent8 クラスを実装し、イベントを通知するときに DirectMusic によって呼び出される DirectXEvent8.DXCallback メソッドの実装を提供する必要がある。

次のサンプル コードでは、frmMain というフォーム モジュールの通知を設定している。

' DX は DirectX8 オブジェクトを表し、perf は DirectMusicPerformance8 オブジェクトを表す。
 
Dim hEvent As Long
hEvent = DX.CreateEvent(frmMain)
Call perf.SetNotificationHandle(hEvent)

フォーム モジュールには、セグメントが演奏を終了したことを示すメッセージを処理するコードが含まれる。

Implements DirectXEvent8
 
Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)
 
  Dim GotMSG As Boolean
  Dim PMsg As DMUS_NOTIFICATION_PMSG
 
  Do
    GotMSG = gobjDMPerformance.GetNotificationPMSG(PMsg)
    If GotMSG Then
      If PMsg.lNotificationOption = DMUS_NOTIFICATION_SEGEND Then
 
        ' セグメントの演奏が終了しているので、処理を実行する。
        .
        .
        .
      End If
    End If
  Loop Until Not GotMSG
 
End Sub

アプリケーションのメイン ループで、イベントを作成して通知メッセージを取得する必要はない。DirectMusicPerformance8.AddNotificationType メソッドを呼び出して通知を要求している場合、メッセージはパフォーマンスによって送信され、DirectMusicPerformance8.GetNotificationPMsg の呼び出しで取得することができる。

イベントが通知される場合、またはループで GetNotificationPMsg を呼び出す場合は、複数のメッセージを待機することができる。すべての通知を確実に受け取るには、False が返されるまで GetNotificationPMsg の呼び出しを繰り返す。

同じタイム スタンプを持つメッセージが複数ある場合、これらのメッセージはキューに格納されるときに特定の順序にはならない。