@@ -128,12 +128,19 @@ func (r *router) AddReceiver(receiver *webrtc.RTPReceiver, track *webrtc.TrackRe
128128 }
129129 })
130130
131- recv := r .receivers [trackID ]
132- if recv == nil {
131+ recv , ok := r .receivers [trackID ]
132+ if ! ok {
133133 recv = NewWebRTCReceiver (receiver , track , r .id )
134134 r .receivers [trackID ] = recv
135135 recv .SetRTCPCh (r .rtcpCh )
136136 recv .OnCloseHandler (func () {
137+ if r .config .WithStats {
138+ if track .Kind () == webrtc .RTPCodecTypeVideo {
139+ stats .VideoTracks .Dec ()
140+ } else {
141+ stats .AudioTracks .Dec ()
142+ }
143+ }
137144 r .deleteReceiver (trackID , uint32 (track .SSRC ()))
138145 })
139146 publish = true
@@ -217,11 +224,13 @@ func (r *router) addDownTrack(sub *Subscriber, recv Receiver) error {
217224
218225 // nolint:scopelint
219226 downTrack .OnCloseHandler (func () {
220- if err := sub .pc .RemoveTrack (downTrack .transceiver .Sender ()); err != nil {
221- log .Errorf ("Error closing down track: %v" , err )
222- } else {
223- sub .RemoveDownTrack (recv .StreamID (), downTrack )
224- sub .negotiate ()
227+ if sub .pc .ConnectionState () != webrtc .PeerConnectionStateClosed {
228+ if err := sub .pc .RemoveTrack (downTrack .transceiver .Sender ()); err != nil {
229+ log .Errorf ("Error closing down track: %v" , err )
230+ } else {
231+ sub .RemoveDownTrack (recv .StreamID (), downTrack )
232+ sub .negotiate ()
233+ }
225234 }
226235 })
227236
@@ -236,14 +245,6 @@ func (r *router) addDownTrack(sub *Subscriber, recv Receiver) error {
236245
237246func (r * router ) deleteReceiver (track string , ssrc uint32 ) {
238247 r .Lock ()
239- if r .config .WithStats {
240- if r .receivers [track ].Kind () == webrtc .RTPCodecTypeVideo {
241- stats .VideoTracks .Dec ()
242- } else {
243- stats .AudioTracks .Dec ()
244- }
245- }
246-
247248 delete (r .receivers , track )
248249 delete (r .stats , ssrc )
249250 r .Unlock ()
0 commit comments