Microsoft DirectX 8.0 (Visual Basic) |
アプリケーションでパフォーマンス イベントに応答しなければならない場合がある。たとえば、セグメントの終了に到達したことを知る必要がある場合や、グラフィックスを音楽の拍に同期させたい場合がある。特定のタイプのイベントが発生したときに、そのことを通知するよう DirectMusic に指示して、必要な情報を取得することができる。
注 パフォーマンス通知と DirectSound のバッファ通知を混同してはならない。DirectSound のバッファ通知は、バッファに対して直接ウェーブ データをストリーミングするアプリケーションでのみ使用される。「再生バッファの通知」および「キャプチャ バッファの通知」を参照すること。
通知を受けたいイベントの種類を指定するには、イベントの種類ごとに一度だけ DirectMusicPerformance8.AddNotificationType メソッドを呼び出す。次のサンプル コードでは、DirectMusic にセグメント イベントを要求している。perf は DirectMusicPerformance8 オブジェクトである。イベントの種類 (セグメントの開始やセグメントの終了など) は、通知メッセージから得られる。
Call perf.AddNotificationType(DMUS_NOTIFY_ON_SEGMENT)
通知は、DMUS_NOTIFICATION_PMSG メッセージ タイプの形式で送られる。Sub Main で DirectMusicPerformance8.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 の呼び出しを繰り返す。
同じタイム スタンプを持つメッセージが複数ある場合、これらのメッセージはキューに格納されるときに特定の順序にはならない。