Changelog

All notable changes to Modern Meeter are documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.8.1] - 2026-08-04

Added

  • Documentation site — Jekyll-based GitHub Pages site (site/) deployed via .github/workflows/pages.yml
  • Documentation pages in docs/ (installation, usage, architecture, Command Palette extension)

Changed

  • README trimmed to a landing page; detailed content moved to docs/

Fixed

  • Background-thread exceptions are now caught and logged. Previously any managed exception on a non-UI thread crashed the app silently, since Application.UnhandledException only fires for the UI thread. Added AppDomain.UnhandledException logging and TaskScheduler.UnobservedTaskException handling (with SetObserved), which also prevents faulted unawaited tasks from escalating to a crash.

Known Issues

  • Rare fail-fast crash (RPC_E_WRONG_THREAD0xc000027b) inside Microsoft.UI.Xaml.dll (CXamlIslandRoot::GetScreenOffset), triggered when a UI Automation client (assistive technology such as Narrator/Voice Access, or automation tooling) queries an element’s screen bounds while the window is being resized or moved. On-device debugging captured the full native stack — it is entirely within uiautomationcore.dll/Microsoft.UI.Xaml.dll with no app frames, and reproduces on the latest Windows App SDK 1.8.x servicing build, so it is a framework defect rather than app code. The global exception handlers above cannot intercept it (a native fail-fast bypasses managed handlers). Mitigated in practice by the app not driving this path itself; a fix requires the Windows App SDK.

[0.8.0] - 2026-05-13

Added

  • PowerToys Command Palette extension — control VoiceMeeter from CmdPal
    • View all strips and buses with current gain and mute state
    • Toggle mute on any channel directly from the palette
    • Auto-discovery via windows.appExtension in appxmanifest
    • Real-time parameter updates via polling

Changed

  • Split single project into three: ModernMeeter.Core (reusable API), ModernMeeter.CmdPal (extension), ModernMeeter (app)
  • Test project now references Core via ProjectReference instead of shared source compilation
  • Added VS Spell Checker configuration with domain-specific ignored words (meeter, voicemeeter, vban, cmdpal, etc.)

Fixed

  • SetDllImportResolver race condition: two VoiceMeeterClient instances calling Login() concurrently could register the resolver twice
  • CmdPal MixerPage timer and VoiceMeeter connection leaked on extension shutdown (Dispose never called)

[0.7.0] - 2026-03-29

Added

  • Mixer toolbar with Save Settings, Restart Engine, and Touch Mode toggle buttons
  • Touch-friendly mode: stacks channel buttons vertically with larger sizes, tightens level bar gaps, increases nav item height
  • Help page with icon legend for all mixer controls and toolbar actions
  • Vertical level meters flanking the gain slider (L slider R layout)
  • Segoe Fluent Icons for mixer buttons: mute (E74F), solo (E7F6), mono (E71B)
  • Centralized icon glyph resources in App.xaml for single-source updates

Changed

  • Level meters moved from horizontal ProgressBars below slider to vertical bars alongside slider
  • Deploy.ps1 skips uninstall unless registration fails (faster redeployments)
  • Channel labels use TextAlignment="Center" with HorizontalAlignment="Stretch"
  • Bus horizontal template uses invisible spacer to align with strip button row

Fixed

  • Touch mode buttons always vertical in horizontal layout
  • Touch mode navigation disappearing (keeps LeftCompact, just increases item height)
  • Bus horizontal template slider alignment with strip template
  • XAML indentation for FontIcon children in ToggleButtons
  • Invisible spacer size matches actual ToggleButton rendered size (44×44, not 36×36)

[0.6.0] - 2026-03-25

Added

  • Single-instance enforcement via AppInstance.FindOrRegisterForKey — second launch redirects to existing instance and brings window to foreground
  • Custom Program.cs entry point (DISABLE_XAML_GENERATED_MAIN)

Changed

  • Level meter bindings use computed ViewModel properties (LevelLeftPercent/LevelRightPercent) instead of IValueConverter — eliminates ~1,940 boxing allocations/sec
  • Services compile links in test project: 6 individual files → *.cs wildcard
  • MSTest.Sdk version moved from csproj to global.json msbuild-sdks
  • NoWarn in Directory.Build.props uses append pattern

Fixed

  • Autostart toggle: _suppressToggleEvents now wraps the startup task state read, preventing the toggle handler from re-triggering on page load
  • StartupTask manifest: removed unresolved $targetnametoken$ Executable token from uap5:Extension (inherits from Application element)
  • LocalSettingsStore.OnChange overwrites previous listener — now supports multiple listeners with disposable ChangeToken

[0.5.0] - 2026-03-22

Added

  • CHANGELOG.md following Keep a Changelog format
  • Persistent file logging via Microsoft.Extensions.Logging with FileLoggerProvider
  • Directory.Build.props centralizing 10 shared MSBuild properties
  • Directory.Packages.props for NuGet Central Package Management
  • 3 new tests for SaveHiddenChannels and re-entrancy guard (672 total)

