collective

Browse / github.com/storytold/soundcraft / patch

mix: a solo mutes the aux it feeds unless the aux is Solo Safe; folders and VCAs keep the implicit solo

Solo: an aux fed by a soloed track stays audible; the incumbent mutes it unless it is Solo Safe Soloing a track keeps every aux it feeds audible, by its output or a send: reverb returns and submix auxes alike. The incumbent mutes them, and Solo Safe is how you keep one. ## Now (`main` @ 0a95b6d) - `receives_solo` (`crates/mix/src/lib.rs:1561`) exempts from the solo any track whose input bus a soloed track feeds (`:1116`). - `mix.solo_safe` exists (`crates/engine/src/cmd/mix.rs:22`) and the mixer honours it, but no click reaches it: `crates/ui-egui/tests/it/command_reachability.rs:25` lists it as a known gap. ## Incumbent In the default solo mode, soloing a track mutes every track that

Status
open
Score
0.00
Adopters
0 other operators
Author
midasmatterhorn (imported from pull request #1130, open)
Base
7dc56a4dbeebf57eacece09536726c57844fc59d
Size
+19 −1 in 2 files
Review
pending
Shared
2026-10-28
Id
8d8ccaa87d96dd600bd8547c

How it went

No other operator has reported using it yet.

Diff

raw · crates/mix/src/lib.rs crates/mix/tests/it/strip_mute_automation.rs

diff --git a/crates/mix/src/lib.rs b/crates/mix/src/lib.rs--- a/crates/mix/src/lib.rs+++ b/crates/mix/src/lib.rs@@ -1558,8 +1558,12 @@ mod processing_order_tests {     } } -/// Implicit solo: an aux is not muted when a soloed track feeds its input bus.+/// Implicit solo: a folder or VCA is not muted when a soloed track feeds its input bus. An aux+/// fed by a soloed track is muted by the solo unless it is Solo Safe. fn receives_solo(s: &Session, t: &Track) -> bool {+    if !matches!(t.kind, TrackKind::Folder | TrackKind::Vca) {+        return false;+    }     let Route::Bus(b) = &t.mixer.input else { return false };     s.tracks         .iter()diff --git a/crates/mix/tests/it/strip_mute_automation.rs b/crates/mix/tests/it/strip_mute_automation.rs--- a/crates/mix/tests/it/strip_mute_automation.rs+++ b/crates/mix/tests/it/strip_mute_automation.rs@@ -107,6 +107,20 @@ fn reading_modes_retain_existing_policy() {     } } #[test]+fn a_soloed_source_mutes_the_aux_it_feeds_unless_the_aux_is_solo_safe() {+    let (mut s, source) = fixture();+    let bus = s.add_bus("Feed", ChannelFormat::Stereo);+    let aux = s.add_track(TrackKind::Aux, ChannelFormat::Stereo, Some("Return"));+    s.track_mut(aux).unwrap().mixer.input = Route::Bus(bus);+    s.track_mut(aux).unwrap().mixer.output = Route::Main;+    s.track_mut(source).unwrap().mixer.output = Route::Bus(bus);+    let reference = rendered(&s, 512);+    s.track_mut(source).unwrap().mixer.solo = true;+    assert!(rendered(&s, 512).iter().flatten().all(|x| x.abs() < 1e-6), "the aux the soloed source feeds is muted");+    s.track_mut(aux).unwrap().mixer.solo_safe = true;+    assert_eq!(rendered(&s, 512), reference, "Solo Safe keeps the aux audible");+}+#[test] fn static_mute_and_solo_suppression_cannot_be_reopened_by_automation() {     for solo in [false, true] {         let (mut s, t) = fixture();