changing computer ( started tracks )

I used my Mac on the company trip
This commit is contained in:
Théo Monnom
2022-11-08 10:31:09 +01:00
parent 6497930912
commit 82ec808dee
7 changed files with 178 additions and 28 deletions
+1 -1
View File
@@ -1,7 +1,6 @@
use futures_util::future::BoxFuture; use futures_util::future::BoxFuture;
use parking_lot::lock_api::RwLockUpgradableReadGuard; use parking_lot::lock_api::RwLockUpgradableReadGuard;
use parking_lot::{Mutex, RwLock}; use parking_lot::{Mutex, RwLock};
use std::borrow::Cow;
use std::collections::HashMap; use std::collections::HashMap;
use std::future::Future; use std::future::Future;
use std::sync::atomic::AtomicU8; use std::sync::atomic::AtomicU8;
@@ -36,6 +35,7 @@ pub enum RoomError {
type RoomResult<T> = Result<T, RoomError>; type RoomResult<T> = Result<T, RoomError>;
#[derive(Debug)]
pub enum ConnectionState { pub enum ConnectionState {
Disconnected, Disconnected,
Connecting, Connecting,
+6 -6
View File
@@ -10,7 +10,7 @@ pub(super) struct ParticipantShared {
pub(super) identity: Mutex<ParticipantIdentity>, pub(super) identity: Mutex<ParticipantIdentity>,
pub(super) name: Mutex<String>, pub(super) name: Mutex<String>,
pub(super) metadata: Mutex<String>, pub(super) metadata: Mutex<String>,
pub(super) tracks: RwLock<HashMap<TrackSid, Arc<TrackPublication>>>, pub(super) tracks: RwLock<HashMap<TrackSid, TrackPublication>>,
} }
impl ParticipantShared { impl ParticipantShared {
@@ -50,7 +50,7 @@ pub enum Participant {
Remote(RemoteParticipant), Remote(RemoteParticipant),
} }
macro_rules! shared_method { macro_rules! shared_getter {
($x:ident, $ret:ident) => { ($x:ident, $ret:ident) => {
fn $x(&self) -> $ret { fn $x(&self) -> $ret {
match self { match self {
@@ -62,10 +62,10 @@ macro_rules! shared_method {
} }
impl ParticipantTrait for Participant { impl ParticipantTrait for Participant {
shared_method!(sid, ParticipantSid); shared_getter!(sid, ParticipantSid);
shared_method!(identity, ParticipantIdentity); shared_getter!(identity, ParticipantIdentity);
shared_method!(name, String); shared_getter!(name, String);
shared_method!(metadata, String); shared_getter!(metadata, String);
fn update_info(&self, info: ParticipantInfo) { fn update_info(&self, info: ParticipantInfo) {
match self { match self {
@@ -1,7 +1,18 @@
use std::sync::Arc; use crate::room::id::TrackSid;
use crate::room::participant::{impl_participant_trait, ParticipantShared}; use crate::room::participant::{impl_participant_trait, ParticipantShared};
use crate::room::track_publication::RemoteTrackPublication; use crate::room::track::{RemoteAudioTrack, RemoteTrack, RemoteVideoTrack, TrackKind};
use crate::room::track_publication::{
RemoteTrackPublication, TrackPublication, TrackPublicationTrait,
};
use livekit_webrtc::media_stream::MediaStreamTrack;
use std::time::Duration;
use tokio::time::{sleep, timeout};
const ADD_TRACK_TIMEOUT: Duration = Duration::from_secs(5);
// It should be fine to add event listeners in this structure
// Registering after should be ParticipantConnected is fine to avoid missing events
pub struct RemoteParticipant { pub struct RemoteParticipant {
shared: ParticipantShared, shared: ParticipantShared,
} }
@@ -18,16 +29,54 @@ impl RemoteParticipant {
} }
} }
pub(super) async fn add_subscribed_media_track() { pub(super) async fn add_subscribed_media_track(
&self,
sid: &TrackSid,
media_track: MediaStreamTrack,
) {
let wait_publication = async {
loop {
let publication = self.get_track_publication(sid);
if let Some(publication) = publication {
return publication;
}
sleep(Duration::from_millis(50)).await;
}
};
let res = timeout(ADD_TRACK_TIMEOUT, wait_publication).await;
if let Ok(remote_publication) = res {
let track = match remote_publication.kind() {
TrackKind::Audio => {
let audio_track = RemoteAudioTrack::new();
RemoteTrack::Audio(audio_track)
}
TrackKind::Video => {
let video_track = RemoteVideoTrack::new();
RemoteTrack::Video(video_track)
}
_ => unreachable!(),
};
// TODO(theomonnom): call OnTrackSubscribed here
} else {
// TODO(theomonnom): send error
}
} }
fn get_track_publication(&self, sid: &str) -> Option<RemoteTrackPublication> { fn get_track_publication(&self, sid: &TrackSid) -> Option<RemoteTrackPublication> {
let track = self.shared.tracks.read().get(&sid.to_string().into()).unwrap().clone(); self.shared.tracks.read().get(sid).map(|track| {
if let TrackPublication::Remote(remote) = track {
remote.clone()
None } else {
unreachable!()
}
})
} }
} }
@@ -1,28 +1,70 @@
#[derive(Debug)]
pub enum TrackKind { pub enum TrackKind {
Unknown,
Audio, Audio,
Video Video,
} }
impl From<u8> for TrackKind {
fn from(val: u8) -> Self {
match val {
1 => Self::Audio,
2 => Self::Video,
_ => Self::Unknown,
}
}
}
#[derive(Debug)]
pub enum StreamState { pub enum StreamState {
Unknown,
Active, Active,
Paused, Paused,
Unknown
} }
#[derive(Debug)]
pub enum TrackSource { pub enum TrackSource {
Unknown,
Camera, Camera,
Microphone, Microphone,
Screenshare, Screenshare,
ScreenshareAudio, ScreenshareAudio,
Unknown, }
impl From<u8> for TrackSource {
fn from(val: u8) -> Self {
match val {
1 => Self::Camera,
2 => Self::Microphone,
3 => Self::Screenshare,
4 => Self::ScreenshareAudio,
_ => Self::Unknown,
}
}
} }
pub struct LocalVideoTrack {} pub struct LocalVideoTrack {}
pub struct RemoteVideoTrack {} pub struct RemoteVideoTrack {}
pub struct LocalAudioTrack {} pub struct LocalAudioTrack {}
pub struct RemoteAudioTrack {}
pub struct RemoteAudioTrack {
}
impl RemoteVideoTrack {
pub(crate) fn new() -> Self {
Self {}
}
}
impl RemoteAudioTrack {
pub(crate) fn new() -> Self {
Self {}
}
}
pub enum RemoteTrack { pub enum RemoteTrack {
Audio(RemoteAudioTrack), Audio(RemoteAudioTrack),
Video(RemoteVideoTrack), Video(RemoteVideoTrack),
@@ -1,7 +1,16 @@
use std::sync::Arc; use std::sync::Arc;
use std::sync::atomic::{AtomicBool, AtomicU8}; use std::sync::atomic::{AtomicBool, AtomicU8, Ordering};
use parking_lot::Mutex; use parking_lot::Mutex;
use crate::room::id::TrackSid; use crate::room::id::{ParticipantIdentity, ParticipantSid, TrackSid};
use crate::room::track::{TrackKind, TrackSource};
pub trait TrackPublicationTrait {
fn name(&self) -> String;
fn sid(&self) -> TrackSid;
fn kind(&self) -> TrackKind;
fn source(&self) -> TrackSource;
fn simulcasted(&self) -> bool;
}
pub(super) struct TrackPublicationShared { pub(super) struct TrackPublicationShared {
pub(super) name: Mutex<String>, pub(super) name: Mutex<String>,
@@ -11,6 +20,59 @@ pub(super) struct TrackPublicationShared {
pub(super) simulcasted: AtomicBool pub(super) simulcasted: AtomicBool
} }
#[derive(Clone)]
pub enum TrackPublication {
Local(LocalTrackPublication),
Remote(RemoteTrackPublication)
}
macro_rules! shared_getter {
($x:ident, $ret:ident) => {
fn $x(&self) -> $ret {
match self {
TrackPublication::Local(p) => p.$x(),
TrackPublication::Remote(p) => p.$x(),
}
}
};
}
impl TrackPublicationTrait for TrackPublication {
shared_getter!(name, String);
shared_getter!(sid, TrackSid);
shared_getter!(kind, TrackKind);
shared_getter!(source, TrackSource);
shared_getter!(simulcasted, bool);
}
macro_rules! impl_publication_trait {
($x:ident) => {
impl TrackPublicationTrait for $x {
fn name(&self) -> String {
self.shared.name.lock().clone()
}
fn sid(&self) -> TrackSid {
self.shared.sid.lock().clone()
}
fn kind(&self) -> TrackKind {
self.shared.kind.load(Ordering::SeqCst).into()
}
fn source(&self) -> TrackSource {
self.shared.source.load(Ordering::SeqCst).into()
}
fn simulcasted(&self) -> bool {
self.shared.simulcasted.load(Ordering::SeqCst)
}
}
}
}
#[derive(Clone)] #[derive(Clone)]
pub struct LocalTrackPublication { pub struct LocalTrackPublication {
shared: Arc<TrackPublicationShared> shared: Arc<TrackPublicationShared>
@@ -21,8 +83,5 @@ pub struct RemoteTrackPublication {
shared: Arc<TrackPublicationShared> shared: Arc<TrackPublicationShared>
} }
#[derive(Clone)] impl_publication_trait!(LocalTrackPublication);
pub enum TrackPublication { impl_publication_trait!(RemoteTrackPublication);
Local(LocalTrackPublication),
Remote(RemoteTrackPublication)
}
+1 -1
View File
@@ -52,7 +52,7 @@ fn macos_link_search_path() -> Option<String> {
fn main() { fn main() {
// TODO Download precompiled binaries of WebRTC for the target_os // TODO Download precompiled binaries of WebRTC for the target_os
let target_os = "windows"; let target_os = "macos";
//let target_arch = "arm64"; //let target_arch = "arm64";
let libwebrtc_dir = path::PathBuf::from("libwebrtc"); let libwebrtc_dir = path::PathBuf::from("libwebrtc");