102:Audio CD player/ seek 時間が長すぎる

最終状態:完了
report#102.1
投稿者:na6ko
時刻:2019-07-21 09:12:32
状態:受付済
頻度:必ず起きる
再現方法:
Drive Speed = normal にする
大きめの track を指定して再生するとわかりやすい
Track 単位で再生をするとき Audio CD player では command 0xd8 (seek only) のあとに command 0xd8 (seek + play, command 0xd9 ではない) を発行するダメ仕様.
なぜか 2 度目の seek 時間が異様に長いのは明らかにこちらのバグ.
スチームハーツと同じ対応で、seek position が近い場合は seek のし直しをしない対応をとりあえずいれてみたが、これが正しく動かない.
Track 番号での seek poisition の比較は toc から msf を取得し、比較する.
この msf は変数上、 MSF の S の bit7 を audio か data 判別するフラグにしており、 msf から sector を計算する場合に S の bit7 が有効になっており、seek のし直しを誤って判定していた.
よってこの関数から S の bit7 を除外することで問題は修正できた.
report#102.2
投稿者:na6ko
時刻:2019-07-21 09:15:46
状態:受付済
頻度:必ず起きる
これで一応長いseek時間が2度発生する問題は一旦回避した.
しかし seek をしないこととは別に 1 度目の seek で最後の head position を保存していれば, 2 度目の seek 時間は短くなるはずでそれを保存しない理由の調査が必要である.
一応、この場合は seek をしただけで read も play もしてない上に command 0xd8 を使っているというのが原因なのは大まかに見当がついている.
report#102.3
投稿者:na6ko
時刻:2019-07-28 07:21:36
状態:修正済
頻度:必ず起きる
#2 で一旦回避した問題を戻し、 head position が保存されない理由を調べた.
audio playback 停止時に audio が再生していたら subchannel Q の MSF を参照し、head position を更新する.
更新する条件が audio 再生ではなく drive 停止になっていた. Audio CD Player では seek 後に1度も再生せずに drive 停止をするため, subchannel Q の MSF が更新されておらず不正な値がはいっていたのが原因.
更新条件を変更することによって2度目に長い seek 時間が入ることはなくなった.

ただし, head position 更新の参照先では subchennel Q では正確ではない場合があるので本当の LBA を参照する方が正確な動作を期待できる.
report#102.4
投稿者:na6ko
時刻:2019-10-05 06:18:29
状態:完了
頻度:必ず起きる
終了