Submix notes

A Multi-Output Device is not per app audio routing. Here is what actually sends one app to your headphones

A Multi-Output Device sends the same audio to every output at once. Sending different audio to different destinations, like music to speakers and a call to AirPods, needs a per-app audio tap instead, the API macOS added in version 14.2.

On this page

The answer you will find most often for this question describes a Multi-Output Device, and a Multi-Output Device does not do what you are asking for. It sends one identical audio stream to every output in the group at the same instant, which is duplication, not routing: it cannot send Spotify to your desk speakers while a Zoom call goes to your AirPods, because those are two separate streams, not one stream copied to two places. What actually does that is a per-app audio tap, an API macOS added in version 14.2, and Submix is built directly on top of it.

Nothing here is a benchmark. This post contains no measurements: where a number appears, it comes from Submix's own source, from Apple's own documentation, or from the app's shipped feature catalog, and it says which every time. Submix requires macOS 14.2 on Apple silicon and updates through Sparkle 2.9.2, pinned by version and checksum. Facts about Apple's platform were checked on 23 July 2026.

Why the usual answer does not work

What Audio MIDI Setup actually builds

Open Audio MIDI Setup, select two or more real output devices, and choose Create Multi-Output Device, and macOS folds them into a single virtual device with its own UID. Every app that plays audio picks one output, the one set in System Settings > Sound > Output, unless it explicitly asks for a different device. Widen that default to a Multi-Output Device and you have not separated anything. You have made the default wider. Sound headed to "the system output" now reaches both real devices, still as one identical feed, still without any idea which app it came from.

That is the whole tool. It joins hardware devices at the driver level and has no concept of an app or a process, so it cannot know you wanted Spotify on one branch and Zoom on the other. There is no per-app switch hiding in the interface. There never was one.

Simultaneous output and per app routing are not the same job

The distinction is architectural, not cosmetic. A Multi-Output Device joins sinks on Core Audio's hardware abstraction layer, below the point where individual apps exist at all. A per-app tap attaches above that layer, to one specific running process by its process id. Two different APIs, two different problems, and no amount of clever device naming turns one into the other.

Submix takes the second path. It calls AudioHardwareCreateProcessTap with a CATapDescription scoped to one app's process id, marks the tap private, then builds a fresh private aggregate device around it. One app gets one tap and one aggregate. That aggregate can target one selected output or an ordered set of outputs. More than one selected output duplicates that app's processed stream to those devices; it does not split one app's stream into different destinations. Repeat the process for a second app with its own route and that is real per-app routing, built from parts never meant to touch by default.

Pick your setup

The mechanism is the same every time. What changes is which two rows in the mixer you touch.

Music on speakers, meeting on AirPods

Find your music app's row and point it at your desk speakers, then find your meeting app's row and point it at your AirPods. Each gets its own private aggregate device, so the two outputs do not fight over macOS's single system default the way they would if whichever app grabbed it last got to decide for you.

Game audio to a headset, voice chat to speakers

Same idea, reversed: point the game at your headset and the voice chat app at your desk speakers, or swap them if your ears prefer it that way. Because each tap is scoped to a process id rather than to "the current default," changing your system output for something unrelated later will not drag either of these along with it.

When the routing has to be reproducible

For a paid profile, Submix records the app's volume, mute state, desired route, and equalizer settings in its profile file, then loads that profile when the app starts again. A remembered route keeps its ordered device selection even when a device is absent at launch: Submix temporarily falls back to an available output and keeps the original selection for a later reconnect. Treat the equalizer setting as saved intent, not a promise about the audio hardware, and check your own devices after applying any profile.

One app can go silent without touching the rest

Muting a single row does not tear the tap down. The gain box that feeds the realtime callback returns zero when a channel is muted, the audio thread reads that value without locking, and the samples still flow through the aggregate, just multiplied by nothing. Unmute it and sound resumes instantly, because the plumbing was never disconnected in the first place. Nothing else in the mixer moves.

