port: move to formats-pin-2026-08-30 -- the voice export is complete
The late start was a second condition on the start filter, end - s < 1_500_000, only within one bank. ADV's predecessor trailer sits 3618816 B before end, so it was rejected and start fell back to anchor, a TOC offset rather than a stream boundary -- which is why it hit regions over 1.5 MB and never single-stream ones. ADV region 3114352 -> 3618816 B, streams 2 of 3 -> 3 of 3, complete, dropping zero chunks. S00A 1 of 3 -> 2 of 3 with the third digitally silent. The runtime no longer prints an incomplete line for either. Also fixes the warning crying wolf: S00A still read KNOWN INCOMPLETE over a 93.694 s stream of exact zeroes. Exported gains content_waves and the warning, console line and manifest field all key on kept < content rather than kept < present. Second time in two iterations this warning was wrong in the cautious direction -- over-warning is what makes the next real warning unreadable. S00A is a second movie in the predicted direction: kept went 1 -> 2 because a chunk that was a different duration now matches at 93.694 s. Not independent ground truth, but a different asset and the outcome was predicted first. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
@@ -81,7 +81,7 @@ license.workspace = true
|
||||
# geometry -- does NOT reach this port from here: `sylpheed-cli` builds from the
|
||||
# WORKSPACE crate, so the reference renderer stays unrotated until the tag lands
|
||||
# on `main`. This bump is for the parser, not for the renderer.
|
||||
sylpheed-formats = { git = "https://git.mc02.dev/fabi/Sylpheed.git", tag = "formats-pin-2026-08-29d" }
|
||||
sylpheed-formats = { git = "https://git.mc02.dev/fabi/Sylpheed.git", tag = "formats-pin-2026-08-30" }
|
||||
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
|
||||
@@ -208,6 +208,12 @@ pub struct Exported {
|
||||
/// Exists so a "known incomplete" warning fires on the gap and not on the
|
||||
/// mere presence of more than one stream.
|
||||
pub kept_waves: usize,
|
||||
/// How many of `sub_waves` carry SIGNAL. A dropped stream that is digitally
|
||||
/// silent is not missing content, and a warning that fires on it is crying
|
||||
/// wolf: `S00A`'s third chunk is 93.694 s of exact zeroes, so dropping it
|
||||
/// costs nothing and saying "KNOWN INCOMPLETE" over it would train a reader
|
||||
/// to ignore the one case that means something.
|
||||
pub content_waves: usize,
|
||||
/// What the runtime should do at the end of the file, where that was
|
||||
/// authored. `None` on a cue: a cue ends.
|
||||
pub loop_mode: Option<String>,
|
||||
@@ -353,6 +359,7 @@ pub fn export_cues<S: DiscSource + ?Sized>(
|
||||
loop_mode: None,
|
||||
sub_waves: 1,
|
||||
kept_waves: 1,
|
||||
content_waves: 1,
|
||||
});
|
||||
}
|
||||
Ok(done)
|
||||
@@ -523,6 +530,7 @@ pub fn export_bgm<S: DiscSource + ?Sized>(
|
||||
loop_mode: spec.r#loop.clone(),
|
||||
sub_waves: staged.len(),
|
||||
kept_waves: 1,
|
||||
content_waves: 1,
|
||||
}))
|
||||
}
|
||||
|
||||
@@ -915,6 +923,7 @@ pub fn export_voice<S: DiscSource + ?Sized>(
|
||||
loop_mode: None,
|
||||
sub_waves: riffs.len(),
|
||||
kept_waves: staged.len(),
|
||||
content_waves: riffs.len() - silent.len(),
|
||||
}))
|
||||
}
|
||||
|
||||
|
||||
@@ -457,7 +457,7 @@ fn run_export(disc: &Path, out: &Path, authored_dir: &Path) -> Result<()> {
|
||||
// export is known to be missing audio the game plays, and
|
||||
// the failure sounds like success: one stream decodes to
|
||||
// clean dialogue, so nobody listening finds out.
|
||||
if a.kept_waves < a.sub_waves {
|
||||
if a.kept_waves < a.content_waves {
|
||||
warnings.push(format!(
|
||||
"{}: KNOWN INCOMPLETE. This region holds {} streams and the RUNNING \
|
||||
GAME DECODES ALL OF THEM CONCURRENTLY (Canary --xma_param_probe: \
|
||||
@@ -477,7 +477,7 @@ fn run_export(disc: &Path, out: &Path, authored_dir: &Path) -> Result<()> {
|
||||
describe(&a),
|
||||
a.kept_waves,
|
||||
a.sub_waves,
|
||||
if a.kept_waves < a.sub_waves { " -- KNOWN INCOMPLETE, see warnings" } else { "" }
|
||||
if a.kept_waves < a.content_waves { " -- KNOWN INCOMPLETE, see warnings" } else { "" }
|
||||
);
|
||||
audio.push(ManifestAudio::from(a));
|
||||
}
|
||||
@@ -517,7 +517,7 @@ impl From<audio::Exported> for ManifestAudio {
|
||||
why: a.why,
|
||||
peak_dbfs: a.peak_dbfs,
|
||||
duration_s: a.duration_s,
|
||||
incomplete: (a.kept_waves < a.sub_waves).then(|| {
|
||||
incomplete: (a.kept_waves < a.content_waves).then(|| {
|
||||
format!(
|
||||
"{} of {} streams. The running game decodes all {} concurrently. \
|
||||
Nothing in the audio reveals the gap -- what plays is clean dialogue. \
|
||||
|
||||
Reference in New Issue
Block a user