Skip to content

Changelog

New

  • Per-device output mode (WASAPI Shared or Exclusive): Each output device card in Audio Devices now has its own Output mode selector instead of one global setting. Exclusive bypasses the Windows mixer for true discrete 5.1/7.1 and lowest latency but locks the device from other apps; Shared (the default) lets the device coexist with Windows and other applications. One PC can now mix cards with opposite needs — one on Exclusive for 7.1, another left on Shared. If MZAP can't get exclusive access at startup it falls back to Shared and the card shows a warning. See Audio Devices — Per-device output mode and Enabling WASAPI exclusive mode.
  • Turn individual output devices on or off: Each output device card has an On/Off switch telling MZAP whether to open that device. Devices that are off stay visible (dimmed, with an Off badge) so they can be switched back on. This matters for sound cards that expose two endpoints on one physical card — opening the unused endpoint can collapse the whole card to stereo and silence multichannel output. Changes are saved immediately but take effect after an app restart. See Audio Devices — Turning output devices on and off.
  • Stereo input pairs for ASIO devices: Input players on ASIO devices can capture an adjacent channel pair (1-2, 3-4, …) as a single true-stereo player — e.g. a Focusrite Scarlett's Analogue 1-2 or Loopback 1-2 pair. The Add/Edit Input Player dialog gains a Mono/Stereo layout toggle, and channel dropdowns now show the driver's own channel names so virtual channels are identifiable. See Input Capture — Stereo input pairs.
  • Stereo level meters: Meters on player and zone cards (and their detail views) now show independent left/right bars for stereo sources — playlist players, stereo input players, and stereo zones — in the same footprint as before, so card sizes are unchanged. Mono sources keep the single full-height bar, and the clip indicator latches when either channel clips. Stereo input players also show a Stereo badge. See Zones and Players — Metering.
  • Zone detail shows and edits its assigned players: A new Sources section on zone detail lists which players feed a zone, and each zone card in the Zones list shows its sources on a clickable summary line that opens a picker — so routing can be changed without opening the Matrix. When a zone has two or more sources, MZAP flags it with an amber "N mixing" warning. See Zones and Players — Zone sources.
  • Seven new UI languages: Polish, Lithuanian, Vietnamese, Slovak, Czech, Bulgarian, and Japanese join the existing 14, bringing the total to 21. The license activation screen, update banner, per-application capture picker, and the AM/PM time control were also localized. See Settings — UI Settings.
  • Stream Stall Timeout is configurable in Settings: The seconds a network stream may stall before falling over to a local backup track is now exposed in Settings → Network Stream Settings, alongside a Fail over to local backup when a stream stalls toggle. Previously this was backend-only. See Settings — Network Stream Settings.
  • Set volume in decibels via the API: PUT /api/zones/{id}/volume and PUT /api/players/{id}/volume accept a new optional volumeDb field, and zone/player responses include a read-only volumeDb. Unlike the 0–1 fader position, a dB value means the same loudness regardless of the Volume Scale setting. See Settings — Setting volume in decibels.

Fixed

  • Multichannel cards with multiple endpoints keep full surround: Some cards expose more than one output endpoint on the same physical device (the Creative Sound Blaster Live! 24-bit External has both a 5.1 "Speaker" and a stereo "SPDIF-Out" endpoint). MZAP used to open every endpoint, and opening the unused sibling made the driver collapse the card to stereo, silencing the rear/center channels. Zoneless sibling endpoints are now skipped automatically, preserving discrete 5.1/7.1.
  • Changing a zone's channel or layout no longer stops its audio or changes its level: In WASAPI output mode, editing a playing zone's Channel or Mono/Stereo layout used to silence it until the app restarted. It now continues uninterrupted on the new channel. In all output modes, the edited zone's level no longer jumps — the routed player's saved volume and mute are re-applied, so all zones a player feeds stay at matching levels.
  • Edit Zone dialog shows the correct channel on first open: Opening Edit Zone for a zone the first time could show the wrong channel with a spurious "This channel is already used by…" warning. The dialog now always seeds from the zone being edited, with the correct channel, layout, and name.
  • Stereo input players show their channel range in labels rather than only the first channel.

