Stream Data サンプル
説明
Stream Data サンプルでは、WAV ファイルを DirectSound セカンダリ バッファにストリーミングする方法を示す。Play Sound サンプルに似ているが、このサンプルにはストリーミングのサポートが追加されている。
パス
ソース:(SDK ルート)\Samples\C++\DirectSound\StreamData
実行可能ファイル:(SDK ルート)\Samples\C++\DirectSound\Bin
ユーザーズ ガイド
[Sound File] をクリックしてウェーブ ファイルをロードする。繰り返して再生する場合は、[Loop Sound] を選択する。[Play] をクリックする。
プログラミング メモ
このサンプルでは、DirectSound セカンダリ バッファ内のストリーミング サウンドを再生するために必要な基本的タスクが示されている。
DirectSound の設定
- DirectSoundCreate8 関数を呼び出して DirectSound オブジェクトを作成する。
- IDirectSound8::SetCooperativeLevel を呼び出す。
- プライマリ バッファのフォーマットを設定する。このサンプルは、Dsutil.cpp 内の DSUtil_SetPrimaryBufferFormat 関数を呼び出してこの処理を行う。
DirectSound バッファの作成と通知の設定
- WAV ファイル ヘッダーを読み込んでデータのサイズとフォーマットを取得する。
- DirectSound バッファのサイズを選択する。このサンプルでは、バッファは 3 秒間のデータを保持する。
- 選択したサイズで、WAV ファイルと同じフォーマットの DirectSound バッファを作成する。DSBCAPS_CTRLPOSITIONNOTIFY フラグも設定する。これによって、再生がバッファ内の特定のポイントに到達するたびにバッファによって通知イベントが送信されるようになる。ハードウェア バッファが位置の通知をサポートしていないドライバでは、このフラグの使用はソフトウェア バッファに制限される。
- バッファから IDirectSoundNotify8 インターフェイスを取得し、IDirectSoundNotify8::SetNotificationPositions を呼び出して、バッファの通知を設定する。InitDSoundNotification 関数を参照すること。再生カーソルは、通知位置を渡すときに、Win32 イベントを通知する。
DirectSound バッファの再生
- バッファが失われていないかどうかを確認し、失われた場合は IDirectSoundBuffer8::Restore を呼び出す。
- バッファ全体にファイルのデータを書き込む。
- DSBPLAY_LOOPING フラグを設定して IDirectSoundBuffer8::Play を呼び出す。ループ フラグを設定すると、バッファはデータの最初のバッチを再生した後に続けて再生を行う。
通知が行われているかどうかの確認
- メッセージ ループで、または MsgWaitForMultipleObjects を呼び出して独立したスレッドで、通知されたイベントを探す。
- バッファの通知イベントを受信している場合は、バッファの最後に再生を終了したセクションをロックして、そこに新しいデータを書き込む。HandleNotification 関数を参照すること。
バッファの停止
イベント通知を処理する際は、バッファに書き込まれたデータ量を常時追跡する。WAV ファイル全体がバッファに書き込まれ、その内容すべてが DirectSound によって再生されたら、バッファを手動で停止する必要がある。手動で停止しないと、バッファはループし続ける。
参照