diff options
author | t895 <clombardo169@gmail.com> | 2024-01-26 15:06:24 +0100 |
---|---|---|
committer | t895 <clombardo169@gmail.com> | 2024-01-28 02:05:51 +0100 |
commit | 3f1290cee3e2419956de3f5b31d0446ff5425f4a (patch) | |
tree | 75fd375885ee8c55a1b7715f281c985996bf9370 /src/android/app/src/main/java | |
parent | Merge pull request #12818 from K900/small-fixes (diff) | |
download | yuzu-3f1290cee3e2419956de3f5b31d0446ff5425f4a.tar yuzu-3f1290cee3e2419956de3f5b31d0446ff5425f4a.tar.gz yuzu-3f1290cee3e2419956de3f5b31d0446ff5425f4a.tar.bz2 yuzu-3f1290cee3e2419956de3f5b31d0446ff5425f4a.tar.lz yuzu-3f1290cee3e2419956de3f5b31d0446ff5425f4a.tar.xz yuzu-3f1290cee3e2419956de3f5b31d0446ff5425f4a.tar.zst yuzu-3f1290cee3e2419956de3f5b31d0446ff5425f4a.zip |
Diffstat (limited to 'src/android/app/src/main/java')
4 files changed, 76 insertions, 26 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt index 55abba093..53137b2e2 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt @@ -261,7 +261,7 @@ object NativeLibrary { /** * Begins emulation. */ - external fun run(path: String?) + external fun run(path: String?, programIndex: Int = 0) // Surface Handling external fun surfaceChanged(surf: Surface?) @@ -489,6 +489,12 @@ object NativeLibrary { sEmulationActivity.get()!!.onEmulationStopped(status) } + @Keep + @JvmStatic + fun onProgramChanged(programIndex: Int) { + sEmulationActivity.get()!!.onProgramChanged(programIndex) + } + /** * Logs the Yuzu version, Android version and, CPU. */ diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 26cddecf4..564aaf305 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt @@ -76,7 +76,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { override fun onDestroy() { stopForegroundService(this) - emulationViewModel.clear() super.onDestroy() } @@ -446,9 +445,14 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { } fun onEmulationStopped(status: Int) { - if (status == 0) { + if (status == 0 && emulationViewModel.programChanged.value == -1) { finish() } + emulationViewModel.setEmulationStopped(true) + } + + fun onProgramChanged(programIndex: Int) { + emulationViewModel.setProgramChanged(programIndex) } private fun startMotionSensorListener() { 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 ef393c4be..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 @@ -424,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() @@ -435,7 +463,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { updateScreenLayout() - emulationState.run(emulationActivity!!.isActivityRecreated) + emulationState.run(emulationActivity!!.isActivityRecreated, programIndex) } } @@ -833,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. @@ -878,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 @@ -889,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?) { @@ -932,7 +971,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } - private fun runWithValidSurface() { + private fun runWithValidSurface(programIndex: Int = 0) { NativeLibrary.surfaceChanged(surface) if (!emulationCanStart.invoke()) { return @@ -940,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() } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt index b66f47fe7..d024493cd 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt @@ -15,6 +15,12 @@ class EmulationViewModel : ViewModel() { val isEmulationStopping: StateFlow<Boolean> get() = _isEmulationStopping private val _isEmulationStopping = MutableStateFlow(false) + private val _emulationStopped = MutableStateFlow(false) + val emulationStopped = _emulationStopped.asStateFlow() + + private val _programChanged = MutableStateFlow(-1) + val programChanged = _programChanged.asStateFlow() + val shaderProgress: StateFlow<Int> get() = _shaderProgress private val _shaderProgress = MutableStateFlow(0) @@ -35,6 +41,17 @@ class EmulationViewModel : ViewModel() { _isEmulationStopping.value = value } + fun setEmulationStopped(value: Boolean) { + if (value) { + _emulationStarted.value = false + } + _emulationStopped.value = value + } + + fun setProgramChanged(programIndex: Int) { + _programChanged.value = programIndex + } + fun setShaderProgress(progress: Int) { _shaderProgress.value = progress } @@ -56,20 +73,4 @@ class EmulationViewModel : ViewModel() { fun setDrawerOpen(value: Boolean) { _drawerOpen.value = value } - - fun clear() { - setEmulationStarted(false) - setIsEmulationStopping(false) - setShaderProgress(0) - setTotalShaders(0) - setShaderMessage("") - } - - companion object { - const val KEY_EMULATION_STARTED = "EmulationStarted" - const val KEY_IS_EMULATION_STOPPING = "IsEmulationStarting" - const val KEY_SHADER_PROGRESS = "ShaderProgress" - const val KEY_TOTAL_SHADERS = "TotalShaders" - const val KEY_SHADER_MESSAGE = "ShaderMessage" - } } |