Skip to content

Input Capture

MZAP can capture live audio from input devices and route it through the matrix router like any other player.

  • WASAPI input — Microphones, line-in, and other recording devices
  • ASIO input — Individual channels on ASIO audio interfaces, or an adjacent pair captured as true stereo
  • Loopback — Capture the output of another audio device (what-you-hear). Requires the Device Loopback license feature.
  • Process loopback — Capture audio from a specific running application (e.g. Spotify, Chrome). Requires the Process Loopback license feature.
  • AirPlay input — Receive audio from an iPhone, iPad, or Mac. Requires the AirPlay license feature.

Microphone and line-in capture is available on every license.

Each input source is a dedicated player in MZAP that can be routed to any combination of output zones using the standard matrix routing.

Input players are created on demand from the Players view Create dropdown (microphone, line-in, and ASIO inputs are no longer auto-created one-per-channel at startup):

  • Add input… — opens a dialog with two dropdowns: the input device, then the channel (All channels, or a specific channel index for multi-channel/ASIO hardware). The name auto-fills from the device and channel when left blank.
  • Capture system audio… — picks a loopback (system-audio) device/channel. Requires the Device Loopback license feature.
  • Capture app… — per-application capture (see below). Requires the Process Loopback license feature.

Loopback players are also created automatically for the system-audio devices present when you create a demo workspace on first run — but only when the Device Loopback feature is licensed.

The Channel dropdown in the Capture system audio dialog offers All channels on any multichannel loopback endpoint, alongside the per-channel entries. Picking it captures the whole endpoint interleaved, so a single player carries true stereo.

All channels is preselected, since stereo capture is the common case. Previously the only choices were Channel 1 or Channel 2, and capturing both halves meant creating two mono players and routing each to the correct side — doubling the volume, EQ, and DSP state to keep in sync.

  • The per-channel entries remain for mono captures.
  • Mono loopback endpoints are unaffected — they show their single channel with no redundant "All channels" entry.
  • A player created from All channels is named after the bare device (e.g. Speakers (Pebble V3)) rather than … - Channel 1.
  • The Edit input source dialog can re-point an existing loopback player to, or away from, All channels.

To re-point an existing input or loopback player to a different device/channel, use the pencil (edit) button in its detail header — see Zones and Players. You don't need to delete and recreate the player.

An input player on an ASIO device can capture an adjacent channel pair as a single true-stereo player — for example a Focusrite Scarlett's Analogue 1-2 pair, or its Loopback 1-2 pair.

In the Add/Edit Input Player dialog, multi-channel ASIO devices offer a Layout toggle:

  • Mono — captures one channel. Because every player outputs stereo, that single channel is duplicated equally to left and right.
  • Stereo — captures two adjacent channels as discrete left and right. This is a genuine stereo image, not duplication.

Channel dropdowns show the driver's own channel names (e.g. "Analogue 1", "Loopback 1"), so virtual and physical channels are easy to tell apart.

Stereo pairs must start on an even-aligned channel (1-2, 3-4, 5-6, …) and the whole pair must fit within the device's channel count. A stereo input player shows a Stereo badge on its card and gets dual-lane level meters.

  • Route a microphone to specific announcement zones
  • Capture a DJ mixer output and distribute to multiple rooms
  • Re-route audio from one device to another via loopback capture
  • Pull audio from a single app while leaving other system sounds untouched

Process loopback captures audio from one specific application instead of the whole system. Only the chosen app's audio is picked up; everything else stays silent.

  • Windows 10 build 19041 (version 2004, May 2020) or later
  • The Process Loopback license feature

In the create-player form, click Capture app audio… to open the picker. The list shows currently audible apps first (those with an active audio session), followed by other running apps with visible windows.

Capture always covers the selected application and its child processes — that is what every capture setup needs, and there is no option to change it.

If the target app isn't running yet, the player sits in an Attaching state and auto-attaches within about two seconds of the process appearing. To rebind an existing capture player to a different app, click the target-app chip next to the state badge in the player detail view.

Apps that run several processes — Spotify, Chrome, Electron-based players — are captured from the top-level process of the application, preferring the instance that currently owns an audio session. Track metadata is read from that same process, so the name shown always belongs to the audio you hear.

This matters because Windows' process-tree capture covers a process and its children, never its parent. A capture rooted at a short-lived renderer child therefore carried no audio at all, while the track name still looked correct because it was read by executable name rather than from the captured process. The symptom was a player showing the right track and playing nothing — or, in a shared zone, seeming to play another player's audio because its own capture was silent.

  • Existing capture players are repaired automatically on the next attach; no reconfiguration is needed.
  • The stored process ID is refreshed to the top-level process on each attach, so capture keeps working after the target app restarts.

Windows binds a capture to a specific process and does not follow the application across a restart. MZAP notices when the captured application exits, releases the dead capture, and re-attaches by itself as soon as the application comes back — normally within a few seconds.

  • While the application is closed, the player shows the Attaching state and its track name clears, instead of appearing to play a track that has stopped.
  • Players you stopped yourself are unaffected: restarting the target application will not start them again.
  • This applies to every capture player and needs no configuration.

When a process loopback player is attached, its tile in the Players view shows the captured app's process name (e.g. Spotify.exe) on the top line and that app's main window title on the Now Playing line. Many media apps put the current track into their window title, so for Spotify, Chrome / YouTube, VLC, foobar2000, and similar players you'll see the track name appear automatically — no per-app integration required.

The window title is polled about once a second on the same tick that updates other player state. Titles that just echo the app name (e.g. a bare Spotify or Spotify Premium between songs) are suppressed so the line stays empty until a real track plays. The same behavior applies in the player detail view.

  • Only the default render endpoint is captured (per-endpoint selection is a future enhancement).
  • DRM-protected streams (Netflix, Spotify PlayReady content) produce silence — Windows marks the capture buffer silent, and this cannot be bypassed.
  • Attaching to an elevated target from an unelevated MZAP fails. Run MZAP elevated if you need to capture elevated apps.

Both loopback capture types are license-gated, and the gate is checked when a player starts, not only when it is created.

Capture typeFeatureIncluded in
Microphone / line-in / ASIO inputEvery license
Capture system audio (device loopback)Device LoopbackBusiness, Subscription, Trial
Capture app (process loopback)Process LoopbackSee your license tier
  • The corresponding item is shown but inactive in the Players Create menu, with a short line saying the feature is not included in your license.
  • POST /api/players for that type returns 403 Forbidden, as do PUT /api/players/{id}/input-source and POST /api/players/{id}/play on such a player.
  • Existing players are kept, not deleted. They simply refuse to start, and the player list shows the stop reason as a licensing refusal — distinguishable from a target application having closed.
  • Loopback devices are skipped during automatic player creation — on first-run demo setup, on audio engine initialization, and when a device is hot-plugged — so you no longer get players that appear in the list but cannot start.
  • Upgrading the license makes them work again with no reconfiguration, and takes effect immediately without restarting MZAP.

The licence is checked whenever a capture player starts, however playback was triggered — including by the scheduler, a workspace restore, resuming from sleep, or an AI client.