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:
parent
18b61d549c
commit
33a8d684bf
9 changed files with 68 additions and 10 deletions
|
@ -1,6 +1,6 @@
|
||||||
use std::sync::{atomic::{AtomicBool, Ordering}, Arc};
|
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;
|
use serde::Serialize;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -23,7 +23,8 @@ pub enum Opcode {
|
||||||
VolumeUpdate = 7,
|
VolumeUpdate = 7,
|
||||||
SetVolume = 8,
|
SetVolume = 8,
|
||||||
PlaybackError = 9,
|
PlaybackError = 9,
|
||||||
SetSpeed = 10
|
SetSpeed = 10,
|
||||||
|
Version = 11
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Opcode {
|
impl Opcode {
|
||||||
|
@ -40,6 +41,7 @@ impl Opcode {
|
||||||
8 => Opcode::SetVolume,
|
8 => Opcode::SetVolume,
|
||||||
9 => Opcode::PlaybackError,
|
9 => Opcode::PlaybackError,
|
||||||
10 => Opcode::SetSpeed,
|
10 => Opcode::SetSpeed,
|
||||||
|
11 => Opcode::Version,
|
||||||
_ => panic!("Unknown value: {}", value),
|
_ => 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");
|
println!("Error handling packet");
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,4 +64,9 @@ impl SetSpeedMessage {
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct PlaybackErrorMessage {
|
pub struct PlaybackErrorMessage {
|
||||||
pub message: String,
|
pub message: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
pub struct VersionMessage {
|
||||||
|
pub version: u64,
|
||||||
}
|
}
|
|
@ -28,7 +28,8 @@ enum class Opcode(val value: Byte) {
|
||||||
VolumeUpdate(7),
|
VolumeUpdate(7),
|
||||||
SetVolume(8),
|
SetVolume(8),
|
||||||
PlaybackError(9),
|
PlaybackError(9),
|
||||||
SetSpeed(10)
|
SetSpeed(10),
|
||||||
|
Version(11)
|
||||||
}
|
}
|
||||||
|
|
||||||
const val LENGTH_BYTES = 4
|
const val LENGTH_BYTES = 4
|
||||||
|
@ -42,6 +43,10 @@ class FCastSession(outputStream: OutputStream, private val _remoteSocketAddress:
|
||||||
private var _outputStream: DataOutputStream? = DataOutputStream(outputStream)
|
private var _outputStream: DataOutputStream? = DataOutputStream(outputStream)
|
||||||
val id = UUID.randomUUID()
|
val id = UUID.randomUUID()
|
||||||
|
|
||||||
|
fun sendVersion(value: VersionMessage) {
|
||||||
|
send(Opcode.Version, value)
|
||||||
|
}
|
||||||
|
|
||||||
fun sendPlaybackError(value: PlaybackErrorMessage) {
|
fun sendPlaybackError(value: PlaybackErrorMessage) {
|
||||||
send(Opcode.PlaybackError, value)
|
send(Opcode.PlaybackError, value)
|
||||||
}
|
}
|
||||||
|
@ -190,13 +195,13 @@ class FCastSession(outputStream: OutputStream, private val _remoteSocketAddress:
|
||||||
|
|
||||||
try {
|
try {
|
||||||
when (opcode) {
|
when (opcode) {
|
||||||
Opcode.Play -> _service.onCastPlay(Json.decodeFromString(body!!))
|
Opcode.Play -> _service.onCastPlay(json.decodeFromString(body!!))
|
||||||
Opcode.Pause -> _service.onCastPause()
|
Opcode.Pause -> _service.onCastPause()
|
||||||
Opcode.Resume -> _service.onCastResume()
|
Opcode.Resume -> _service.onCastResume()
|
||||||
Opcode.Stop -> _service.onCastStop()
|
Opcode.Stop -> _service.onCastStop()
|
||||||
Opcode.Seek -> _service.onCastSeek(Json.decodeFromString(body!!))
|
Opcode.Seek -> _service.onCastSeek(json.decodeFromString(body!!))
|
||||||
Opcode.SetVolume -> _service.onSetVolume(Json.decodeFromString(body!!))
|
Opcode.SetVolume -> _service.onSetVolume(json.decodeFromString(body!!))
|
||||||
Opcode.SetSpeed -> _service.onSetSpeed(Json.decodeFromString(body!!))
|
Opcode.SetSpeed -> _service.onSetSpeed(json.decodeFromString(body!!))
|
||||||
else -> { }
|
else -> { }
|
||||||
}
|
}
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
|
@ -206,5 +211,6 @@ class FCastSession(outputStream: OutputStream, private val _remoteSocketAddress:
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "FCastSession"
|
const val TAG = "FCastSession"
|
||||||
|
private val json = Json { ignoreUnknownKeys = true }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -60,6 +60,15 @@ class NetworkService : Service() {
|
||||||
_scope?.launch(Dispatchers.Main) {
|
_scope?.launch(Dispatchers.Main) {
|
||||||
Log.i(TAG, "On new session ${session.id}")
|
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
|
var encounteredError = false
|
||||||
while (!_stopped && !encounteredError) {
|
while (!_stopped && !encounteredError) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -44,4 +44,9 @@ data class SetSpeedMessage(
|
||||||
@Serializable
|
@Serializable
|
||||||
data class SetVolumeMessage(
|
data class SetVolumeMessage(
|
||||||
val volume: Double
|
val volume: Double
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class VersionMessage(
|
||||||
|
val version: Long
|
||||||
)
|
)
|
|
@ -1,6 +1,6 @@
|
||||||
import net = require('net');
|
import net = require('net');
|
||||||
import { EventEmitter } from 'node:events';
|
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';
|
import { WebSocket } from 'ws';
|
||||||
|
|
||||||
enum SessionState {
|
enum SessionState {
|
||||||
|
@ -21,7 +21,8 @@ enum Opcode {
|
||||||
VolumeUpdate = 7,
|
VolumeUpdate = 7,
|
||||||
SetVolume = 8,
|
SetVolume = 8,
|
||||||
PlaybackError = 9,
|
PlaybackError = 9,
|
||||||
SetSpeed = 10
|
SetSpeed = 10,
|
||||||
|
Version = 11
|
||||||
};
|
};
|
||||||
|
|
||||||
const LENGTH_BYTES = 4;
|
const LENGTH_BYTES = 4;
|
||||||
|
@ -42,6 +43,10 @@ export class FCastSession {
|
||||||
this.state = SessionState.WaitingForLength;
|
this.state = SessionState.WaitingForLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sendVersion(value: VersionMessage) {
|
||||||
|
this.send(Opcode.Version, value);
|
||||||
|
}
|
||||||
|
|
||||||
sendPlaybackError(value: PlaybackErrorMessage) {
|
sendPlaybackError(value: PlaybackErrorMessage) {
|
||||||
this.send(Opcode.PlaybackError, value);
|
this.send(Opcode.PlaybackError, value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,4 +47,10 @@ export class SetSpeedMessage {
|
||||||
constructor(
|
constructor(
|
||||||
public speed: number,
|
public speed: number,
|
||||||
) {}
|
) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class VersionMessage {
|
||||||
|
constructor(
|
||||||
|
public version: number,
|
||||||
|
) {}
|
||||||
}
|
}
|
|
@ -125,5 +125,12 @@ export class TcpListenerService {
|
||||||
this.sessions.splice(index, 1);
|
this.sessions.splice(index, 1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
console.log('Sending version');
|
||||||
|
session.sendVersion({version: 2});
|
||||||
|
} catch (e) {
|
||||||
|
console.log('Failed to send version');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
import net = require('net');
|
|
||||||
import { FCastSession } from './FCastSession';
|
import { FCastSession } from './FCastSession';
|
||||||
import { EventEmitter } from 'node:events';
|
import { EventEmitter } from 'node:events';
|
||||||
import { PlaybackErrorMessage, PlaybackUpdateMessage, PlayMessage, SeekMessage, SetSpeedMessage, SetVolumeMessage, VolumeUpdateMessage } from './Packets';
|
import { PlaybackErrorMessage, PlaybackUpdateMessage, PlayMessage, SeekMessage, SetSpeedMessage, SetVolumeMessage, VolumeUpdateMessage } from './Packets';
|
||||||
|
@ -131,5 +130,12 @@ export class WebSocketListenerService {
|
||||||
this.sessions.splice(index, 1);
|
this.sessions.splice(index, 1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
console.log('Sending version');
|
||||||
|
session.sendVersion({version: 2});
|
||||||
|
} catch (e) {
|
||||||
|
console.log('Failed to send version');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue