mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Android: Acquire the MulticastLock when using the NetworkServiceDiscovery::AvailableServiceList class to ensure that multicast packets are received on all devices
This commit is contained in:
parent
f982c00d88
commit
605d0978ce
3 changed files with 72 additions and 0 deletions
|
|
@ -1804,7 +1804,10 @@ private:
|
|||
StringArray s = StringArray::fromTokens (androidOtherPermissions.get().toString(), ", ", {});
|
||||
|
||||
if (androidInternetNeeded.get())
|
||||
{
|
||||
s.add ("android.permission.INTERNET");
|
||||
s.add ("android.permission.CHANGE_WIFI_MULTICAST_STATE");
|
||||
}
|
||||
|
||||
if (androidMicNeeded.get())
|
||||
s.add ("android.permission.RECORD_AUDIO");
|
||||
|
|
|
|||
|
|
@ -213,6 +213,62 @@ DECLARE_JNI_CLASS_WITH_BYTECODE (HTTPStream, "com/roli/juce/JuceHTTPStream", 16,
|
|||
DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream")
|
||||
#undef JNI_CLASS_MEMBERS
|
||||
|
||||
//==============================================================================
|
||||
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
|
||||
METHOD (acquire, "acquire", "()V") \
|
||||
METHOD (release, "release", "()V") \
|
||||
|
||||
DECLARE_JNI_CLASS (AndroidMulticastLock, "android/net/wifi/WifiManager$MulticastLock")
|
||||
#undef JNI_CLASS_MEMBERS
|
||||
|
||||
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
|
||||
METHOD (createMulticastLock, "createMulticastLock", "(Ljava/lang/String;)Landroid/net/wifi/WifiManager$MulticastLock;") \
|
||||
|
||||
DECLARE_JNI_CLASS (AndroidWifiManager, "android/net/wifi/WifiManager")
|
||||
#undef JNI_CLASS_MEMBERS
|
||||
|
||||
static LocalRef<jobject> getMulticastLock()
|
||||
{
|
||||
static LocalRef<jobject> multicastLock;
|
||||
static bool hasChecked = false;
|
||||
|
||||
if (! hasChecked)
|
||||
{
|
||||
hasChecked = true;
|
||||
|
||||
auto* env = getEnv();
|
||||
|
||||
LocalRef<jobject> wifiManager (env->CallObjectMethod (getAppContext().get(),
|
||||
AndroidContext.getSystemService,
|
||||
javaString ("wifi").get()));
|
||||
|
||||
if (wifiManager != nullptr)
|
||||
{
|
||||
multicastLock = LocalRef<jobject> (env->CallObjectMethod (wifiManager.get(),
|
||||
AndroidWifiManager.createMulticastLock,
|
||||
javaString ("JUCE_MulticastLock").get()));
|
||||
}
|
||||
}
|
||||
|
||||
return multicastLock;
|
||||
}
|
||||
|
||||
JUCE_API void JUCE_CALLTYPE acquireMulticastLock()
|
||||
{
|
||||
auto multicastLock = getMulticastLock();
|
||||
|
||||
if (multicastLock != nullptr)
|
||||
getEnv()->CallVoidMethod (multicastLock.get(), AndroidMulticastLock.acquire);
|
||||
}
|
||||
|
||||
JUCE_API void JUCE_CALLTYPE releaseMulticastLock()
|
||||
{
|
||||
auto multicastLock = getMulticastLock();
|
||||
|
||||
if (multicastLock != nullptr)
|
||||
getEnv()->CallVoidMethod (multicastLock.get(), AndroidMulticastLock.release);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void MACAddress::findAllAddresses (Array<MACAddress>& /*result*/)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -23,6 +23,11 @@
|
|||
namespace juce
|
||||
{
|
||||
|
||||
#if JUCE_ANDROID
|
||||
extern void acquireMulticastLock();
|
||||
extern void releaseMulticastLock();
|
||||
#endif
|
||||
|
||||
NetworkServiceDiscovery::Advertiser::Advertiser (const String& serviceTypeUID,
|
||||
const String& serviceDescription,
|
||||
int broadcastPortToUse, int connectionPort,
|
||||
|
|
@ -73,6 +78,10 @@ void NetworkServiceDiscovery::Advertiser::sendBroadcast()
|
|||
NetworkServiceDiscovery::AvailableServiceList::AvailableServiceList (const String& serviceType, int broadcastPort)
|
||||
: Thread ("Discovery_listen"), serviceTypeUID (serviceType)
|
||||
{
|
||||
#if JUCE_ANDROID
|
||||
acquireMulticastLock();
|
||||
#endif
|
||||
|
||||
socket.bindToPort (broadcastPort);
|
||||
startThread (2);
|
||||
}
|
||||
|
|
@ -81,6 +90,10 @@ NetworkServiceDiscovery::AvailableServiceList::~AvailableServiceList()
|
|||
{
|
||||
socket.shutdown();
|
||||
stopThread (2000);
|
||||
|
||||
#if JUCE_ANDROID
|
||||
releaseMulticastLock();
|
||||
#endif
|
||||
}
|
||||
|
||||
void NetworkServiceDiscovery::AvailableServiceList::run()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue