cbba4b644eb91a6aa17d64ffe41516f2e6caf3b8
Let a listener apply a noise gate to an individual peer's incoming audio — "fix this person's noisy mic / background hum on my end" — which is only possible because full-mesh P2P keeps every peer's stream unmixed locally (server-mixed apps can't do per-listener per-peer DSP). The DSP is the existing mic NoiseGate reused verbatim: it already processes i16 frames at a fixed rate with hysteresis/attack/release/ hangover and takes the threshold per-frame. Wiring mirrors per-peer EQ: - AppConfig.peer_gate map (threshold per peer id; absent/0 = off), persisted, never sent over the wire - CoreCommand::SetPeerGate + Arc<Mutex<HashMap>> shared into the mixer - a live HashMap<EndpointId, NoiseGate> in the mixer task, created lazily and dropped when disabled (no rebuild needed — threshold is passed per frame) - Gate row (threshold slider, "Off" at zero) in each participant card next to Vol/Pan/EQ, persisting on release The gate runs on the raw decoded frame: after the clean multitrack stem tap (recordings stay ungated) but before volume/EQ, so the threshold tracks the peer's true signal level regardless of our volume setting. Same 0..METER_MAX scale as the mic gate. +2 unit tests (config helper); +1 config back-compat assertion. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>