Auto commit Sun Mar 22 12:01:01 AM CDT 2026
This commit is contained in:
@@ -53,6 +53,7 @@ import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.produceState
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.runtime.withFrameNanos
|
||||
import androidx.compose.ui.Alignment
|
||||
@@ -82,7 +83,7 @@ import com.mindmachine.mvp.domain.SessionMode
|
||||
import com.mindmachine.mvp.session.FlashColor
|
||||
import com.mindmachine.mvp.session.MainViewModel
|
||||
import com.mindmachine.mvp.session.SplitFlashFrame
|
||||
import com.mindmachine.mvp.session.computeSplitFlashFrame
|
||||
import com.mindmachine.mvp.session.SplitFlashSequencer
|
||||
import com.mindmachine.mvp.session.flashIntervalMsToSeconds
|
||||
import com.mindmachine.mvp.session.flashIntervalSecondsToMs
|
||||
import com.mindmachine.mvp.session.sessionProgressFraction
|
||||
@@ -204,8 +205,10 @@ fun App(vm: MainViewModel = viewModel()) {
|
||||
SetupScreen(
|
||||
vm = vm,
|
||||
onStart = {
|
||||
vm.startSession()
|
||||
nav.navigate("active")
|
||||
val started = vm.startSession()
|
||||
if (started) {
|
||||
nav.navigate("active")
|
||||
}
|
||||
},
|
||||
onHolder = { nav.navigate("holder") },
|
||||
)
|
||||
@@ -223,8 +226,10 @@ fun App(vm: MainViewModel = viewModel()) {
|
||||
ui.selectedPreset.name
|
||||
) {
|
||||
Button(onClick = {
|
||||
vm.startSession()
|
||||
nav.navigate("active")
|
||||
val started = vm.startSession()
|
||||
if (started) {
|
||||
nav.navigate("active")
|
||||
}
|
||||
}) { Text("Repeat Session") }
|
||||
OutlinedButton(onClick = { nav.navigate("home") { popUpTo(0) } }) { Text("Return Home") }
|
||||
}
|
||||
@@ -313,6 +318,7 @@ fun SetupScreen(
|
||||
SetupTimelineEditor(
|
||||
state = ui.timeline,
|
||||
onStateChanged = vm::updateTimeline,
|
||||
onCurveGranularityChanged = vm::setCurveGranularitySec,
|
||||
)
|
||||
|
||||
TextButton(onClick = onHolder) { Text("Holder Guidance") }
|
||||
@@ -503,14 +509,27 @@ private fun rememberSplitFlashFrame(
|
||||
mode: SessionMode,
|
||||
flashOnMs: Int,
|
||||
flashOffMs: Int,
|
||||
) = produceState(initialValue = SplitFlashFrame(FlashColor.BLACK, FlashColor.BLACK), isRunning, mode, flashOnMs, flashOffMs) {
|
||||
if (!isRunning || mode == SessionMode.AUDIO_ONLY) {
|
||||
value = SplitFlashFrame(FlashColor.BLACK, FlashColor.BLACK)
|
||||
return@produceState
|
||||
}
|
||||
while (true) {
|
||||
withFrameNanos { frameTimeNanos ->
|
||||
value = computeSplitFlashFrame(frameTimeNanos, flashOnMs, flashOffMs)
|
||||
): androidx.compose.runtime.State<SplitFlashFrame> {
|
||||
val latestFlashOnMs = rememberUpdatedState(flashOnMs)
|
||||
val latestFlashOffMs = rememberUpdatedState(flashOffMs)
|
||||
|
||||
return produceState(initialValue = SplitFlashFrame(FlashColor.BLACK, FlashColor.BLACK), isRunning, mode) {
|
||||
if (!isRunning || mode == SessionMode.AUDIO_ONLY) {
|
||||
value = SplitFlashFrame(FlashColor.BLACK, FlashColor.BLACK)
|
||||
return@produceState
|
||||
}
|
||||
|
||||
val sequencer = SplitFlashSequencer(
|
||||
startTimeNanos = System.nanoTime(),
|
||||
flashOnMs = latestFlashOnMs.value,
|
||||
flashOffMs = latestFlashOffMs.value,
|
||||
)
|
||||
|
||||
while (true) {
|
||||
withFrameNanos { frameTimeNanos ->
|
||||
sequencer.updateIntervals(latestFlashOnMs.value, latestFlashOffMs.value)
|
||||
value = sequencer.frameAt(frameTimeNanos)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user