Changed

  • Refactored static SettingsService to Microsoft.Extensions.Options (IWritableOptions<AppSettings> + LocalSettingsStore)
  • Switched from custom LogService to Microsoft.Extensions.Logging with DI-injected ILogger<T>
  • Test logging uses TestContextLoggerProvider routing to MSTest’s TestContext.WriteLine
  • Build commands: solution builds without -p:Platform (slnx handles platform mapping)
  • Removed orphaned LevelMeter control (superseded by ProgressBar approach)
  • Removed unused MacroButton P/Invoke declarations

Fixed

  • MixerViewModel.Connect race condition — added re-entrancy guard
  • MixerViewModel.OnParamTick missing null layout guard
  • MidiViewModel: per-tick buffer allocation (reuse field-level buffer)
  • MidiViewModel: O(n²) RemoveAt(0) collection trim (batch removal)
  • VoiceMeeterClient: per-call buffer allocation in GetParameterString
  • VoiceMeeterClient: ExtractAnsiString edge case when buffer has no null terminator
  • LocalSettingsStore: thread safety for concurrent reads/writes
  • MidiBindingsPage: 4 bool→Visibility bindings missing BoolToVisibilityConverter
  • MixerPage horizontal template: 5 buttons missing ToolTip
  • SettingsPage: silent catch blocks now log exception messages
  • Deploy.ps1: TFM lookup for Directory.Build.props, DNS logging, subnet validation, WinRM pre-check
  • MidiMessageItem.Parse: pre-size list capacity to avoid resizing
  • Redundant RegexOptions.Compiled on [GeneratedRegex]
  • Dead _ManifestPath MSBuild property removed
  • Incremental build support for RemoveWinAppRuntimeDependency target

[0.4.0] - 2026-03-19

Added

  • Self-contained deployment — builds bundle .NET runtime, no framework install required
  • VoiceMeeter install detection with download links when DLL not found
  • Navigation items hidden when disconnected (only Mixer and Settings visible)
  • Auto-navigate back to Mixer when disconnected from a hidden page

Changed

  • Project restructured: app source in src/, tests in tests/
  • Deploy.ps1 updated for new layout, PS 5.1 compatibility, and self-contained builds

Fixed

  • Release build crash caused by PublishAot trimming reflection metadata
  • Settings toggles broken in Release (DataContext propagation in SettingsCard)
  • Combined/horizontal layout modes not activating from Settings
  • Remote deployment: proper package full name for uninstall, auto-uninstall before redeploy
  • Deploy.ps1 handling of RID subdirectory for self-contained output

[0.3.0] - 2026-03-15

Added

  • MIDI Bindings page — read VoiceMeeter’s MIDI mapping configuration (270 slots, 13 categories)
  • Audio level meters (L/R ProgressBars) on all channel cards in all layouts
  • Launch at startup (MSIX StartupTask)
  • Window position and size persistence between sessions
  • Adaptive horizontal layout — buttons stack vertically when cards are tall
  • Version info in Settings (app version, .NET runtime, Windows App SDK)
  • GitHub repository link in Settings
  • Third-party library credits with license info
  • 217 new tests (459 → 676 total)

Changed

  • Switched from CommunityToolkit Ioc.Default to standard .NET IServiceProvider
  • MIDI page split: Live Monitor stays on MIDI page, Bindings moved to dedicated page

Fixed

  • Horizontal mode button overflow — reduced button sizes and increased minimum card width
  • Settings page not showing connection state on navigation
  • WMC1510 XAML trim warnings suppressed at project level

[0.2.0] - 2026-03-15

Added

  • VBAN page — view and toggle all 8 inbound/outbound VBAN streams
  • MIDI monitor — live MIDI message display at 30fps
  • Horizontal layout mode with full-height cards
  • Combined view — all channels in a single grid
  • Audio engine restart command
  • Save VoiceMeeter settings on close option
  • App icon with unplated target-size assets
  • Back button in custom title bar
  • Remote deployment via WinRM and WinAppDeployCmd (PIN pairing)
  • Device discovery for remote deployment

Changed

  • Migrated to .NET dependency injection (IServiceProvider)
  • Settings refactored into SettingsService + SettingsViewModel

[0.1.0] - 2026-03-15

Added

  • Mixer page with vertical gain faders, mute/solo/mono toggles
  • Adaptive grid layout that wraps cards based on window width
  • Channel visibility — show/hide individual strips and buses
  • Bus routing support per strip
  • Custom title bar with Mica backdrop
  • Left NavigationView with Settings page
  • Auto-connect on startup
  • Theme selection (system/light/dark) with persistence
  • 309 unit tests with FakeVoiceMeeterClient
  • Deploy.ps1 for local MSIX loose-file registration
  • Native AOT compatible P/Invoke via LibraryImport
  • Registry-based DLL resolver for VoiceMeeter installation