Repository navigation
fix(v3 web): 内部生成に切り替えると画面が固まるのを直す - #4
Merged
Merged
Conversation
v3.2.0 から、内部生成へ切り替えると画面が一切更新されなくなっていた (Host は動き続け、時刻も進んでいる)。 Host は null の項目を JSON から省く(WhenWritingNull)ので、ループ無しの generator.loopEndTime は null ではなくキーごと届かない。生成パネルは `!== null` で判定していたため undefined をループ有りと取り違え、終了 TC の 欄を描こうとして TimecodeInput が undefined.split で例外を出していた。 Preact は描画中の例外でそれ以降の再描画をしなくなるので、画面全体が止まる。 Web の fake-host は null を明示で入れていたのでテストでは出なかった。 - 届かないときは null(ループ無し)として扱う - protocol.ts の型を省略可能にし、同じ取り違えを型検査で止める - Host と同じ形(キー無し)の状態で描画するテストを足す - bridge-protocol.md に loopEndTime を書き足す - dist を作り直した OS 共通の不具合(macOS 実機では未確認)。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v3.2.0〜v3.2.1 は内部生成へ切り替えると画面が固まったが、smoke-windows.ps1 は 内部生成の画面を一度も開いていなかったので、CI とリリース前の確認を通っていた。 音声デバイスの要らない手順なので CI(release-v3.yml の発行物の確認)でも走る。 v3.2.1 のリリース版で NG(SMOKE FAIL)、修正後で ok になることを確かめた。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Host は null の項目を JSON からキーごと省く(WhenWritingNull)。Web の型は `X | null` で、偽 Host は null を明示で入れていたため、本番でだけ undefined が届いて壊れる箇所をテストで見つけられなかった(v3.2.1 の内部生成フリーズ)。 - 偽 Host(fakeState と送信)も本物と同じく null を省いて渡す。既存の描画 テストが本番と同じ形の状態で走り、生成パネルの不具合を戻すと落ちる - protocol.ts の null になりうる項目をすべて `?: X | null` にし、型検査で 誤用を拾えるようにした。bridge-protocol.md にも同じ規則を書いた - 無音(ピーク 0)の wave は levelDbfs が省かれ、isHostMessage が捨てていた。 信号が止まってもレベル表示が最後の値(例 −1.9 dBFS)のまま止まっていた のを、-- dBFS と平らな波形に戻るようにした Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TC 欄は各欄 2 桁(maxlength=2)で、埋まった欄をクリックするとカーソルが 立つだけになり、数字を打っても何も変わらなかった(ダブルクリックで選んで からなら打てた)。欄に入ったら 2 桁を選び、打った数字で置き換える。 クリック・Tab・矢印・桁あふれのどれで入っても同じ。 クリックは mousedown の既定動作を止めて自分で選ぶ。focus で選ぶだけだと WebKit(macOS)は続く mouseup で選択を解くため。右クリックは今までどおり。 Windows 実機で、キュー追加ダイアログのトリガー時間・生成パネルの開始 TC・ OFFSET を、マウスとキーボードで操作して確かめた。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
内部生成でループを入れたまま開始 TC を終了 TC より後に打つと、Host の generator.configure は検証エラーを返すのに、開始 TC(とフレームレート)を 書き換えたまま戻していなかった。開始 03:45:11:20・終了 01:03:10:00 のような 範囲として成り立たない設定が残る。Web は入力のたびに開始と終了を両方送るので、 開始 TC を打つだけで起きる。 Host は検証を全部済ませてから書き換え、1 つでも弾いたら何も変えない。 FPS を 30→24 にしたとき開始 TC のフレームが 24 以上だと、FPS だけ変わり 開始 TC が 30fps の値のまま残っていたのも、同じ原因で直る。 生成パネルは、終了 TC が開始 TC 以前の間は TC を送らず(打っている途中で 一時的にそうなることもある)、欄の下に反映していないことを出す。音量や 出力先はそのまま送る。FPS を変えたら、新しいレートにないフレーム番号を 丸めてから送る。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
v3.2.0 / v3.2.1 で、内部生成モードに切り替えると画面が一切更新されなくなる(フリーズしたように見える)不具合を直します。Windows で報告されましたが、原因は Web 側にあり OS 共通です(macOS 実機では未確認)。
同じ原因(Host が null の項目を省く)の取りこぼしを Web 全体でなくし、テストで見つけられるようにしました。あわせて、実機確認で見つけた「TC 欄を 1 回クリックしても数字を打てない」問題と、「ループの開始 TC を終了 TC より後にすると、終了が開始より前のループ設定が残る」問題(Host)も直します。
原因
Protocol.csのWhenWritingNull)。ループ無しのgenerator.loopEndTimeはnullではなく、キーごと届きません。generator-panel.tsx)はloopEndTime !== nullでループの有無を判定していたため、undefinedを「ループ有り」と取り違え、終了 TC の欄を描こうとしてTimecodeInputがundefined.splitで例外を出していました。変更
内部生成のフリーズ(0bc7908, 2339809)
null(ループ無し)として扱うtools/tcb3/smoke-windows.ps1に「内部生成へ切り替えて生成パネルが描かれるか」を追加。音声デバイスが要らないので CI とリリース前の発行物確認でも走りますnull の省略を Web 全体で正しく扱う(5013f70)
fakeStateと送信)も本物の Host と同じく null を省いて渡す。既存の描画テストが本番と同じ形の状態で走り、生成パネルの不具合を戻すと既存のモード切替テストも落ちるprotocol.tsの null になりうる項目をすべて?: X | nullにし、型検査で誤用を拾う。bridge-protocol.mdにも同じ規則を書いたlevelDbfsが省かれ、isHostMessageが捨てていた。LTC が止まってもレベル表示が最後の値のまま止まっていたTC 欄(a06edeb)
maxlength=2)で、埋まった欄を 1 回クリックするとカーソルが立つだけになり、数字を打っても変わらなかった(ダブルクリックで選べば打てた)。欄に入ったら 2 桁を選び、打った数字で置き換える。クリック・Tab・矢印・桁あふれのどれでも同じループ範囲の検証(a255d16)
generator.configureは検証エラーを返すのに、開始 TC(とフレームレート)を書き換えたまま戻していなかった。/stateが開始 03:45:11:20・終了 01:03:10:00 のような、範囲として成り立たない組み合わせになる。Web は入力のたびに開始と終了を両方送るので、開始 TC を打つだけで起きるbridge-protocol.mdのgenerator.configureにloopEndTimeと「弾いたら何も変えない」を書いた確認(Windows 11 実機)
distを作り直したTimecodeBridge.Host.Tests92 件通過。ループ範囲で足した 3 件は a255d16 の前のコードで落ちることを確認/state/clockは進んでいる)−1.9 dBFSのまま、このブランチは-- dBFSになり波形も平らになる/commandで直接送ると validation で何も変わらない。2 秒ループの再生で折り返す。この確認は画面操作の許可が下りなかったので、マウスではなく自動操作口(/eval)から入力欄へ input/change イベントを送って行ったsmoke-windows.ps1 -LoopbackDevice "CABLE In 16ch": SMOKE PASS(LTC ループバック受信、誤り率 0%、LTC の時刻でキュー発火)未確認・別件
loopEndTimeを省いて開始 TC だけ送る呼び出しは、従来どおり開始 TC が終了 TC を越えるとループを外す(Web からは来ない)🤖 Generated with Claude Code