Sorana Flow v1.11.0 — USB DAC Freeze Fix, Signal Path Improvements & Settings Overhaul
Hi everyone,
v1.11.0 is out with a significant round of fixes. I want to be upfront about something first.
---
A Note on Testing
Previous releases relied on a limited set of manual tests. That wasn't good enough, and I apologize if anyone experienced issues that better testing would have caught — particularly the freeze issue some USB DAC users may have encountered.
Starting with this release, I've implemented a full-scope manual testing process: 107 settings controls audited across all 5 tabs, every signal-slot connection verified, and a comprehensive test matrix covering toggle states, persistence, edge cases, and regression checks against the audio pipeline.
I take the quality of this software seriously, and I'm committed to doing better. Thank you for your patience.
---
Beta Testers Wanted
I'm looking for beta testers to help catch issues before they reach public releases. If you're interested:
- Communication: Google Chat (Space) — real-time discussion, bug reports, and feedback
- Beta builds: Distributed via my NAS (private download links)
- Debug tool included: A simple app that records logs automatically — no terminal required
If you'd like to join, DM me or reply here. All experience levels welcome — especially if you use USB DACs, NAS libraries, or Apple Music integration, as those are the areas that benefit most from diverse testing environments.
---
What's New
Critical Fix — USB DAC Freeze
The app's 2-second device polling timer was calling CoreAudio property queries synchronously on the main thread. If a USB DAC was unresponsive (USB flake, firmware hang, power state issue), the query would block indefinitely, freezing the entire UI. This affected users with devices like the Emotiva DC-1 and potentially other USB DACs.
Fix: All device alive-checks and enumeration now run on a background thread. Results are posted back to the UI thread asynchronously. The main thread never blocks on CoreAudio device queries anymore.
Signal Path — SRC vs Upsampling
Previously, when Output Sample Rate was set to a fixed value (e.g., 88.2 kHz) with Upsampling toggled OFF, the signal path incorrectly showed "Upsampling High, Linear Phase." The upsampler was being activated identically for both user-initiated upsampling and forced sample rate conversion, with no way to distinguish the two.
Now the signal path correctly shows "Sample Rate Conversion" with just the rate change (e.g., "44.1 kHz → 88.2 kHz") when it's a forced output rate, and "Upsampling" with quality/filter details only when you've explicitly enabled upsampling.
DSP Settings — No Longer Frozen
When DSP Processing was toggled OFF, all controls below it (Volume Leveling, Crossfeed, Convolution, HRTF, EQ) were completely frozen — you couldn't click anything. This was caused by Qt's setEnabled(false) propagating recursively to all child widgets.
Fix: Replaced with an opacity-based visual dimming (40% opacity). Controls are visually dimmed when DSP is off but remain fully interactive, so you can configure your DSP chain before enabling it.
Settings Cleanup
- Output Sample Rate moved to the Output section (was buried deep in Quality section — some users couldn't find it)
- Format Badges and Album Art toggles in Appearance now actually work
- Apple Music quality selection persists across restarts
- Removed 4 placeholder controls that had no backend implementation
- HRTF/Crossfeed mutual exclusion now uses deferred signals to prevent potential UI cascade
- Settings tab opens faster with cached device capabilities
---
Technical Details for the Curious
The USB DAC fix involved migrating AudioDeviceManager's device polling from synchronous main-thread CoreAudio calls to QtConcurrent background execution with QMetaObject::invokeMethod(Qt::QueuedConnection) for thread-safe result delivery. An atomic re-entrancy guard prevents overlapping poll cycles.
The signal path fix added a forcedByOutputRate flag to UpsamplerProcessor and two new fields (upsamplingEnabled, forcedOutputRate) to the AudioState struct, allowing SignalPathBuilder to distinguish the activation source and label accordingly.
Full post-fix verification: 11-step code audit confirmed all 7 fixes correctly applied, all signal-slot connections intact, and zero modifications to the RT audio processing pipeline.
---
Download:
https://soranaflow.com/downloads
Requirements: macOS 14+ (Sonoma), Apple Silicon (M1+)
Support:
https://ko-fi.com/ruki7423
As always, feedback and bug reports are welcome. I read everything.