mirror of
https://gitlab.com/futo-org/fcast.git
synced 2025-06-24 21:25:23 +00:00
Added synchronization to sender.
This commit is contained in:
parent
48cf03f78b
commit
6f90cf7bb6
2 changed files with 31 additions and 28 deletions
|
@ -62,37 +62,40 @@ class FCastSession(outputStream: OutputStream, private val _remoteSocketAddress:
|
||||||
private var _packetLength = 0
|
private var _packetLength = 0
|
||||||
private var _state = SessionState.WaitingForLength
|
private var _state = SessionState.WaitingForLength
|
||||||
private var _outputStream: DataOutputStream? = DataOutputStream(outputStream)
|
private var _outputStream: DataOutputStream? = DataOutputStream(outputStream)
|
||||||
|
private var _outputStreamLock = Object()
|
||||||
val id = UUID.randomUUID()
|
val id = UUID.randomUUID()
|
||||||
|
|
||||||
fun send(opcode: Opcode, message: String? = null) {
|
fun send(opcode: Opcode, message: String? = null) {
|
||||||
try {
|
synchronized(_outputStreamLock) {
|
||||||
val data: ByteArray = message?.encodeToByteArray() ?: ByteArray(0)
|
try {
|
||||||
val size = 1 + data.size
|
val data: ByteArray = message?.encodeToByteArray() ?: ByteArray(0)
|
||||||
val outputStream = _outputStream
|
val size = 1 + data.size
|
||||||
if (outputStream == null) {
|
val outputStream = _outputStream
|
||||||
Log.w(TAG, "Failed to send $size bytes, output stream is null.")
|
if (outputStream == null) {
|
||||||
return
|
Log.w(TAG, "Failed to send $size bytes, output stream is null.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val serializedSizeLE = ByteArray(4)
|
||||||
|
serializedSizeLE[0] = (size and 0xff).toByte()
|
||||||
|
serializedSizeLE[1] = (size shr 8 and 0xff).toByte()
|
||||||
|
serializedSizeLE[2] = (size shr 16 and 0xff).toByte()
|
||||||
|
serializedSizeLE[3] = (size shr 24 and 0xff).toByte()
|
||||||
|
outputStream.write(serializedSizeLE)
|
||||||
|
|
||||||
|
val opcodeBytes = ByteArray(1)
|
||||||
|
opcodeBytes[0] = opcode.value
|
||||||
|
outputStream.write(opcodeBytes)
|
||||||
|
|
||||||
|
if (data.isNotEmpty()) {
|
||||||
|
outputStream.write(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d(TAG, "Sent $size bytes: (opcode: $opcode, body: $message).")
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
Log.i(TAG, "Failed to send message ${id}.", e)
|
||||||
|
throw e
|
||||||
}
|
}
|
||||||
|
|
||||||
val serializedSizeLE = ByteArray(4)
|
|
||||||
serializedSizeLE[0] = (size and 0xff).toByte()
|
|
||||||
serializedSizeLE[1] = (size shr 8 and 0xff).toByte()
|
|
||||||
serializedSizeLE[2] = (size shr 16 and 0xff).toByte()
|
|
||||||
serializedSizeLE[3] = (size shr 24 and 0xff).toByte()
|
|
||||||
outputStream.write(serializedSizeLE)
|
|
||||||
|
|
||||||
val opcodeBytes = ByteArray(1)
|
|
||||||
opcodeBytes[0] = opcode.value
|
|
||||||
outputStream.write(opcodeBytes)
|
|
||||||
|
|
||||||
if (data.isNotEmpty()) {
|
|
||||||
outputStream.write(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.d(TAG, "Sent $size bytes: (opcode: $opcode, body: $message).")
|
|
||||||
} catch (e: Throwable) {
|
|
||||||
Log.i(TAG, "Failed to send message ${id}.", e)
|
|
||||||
throw e
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ class NetworkService : Service() {
|
||||||
session.send(opcode, message)
|
session.send(opcode, message)
|
||||||
Log.i(TAG, "Opcode sent (opcode = $opcode) ${session.id}")
|
Log.i(TAG, "Opcode sent (opcode = $opcode) ${session.id}")
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
Log.w(TAG, "Failed to send playback error", e)
|
Log.w(TAG, "Failed to send opcode (opcode = $opcode) ${session.id}", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue