2025年4月5日土曜日

続4:中華linuxゲーム端末Anbernic 353PSでセガサターン (更新)

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 件のコメント:

コメントを投稿