Ψ-W1-T2: disjoint per-mode solo surfaces and a playback-gated mode switch
Solo is cached, cleared and replayed per mode on a real switch only; the switch is refused visibly while the transport runs. The footer segment now routes through the activate actions, so a panel switch finally persists.
This commit is contained in:
@@ -11,11 +11,21 @@ decide membership or mode rules.
|
||||
|
||||
## Invariants
|
||||
|
||||
- **Never touches master or `B_MUTE`/`I_SOLO`.** The tool owns only visibility,
|
||||
`B_MAINSEND`, `I_FXEN`, and per-FX offline, on every managed leaf, tagged or
|
||||
untagged. User mute/solo survives every toggle untouched; the master track's
|
||||
visibility flags are never driven (the SDK forbids `B_SHOWINTCP`/`B_SHOWINMIXER`
|
||||
on master).
|
||||
- **Never touches master or `B_MUTE`; never LOSES solo.** The tool owns visibility,
|
||||
`B_MAINSEND`, `I_FXEN`, per-FX offline, and — on a real mode switch only —
|
||||
`I_SOLO`, on every managed leaf, tagged or untagged. `B_MUTE` is untouched
|
||||
absolutely. The master track is untouched absolutely: it is outside `GetTrack`'s
|
||||
index space, so it never enters the enumeration any of these writes iterate, and
|
||||
its visibility flags are never driven (the SDK forbids
|
||||
`B_SHOWINTCP`/`B_SHOWINMIXER` on master).
|
||||
- **Solo surfaces are disjoint per mode, cached not destroyed.** A real switch
|
||||
(target != active) reads every live track's raw `I_SOLO`, banks the non-zero
|
||||
values against the OUTGOING mode, clears them, and replays the incoming mode's
|
||||
banked values verbatim — solo-in-place and safe-solo variants included, never
|
||||
collapsed to a boolean. This is the same snapshot sense of non-destructive that
|
||||
park/restore already gives visibility and FX state: the user's solo is never
|
||||
lost, only parked with the mode it belongs to. A REAPPLY (target == active —
|
||||
tag/untag/show-both, project load) touches solo not at all.
|
||||
- **Parking a track** (inactive-mode leaf) drives `B_SHOWINTCP=0`, `B_SHOWINMIXER=0`
|
||||
(hide both panels), `B_MAINSEND=0` (out of mix), `I_FXEN=0` (FX bypassed), and
|
||||
`TrackFX_SetOffline(track, fx, true)` for each FX (reclaim CPU) — full CPU-park,
|
||||
@@ -72,7 +82,8 @@ applies the resulting lane state to live tracks.
|
||||
|
||||
## Modules
|
||||
|
||||
- `view` — Design View shell: snapshots flag values before parking, drives hide + CPU-park on inactive-mode leaves (`B_SHOWINTCP`/`B_SHOWINMIXER`/`B_MAINSEND`/`I_FXEN` + per-FX offline), restores from snapshot. **Never touches master or `B_MUTE`/`I_SOLO`.**
|
||||
- `view` — Design View shell: snapshots flag values before parking, drives hide + CPU-park on inactive-mode leaves (`B_SHOWINTCP`/`B_SHOWINMIXER`/`B_MAINSEND`/`I_FXEN` + per-FX offline), restores from snapshot. Owns the one discriminator (`target != active`) that separates a real switch from a reapply, and with it both the playback gate (`transportBlocksModeSwitch`) and the solo cache/clear/restore seams. **Never touches master or `B_MUTE`.**
|
||||
- `view_solo` — the `I_SOLO` read/write pair behind the per-mode solo surface. Holds no policy: what to cache, clear, or replay is `core/view/solo_cache`.
|
||||
|
||||
## Gotchas
|
||||
|
||||
|
||||
Reference in New Issue
Block a user