Halo — Fix macOS Volume Control for Multi-Output Devices (Free)

Halo — Fix macOS Volume Control for Multi-Output Devices (Free)

Halo — Fix macOS Volume Control for Multi-Output Devices (Free)

If you’ve ever tried to play sound out of two speakers at once on a Mac — two Apple Studio Displays, studio monitors + headphones, a pair of AirPods and your MacBook speakers — you ran into the same wall most of us do: create a Multi-Output Device in Audio MIDI Setup, set it as your output, press F11 or F12, and watch the macOS volume slider go grey and refuse to move.

You’re not doing it wrong. macOS deliberately disables keyboard volume keys and the menu-bar slider when a Multi-Output Device is the default output. Apple treats aggregate devices as unitless — they have no master volume to control. The only “fix” Apple documents is manually opening Audio MIDI Setup and dragging a slider on each sub-device individually, every time. Not fun.

Halo is a free, open-source menu-bar utility that fixes this. It’s a personal fork of the older MultiSoundChanger (Apache 2.0), modernised for macOS Sequoia and beyond.

Download Halo for macOS (Universal, 1.3 MB)

Universal binary — runs native on Apple Silicon and Intel Macs. Requires macOS 13 (Ventura) or later.

Why Volume Keys Stop Working on a macOS Multi-Output Device

Apple’s CoreAudio exposes two kinds of audio devices: real hardware devices (each with its own volume scalar) and aggregate devices (virtual wrappers that route one audio stream to multiple sub-devices). A Multi-Output Device is an aggregate with “stacked” semantics — replicate the same audio to each sub-device.

Aggregate devices have no volume of their own. When macOS’s volume-key handler receives F11, it tries to write the system default device’s kAudioDevicePropertyVolumeScalar and fails silently on aggregates. The pill UI goes grey. That’s the limitation users hit when they Google:

  • “mac volume keys not working multi-output”
  • “control volume two Studio Displays”
  • “multi-output device volume grey”
  • “Apple Studio Display volume control keyboard”
  • “combine speakers Mac keyboard volume”

Every forum thread lands at the same place: macOS doesn’t support it, and your choices are a paid tool (SoundSource by Rogue Amoeba, ~US $47) or a free workaround.

How Halo Restores Keyboard Volume Control

Halo intercepts F11 / F12 / F10 (mute) system-wide via CoreGraphics event taps, then writes the new volume to each sub-device of the aggregate individually. The physical speakers change volume together even though macOS’s native control thinks they can’t.

Halo menu-bar dropdown on macOS showing Volume slider, Output Device list with Halo Speakers selected and both Studio Display XDR Speakers listed, and action items including Create Halo Speakers, Launch at Login, Sound Preferences and Audio Devices

Halo’s menu — output device picker, one-click Halo Speakers aggregate, Launch at Login toggle.

Halo's custom volume HUD showing a dark rounded panel with speaker icon and progress bar overlayed on a macOS desktop with a lifeboat station wallpaper

The custom HUD that appears on F11/F12 or scroll-wheel — replaces Apple’s broken OSDManager on macOS Sequoia+.

Alongside the core fix, Halo picks up a few quality-of-life improvements over the stock MultiSoundChanger:

  • Custom in-app volume HUD — Apple’s private OSDManager API (the classic chiclets bar) stopped rendering reliably on macOS Sequoia, so Halo draws its own dark rounded panel with speaker icon and progress bar.
  • Finer 32-step volume — each F11/F12 tap is ~3% instead of the OS default ~6%. Enough granularity to dial in a comfortable level.
  • Scroll-wheel on the menu-bar icon — hover over Halo in the menu bar and scroll to change volume. No reaching for keys.
  • One-click aggregate creation for Apple Studio Displays (menu → “Create Halo Speakers”). Skips the Audio MIDI Setup setup dance entirely.
  • Volume persistence — each sub-device’s level is saved on change and restored at launch, so a cold boot doesn’t slam you with 0% or 100%.
  • Launch at Login toggle, powered by SMAppService.
  • Universal binary (arm64 + x86_64) signed with a stable code-signing identity so macOS Accessibility grants persist across updates.

Features at a Glance

Native macOSHalo
Volume keys on Multi-Output Device
Scroll-wheel volume on menu bar
Custom volume HUD (modern macOS)❌ (broken)
Auto-create aggregate for Studio Displays
Volume persistence across reboots⚠️ unreliable
Launch at Login
Free
Signed by Apple❌ (self-signed, see limitations)

