A per-app audio mixer and router for macOS. Route any app to the output you choose, set per-app levels, and watch live meters — all from one console.
Built on the CoreAudio process-tap API (macOS 14.4+). No kernel extension, no SIP changes.
- macOS 14.4 or later
- Audio-capture permission (prompted on first launch — needed to meter and route other apps' audio)
brew tap lkshrk/tap
brew install --cask lkshrk/tap/bamGrab bam.zip from the latest release,
unzip, and drag bam.app to /Applications. Releases are Developer ID signed
and notarized — no Gatekeeper workaround needed.
bam ships an optional Elgato Stream Deck plugin so you can mute, adjust, and switch routing from your deck — keys or dials — without opening the console. It talks to the running app over a local socket; the app must be running.
Three actions:
- Device — mute, adjust, or set the level of one app group. On a key it renders a styled tile (colored monogram, name, %, and meter artwork) in one of three styles — Level Meter, Level Bars, or Radial Gauge — picked in the Property Inspector. On a dial it shows a smooth live LCD meter with the same controls.
- Master — the same, for the master bus.
- Output Device — set or toggle the active hardware output. The key shows the same device icon the console uses (headphones, speaker, display…), resolved live from the app.
The plugin ships in the same release as the app. Grab
me.harke.better-audio-mixer.streamDeckPlugin from the
latest release
and double-click it to install. It is signed and notarized; first launch needs a
network connection for the online notarization check.
bam records compact logs for router recovery, audio-driver status, local control-socket events, and Stream Deck plugin connections. See docs/logging-and-diagnostics.md for useful log categories and support-report notes.
Requires XcodeGen and Xcode 16+.
xcodegen generate
xcodebuild -project bam.xcodeproj -scheme bam -configuration Release \
-derivedDataPath .build build
open ".build/Build/Products/Release/bam.app"Run the tests:
xcodebuild -project bam.xcodeproj -scheme bam -configuration Debug \
-derivedDataPath .build testLive HAL tests (BAM_LIVE=1 / BAM_SMOKE=1, otherwise skipped) drive the real default output: quit bam, play audio, then run make test-live.
It forces the system volume to 8% first and every test restores the captured device state on teardown.
| Path | What |
|---|---|
App/ |
SwiftUI console UI + ConsoleViewModel |
BamKit/Sources/BamCore/ |
Pure routing model, config, protocols |
BamKit/Sources/AudioEngine/ |
CoreAudio engine, process taps, mixer |
BamKit/Sources/BamControlKit/ |
Local control socket server (app ↔ plugin) |
BamKit/Sources/BAMStreamDeck/ |
Stream Deck plugin executable |
StreamDeck/me.harke.better-audio-mixer.sdPlugin/ |
Plugin bundle (manifest, PIs, layouts) |
project.yml |
XcodeGen project definition |
The bam app and BamKit are MIT licensed (see LICENSE).

