Add audio visualizer with spectrogram, beat-reactive art, and device selection
- New audio_analyzer service: loopback capture via soundcard + numpy FFT - Real-time spectrogram bars below album art with accent color gradient - Album art and vinyl pulse to bass energy beats - WebSocket subscriber pattern for opt-in audio data streaming - Audio device selection in Settings tab with auto-detect fallback - Optimized FFT pipeline: vectorized cumsum bin grouping, pre-serialized JSON broadcast - Visualizer config: enabled/fps/bins/device in config.yaml - Optional deps: soundcard + numpy (graceful degradation if missing) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -112,6 +112,28 @@ class Settings(BaseSettings):
|
||||
description="Quick links displayed as icons in the header",
|
||||
)
|
||||
|
||||
# Audio visualizer
|
||||
visualizer_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable audio spectrum visualizer (requires soundcard + numpy)",
|
||||
)
|
||||
visualizer_fps: int = Field(
|
||||
default=25,
|
||||
description="Visualizer update rate in frames per second",
|
||||
ge=10,
|
||||
le=60,
|
||||
)
|
||||
visualizer_bins: int = Field(
|
||||
default=32,
|
||||
description="Number of frequency bins for the visualizer",
|
||||
ge=8,
|
||||
le=128,
|
||||
)
|
||||
visualizer_device: Optional[str] = Field(
|
||||
default=None,
|
||||
description="Loopback audio device name for visualizer (None = auto-detect)",
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def load_from_yaml(cls, path: Optional[Path] = None) -> "Settings":
|
||||
"""Load settings from a YAML configuration file."""
|
||||
|
||||
Reference in New Issue
Block a user