Skip to content

About

A Swift native audio-mixer to which allows grouping applications to set individual volumes. Replacement for e.g. Loopback or WaveLink.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

bam logo

bam — Better Audio Mixer

bam in action — console + Stream Deck

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.

Requirements

  • macOS 14.4 or later
  • Audio-capture permission (prompted on first launch — needed to meter and route other apps' audio)

Install

Homebrew

brew tap lkshrk/tap
brew install --cask lkshrk/tap/bam

Manual

Grab bam.zip from the latest release, unzip, and drag bam.app to /Applications. Releases are Developer ID signed and notarized — no Gatekeeper workaround needed.

Stream Deck plugin

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.

Install the plugin

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.

Diagnostics

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.

Build from source

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 test

Live 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.

Project layout

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

License

The bam app and BamKit are MIT licensed (see LICENSE).

About

A Swift native audio-mixer to which allows grouping applications to set individual volumes. Replacement for e.g. Loopback or WaveLink.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages