Mimir/docs/program-control-surface.md

42 lines
1.9 KiB
Markdown
Raw Normal View History

2026-05-29 23:53:04 +01:00
# Program Control Surface
Mimir now exposes a compact Fensalir-hosted program panel for final presentation
intent.
Authority map:
- Owner: `MimirPresentationControlState` owns operator intent for program video,
audio mix, and global color preset.
- Inputs: runtime rolling buffers, aligned audio lanes, LUT preset selection,
feed visibility, feed opacity, stem mute/solo, and stem gain.
- Outputs: filtered video surface intents, Faust/native DSP gain controls,
sample gain applied before Fensalir streaming DSP, and a postprocess control
snapshot.
- Derived state: feed lists are derived from active rolling buffers. LUT preset
exposure and bloom are currently mapped into `GraphicsSettings`.
- Forbidden writers: OBS, bridge endpoints, debug readouts, and network arrival
timestamps must not choose program composition.
- Shared paths: local cameras, Raven display capture, and future network video
feeds all enter rolling buffers first, then the presentation state decides
whether they contribute to production surface intent.
- Deletion line: direct compositor shortcuts outside Fensalir FieldEvidence and
audio DSP are diagnostic only.
The current UI lives in the `Mimir Program` panel:
- `Video`: select feed, visible, solo, opacity, layer ordering.
- `Audio`: select stem/source, mute, solo, gain.
- `Color`: LUT preset and LUT strength.
The shader-side LUT path is explicit state, not finished renderer authority yet.
`MimirLookupTablePreset` carries `LutPath`, strength, contrast, saturation,
temperature, and tint so Fensalir can consume the same contract when the global
post shader grows real LUT sampling. Until that renderer cut lands, Mimir maps
the preset exposure and bloom values into existing Fensalir `GraphicsSettings`.
Smoke proof:
```powershell
dotnet run --project .\src\Mimir.BufferSmoke\Mimir.BufferSmoke.csproj -- --presentation-control-smoke
```