LiveWing
App

Audio Mixer

Channel strips, bus routing, gain, pan, solo, AFV, AGC, and per-bus hardware output.

LiveWing's audio mixer is a custom vDSP mixing engine running entirely inside a CoreAudio HAL render callback. All mixing — ring buffer reads, per-source gain and pan, bus accumulation, master processing, and metering — happens on the real-time audio thread with zero allocations. The system runs at 48 kHz, stereo, 32-bit float with a 256-sample buffer (approximately 5.3 ms latency at 48 kHz).

Up to 16 sources can be active simultaneously in the mixer.

Bus architecture

LiveWing has seven audio buses: M, A, B, C, D, E, F. Bus M is the master program bus and is always present. Buses A–F are optional and can be enabled as needed.

BusTypical use
MProgram mix — goes to all outputs and recordings by default
APreview monitor or IFB
B–FAuxiliary mixes: clean feeds, crowd audio, talent monitors

Each source has an independent send level to each enabled bus (0.0 = off, 1.0 = full). You can send commentary audio at full level to Bus M while excluding it from Bus B for a clean international feed.

Each enabled bus can be routed to a hardware audio output device connected to your Mac. Bus M drives the primary system output by default.

Channel strip controls

Open the mixer panel to see a full channel strip for every active source.

Gain — Linear gain derived from a dB setting. Unity (0 dB) is 1.0.

Pan — Stereo pan from –1.0 (hard left) to +1.0 (hard right). Uses constant-power panning so the perceived level stays consistent across the stereo field.

Mute — Silences the source on all buses. Muted sources still show meter activity.

Solo — Routes only that source to the monitor path. All other sources are suppressed in the monitoring path while a source is soloed. Solo does not affect the program output.

AFV (Audio-Follows-Video) — When enabled (the default), the source's audio automatically follows the switcher's program bus. When the source is taken to program, its audio fades in on Bus M; when cut away, it fades out. Disable AFV on sources that should always be present regardless of what's on camera (walk-in music, tone generators).

Automatic Gain Control (AGC)

Each channel strip has an optional AGC that targets –18 dBFS RMS using a WebRTC AGC2-inspired algorithm. It uses a 400 ms smoothing time constant (EBU R128 momentary window), slew-limits gain changes to 6 dB/sec to avoid audible pumping, and includes a noise gate at –50 dBFS that prevents the AGC from boosting noise during silence. The maximum boost is +30 dB; the maximum attenuation is –20 dB. AGC is off by default.

Metering

Input meters update at approximately 15 Hz. Peak indicators are held for 2 seconds before decaying at 20 dB/sec. Bus M shows the program mix levels. The meters skip every two out of three render callbacks to reduce overhead — effective update rate is roughly 31 Hz per callback, flushed to the UI at 15 Hz.

Audio mixer channel strips showing master, program (red tally), preview (green tally), muted, and silent inputs

Master processing

The master Bus M strip has its own gain control and a limiter with a default ceiling of –0.3 dBFS. The limiter is active by default as a safety net for the program output. Master configuration (gain, limiter ceiling, bypass state) is saved in presets.

Per-bus hardware routing

Any enabled bus can be assigned to a hardware audio output device. When a bus is assigned to a device, a dedicated HAL output AudioUnit drives that device using the same render callback infrastructure. Multiple devices can run simultaneously — for example, Bus M to the main system output and Bus A to a USB headphone amplifier for the preview monitor.

Bus routing to hardware audio devices and per-source send levels are saved in your preset. Loading a preset restores the full mix configuration, including device assignments.

API control

The WebSocket API exposes the full mixer surface:

  • audio.setGain — set channel or master gain in dB
  • audio.setPan — set pan position (–1.0 to +1.0)
  • audio.mute / audio.unmute — mute or unmute a channel
  • audio.toggleAFV — toggle audio-follows-video for a source
  • audio.setBusSend — set a source's send level to a specific bus

See the API Reference for full parameter details.

On this page