From 34d4d9228907005343b332d4244910ca267a2a5e Mon Sep 17 00:00:00 2001 From: Koen Date: Wed, 3 Jan 2024 11:24:55 +0100 Subject: [PATCH] Casting stability fixes to ChromeCast connection thread. --- .../casting/AirPlayCastingDevice.kt | 2 +- .../casting/ChomecastCastingDevice.kt | 20 +++++++++++++++---- .../casting/FCastCastingDevice.kt | 1 + 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/casting/AirPlayCastingDevice.kt b/app/src/main/java/com/futo/platformplayer/casting/AirPlayCastingDevice.kt index 4882e282..42fcc992 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/AirPlayCastingDevice.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/AirPlayCastingDevice.kt @@ -138,7 +138,7 @@ class AirPlayCastingDevice : CastingDevice { try { val connectedSocket = getConnectedSocket(adrs.toList(), port); if (connectedSocket == null) { - delay(3000); + delay(1000); continue; } diff --git a/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt b/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt index c5743dd6..a16cd83d 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt @@ -17,6 +17,8 @@ import org.json.JSONObject import java.io.DataInputStream import java.io.DataOutputStream import java.net.InetAddress +import java.net.InetSocketAddress +import java.net.Socket import java.security.cert.X509Certificate import javax.net.ssl.SSLContext import javax.net.ssl.SSLSocket @@ -303,17 +305,18 @@ class ChromecastCastingDevice : CastingDevice { _thread = Thread { connectionState = CastConnectionState.CONNECTING; + var connectedSocket: Socket? = null while (_scopeIO?.isActive == true) { try { - val connectedSocket = getConnectedSocket(adrs.toList(), port); - if (connectedSocket == null) { + val resultSocket = getConnectedSocket(adrs.toList(), port); + if (resultSocket == null) { Thread.sleep(1000); continue; } + connectedSocket = resultSocket usedRemoteAddress = connectedSocket.inetAddress; localAddress = connectedSocket.localAddress; - connectedSocket.close(); break; } catch (e: Throwable) { Logger.w(TAG, "Failed to get setup initial connection to ChromeCast device.", e) @@ -332,7 +335,16 @@ class ChromecastCastingDevice : CastingDevice { try { _socket?.close() - _socket = factory.createSocket(usedRemoteAddress, port) as SSLSocket; + if (connectedSocket != null) { + Logger.i(TAG, "Using connected socket.") + _socket = factory.createSocket(connectedSocket, connectedSocket.inetAddress.hostAddress, connectedSocket.port, true) as SSLSocket + connectedSocket = null + } else { + Logger.i(TAG, "Using new socket.") + val s = Socket().apply { this.connect(InetSocketAddress(usedRemoteAddress, port), 5000) } + _socket = factory.createSocket(s, s.inetAddress.hostAddress, s.port, true) as SSLSocket + } + _socket?.startHandshake(); Logger.i(TAG, "Successfully connected to Chromecast at $usedRemoteAddress:$port"); diff --git a/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt b/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt index 721df17e..ceb2ee96 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt @@ -285,6 +285,7 @@ class FCastCastingDevice : CastingDevice { connectionState = CastConnectionState.CONNECTING; try { + _socket?.close() if (connectedSocket != null) { Logger.i(TAG, "Using connected socket."); _socket = connectedSocket