Back to blog
Dev Log4 min read

The Support Email That Made Me Rewrite Soundish's Audio Engine

A user's USB audio interface went silent, and the fix turned into a full engine rewrite. What broke, why patching wasn't enough, and why Electron apps were the hardest part.

Appish·

It started with one email

A Soundish user wrote in: their external USB audio interface wasn't working properly. Audio routed to it just… didn't arrive. No error, no crash — silence.

The culprit turned out to be sample rates. Plenty of USB interfaces run at 44.1 kHz, and Soundish's original engine didn't handle the mismatch gracefully. Everything worked fine on the built-in output and most consumer devices, which is exactly why I'd never hit it myself. The person with the audio interface on their desk found it in a day.

That's the reality of building audio software as a one-man team: your test lab is your own desk. Everything beyond it, your users find first.

Why I rewrote it instead of patching it

The honest answer: I can't test every audio app on the Mac. Nobody can.

The old engine had accumulated app-by-app fixes — this app reports audio this way, that one needs special handling. Every fix was whack-a-mole, and every new app someone tried was a fresh chance to be wrong. Patching the sample-rate bug would have fixed one interface for one user and left the underlying pattern intact: an engine that needed to know things about individual apps to behave.

So version 1.3 became a rewrite. The goal wasn't this bug — it was reliability across the board. Handle audio generically, so an app I've never heard of behaves like one I test every day.

Electron apps fought back the hardest

The hardest part of making per-app audio truly universal is that some apps don't look like one app.

Electron apps — Slack, Discord, and everything else built on Chromium — split themselves across helper processes, and the process actually producing sound is often not the one with the name and the icon. Reverse-engineering how those apps emit audio, and reliably attributing a stream back to "Slack" rather than to an anonymous helper, took longer than any other single part of the rewrite. If you've ever wondered why some volume utilities show you three mystery processes instead of the app you're looking for — that's why.

Getting that attribution right is what makes the simple promise work: every app that makes sound shows up in Soundish, by name, with its own slider.

Weeks of unglamorous work

The rewrite itself wasn't a weekend job. It took weeks of all-day work — and the bulk of it wasn't writing new code, it was verifying: real apps, real devices, real sample rates, over and over, until the results stopped surprising me.

Full honesty: I didn't write every line of the new engine alone — a good chunk of the DSP internals were pair-programmed with an AI coding tool. The parts no tool could do were the parts that took the weeks: knowing something was wrong, deciding what "correct" sounds like on real hardware, and doing the testing that turns "it compiles" into "it ships." The code got written fast. Trusting it was the work.

What shipped in 1.3, all of it downstream of that verification loop:

  • Audio interfaces at 44.1 kHz work — no more silent routing
  • Glitch-free playback under load
  • Volume boost past 100% without distortion
  • Output devices remembered correctly across restarts
  • "Now playing" indicators that actually reflect reality
  • Cleaner shutdown — app audio restores instantly when Soundish quits

The part I care about

Soundish is a one-time purchase, so this rewrite shipped to every existing customer as a free update — the person who reported the USB interface bug included. That's the deal I want with the people who buy my software: you found the problem, you get the fix, forever, no subscription meter running while you wait.

If you've got an audio setup that misbehaves — an interface, a DAC, an app that won't show up in anything — the 7-day trial is the fastest way to find out if 1.3 handles it. And if it doesn't: email me. That's apparently how the good versions get built.

indie devCore AudioSoundishbehind the scenes