track.rs

  1use super::*;
  2#[cfg(not(all(target_os = "windows", target_env = "gnu")))]
  3use webrtc::{audio_source::RtcAudioSource, video_source::RtcVideoSource};
  4
  5#[cfg(not(all(target_os = "windows", target_env = "gnu")))]
  6pub use livekit::track::{TrackKind, TrackSource};
  7
  8#[derive(Clone, Debug)]
  9pub enum LocalTrack {
 10    Audio(LocalAudioTrack),
 11    Video(LocalVideoTrack),
 12}
 13
 14#[derive(Clone, Debug)]
 15pub enum RemoteTrack {
 16    Audio(RemoteAudioTrack),
 17    Video(RemoteVideoTrack),
 18}
 19
 20#[derive(Clone, Debug)]
 21pub struct LocalVideoTrack {}
 22
 23#[derive(Clone, Debug)]
 24pub struct LocalAudioTrack {}
 25
 26#[derive(Clone, Debug)]
 27pub struct RemoteVideoTrack {
 28    #[cfg(not(all(target_os = "windows", target_env = "gnu")))]
 29    pub(super) server_track: Arc<TestServerVideoTrack>,
 30    pub(super) _room: WeakRoom,
 31}
 32
 33#[derive(Clone, Debug)]
 34pub struct RemoteAudioTrack {
 35    #[cfg(not(all(target_os = "windows", target_env = "gnu")))]
 36    pub(super) server_track: Arc<TestServerAudioTrack>,
 37    pub(super) room: WeakRoom,
 38}
 39
 40pub enum RtcTrack {
 41    Audio(RtcAudioTrack),
 42    Video(RtcVideoTrack),
 43}
 44
 45pub struct RtcAudioTrack {
 46    #[cfg(not(all(target_os = "windows", target_env = "gnu")))]
 47    pub(super) server_track: Arc<TestServerAudioTrack>,
 48    pub(super) room: WeakRoom,
 49}
 50
 51pub struct RtcVideoTrack {
 52    #[cfg(not(all(target_os = "windows", target_env = "gnu")))]
 53    pub(super) _server_track: Arc<TestServerVideoTrack>,
 54}
 55
 56#[cfg(not(all(target_os = "windows", target_env = "gnu")))]
 57impl RemoteTrack {
 58    pub fn sid(&self) -> TrackSid {
 59        match self {
 60            RemoteTrack::Audio(track) => track.sid(),
 61            RemoteTrack::Video(track) => track.sid(),
 62        }
 63    }
 64
 65    pub fn kind(&self) -> TrackKind {
 66        match self {
 67            RemoteTrack::Audio(_) => TrackKind::Audio,
 68            RemoteTrack::Video(_) => TrackKind::Video,
 69        }
 70    }
 71
 72    pub fn publisher_id(&self) -> ParticipantIdentity {
 73        match self {
 74            RemoteTrack::Audio(track) => track.publisher_id(),
 75            RemoteTrack::Video(track) => track.publisher_id(),
 76        }
 77    }
 78
 79    pub fn rtc_track(&self) -> RtcTrack {
 80        match self {
 81            RemoteTrack::Audio(track) => RtcTrack::Audio(track.rtc_track()),
 82            RemoteTrack::Video(track) => RtcTrack::Video(track.rtc_track()),
 83        }
 84    }
 85}
 86
 87#[cfg(not(all(target_os = "windows", target_env = "gnu")))]
 88impl LocalVideoTrack {
 89    pub fn create_video_track(_name: &str, _source: RtcVideoSource) -> Self {
 90        Self {}
 91    }
 92}
 93
 94#[cfg(not(all(target_os = "windows", target_env = "gnu")))]
 95impl LocalAudioTrack {
 96    pub fn create_audio_track(_name: &str, _source: RtcAudioSource) -> Self {
 97        Self {}
 98    }
 99}
100
101#[cfg(not(all(target_os = "windows", target_env = "gnu")))]
102impl RemoteAudioTrack {
103    pub fn sid(&self) -> TrackSid {
104        self.server_track.sid.clone()
105    }
106
107    pub fn publisher_id(&self) -> ParticipantIdentity {
108        self.server_track.publisher_id.clone()
109    }
110
111    pub fn start(&self) {
112        if let Some(room) = self.room.upgrade() {
113            room.0
114                .lock()
115                .paused_audio_tracks
116                .remove(&self.server_track.sid);
117        }
118    }
119
120    pub fn stop(&self) {
121        if let Some(room) = self.room.upgrade() {
122            room.0
123                .lock()
124                .paused_audio_tracks
125                .insert(self.server_track.sid.clone());
126        }
127    }
128
129    pub fn rtc_track(&self) -> RtcAudioTrack {
130        RtcAudioTrack {
131            server_track: self.server_track.clone(),
132            room: self.room.clone(),
133        }
134    }
135}
136
137#[cfg(not(all(target_os = "windows", target_env = "gnu")))]
138impl RemoteVideoTrack {
139    pub fn sid(&self) -> TrackSid {
140        self.server_track.sid.clone()
141    }
142
143    pub fn publisher_id(&self) -> ParticipantIdentity {
144        self.server_track.publisher_id.clone()
145    }
146
147    pub fn rtc_track(&self) -> RtcVideoTrack {
148        RtcVideoTrack {
149            _server_track: self.server_track.clone(),
150        }
151    }
152}
153
154#[cfg(not(all(target_os = "windows", target_env = "gnu")))]
155impl RtcTrack {
156    pub fn enabled(&self) -> bool {
157        match self {
158            RtcTrack::Audio(track) => track.enabled(),
159            RtcTrack::Video(track) => track.enabled(),
160        }
161    }
162
163    pub fn set_enabled(&self, enabled: bool) {
164        match self {
165            RtcTrack::Audio(track) => track.set_enabled(enabled),
166            RtcTrack::Video(_) => {}
167        }
168    }
169}
170
171#[cfg(not(all(target_os = "windows", target_env = "gnu")))]
172impl RtcAudioTrack {
173    pub fn set_enabled(&self, enabled: bool) {
174        if let Some(room) = self.room.upgrade() {
175            let paused_audio_tracks = &mut room.0.lock().paused_audio_tracks;
176            if enabled {
177                paused_audio_tracks.remove(&self.server_track.sid);
178            } else {
179                paused_audio_tracks.insert(self.server_track.sid.clone());
180            }
181        }
182    }
183
184    pub fn enabled(&self) -> bool {
185        if let Some(room) = self.room.upgrade() {
186            !room
187                .0
188                .lock()
189                .paused_audio_tracks
190                .contains(&self.server_track.sid)
191        } else {
192            false
193        }
194    }
195}
196
197impl RtcVideoTrack {
198    pub fn enabled(&self) -> bool {
199        true
200    }
201}