1
0
Fork 0
mirror of https://gitlab.com/futo-org/fcast.git synced 2025-06-24 21:25:23 +00:00

Added version code sending.

This commit is contained in:
Koen 2023-12-07 16:56:20 +01:00
parent 18b61d549c
commit 33a8d684bf
9 changed files with 68 additions and 10 deletions

View file

@ -1,6 +1,6 @@
use std::sync::{atomic::{AtomicBool, Ordering}, Arc};
use crate::{models::{PlaybackUpdateMessage, VolumeUpdateMessage, PlaybackErrorMessage}, transport::Transport};
use crate::{models::{PlaybackUpdateMessage, VolumeUpdateMessage, PlaybackErrorMessage, VersionMessage}, transport::Transport};
use serde::Serialize;
#[derive(Debug)]
@ -23,7 +23,8 @@ pub enum Opcode {
VolumeUpdate = 7,
SetVolume = 8,
PlaybackError = 9,
SetSpeed = 10
SetSpeed = 10,
Version = 11
}
impl Opcode {
@ -40,6 +41,7 @@ impl Opcode {
8 => Opcode::SetVolume,
9 => Opcode::PlaybackError,
10 => Opcode::SetSpeed,
11 => Opcode::Version,
_ => panic!("Unknown value: {}", value),
}
}
@ -219,6 +221,13 @@ impl FCastSession<'_> {
}
}
}
Opcode::Version => {
if let Some(body_str) = body {
if let Ok(version_msg) = serde_json::from_str::<VersionMessage>(body_str) {
println!("Received version {:?}", version_msg);
}
}
}
_ => {
println!("Error handling packet");
}

View file

@ -64,4 +64,9 @@ impl SetSpeedMessage {
#[derive(Deserialize, Debug)]
pub struct PlaybackErrorMessage {
pub message: String,
}
#[derive(Deserialize, Debug)]
pub struct VersionMessage {
pub version: u64,
}

View file

@ -28,7 +28,8 @@ enum class Opcode(val value: Byte) {
VolumeUpdate(7),
SetVolume(8),
PlaybackError(9),
SetSpeed(10)
SetSpeed(10),
Version(11)
}
const val LENGTH_BYTES = 4
@ -42,6 +43,10 @@ class FCastSession(outputStream: OutputStream, private val _remoteSocketAddress:
private var _outputStream: DataOutputStream? = DataOutputStream(outputStream)
val id = UUID.randomUUID()
fun sendVersion(value: VersionMessage) {
send(Opcode.Version, value)
}
fun sendPlaybackError(value: PlaybackErrorMessage) {
send(Opcode.PlaybackError, value)
}
@ -190,13 +195,13 @@ class FCastSession(outputStream: OutputStream, private val _remoteSocketAddress:
try {
when (opcode) {
Opcode.Play -> _service.onCastPlay(Json.decodeFromString(body!!))
Opcode.Play -> _service.onCastPlay(json.decodeFromString(body!!))
Opcode.Pause -> _service.onCastPause()
Opcode.Resume -> _service.onCastResume()
Opcode.Stop -> _service.onCastStop()
Opcode.Seek -> _service.onCastSeek(Json.decodeFromString(body!!))
Opcode.SetVolume -> _service.onSetVolume(Json.decodeFromString(body!!))
Opcode.SetSpeed -> _service.onSetSpeed(Json.decodeFromString(body!!))
Opcode.Seek -> _service.onCastSeek(json.decodeFromString(body!!))
Opcode.SetVolume -> _service.onSetVolume(json.decodeFromString(body!!))
Opcode.SetSpeed -> _service.onSetSpeed(json.decodeFromString(body!!))
else -> { }
}
} catch (e: Throwable) {
@ -206,5 +211,6 @@ class FCastSession(outputStream: OutputStream, private val _remoteSocketAddress:
companion object {
const val TAG = "FCastSession"
private val json = Json { ignoreUnknownKeys = true }
}
}

View file

@ -60,6 +60,15 @@ class NetworkService : Service() {
_scope?.launch(Dispatchers.Main) {
Log.i(TAG, "On new session ${session.id}")
withContext(Dispatchers.IO) {
try {
Log.i(TAG, "Sending version ${session.id}")
session.sendVersion(VersionMessage(2))
} catch (e: Throwable) {
Log.e(TAG, "Failed to send version ${session.id}")
}
}
var encounteredError = false
while (!_stopped && !encounteredError) {
try {

View file

@ -44,4 +44,9 @@ data class SetSpeedMessage(
@Serializable
data class SetVolumeMessage(
val volume: Double
)
@Serializable
data class VersionMessage(
val version: Long
)

View file

@ -1,6 +1,6 @@
import net = require('net');
import { EventEmitter } from 'node:events';
import { PlaybackErrorMessage, PlaybackUpdateMessage, PlayMessage, SeekMessage, SetSpeedMessage, SetVolumeMessage, VolumeUpdateMessage } from './Packets';
import { PlaybackErrorMessage, PlaybackUpdateMessage, PlayMessage, SeekMessage, SetSpeedMessage, SetVolumeMessage, VersionMessage, VolumeUpdateMessage } from './Packets';
import { WebSocket } from 'ws';
enum SessionState {
@ -21,7 +21,8 @@ enum Opcode {
VolumeUpdate = 7,
SetVolume = 8,
PlaybackError = 9,
SetSpeed = 10
SetSpeed = 10,
Version = 11
};
const LENGTH_BYTES = 4;
@ -42,6 +43,10 @@ export class FCastSession {
this.state = SessionState.WaitingForLength;
}
sendVersion(value: VersionMessage) {
this.send(Opcode.Version, value);
}
sendPlaybackError(value: PlaybackErrorMessage) {
this.send(Opcode.PlaybackError, value);
}

View file

@ -47,4 +47,10 @@ export class SetSpeedMessage {
constructor(
public speed: number,
) {}
}
export class VersionMessage {
constructor(
public version: number,
) {}
}

View file

@ -125,5 +125,12 @@ export class TcpListenerService {
this.sessions.splice(index, 1);
}
});
try {
console.log('Sending version');
session.sendVersion({version: 2});
} catch (e) {
console.log('Failed to send version');
}
}
}

View file

@ -1,4 +1,3 @@
import net = require('net');
import { FCastSession } from './FCastSession';
import { EventEmitter } from 'node:events';
import { PlaybackErrorMessage, PlaybackUpdateMessage, PlayMessage, SeekMessage, SetSpeedMessage, SetVolumeMessage, VolumeUpdateMessage } from './Packets';
@ -131,5 +130,12 @@ export class WebSocketListenerService {
this.sessions.splice(index, 1);
}
});
try {
console.log('Sending version');
session.sendVersion({version: 2});
} catch (e) {
console.log('Failed to send version');
}
}
}