From 9ab1f591959e6fa850545d00f5c87f02d74aedf9 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sun, 30 Aug 2026 13:51:34 +0000 Subject: [PATCH] port: check-all hung for an hour on an ffmpeg that had already finished its work check-all sat on two lines of output for over an hour. The cause was the 5.1 bed in check-capture-controls: ffmpeg completes the filter graph and then never exits. Diagnosed rather than guessed -- the output reaches 4604262 bytes, exactly 8.0 s of 5.1ch/16-bit/48kHz, the full intended length, with the artifact correct on disk while the process hangs. Three formulations all hang and all produce byte-identical output: the original, one with -t 8 bounding the output, and one with explicit asplit feeding each atrim (the textbook fix for multi-use of a single input). So it is not the split, not the output stage, and the artifact is not in doubt. Worse than the hang: it leaks. An orphaned ffmpeg from this script's earlier aloop form was still running after 9.5 hours, burning CPU across runs nobody was watching. boot.gd's header already names the shape -- a job that waits forever reads as a job still working. Bounded with timeout, and the ARTIFACT is now checked rather than the exit code: the bed's duration must be 8 s or the sweep refuses to score itself. That is the better test regardless of the hang -- an exit code says ffmpeg thought it was done, the file says what it wrote. The step now completes in 99 s and the sweep matches its specification. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- tools/port/check-capture-controls | 32 +++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/tools/port/check-capture-controls b/tools/port/check-capture-controls index 4046791a..a7af7e7e 100755 --- a/tools/port/check-capture-controls +++ b/tools/port/check-capture-controls @@ -72,7 +72,30 @@ ffmpeg -v error -y -i "$W/tones.wav" -c:a pcm_f32le "$W/tones_f32.wav" # Six NON-OVERLAPPING spans of real audio, one per channel, all continuous. A # second attempt used `aloop=-1` to stretch the short UI cues into full-length # channels and hung ffmpeg indefinitely; spans of the long assets need no looping. -ffmpeg -v error -y -i export/audio/bgm/main_menu.ogg \ +# 🔴 THIS FFMPEG COMPLETES ITS WORK AND THEN NEVER EXITS, AND IT WEDGED THE +# WHOLE SUITE FOR AN HOUR. +# +# `check-all` sat on two lines of output for over an hour; the cause was this +# call. Diagnosed rather than guessed at: the output file reaches **4 604 262 +# bytes = exactly 8.0 s of 5.1ch/16-bit/48 kHz**, the full intended length, and +# ffmpeg then hangs with the artifact already correct on disk. +# +# Three formulations were tried and all three hang, all three producing +# BYTE-IDENTICAL output: the original, one with `-t 8` bounding the output, and +# one with explicit `asplit` feeding each `atrim` (the textbook fix for +# multi-use of a single input). So it is not the split, not the output stage, +# and the artifact is not in doubt. +# +# ⚠️ Worse than the hang: it LEAKS. An orphaned ffmpeg from this script's earlier +# `aloop` form was found still running after **9.5 hours**, burning CPU across +# runs nobody was watching. `boot.gd`'s own header already names this failure +# shape -- "it does not fail, it waits, and a job that waits forever reads as a +# job still working". +# +# So: bounded, and the ARTIFACT is checked rather than the exit code. That is +# the better test regardless of the hang -- an exit code says ffmpeg thought it +# was done, the file says what it actually wrote. +timeout 90 ffmpeg -v error -y -i export/audio/bgm/main_menu.ogg \ -i export/audio/voice/ADV.ogg -i export/audio/voice/S00A.ogg \ -filter_complex "[0:a]atrim=2:10,asetpts=N/SR/TB,aformat=channel_layouts=mono[a0]; \ [0:a]atrim=20:28,asetpts=N/SR/TB,aformat=channel_layouts=mono[a1]; \ @@ -81,7 +104,12 @@ ffmpeg -v error -y -i export/audio/bgm/main_menu.ogg \ [2:a]atrim=12:20,asetpts=N/SR/TB,aformat=channel_layouts=mono[a4]; \ [2:a]atrim=35:43,asetpts=N/SR/TB,aformat=channel_layouts=mono[a5]; \ [a0][a1][a2][a3][a4][a5]join=inputs=6:channel_layout=5.1[a]" \ - -map "[a]" -c:a pcm_s16le "$W/bed.wav" + -map "[a]" -c:a pcm_s16le "$W/bed.wav" /dev/null || echo 0) +if ! awk "BEGIN{exit !($bed_dur > 7.9 && $bed_dur < 8.1)}"; then + echo "🔴 the 5.1 bed is $bed_dur s, not the 8 s this sweep is built on -- refusing to score it" >&2 + exit 2 +fi # The same bed with 350 ms holes punched through it, every second. ffmpeg -v error -y -i "$W/bed.wav" \