Implement StopGame callback and use it to finish the emulation activity

This commit is contained in:
Tom Pratt
2026-04-22 18:46:12 +02:00
committed by Tom Pratt
parent 86956b21be
commit 38b5c7370c
6 changed files with 53 additions and 2 deletions

View File

@@ -44,6 +44,9 @@ object Netplay {
private val _launchGame = Channel<String>(Channel.CONFLATED)
val launchGame = _launchGame.receiveAsFlow()
private val _stopGame = Channel<Unit>(Channel.CONFLATED)
val stopGame = _stopGame.receiveAsFlow()
private val _connectionErrors = Channel<String>(Channel.BUFFERED)
val connectionErrors = _connectionErrors.receiveAsFlow()
@@ -123,6 +126,7 @@ object Netplay {
}
_launchGame.flush()
_stopGame.flush()
_connectionErrors.flush()
_players.resetReplayCache()
_messages.resetReplayCache()
@@ -166,9 +170,16 @@ object Netplay {
@JvmStatic
fun onBootGame(gameFilePath: String, bootSessionDataPointer: Long) {
this.bootSessionDataPointer = bootSessionDataPointer
_stopGame.flush()
_launchGame.trySend(gameFilePath)
}
@Keep
@JvmStatic
fun onStopGame() {
_stopGame.trySend(Unit)
}
@JvmStatic
fun onConnectionError(message: String) {
_connectionErrors.trySend(message)
@@ -244,6 +255,6 @@ object Netplay {
}
}
private fun Channel<String>.flush() {
private fun <T> Channel<T>.flush() {
while (this.tryReceive().isSuccess) Unit
}

View File

@@ -10,6 +10,9 @@ import android.view.SurfaceHolder
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import org.dolphinemu.dolphinemu.NativeLibrary
import org.dolphinemu.dolphinemu.activities.EmulationActivity
import org.dolphinemu.dolphinemu.databinding.FragmentEmulationBinding
@@ -220,6 +223,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
val paths = requireNotNull(gamePaths) {
"Cannot start emulation without any game paths"
}
lifecycleScope.launch {
Netplay.stopGame.first()
stopEmulation()
}
NativeLibrary.RunNetPlay(paths, riivolution)
} else {
Log.debug("[EmulationFragment] Starting emulation thread.")