Changed

  • Playback mode is now a per-player setting: Playback mode (Sequential / Repeat One / Repeat All / Shuffle) is set on the player, not the playlist it points at. Previously, changing a player's mode wrote directly to the saved playlist — so two players sharing a playlist would silently change each other's mode and permanently rewrite the library playlist. Changing a mode now moves that player onto its own private working copy; your saved playlist is never modified. Two players can play the same library playlist with different modes at once, and setting the mode from the players list and the detail view now behave identically. See Playlists — Playback mode.
  • Deeper default network buffering: Default network stream settings now ride out brief per-connection gaps the way a browser does, instead of cutting to a local backup track. Network buffer 5 s → 30 s, pre-buffer 0% → 75%, network timeout 30 s → 50 s, and stall timeout 3 s → 5 s. Defaults apply to fresh installs only; existing saved settings are unchanged.
  • Devices with no zones mapped are no longer opened at all, so MZAP never locks or holds an output endpoint you aren't using.
  • Consistent stereo/mono and status badge ordering across zone and player views, and device detail zone rows now show stereo and mixing badges.
  • Every player outputs stereo: Documented that a mono source — a single-channel input or a mono file — is duplicated equally to left and right, which is why its level meter shows two identical lanes. Hovering the meter now explains this. See Zones and Players — Mono sources and stereo output.

New

  • Stream-outage failover with auto-return: A player that plays an internet radio stream can now fall back to local backup tracks when the stream drops, then return to the stream on its own — minimizing dead air. Build the queue as [stream URL, local file 1, local file 2, …] and turn on the shield toggle on the player's Playlist tab. While on backup, MZAP re-checks connectivity at every local-track boundary and crossfades straight back into the stream. See Playlists — Stream-outage failover.
  • Set a player's playlist from the Players view: Playlist player cards now show their current playlist on a clickable line beneath the type badges — click it to switch playlists or create a new one without opening the detail panel. Reads Select Playlist when nothing is loaded. See Playlists — Switching a player's playlist.
  • Save an unsaved queue from the playlist picker: The Select Playlist dialog now offers Save current queue… whenever the active queue is unsaved and has tracks, so switching playlists no longer silently discards it. See Playlists — The current playlist.
  • Auto / Custom ordering for Zones and Players: Both views now default to Auto — zones sort by name with numeric awareness (so zone2 comes before zone10), and players sort by type then name. Switch to Custom to drag them into any order; the arrangement is saved and restored if you toggle back. See Zones and Players — Ordering.
  • From Folder now offers three grouping modes: One playlist per subfolder (the original behavior), one playlist with every file underneath the folder, or one playlist with only the files directly in it. The two single-playlist modes let you name the playlist. See Playlists — Bulk-Create from a Folder Tree.
  • Playback mode button moved into the player detail, inline with the progress bar.

Fixed

  • Stopped players stay stopped after a workspace restore: A player that was stopped when the workspace was saved no longer starts playing when it is loaded — its track is cued in the Now Playing header, but playback stays stopped. Players saved while playing or paused restore as before. Affected both local-file and stream players.
  • Partial UI-state updates no longer wipe saved settings: Updating one part of the interface state (for example toggling a sort mode) no longer clears the others. Custom player/zone ordering, recent stream history, active filters, and collapsed sections all survive.

Changed

  • Per-player crossfade is now the single source of truth: A player's crossfade of 0 now means no crossfade (hard cut) rather than "inherit the global default", so one player can hard-cut while others crossfade. Default Crossfade Duration in Settings now only seeds newly-created players. Workspaces saved by older versions are migrated once so existing players keep the behavior they had. See Playlists — Crossfade.
  • Consistent player detail panels across all source types: Input, loopback, and capture players now show a Now Playing block (source label and channel) like playlist and stream players, and every panel reserves the same height for it — so volume, tabs, and zones line up when panels sit side by side. Capture, input, and loopback players show a Live / Idle status pill in place of the playlist progress bar.
  • Zone grid in the player detail adapts to panel width: The Zones tab now picks its column count from the panel's own width rather than the window's, so zone names stay readable when a player is docked into a narrow column.

