Skip to content

Commit 2954b1a

Browse files
authored
livekit: send UpdateTrackSettings on disable (#368)
1 parent 9119643 commit 2954b1a

File tree

7 files changed

+72
-0
lines changed

7 files changed

+72
-0
lines changed

livekit/src/room/participant/remote_participant.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,30 @@ impl RemoteParticipant {
353353
}
354354
}
355355
});
356+
357+
publication.on_enabled_status_changed({
358+
let rtc_engine = self.inner.rtc_engine.clone();
359+
move |publication, enabled| {
360+
let rtc_engine = rtc_engine.clone();
361+
livekit_runtime::spawn(async move {
362+
let tsid: String = publication.sid().into();
363+
let TrackDimension(width, height) = publication.dimension();
364+
let update_track_settings = proto::UpdateTrackSettings {
365+
track_sids: vec![tsid.clone()],
366+
disabled: !enabled,
367+
width,
368+
height,
369+
..Default::default()
370+
};
371+
372+
rtc_engine
373+
.send_request(proto::signal_request::Message::TrackSetting(
374+
update_track_settings,
375+
))
376+
.await
377+
});
378+
}
379+
})
356380
}
357381

358382
pub(crate) fn remove_publication(&self, sid: &TrackSid) -> Option<TrackPublication> {

livekit/src/room/publication/remote.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type SubscriptionStatusChangedHandler =
2727
type PermissionStatusChangedHandler =
2828
Box<dyn Fn(RemoteTrackPublication, PermissionStatus, PermissionStatus) + Send>; // old_status, new_status
2929
type SubscriptionUpdateNeededHandler = Box<dyn Fn(RemoteTrackPublication, bool) + Send>;
30+
type EnabledStatusChangedHandler = Box<dyn Fn(RemoteTrackPublication, bool) + Send>;
3031

3132
#[derive(Default)]
3233
struct RemoteEvents {
@@ -35,6 +36,7 @@ struct RemoteEvents {
3536
subscription_status_changed: Mutex<Option<SubscriptionStatusChangedHandler>>,
3637
permission_status_changed: Mutex<Option<PermissionStatusChangedHandler>>,
3738
subscription_update_needed: Mutex<Option<SubscriptionUpdateNeededHandler>>,
39+
enabled_status_changed: Mutex<Option<EnabledStatusChangedHandler>>,
3840
}
3941

4042
#[derive(Debug)]
@@ -206,6 +208,13 @@ impl RemoteTrackPublication {
206208
*self.remote.events.subscription_update_needed.lock() = Some(Box::new(f));
207209
}
208210

211+
pub(crate) fn on_enabled_status_changed(
212+
&self,
213+
f: impl Fn(RemoteTrackPublication, bool) + Send + 'static,
214+
) {
215+
*self.remote.events.enabled_status_changed.lock() = Some(Box::new(f));
216+
}
217+
209218
pub fn set_subscribed(&self, subscribed: bool) {
210219
let old_subscription_state = self.subscription_status();
211220
let old_permission_state = self.permission_status();
@@ -235,6 +244,24 @@ impl RemoteTrackPublication {
235244
self.emit_permission_update(old_permission_state);
236245
}
237246

247+
pub fn set_enabled(&self, enabled: bool) {
248+
if self.is_subscribed() && enabled != self.is_enabled() {
249+
let track = self.track().unwrap();
250+
if self.is_enabled() {
251+
track.disable();
252+
} else {
253+
track.enable();
254+
}
255+
256+
// Request to send an update to the SFU
257+
if let Some(enabled_status_changed) =
258+
self.remote.events.enabled_status_changed.lock().as_ref()
259+
{
260+
enabled_status_changed(self.clone(), enabled)
261+
}
262+
}
263+
}
264+
238265
pub fn subscription_status(&self) -> SubscriptionStatus {
239266
if !self.remote.info.read().subscribed {
240267
return SubscriptionStatus::Unsubscribed;
@@ -267,6 +294,10 @@ impl RemoteTrackPublication {
267294
self.remote.info.read().allowed
268295
}
269296

297+
pub fn is_enabled(&self) -> bool {
298+
self.track().is_some_and(|x| x.is_enabled())
299+
}
300+
270301
pub fn sid(&self) -> TrackSid {
271302
self.inner.info.read().sid.clone()
272303
}

livekit/src/room/track/local_audio_track.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ impl LocalAudioTrack {
8484
self.inner.info.read().stream_state
8585
}
8686

87+
pub fn is_enabled(&self) -> bool {
88+
self.inner.rtc_track.enabled()
89+
}
90+
8791
pub fn enable(&self) {
8892
self.inner.rtc_track.set_enabled(true);
8993
}

livekit/src/room/track/local_video_track.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ impl LocalVideoTrack {
8484
self.inner.info.read().stream_state
8585
}
8686

87+
pub fn is_enabled(&self) -> bool {
88+
self.inner.rtc_track.enabled()
89+
}
90+
8791
pub fn enable(&self) {
8892
self.inner.rtc_track.set_enabled(true);
8993
}

livekit/src/room/track/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ macro_rules! track_dispatch {
7979
pub fn kind(self: &Self) -> TrackKind;
8080
pub fn source(self: &Self) -> TrackSource;
8181
pub fn stream_state(self: &Self) -> StreamState;
82+
pub fn is_enabled(self: &Self) -> bool;
8283
pub fn enable(self: &Self) -> ();
8384
pub fn disable(self: &Self) -> ();
8485
pub fn is_muted(self: &Self) -> bool;

livekit/src/room/track/remote_audio_track.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ impl RemoteAudioTrack {
6767
self.inner.info.read().stream_state
6868
}
6969

70+
pub fn is_enabled(&self) -> bool {
71+
self.inner.rtc_track.enabled()
72+
}
73+
7074
pub fn enable(&self) {
7175
self.inner.rtc_track.set_enabled(true);
7276
}

livekit/src/room/track/remote_video_track.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ impl RemoteVideoTrack {
6767
self.inner.info.read().stream_state
6868
}
6969

70+
pub fn is_enabled(&self) -> bool {
71+
self.inner.rtc_track.enabled()
72+
}
73+
7074
pub fn enable(&self) {
7175
self.inner.rtc_track.set_enabled(true);
7276
}

0 commit comments

Comments
 (0)