Browse Source

Removed move for track control messages as they may be forwarded into multiple tracks

Paul-Louis Ageneau 3 years ago
parent
commit
f5fbae8e96
3 changed files with 24 additions and 6 deletions
  1. 1 0
      include/rtc/message.hpp
  2. 14 6
      src/impl/track.cpp
  3. 9 0
      src/message.cpp

+ 1 - 0
include/rtc/message.hpp

@@ -71,6 +71,7 @@ RTC_CPP_EXPORT message_ptr make_message(binary &&data, Message::Type type = Mess
 RTC_CPP_EXPORT message_ptr make_message(message_variant data);
 
 RTC_CPP_EXPORT message_variant to_variant(Message &&message);
+RTC_CPP_EXPORT message_variant to_variant(const Message &message);
 
 } // namespace rtc
 

+ 14 - 6
src/impl/track.cpp

@@ -73,16 +73,24 @@ void Track::close() {
 }
 
 optional<message_variant> Track::receive() {
-	if (auto next = mRecvQueue.tryPop())
-		return to_variant(std::move(**next));
-
+	if (auto next = mRecvQueue.tryPop()) {
+		message_ptr message = *next;
+		if (message->type == Message::Control)
+			return to_variant(**next); // The same message may be frowarded into multiple Tracks
+		else
+			return to_variant(std::move(*message));
+	}
 	return nullopt;
 }
 
 optional<message_variant> Track::peek() {
-	if (auto next = mRecvQueue.peek())
-		return to_variant(std::move(**next));
-
+	if (auto next = mRecvQueue.peek()) {
+		message_ptr message = *next;
+		if (message->type == Message::Control)
+			return to_variant(**next); // The same message may be forwarded into multiple Tracks
+		else
+			return to_variant(std::move(*message));
+	}
 	return nullopt;
 }
 

+ 9 - 0
src/message.cpp

@@ -57,4 +57,13 @@ message_variant to_variant(Message &&message) {
 	}
 }
 
+message_variant to_variant(const Message &message) {
+	switch (message.type) {
+	case Message::String:
+		return string(reinterpret_cast<const char *>(message.data()), message.size());
+	default:
+		return message;
+	}
+}
+
 } // namespace rtc