プロが教えるわが家の防犯対策術!

いろいろ調べたりやってみたりしたのですがうまくいかないので質問させてください。

DirectSoundを使って音を鳴らすとき、再生されきる前に意図的にStop()を使って止めたりSetVolumeで完全に無音にさせたり、ないしは途中で周波数を変えたりすると、「ブチ」っというノイズが鳴ってしまいます。(ならないときもあるけどほとんどの場合でなります)

調べた限り原因はおそらくはプライマリバッファに先行して書き込まれたゴミが残っているためだとは思うのですが、解決策がまったくわかりません。
プライマリバッファに0を書き込もうとしてもサイズが調べられないのでLock出来ないし、仮に出来たとしても、複数音再生されているときにひとつだけ停止させた時、他の再生中の音も途切れてしまうような気がしてなりません。

どなたか解決策をご存知でしょうか?
ご存知でしたらよろしくおねがいします。

A 回答 (1件)

ハードウェアの問題なので、解決するには「音のとめ方に気を使う」しかありません。



スピーカーの動作原理は「電磁石で、コーンを押したり引っ張ったりして、空気を振動させる」事により、電気信号を音にしています。

この時「音のとめ方が悪い」と、コーンが引っ張られた状態のままとか、コーンが押された状態のままで、音がとまります。

音は鳴ってませんが、スピーカーのコーンは「引っ張られた状態のまま」とか「押された状態のまま」とかになっているのです。

もちろん、運が良ければ「押されも引っ張られもしてない、中間の状態」のまま止まってる事もあります。

で、その状態で、別の音を鳴らし始めると「コーンが、押されも引っ張られもしてない、中間の状態に戻されてから、音が鳴り始める」のです。

すると、かなりの確率で「コーンが引っ張られた状態から、一気に中間の状態に戻る」とか「コーンが押された状態から、一気に中間の状態に戻る」って事が起きます。

スピーカーのコーンがそんな激しい動きをしたら、コーンの周囲にある空気が激しく振動します。

その「空気の激しい振動」は「人間の耳には、プチ、と言う音に聞こえる」のです。

音声再生をとめる場合は「コーンの動きが音になってしまうような急速なボリューム制御をしないように気を付けながらゆっくりとボリュームを0に絞る、と言う方法を用いてスピーカーのコーンをニュートラルの位置にしてから、音声の出力を止める」と言う工夫が必要です。

試してみると判りますが「波形がプラス側のピーク値に張り付いたままの音声データ」は、鳴らしても音がしません。なぜなら「スピーカーコーンが押された(または引っ張られた)状態のまま動かない」ので、音が出ません。

この状態で「波形がマイナス側のピーク値に張り付いたままの音声データ」を鳴らすと、一瞬だけ「プチ」と鳴り、それ以降は音がしません。

これは「スピーカーコーンが押された状態から引っ張られた状態(またはその逆の状態)に一瞬で動いた所為でプチと鳴って、それっきりコーンが動かない」からです。

そういった訳で、プチ音の原因は「音をとめた瞬間のスピーカーのコーンの位置がニュートラル位置じゃない」のが原因です。

プライマリバッファがそうの、サウンドバッファがどうの、ゴミがどうのって問題ではないのです。

原因は「音の止め方が悪いから」です。

なので「SetVolumeでイキナリ無音にする」とか「Stop()でいきなり止める」とか、スピーカーのコーンがニュートラルの位置に戻らないままの状態で音を止めてはいけません。

なお「一時停止」と「一時停止の解除」は、この限りではありません。なぜなら「音が止まった瞬間」と「音が再開した瞬間」では、スピーカーのコーンの位置がまったく変化しないからで、プチ音はしません。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!