{
  "version": "v1.9.9",
  "url": "https://download.audiomap.io/AudioMap-v1.9.9.dmg",
  "release_notes": "Hotfix — restores the macOS microphone permission prompt on Tahoe (macOS 15) for fresh installs.\n\n### Bug Fixes\n\n- **Mic permission prompt restored on macOS Tahoe / 15** — fresh installs of 1.9.7 and 1.9.8 silently failed to ask for microphone access on Tahoe. No prompt fired, capture stayed dead, and there was no obvious way to grant permission from inside the app. 1.9.9 restores the prompt. If you're already running 1.9.7 or 1.9.8 on Tahoe and never saw the mic prompt, install 1.9.9 and you'll be prompted on first capture — no other action needed.\n\n### Notes\n\n- If you previously denied a (never-fired) mic prompt and macOS cached the denial, run `tccutil reset Microphone com.AudioMap.AudioMap` in Terminal once before launching 1.9.9, then start AudioMap and approve the prompt. The vast majority of users won't need this — install and launch is enough.\n\n---\n",
  "release_history": [
    {
      "version": "v1.9.9",
      "date": "2026-05-04",
      "notes": "Hotfix — restores the macOS microphone permission prompt on Tahoe (macOS 15) for fresh installs.\n\n### Bug Fixes\n\n- **Mic permission prompt restored on macOS Tahoe / 15** — fresh installs of 1.9.7 and 1.9.8 silently failed to ask for microphone access on Tahoe. No prompt fired, capture stayed dead, and there was no obvious way to grant permission from inside the app. 1.9.9 restores the prompt. If you're already running 1.9.7 or 1.9.8 on Tahoe and never saw the mic prompt, install 1.9.9 and you'll be prompted on first capture — no other action needed.\n\n### Notes\n\n- If you previously denied a (never-fired) mic prompt and macOS cached the denial, run `tccutil reset Microphone com.AudioMap.AudioMap` in Terminal once before launching 1.9.9, then start AudioMap and approve the prompt. The vast majority of users won't need this — install and launch is enough.\n\n---\n"
    },
    {
      "version": "v1.9.8",
      "date": "2026-05-04",
      "notes": "Patch release — sine sweep capture now matches pink noise, plus ESS smoothing parity and a reflection-timing accuracy fix on the spatial side.\n\n### What's New\n\n- **Sine sweep measurements now match pink noise**: in 1.9.6 we shipped exponential sine sweep capture as Beta, with the caveat that it had a magnitude offset against pink-noise measurements on the same loudspeaker and room. 1.9.8 closes that gap. The sweep transfer function is now derived using a two-channel measured-reference deconvolution instead of being inferred from the impulse response alone. The result: sweep and pink-noise traces of the same source now overlay where they should. The accuracy issue that earned ESS the Beta tag is fixed; we're keeping the Beta badge in place for one more release while we observe how it performs across a wider range of setups, but on the math side sweep and pink-noise now produce equivalent transfer functions for the same source.\n\n### Improvements\n\n- **ESS captures now respect your smoothing settings** — sine sweep captures used to ignore the frequency- and phase-smoothing settings from Processing Settings, producing raw/combed traces in the Measure tab alongside heavily-smoothed pink-noise traces of the same source. Saved sweep measurements now inherit the live smoothing configuration, matching the pink-noise path.\n- **More accurate Forward Model reflection predictions** — predicted reflection arrival times in the Forward Model are now computed in the correct reference frame (relative to the direct sound), restoring expected behaviour in the room-inference path.\n\n### Notes\n\n- If you tried sine sweep capture in 1.9.6 or 1.9.7 and saw a magnitude offset against pink-noise traces, try it again on 1.9.8 — the structural cause is fixed.\n\n---\n"
    },
    {
      "version": "v1.9.7",
      "date": "2026-05-03",
      "notes": "Patch release — save reliability fix on macOS for folders previously blocked by the App Sandbox, plus a handful of spatial / wizard / capture polish items.\n\n### What's New\n\n- **Save anywhere on macOS**: AudioMap can now save projects, exports, and settings to any folder you choose — including locations that the macOS App Sandbox previously restricted access to. If you ever ran into a save failure or \"permission denied\" on an otherwise normal folder, this release resolves that whole class of issue.\n\n### Improvements\n\n- **Compact spatial plot** — the unfulfilled-targets indicator no longer shows on the small spatial plot, so the compact view stays uncluttered when you're focused on the main display.\n- **Setup Wizard** — the verification button is now always active rather than gated behind earlier wizard state, and the default action on the verification step is **Skip** so you can move forward without hunting for the right button. Smoother first-run flow.\n- **Coverage radius default** — the default coverage radius for new measurement sets is now derived consistently from the actual geometry of your sources, both on initial wizard setup and when you adjust source positions afterward. No more stale defaults from earlier sessions.\n- **Capture-mode plumbing** — the toolbar generator dropdown is fully wired through to the TF capture engine. Switching the generator type from the toolbar updates capture mode end-to-end, completing the unification work that started in 1.9.6.\n\n### Bug Fixes\n\n- **Trilateration during auto-capture** — fixed an issue where the X coordinate of a measurement could get stuck (not update) under certain auto-capture conditions, leaving the position estimate locked to its starting value.\n\n### Notes\n\n- **One-time auto-migration on first launch (macOS)**: when you first launch 1.9.7, AudioMap will quietly migrate your license, projects, and preferences out of the previous sandboxed container into your normal user folders. This is automatic and runs once — your settings, license, and saved projects all carry over, and no action is needed on your part. After migration, AudioMap reads and writes from the same locations any other Mac app would.\n\n---\n"
    },
    {
      "version": "v1.9.6",
      "date": "2026-04-29",
      "notes": "Patch release — sine sweep capture mode promoted to Beta with reliability fixes, expanded SPL display layouts on the RTA tab, smoother RTA bar overlay, in-app chat upgrades, and a handful of crash and stability fixes.\n\n### What's New\n\n- **Sine sweep capture (Beta)**: the exponential sine sweep mode is now flagged Beta in the signal-generator dropdowns. We've stabilised the workflow — IR alignment is anchored to the cross-correlation result so it can no longer drift onto a late reflection, sources reliably reset to Pink Noise after a sweep finishes, and the visual artifacts that could appear during a sweep are fixed. Stick to Pink Noise for production measurements; treat sweeps as work-in-progress.\n- **In-app chat — images, typing & read receipts**: the support chat panel now lets you paste or attach screenshots, shows a typing indicator while you compose, and surfaces delivered (✓) and read (✓✓) ticks once support has seen your message.\n\n### Improvements\n\n- SPL Display (RTA tab) — the grid now picks its column count from the actual aspect ratio of the panel, so a tall, narrow panel doesn't try to cram every meter into one row. The SPL section is stacked above the RTA frequency plot for a more natural top-to-bottom reading order.\n- SPL Display (RTA tab) — the RTA sidebar gains an expand/collapse control for the SPL container, so you can give the meters more room when you need them and tuck them away when you don't. Expanded meters match the styling, theme, and sizing of their collapsed counterparts. Expanding or collapsing no longer scrambles your column arrangement.\n- SPL Display (RTA tab) — each meter now has its own three-dot hover menu for per-display settings, anchored to the top-left corner. Hovering reliably reveals the button across rapid mouse movement.\n- SPL Display (SPL tab) — sidebar now matches the RTA sidebar's scrollable container behaviour and resize handling, so meters behave consistently regardless of which tab you're working in.\n- RTA — bar-mode RMS overlay is now drawn with a Catmull-Rom spline rather than straight segments, giving a smoother visual response while still tracking the bars exactly.\n- Capture-mode plumbing — the toolbar generator dropdown is now the single source of truth for which capture mode is active. Switching generator type from the toolbar updates the capture engine consistently — no more mismatch between what the dropdown shows and what's actually being captured.\n\n### Bug Fixes\n\n- Fixed a rare crash that could occur when a delay measurement completed off the audio thread — the delay display now updates safely on the message thread.\n- Fixed a related crash where downstream subscribers of internal delay-measurement events could be invoked on the wrong thread.\n- Fixed icon rendering — chevron up/down arrows now render visibly at small sizes, and the SPL cluster chevron no longer sits on top of the layout dropdown button.\n- Fixed: the per-meter three-dot hover button on expanded SPL displays now appears reliably on hover, even with rapid mouse movement.\n\n### Notes\n\n- macOS crash reporting is now wired through Sentry. Crashes that previously vanished with the process are captured for triage. No personal data is sent — only the crash stack and basic environment info, and you can opt out of telemetry to disable it entirely.\n\n---\n"
    },
    {
      "version": "v1.9.5",
      "date": "2026-04-28",
      "notes": "Patch release — measurement-preservation fix on license activation, project-load polish, RTA SPL display fixes, and a smarter 4-meter SPL layout.\n\n### Bug Fixes\n\n- Fixed: activating a license (or loading a project immediately after activation) no longer silently clears your measurements. The sidebar now keeps the source/receiver counts that were active before activation instead of resetting them to zero.\n- Fixed: the license activation window no longer hides behind other dialogs.\n- Fixed: loading a project no longer briefly flashes a phantom coverage ring around the origin. Saved measurement targets are now trusted on load instead of being regenerated from scratch.\n- Fixed: the RTA tab's \"SPL Display\" layout now updates live with audio activity (was frozen at -100 dB), respects your current theme, refreshes when meters are added or removed via the sidebar, and no longer crashes when removing the last SPL meter.\n\n### Improvements\n\n- SPL tab — with 4 meters in a medium-wide section, the default layout is now 3 across with 1 long meter underneath, instead of cramming all 4 into a single tight row.\n\n---\n"
    },
    {
      "version": "v1.9.4",
      "date": "2026-04-28",
      "notes": "Hotfix for v1.9.3 — addresses a Save As regression on macOS folders that require user permission.\n\n### Bug Fixes\n\n- Fixed: \"Save As\" to Desktop, Documents, Downloads, or iCloud Drive on macOS no longer shows a false \"no permission\" error when permission has actually been granted. Errors that do occur now report the specific cause (read-only volume, disk full, missing destination, etc.) instead of a generic \"Failed to write project data\" alert.\n\n---\n"
    },
    {
      "version": "v1.9.3",
      "date": "2026-04-28",
      "notes": "### Improvements\n\n- Diagnostic Save As errors are now self-explanatory — when a save fails (permissions, full disk, locked file), the alert tells you exactly which step failed instead of a generic \"failed to write\" message, with a pre-flight check before writing.\n- macOS folder permission prompts — saving to Desktop, Documents, or Downloads now triggers macOS's standard permission prompt the first time, eliminating silent failures on stricter system configurations.\n- Smoother heatmap updates during high-rate measurement activity, with stale-display gaps closed when sources or receivers are moved.\n- New measurement sets size their coverage radius based on actual distances between your sources instead of a fixed default.\n- Starting a new project now resets capture sources to Pink Noise. Custom source types you've configured during a session still persist through the ESS sweep phase.\n- Toolbar buttons no longer overflow when the window is sized down to ~1328 px wide; Home and Settings now reliably route to the Startup Screen and Setup Wizard.\n\n### Bug Fixes\n\n- Additional 3-source gain-spread reliability hardening — caught and fixed an edge case where the timing walk could read a stale cache entry instead of the fresh sync result, improving consistency in high-asymmetry capture scenarios.\n- Fixed rare crashes on the Measure tab during automatic background saves.\n- Fixed rare crashes in transfer-function visualisation under heavy concurrent processing.\n- Fixed a crash that could occur when typing into newly-emptied text fields (covers several text-entry edge cases).\n- Hardened internal measurement-access API to prevent a class of crash seen on macOS 1.9.2.\n- Diagnostic log files no longer corrupt entries during high-frequency concurrent writes.\n\n---\n"
    },
    {
      "version": "v1.9.2",
      "date": "2026-04-25",
      "notes": "### Improvements\n\n- Refreshed first-time startup screen with two large cards — Create New Project and Explore Sample Project — so it's clearer where to begin.\n- Help Us Improve consent dialog now appears on first auto-capture instead of first launch, giving the choice context instead of arriving cold.\n- Manage License screen no longer clips its bottom buttons on smaller displays.\n- Onboarding overlay highlights now align correctly with toolbar buttons regardless of window size.\n\n### Bug Fixes\n\n- Fixed the remaining 3-source measurement reliability issue with high gain asymmetry. With a wide gain spread (12 dB), the weakest source now resolves correctly on every capture — no more re-triggering. (Resolves the v1.9.1 known issue.)\n- Fixed a sticky crosshair cursor on plot components that did not reset when leaving the plot area.\n\n### Notes\n\nThis release closes the v1.9.1 known issue around 12 dB gain-spread 3-source measurements.\n\n---\n"
    },
    {
      "version": "v1.9.1",
      "date": "2026-04-24",
      "notes": "### Improvements\n\n**Faster Measurement Captures**\n\nMulti-source delay measurements now commit as soon as the timing converges instead of waiting out a fixed window — typical 3-source captures complete roughly twice as fast.\n\n### Bug Fixes\n\n- Fixed delay measurements at 44.1 kHz reporting 0.00 ms on the first capture after launch — both single-source and multi-source configurations are now reliable. (Resolves the v1.9.0 known issue.)\n- Improved 3-source measurement reliability when one source is significantly quieter than the others. Tests with an even gain spread now pass consistently. With a wide gain spread (12 dB asymmetry), the weakest source now resolves correctly in most captures — re-trigger if a single source comes back as 0.00 ms. A complete fix is targeted for 1.9.2.\n- Fixed delay measurements reading incorrect values (around -40 ms) in Single Reference and Virtual Reference modes when round-trip latency had not yet been calibrated — the app now falls back to the device-reported latency until calibration is run.\n- Fixed round-trip latency calibration not persisting across app restarts — once you calibrate, the value is remembered.\n- Improved first-capture reliability across the board — eliminates several rare race conditions that could cause incorrect delay readings on the first measurement after launch or after audio device changes.\n\n### Notes\n\nThe 3-source gain-spread improvement is a partial fix shipped early because it cleanly resolves the more common scenarios. The remaining edge case (very high asymmetry, weakest source) is under investigation for 1.9.2.\n\n---\n"
    },
    {
      "version": "v1.9.0",
      "date": "2026-04-20",
      "notes": "### What's New\n\n**Redesigned Analysis Page**\n\nThe Analysis tab is now organised into three toggleable sections — Heatmap, Room, and Directivity — all driven by a single shared frequency slider at the top of the page.\n\n**Directivity All-Sources View**\n\nWith no source selected in Directivity, you now see every speaker's radiation pattern stacked side-by-side. Select one to drop into the detailed polar, sonogram, and 3D views.\n\n**Demo Mode**\n\nA new Home button in the toolbar loads a realistic pre-built project, so you can try AudioMap without any hardware. Project files are now gzipped as well — smaller and faster to load.\n\n**Window State Persistence**\n\nAudioMap now remembers your window size and position between sessions. The first launch after updating opens maximised.\n\n**Cleaner Measure Sidebar**\n\nThe Measure tab's sidebar has been consolidated to just Measurements and Analysis, with less nesting and scrolling.\n\n### Improvements\n\n- EQ bands within a TuningSet now use staggered hues per tuning, so bands from different tunings are easier to distinguish on the plot (existing projects migrate automatically on open)\n- Target Curve moves to the end of the plot list when \"Include in EQ Bands\" is off\n- \"Tuning Plots\" section header removed from the tuning sidebar\n- Tuning sidebar disclosure triangles unified with the chrome used elsewhere in the app\n- Target curve bypass button widened to match the slider textbox below it\n- Disclosure triangles across the app are now tonally muted for a calmer visual hierarchy\n- Live repaint is now intrinsic to the Heatmap DataMode — the separate Live Data toggle has been removed\n- Setup Wizard welcome page renamed to \"AudioMap Guided Setup\"\n- Default sidebar ratio adjusted from 25% to 22%, leaving more room for graphs out of the box\n\n### Bug Fixes\n\n- Fixed a crash on quit involving the updater framework\n- Fixed a crash that could occur during startup screen dismissal\n- Fixed the Analysis-page frequency slider not updating the spatial heatmap\n- Fixed the Heatmap section toggle not taking effect in 3D mode\n- Fixed Directivity all-sources rows not rendering until interaction on initial project load\n- Fixed overlap between Room and Directivity sections when both were visible\n- Fixed trailing blank space below the Heatmap and Room sections on the Analysis page\n- Fixed first-capture measurement reliability — eliminates rare \"no signal detected\" errors when starting measurements before the loopback signal has stabilised\n- Fixed an intermittent 512-sample offset in multi-source delay measurements under specific source-order conditions\n- The app now warns clearly when Filament 3D rendering is enabled but the required distribution is missing, instead of failing silently\n\n### Notes\n\nWindow state is new in 1.9.0 — the first launch after updating opens maximised, then your size and position are remembered going forward.\n\n### Known Issues\n\n- Delay measurements at 44.1 kHz sample rate can report 0.00 ms instead of the correct value — both single-source and multi-source configurations are affected. Use 48 kHz (or a multiple) for reliable timing measurements in this release; a fix is planned for 1.9.1.\n- If you abort a measurement twice in quick succession and then start a new one, the measurement may stall waiting for internal sync. Pause briefly between abort and restart, or relaunch if it persists.\n\n---\n"
    }
  ]
}
