← All guides Technical guide

macOS process taps: per-app volume without a driver

Published September 11, 2026. The figures quoted were measured on a MacBook, internal output at 96 kHz, with Morendo's own files compiled outside the app.

What is a process tap in macOS?

A process tap is a public CoreAudio API, introduced with macOS 14.2, that lets an authorized app capture another process's sound before it reaches the sound card, and cut it off from its direct path. It is what lets Morendo, FineTune or SoundDial set per-app volume without an audio driver, without a system extension and without an administrator password. One permission only: system audio recording.

This guide is for anyone who wants to know what happens under the hood, developer or curious user. We make Morendo; the chain described is its own, the measurements are ours.

Before taps: a driver, or an extension

Until 2023, a per-app mixer on the Mac had one way to hear other apps: take the sound card's place. Background Music, eqMac and Wave Link install a virtual audio device, a HAL plug-in in /Library/Audio/Plug-Ins/HAL, which macOS sees as an output. The user picks that fake device as the system output; the driver receives all the sound, hands it to the app, which plays it back to the real output. SoundSource does the same with a system extension, ACE.

It works, and has for years. The price is paid three times: the administrator password at install, one more device in Sound settings, and a dependency on the system, a plug-in or extension to update with every major macOS release, which can outlive the uninstall.

The API

With macOS 14.2, Apple made public a mechanism that had been internal. Three pieces are enough.

  • The list of processes making sound: kAudioHardwarePropertyProcessObjectList enumerates CoreAudio's process objects, and kAudioProcessPropertyIsRunningOutput says which ones are playing right now.
  • The tap itself: a CATapDescription names one or several processes and a mute behavior. In mutedWhenTapped mode, the tapped process no longer reaches the hardware: it believes it is playing, and the tap receives its sound. AudioHardwareCreateProcessTap creates the object.
  • A private aggregate device: the real outputs are declared as sub-devices and the taps in kAudioAggregateDeviceTapListKey. Taps show up as input streams, outputs as output streams, and a single IOProc receives both on every cycle.

The API has been available since 14.2 and reliable from 14.4. Morendo targets macOS 15, for reasons unrelated to taps.

The chain inside Morendo, from the app to the speaker

Morendo enumerates the apps that play and groups their helper processes under the app that owns them: a browser's tabs or an Electron app's helpers make a single row. An app left at 100% with no equalizer is not tapped: it goes through the normal macOS path, as if Morendo did not exist.

As soon as a bus is adjusted, every app in that bus gets a tap in muted mode. All taps and all outputs in use live in a single private aggregate. On every cycle, around ten milliseconds, CoreAudio hands the IOProc the tap samples and an empty output buffer. The render multiplies by the bus gain, applies the bus equalizer's stages, accumulates into the channels of the target output or outputs, then soft-limits. One tap can carry several routes: that is what sends the same bus to the headset and the speakers, each at its own level.

The IOProc decides nothing. Everything is computed upstream, on the main thread, and dropped into a structure in unmanaged memory: no allocation, no lock, no reference counting on the real-time thread, or you get a click. Moving a fader writes a number into an array the render reads on the next cycle. Only a real topology change, an app starting, an output switched, rebuilds the aggregate, because that is costly and audible. When a bus returns to neutral, its tap is released a few seconds later, and the app takes its direct path again.

What the user sees

A single permission prompt, at first launch: system audio recording. No new device in Sound settings; the keyboard volume keys still drive the real output, and an output's slider inside Morendo is that same system volume. And one detail worth knowing: the orange recording indicator stays on while an app is tapped. macOS files a tap under system audio capture and flags it as such; it is structural, and at rest, with no tap, it goes out.

Latency, measured

A tap adds a trip through a buffer. Here is where the delay comes from, measured on a MacBook, internal output at 96 kHz, buffer at 512 frames.

SourceFramesTimeAdjustable
Device buffer5125.33 msYes, 32 to 1024
Driver safety offset1481.54 msNo
Hardware latency1401.46 msNo
Aggregate device00.00 msMeasured, to the frame
Total8008.33 ms

Measured on August 13, 2026. On another machine the first three rows change; the fourth stays at zero.

The buffer is the only lever: going down to 64 frames saves about 4.7 ms, more than half the total, and the setting is exposed in the console menu. The default stays "Automatic", because the risk is not the render code but the system's scheduling jitter, which depends on the machine and its load. The render itself is light: eight tapped apps with a four-stage equalizer take about 2% of CoreAudio's real-time budget, and that share does not grow when the buffer shrinks. What actually costs is multi-output: two hardware clocks drift apart, and CoreAudio adds buffering to keep them in sync. Morendo shows the measured delay in its console, because a number beats a promise.

The limits

  • A tap sees a process, not a tab: the Discord tab and the YouTube tab of the same browser share one setting.
  • The microphone is out of scope. A tap captures what an app plays, not what it records.
  • It needs macOS 14.4 at minimum, 15 for Morendo and FineTune. A Mac stuck on Ventura stays in the world of drivers.
  • No virtual device, so nothing OBS can capture as a separate mix. For a streamer with a mic chain, that is Wave Link 3, with its driver.

Why it beats a driver, without gloating

No administrator password, no ghost device, an uninstall that amounts to deleting the app, and a dependency on a public API rather than on a plug-in to recompile for every macOS. In exchange, a more recent floor, an indicator that lights up, and a model that cannot manufacture a virtual output. For adjusting the volume of what you listen to, the math is quickly done; for producing a stream, it is not yet.

Frequently asked questions

Does a process tap record my sound?

No. The tap is a relay inside CoreAudio's real-time chain: samples come in, get multiplied by a gain, possibly filtered, then written into the output buffer of the same cycle. Nothing is stored. Morendo processes sound in memory, never records it and never sends it anywhere.

Why does the orange indicator light up when Morendo adjusts an app?

Because macOS files a process tap under system audio capture and announces it as a recording, with the same indicator as a microphone. It is structural, Apple's choice, and cannot be turned off. It stays on while an app is tapped; at rest, with no tap, it goes out.

Which version of macOS do I need?

The API appeared with macOS 14.2 and becomes reliable from 14.4. Morendo requires macOS 15, like FineTune; SoundDial and Submix accept 14.2. On an older Mac, the driver-based tools remain, Background Music or eqMac.

Why does Morendo display the latency?

Because it exists, and it can be measured: the buffer size, the driver's safety offset and the hardware latency, read from your actual setup. The total sits between 5 and 15 ms depending on the machine and the buffer setting. An app left at 100% with no equalizer is not tapped and takes none.

Download Morendo, 14-day trial See the comparison

Related guides: FineTune vs Morendo · A per-app equalizer without a driver · Background Music alternative