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:
parent
20dc83bee4
commit
294af6aaca
6 changed files with 36 additions and 5 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue