diff options
Diffstat (limited to 'src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt')
-rw-r--r-- | src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index 22da1d0e5..1f591ced1 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -301,6 +301,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { R.id.menu_exit -> { emulationState.stop() + NativeConfig.reloadGlobalConfig() emulationViewModel.setIsEmulationStopping(true) binding.drawerLayout.close() binding.inGameMenu.requestFocus() @@ -423,10 +424,38 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } } + launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + emulationViewModel.programChanged.collect { + if (it != 0) { + emulationViewModel.setEmulationStarted(false) + binding.drawerLayout.close() + binding.drawerLayout + .setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) + ViewUtils.hideView(binding.surfaceInputOverlay) + ViewUtils.showView(binding.loadingIndicator) + } + } + } + } + launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + emulationViewModel.emulationStopped.collect { + if (it && emulationViewModel.programChanged.value != -1) { + if (perfStatsUpdater != null) { + perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!) + } + emulationState.changeProgram(emulationViewModel.programChanged.value) + emulationViewModel.setProgramChanged(-1) + emulationViewModel.setEmulationStopped(false) + } + } + } + } } } - private fun startEmulation() { + private fun startEmulation(programIndex: Int = 0) { if (!NativeLibrary.isRunning() && !NativeLibrary.isPaused()) { if (!DirectoryInitialization.areDirectoriesReady) { DirectoryInitialization.start() @@ -434,7 +463,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { updateScreenLayout() - emulationState.run(emulationActivity!!.isActivityRecreated) + emulationState.run(emulationActivity!!.isActivityRecreated, programIndex) } } @@ -832,6 +861,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { ) { private var state: State private var surface: Surface? = null + lateinit var emulationThread: Thread init { // Starting state is stopped. @@ -877,7 +907,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } @Synchronized - fun run(isActivityRecreated: Boolean) { + fun run(isActivityRecreated: Boolean, programIndex: Int = 0) { if (isActivityRecreated) { if (NativeLibrary.isRunning()) { state = State.PAUSED @@ -888,10 +918,20 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { // If the surface is set, run now. Otherwise, wait for it to get set. if (surface != null) { - runWithValidSurface() + runWithValidSurface(programIndex) } } + @Synchronized + fun changeProgram(programIndex: Int) { + emulationThread.join() + emulationThread = Thread({ + Log.debug("[EmulationFragment] Starting emulation thread.") + NativeLibrary.run(gamePath, programIndex) + }, "NativeEmulation") + emulationThread.start() + } + // Surface callbacks @Synchronized fun newSurface(surface: Surface?) { @@ -931,7 +971,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } - private fun runWithValidSurface() { + private fun runWithValidSurface(programIndex: Int = 0) { NativeLibrary.surfaceChanged(surface) if (!emulationCanStart.invoke()) { return @@ -939,9 +979,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { when (state) { State.STOPPED -> { - val emulationThread = Thread({ + emulationThread = Thread({ Log.debug("[EmulationFragment] Starting emulation thread.") - NativeLibrary.run(gamePath) + NativeLibrary.run(gamePath, programIndex) }, "NativeEmulation") emulationThread.start() } |