feat: add ssrc definition (op 12)
This commit is contained in:
parent
d135e0a192
commit
3789596c19
|
@ -12,6 +12,7 @@ pub use select_protocol::*;
|
||||||
pub use session_description::*;
|
pub use session_description::*;
|
||||||
pub use speaking::*;
|
pub use speaking::*;
|
||||||
pub use voice_backend_version::*;
|
pub use voice_backend_version::*;
|
||||||
|
pub use ssrc_definition::*;
|
||||||
|
|
||||||
mod client_connect;
|
mod client_connect;
|
||||||
mod client_disconnect;
|
mod client_disconnect;
|
||||||
|
@ -23,6 +24,7 @@ mod select_protocol;
|
||||||
mod session_description;
|
mod session_description;
|
||||||
mod speaking;
|
mod speaking;
|
||||||
mod voice_backend_version;
|
mod voice_backend_version;
|
||||||
|
mod ssrc_definition;
|
||||||
|
|
||||||
#[derive(Debug, Default, Serialize, Clone)]
|
#[derive(Debug, Default, Serialize, Clone)]
|
||||||
/// The payload used for sending events to the webrtc gateway.
|
/// The payload used for sending events to the webrtc gateway.
|
||||||
|
@ -102,8 +104,7 @@ pub const VOICE_HEARTBEAT_ACK: u8 = 6;
|
||||||
pub const VOICE_RESUME: u8 = 7;
|
pub const VOICE_RESUME: u8 = 7;
|
||||||
pub const VOICE_HELLO: u8 = 8;
|
pub const VOICE_HELLO: u8 = 8;
|
||||||
pub const VOICE_RESUMED: u8 = 9;
|
pub const VOICE_RESUMED: u8 = 9;
|
||||||
/// See <https://discord-userdoccers.vercel.app/topics/opcodes-and-status-codes#voice-opcodes>
|
pub const VOICE_SSRC_DEFINITION: u8 = 12;
|
||||||
pub const VOICE_VIDEO: u8 = 12;
|
|
||||||
pub const VOICE_CLIENT_DISCONNECT: u8 = 13;
|
pub const VOICE_CLIENT_DISCONNECT: u8 = 13;
|
||||||
pub const VOICE_SESSION_UPDATE: u8 = 14;
|
pub const VOICE_SESSION_UPDATE: u8 = 14;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
use crate::types::{Snowflake, WebSocketEvent};
|
||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
|
/// Defines an event which provides ssrcs for voice and video for a user id.
|
||||||
|
///
|
||||||
|
/// This event is sent via opcode 12.
|
||||||
|
///
|
||||||
|
/// Examples of the event:
|
||||||
|
///
|
||||||
|
/// When receiving:
|
||||||
|
/// ```
|
||||||
|
/// {"op":12,"d":{"video_ssrc":0,"user_id":"463640391196082177","streams":[{"ssrc":26595,"rtx_ssrc":26596,"rid":"100","quality":100,"max_resolution":{"width":1280,"type":"fixed","height":720},"max_framerate":30,"active":false}],"audio_ssrc":26597}}{"op":12,"d":{"video_ssrc":0,"user_id":"463640391196082177","streams":[{"ssrc":26595,"rtx_ssrc":26596,"rid":"100","quality":100,"max_resolution":{"width":1280,"type":"fixed","height":720},"max_framerate":30,"active":false}],"audio_ssrc":26597}}
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// When sending:
|
||||||
|
/// ```
|
||||||
|
/// {"op":12,"d":{"audio_ssrc":2307250864,"video_ssrc":0,"rtx_ssrc":0,"streams":[{"type":"video","rid":"100","ssrc":26595,"active":false,"quality":100,"rtx_ssrc":26596,"max_bitrate":2500000,"max_framerate":30,"max_resolution":{"type":"fixed","width":1280,"height":720}}]}}
|
||||||
|
/// ```
|
||||||
|
#[derive(Debug, Deserialize, Serialize, Default, Clone, PartialEq, Eq)]
|
||||||
|
pub struct SsrcDefinition {
|
||||||
|
/// The ssrc used for video communications.
|
||||||
|
///
|
||||||
|
/// Is always sent and received, though is 0 if describing only the audio ssrc.
|
||||||
|
#[serde(default)]
|
||||||
|
pub video_ssrc: usize,
|
||||||
|
/// The ssrc used for audio communications.
|
||||||
|
///
|
||||||
|
/// Is always sent and received, though is 0 if describing only the video ssrc.
|
||||||
|
#[serde(default)]
|
||||||
|
pub audio_ssrc: usize,
|
||||||
|
/// The user id these ssrcs apply to.
|
||||||
|
///
|
||||||
|
/// Is never sent by the user and is filled in by the server
|
||||||
|
#[serde(skip_serializing)]
|
||||||
|
pub user_id: Option<Snowflake>,
|
||||||
|
// TODO: Add video streams
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WebSocketEvent for SsrcDefinition {}
|
|
@ -17,11 +17,12 @@ use tokio_tungstenite::{connect_async_tls_with_config, Connector, WebSocketStrea
|
||||||
use crate::errors::VoiceGatewayError;
|
use crate::errors::VoiceGatewayError;
|
||||||
use crate::gateway::{heartbeat::HEARTBEAT_ACK_TIMEOUT, GatewayEvent};
|
use crate::gateway::{heartbeat::HEARTBEAT_ACK_TIMEOUT, GatewayEvent};
|
||||||
use crate::types::{
|
use crate::types::{
|
||||||
self, SelectProtocol, Speaking, VoiceGatewayReceivePayload, VoiceGatewaySendPayload,
|
self, SelectProtocol, Speaking, SsrcDefinition, VoiceGatewayReceivePayload,
|
||||||
VoiceIdentify, WebSocketEvent, VOICE_BACKEND_VERSION, VOICE_CLIENT_CONNECT_FLAGS,
|
VoiceGatewaySendPayload, VoiceIdentify, WebSocketEvent, VOICE_BACKEND_VERSION,
|
||||||
VOICE_CLIENT_CONNECT_PLATFORM, VOICE_CLIENT_DISCONNECT, VOICE_HEARTBEAT, VOICE_HEARTBEAT_ACK,
|
VOICE_CLIENT_CONNECT_FLAGS, VOICE_CLIENT_CONNECT_PLATFORM, VOICE_CLIENT_DISCONNECT,
|
||||||
VOICE_HELLO, VOICE_IDENTIFY, VOICE_MEDIA_SINK_WANTS, VOICE_READY, VOICE_RESUME,
|
VOICE_HEARTBEAT, VOICE_HEARTBEAT_ACK, VOICE_HELLO, VOICE_IDENTIFY, VOICE_MEDIA_SINK_WANTS,
|
||||||
VOICE_SELECT_PROTOCOL, VOICE_SESSION_DESCRIPTION, VOICE_SESSION_UPDATE, VOICE_SPEAKING,
|
VOICE_READY, VOICE_RESUME, VOICE_SELECT_PROTOCOL, VOICE_SESSION_DESCRIPTION,
|
||||||
|
VOICE_SESSION_UPDATE, VOICE_SPEAKING, VOICE_SSRC_DEFINITION,
|
||||||
};
|
};
|
||||||
|
|
||||||
use self::voice_events::VoiceEvents;
|
use self::voice_events::VoiceEvents;
|
||||||
|
@ -159,6 +160,15 @@ impl VoiceGatewayHandle {
|
||||||
self.send_json(VOICE_SPEAKING, to_send_value).await;
|
self.send_json(VOICE_SPEAKING, to_send_value).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sends an ssrc definition event
|
||||||
|
pub async fn send_ssrc_definition(&self, to_send: SsrcDefinition) {
|
||||||
|
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
||||||
|
|
||||||
|
trace!("VGW: Sending SsrcDefinition");
|
||||||
|
|
||||||
|
self.send_json(VOICE_SSRC_DEFINITION, to_send_value).await;
|
||||||
|
}
|
||||||
|
|
||||||
/// Sends a voice backend version request to the gateway
|
/// Sends a voice backend version request to the gateway
|
||||||
pub async fn send_voice_backend_version_request(&self) {
|
pub async fn send_voice_backend_version_request(&self) {
|
||||||
let data_empty_object = json!("{}");
|
let data_empty_object = json!("{}");
|
||||||
|
@ -408,6 +418,18 @@ impl VoiceGateway {
|
||||||
warn!("Failed to parse VOICE_SPEAKING ({})", result.err().unwrap());
|
warn!("Failed to parse VOICE_SPEAKING ({})", result.err().unwrap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
VOICE_SSRC_DEFINITION => {
|
||||||
|
trace!("VGW: Received Ssrc Definition");
|
||||||
|
|
||||||
|
let event = &mut self.events.lock().await.ssrc_definition;
|
||||||
|
let result = VoiceGateway::handle_event(gateway_payload.data.get(), event).await;
|
||||||
|
if result.is_err() {
|
||||||
|
warn!(
|
||||||
|
"Failed to parse VOICE_SSRC_DEFINITION ({})",
|
||||||
|
result.err().unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
VOICE_CLIENT_DISCONNECT => {
|
VOICE_CLIENT_DISCONNECT => {
|
||||||
trace!("VGW: Received Client Disconnect");
|
trace!("VGW: Received Client Disconnect");
|
||||||
|
|
||||||
|
@ -663,6 +685,7 @@ pub mod voice_events {
|
||||||
pub session_description: GatewayEvent<SessionDescription>,
|
pub session_description: GatewayEvent<SessionDescription>,
|
||||||
pub session_update: GatewayEvent<SessionUpdate>,
|
pub session_update: GatewayEvent<SessionUpdate>,
|
||||||
pub speaking: GatewayEvent<Speaking>,
|
pub speaking: GatewayEvent<Speaking>,
|
||||||
|
pub ssrc_definition: GatewayEvent<SsrcDefinition>,
|
||||||
pub client_disconnect: GatewayEvent<VoiceClientDisconnection>,
|
pub client_disconnect: GatewayEvent<VoiceClientDisconnection>,
|
||||||
pub client_connect_flags: GatewayEvent<VoiceClientConnectFlags>,
|
pub client_connect_flags: GatewayEvent<VoiceClientConnectFlags>,
|
||||||
pub client_connect_platform: GatewayEvent<VoiceClientConnectPlatform>,
|
pub client_connect_platform: GatewayEvent<VoiceClientConnectPlatform>,
|
||||||
|
|
Loading…
Reference in New Issue