その1
ストリーミング再生に DSBCAPS_CTRLPOSITIONNOTIFY フラグを使っています。
これは再生カーソルが指定した位置にくるとイベントをシグナル状態にしてくれるものです。
(yaneSDKみたいに自前で処理しても良いんですが^^;)
ところが複数再生すると何故か音が飛びます。
ブレークポイントを仕掛けてみると、なんと全てのイベントがシグナル状態になってるではありませんか。
googleでDSBCAPS_CTRLPOSITIONNOTIFYで検索してもほとんど資料はでてきません(当時は2Hitとかでした)。
最新のMSDNを見てみると、
VXD ドライバの場合、DSBCAPS_CTRLPOSITIONNOTIFY を使って作成されたサウンド バッファは常にソフトウェア バッファである。これは、VXD ドライバ モデルが通知をサポートしないためである。
WDM ドライバでは、ハードウェア リソースが利用可能な場合は、通知をサポートするバッファをハードウェアに置くことができる。
とあります。
うちのサウンドボード:Creative SB Audigy 2 ZS (WDMドライバ)
ビンゴ。・゜・(ノ∀`)・゜・。
どうやらうちのドライバ君は複数の通知イベントを扱えないようで、その結果複数再生で音が飛んでいたのでした。
ということで、DSBCAPS_LOCSOFTWAREを指定してソフトウェアミキサを使うようにすると正常に再生してくれました。
WDMドライバなサウンドボードを使ってなければこれに気付かなかったかも知れません(((゜ω゜;))))
追記。
複数再生というのは、他アプリで使用されてるのも含まれるようで。
困ったらまずソフトウェアエミュレーションを試すと道はひらかれる!
google用キーワード:
IID_IDirectSoundNotify SetNotificationPositions DSBPOSITIONNOTIFY DSBCAPS_CTRLPOSITIONNOTIFY