diff --git a/pkg/rtc/room.go b/pkg/rtc/room.go index fe850c578..622e5e62b 100644 --- a/pkg/rtc/room.go +++ b/pkg/rtc/room.go @@ -649,7 +649,7 @@ func (r *Room) UpdateSubscriptions( func (r *Room) SyncState(participant types.LocalParticipant, state *livekit.SyncState) error { pLogger := participant.GetLogger() - pLogger.Infow("setting sync state", "state", state) + pLogger.Infow("setting sync state", "state", logger.Proto(state)) shouldReconnect := false pubTracks := state.GetPublishTracks() @@ -690,28 +690,7 @@ func (r *Room) SyncState(participant types.LocalParticipant, state *livekit.Sync // can be set before addding subscriptions, // in fact it is done before so that setting can be updated immediately upon subscription. for _, trackSid := range state.TrackSidsDisabled { - // skip if it is not present in the subscribe list - found := false - for _, sid := range state.Subscription.TrackSids { - if sid == trackSid { - found = true - break - } - } - if !found { - participant_tracks: - for _, pt := range state.Subscription.ParticipantTracks { - for _, sid := range pt.TrackSids { - if sid == trackSid { - found = true - break participant_tracks - } - } - } - } - if found { - participant.UpdateSubscribedTrackSettings(livekit.TrackID(trackSid), &livekit.UpdateTrackSettings{Disabled: true}) - } + participant.UpdateSubscribedTrackSettings(livekit.TrackID(trackSid), &livekit.UpdateTrackSettings{Disabled: true}) } r.UpdateSubscriptions( diff --git a/pkg/rtc/subscribedtrack.go b/pkg/rtc/subscribedtrack.go index fd1eb7f94..d873c25f2 100644 --- a/pkg/rtc/subscribedtrack.go +++ b/pkg/rtc/subscribedtrack.go @@ -189,7 +189,7 @@ func (t *SubscribedTrack) SetPublisherMuted(muted bool) { t.updateDownTrackMute() } -func (t *SubscribedTrack) UpdateSubscriberSettings(settings *livekit.UpdateTrackSettings) { +func (t *SubscribedTrack) UpdateSubscriberSettings(settings *livekit.UpdateTrackSettings, isImmediate bool) { prevDisabled := t.subMuted.Swap(settings.Disabled) t.settings.Store(settings) @@ -197,11 +197,15 @@ func (t *SubscribedTrack) UpdateSubscriberSettings(settings *livekit.UpdateTrack t.logger.Debugw("updated subscribed track enabled", "enabled", !settings.Disabled) } - // avoid frequent changes to mute & video layers, unless it became visible - if prevDisabled != settings.Disabled && !settings.Disabled { + if isImmediate { t.UpdateVideoLayer() } else { - t.debouncer(t.UpdateVideoLayer) + // avoid frequent changes to mute & video layers, unless it became visible + if prevDisabled != settings.Disabled && !settings.Disabled { + t.UpdateVideoLayer() + } else { + t.debouncer(t.UpdateVideoLayer) + } } } diff --git a/pkg/rtc/subscriptionmanager.go b/pkg/rtc/subscriptionmanager.go index c53791aa5..73e5acbe0 100644 --- a/pkg/rtc/subscriptionmanager.go +++ b/pkg/rtc/subscriptionmanager.go @@ -823,8 +823,8 @@ func (s *trackSubscription) setSubscribedTrack(track types.SubscribedTrack) { s.lock.Unlock() if settings != nil && track != nil { - s.logger.Debugw("restoring subscriber settings", "settings", settings) - track.UpdateSubscriberSettings(settings) + s.logger.Debugw("restoring subscriber settings", "settings", logger.Proto(settings)) + track.UpdateSubscriberSettings(settings, true) } if oldTrack != nil { oldTrack.OnClose(nil) @@ -895,7 +895,7 @@ func (s *trackSubscription) setSettings(settings *livekit.UpdateTrackSettings) { subTrack := s.subscribedTrack s.lock.Unlock() if subTrack != nil { - subTrack.UpdateSubscriberSettings(settings) + subTrack.UpdateSubscriberSettings(settings, false) } } diff --git a/pkg/rtc/subscriptionmanager_test.go b/pkg/rtc/subscriptionmanager_test.go index 9ad6f20ea..a666f47f6 100644 --- a/pkg/rtc/subscriptionmanager_test.go +++ b/pkg/rtc/subscriptionmanager_test.go @@ -344,7 +344,7 @@ func TestUpdateSettingsBeforeSubscription(t *testing.T) { return st.UpdateSubscriberSettingsCallCount() == 1 }, subSettleTimeout, subCheckInterval, "UpdateSubscriberSettings should be called once") - applied := st.UpdateSubscriberSettingsArgsForCall(0) + applied, _ := st.UpdateSubscriberSettingsArgsForCall(0) require.Equal(t, settings.Disabled, applied.Disabled) require.Equal(t, settings.Width, applied.Width) require.Equal(t, settings.Height, applied.Height) diff --git a/pkg/rtc/types/interfaces.go b/pkg/rtc/types/interfaces.go index 32eb1e35c..a08443d7a 100644 --- a/pkg/rtc/types/interfaces.go +++ b/pkg/rtc/types/interfaces.go @@ -523,7 +523,7 @@ type SubscribedTrack interface { RTPSender() *webrtc.RTPSender IsMuted() bool SetPublisherMuted(muted bool) - UpdateSubscriberSettings(settings *livekit.UpdateTrackSettings) + UpdateSubscriberSettings(settings *livekit.UpdateTrackSettings, isImmediate bool) // selects appropriate video layer according to subscriber preferences UpdateVideoLayer() NeedsNegotiation() bool diff --git a/pkg/rtc/types/typesfakes/fake_subscribed_track.go b/pkg/rtc/types/typesfakes/fake_subscribed_track.go index 833b8e4b3..375e2cb44 100644 --- a/pkg/rtc/types/typesfakes/fake_subscribed_track.go +++ b/pkg/rtc/types/typesfakes/fake_subscribed_track.go @@ -161,10 +161,11 @@ type FakeSubscribedTrack struct { subscriberIdentityReturnsOnCall map[int]struct { result1 livekit.ParticipantIdentity } - UpdateSubscriberSettingsStub func(*livekit.UpdateTrackSettings) + UpdateSubscriberSettingsStub func(*livekit.UpdateTrackSettings, bool) updateSubscriberSettingsMutex sync.RWMutex updateSubscriberSettingsArgsForCall []struct { arg1 *livekit.UpdateTrackSettings + arg2 bool } UpdateVideoLayerStub func() updateVideoLayerMutex sync.RWMutex @@ -991,16 +992,17 @@ func (fake *FakeSubscribedTrack) SubscriberIdentityReturnsOnCall(i int, result1 }{result1} } -func (fake *FakeSubscribedTrack) UpdateSubscriberSettings(arg1 *livekit.UpdateTrackSettings) { +func (fake *FakeSubscribedTrack) UpdateSubscriberSettings(arg1 *livekit.UpdateTrackSettings, arg2 bool) { fake.updateSubscriberSettingsMutex.Lock() fake.updateSubscriberSettingsArgsForCall = append(fake.updateSubscriberSettingsArgsForCall, struct { arg1 *livekit.UpdateTrackSettings - }{arg1}) + arg2 bool + }{arg1, arg2}) stub := fake.UpdateSubscriberSettingsStub - fake.recordInvocation("UpdateSubscriberSettings", []interface{}{arg1}) + fake.recordInvocation("UpdateSubscriberSettings", []interface{}{arg1, arg2}) fake.updateSubscriberSettingsMutex.Unlock() if stub != nil { - fake.UpdateSubscriberSettingsStub(arg1) + fake.UpdateSubscriberSettingsStub(arg1, arg2) } } @@ -1010,17 +1012,17 @@ func (fake *FakeSubscribedTrack) UpdateSubscriberSettingsCallCount() int { return len(fake.updateSubscriberSettingsArgsForCall) } -func (fake *FakeSubscribedTrack) UpdateSubscriberSettingsCalls(stub func(*livekit.UpdateTrackSettings)) { +func (fake *FakeSubscribedTrack) UpdateSubscriberSettingsCalls(stub func(*livekit.UpdateTrackSettings, bool)) { fake.updateSubscriberSettingsMutex.Lock() defer fake.updateSubscriberSettingsMutex.Unlock() fake.UpdateSubscriberSettingsStub = stub } -func (fake *FakeSubscribedTrack) UpdateSubscriberSettingsArgsForCall(i int) *livekit.UpdateTrackSettings { +func (fake *FakeSubscribedTrack) UpdateSubscriberSettingsArgsForCall(i int) (*livekit.UpdateTrackSettings, bool) { fake.updateSubscriberSettingsMutex.RLock() defer fake.updateSubscriberSettingsMutex.RUnlock() argsForCall := fake.updateSubscriberSettingsArgsForCall[i] - return argsForCall.arg1 + return argsForCall.arg1, argsForCall.arg2 } func (fake *FakeSubscribedTrack) UpdateVideoLayer() {