diff --git a/.nanpa/track-muted-event-for-local-publications.kdl b/.nanpa/track-muted-event-for-local-publications.kdl new file mode 100644 index 000000000..879dc0964 --- /dev/null +++ b/.nanpa/track-muted-event-for-local-publications.kdl @@ -0,0 +1 @@ +patch type="fixed" package="livekit" "Emit TrackMuted/TrackUnmuted events for local publications" \ No newline at end of file diff --git a/livekit/src/room/participant/local_participant.rs b/livekit/src/room/participant/local_participant.rs index f4a12d627..e38d3dc4a 100644 --- a/livekit/src/room/participant/local_participant.rs +++ b/livekit/src/room/participant/local_participant.rs @@ -139,7 +139,14 @@ impl LocalParticipant { } pub(crate) fn update_info(&self, info: proto::ParticipantInfo) { - super::update_info(&self.inner, &Participant::Local(self.clone()), info); + super::update_info(&self.inner, &Participant::Local(self.clone()), info.clone()); + + for track in info.tracks { + let track_sid = track.sid.clone().try_into().unwrap(); + if let Some(publication) = self.get_track_publication(&track_sid) { + publication.update_info(track.clone()); + } + } } pub(crate) fn set_speaking(&self, speaking: bool) { diff --git a/livekit/src/room/participant/remote_participant.rs b/livekit/src/room/participant/remote_participant.rs index 58a1659e7..5aaabed01 100644 --- a/livekit/src/room/participant/remote_participant.rs +++ b/livekit/src/room/participant/remote_participant.rs @@ -145,6 +145,7 @@ impl RemoteParticipant { name: remote_publication.name(), r#type: proto::TrackType::from(remote_publication.kind()) as i32, source: proto::TrackSource::from(remote_publication.source()) as i32, + muted: remote_publication.is_muted(), ..Default::default() }); diff --git a/livekit/src/room/publication/local.rs b/livekit/src/room/publication/local.rs index 728177913..f3144340e 100644 --- a/livekit/src/room/publication/local.rs +++ b/livekit/src/room/publication/local.rs @@ -65,9 +65,23 @@ impl LocalTrackPublication { self.inner.info.read().proto_info.clone() } - #[allow(dead_code)] - pub(crate) fn update_info(&self, info: proto::TrackInfo) { - super::update_info(&self.inner, &TrackPublication::Local(self.clone()), info); + pub(crate) fn update_info(&self, new_info: proto::TrackInfo) { + super::update_info(&self.inner, &TrackPublication::Local(self.clone()), new_info.clone()); + + let mut info = self.inner.info.write(); + if info.muted != new_info.muted { + info.muted = new_info.muted; + + drop(info); + + if new_info.muted { + if let Some(on_mute) = self.inner.events.muted.lock().as_ref() { + on_mute(TrackPublication::Local(self.clone())); + } + } else if let Some(on_unmute) = self.inner.events.unmuted.lock().as_ref() { + on_unmute(TrackPublication::Local(self.clone())); + } + } } pub(crate) fn update_publish_options(&self, opts: TrackPublishOptions) {