Browse Source

Added optional stream to emplaceDataChannel()

Paul-Louis Ageneau 4 years ago
parent
commit
5eaed06b01
2 changed files with 15 additions and 11 deletions
  1. 2 1
      include/rtc/peerconnection.hpp
  2. 13 10
      src/peerconnection.cpp

+ 2 - 1
include/rtc/peerconnection.hpp

@@ -135,7 +135,8 @@ private:
 	void forwardBufferedAmount(uint16_t stream, size_t amount);
 	void forwardBufferedAmount(uint16_t stream, size_t amount);
 
 
 	std::shared_ptr<DataChannel> emplaceDataChannel(Description::Role role, string label,
 	std::shared_ptr<DataChannel> emplaceDataChannel(Description::Role role, string label,
-	                                                string protocol, Reliability reliability);
+	                                                string protocol, Reliability reliability,
+	                                                std::optional<unsigned int> stream = nullopt);
 	std::shared_ptr<DataChannel> findDataChannel(uint16_t stream);
 	std::shared_ptr<DataChannel> findDataChannel(uint16_t stream);
 	void iterateDataChannels(std::function<void(std::shared_ptr<DataChannel> channel)> func);
 	void iterateDataChannels(std::function<void(std::shared_ptr<DataChannel> channel)> func);
 	void openDataChannels();
 	void openDataChannels();

+ 13 - 10
src/peerconnection.cpp

@@ -735,18 +735,21 @@ void PeerConnection::forwardBufferedAmount(uint16_t stream, size_t amount) {
 
 
 shared_ptr<DataChannel> PeerConnection::emplaceDataChannel(Description::Role role, string label,
 shared_ptr<DataChannel> PeerConnection::emplaceDataChannel(Description::Role role, string label,
                                                            string protocol,
                                                            string protocol,
-                                                           Reliability reliability) {
-	// The active side must use streams with even identifiers, whereas the passive side must use
-	// streams with odd identifiers.
-	// See https://tools.ietf.org/html/draft-ietf-rtcweb-data-protocol-09#section-6
+                                                           Reliability reliability,
+                                                           std::optional<unsigned int> stream) {
 	std::unique_lock lock(mDataChannelsMutex); // we are going to emplace
 	std::unique_lock lock(mDataChannelsMutex); // we are going to emplace
-	unsigned int stream = (role == Description::Role::Active) ? 0 : 1;
-	while (mDataChannels.find(stream) != mDataChannels.end()) {
-		stream += 2;
-		if (stream >= 65535)
-			throw std::runtime_error("Too many DataChannels");
+	if(!stream) {
+		// The active side must use streams with even identifiers, whereas the passive side must use
+		// streams with odd identifiers.
+		// See https://tools.ietf.org/html/draft-ietf-rtcweb-data-protocol-09#section-6
+		*stream = (role == Description::Role::Active) ? 0 : 1;
+		while (mDataChannels.find(*stream) != mDataChannels.end()) {
+			*stream += 2;
+			if (*stream >= 65535)
+				throw std::runtime_error("Too many DataChannels");
+		}
 	}
 	}
-	auto channel = std::make_shared<DataChannel>(shared_from_this(), stream, std::move(label),
+	auto channel = std::make_shared<DataChannel>(shared_from_this(), *stream, std::move(label),
 	                                             std::move(protocol), std::move(reliability));
 	                                             std::move(protocol), std::move(reliability));
 	mDataChannels.emplace(std::make_pair(stream, channel));
 	mDataChannels.emplace(std::make_pair(stream, channel));
 	return channel;
 	return channel;