New

  • User-defined zones: Zones are no longer created automatically one-per-channel. A zone is now a definition you create — choose its device, channel, and mono/stereo layout — and the same device can host both mono and stereo zones at once. Zone layouts are stored independently of devices, so they're portable across machines (offline zones offer a Reassign action). You can also bulk-create zones for every free channel of a device (Mono or Stereo, optional name prefix) — ideal for high-channel hardware like a 64-channel Dante Virtual Soundcard. See Zones and Players.
  • First-run setup choice: On first launch MZAP now asks whether to create a demo workspace or start empty, and an admin can rebuild a fresh demo any time with the Welcome screen's Create Demo Workspace button. Demo radio players are created stopped — MZAP no longer starts playing audio on its own.
  • Manual input players: Microphone, line-in, and ASIO input players are now created on demand via the Players view Create dropdown instead of flooding the list at startup; only loopback players are auto-created. Input/loopback players can be re-pointed to a different device/channel with a pencil button, and a unified colored type badge (Playlist / Input / Loopback / Capture) is shown everywhere. See Input Capture.
  • Launch on Windows startup: A new Launch on Windows Startup toggle in Settings → Workspace starts MZAP automatically at the next Windows login. Registration is per-user (no admin rights or UAC prompt), takes effect immediately, and self-heals if the install location changes after an update. See Settings — Launch on Windows startup. (Windows desktop app only.)
  • Expose MZAP to the local network: An opt-in Network Access setting lets MZAP be controlled from other PCs and phones on the same network, with an authentication/firewall confirmation flow. See Settings — Network access.
  • Professional VU meters: Level meters now read like a broadcast console — color thresholds pinned to dBFS (green below −18, amber −18 to −6, red −6 to 0 per EBU R128 / SMPTE alignment), a peak-hold marker that falls slowly like hardware, a latching clip indicator you click to reset, and a −48 dBFS scale floor for more resolution. See Zones and Players — Metering.
  • Internet reachability indicator: The status bar now shows a distinct Internet: Online / Offline / Unknown indicator, separate from the API/Live link, so "your streams will fail because this PC is offline" is surfaced directly — including multi-NIC machines where only the internet-bearing adapter goes down.
  • Reorganized player queue toolbar: The toolbar groups the add/source actions together and replaces the two old save buttons with a single Save dropdown (Save to File… and Save to Playlists…); Clear Playlist moved to the far-right edge and always asks for confirmation. Each player also shows where its queue came from — 📄 File, 🎵 Library, or ✎ Unsaved. See Playlists.

Fixed

  • Editing no longer overwrites saved playlists: Each player now has its own working current playlist. The first edit forks a private working copy (marked Unsaved) and leaves the saved library playlist untouched, and re-loading the same playlist file or playing several radio stations onto a player no longer creates duplicates. Editing a playing playlist is now seamless — the current track carries over with no audible gap or stream reconnect. See Playlists — The current playlist.
  • Refresh Devices is now incremental: Refreshing no longer tears down the audio engine. Connected devices and their playback are left untouched (no audio gap); only added/removed devices change, disconnected devices' zones go offline, and their routing survives a reconnect. Player/zone volume & mute are also restored after a device refresh or reconnect.
  • Non-Latin device names (Cyrillic, etc.) now display correctly everywhere instead of showing as "?????". See Audio Devices — Non-Latin device names.
  • Consistent volume everywhere: Volume now uses a single dB-based model (linear = 10^(dB/20)) across players, zones, and jingles on both WASAPI and ASIO, so the same fader position produces the same loudness and matches the on-screen dB readout. The fader spans −40 dB to 0 dB.
  • Idle zones no longer show phantom level activity, and playlists no longer stall on very short tracks during crossfade (a clip shorter than the crossfade now uses a direct transition and keeps advancing).
  • Zone EQ bypass state now persists across reload and workspace switch; EQ/Compressor panels remember their collapsed state.
  • Correct pluralization and localization: counts next to nouns now use proper per-language pluralization (fixing output like "1 tracks" / "1 треків"), the Devices headers/filters and license trial banner are fully translated, and long activity-bar labels wrap cleanly.

