🛡️ Audio Engine Hardening
This release is a comprehensive reliability overhaul of FineTune's audio engine — no new features, just a significantly more robust experience under the hood.
🔇 Crash Recovery
- Orphaned device cleanup — If FineTune crashes or is force-quit, aggregate devices are now cleaned up automatically on next launch, preventing the "apps go silent" issue
- Signal-safe crash guard — Aggregate devices are destroyed during crashes before the process exits, reducing orphaned devices in the first place
🎚️ EQ & Audio Quality
- Soft limiter — Post-EQ clipping prevention catches digital distortion when bands are boosted aggressively
- Preamp attenuation — Signal is reduced before EQ processing proportional to max boost, preventing internal clipping
- Nyquist guard — EQ bands near or above the Nyquist frequency (e.g. 16kHz at 32kHz sample rate) now pass through cleanly instead of producing robotic artifacts
- High sample rate support — Fixed unstable biquad filters on 96kHz+ devices
🎙️ Bluetooth & Voice Apps
- Bluetooth HFP distortion — Fixed audio distortion when using Bluetooth headphones with voice apps like FaceTime, Discord, and Zoom
- Extended Bluetooth warmup — Bluetooth device switches now use a 300ms warmup (vs 50ms wired) to account for firmware handshake latency
- Rapid reconnect handling — Fixed race conditions during rapid Bluetooth connect/disconnect cycles
🔄 Device Switching
- Crossfade state machine — Device switches use a proper RT-safe state machine, eliminating race conditions that could cause glitches
- Correct teardown order — Tap lifecycle management enforces Stop → DestroyIOProc → DestroyAggregate → DestroyTap ordering, preventing resource leaks
- Re-entrant switch guard — Rapidly switching devices no longer causes resource leaks from overlapping crossfades
🔊 Volume Control
- Fallback chain — Volume reading now tries VirtualMainVolume → VolumeScalar → channel 1, supporting more diverse hardware
- Correct API usage — VirtualMainVolume queries now use AudioHardwareService APIs (matches system volume slider behavior)
🐛 Bug Fixes
- DDC monitor leak — Fixed io_service_t resource leak and observer cleanup race in DDC controller
- Monitor deinit — Added proper observer cleanup on deallocation for DDC, audio device, and process monitors
- Volume listener lifecycle — Overhauled DeviceVolumeMonitor to properly register and unregister HAL listeners
- Mono device check — Fixed off-by-one in stream readiness check for mono output devices
- Escape to dismiss — Press Escape to close the menu bar popup (with smooth animation)
- Percentage width — Fixed UI jitter in the percentage display field
What's Changed
- Fix percentage width UI glitch by using fixed width instead of minWidth by @fcsonline in #94
- feat(ui): add Escape key to dismiss menu bar popup by @AbdulEmad in #97
New Contributors
- @fcsonline made their first contribution in #94
- @AbdulEmad made their first contribution in #97
Full Changelog: v1.3.1...v1.3.2