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