Skip to content

v0.1.8 - Nightly Build

Choose a tag to compare

@cgcardona cgcardona released this 06 Feb 03:56
· 136 commits to main since this release
2a12f63

v0.1.8 – Nightly Build

This build includes major stability improvements, a new in-app update system, and numerous audio/MIDI fixes.

📦 In-App Updates

  • New update system: Check for updates from GitHub Releases, with an optional banner, toolbar indicator, and full update sheet (download progress, release notes, install steps).
  • Version is read from the VERSION file (with Info.plist fallback) so the app and update UI stay in sync.
  • Replaces the previous UpdateManager/UpdateAvailableView flow.

🎵 Audio & MIDI

  • Plugins: Hot-swap safety via deferred deallocation; export plugin tail flush; first-note latency fix from lazy plugin init; PDC applied to audio track scheduling.
  • Recording: Dynamic buffer pool with overflow handling; buffer pool exhaustion fix.
  • Mixer: Lock-free metering; mutation coalescing; feedback loop protection and auto-mute; fix for pop when toggling solo/mute.
  • Automation: Smoothing reset on transport start; sample-accurate automation; AutomationProcessor memory fix.
  • MIDI: Scheduler tempo change handling; lookahead scheduling; scheduling robustness.
  • Cycle/loop: Seamless pre-scheduled audio; cycle jump timing.
  • Engine: TrackNodeManager disconnect order and safe track removal; position timer accuracy; health monitor CPU spike fix.
  • Other: Note duration resize, quantize strength, device sample rate change handling, offline MIDI renderer fixes.

🔧 Stability & Crash Fixes

MIDI playback crash (new project → MIDI track → GM instrument → metronome → play)

  • Fixed an uncaught Objective-C exception that could crash the app when starting playback with a GM instrument and metronome enabled.
  • ObjC exception bridge: New helper catches NSException from AVAudioEngine/AUAudioUnit and converts it to Swift Error, so the app no longer crashes on framework-level exceptions.
  • SamplerEngine: midiEventBlock is now guarded—only accessed when the sampler is ready (SoundFont loaded) and attached to the engine; access is wrapped in the exception bridge.
  • MetronomeEngine: Start/stop and player node operations check that the node is still attached to the engine and are wrapped in the exception handler to avoid crashes during graph changes.
  • Protective deinit: Added empty protective deinit to 32 @Observable @MainActor classes to prevent double-free from Swift Concurrency property notification tasks (ASan Issue #84742+).
  • New unit tests cover the crash guards and the ObjC exception bridge.

📋 Installation

  1. Download Stori-0.1.8.dmg below.
  2. Open the DMG and drag Stori to Applications.