Download

Download Halo.zip (Universal, ~1.3 MB)

Universal binary — Apple Silicon and Intel. macOS 13 (Ventura) or later.

Installation Guide

1. Install the App

Unzip Halo.zip and drag Halo.app to /Applications. Because Halo isn’t signed with an Apple Developer ID, first launch triggers a Gatekeeper warning. Two ways to get past it:

Option A — one terminal command:

xattr -dr com.apple.quarantine /Applications/Halo.app && open /Applications/Halo.app

Option B — Finder:

Right-click Halo.appOpenOpen. After one successful launch, macOS remembers and doesn’t warn again.

2. Grant Accessibility Permission

Halo needs Accessibility access to intercept F11/F12 keys globally. On first launch, macOS will prompt you — click Open System Settings and toggle Halo on.

If no prompt appears, press F11 once. The prompt will fire.

After toggling the switch on, quit Halo and relaunch so the permission takes effect:

pkill -x Halo && open /Applications/Halo.app

3. Set Up Your Multi-Output Device

If you already have a Multi-Output Device in Audio MIDI Setup, Halo picks it up automatically — skip to step 4.

If you have two Apple Studio Displays and no aggregate yet, click Halo’s menu-bar icon → Create Halo Speakers. One click, done.

For any other combination of outputs (AirPods + MacBook speakers, studio monitors, etc.):

  1. Open Audio MIDI Setup (/System/Applications/Utilities/)
  2. Click +Create Multi-Output Device
  3. Tick the devices you want
  4. Right-click the new device → Use This Device for Sound Output

4. Use It

  • Click Halo’s menu icon and pick your Multi-Output Device from the list.
  • Press F11 / F12 to adjust volume, F10 to mute.
  • Or scroll up/down on your trackpad while hovering near Halo’s icon.
  • Optional: toggle Launch at Login from Halo’s menu.

Credits — Built on MultiSoundChanger

Halo is a personal fork of MultiSoundChanger by Dmitry Medyuho, released under the Apache License 2.0. Dmitry worked out the original CoreAudio incantations for writing to sub-device volumes — the hardest part of the problem. Without his project, this one wouldn’t exist.

The F11/F12 interception uses MediaKeyTap by Nicholas Hurden (MIT), maintained downstream by the0neyouseek.

Additions in this fork:

  • Custom VolumeHUDWindow to replace Apple’s broken private OSDManager.
  • Modern-macOS compatibility fixes (universal binary, deployment-target bump, Sequoia storyboard module resolution).
  • The “Create Halo Speakers” one-click aggregate action.
  • Per-device volume persistence.
  • Launch-at-Login via SMAppService.
  • Self-signed cert workflow so TCC Accessibility grants stay stable across rebuilds.
  • New rebrand/icon and a one-command build script.

Limitations You Should Know

Listed openly so you can decide whether Halo is right for you.

  • No Apple Developer ID. Halo is signed with a self-signed certificate, not by Apple. Gatekeeper will warn on first launch and macOS cannot attest the binary hasn’t been tampered with. You’re trusting the author (me), not Apple.
  • Not notarized. Apple’s notarization (the malware-scan warrant) requires a paid Developer Program membership. Halo doesn’t have that.
  • macOS 13 (Ventura) or later. The launch-at-login feature uses SMAppService, introduced in Ventura.
  • “Create Halo Speakers” auto-aggregate only matches Apple Studio Displays by default. For other devices, create the Multi-Output Device manually in Audio MIDI Setup. Halo will still control volume on it.
  • Uses Apple’s private OSD.framework for the bridging header. Private APIs can change between macOS versions. If a future macOS breaks it, a rebuild against the new SDK usually fixes it, but I can’t guarantee it’ll keep working forever.
  • Hobby scale. Single author, no bug tracker, no auto-update mechanism. If a new macOS breaks something, you’ll need to rebuild from source or ping me directly.
  • Prefer a supported commercial tool? SoundSource by Rogue Amoeba is signed, notarized, supported, and costs ~US $47. A legitimate choice if you need guarantees.

License & Source

Halo inherits the Apache License 2.0 from MultiSoundChanger. The original copyright and NOTICE are preserved.

GFL