From 3b2b3a4929db7ceb28aaab25ea5e129fa2dc22ef Mon Sep 17 00:00:00 2001 From: David Zhao Date: Tue, 22 Jun 2021 14:13:24 -0700 Subject: [PATCH] debounce track settings API to match client usage pattern --- pkg/rtc/subscribedtrack.go | 35 ++++--- pkg/rtc/types/interfaces.go | 3 +- .../types/typesfakes/fake_subscribed_track.go | 97 ++++++------------- pkg/service/roommanager.go | 3 +- 4 files changed, 53 insertions(+), 85 deletions(-) diff --git a/pkg/rtc/subscribedtrack.go b/pkg/rtc/subscribedtrack.go index cabbd70d8..9172091f0 100644 --- a/pkg/rtc/subscribedtrack.go +++ b/pkg/rtc/subscribedtrack.go @@ -1,6 +1,9 @@ package rtc import ( + "time" + + "github.com/bep/debounce" "github.com/pion/ion-sfu/pkg/sfu" "github.com/pion/webrtc/v3" @@ -8,15 +11,21 @@ import ( "github.com/livekit/protocol/utils" ) +const ( + subscriptionDebounceInterval = 10 * time.Millisecond +) + type SubscribedTrack struct { - dt *sfu.DownTrack - subMuted utils.AtomicFlag - pubMuted utils.AtomicFlag + dt *sfu.DownTrack + subMuted utils.AtomicFlag + pubMuted utils.AtomicFlag + debouncer func(func()) } func NewSubscribedTrack(dt *sfu.DownTrack) *SubscribedTrack { return &SubscribedTrack{ - dt: dt, + dt: dt, + debouncer: debounce.New(subscriptionDebounceInterval), } } @@ -33,21 +42,19 @@ func (t *SubscribedTrack) IsMuted() bool { return t.subMuted.Get() } -// set subscriber mute preference -func (t *SubscribedTrack) SetMuted(muted bool) { - t.subMuted.TrySet(muted) - t.updateDownTrackMute() -} - func (t *SubscribedTrack) SetPublisherMuted(muted bool) { t.pubMuted.TrySet(muted) t.updateDownTrackMute() } -func (t *SubscribedTrack) SetVideoQuality(quality livekit.VideoQuality) { - if t.dt.Kind() == webrtc.RTPCodecTypeVideo { - t.dt.SwitchSpatialLayer(spatialLayerForQuality(quality), true) - } +func (t *SubscribedTrack) UpdateSubscriberSettings(enabled bool, quality livekit.VideoQuality) { + t.debouncer(func() { + t.subMuted.TrySet(!enabled) + t.updateDownTrackMute() + if enabled && t.dt.Kind() == webrtc.RTPCodecTypeVideo { + _ = t.dt.SwitchSpatialLayer(spatialLayerForQuality(quality), true) + } + }) } func (t *SubscribedTrack) updateDownTrackMute() { diff --git a/pkg/rtc/types/interfaces.go b/pkg/rtc/types/interfaces.go index 7651824fc..301bf515c 100644 --- a/pkg/rtc/types/interfaces.go +++ b/pkg/rtc/types/interfaces.go @@ -105,9 +105,8 @@ type SubscribedTrack interface { ID() string DownTrack() *sfu.DownTrack IsMuted() bool - SetMuted(muted bool) - SetVideoQuality(quality livekit.VideoQuality) SetPublisherMuted(muted bool) + UpdateSubscriberSettings(enabled bool, quality livekit.VideoQuality) } // interface for properties of webrtc.TrackRemote diff --git a/pkg/rtc/types/typesfakes/fake_subscribed_track.go b/pkg/rtc/types/typesfakes/fake_subscribed_track.go index c765f6fbb..a251fb555 100644 --- a/pkg/rtc/types/typesfakes/fake_subscribed_track.go +++ b/pkg/rtc/types/typesfakes/fake_subscribed_track.go @@ -40,20 +40,16 @@ type FakeSubscribedTrack struct { isMutedReturnsOnCall map[int]struct { result1 bool } - SetMutedStub func(bool) - setMutedMutex sync.RWMutex - setMutedArgsForCall []struct { - arg1 bool - } SetPublisherMutedStub func(bool) setPublisherMutedMutex sync.RWMutex setPublisherMutedArgsForCall []struct { arg1 bool } - SetVideoQualityStub func(livekit.VideoQuality) - setVideoQualityMutex sync.RWMutex - setVideoQualityArgsForCall []struct { - arg1 livekit.VideoQuality + UpdateSubscriberSettingsStub func(bool, livekit.VideoQuality) + updateSubscriberSettingsMutex sync.RWMutex + updateSubscriberSettingsArgsForCall []struct { + arg1 bool + arg2 livekit.VideoQuality } invocations map[string][][]interface{} invocationsMutex sync.RWMutex @@ -218,38 +214,6 @@ func (fake *FakeSubscribedTrack) IsMutedReturnsOnCall(i int, result1 bool) { }{result1} } -func (fake *FakeSubscribedTrack) SetMuted(arg1 bool) { - fake.setMutedMutex.Lock() - fake.setMutedArgsForCall = append(fake.setMutedArgsForCall, struct { - arg1 bool - }{arg1}) - stub := fake.SetMutedStub - fake.recordInvocation("SetMuted", []interface{}{arg1}) - fake.setMutedMutex.Unlock() - if stub != nil { - fake.SetMutedStub(arg1) - } -} - -func (fake *FakeSubscribedTrack) SetMutedCallCount() int { - fake.setMutedMutex.RLock() - defer fake.setMutedMutex.RUnlock() - return len(fake.setMutedArgsForCall) -} - -func (fake *FakeSubscribedTrack) SetMutedCalls(stub func(bool)) { - fake.setMutedMutex.Lock() - defer fake.setMutedMutex.Unlock() - fake.SetMutedStub = stub -} - -func (fake *FakeSubscribedTrack) SetMutedArgsForCall(i int) bool { - fake.setMutedMutex.RLock() - defer fake.setMutedMutex.RUnlock() - argsForCall := fake.setMutedArgsForCall[i] - return argsForCall.arg1 -} - func (fake *FakeSubscribedTrack) SetPublisherMuted(arg1 bool) { fake.setPublisherMutedMutex.Lock() fake.setPublisherMutedArgsForCall = append(fake.setPublisherMutedArgsForCall, struct { @@ -282,36 +246,37 @@ func (fake *FakeSubscribedTrack) SetPublisherMutedArgsForCall(i int) bool { return argsForCall.arg1 } -func (fake *FakeSubscribedTrack) SetVideoQuality(arg1 livekit.VideoQuality) { - fake.setVideoQualityMutex.Lock() - fake.setVideoQualityArgsForCall = append(fake.setVideoQualityArgsForCall, struct { - arg1 livekit.VideoQuality - }{arg1}) - stub := fake.SetVideoQualityStub - fake.recordInvocation("SetVideoQuality", []interface{}{arg1}) - fake.setVideoQualityMutex.Unlock() +func (fake *FakeSubscribedTrack) UpdateSubscriberSettings(arg1 bool, arg2 livekit.VideoQuality) { + fake.updateSubscriberSettingsMutex.Lock() + fake.updateSubscriberSettingsArgsForCall = append(fake.updateSubscriberSettingsArgsForCall, struct { + arg1 bool + arg2 livekit.VideoQuality + }{arg1, arg2}) + stub := fake.UpdateSubscriberSettingsStub + fake.recordInvocation("UpdateSubscriberSettings", []interface{}{arg1, arg2}) + fake.updateSubscriberSettingsMutex.Unlock() if stub != nil { - fake.SetVideoQualityStub(arg1) + fake.UpdateSubscriberSettingsStub(arg1, arg2) } } -func (fake *FakeSubscribedTrack) SetVideoQualityCallCount() int { - fake.setVideoQualityMutex.RLock() - defer fake.setVideoQualityMutex.RUnlock() - return len(fake.setVideoQualityArgsForCall) +func (fake *FakeSubscribedTrack) UpdateSubscriberSettingsCallCount() int { + fake.updateSubscriberSettingsMutex.RLock() + defer fake.updateSubscriberSettingsMutex.RUnlock() + return len(fake.updateSubscriberSettingsArgsForCall) } -func (fake *FakeSubscribedTrack) SetVideoQualityCalls(stub func(livekit.VideoQuality)) { - fake.setVideoQualityMutex.Lock() - defer fake.setVideoQualityMutex.Unlock() - fake.SetVideoQualityStub = stub +func (fake *FakeSubscribedTrack) UpdateSubscriberSettingsCalls(stub func(bool, livekit.VideoQuality)) { + fake.updateSubscriberSettingsMutex.Lock() + defer fake.updateSubscriberSettingsMutex.Unlock() + fake.UpdateSubscriberSettingsStub = stub } -func (fake *FakeSubscribedTrack) SetVideoQualityArgsForCall(i int) livekit.VideoQuality { - fake.setVideoQualityMutex.RLock() - defer fake.setVideoQualityMutex.RUnlock() - argsForCall := fake.setVideoQualityArgsForCall[i] - return argsForCall.arg1 +func (fake *FakeSubscribedTrack) UpdateSubscriberSettingsArgsForCall(i int) (bool, livekit.VideoQuality) { + fake.updateSubscriberSettingsMutex.RLock() + defer fake.updateSubscriberSettingsMutex.RUnlock() + argsForCall := fake.updateSubscriberSettingsArgsForCall[i] + return argsForCall.arg1, argsForCall.arg2 } func (fake *FakeSubscribedTrack) Invocations() map[string][][]interface{} { @@ -323,12 +288,10 @@ func (fake *FakeSubscribedTrack) Invocations() map[string][][]interface{} { defer fake.iDMutex.RUnlock() fake.isMutedMutex.RLock() defer fake.isMutedMutex.RUnlock() - fake.setMutedMutex.RLock() - defer fake.setMutedMutex.RUnlock() fake.setPublisherMutedMutex.RLock() defer fake.setPublisherMutedMutex.RUnlock() - fake.setVideoQualityMutex.RLock() - defer fake.setVideoQualityMutex.RUnlock() + fake.updateSubscriberSettingsMutex.RLock() + defer fake.updateSubscriberSettingsMutex.RUnlock() copiedInvocations := map[string][][]interface{}{} for key, value := range fake.invocations { copiedInvocations[key] = value diff --git a/pkg/service/roommanager.go b/pkg/service/roommanager.go index 0cd407041..8b45c820a 100644 --- a/pkg/service/roommanager.go +++ b/pkg/service/roommanager.go @@ -414,8 +414,7 @@ func (r *RoomManager) rtcSessionWorker(room *rtc.Room, participant types.Partici logger.Debugw("updating track settings", "participant", participant.Identity(), "settings", msg.TrackSetting) - subTrack.SetMuted(msg.TrackSetting.Disabled) - subTrack.SetVideoQuality(msg.TrackSetting.Quality) + subTrack.UpdateSubscriberSettings(!msg.TrackSetting.Disabled, msg.TrackSetting.Quality) } } case *livekit.SignalRequest_Leave: