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}