Microsoft DirectX 8.0 (C++)

PlayAudio

説明

PlayAudio サンプルは、セグメントをロードしてオーディオパスで再生する方法、DirectMusic 通知を使用する方法、およびグローバル パフォーマンス パラメータを変更する方法を示す。

パス

ソース :(SDK ルート)\Samples\Multimedia\DirectMusic\PlayAudio

実行可能ファイル :(SDK ルート)\Samples\Multimedia\DirectMusic\Bin

ユーザーズ ガイド

デフォルトのセグメントを再生するか、[Open File] をクリックして別のウェーブ、MIDI、または DirectMusic セグメント ファイルをロードする。スライダを使ってテンポとボリュームを調整する。

プログラミング メモ

WM_INITDIALOG で、OnInitDialog 関数は次の処理を行う。

  1. Win32® イベント g_hDMusicMessageEvent を作成する。DirectMusic 通知を受信するたびに、DirectMusic はこのイベントを使ってアプリケーションに通知する。
  2. CMusicManager クラスのオブジェクト g_pMusicManager を作成する。
  3. CMusicManager オブジェクトを初期化する。これによって次の処理が行われる。
  4. IDirectMusicPerformance8::AddNotificationType を呼び出して GUID_NOTIFICATION_SEGMENT 型の通知を要求する。アプリケーションがセグメントの終了を確認できるように、DirectMusic はすべてのセグメント イベントをアプリケーションに通知する。
  5. IDirectMusicPerformance8::SetNotificationHandle を呼び出して Win32 イベント g_hDMusicMessageEvent を渡す。これを受け取った DirectMusic は、通知を利用できるときにこのイベントを通知する。

WinMain 関数は次のタスクを実行する。

  1. CreateDialog を使ってウィンドウを作成する。
  2. メッセージ ループ内で、MsgWaitForMultipleObjects を呼び出して g_hDMusicMessageEvent を渡す。これを受け取ることによって、g_hDMusicMessageEvent が通知されたことがわかる。DirectMusic は、DirectMusic 通知を受信するたびにこのイベントを通知する。
  3. WAIT_OBJECT_0 が返された場合は、ProcessDirectMusicMessages を呼び出す。
  4. WAIT_OBJECT_0 + 1 が返された場合は、Windows メッセージを利用できる。この関数は、PeekMessage を使ってメッセージの標準的な処理を行う。

[Open File] をクリックすると、OnOpenSoundFile 関数によって次のタスクが実行される。

  1. ファイル名を取得する。
  2. 以前に作成したセグメントがあれば、これを解放する。
  3. Dmutil.cpp 内の CMusicManager::CollectGarbage を呼び出す。これによって IDirectMusicLoader8::CollectGarbage が呼び出され、未使用オブジェクトが解放される。「ガベージ コレクション」を参照すること。
  4. CMusicManager::SetSearchDirectory を呼び出す。IDirectMusicLoader8::SetSearchDirectory が呼び出されて GUID_DirectMusicAllTypes とディレクトリが渡される。これによって、セグメントによって参照されるファイルの場所が DirectMusic に伝えられる。
  5. CMusicManager::CreateSegmentFromFile を呼び出して g_pMusicSegment と呼ばれる CMusicSegment を作成する。この処理は次の手順で行われる。

[Play] をクリックすると、OnPlayAudio 関数によって次の処理が行われる。

  1. そのサウンドをループする場合は、CMusicSegment::SetRepeats を呼び出して DMUS_SEG_REPEAT_INFINITE を渡す。ループしない場合は、繰り返しを 0 に設定する。
  2. CMusicSegment::Play を呼び出して IDirectMusicPerformance8::PlaySegmentEx を呼び出す。

通知が行われると、ProcessDirectMusicMessages 関数はセグメントが停止されたことを示すメッセージを検索する。次のタスクが実行される。

  1. ループ内で IDirectMusicPerformance8::GetNotificationPMsg を呼び出して利用可能な各メッセージを処理する。S_OK が返される限りループは繰り返される。利用可能なメッセージがなくなると、S_FALSE が返される。
  2. DMUS_NOTIFICATION_PMSG 構造体の dwNotificationOption が DMUS_NOTIFICATION_SEGEND の場合は、punkUser メンバ上で QueryInterface を呼び出して、終了したセグメント インスタンスの IDirectMusicSegmentState8 インターフェイスを取得する。IDirectMusicSegmentState8::GetSegment を使用すると、セグメント自体が取得される。このメソッドは IDirectMusicSegment を返す。IDirectMusicSegment8 を取得するには QueryInterface を使用する必要がある。アプリケーションはこのポイントをグローバル プライマリ セグメントのポインタと比較して、それが本当に停止されたプライマリ セグメントであることを確認する。DirectMusic Producer で作成したセグメントをほかのセグメントのトリガとすることができる。このため、再生されていたのがプライマリ セグメントだけであるとは限らない。
  3. すべてのインターフェイスをクリーンアップする。