diff --git a/pkg/rtc/mediatracksubscriptions.go b/pkg/rtc/mediatracksubscriptions.go index 6e22cc29c..dd5a65942 100644 --- a/pkg/rtc/mediatracksubscriptions.go +++ b/pkg/rtc/mediatracksubscriptions.go @@ -309,6 +309,7 @@ func (t *MediaTrackSubscriptions) AddSubscriber(sub types.LocalParticipant, wr * // but it is not detrimental to set this, needs clean up when participants modes are separated out better. subTrack.SetNeedsNegotiation(!replacedTrack) subTrack.SetRTPSender(sender) + // it is possible that subscribed track is closed before subscription manager sets // the `OnClose` callback. That handler in subscription manager removes the track // from the peer connection. diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index 03730b385..754b165c9 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -2954,6 +2954,10 @@ func (p *ParticipantImpl) SupportsSyncStreamID() bool { } func (p *ParticipantImpl) SupportsTransceiverReuse() bool { + if p.params.UseOneShotSignallingMode { + return p.ProtocolVersion().SupportsTransceiverReuse() + } + return p.ProtocolVersion().SupportsTransceiverReuse() && !p.SupportsSyncStreamID() } diff --git a/pkg/rtc/subscriptionmanager.go b/pkg/rtc/subscriptionmanager.go index ce05fca4b..927b14a1d 100644 --- a/pkg/rtc/subscriptionmanager.go +++ b/pkg/rtc/subscriptionmanager.go @@ -645,6 +645,7 @@ func (m *SubscriptionManager) subscribeSynchronous(trackID livekit.TrackID) erro m.subscriptions[trackID] = sub } m.lock.Unlock() + sub.setDesired(true) subTrack, err := track.AddSubscriber(m.params.Participant) if err != nil && !errors.Is(err, errAlreadySubscribed) {