yabasanshiro-saでGRANDIAのムービーの音がおかしい原因の調査の覚書のメモ(更新)
GRANDIAを動かすとムービーが遅い気がする。そして雑音だらけで何を言っているか分からない。遅いせいで雑音だらけなのか?音だけでも何とかしたい。と思って調べた。
ソースコードvdp2.cpp:882くらい
swap_frame_bufferがmanual changeされていて、VDP1 offset 0x02にval=3が書かれたとき更新される。
FBCR | Frame buffer switching mode |
どうやら遅いわけではなく、もともとそういうスピードにしてそう??
音が雑音だらけで遅くなっているのかと勘違いしていた。どうやら雑音だけの問題の模様。
セガサターンの音を再生する機能(SCSP)にはSLOTというものがあり、オープニングムービーでは、SLOT04とSLOT08を使っている模様(SSFのデバッグモードを使うとわかる)
08だけ生かすとほぼ無音(あっているのか?)
04だけ生かすとノイズまみれ。ただ、ノイズにまみれた中で、ところどころ正常な音が鳴る。部分的に問題なさそう。
とりあえずSLOT04が悪いようだ。
データを見てみると、サウンドバッファにあるデータをM68kに投げて、データを戻してから再生するようだ。おそらく、M68kとやらを使って圧縮された音を展開しているんじゃないだろうか。
原因を調べようとprintfを入れると音がマシになる。
またタイミング問題かよ。。。
タイミングの問題を調べようとする
なんかyabause.cのあたりで、CPUシミュレーションとSCSPシミュレーションの同期が取れてないような気がしてきた。
とりあえずyabause.cの中を見てみる
deciline = 1/10ライン
SCSP 44100 * 512 clock?
M68k 44100 * 256 clock?
decilineの9と10でHBlankINとHBlankOUTになり、ScspExecされる
PAL 50フレーム x 313ライン
NTSC? 60フレーム x 263ライン
1/10ライン当たり 143.0874... clockということ
この端数が良くないとか?
scsp_cycles_per_deciline =
VLBlankで
setM68kCounter((u64)(44100*256/60)<<SCSP_FRACTIONAL_BITS)
SmpcINTBACKEnd()
Vdp2VBlankIN()
SyncCPUtoSCSP()
と見ていった中で、SyncCPUtoSCSPが実質何もやっていないように見える。
CPUから書いたデータをSCSPで受けて、M68kに渡して展開、戻ってきたデータを(ここで壊れている感じ?)SCSPで鳴らす。 CPUとSCSPでタイミングを合わせないとうまくデータがやり取りできないのでは?
とりあえずの解決策
よく見ると、SCSPのコードには2通り実行コードがあった。
void ScspExec(){
if (thread_running == 0){
thread_running = 1;
if (g_scsp_main_mode == 0) {
YabThreadStart(YAB_THREAD_SCSP, (void * (*)(void *))ScspAsynMainCpuTime, NULL);
}
else {
YabThreadStart(YAB_THREAD_SCSP, (void * (*)(void *))ScspAsynMainRealtime, NULL);
}
YabThreadUSleep(100000);
}
}
何も変えない場合、ScspAsynMainRealtimeで動く。試しにg_scsp_main_modeを0にして、ScspAsynMainCpuTimeに変えてみると、雑音がなくなった。ただ、やっぱりスロー再生みたいになっているようだ。なんか遅い気がした感覚は気のせいではなかったようだ。
見たところRealtimeの方は時計の時間に同期して動くように見える。それに対してCpuTimeはおそらくシミュレーション時間に同期して動くものだと思われる。ここで雑音になった原因を考えてみると、端末のCPUが貧弱なためにCPUエミュレートが遅くなり、ムービーがスロー再生気味になるのに対し、SCSPだけ現実時間で動いて同期が取れなくなり、音声データがおかしくなり雑音だらけになったという事だろう。当初推測した原因(遅いせいで雑音になる)は一応当たっていたという事になる。
なんにせよグランディアの音が正常に鳴るようになった。やったー。と言いたいところだが、今度はスロー再生になるのが気になってしまう。CPUの処理能力が足りないんだろうが、うーん。。
FBCRで毎回書いてるみたいだから、なぜそれが遅くなっているかだなあ。
0 件のコメント:
コメントを投稿