From b1a4d00fa98bf8cdf945f2bb8debfda38bad74d2 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Mon, 1 Apr 2024 16:14:30 +0530 Subject: [PATCH] Replace receiver when there is an existing one. (#2611) The receiver should not change, but code wise, the option of replacing receiver object makes more sense, i.e. otherwise, it could look like we are leaving the stale object in there without replacing with new receiver of same type. --- pkg/rtc/mediatrackreceiver.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pkg/rtc/mediatrackreceiver.go b/pkg/rtc/mediatrackreceiver.go index 19f4483f5..6c40b778e 100644 --- a/pkg/rtc/mediatrackreceiver.go +++ b/pkg/rtc/mediatrackreceiver.go @@ -161,19 +161,21 @@ func (t *MediaTrackReceiver) SetupReceiver(receiver sfu.TrackReceiver, priority receivers := slices.Clone(t.receivers) // codec position maybe taken by DummyReceiver, check and upgrade to WebRTCReceiver - var existingReceiver bool - for _, r := range receivers { + idx := -1 + for i, r := range receivers { if strings.EqualFold(r.Codec().MimeType, receiver.Codec().MimeType) { - existingReceiver = true - if d, ok := r.TrackReceiver.(*DummyReceiver); ok { - d.Upgrade(receiver) - } + idx = i break } } - if !existingReceiver { - receivers = append(receivers, &simulcastReceiver{TrackReceiver: receiver, priority: priority}) + if idx != -1 { + if d, ok := receivers[idx].TrackReceiver.(*DummyReceiver); ok { + d.Upgrade(receiver) + } + // replace receiver + receivers = slices.Delete(receivers, idx, idx+1) } + receivers = append(receivers, &simulcastReceiver{TrackReceiver: receiver, priority: priority}) sort.Slice(receivers, func(i, j int) bool { return receivers[i].Priority() < receivers[j].Priority()