What's Changed
- Omit artwork role in low memory mode by @chrisuthe in #100
- Minimize ImageLoader caches in low memory mode by @chrisuthe in #102
- Cap audio chunk queue capacity in low memory mode by @chrisuthe in #103
- Auto-detect low memory devices for default setting by @chrisuthe in #104
- Constrain audio to 16-bit PCM in low memory mode by @chrisuthe in #101
- Fix stream format guard to allow pipeline reconfiguration on format change by @chrisuthe in #106
- fix: prevent audioDecoder TOCTOU race in onAudioChunk by @chrisuthe in #107
- fix: always dispatch stream/start to clear stale audio on skip by @chrisuthe in #108
- feat: auto-start on boot for background-only operation by @chrisuthe in #109
- fix: run audio write loop at URGENT_AUDIO priority (#116) by @chrisuthe in #118
- fix: resilient reconnection (zombie WiFi / server restart / idle connections) by @chrisuthe in #119
- diag: instrument command path + close enterIdle streamGeneration gap (#114) by @chrisuthe in #120
- fix: send WebSocket pings on OkHttp engine (#105) by @chrisuthe in #121
- fix: AAAA-only hostname / IPv6 connection support (#115) by @chrisuthe in #122
- fix: simplify codec preference to one user-chosen setting (#26) by @chrisuthe in #123
- fix: auto-reselect connection mode on network-type change (hotfix for drive-time blackout) by @chrisuthe in #124
- feat(logging): on-device logging redesign with AppLog facade + logcat bridge by @chrisuthe in #125
- feat: idle stall watchdog + LOCAL->PROXY fallback (#126, #127) by @chrisuthe in #133
- feat: surface Reconnecting state on MediaSession (#132) by @chrisuthe in #134
- fix: make PlaybackService.lastNetworkId @volatile by @chrisuthe in #135
- feat: handle same-network link-property changes (#130) by @chrisuthe in #136
- refactor: align onClosed and onFailure reconnect gates (#129) by @chrisuthe in #137
- feat: expose connection-health telemetry + [disconnect] logs (#128) by @chrisuthe in #138
- docs: align CLAUDE.md with shipped architecture by @chrisuthe in #139
- refactor: harden SyncAudioPlayer concurrency (drain-pattern, latch, fast-path) by @chrisuthe in #140
- fix: close watchdog race and stale authToken across mode changes by @chrisuthe in #141
- refactor: move decoder ownership to a single-thread executor by @chrisuthe in #142
- chore: prune vestigial SendSpinServer code path by @chrisuthe in #143
- refactor: split SendSpinClient scope into timer + work (M-4) by @chrisuthe in #145
- fix: wizard crash when two servers share a friendly name by @chrisuthe in #146
- feat: auto-measure static_delay_ms for multi-room sync (H-2 + L-3) by @chrisuthe in #144
- revert: PR #142 (decode executor) — FLAC playback regression by @chrisuthe in #148
- fix: resolve MA player id server-authoritatively (groups/players sheet) by @chrisuthe in #149
- docs: SendSpin + MA metadata and artwork flow reference by @chrisuthe in #150
- feat(ma): fast track-change metadata via queue_updated by @chrisuthe in #151
- fix(artwork): prefer URL over binary + per-track invalidation by @chrisuthe in #152
- fix: tick latency estimator during WAITING_FOR_START to unblock playback by @chrisuthe in #153
- feat: audio integration harness, stuck-state watchdog, JsonNull parse fix by @chrisuthe in #154
- fix: bound reconnect retries + default unknown errors to unrecoverable (L-5) by @chrisuthe in #155
- fix: codec-safe decoder redesign (H-4 + M-8, second attempt) by @chrisuthe in #156
- fix: throttle DAC-aware alignment-wait log spam by @chrisuthe in #157
Full Changelog: v2.0.0-Beta7...v2.0.0-Beta8