Repository navigation
Fix play-button crash: only sync-start stems once a render clock exists - #80
Merged
sanylax0 merged 1 commit intoJul 18, 2026
Conversation
The shared host-time anchor introduced for stem start sync used play(at:) unconditionally; on the very first start after the engine is built the player node has no render clock yet, and play(at:) throws the AVFAudio start-time exception — crashing on the play button. Anchor to the node's own lastRenderTime when it's host-time valid, and fall back to plain play() (the pre-sync behavior) on a cold start.
sanylax0
approved these changes
Jul 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Fixes the crash on pressing play introduced by #77. The stem-sync change called
play(at:)with a host-time anchor unconditionally — but on the very first start after the engine is built, the player node hasn't seen an IO cycle and has no render clock, andplay(at:)throws the AVFAudio start-time exception. The crash lands immediately after the session-activation log line, which is the last thing printed before the deck starts.How
Deck.play()now anchors the shared start to the node's ownlastRenderTimeonly when it's host-time valid; on a cold start it falls back to two plainplay()calls — the exact pre-#77 behavior (where the back-to-back calls on a freshly started engine land on the same quantum in practice). Pause→resume and post-seek starts, where drift was actually observed, still get the synchronized start.Testing
Please confirm on device: press play on a stem-separated track right after launch (previously crashing), then pause/resume mid-track.
🤖 Generated with Claude Code
https://claude.ai/code/session_013TJoWkqg8bzkGdzxWhWjWP
Generated by Claude Code