From ddc497a91f83fb0e2ce019ce97dcb929ef1e531d Mon Sep 17 00:00:00 2001 From: Tretzi Date: Sat, 11 Apr 2026 12:01:03 -0500 Subject: [PATCH] Auto commit (MindMachine) Sat Apr 11 12:01:03 PM CDT 2026 --- .../main/java/com/mindmachine/mvp/MainActivity.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/mindmachine/mvp/MainActivity.kt b/app/src/main/java/com/mindmachine/mvp/MainActivity.kt index 35c24b1..148abfa 100644 --- a/app/src/main/java/com/mindmachine/mvp/MainActivity.kt +++ b/app/src/main/java/com/mindmachine/mvp/MainActivity.kt @@ -812,14 +812,25 @@ private fun rememberSplitFlashFrame( return@produceState } + // Lock the sequencer's time base to Compose's frame clock. + // Mixing System.nanoTime() (start) with withFrameNanos() (updates) can introduce + // an arbitrary offset that looks like irregular intervals. val sequencer = SplitFlashSequencer( - startTimeNanos = System.nanoTime(), + startTimeNanos = 0L, flashOnMs = latestFlashOnMs.value, flashOffMs = latestFlashOffMs.value, ) + var started = false + while (true) { withFrameNanos { frameTimeNanos -> + if (!started) { + // Initialize phaseStartNanos to the first real frame timestamp. + // This keeps phase transitions aligned to the same monotonic clock. + sequencer.frameAt(frameTimeNanos) + started = true + } sequencer.updateIntervals(latestFlashOnMs.value, latestFlashOffMs.value) value = sequencer.frameAt(frameTimeNanos) }