فهرست منبع

Close tracks on PeerConnection close or failure

Paul-Louis Ageneau 3 سال پیش
والد
کامیت
4b0a24856c
2فایلهای تغییر یافته به همراه14 افزوده شده و 3 حذف شده
  1. 13 3
      src/impl/peerconnection.cpp
  2. 1 0
      src/impl/peerconnection.hpp

+ 13 - 3
src/impl/peerconnection.cpp

@@ -83,8 +83,9 @@ void PeerConnection::close() {
 
 	negotiationNeeded = false;
 
-	// Close data channels asynchronously
+	// Close data channels and tracks asynchronously
 	mProcessor->enqueue(&PeerConnection::closeDataChannels, this);
+	mProcessor->enqueue(&PeerConnection::closeTracks, this);
 
 	closeTransports();
 }
@@ -225,9 +226,11 @@ shared_ptr<DtlsTransport> PeerConnection::initDtlsTransport() {
 				    break;
 			    case DtlsTransport::State::Failed:
 				    changeState(State::Failed);
+				    mProcessor->enqueue(&PeerConnection::closeTracks, this);
 				    break;
 			    case DtlsTransport::State::Disconnected:
 				    changeState(State::Disconnected);
+				    mProcessor->enqueue(&PeerConnection::closeTracks, this);
 				    break;
 			    default:
 				    // Ignore
@@ -752,14 +755,21 @@ void PeerConnection::openTracks() {
 	if (auto transport = std::atomic_load(&mDtlsTransport)) {
 		auto srtpTransport = std::dynamic_pointer_cast<DtlsSrtpTransport>(transport);
 		std::shared_lock lock(mTracksMutex); // read-only
-		for (auto it = mTracks.begin(); it != mTracks.end(); ++it)
-			if (auto track = it->second.lock())
+		for (auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it)
+			if (auto track = it->lock())
 				if (!track->isOpen())
 					track->open(srtpTransport);
 	}
 #endif
 }
 
+void PeerConnection::closeTracks() {
+	std::shared_lock lock(mTracksMutex); // read-only
+	for (auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it)
+		if (auto track = it->lock())
+			track->close();
+}
+
 void PeerConnection::validateRemoteDescription(const Description &description) {
 	if (!description.iceUfrag())
 		throw std::invalid_argument("Remote description has no ICE user fragment");

+ 1 - 0
src/impl/peerconnection.hpp

@@ -77,6 +77,7 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
 	shared_ptr<Track> emplaceTrack(Description::Media description);
 	void incomingTrack(Description::Media description);
 	void openTracks();
+	void closeTracks();
 
 	void validateRemoteDescription(const Description &description);
 	void processLocalDescription(Description description);