Skip to main content
Support

MultiMon Changelog

Every version, every change — transparent by design.

MultiMon follows Keep a Changelog format and Semantic Versioning. Builds and full release notes are published on GitHub Releases, and the source and history are public at github.com/Fiavaion/MultiMon.

1.0.0 Latest

MultiMon 1.0 — Windows

The first stable release of MultiMon, available for Windows and macOS (Apple Silicon). Four perform modes, HAP and HAP Q decode written from scratch, H.264 and HEVC playback, an inline audio mixer and .mmproj project files, all driven by a single master clock.

Added

  • macOS — a native port on Apple Silicon (macOS 14+): Metal render core, HAP and VideoToolbox decode, CoreAudio output, Avalonia control panel, display refresh matching and a performance readout. Intel Macs are deferred to 1.1.
  • Four perform modes — Span (one source sampled across every display detected, an equal share per screen), Individual (one source per monitor, with an optional Sync (frame-lock same-length clips) checkbox), Hap (one HAP clip per monitor, all on the one shared clock) and Split (one source cut into a rows-by-columns grid, 2x2 by default or derived from the screen count, with each output mapped to a cell by row,col).
  • HAP and HAP Q decode written from scratch — RGB DXT1 (BC1) for plain HAP, RGBA DXT5 (BC3) for HAP Alpha, scaled YCoCg DXT5 (BC3) plus a YCoCg pixel shader for HAP Q, BC7 for the RGBA BPTC variant and BC4 for the HAP Q Alpha plane. No third-party HAP library.
  • H.264 and HEVC playback — on Windows these decode through Media Foundation, using hardware decode with an automatic fallback to software decode. Containers accepted: mp4, mov, mkv and avi.
  • Inline audio mixer — a master fader and mute, an Add audio button for standalone stems, and per-track volume, pan, mute, solo and remove, all clocked to the same master timeline that drives the video. One AUDIO DEVICE dropdown applies to every track. On Windows, output runs through WASAPI in shared mode.
  • One master clock — every source shows the nearest frame at or before master time, dropping or repeating frames rather than adjusting speed or re-seeking.
  • Project files — monitor assignments, sources and mode saved as .mmproj (JSON, schema version 2); version 1 files are migrated automatically on open.
  • Convert to HAP — transcodes a source to HAP into a mov container through FFmpeg, which must be on your PATH and is not bundled.
  • Identify screens — numbered overlays on every display, hidden automatically on entering perform mode.
  • Device-removed recovery — a lost graphics device is detected, the device and its resources are rebuilt, and playback resumes from the master clock.

Known limitations

  • The Windows build is unsigned, so SmartScreen warns on first run: choose More info, then Run anyway. Code signing is planned.
  • Convert to HAP resolves FFmpeg from PATH. Install FFmpeg only from a source you trust.
  • Media paths inside a project file, including UNC paths, are used as written. Only open .mmproj files you created.
  • Per-link audio mixer overrides set within a perform session are not persisted to the project file.
1.0.0-rc.1-mac

MultiMon 1.0.0-rc.1 — macOS (Apple Silicon)

The full macOS port: a Metal render core, HAP and VideoToolbox decode, CoreAudio output, an Avalonia control panel, display refresh matching and a performance readout. Requires macOS 14 or later on Apple Silicon.

Download for macOS (Apple Silicon DMG) ↓

Known limitations

  • Signed with a Developer ID but not yet notarized — on first launch, right-click the app and choose Open, or run xattr -dr com.apple.quarantine /Applications/MultiMon.app.
  • Intel Macs are deferred to 1.1.
1.0.0-rc.1

First release candidate — the ground-up rebuild

The first release candidate of the MultiMon rebuild. The previous WPF video-playback implementation is replaced in its entirety by a persistent Direct3D 11 pipeline, Media Foundation decode and a from-scratch HAP decoder.

Download for Windows (x64) ↓

Added

  • Persistent Direct3D 11 pipeline — one device and one swapchain per monitor, created once at application start and reused for the whole session. Entering and leaving perform mode shows and hides windows; it never recreates the device, swapchains, shaders or pipeline state.
  • Media Foundation decode — H.264 and HEVC hardware decode bound to the application DXGI device manager, with automatic software-decode fallback when hardware decode is unavailable.
  • HAP and HapQ playback — vendored MOV atom parser, Snappy chunk decompression, BCn (BC1/BC3/BC7) compressed-texture upload and a HapQ YCoCg-to-RGB pixel shader. No third-party HAP library.
  • Three perform modes — Span (one source across all monitors, an equal share per screen), Individual (one source per monitor) and Split (one source divided into a configurable rows-by-columns grid of outputs).
  • WASAPI audio — raw shared-mode output per device, clocked to the QPC-based master timeline; an audio track is linked to a video slot only when it is audible.
  • Master volume and mute owned by the performance controller, so they persist across engine rebuilds and between perform cycles.
  • Project I/O — monitor assignments, source bindings, mode and audio routing saved and loaded as .mmproj files (schema version 2).
  • Convert to HAP dialog — transcodes a source file to HAP through an external FFmpeg process, surfacing probe and metadata faults with progress tracking.
  • Identify screens — numbered overlays on every monitor, auto-hidden on perform entry.
  • Device-removed recovery — device loss is detected on present or decode, the device and all resources are rebuilt, and playback resumes from the master clock.
  • Multi-adapter support — a single device with cross-adapter present; output windows on a secondary adapter are composited by the desktop compositor. Verified on an AMD plus NVIDIA box.
  • Headless stress harness — an enter-perform / exit-perform cycle runner with Direct3D 11 debug-layer live-object tracking, wedge detection, and flags for cycle count, window count, fullscreen, mode, HAP, audio, injected device loss, forced software decode and pause.
  • File logging with rotation, a startup banner capturing GPU, monitor inventory and feature level, plus global crash handlers and a present-rate watchdog for remote diagnostics.
  • GPU texture-format gating — a HAP clip whose BCn format the GPU does not report support for is handed to Media Foundation instead of failing.

Fixed

  • Multi-output pause freeze in Individual mode — each source exhausted its hardware decoder output-sample pool on pause, killing the decode thread on resume. The frame-timeline depth is now capped.
  • Teardown timeout on a multi-output rig — the same sample-pool exhaustion left decode threads blocked at shutdown; resolved by the same depth cap.
  • Span mode now divides equally per screen regardless of pixel-resolution differences between monitors.
  • Audio garble after re-entering perform mode — clock reset and WASAPI re-baseline corrected.
  • Master volume and mute were reset to defaults on every audio-engine rebuild; ownership moved to the performance controller.
  • FFmpeg arguments are passed as discrete elements rather than a hand-quoted string, closing an argument-injection path.
  • A Media Foundation startup ref-count leak when audio source configuration threw.
  • Cross-thread state notifications from the controller are marshalled to the UI dispatcher before updating bound properties.
  • An unhandled exception escaping the Convert-to-HAP click handler could crash the application.
  • Perform hotkey registration failures are now reported to the user instead of failing silently.
  • Teardown joins its thread with a hard timeout at exit, so a wedged teardown can no longer freeze the process.
  • Present-model wedge under a raised system timer — moved to a waitable swapchain to eliminate render-loop stalls.
  • Untrusted HAP / MOV / Snappy files are size-checked before allocation, preventing a crafted file from exhausting memory in the decode thread.
  • Convert-to-HAP probe and metadata failures are surfaced in the dialog instead of stalling silently.
  • A harness false positive in windowed span mode — test rects are now tiled non-overlapping.

Known limitations

  • The real Intel (QuickSync) acceptance run is not yet complete, and software rasterisation cannot emulate it. The hardware go/no-go gate — a multi-vendor four-plus-screen rig, real Intel hardware and a live audio device-pull — remains open. This build should not be tagged v1.0.0 until it passes.
  • The build is unsigned, so Windows SmartScreen warns on first run: choose More info, then Run anyway.
  • Convert to HAP resolves ffmpeg from PATH without filtering world-writable directories. Install FFmpeg only from a trusted source.
  • Project file media paths, including UNC paths, are accepted as-is. Only open project files you created.
  • Per-link audio mixer overrides set within a perform session are not persisted to the project file.
  • Live audio device-pull mid-show is implemented and harness-verified, but a live confirmation on the multi-output rig is still pending.

Superseded: the 1.0.0 entry above is the tagged stable release, so the tagging caveat in this entry no longer applies.

Before 1.0.0-rc.1

There are no earlier released versions of this codebase. MultiMon was rebuilt from the ground up, and the pre-release history is a sequence of internal milestones, each closed by a verified checkpoint rather than a public build. Three checkpoints gated the rebuild:

Checkpoint Gate
Checkpoint A One video on one monitor, 50 open/close cycles with no live-object growth
Checkpoint B Several monitors in sync, 50 cycles, no desync beyond a single frame
Checkpoint C All modes plus audio and project I/O — the full ship gate, reached at 1.0.0-rc.1