Per-peer pan + EQ ("Pan and EQ" tab) — off by default, held for next release
New feature (Ed's jam-mixing request): pan and EQ each peer's signal independently. Engine (zero added latency — per-sample, applied to each peer's isolated block just before the mix): PeerDspChain (balance pan + RBJ biquad EQ) built on the UI thread and swapped onto SessionPlayout via a volatile reference; PlayoutEngine remembers it per address so a reconnecting peer keeps its shaping; AudioReceiver.SetPeerDsp facade. Model: per-profile PeerShaping dict (keyed by peer address) + EnablePan/EnableEqForPeers master switches; machine-wide AppConfig.ShowPanEqTab. Fixed band layouts in PeerEqBands (3-band tone control: bass/mids/treble shelves+bell; 10-band ISO graphic EQ), +/-12 dB. UI: a "Pan and EQ" tab (before Audio profile, shown only when ShowPanEqTab is on) with the two enables, a connected-peer picker, a pan slider (balance, keeps stereo), a "reset EQ" button (clears both modes' bands, leaves pan), a 3/10-band mode picker and its band sliders — all TrackBars (arrow + page-up/down), updating in real time and saved per profile. Sliders set a friendly AccessibleName on change (pan centre/left/right %, band dB). "Show the Pan and EQ tab" checkbox added to Preferences > General. Everything is off by default (tab hidden, both enables off), so this is dormant for all users until switched on. Builds clean. Pending Ed's hands-on testing before release. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
d7f6d9fd9d
commit
1c1bf5a5cb
@@ -68,6 +68,12 @@ public sealed class AppConfig
|
||||
/// already running quietly". Default false.</summary>
|
||||
public bool StartMinimised { get; set; }
|
||||
|
||||
/// <summary>If true, the main window shows a "Pan and EQ" tab (positioned before "Audio profile")
|
||||
/// for setting per-peer panning and EQ. Off by default; toggled by "Show pan and EQ tab" on the
|
||||
/// Preferences General tab. Machine-wide (a UI-visibility preference, like which tabs exist) — the
|
||||
/// pan/EQ VALUES are saved per profile, in <see cref="Profile.PeerShaping"/>.</summary>
|
||||
public bool ShowPanEqTab { get; set; }
|
||||
|
||||
/// <summary>If true (the default), RemSound plays the startup cue once, right after this
|
||||
/// copy wins the single-instance takeover and before the profile loads. Machine-wide (not
|
||||
/// per-<see cref="Profile"/>) because it fires before any profile — and its per-profile
|
||||
|
||||
Reference in New Issue
Block a user