Add audio channel selection (mono/left/right), show device LED count in target editor

Audio capture now produces per-channel FFT spectrum and RMS alongside
the existing mono mix. Each audio color strip source can select which
channel to visualize via a new "Channel" dropdown. This enables stereo
setups with separate left/right segments on the same LED strip.

Also shows the device LED count under the device selector in the target
editor for quick reference.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-23 15:05:15 +03:00
parent 9d593379b8
commit f15ff8fea0
13 changed files with 129 additions and 31 deletions

View File

@@ -78,6 +78,7 @@ class ColorStripSource:
"audio_loopback": None,
"sensitivity": None,
"color_peak": None,
"audio_channel": None,
}
@staticmethod
@@ -165,6 +166,7 @@ class ColorStripSource:
visualization_mode=data.get("visualization_mode") or "spectrum",
audio_device_index=int(data.get("audio_device_index", -1)),
audio_loopback=bool(data.get("audio_loopback", True)),
audio_channel=data.get("audio_channel") or "mono",
sensitivity=float(data.get("sensitivity") or 1.0),
smoothing=float(data.get("smoothing") or 0.3),
palette=data.get("palette") or "rainbow",
@@ -366,6 +368,7 @@ class AudioColorStripSource(ColorStripSource):
visualization_mode: str = "spectrum" # spectrum | beat_pulse | vu_meter
audio_device_index: int = -1 # -1 = default input device
audio_loopback: bool = True # True = WASAPI loopback (system audio)
audio_channel: str = "mono" # mono | left | right
sensitivity: float = 1.0 # gain multiplier (0.15.0)
smoothing: float = 0.3 # temporal smoothing (0.01.0)
palette: str = "rainbow" # named color palette
@@ -379,6 +382,7 @@ class AudioColorStripSource(ColorStripSource):
d["visualization_mode"] = self.visualization_mode
d["audio_device_index"] = self.audio_device_index
d["audio_loopback"] = self.audio_loopback
d["audio_channel"] = self.audio_channel
d["sensitivity"] = self.sensitivity
d["smoothing"] = self.smoothing
d["palette"] = self.palette

View File

@@ -122,6 +122,7 @@ class ColorStripStore:
visualization_mode: str = "spectrum",
audio_device_index: int = -1,
audio_loopback: bool = True,
audio_channel: str = "mono",
sensitivity: float = 1.0,
color_peak: Optional[list] = None,
) -> ColorStripSource:
@@ -215,6 +216,7 @@ class ColorStripStore:
visualization_mode=visualization_mode or "spectrum",
audio_device_index=audio_device_index if audio_device_index is not None else -1,
audio_loopback=bool(audio_loopback),
audio_channel=audio_channel or "mono",
sensitivity=float(sensitivity) if sensitivity else 1.0,
smoothing=float(smoothing) if smoothing else 0.3,
palette=palette or "rainbow",
@@ -292,6 +294,7 @@ class ColorStripStore:
visualization_mode: Optional[str] = None,
audio_device_index: Optional[int] = None,
audio_loopback: Optional[bool] = None,
audio_channel: Optional[str] = None,
sensitivity: Optional[float] = None,
color_peak: Optional[list] = None,
) -> ColorStripSource:
@@ -381,6 +384,8 @@ class ColorStripStore:
source.audio_device_index = audio_device_index
if audio_loopback is not None:
source.audio_loopback = bool(audio_loopback)
if audio_channel is not None:
source.audio_channel = audio_channel
if sensitivity is not None:
source.sensitivity = float(sensitivity)
if smoothing is not None: