mirror of
https://github.com/godotengine/webrtc-native.git
synced 2026-01-03 14:09:58 +03:00
Merge pull request #38 from Faless/refactor/signals
Refactor signals and obeserver, fixes answer creation.
This commit is contained in:
@@ -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) {}
|
|
||||||
@@ -7,6 +7,33 @@ using namespace godot_webrtc;
|
|||||||
|
|
||||||
std::unique_ptr<rtc::Thread> WebRTCLibPeerConnection::signaling_thread = nullptr;
|
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() {
|
void WebRTCLibPeerConnection::initialize_signaling() {
|
||||||
if (signaling_thread.get() == nullptr) {
|
if (signaling_thread.get() == nullptr) {
|
||||||
signaling_thread = rtc::Thread::Create();
|
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) {
|
godot_error WebRTCLibPeerConnection::set_remote_description(const char *type, const char *sdp) {
|
||||||
ERR_FAIL_COND_V(peer_connection.get() == nullptr, GODOT_ERR_UNCONFIGURED);
|
ERR_FAIL_COND_V(peer_connection.get() == nullptr, GODOT_ERR_UNCONFIGURED);
|
||||||
std::unique_ptr<webrtc::SessionDescriptionInterface> desc = _MAKE_DESC(type, sdp);
|
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->SetRemoteDescription(ptr_ssdo, desc.release());
|
||||||
peer_connection->CreateAnswer(ptr_csdo, webrtc::PeerConnectionInterface::RTCOfferAnswerOptions());
|
|
||||||
return GODOT_OK;
|
return GODOT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,14 +203,12 @@ godot_error WebRTCLibPeerConnection::add_ice_candidate(const char *sdpMidName, i
|
|||||||
godot_error WebRTCLibPeerConnection::poll() {
|
godot_error WebRTCLibPeerConnection::poll() {
|
||||||
ERR_FAIL_COND_V(peer_connection.get() == nullptr, GODOT_ERR_UNCONFIGURED);
|
ERR_FAIL_COND_V(peer_connection.get() == nullptr, GODOT_ERR_UNCONFIGURED);
|
||||||
|
|
||||||
std::function<void()> signal;
|
|
||||||
while (!signal_queue.empty()) {
|
while (!signal_queue.empty()) {
|
||||||
mutex_signal_queue->lock();
|
mutex_signal_queue->lock();
|
||||||
signal = signal_queue.front();
|
Signal signal = signal_queue.front();
|
||||||
signal_queue.pop();
|
signal_queue.pop();
|
||||||
mutex_signal_queue->unlock();
|
mutex_signal_queue->unlock();
|
||||||
|
signal.emit(this);
|
||||||
signal();
|
|
||||||
}
|
}
|
||||||
return GODOT_OK;
|
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) {
|
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();
|
mutex_signal_queue->lock();
|
||||||
signal_queue.push(
|
const godot::Variant argv[3] = { p_arg1, p_arg2, p_arg3 };
|
||||||
[this, p_name, p_argc, p_arg1, p_arg2, p_arg3] {
|
signal_queue.push(Signal(p_name, p_argc, argv));
|
||||||
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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
mutex_signal_queue->unlock();
|
mutex_signal_queue->unlock();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,7 @@
|
|||||||
|
|
||||||
#include "api/peer_connection_interface.h" // interface for all things needed from WebRTC
|
#include "api/peer_connection_interface.h" // interface for all things needed from WebRTC
|
||||||
#include "media/base/media_engine.h" // needed for CreateModularPeerConnectionFactory
|
#include "media/base/media_engine.h" // needed for CreateModularPeerConnectionFactory
|
||||||
#include <functional> // std::function
|
#include <mutex>
|
||||||
#include <mutex> // mutex @TODO replace std::mutex with Godot mutex
|
|
||||||
|
|
||||||
#include "net/WebRTCPeerConnectionNative.hpp"
|
#include "net/WebRTCPeerConnectionNative.hpp"
|
||||||
|
|
||||||
@@ -41,9 +40,8 @@ public:
|
|||||||
~WebRTCLibPeerConnection();
|
~WebRTCLibPeerConnection();
|
||||||
|
|
||||||
/* helper functions */
|
/* 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::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);
|
void queue_packet(uint8_t *, int);
|
||||||
|
|
||||||
/** PeerConnectionObserver callback functions **/
|
/** PeerConnectionObserver callback functions **/
|
||||||
@@ -51,35 +49,74 @@ public:
|
|||||||
public:
|
public:
|
||||||
WebRTCLibPeerConnection *parent;
|
WebRTCLibPeerConnection *parent;
|
||||||
|
|
||||||
GodotPCO(WebRTCLibPeerConnection *parent);
|
GodotPCO(WebRTCLibPeerConnection *p_parent) {
|
||||||
void OnSignalingChange(webrtc::PeerConnectionInterface::SignalingState new_state) override;
|
parent = p_parent;
|
||||||
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;
|
|
||||||
void OnIceCandidate(const webrtc::IceCandidateInterface *candidate) override;
|
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 **/
|
/** CreateSessionDescriptionObserver callback functions **/
|
||||||
class GodotCSDO : public webrtc::CreateSessionDescriptionObserver {
|
class GodotCSDO : public webrtc::CreateSessionDescriptionObserver {
|
||||||
public:
|
public:
|
||||||
WebRTCLibPeerConnection *parent;
|
WebRTCLibPeerConnection *parent = nullptr;
|
||||||
|
|
||||||
GodotCSDO(WebRTCLibPeerConnection *parent);
|
GodotCSDO(WebRTCLibPeerConnection *p_parent) {
|
||||||
|
parent = p_parent;
|
||||||
|
}
|
||||||
void OnSuccess(webrtc::SessionDescriptionInterface *desc) override;
|
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 **/
|
/** SetSessionDescriptionObserver callback functions **/
|
||||||
class GodotSSDO : public webrtc::SetSessionDescriptionObserver {
|
class GodotSSDO : public webrtc::SetSessionDescriptionObserver {
|
||||||
public:
|
public:
|
||||||
WebRTCLibPeerConnection *parent;
|
WebRTCLibPeerConnection *parent = nullptr;
|
||||||
|
bool make_offer = false;
|
||||||
|
|
||||||
GodotSSDO(WebRTCLibPeerConnection *parent);
|
GodotSSDO(WebRTCLibPeerConnection *p_parent) {
|
||||||
|
parent = p_parent;
|
||||||
|
}
|
||||||
void OnSuccess() override;
|
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;
|
GodotPCO pco;
|
||||||
@@ -87,7 +124,7 @@ public:
|
|||||||
rtc::scoped_refptr<GodotCSDO> ptr_csdo;
|
rtc::scoped_refptr<GodotCSDO> ptr_csdo;
|
||||||
|
|
||||||
std::mutex *mutex_signal_queue = nullptr;
|
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::PeerConnectionFactoryInterface> pc_factory;
|
||||||
rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection;
|
rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection;
|
||||||
|
|||||||
Reference in New Issue
Block a user