Improved

  • Mobile-friendly UI throughout — the Devices, Library, Matrix, Scheduler, and Jingles views, dialogs, and detail panels were rebuilt to be responsive and touch-friendly, plus assorted UI refinements (device drag-and-drop ordering, on/off effect toggles, a tidier player header, shared channels with an optional Strict zone channels setting, faster workspace clearing, and high-channel-count scaling with filters and folding).
  • Settings changes propagate to open clients in real time — toggling authentication or LAN exposure updates every open window live, without a manual reload.
  • SSE event streams now send heartbeats every 60 s when idle, so dropped connections are detected promptly and clients auto-reconnect.
  • Library search now matches partial words (prefix search), and Generate Playlist now uses the entire library, not just the loaded page.
  • Lower memory/CPU for VU meters in long sessions — a single shared level stream, throttled repaints, and auto-pause while the window is hidden.

New

  • Library search rebuilt on SQLite FTS5: The Library search box now runs against a full-text index — whole-word matching with pink* prefixes, boolean AND/OR/NOT, "phrase" and NEAR(a b, 5) queries, accent folding, and Porter stemming. Range filters (year and duration) moved into a filter bar beneath the search box. See Media Library — Search.
  • Library row selection and right-click menu: Tracks are now selectable (single, Ctrl/Cmd, Shift-range). Right-click opens a context menu with Play on player…, Add to playlist…, Append to player…, Generate playlist from selection, Show details, Create jingle from track, and Copy path(s). See Media Library — Row Selection and Context Menu.
  • Live library scan progress, cancellation, and non-blocking API: Folder scans show a determinate progress bar with a Cancel button and run on a single-flight server-side queue. The scan endpoints now return 202 Accepted immediately with a scanId; completion is delivered through SSE. See Media Library — Live scan progress.
  • Bulk-create playlists from a folder tree: New From Folder button on the Playlists tab creates one playlist per subfolder containing audio, and re-running on the same root syncs in place — appending new files, removing deleted ones, and preserving UI reorderings. See Playlists — Bulk-Create from a Folder Tree.
  • Delete playlist action with confirmation on playlist cards.

Fixed

  • Scheduler — Daily/Weekly today: Creating a Daily or Weekly task at 15:56 with a 15:56 trigger now fires today instead of skipping to tomorrow. Start time is treated as an activation date, not an exact firing instant. The task editor also now shows a live clock and the active timezone. See Scheduler — Daily and Weekly start times.
  • Log files rotate on size: When the configured size limit is reached, MZAP rotates to mzap-…-1.log, -2.log, … and keeps logging instead of stopping until the next restart. The folder watcher no longer logs raw FileSystemWatcher events for non-audio files (.DS_Store, desktop.ini, OneDrive/Drive sync touches). Per-file enqueue/scan traces moved from Information to Debug. See Troubleshooting — Logs.

New

  • ElevenLabs TTS provider: A third text-to-speech provider for TTS jingles, offering premium multilingual neural voices. Like Azure, it is covered by the Cloud TTS license feature and uses your own API key. See Settings — Text-to-speech.

Fixed

  • Clearing a playlist no longer leaves the bound player on an orphaned track. A player finishing a file now stops cleanly once the playlist is emptied and the "Now Playing" panel shows "No audio loaded"; a player on an internet radio stream keeps playing until you stop it manually.

New

  • Text-to-speech (TTS) jingles: Create jingles by typing text instead of supplying a recorded audio file. Phase 1 ships the offline Windows voice provider and the Azure Speech cloud provider (~140 neural voices, license-gated). A TTS jingle plays through the same ducking pipeline and can be scheduled exactly like a file jingle. See Jingles — Text-to-speech.

New

  • Per-device stereo zone layout toggle — pair a device's output channels into stereo zones. See Zones and Players.
  • Scheduler: duplicate task button to clone an existing scheduled task.
  • Online and offline license tokens are now cryptographically verified.

Fixed

  • Scheduler task editor: corrected default ZoneControl/PlayerControl command and added a Save & close button.

New

  • Online license tokens and offline .lic files are now signed and verified by the desktop app — tampered or forged licenses are rejected. Existing licenses migrate automatically. See Offline Activation.

Fixed

  • Bug fixes and improvements.

Fixed

  • Memory usage now stays flat while the PC is in Windows Modern Standby. Streaming buffers are capped and unused memory is released back to the system during standby, replacing an earlier interim fix. This builds on the idle-memory improvements introduced in v7.0.1.78.

