# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/). ## [Unreleased] ### Fixed - Play() deadlocks when called before device is open (recursive SwitchDevice → Play) - Audio volume silently zeroed after switching output devices (Init used hardcoded 0.20; SwitchDevice did not restore saved volume) - SwitchDevice not persisted to database across restarts (caller now saves to AppConfig) - Device restore path passes invalid device name "system default" to SDL (now passes "" for default) - Stop() no-op when audio toggled off mid-playback (removed AudioEnabled guard from Stop) - App shows "READY" before audio files finish downloading (state machine now gates READY on download completion via DOWNLOADING_ASSETS state) - Download failure no longer silently allows READY (downloadFailed flag prevents premature READY) ### Known Issues - Active device highlight incorrect when using default device ### Added - Human-readable audio device names (Built-in Speakers, HDMI/TV/Monitor) - Unit tests for mixer package (parseSinks, parseSinkLine, ConvertVolume) - Regression tests for state machine (download gating, failure handling) - Regression tests for mixer (Stop with AudioEnabled=false, SwitchDevice edge cases) ### Changed (Major Refactors) - Mixer package: inject audio backend dependencies for testability - Mixer package: extract wpctl calls behind an interface - SwitchDevice now takes *db.AppConfig to access saved volume - Audio files moved from ~/.local/share/rhemawave/audio to ~/.radiantwave/audio - State machine uses DOWNLOADING_ASSETS state before READY - CI now runs go test before nix build