From cd22ba1a2badce70888ba44b0777f27f221e8c4d Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Thu, 12 May 2022 17:39:49 +0200 Subject: [PATCH] android: use WifiManager.MulticastLock to receive broadcast packets In many cases, broadcast UDP packets can't be received on android unless a MulticastLock is held. --- core/network/naomi_network.cpp | 2 ++ core/network/naomi_network.h | 1 + core/network/net_platform.h | 6 ++++++ core/network/net_serial_maxspeed.h | 7 ++++++- .../flycast/src/main/AndroidManifest.xml | 2 ++ .../java/com/reicast/emulator/Emulator.java | 19 +++++++++++++++++++ .../flycast/src/main/jni/src/Android.cpp | 7 +++++++ 7 files changed, 43 insertions(+), 1 deletion(-) diff --git a/core/network/naomi_network.cpp b/core/network/naomi_network.cpp index 5a0f578ad..91a621f5f 100644 --- a/core/network/naomi_network.cpp +++ b/core/network/naomi_network.cpp @@ -91,6 +91,7 @@ bool NaomiNetwork::startNetwork() if (config::ActAsServer) { + enableNetworkBroadcast(true); const auto timeout = seconds(20); NOTICE_LOG(NETWORK, "Waiting for slave connections"); steady_clock::time_point start_time = steady_clock::now(); @@ -110,6 +111,7 @@ bool NaomiNetwork::startNetwork() break; std::this_thread::sleep_for(milliseconds(20)); } + enableNetworkBroadcast(false); if (!slaves.empty()) { NOTICE_LOG(NETWORK, "Master starting: %zd slaves", slaves.size()); diff --git a/core/network/naomi_network.h b/core/network/naomi_network.h index 4798c0a55..29c3188b6 100644 --- a/core/network/naomi_network.h +++ b/core/network/naomi_network.h @@ -50,6 +50,7 @@ public: void shutdown() { + enableNetworkBroadcast(false); emu.setNetworkState(false); closesocket(sock); sock = INVALID_SOCKET; diff --git a/core/network/net_platform.h b/core/network/net_platform.h index 0a9fb524a..1c9618a62 100644 --- a/core/network/net_platform.h +++ b/core/network/net_platform.h @@ -125,3 +125,9 @@ static inline const char *inet_ntop(int af, const void* src, char* dst, int cnt) return dst; } #endif + +#ifdef __ANDROID__ +void enableNetworkBroadcast(bool enable); +#else +static inline void enableNetworkBroadcast(bool enable) {} +#endif diff --git a/core/network/net_serial_maxspeed.h b/core/network/net_serial_maxspeed.h index c8cabc778..2160fa381 100644 --- a/core/network/net_serial_maxspeed.h +++ b/core/network/net_serial_maxspeed.h @@ -90,7 +90,9 @@ struct MaxSpeedNetPipe : public SerialPipe return true; } - void shutdown() { + void shutdown() + { + enableNetworkBroadcast(false); if (VALID(sock)) closesocket(sock); sock = INVALID_SOCKET; @@ -174,6 +176,7 @@ private: { peerAddress.sin_addr.s_addr = addr.sin_addr.s_addr; peerAddress.sin_port = addr.sin_port; + enableNetworkBroadcast(false); } } } @@ -235,6 +238,8 @@ private: freeaddrinfo(resultAddr); } } + else + enableNetworkBroadcast(true); serial_setPipe(this); } diff --git a/shell/android-studio/flycast/src/main/AndroidManifest.xml b/shell/android-studio/flycast/src/main/AndroidManifest.xml index cd4d29c26..dfcdee46d 100644 --- a/shell/android-studio/flycast/src/main/AndroidManifest.xml +++ b/shell/android-studio/flycast/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + ReleaseByteArrayElements(data, b, JNI_ABORT); } + +void enableNetworkBroadcast(bool enable) +{ + JNIEnv *env = jvm_attacher.getEnv(); + jmethodID enableNetworkBroadcastMID = env->GetMethodID(env->GetObjectClass(g_emulator), "enableNetworkBroadcast", "(Z)V"); + env->CallVoidMethod(g_emulator, enableNetworkBroadcastMID, enable); +} \ No newline at end of file