Improved

  • VU meter streaming is now demand-driven: the 100 ms sampling loop starts when the first client subscribes to /api/stream/levels and stops when the last subscriber disconnects. No metering work happens while the UI is closed, eliminating background memory growth on Windows Modern Standby and reducing idle CPU. Windows session lock now force-disconnects all level subscribers and blocks new ones until unlock, so reconnecting browser EventSources can't keep the sampling loop alive across a locked session.

New

  • Prayer-time scheduler triggers: A new Prayer Time trigger fires daily at any of the five Islamic prayer times (Fajr, Dhuhr, Asr, Maghrib, Isha) — or at Sunrise — computed from the venue's latitude and longitude. Configure venue location and calculation method in Settings → Prayer-Time Scheduling, then create date-bounded triggers (e.g. Ramadan only) with per-prayer offsets in the scheduler. See Scheduler — Prayer Time triggers and Settings — Prayer-Time Scheduling.
  • Per-application loopback shows the captured app's window title: ProcessLoopback player tiles now display the captured process's main window title in the Now Playing line. For Spotify, Chrome/YouTube, VLC, foobar2000, and other apps that put the song into their window title, the current track shows up automatically. The top label now shows the process exe name (e.g. Spotify.exe). See Input Capture.
  • Players and Zones get explicit Auto / Custom sort buttons: The single-button sort toggle is now two side-by-side buttons (Auto, Custom) so the current mode is visible at a glance. New workspaces default to Custom so manual reordering sticks unless you opt back into auto sort.

Fixed

  • Long player and zone names in detail-panel tab titles and the player card header are now truncated with an ellipsis instead of pushing other tabs off-screen. The full name is shown in the tab tooltip.

Changed

  • The unused Volume Scale field has been removed from the Settings UI (it was always fixed to Logarithmic). The setting still exists in the API for forward compatibility.

New

  • Per-application audio loopback capture: Capture audio from a specific running application (e.g. Spotify, Chrome) instead of the whole system. The new "Capture app audio…" picker lists currently audible apps; players can also auto-attach when the target launches later. Includes a child-process toggle so multi-process apps like Chrome and Electron are covered. Requires Windows 10 build 19041+ and the ProcessLoopback license feature. See Input Capture for details.

Fixed

  • Stopped players no longer auto-recover when restoring a workspace — LastStopReason is preserved so saved-stopped streams stay stopped instead of being pre-attached on restore.
  • MZAP's own processes (MZAP.Api.exe, MZAP.Web.exe, host) are excluded from process-loopback capture targets, preventing feedback loops.

New

  • Stream resilience settings: fast stall skip (skip to the next track when a stream stalls for more than N seconds), short auto-advance timeout (dead streams fail fast during playlist advance), and persistent stream health retry (keep retrying after exponential backoff is exhausted). See Settings for details.
  • Per-player and global stream URL hiding with an admin-only toggle. URLs can be hidden individually on each player, globally for all players, or the UI toggle itself can be hidden.

Fixed

  • Resolved a dual-playback race between crossfade and end-sync that could cause two tracks to be audible at once.
  • Crossfade state now stays in sync with the player state machine.
  • Removed a hardcoded server URL from the OpenAPI spec so generated clients use the document origin.

Changed

  • PlayerManager and StreamHealthMonitorService log messages now share a unified Player prefix for easier log scanning.

New

  • Welcome screen now includes Radio Browser and Scheduler cards, filling out the feature grid to 3×2 on wide layouts. All 14 UI languages have translations for the new cards.
  • The Help menu → Documentation item and a new Documentation card on the Welcome screen both open docs.multizoneaudioplayer.com in your default browser.

Fixed

  • Auto-save no longer overwrites default.mzap after using Save As. Auto-save now writes back to the currently loaded workspace file, and only falls back to default.mzap for a fresh "Untitled" workspace.
  • Loading a workspace now refreshes the active session's player and zone assignments, so non-admin users immediately see the assignments from the newly loaded workspace.
  • Seek errors during the local-file branch of player restore are no longer fatal — the rest of the workspace restore continues as expected.
  • Minor corrections to the OpenAPI spec used by the API reference.

Older releases are not individually documented here. See the MZAP website for general release information.