From 60ce58442768efdfbc63dcfd1249825fb97b5697 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Tue, 27 Jun 2023 13:12:52 -0700 Subject: [PATCH] WIP: Add mute icons --- crates/call/src/participant.rs | 1 + crates/call/src/room.rs | 25 +++++++++++++++++++++++-- crates/live_kit_client/src/prod.rs | 1 + crates/live_kit_client/src/test.rs | 1 + 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/crates/call/src/participant.rs b/crates/call/src/participant.rs index 90f256489d2d40f39ad1d49f6266980cc13951bb..9773e837c3269aa42583fe374c8ab5cff5a689b6 100644 --- a/crates/call/src/participant.rs +++ b/crates/call/src/participant.rs @@ -43,6 +43,7 @@ pub struct RemoteParticipant { pub peer_id: proto::PeerId, pub projects: Vec, pub location: ParticipantLocation, + pub muted: bool, pub video_tracks: HashMap>, pub audio_tracks: HashMap>, } diff --git a/crates/call/src/room.rs b/crates/call/src/room.rs index 3c94feae4c4a9bb2268fc601b9aee002644faf7a..7b7ec89a5ed176564ec4e656bee6c323fd26d3a5 100644 --- a/crates/call/src/room.rs +++ b/crates/call/src/room.rs @@ -647,6 +647,7 @@ impl Room { peer_id, projects: participant.projects, location, + muted: false, video_tracks: Default::default(), audio_tracks: Default::default(), }, @@ -781,6 +782,21 @@ impl Room { cx: &mut ModelContext, ) -> Result<()> { match change { + RemoteAudioTrackUpdate::MuteChanged { track_id, muted } => { + for participant in &mut self.remote_participants.values_mut() { + let mut found = false; + for track in participant.audio_tracks.values() { + if track.sid() == track_id { + found = true; + break; + } + } + if found { + participant.muted = muted; + break; + } + } + } RemoteAudioTrackUpdate::Subscribed(track) => { let user_id = track.publisher_id().parse()?; let track_id = track.sid().to_string(); @@ -1213,11 +1229,12 @@ impl Room { let mut tasks = Vec::with_capacity(self.remote_participants.len()); // Context notification is sent within set_mute itself. + let mut mute_task = None; if live_kit.deafened { // Unmute microphone only if we're going from unmuted -> muted state. // We don't want to unmute user automatically. - let _ = Self::set_mute(live_kit, live_kit.deafened, cx)?; // todo (osiewicz): we probably want to schedule it on fg/bg? - } + mute_task = Some(Self::set_mute(live_kit, live_kit.deafened, cx)?); + }; for participant in self.remote_participants.values() { for track in live_kit .room @@ -1226,7 +1243,11 @@ impl Room { tasks.push(cx.foreground().spawn(track.set_enabled(!live_kit.deafened))); } } + Ok(cx.foreground().spawn(async move { + if let Some(mute_task) = mute_task { + mute_task.await?; + } for task in tasks { task.await?; } diff --git a/crates/live_kit_client/src/prod.rs b/crates/live_kit_client/src/prod.rs index dbd9e1917e6ee2151b701728afcdebee7f98dfb5..96bf40ca4ede083a5ce9a94b12edca4321cddabb 100644 --- a/crates/live_kit_client/src/prod.rs +++ b/crates/live_kit_client/src/prod.rs @@ -761,6 +761,7 @@ pub enum RemoteVideoTrackUpdate { } pub enum RemoteAudioTrackUpdate { + MuteChanged { track_id: Sid, muted: bool}, Subscribed(Arc), Unsubscribed { publisher_id: Sid, track_id: Sid }, } diff --git a/crates/live_kit_client/src/test.rs b/crates/live_kit_client/src/test.rs index 9db57a329452b98893dc9815e8c3b3bb505de7b6..286c7215e9b6b722626c52b1923f13506896bf9b 100644 --- a/crates/live_kit_client/src/test.rs +++ b/crates/live_kit_client/src/test.rs @@ -580,6 +580,7 @@ pub enum RemoteVideoTrackUpdate { #[derive(Clone)] pub enum RemoteAudioTrackUpdate { + MuteChanged { track_id: Sid, muted: bool}, Subscribed(Arc), Unsubscribed { publisher_id: Sid, track_id: Sid }, }