diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 766d19c..4ed85b7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,8 +22,8 @@ android { // (android.media.midi) and AAudio low-latency audio we rely on. minSdk = 26 targetSdk = 34 - versionCode = 47 - versionName = "0.21.0" + versionCode = 48 + versionName = "0.21.1" // We provide our own instrumentation runner if/when tests are added. testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/space/rcmd/android/sizzle/MainActivity.kt b/app/src/main/java/space/rcmd/android/sizzle/MainActivity.kt index c93831d..e00ea40 100644 --- a/app/src/main/java/space/rcmd/android/sizzle/MainActivity.kt +++ b/app/src/main/java/space/rcmd/android/sizzle/MainActivity.kt @@ -75,10 +75,13 @@ class MainActivity : ComponentActivity() { SizzleAppUi(viewModel) } } - } - override fun onStart() { - super.onStart() + // Start MIDI listening (USB + BLE) and the MIDI clock here — bound to the + // Activity's WHOLE lifetime (onCreate..onDestroy), not onStart/onStop — so a + // connected controller keeps driving the app while the screen is off. The + // audio engine already runs a continuous output stream via the started + // PlaybackService, which keeps the process alive to receive those events in + // the background; closing the ports on onStop was the only reason input died. midi.start() app.midiClock.start() } @@ -93,11 +96,19 @@ class MainActivity : ComponentActivity() { override fun onStop() { // Autosave the project whenever we leave the foreground, so a later - // system-kill (or crash) resumes from here on next launch. + // system-kill (or crash) resumes from here on next launch. MIDI is + // deliberately NOT stopped here (see onCreate / onDestroy) so controllers + // keep working with the screen off or the app backgrounded. app.projectStore.save(app.project) + super.onStop() + } + + override fun onDestroy() { + // Release MIDI only when the Activity is actually torn down (task removed or + // finishing), not merely backgrounded / screen-off. midi.stop() app.midiClock.stop() - super.onStop() + super.onDestroy() } // ---- Hardware input forwarding ----