v0.1.8 - Nightly Build
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
VERSIONfile (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
NSExceptionfrom AVAudioEngine/AUAudioUnit and converts it to SwiftError, so the app no longer crashes on framework-level exceptions. - SamplerEngine:
midiEventBlockis 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
deinitto 32@Observable @MainActorclasses 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
- Download Stori-0.1.8.dmg below.
- Open the DMG and drag Stori to Applications.