1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

webrtc: Send signaling list

Signed-off-by: Steffen Vogel <steffen.vogel@opal-rt.com>
This commit is contained in:
Steffen Vogel 2023-06-29 05:55:36 +00:00
parent 20dc83bee4
commit 294af6aaca
6 changed files with 36 additions and 5 deletions

View file

@ -14,6 +14,7 @@
#include <villas/log.hpp>
#include <villas/web.hpp>
#include <villas/signal_list.hpp>
#include <villas/nodes/webrtc/signaling_client.hpp>
namespace villas {
@ -23,7 +24,7 @@ namespace webrtc {
class PeerConnection {
public:
PeerConnection(const std::string &server, const std::string &session, const std::string &peer, rtc::Configuration config, Web *w, rtc::DataChannelInit d);
PeerConnection(const std::string &server, const std::string &session, const std::string &peer, std::shared_ptr<SignalList> signals, rtc::Configuration config, Web *w, rtc::DataChannelInit d);
~PeerConnection();
bool waitForDataChannel(std::chrono::seconds timeout);
@ -42,6 +43,7 @@ protected:
std::shared_ptr<rtc::PeerConnection> conn;
std::shared_ptr<rtc::DataChannel> chan;
std::shared_ptr<SignalingClient> client;
std::shared_ptr<SignalList> signals;
Logger logger;

View file

@ -18,6 +18,8 @@
#include <rtc/rtc.hpp>
#include <jansson.h>
#include <villas/signal_list.hpp>
namespace villas {
namespace node {
namespace webrtc {
@ -48,7 +50,7 @@ struct ControlMessage {
};
struct SignalingMessage {
std::variant<std::monostate, RelayMessage, ControlMessage, rtc::Description, rtc::Candidate> message;
std::variant<std::monostate, RelayMessage, ControlMessage, SignalList, rtc::Description, rtc::Candidate> message;
static SignalingMessage fromJSON(json_t *j);
json_t * toJSON() const;

View file

@ -15,6 +15,7 @@
#include <villas/log.hpp>
#include <villas/signal.hpp>
#include <villas/exceptions.hpp>
namespace villas {
namespace node {
@ -29,6 +30,12 @@ public:
SignalList(unsigned len, enum SignalType fmt);
SignalList(const char *dt);
SignalList(json_t *json)
{
int ret = parse(json);
if (ret)
throw RuntimeError("Failed to parse signal list");
}
int parse(json_t *json);

View file

@ -131,7 +131,10 @@ int WebRTCNode::prepare()
format->start(getInputSignals(false), ~(int) SampleFlags::HAS_OFFSET);
conn = std::make_shared<webrtc::PeerConnection>(server, session, rtcConf, web, dci);
// TODO: Determine output signals reliably
auto signals = std::make_shared<SignalList>();
conn = std::make_shared<webrtc::PeerConnection>(server, session, peer, signals, rtcConf, web, dci);
ret = pool_init(&pool, 1024, SAMPLE_LENGTH(getInputSignals(false)->size()));
if (ret) // TODO log

View file

@ -39,13 +39,14 @@ namespace rtc {
using ::operator<<;
}
PeerConnection::PeerConnection(const std::string &server, const std::string &session, rtc::Configuration cfg, Web *w, rtc::DataChannelInit d) :
PeerConnection::PeerConnection(const std::string &server, const std::string &session, const std::string &peer, std::shared_ptr<SignalList> signals, rtc::Configuration cfg, Web *w, rtc::DataChannelInit d) :
web(w),
extraServers({}),
dataChannelInit(d),
defaultConfig(cfg),
conn(nullptr),
chan(nullptr),
signals(signals),
logger(logging.get("webrtc:pc")),
stopStartup(false),
warnNotConnected(false),
@ -262,6 +263,10 @@ void PeerConnection::onGatheringStateChange(rtc::PeerConnection::GatheringState
void PeerConnection::onSignalingConnected()
{
logger->debug("Signaling connection established");
auto lock = std::unique_lock { mutex };
client->sendMessage({ *signals });
}
void PeerConnection::onSignalingDisconnected()

View file

@ -134,6 +134,9 @@ json_t * SignalingMessage::toJSON() const
[](ControlMessage const &c){
return json_pack("{ s:o }", "control", c.toJSON());
},
[](SignalList const &s){
return json_pack("{ s:o }", "signals", s.toJson());
},
[](rtc::Description const &d){
return json_pack("{ s:{ s:s, s:s } }", "description",
"spd", d.generateSdp().c_str(),
@ -161,6 +164,9 @@ std::string SignalingMessage::toString() const
[](ControlMessage const &c){
return fmt::format("type=control, control={}", json_dumps(c.toJSON(), 0));
},
[](SignalList const &s){
return fmt::format("type=signal");
},
[](rtc::Description const &d){
return fmt::format("type=description, type={}, spd=\n{}", d.typeString(), d.generateSdp());
},
@ -179,6 +185,8 @@ SignalingMessage SignalingMessage::fromJSON(json_t *json)
// Relay message
json_t *rlys = nullptr;
// Signal message
json_t *sigs = nullptr;
// Control message
json_t *ctrl = nullptr;
// Candidate message
@ -188,8 +196,9 @@ SignalingMessage SignalingMessage::fromJSON(json_t *json)
const char *desc = nullptr;
const char *typ = nullptr;
int ret = json_unpack(json, "{ s?o, s?o, s?{ s:s, s:s }, s?{ s:s, s:s } }",
int ret = json_unpack(json, "{ s?o, s?o, s?o, s?{ s:s, s:s }, s?{ s:s, s:s } }",
"servers", &rlys,
"signals", &sigs,
"control", &ctrl,
"candidate",
"spd", &cand,
@ -207,6 +216,9 @@ SignalingMessage SignalingMessage::fromJSON(json_t *json)
if (rlys) {
self.message.emplace<RelayMessage>(rlys);
}
else if (sigs) {
self.message.emplace<SignalList>(sigs);
}
else if (ctrl) {
self.message.emplace<ControlMessage>(ctrl);
}