Changelog
v7.2.0.117 — 2026-08-27
Section titled “v7.2.0.117 — 2026-08-27”New
- Jingle target selections can be saved without playing: Choosing target players or zones only stuck if you pressed Play — the selection was recorded as a side effect of playback, so a jingle configured and left alone lost its targets and reopened showing whatever it had last been played on. The target list now has a Save button next to Play/Stop, which lights up as soon as the selection differs from what the jingle has stored and reads Saved when there is nothing pending. Playing a jingle still records its targets. Saving is admin-only. See Jingles — Saving a target selection.
- Application capture recovers automatically when the app restarts: Closing and reopening a captured application left its player silent until the player was manually stopped and started again — Windows binds a capture to a specific process and does not follow it across a restart. MZAP now notices when the captured application exits, releases the dead capture, and re-attaches by itself within a few seconds of the application coming back. While the app is closed the player shows Attaching and clears its track name instead of appearing to play a track that has stopped; players you stopped yourself are not restarted. See Input Capture — Recovery when the app restarts.
Fixed
- Application capture now attaches reliably to multi-process apps: Capturing apps that run several processes (Spotify, Chrome, Electron-based players) could produce a player that showed the correct track name but played no audio — or, in a shared zone, appeared to play another player's audio because its own capture was silent. MZAP picked the most recently started matching process, which for these apps is a short-lived renderer child, and Windows' process-tree capture never covers a process's parent. Capture now attaches to the top-level process, preferring the instance that owns an audio session, and reads track metadata from that same process. Existing players are repaired automatically on the next attach. See Input Capture — Multi-process apps attach correctly.
Changed
- The "Include child processes" option was removed from the capture dialog. Capture always covers the selected application and its child processes, which is what the checked state did and what every capture setup needs. Unchecking it did not narrow capture to a single process as the label suggested — it selected a Windows mode that captures every application except the selected one, typically producing silence or unrelated audio. Existing players are unaffected, and any player previously saved with the option off now captures the intended application. The API still accepts
includeProcessTreefor backward compatibility but ignores it, and it has been removed from player responses; the MCPcreate_process_loopback_playerparameter is gone. - Jingle target saving and the TTS setup links are translated into all 20 non-English interface languages, instead of falling back to English. This also fills in the text-to-speech setup help strings, which had been English-only in every locale since those links were added.
v7.2.0.116 — 2026-08-26
Section titled “v7.2.0.116 — 2026-08-26”New
- Built-in stream server sends the station name: Listeners connecting to a streaming zone's built-in server now see the station name (from the zone's Station name setting, or the zone name when blank), so players such as VLC show it in place of a bare URL. Applies automatically to every stream zone with the built-in server enabled.
- Help links next to the cloud TTS key buttons: Each cloud provider in Settings → Text-to-speech now has a How to get a key link that opens its setup walkthrough in the documentation. It appears beside the Set up key / Replace key buttons, inside the key dialog, and as Check the setup steps directly under a failed Test connection. See Settings — Finding the setup steps.
Fixed
- TTS previews now match the saved jingle: Previewing and then saving used to call the provider twice, and cloud engines do not generate identical audio twice — the same text, voice, and rate could come back with noticeably different pacing. Saving now reuses the exact audio you previewed, and re-synthesizes only when you change the text, voice, provider, or rate. This also halves the characters billed by your cloud provider per jingle. See Jingles — The preview is what you save.
- The speaking-rate slider shows each provider's real range: The slider offered 0.5×–2.0× for every provider, but ElevenLabs only honours 0.7×–1.2× and silently clamped anything beyond that — a jingle played at 1.2× while the UI still read "2.00×". The slider now shows the true range per provider. Existing jingles keep their audio; re-save one to bring its stored rate in line. See Jingles — Speaking rate.
- Failed cloud TTS connection tests explain themselves: Every failure reported "Connection failed. Check the credentials.", which was misleading whenever the key was fine. The provider's own explanation is now shown, distinguishing a rejected key from a valid key missing a permission scope (ElevenLabs keys need
voices_readandtext_to_speech), a quota or rate limit, a wrong Azure region, and a network or DNS failure. - Switching TTS provider no longer keeps the previous provider's voice selected. Preview and Save are disabled while the new provider's voices load, instead of failing with an "invalid ID" error.
- Daily and Weekly scheduler tasks fire at the second you set: The Start Time picker has always offered a seconds field, but Daily and Weekly tasks silently rounded down to
:00— a task set for 21:32:39 fired at 21:32:00. Seconds are now honoured, and Next Run, Last Run and the Execution Log display them. Existing tasks keep firing at:00until re-saved. See Scheduler — Seconds are honoured. - Non-Latin stream titles and station names survive: Track titles and station names sent to a stream zone's listeners are now encoded as UTF-8. Cyrillic, Greek, and other non-Latin names previously arrived as rows of
?with the original text unrecoverable. MZAP also reads stream metadata correctly now — a player tuned to an internet radio station shows non-Latin station names and track titles properly, trying UTF-8 first and falling back to ISO-8859-1. See Streaming Zones — Station names and track titles. - The Debug log level setting now actually produces debug output: Setting Settings → Log Level to
Debughad no effect — log files continued to contain only Information-level entries and above, so debug diagnostics were silently unavailable when troubleshooting. No configuration change is needed if you already hadDebugselected. See Settings — Logging.
v7.2.0.115 — 2026-08-23
Section titled “v7.2.0.115 — 2026-08-23”A large release: two major new player and zone types, MCP authentication, and licence enforcement across capture and zone limits.
New
- Streaming zones — broadcast a zone as internet radio: A zone can now be created as a streaming zone, encoding its mix (with volume, EQ, and compressor) to MP3 or Opus and broadcasting it instead of playing to a device channel. Two delivery modes, usable together: a built-in HTTP server that listeners open in VLC, a browser, or any radio app, and/or a push to an external Icecast/Shoutcast server. The zone detail gains an On-Air panel with the broadcast state, a listen URL per network interface, live listener counts, and the exact firewall command to run. Requires the Streaming licence feature. See Streaming Zones.
- AirPlay input — play from an iPhone, iPad or Mac into any zone: A new player type turns MZAP into an AirPlay-compatible receiver. While started it appears in the AirPlay picker on Apple devices under a name you choose, and whatever the phone plays flows through that player into its zones with MZAP's volume, EQ, ducking and scheduling. Each endpoint can optionally require a password. Requires the AirPlay licence feature; Personal licences allow 2 endpoints, Business unlimited. See AirPlay Input.
- Microphone auto-ducking: An Input (microphone) player can now automatically lower the volume of other players while it is live and restore them when it stops, so announcements over background music no longer need an operator at the faders. On by default for microphones you add yourself; the input players MZAP creates automatically from your hardware are left off. Other microphones are never ducked. See Jingles — Microphone auto-ducking.
- The MCP server now authenticates and honors user roles: With authentication enabled, MCP clients must send a valid API key, and that user's role decides which tools they can see and call — Viewer gets read-only tools, Operator adds playback and DSP, Admin gets everything. Tools outside a client's role are hidden rather than failing when called, and non-admin clients only see their assigned players and zones. See MCP Overview — Authentication and roles.
- "Stop After This Track" playback mode: A fifth playback mode that finishes the current track and then stops. It is a normal mode, not a one-shot toggle, and keeps the playlist position so Play resumes from the track that just finished. See Playlists — Stop After This Track.
- Capture system audio in stereo with one player: The Channel dropdown in Capture system audio now offers All channels on any multichannel loopback endpoint, capturing the whole endpoint interleaved so one player carries true stereo. Previously capturing both halves meant two mono players routed to opposite sides. See Input Capture — Capturing system audio in stereo.
- Renew support and updates from inside the app: Support determines which versions you can install — a release is available to you if it came out before your support ended. A Renew support & updates button now appears in the About dialog and the update banner from 60 days before support ends. When an update exists that was released after your support ended, the banner names the newest version still available to you instead of offering a download that would not work. See Support & Updates.
- Anonymous usage data is opt-in: MZAP asks once, after first-run setup, whether it may collect anonymous usage data, with the choice changeable under Settings → Privacy. The app behaves identically whichever answer you give, and no usage data is collected yet — the setting records your choice so nothing is ever collected without it. See Privacy & Data Collection.
- Settings gains an MCP server section, showing whether the feature is licensed, the URL to connect to, how many AI clients are connected, and ready-to-copy setup for Claude Code and Claude Desktop. See Settings — MCP server.
Changed
- Licences can cap how many zones you may create: Licences now carry a maximum zone count, applying to trials exactly as to paid keys;
0means unlimited, and most tiers are uncapped. If you already have more zones than the licence allows, nothing is deleted — the first N work normally and the rest are kept but not started, coming back automatically when the limit is raised. See Zones and Players — Zone limits. - Device loopback capture is now a licensed feature: Capturing an output device's audio requires the Device Loopback feature (included in Business, Subscription and Trial licences; not in Personal). Existing loopback players are preserved but refuse to start without it, and loopback players are no longer auto-created for unlicensed users. Microphone and line-in capture is unaffected and remains available on every licence. See Input Capture — Licensing for capture players.
- Per-application capture is enforced when a player starts, not only when it is created, so the licence is honoured however playback was triggered.
- Unlicensed features are shown and explained instead of hidden: Creating a streaming zone, capturing system audio, and capturing a single application used to disappear from their menus entirely, leaving no way to tell whether the feature did not exist or was simply not part of your licence. These entries now stay visible but inactive with a plain statement of why. Activating or upgrading a licence updates them immediately, without reopening the screen.
- Playback stops when the licence is not valid: Audio no longer keeps playing after a trial ends. Zones, players and routing are still restored so the configuration stays intact — players simply do not start, and activating a licence resumes playback without restarting. Valid, trial, grace-period and support-expired licences all play normally. See Activation — Playback and licence state.
- Some MCP tool parameters take words instead of booleans: LLM clients frequently send booleans as quoted strings, which made
set_player_volume,set_zone_volume,set_equalizerandset_compressorfail before the tool ran.mutenow accepts"mute"/"unmute"andenabledaccepts"on"/"off", along with common variants.manage_workspacewas also split so read-only use no longer needs Admin —get_workspace_infois a new tool. Scripted callers passing a real JSON boolean need updating. See MCP Tools Reference. - LAN firewall access is enabled by default in the installer: The "Allow access from other devices on your network (LAN)" option is now ticked by default. It was previously off, which silently broke AirPlay input and "Expose to local network" on a standard install — the endpoint was still announced and still appeared on an iPhone, but every connection was blocked with nothing in the logs to explain it. See Installation — Network access (LAN).
- Logs consolidated into one folder, with far less noise: All logs now live in
%APPDATA%\MZAP\logs\. The desktop shell previously wrote a separatestartup.lognext to the program files or in%APPDATA%\MZAP\, which never rotated and could reach hundreds of megabytes. It is nowlogs\shell.log, capped at 5 MB. Routine playback chatter dropped from Information to Debug. Existingstartup.logfiles are not removed automatically and can be deleted. See Logs. - The jingle Duck slider shows the attenuation in dB: The slider previously showed only a percentage, but that percentage is a linear gain multiplier — "10%" actually means −20 dB, noticeably quieter than the label suggests. It now reads both units, e.g.
10% · -20.0 dB. No change to how ducking sounds. See Jingles — Duck level. - The Ducked marker names its cause: The marker previously appeared only for microphone ducking. It now also appears while a jingle is ducking — which matters most for scheduled adverts, where the music drops with no operator action — and its tooltip names the cause, listing all of them when a microphone and a jingle overlap.
- The uninstall survey offers six better-fitting reasons instead of nine. Added "I couldn't get it working / no sound" and "Too complicated to set up", since most uninstalls happen within minutes of first launch and nothing in the old list described that. "Other", "Temporary" and "I'd rather not say" were removed — they absorbed two-thirds of answers without saying anything actionable.
- Less personal data sent and stored: The desktop app no longer sends your computer's name during activation, trial registration or uninstall — machine names are often personal names, and the hardware ID already identifies the device. The licensing server no longer stores IP addresses; the country is still resolved from the request, but the IP itself is discarded.
- The first-run window is wider, shorter and centred: The default was 1100×1300 — narrow enough that the app could open in its mobile layout, and taller than a 1080p screen so it opened clipped. It is now 1280×860 and centred. Saved window positions are unaffected.
- All interface text is translated in every shipped language: The AirPlay, licence-renewal, privacy and DSP text added by this release is available in all 21 languages, along with older screens that still fell back to English — user-management and authentication errors, settings and firewall errors, prayer-time dropdowns, sign-in failures, radio search and favourites, and the accessibility labels on mobile bottom sheets.
Fixed
- The app opened in the mobile layout on high-DPI displays: On displays using Windows scaling (125%, 150%, 200% — the default on most 4K screens), the desktop app opened in its narrow mobile layout with bottom tabs instead of the full desktop interface. MZAP now declares per-monitor DPI awareness, so window sizes are applied in real pixels and text and icons render sharply rather than being upscaled by the OS.
- Permission errors return 403 instead of a server error: With authentication on, any request a user's role did not permit came back as
500 Internal Server Errorrather than403 Forbidden, across every permission check in the API — so a Viewer or Operator saw a generic server failure and could not distinguish a permission problem from a genuine fault. Licence-gated endpoints had the same fault. No request that previously succeeded is affected. See Roles — API behavior by role. - Streaming zones explain their errors and recover when the licence changes: The Error badge now carries the reason — "Streaming requires a license upgrade", "Port 8600 unavailable", "Encoder start failed" — and the reason survives a page reload, where previously a failure during startup left a red badge with no explanation at all. Listen URLs and listener counts are hidden while a zone is in Error or Offline, since nothing is bound to the port. Activating, re-checking, trialling or deactivating a licence now re-realizes streaming zones immediately, without restarting MZAP.
- Streaming zones no longer trigger a false "Devices Offline" warning on load: A workspace containing a streaming zone showed the zone as offline alongside a device entry with a blank name, even though "Load Anyway" restored it correctly. Stream zones are not bound to an audio device and are now skipped by the pre-load device check.
- Clearer errors when cloud text-to-speech is not licensed: Creating or editing an Azure or ElevenLabs TTS jingle used to fail with a generic "TTS synthesis failed" carrying the raw underlying error, because the licence was only checked once synthesis was under way. Both now return a proper "not permitted" response before attempting to synthesize. Editing an existing streaming zone's settings on a licence that no longer covers streaming likewise explains the situation instead of presenting a form that cannot be saved.
- One consistent warning when authentication is off: Settings showed two differently-worded warnings about the same risk — one under Network Access and one under MCP server — which read as two separate problems. Both now show the same message and styling, each still pointing at the nearest place to fix it.
- Deleting a zone, player, or playlist closes its detail view: Deleting from a detail view used to leave you on an empty "no zone selected" page with the deleted item's tab still open. The view now closes itself — the tab is removed on desktop, and mobile returns to the previous screen. Failed deletes no longer close the view, so the error is visible rather than hidden.
- An expired trial no longer re-contacts the licence server on every launch. The activation screen says the trial has ended rather than reverting to the first-run prompt.
- URL streams can use the BASS decoder plugins.
- Streaming zones keep working across workspace loads and rebuilds, meter correctly, and keep the right name after a rename.
v7.1.0.108 — 2026-08-06
Section titled “v7.1.0.108 — 2026-08-06”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}/volumeandPUT /api/players/{id}/volumeaccept a new optionalvolumeDbfield, and zone/player responses include a read-onlyvolumeDb. 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.
v7.1.0.102 — 2026-06-12
Section titled “v7.1.0.102 — 2026-06-12”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
zone2comes beforezone10), 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.
v7.1.0.100 — 2026-06-09
Section titled “v7.1.0.100 — 2026-06-09”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.
v7.0.2.90 — 2026-05-25
Section titled “v7.0.2.90 — 2026-05-25”New
- Library search rebuilt on SQLite FTS5: The Library search box now runs against a full-text index — whole-word matching with
pink*prefixes, booleanAND/OR/NOT,"phrase"andNEAR(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 Acceptedimmediately with ascanId; 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:56trigger 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 rawFileSystemWatcherevents for non-audio files (.DS_Store,desktop.ini, OneDrive/Drive sync touches). Per-file enqueue/scan traces moved fromInformationtoDebug. See Troubleshooting — Logs.
v7.0.2.89 — 2026-05-21
Section titled “v7.0.2.89 — 2026-05-21”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.
v7.0.1.87 — 2026-05-21
Section titled “v7.0.1.87 — 2026-05-21”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.
v7.0.1.86 — 2026-05-21
Section titled “v7.0.1.86 — 2026-05-21”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.
v7.0.1.82 — 2026-05-19
Section titled “v7.0.1.82 — 2026-05-19”New
- Online license tokens and offline
.licfiles are now signed and verified by the desktop app — tampered or forged licenses are rejected. Existing licenses migrate automatically. See Offline Activation.
v7.0.1.81 — 2026-05-17
Section titled “v7.0.1.81 — 2026-05-17”Fixed
- Bug fixes and improvements.
v7.0.1.80 — 2026-05-17
Section titled “v7.0.1.80 — 2026-05-17”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.
v7.0.1.78 — 2026-05-06
Section titled “v7.0.1.78 — 2026-05-06”Improved
- VU meter streaming is now demand-driven: the 100 ms sampling loop starts when the first client subscribes to
/api/stream/levelsand 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.
v7.0.1.77 — 2026-05-03
Section titled “v7.0.1.77 — 2026-05-03”New
- Prayer-time scheduler triggers: A new
Prayer Timetrigger 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.
v7.0.1.76 — 2026-04-29
Section titled “v7.0.1.76 — 2026-04-29”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
ProcessLoopbacklicense feature. See Input Capture for details.
Fixed
- Stopped players no longer auto-recover when restoring a workspace —
LastStopReasonis 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.
v7.0.1.74 — 2026-04-19
Section titled “v7.0.1.74 — 2026-04-19”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
PlayerManagerandStreamHealthMonitorServicelog messages now share a unifiedPlayerprefix for easier log scanning.
v7.0.1.73 — 2026-04-15
Section titled “v7.0.1.73 — 2026-04-15”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.mzapafter using Save As. Auto-save now writes back to the currently loaded workspace file, and only falls back todefault.mzapfor 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.