summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabio Alessandrelli <fabio.alessandrelli@gmail.com>2021-07-09 16:24:35 +0200
committerGitHub <noreply@github.com>2021-07-09 16:24:35 +0200
commiteeabf0a8446c41ce8b11c063ede07337ba7eabbb (patch)
tree46051009da46064afab43fb816dc47db5c032a98
parentfa5296a4e428d625351082d13248f7f7c20f0598 (diff)
parent04fbae6ce38550fac2a8be3786405949563304d5 (diff)
downloadfork-godot-webrtc-native-eeabf0a8446c41ce8b11c063ede07337ba7eabbb.tar.gz
fork-godot-webrtc-native-eeabf0a8446c41ce8b11c063ede07337ba7eabbb.tar.bz2
fork-godot-webrtc-native-eeabf0a8446c41ce8b11c063ede07337ba7eabbb.zip
Merge pull request #38 from Faless/refactor/signals
Refactor signals and obeserver, fixes answer creation.
-rw-r--r--src/WebRTCLibObservers.cpp53
-rw-r--r--src/WebRTCLibPeerConnection.cpp49
-rw-r--r--src/WebRTCLibPeerConnection.hpp75
3 files changed, 90 insertions, 87 deletions
diff --git a/src/WebRTCLibObservers.cpp b/src/WebRTCLibObservers.cpp
deleted file mode 100644
index 6d8f15f..0000000
--- a/src/WebRTCLibObservers.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#include "WebRTCLibDataChannel.hpp"
-#include "WebRTCLibPeerConnection.hpp"
-
-using namespace godot_webrtc;
-
-// CreateSessionObseerver
-WebRTCLibPeerConnection::GodotCSDO::GodotCSDO(WebRTCLibPeerConnection *parent) {
- this->parent = parent;
-}
-
-void WebRTCLibPeerConnection::GodotCSDO::OnSuccess(webrtc::SessionDescriptionInterface *desc) {
- // serialize this offer and send it to the remote peer:
- std::string sdp; // sdp = session description protocol
- desc->ToString(&sdp);
- parent->queue_signal("session_description_created", 2, desc->type().c_str(), sdp.c_str());
-};
-
-void WebRTCLibPeerConnection::GodotCSDO::OnFailure(webrtc::RTCError error){};
-
-// SetSessionObseerver
-WebRTCLibPeerConnection::GodotSSDO::GodotSSDO(WebRTCLibPeerConnection *parent) {
- this->parent = parent;
-}
-
-void WebRTCLibPeerConnection::GodotSSDO::OnSuccess(){};
-void WebRTCLibPeerConnection::GodotSSDO::OnFailure(webrtc::RTCError error){};
-
-// PeerConnectionObserver
-WebRTCLibPeerConnection::GodotPCO::GodotPCO(WebRTCLibPeerConnection *parent) {
- this->parent = parent;
-}
-
-void WebRTCLibPeerConnection::GodotPCO::OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) {
- parent->queue_signal("data_channel_received", 1, WebRTCLibDataChannel::new_data_channel(data_channel));
-}
-
-void WebRTCLibPeerConnection::GodotPCO::OnIceCandidate(const webrtc::IceCandidateInterface *candidate) {
- godot::Dictionary candidateSDP;
- godot::String candidateSdpMidName = candidate->sdp_mid().c_str();
- int candidateSdpMlineIndexName = candidate->sdp_mline_index();
- std::string sdp;
- candidate->ToString(&sdp);
- godot::String candidateSdpName = sdp.c_str();
-
- parent->queue_signal("ice_candidate_created", 3, candidateSdpMidName, candidateSdpMlineIndexName, candidateSdpName);
-}
-
-void WebRTCLibPeerConnection::GodotPCO::OnSignalingChange(webrtc::PeerConnectionInterface::SignalingState new_state) {}
-void WebRTCLibPeerConnection::GodotPCO::OnAddStream(rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) {}
-void WebRTCLibPeerConnection::GodotPCO::OnRemoveStream(rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) {}
-void WebRTCLibPeerConnection::GodotPCO::OnRenegotiationNeeded() {}
-void WebRTCLibPeerConnection::GodotPCO::OnIceConnectionChange(webrtc::PeerConnectionInterface::IceConnectionState new_state) {}
-void WebRTCLibPeerConnection::GodotPCO::OnIceGatheringChange(webrtc::PeerConnectionInterface::IceGatheringState new_state) {}
diff --git a/src/WebRTCLibPeerConnection.cpp b/src/WebRTCLibPeerConnection.cpp
index d95b1e6..eb4e8cc 100644
--- a/src/WebRTCLibPeerConnection.cpp
+++ b/src/WebRTCLibPeerConnection.cpp
@@ -7,6 +7,33 @@ using namespace godot_webrtc;
std::unique_ptr<rtc::Thread> WebRTCLibPeerConnection::signaling_thread = nullptr;
+// PeerConnectionObserver
+void WebRTCLibPeerConnection::GodotPCO::OnIceCandidate(const webrtc::IceCandidateInterface *candidate) {
+ godot::Dictionary candidateSDP;
+ godot::String candidateSdpMidName = candidate->sdp_mid().c_str();
+ int candidateSdpMlineIndexName = candidate->sdp_mline_index();
+ std::string sdp;
+ candidate->ToString(&sdp);
+ godot::String candidateSdpName = sdp.c_str();
+ parent->queue_signal("ice_candidate_created", 3, candidateSdpMidName, candidateSdpMlineIndexName, candidateSdpName);
+}
+
+// SetSessionDescriptionObserver
+void WebRTCLibPeerConnection::GodotSSDO::OnSuccess() {
+ if (make_offer) {
+ make_offer = false;
+ parent->peer_connection->CreateAnswer(parent->ptr_csdo, webrtc::PeerConnectionInterface::RTCOfferAnswerOptions());
+ }
+}
+
+// CreateSessionDescriptionObserver
+void WebRTCLibPeerConnection::GodotCSDO::OnSuccess(webrtc::SessionDescriptionInterface *desc) {
+ // serialize this offer and send it to the remote peer:
+ std::string sdp;
+ desc->ToString(&sdp);
+ parent->queue_signal("session_description_created", 2, desc->type().c_str(), sdp.c_str());
+}
+
void WebRTCLibPeerConnection::initialize_signaling() {
if (signaling_thread.get() == nullptr) {
signaling_thread = rtc::Thread::Create();
@@ -142,8 +169,10 @@ godot_error WebRTCLibPeerConnection::create_offer() {
godot_error WebRTCLibPeerConnection::set_remote_description(const char *type, const char *sdp) {
ERR_FAIL_COND_V(peer_connection.get() == nullptr, GODOT_ERR_UNCONFIGURED);
std::unique_ptr<webrtc::SessionDescriptionInterface> desc = _MAKE_DESC(type, sdp);
+ if (desc->GetType() == webrtc::SdpType::kOffer) {
+ ptr_ssdo->make_offer = true;
+ }
peer_connection->SetRemoteDescription(ptr_ssdo, desc.release());
- peer_connection->CreateAnswer(ptr_csdo, webrtc::PeerConnectionInterface::RTCOfferAnswerOptions());
return GODOT_OK;
}
@@ -174,14 +203,12 @@ godot_error WebRTCLibPeerConnection::add_ice_candidate(const char *sdpMidName, i
godot_error WebRTCLibPeerConnection::poll() {
ERR_FAIL_COND_V(peer_connection.get() == nullptr, GODOT_ERR_UNCONFIGURED);
- std::function<void()> signal;
while (!signal_queue.empty()) {
mutex_signal_queue->lock();
- signal = signal_queue.front();
+ Signal signal = signal_queue.front();
signal_queue.pop();
mutex_signal_queue->unlock();
-
- signal();
+ signal.emit(this);
}
return GODOT_OK;
}
@@ -244,15 +271,7 @@ WebRTCLibPeerConnection::~WebRTCLibPeerConnection() {
void WebRTCLibPeerConnection::queue_signal(godot::String p_name, int p_argc, const godot::Variant &p_arg1, const godot::Variant &p_arg2, const godot::Variant &p_arg3) {
mutex_signal_queue->lock();
- signal_queue.push(
- [this, p_name, p_argc, p_arg1, p_arg2, p_arg3] {
- if (p_argc == 1) {
- emit_signal(p_name, p_arg1);
- } else if (p_argc == 2) {
- emit_signal(p_name, p_arg1, p_arg2);
- } else {
- emit_signal(p_name, p_arg1, p_arg2, p_arg3);
- }
- });
+ const godot::Variant argv[3] = { p_arg1, p_arg2, p_arg3 };
+ signal_queue.push(Signal(p_name, p_argc, argv));
mutex_signal_queue->unlock();
}
diff --git a/src/WebRTCLibPeerConnection.hpp b/src/WebRTCLibPeerConnection.hpp
index 8c5d9b8..85ef33f 100644
--- a/src/WebRTCLibPeerConnection.hpp
+++ b/src/WebRTCLibPeerConnection.hpp
@@ -5,8 +5,7 @@
#include "api/peer_connection_interface.h" // interface for all things needed from WebRTC
#include "media/base/media_engine.h" // needed for CreateModularPeerConnectionFactory
-#include <functional> // std::function
-#include <mutex> // mutex @TODO replace std::mutex with Godot mutex
+#include <mutex>
#include "net/WebRTCPeerConnectionNative.hpp"
@@ -41,9 +40,8 @@ public:
~WebRTCLibPeerConnection();
/* helper functions */
-
+private:
void queue_signal(godot::String p_name, int p_argc, const godot::Variant &p_arg1 = godot::Variant(), const godot::Variant &p_arg2 = godot::Variant(), const godot::Variant &p_arg3 = godot::Variant());
- // void queue_signal(godot::StringName p_name, Variant_ARG_LIST);
void queue_packet(uint8_t *, int);
/** PeerConnectionObserver callback functions **/
@@ -51,35 +49,74 @@ public:
public:
WebRTCLibPeerConnection *parent;
- GodotPCO(WebRTCLibPeerConnection *parent);
- void OnSignalingChange(webrtc::PeerConnectionInterface::SignalingState new_state) override;
- void OnAddStream(rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
- void OnRemoveStream(rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
- void OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) override;
- void OnRenegotiationNeeded() override;
- void OnIceConnectionChange(webrtc::PeerConnectionInterface::IceConnectionState new_state) override;
- void OnIceGatheringChange(webrtc::PeerConnectionInterface::IceGatheringState new_state) override;
+ GodotPCO(WebRTCLibPeerConnection *p_parent) {
+ parent = p_parent;
+ }
void OnIceCandidate(const webrtc::IceCandidateInterface *candidate) override;
+
+ void OnSignalingChange(webrtc::PeerConnectionInterface::SignalingState new_state) override {}
+ void OnAddStream(rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override {}
+ void OnRemoveStream(rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override {}
+ void OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) override {}
+ void OnRenegotiationNeeded() override {}
+ void OnIceConnectionChange(webrtc::PeerConnectionInterface::IceConnectionState new_state) override {}
+ void OnIceGatheringChange(webrtc::PeerConnectionInterface::IceGatheringState new_state) override {}
};
/** CreateSessionDescriptionObserver callback functions **/
class GodotCSDO : public webrtc::CreateSessionDescriptionObserver {
public:
- WebRTCLibPeerConnection *parent;
+ WebRTCLibPeerConnection *parent = nullptr;
- GodotCSDO(WebRTCLibPeerConnection *parent);
+ GodotCSDO(WebRTCLibPeerConnection *p_parent) {
+ parent = p_parent;
+ }
void OnSuccess(webrtc::SessionDescriptionInterface *desc) override;
- void OnFailure(webrtc::RTCError error) override;
+ void OnFailure(webrtc::RTCError error) override {
+ ERR_PRINT(godot::String(error.message()));
+ }
};
/** SetSessionDescriptionObserver callback functions **/
class GodotSSDO : public webrtc::SetSessionDescriptionObserver {
public:
- WebRTCLibPeerConnection *parent;
+ WebRTCLibPeerConnection *parent = nullptr;
+ bool make_offer = false;
- GodotSSDO(WebRTCLibPeerConnection *parent);
+ GodotSSDO(WebRTCLibPeerConnection *p_parent) {
+ parent = p_parent;
+ }
void OnSuccess() override;
- void OnFailure(webrtc::RTCError error) override;
+ void OnFailure(webrtc::RTCError error) override {
+ make_offer = false;
+ ERR_PRINT(godot::String(error.message()));
+ }
+ };
+
+ class Signal {
+ godot::String method;
+ godot::Variant argv[3];
+ int argc = 0;
+ public:
+ Signal(godot::String p_method, int p_argc, const godot::Variant *p_argv) {
+ method = p_method;
+ argc = p_argc;
+ for (int i = 0; i < argc; i++) {
+ argv[i] = p_argv[i];
+ }
+ }
+
+ void emit(godot::Object *p_object) {
+ if (argc == 0) {
+ p_object->emit_signal(method);
+ } else if (argc == 1) {
+ p_object->emit_signal(method, argv[0]);
+ } else if (argc == 2) {
+ p_object->emit_signal(method, argv[0], argv[1]);
+ } else if (argc == 3) {
+ p_object->emit_signal(method, argv[0], argv[1], argv[2]);
+ }
+ }
};
GodotPCO pco;
@@ -87,7 +124,7 @@ public:
rtc::scoped_refptr<GodotCSDO> ptr_csdo;
std::mutex *mutex_signal_queue = nullptr;
- std::queue<std::function<void()> > signal_queue;
+ std::queue<Signal> signal_queue;
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory;
rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection;