Keep MIDI input alive with the screen off / app backgrounded (v0.21.1)
MIDI (and the MIDI clock) were started in onStart and stopped in onStop, so turning the screen off — which drives the Activity to onStop — closed the MIDI ports and dropped controller input. Move their lifecycle to onCreate/onDestroy so input persists for the Activity's whole lifetime; onStop keeps only the project autosave. The audio engine already runs a continuous output stream via the started PlaybackService, which keeps the process alive (verified at PERSISTENT_SERVICE_ADJ when backgrounded) to receive events with the screen off. USB MIDI needs no runtime permission, so it works unconditionally. Trade-off: the controller stays claimed by the app while backgrounded, and is released only when the Activity is torn down (task removed / finishing). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -22,8 +22,8 @@ android {
|
|||||||
// (android.media.midi) and AAudio low-latency audio we rely on.
|
// (android.media.midi) and AAudio low-latency audio we rely on.
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
targetSdk = 34
|
targetSdk = 34
|
||||||
versionCode = 47
|
versionCode = 48
|
||||||
versionName = "0.21.0"
|
versionName = "0.21.1"
|
||||||
|
|
||||||
// We provide our own instrumentation runner if/when tests are added.
|
// We provide our own instrumentation runner if/when tests are added.
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|||||||
@@ -75,10 +75,13 @@ class MainActivity : ComponentActivity() {
|
|||||||
SizzleAppUi(viewModel)
|
SizzleAppUi(viewModel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStart() {
|
// Start MIDI listening (USB + BLE) and the MIDI clock here — bound to the
|
||||||
super.onStart()
|
// 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()
|
midi.start()
|
||||||
app.midiClock.start()
|
app.midiClock.start()
|
||||||
}
|
}
|
||||||
@@ -93,11 +96,19 @@ class MainActivity : ComponentActivity() {
|
|||||||
|
|
||||||
override fun onStop() {
|
override fun onStop() {
|
||||||
// Autosave the project whenever we leave the foreground, so a later
|
// 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)
|
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()
|
midi.stop()
|
||||||
app.midiClock.stop()
|
app.midiClock.stop()
|
||||||
super.onStop()
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---- Hardware input forwarding ----
|
// ---- Hardware input forwarding ----
|
||||||
|
|||||||
Reference in New Issue
Block a user