The steps

  1. Open Submix from the menu bar and let it list the apps currently producing audio. A row only appears once Core Audio reports that app as actively outputting sound, so a silent app you have not pressed play on yet will not show up.
  2. The first time any tap is created, macOS shows a permission prompt for audio capture, worded exactly: "Submix reads app audio so you can set each app's volume independently. Nothing is recorded, saved, or sent." Approve it once and it covers every app you route afterward.
  3. Pick the app you want to move and use its output picker to choose a destination device.
  4. Repeat for the second app, choosing a different destination.
  5. Adjust volume or mute per row as needed. None of this touches any other app's channel.
  6. If something goes wrong, the recovery section below gets you back to normal, with caveats worth reading rather than assuming away.

Where this breaks, and how to fix it

The recording indicator has no off switch

Apple documents a green light beside the camera that glows while the camera is on, and says it turns off only once every app and feature that can use it has closed (Apple Support, macOS user guide, checked 23 July 2026). The same design applies to audio capture. Any live TCC grant gets its own onscreen sign for as long as it is active, and no app, Submix included, has an API to hide it or shorten it. How Submix asks for that permission in the first place, without a driver or an admin password, is covered separately. If you see an indicator while Submix is routing something, that is the system telling the truth, not a bug in the app.

Protected streams no tap can see

The process tap API is scoped on purpose. Audio flowing through a protected content path, the kind used for purchased or rented media, is not something any tap is permitted to see, regardless of who wrote it. An app that plays protected media and shows no channel at all in Submix is not a bug. That is the API refusing on principle.

Some apps take exclusive control of the device

Core Audio devices support an exclusive access mode that pro audio interfaces and recording software sometimes request, and while a device is held that way, no other process can attach to it, taps and aggregates included, with no override from outside the app holding it. Quit or release that session first, and Submix can route to the device again.

Getting your audio back in one click

Restore-audio is not a feature flag that can be switched off. It is declared with a safety access class that clears before Submix even checks a license, so it works whether or not you have paid. Losing access to the paid features restores every channel to the system output and clamps any boosted volume back to normal before the rest of the app locks, in that order, on purpose.

Two buttons in the mixer are less absolute than they look, though. Everything to speakers clears per-app routing back to the system output but does not stop the underlying taps or reset volumes. Reset all puts every row back to a plain, unmuted level, but the taps keep running. The full teardown, the one that removes every tap and aggregate, happens on quit, on a permission revocation, or on losing product access, not from either convenience button. Restore itself is best effort, not guaranteed: a failing Core Audio teardown call leaves Submix retrying every two seconds and naming the step that is stuck, rather than pretending the problem solved itself.

If you do not need routing at all

Audio MIDI Setup already sends the same audio to two places at once, for free, with nothing to install, when that is genuinely all you need rather than two apps split across two destinations. It is the right tool for that narrower job. Per-app separation is a different question, and no system setting answers it: four real ways to get per app volume on a Mac cover what does. System Settings has exactly one output picker, global by design, not by oversight.

Questions people ask

Can I send Spotify to my desk speakers and a Zoom call to my AirPods at the same time? Yes. Give each app its own row and its own output device, and they stop sharing macOS's single system default.

Why does my Mac show a recording indicator while this is running? Because Submix is holding a live audio capture grant, and macOS marks that on screen for as long as it lasts, the same way it marks an active camera. No app can turn that off.

Does this add lag to my audio? Routing an app through a tap and a private aggregate is one more callback in the path than playing straight to a device, so the cost is not literally zero. I have not measured a figure for it, and a number I made up would tell you less than this sentence does.

Will this work with a USB audio interface or a DAC? Yes, as long as nothing else is holding that device in an exclusive access mode. If another app has claimed it that way, release it there first.

What happens if I quit the app mid call? A normal quit is intercepted on purpose: Submix delays its own termination long enough to un-route every channel and tear every tap and aggregate down on the main thread first, and if one of those Core Audio calls fails partway through, it keeps retrying the whole sequence every 2 seconds until every channel reports itself restored. That only covers a normal quit. If the process is killed outright, an abrupt termination the app has no way to intercept, none of that code runs, and cleanup falls entirely to Core Audio, which releases a dead process's own taps and aggregates on its own.

Do I have to install a driver? No. There is no audio server plug-in, kernel extension, or system extension anywhere in Submix. Every operation is a plain HAL call made from the app itself, and quitting it removes exactly what it created and nothing more.

Try it on the two apps fighting over your speakers right now.

Submix handles the tap and the aggregate device for you; more on how it works lives on the Submix blog.

Back to Submix