Make RTPTransceiver Stopped an atomic

Add an accessor to make getting value easy. Also add
TestPeerConnection_SkipStoppedTransceiver. This commit also cleans
up RTPTransceiver creation. We used a helper function, when we should
have just used the provide constructor
This commit is contained in:
Sean DuBois
2021-09-03 22:00:40 -04:00
parent 294595aff5
commit 6c3620093d
5 changed files with 97 additions and 59 deletions

View File

@@ -19,7 +19,7 @@ type RTPTransceiver struct {
codecs []RTPCodecParameters // User provided codecs via SetCodecPreferences
stopped bool
stopped atomicBool
kind RTPCodecType
api *API
@@ -141,21 +141,26 @@ func (t *RTPTransceiver) Direction() RTPTransceiverDirection {
// Stop irreversibly stops the RTPTransceiver
func (t *RTPTransceiver) Stop() error {
if sender := t.Sender(); sender != nil {
if err := sender.Stop(); err != nil {
return err
if t.stopped.compareAndSwap(false, true) {
if sender := t.Sender(); sender != nil {
if err := sender.Stop(); err != nil {
return err
}
}
}
if receiver := t.Receiver(); receiver != nil {
if err := receiver.Stop(); err != nil {
return err
}
}
if receiver := t.Receiver(); receiver != nil {
if err := receiver.Stop(); err != nil {
return err
}
t.setDirection(RTPTransceiverDirectionInactive)
t.setDirection(RTPTransceiverDirectionInactive)
}
}
return nil
}
// Stopped indicates whether or not RTPTransceiver has been stopped
func (t *RTPTransceiver) Stopped() bool { return t.stopped.get() }
func (t *RTPTransceiver) setReceiver(r *RTPReceiver) {
if r != nil {
r.setRTPTransceiver(t)