aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2017-07-28 11:54:32 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2017-07-28 11:54:32 +0200
commita1921a1a967b65c99a830141e9faaecd77b0f317 (patch)
tree193c00c382f1389f61a01870c937802e7e49212c /src
parent9aee86aace7d6c504b410c972d0ab5065f7f7b94 (diff)
downloaddabmux-a1921a1a967b65c99a830141e9faaecd77b0f317.tar.gz
dabmux-a1921a1a967b65c99a830141e9faaecd77b0f317.tar.bz2
dabmux-a1921a1a967b65c99a830141e9faaecd77b0f317.zip
Add new zeromq config format
This gives the choice for the transmission of the metadata, and the enabling of the TAI downloader is also triggered appropriately
Diffstat (limited to 'src')
-rw-r--r--src/DabMultiplexer.cpp26
-rw-r--r--src/DabMultiplexer.h3
-rw-r--r--src/DabMux.cpp54
-rw-r--r--src/dabOutput/dabOutput.h6
-rw-r--r--src/dabOutput/dabOutputZMQ.cpp4
5 files changed, 71 insertions, 22 deletions
diff --git a/src/DabMultiplexer.cpp b/src/DabMultiplexer.cpp
index 58a1c8f..c109919 100644
--- a/src/DabMultiplexer.cpp
+++ b/src/DabMultiplexer.cpp
@@ -3,7 +3,7 @@
2011, 2012 Her Majesty the Queen in Right of Canada (Communications
Research Center Canada)
- Copyright (C) 2016
+ Copyright (C) 2017
Matthias P. Braendli, matthias.braendli@mpb.li
*/
/*
@@ -75,6 +75,7 @@ DabMultiplexer::DabMultiplexer(
sync(0x49C5F8),
currentFrame(0),
ensemble(std::make_shared<dabEnsemble>()),
+ m_tai_clock_required(false),
m_clock_tai(),
fig_carousel(ensemble)
{
@@ -128,7 +129,7 @@ void DabMultiplexer::set_edi_config(const edi_configuration_t& new_edi_conf)
// Run a set of checks on the configuration
-void DabMultiplexer::prepare()
+void DabMultiplexer::prepare(bool require_tai_clock)
{
parse_ptree(m_pt, ensemble);
@@ -168,17 +169,16 @@ void DabMultiplexer::prepare()
bool tist_enabled = m_pt.get("general.tist", false);
- if (tist_enabled and edi_conf.enabled()) {
+ m_tai_clock_required = (tist_enabled and edi_conf.enabled()) or require_tai_clock;
+
+ if (m_tai_clock_required) {
try {
m_clock_tai.get_offset();
}
catch (std::runtime_error& e) {
- const char* err_msg =
- "Could not initialise TAI clock properly required by "
- "EDI with timestamp. Do you have a working internet "
- "connection?";
-
- etiLog.level(error) << err_msg;
+ etiLog.level(error) <<
+ "Could not initialise TAI clock properly. "
+ "Do you have a working internet connection?";
throw;
}
}
@@ -654,16 +654,16 @@ void DabMultiplexer::mux_frame(std::vector<std::shared_ptr<DabOutput> >& outputs
try {
bool tist_enabled = m_pt.get("general.tist", false);
- if (tist_enabled and edi_conf.enabled()) {
+ if (tist_enabled and m_tai_clock_required) {
edi_tagDETI.set_seconds(edi_time);
// In case get_offset fails, we still want to update the EDI seconds
- const auto utco = m_clock_tai.get_offset();
- edi_tagDETI.set_tai_utc_offset(utco);
+ const auto tai_utc_offset = m_clock_tai.get_offset();
+ edi_tagDETI.set_tai_utc_offset(tai_utc_offset);
for (auto output : outputs) {
shared_ptr<OutputMetadata> md_utco =
- make_shared<OutputMetadataUTCO>(utco);
+ make_shared<OutputMetadataUTCO>(edi_tagDETI.utco);
output->setMetadata(md_utco);
shared_ptr<OutputMetadata> md_edi_time =
diff --git a/src/DabMultiplexer.h b/src/DabMultiplexer.h
index b3e432e..80b3ab9 100644
--- a/src/DabMultiplexer.h
+++ b/src/DabMultiplexer.h
@@ -56,7 +56,7 @@ class DabMultiplexer : public RemoteControllable {
public:
DabMultiplexer(
boost::property_tree::ptree pt);
- void prepare(void);
+ void prepare(bool require_tai_clock);
unsigned long getCurrentFrame() { return currentFrame; }
@@ -92,6 +92,7 @@ class DabMultiplexer : public RemoteControllable {
std::shared_ptr<dabEnsemble> ensemble;
+ bool m_tai_clock_required;
ClockTAI m_clock_tai;
#if HAVE_OUTPUT_EDI
diff --git a/src/DabMux.cpp b/src/DabMux.cpp
index 5d109fa..c0f5ad0 100644
--- a/src/DabMux.cpp
+++ b/src/DabMux.cpp
@@ -275,6 +275,7 @@ int main(int argc, char *argv[])
/******************** READ OUTPUT PARAMETERS ***************/
set<string> all_output_names;
+ bool output_require_tai_clock = false;
ptree pt_outputs = pt.get_child("outputs");
for (auto ptree_pair : pt_outputs) {
string outputuid = ptree_pair.first;
@@ -333,6 +334,46 @@ int main(int argc, char *argv[])
throw runtime_error("EDI output not compiled in");
#endif
}
+ else if (outputuid == "zeromq") {
+#if defined(HAVE_OUTPUT_ZEROMQ)
+ ptree pt_zeromq = pt_outputs.get_child("zeromq");
+ shared_ptr<DabOutput> output;
+
+ string endpoint = pt_zeromq.get<string>("endpoint");
+ bool allow_metadata = pt_zeromq.get<bool>("allowmetadata");
+ output_require_tai_clock |= allow_metadata;
+
+ size_t proto_pos = endpoint.find("://");
+ if (proto_pos == std::string::npos) {
+ stringstream ss;
+ ss << "zeromq output endpoint '" << endpoint << "' has incorrect format!";
+ throw runtime_error(ss.str());
+ }
+
+ string proto = endpoint.substr(0, proto_pos);
+ string location = endpoint.substr(proto_pos + 3);
+
+ output = make_shared<DabOutputZMQ>(proto, allow_metadata);
+
+ if (not output) {
+ etiLog.level(error) <<
+ "Unable to init zeromq output " <<
+ endpoint;
+ return -1;
+ }
+
+ if (output->Open(location) == -1) {
+ etiLog.level(error) <<
+ "Unable to open zeromq output " <<
+ endpoint;
+ return -1;
+ }
+
+ outputs.push_back(output);
+#else
+ throw runtime_error("ZeroMQ output not compiled in");
+#endif
+ }
else {
string uri = pt_outputs.get<string>(outputuid);
@@ -374,14 +415,17 @@ int main(int argc, char *argv[])
output = make_shared<DabOutputSimul>();
#endif // defined(HAVE_OUTPUT_SIMUL)
#if defined(HAVE_OUTPUT_ZEROMQ)
+ /* The legacy configuration setting will not enable metadata,
+ * to keep backward compatibility
+ */
} else if (proto == "zmq+tcp") {
- output = make_shared<DabOutputZMQ>("tcp");
+ output = make_shared<DabOutputZMQ>("tcp", false);
} else if (proto == "zmq+ipc") {
- output = make_shared<DabOutputZMQ>("ipc");
+ output = make_shared<DabOutputZMQ>("ipc", false);
} else if (proto == "zmq+pgm") {
- output = make_shared<DabOutputZMQ>("pgm");
+ output = make_shared<DabOutputZMQ>("pgm", false);
} else if (proto == "zmq+epgm") {
- output = make_shared<DabOutputZMQ>("epgm");
+ output = make_shared<DabOutputZMQ>("epgm", false);
#endif // defined(HAVE_OUTPUT_ZEROMQ)
} else {
etiLog.level(error) << "Output protocol unknown: " << proto;
@@ -413,7 +457,7 @@ int main(int argc, char *argv[])
throw MuxInitException();
}
- mux.prepare();
+ mux.prepare(output_require_tai_clock);
mux.print_info();
etiLog.log(info, "--- Output list ---");
diff --git a/src/dabOutput/dabOutput.h b/src/dabOutput/dabOutput.h
index 58a2929..4142b25 100644
--- a/src/dabOutput/dabOutput.h
+++ b/src/dabOutput/dabOutput.h
@@ -305,11 +305,12 @@ struct zmq_dab_message_t
class DabOutputZMQ : public DabOutput
{
public:
- DabOutputZMQ(const std::string &zmq_proto) :
+ DabOutputZMQ(const std::string &zmq_proto, bool allow_metadata) :
endpoint_(""),
zmq_proto_(zmq_proto), zmq_context_(1),
zmq_pub_sock_(zmq_context_, ZMQ_PUB),
- zmq_message_ix(0)
+ zmq_message_ix(0),
+ m_allow_metadata(allow_metadata)
{ }
DabOutputZMQ(const DabOutputZMQ& other) = delete;
@@ -338,6 +339,7 @@ class DabOutputZMQ : public DabOutput
zmq_dab_message_t zmq_message;
int zmq_message_ix;
+ bool m_allow_metadata;
std::vector<std::shared_ptr<OutputMetadata> > meta_;
};
diff --git a/src/dabOutput/dabOutputZMQ.cpp b/src/dabOutput/dabOutputZMQ.cpp
index 582af80..f50b7c3 100644
--- a/src/dabOutput/dabOutputZMQ.cpp
+++ b/src/dabOutput/dabOutputZMQ.cpp
@@ -126,7 +126,9 @@ int DabOutputZMQ::Close()
void DabOutputZMQ::setMetadata(std::shared_ptr<OutputMetadata> &md)
{
- meta_.push_back(md);
+ if (m_allow_metadata) {
+ meta_.push_back(md);
+ }
}
#endif