103:バベル/ CDDA 再生終了直前に雑音がでる

最終状態:完了
report#103.1
投稿者:na6ko
時刻:2019-08-01 07:09:42
状態:新規
頻度:必ず起きる
再現方法:
第4話花の名前のシーンをだす
その次の次の文字列がたくさんでてくるシーンをだす
コマンドは下記を利用する.

第4話 花の名前 uses these commands.
d8 00 17 00 00 00 00 00 00 80
d9 02 18 00 00 00 00 00 00 80

Next scene uses these commands.
d8 00 15 00 00 00 00 00 00 80
d9 01 16 00 00 00 00 00 00 80

command 0xd9 の終了のための参照時刻が MSF ではなく TRACK である.
TRACK の場合 TOC を参照し該当 TRACK の INDEX 01 を終了時刻にすることが問題.
TRACK 17 と 19 は AUDIO TRACK で、 TRACK 18 と 16 は DATA TRACK である.
DATA と AUDIO が切り替わる TRACK は PCE では PREGAP を持ち、 INDEX 00 が存在する.
TRACK 18 や 19 の INDEX 00 の大半は subcode や data は Audio data になっているが、 TRACK 18 INDEX 01 の 1 つ前の frame は subcode は audio であるが、 main は computer data が入っていることを確認した.
report#103.2
投稿者:na6ko
時刻:2019-08-01 07:17:02
状態:新規
頻度:必ず起きる
対策は2つある.

- subchannel を参照し index 00 の場合は Audio 再生を無音にする
- track 指定の end position に index 00 がある場合は index 01 ではなく index 00 を利用する.

Audio 再生を無音はハードウェアのコンパイルのみで直せる. しかし配布のためのテスト工程が長い.

end position に index 00 を利用する方法は、現在のメモリカード内のイメージファイルに index 00 の時刻を記録していないのでイメージファイルの仕様改訂とPC用ソフトウェアと機材用ファームウェアの2つの対応が必要.

なおこの問題は mednafen でも起きる. 添付ファイルは mednafen のステートセーブファイル (save state file). UperGrafx では簡単に問題のシーンに到達できない.

この挙動は実機の動作確認結果を持って実装する.
report#103.3
投稿者:na6ko
時刻:2019-08-04 11:16:42
状態:新規
頻度:必ず起きる
subchannel Q 検査ツールをいまさら作った. このログを添付する.
書式は下記である.
MM:SS:FF(D) cC tTT iI
MM:SS:FF -> A-MSF
D -> 本当の LBA とのずれ
cC -> control
tTT -> TNO
iI -> index
1つ前の subchannel Q と比較して control, TNO, index がわかる場合に記載する.
report#103.4
投稿者:na6ko
時刻:2019-08-04 11:33:39
状態:新規
頻度:必ず起きる
今回の修正で INDEX 01 のときのみ音がでるように調整するつもりがそれは以前から実装されていた.
おそらく 18:03:02 (-1) が問題で、実際の 18:03:02 は main は DATA なのだが subcode 上は 18:03:01 の audio となっており不整合で音が鳴る.

mednafen で ccd file を読んだ場合は不整合の音が 1 frame だけだが、 cue file を読んだ場合は不整合の音の期間が長い理由も DATA TRACK の INDEX 00 が未定義なので AUDIO TRACK の INDEX 01 となっているためと予想される.
report#103.5
投稿者:na6ko
時刻:2019-08-04 11:38:18
状態:受付済
頻度:必ず起きる
David 氏に依頼した実機確認の報告を記載する:
Real hardware:
Real M/S/F counts up to 00:18:22, then:
- Byte 00 changes from "00" to "03"
- Byte 01 continues to remain "01"  (Note: both Mednafen and Upergrafx
return "00" for this value)
- Track/index remains at "17 01"
- the song does not repeat - I expect this is because I am interrupting the
head seek, by requesting CD_SUBQ endlessly
- Total min/sec/frame flickers between "18 31 21" to "18 31 32" (I used
slow-motion capture on my phone to see this)

I conclude that the real hardware doesn't wait for index 01 of track 18; it
repeats immediately at the end of track 17 in this case (audio->data).  I
don't know yet about audio->audio, if it continues to play index 00 of the
following track.  I will try to find an example and try it.
report#103.6
投稿者:na6ko
時刻:2019-08-04 11:43:50
状態:受付済
頻度:必ず起きる
Real MSF 00:18:22 は subcode 上では TRACK 17 INDEX 01 の最終 frame となり、その次は TRACK 18 INDEX 00 となる.
実際の CD drive では TNO とコマンドの値を比較して一致したら再生終了となり、 INDEX 18 INDEX 00 は再生されることがない.
この実装は以前行っていたが内部処理簡素化と他のエミュレータと同じ実装したので2018年12月26日になくなっていた.
report#103.7
投稿者:na6ko
時刻:2019-08-04 15:20:13
状態:修正済
頻度:必ず起きる
修正しました.
report#103.8
投稿者:na6ko
時刻:2019-10-05 06:19:55
状態:完了
頻度:必ず起きる
終了