capture: refuse the multi-track ranged item render, silence the track's children and receives for it, and gate every exact-bounds capture on its frame count
This commit is contained in:
@@ -216,11 +216,12 @@ static void testScopeSourceModes() {
|
||||
}
|
||||
|
||||
static void testRangedItemScopeRendersTimeBounded() {
|
||||
// The Ψ.7 defect pinned at the bit level. A window the item extent does NOT
|
||||
// print must never reach the &32 selected-items source: that source takes its
|
||||
// bounds from the item extents, so RENDER_STARTPOS/ENDPOS cannot narrow it and
|
||||
// the capture widens to the whole item. The ranged item capture renders through
|
||||
// the selected-tracks source instead, which IS time-bounded.
|
||||
// The widening defect pinned at the bit level. A window the item extent does NOT
|
||||
// print must never reach the &32 selected-items source: that source is INFERRED
|
||||
// (unverified — src/core/capture/CLAUDE.md §Gotchas) to take its bounds from the
|
||||
// item extents, so RENDER_STARTPOS/ENDPOS cannot narrow it and the capture widens
|
||||
// to the whole item. The ranged item capture renders through the selected-tracks
|
||||
// source instead, which IS time-bounded.
|
||||
const SourceMode ranged = sourceModeForScope(CaptureScope::Item, false);
|
||||
CHECK(ranged == SourceMode::SelectedTracks);
|
||||
|
||||
@@ -242,6 +243,41 @@ static void testRangedItemScopeRendersTimeBounded() {
|
||||
CHECK(fxBypassPlanFor(CaptureScope::Item).bypassSelfFx);
|
||||
}
|
||||
|
||||
static void testMultiTrackRangedItemRenderIsNamedForRefusal() {
|
||||
// The one shape that cannot land: a ranged item capture (item scope re-sourced to
|
||||
// the selected-tracks render) whose items span more than one track. That source
|
||||
// renders one file per track with no single-file bit available, so N stems would
|
||||
// collapse onto one render pattern and one track's audio would land as a
|
||||
// successful capture.
|
||||
CHECK(isMultiTrackRangedItemRender(CaptureScope::Item,
|
||||
SourceMode::SelectedTracks, 2));
|
||||
CHECK(isMultiTrackRangedItemRender(CaptureScope::Item,
|
||||
SourceMode::SelectedTracks, 7));
|
||||
|
||||
// One track is the whole point of the re-source — it must still render.
|
||||
CHECK(!isMultiTrackRangedItemRender(CaptureScope::Item,
|
||||
SourceMode::SelectedTracks, 1));
|
||||
CHECK(!isMultiTrackRangedItemRender(CaptureScope::Item,
|
||||
SourceMode::SelectedTracks, 0));
|
||||
|
||||
// A full-extent item capture keeps the selected-items source, whose single-file
|
||||
// bit already sums a multi-track item selection into one file.
|
||||
CHECK(!isMultiTrackRangedItemRender(CaptureScope::Item,
|
||||
SourceMode::SelectedItems, 3));
|
||||
|
||||
// Track scope renders through the same source and is deliberately untouched here
|
||||
// — that per-track output predates the item re-source and is filed in docs/TODO.md.
|
||||
CHECK(!isMultiTrackRangedItemRender(CaptureScope::Track,
|
||||
SourceMode::SelectedTracks, 3));
|
||||
|
||||
// The predicate is reachable from the mapping it guards: the ranged item capture's
|
||||
// own source mode is the one it names.
|
||||
CHECK(isMultiTrackRangedItemRender(CaptureScope::Item,
|
||||
sourceModeForScope(CaptureScope::Item, false), 2));
|
||||
CHECK(!isMultiTrackRangedItemRender(CaptureScope::Item,
|
||||
sourceModeForScope(CaptureScope::Item, true), 2));
|
||||
}
|
||||
|
||||
// --- inferRangeSource: razor-else-time (orthogonal to scope) -----------------
|
||||
|
||||
static void testRangeInference() {
|
||||
@@ -339,6 +375,7 @@ int main() {
|
||||
testRazorUnionBounds();
|
||||
testScopeSourceModes();
|
||||
testRangedItemScopeRendersTimeBounded();
|
||||
testMultiTrackRangedItemRenderIsNamedForRefusal();
|
||||
testRangeInference();
|
||||
testItemScopeBypassesEverythingButTake();
|
||||
testTrackScopeKeepsSelfBypassesAncestorsAndMaster();
|
||||
|
||||
Reference in New Issue
Block a user