captainys / TOWNSEMU

FM Towns Emulator "Tsugaru"
BSD 3-Clause "New" or "Revised" License
247 stars 18 forks source link

Super Street Fighter II PCM noise #7

Closed fuzz6001 closed 3 years ago

fuzz6001 commented 4 years ago

Wikiで報告させていただいているスパ2のPCMノイズについてですが、原因が分かったかも知れません。本当は自分で直したかったのですが、割り込みが絡んできて手に負えなくなってきましたので、こちらで報告させていただきます。

原因はPCM割り込み処理のタイムラグではないかと思います。割り込みが発生し、実際にエミュレータが処理をするまでのタイムラグです。このタイムラグの間に、本来であれば再生されないPCMデータが再生されてしまっているようです。

スパ2側のコードを読んでいないので一部想像になりますが、具体例としてタイトル画面のカーソル移動音について書きます。

という流れになります。 試しに、割り込みが発生した時点で無理やり音を止めるようにしてみるとノイズは無くなりました。

報告は以上になります。

A000 +----------+ <- ここから再生開始
     |//////////|
     |//////////|
     |//////////|
     |//////////|
B000 +----------+
     |//////////|
     |//////////| <- PCMデータはここまでだが再生は続いている
     |          |
     |          |
C000 +----------+ <- ここで割り込みが発生したときにキーオフしている(という推測)
     |\\\\\\\\\\| <- ここからは別のPCMデータ
     |\\\\\\\\\\|
     :          :
captainys commented 4 years ago

おおなるほど!ご報告ありがとうございます!

これは、案外厄介な問題ですね。現在約1msごとにWAVの再生状態をチェックしてそれに応じて割り込みを出しているので、運が悪いと最大1ms程度PCMがオーバーランする可能性があります。おそらくそのオーバーランが聞こえてしまっているんですね。

ひとつの解決策としてCPUコアをめちゃくちゃ速くするという手があるのですが、ちょっとすぐにはできそうにありません。何かいい方法が無いか考えてみます。

fuzz6001 commented 3 years ago

c88dd62d2fd09e044fd73c88fa0b33322de12ab0 このコミットで修正(もしくは軽減)されているようなのクローズします。