Skip to content

Changelog

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.