From 4e207da0b1d2faa5fa38888ea824e0430ecd2f33 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Wed, 18 Sep 2019 11:49:38 +0200 Subject: EDI: add audio levels and program version TAGs --- src/Outputs.cpp | 24 ++++++++++++++++++++++-- src/Outputs.h | 2 ++ 2 files changed, 24 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/Outputs.cpp b/src/Outputs.cpp index eadbc5e..d0d3ca4 100644 --- a/src/Outputs.cpp +++ b/src/Outputs.cpp @@ -188,6 +188,7 @@ bool EDI::write_frame(const uint8_t *buf, size_t len) using Sec = chrono::seconds; const auto now = chrono::time_point_cast(chrono::system_clock::now()); m_edi_time = chrono::system_clock::to_time_t(now) + (m_delay_ms / 1000); + m_send_version_at_time = m_edi_time; /* TODO we still have to see if 24ms granularity is achievable, given that * one DAB+ super frame is carried over more than 1 ETI frame. @@ -206,6 +207,8 @@ bool EDI::write_frame(const uint8_t *buf, size_t len) if (m_timestamp > 0xf9FFff) { m_timestamp -= 0xfa0000; // Substract 16384000, corresponding to one second m_edi_time += 1; + + m_num_seconds_sent++; } m_edi_tagDSTI.set_edi_time(m_edi_time, m_clock_tai.get_offset()); @@ -214,13 +217,23 @@ bool EDI::write_frame(const uint8_t *buf, size_t len) m_edi_tagDSTI.rfadf = false; // DFCT is handled inside the TagDSTI - // TODO invent custom TAG to carry audio levels metadata - edi::TagSSm edi_tagPayload; // TODO make edi_tagPayload.stid configurable edi_tagPayload.istd_data = buf; edi_tagPayload.istd_length = len; + edi::TagODRAudioLevels edi_tagAudioLevels(m_audio_left, m_audio_right); + + stringstream ss; + ss << PACKAGE_NAME << " " << +#if defined(GITVERSION) + GITVERSION; +#else + PACKAGE_VERSION; +#endif + edi::TagODRVersion edi_tagVersion(ss.str(), m_num_seconds_sent); + + // The above Tag Items will be assembled into a TAG Packet edi::TagPacket edi_tagpacket(m_edi_conf.tagpacket_alignment); @@ -228,6 +241,13 @@ bool EDI::write_frame(const uint8_t *buf, size_t len) edi_tagpacket.tag_items.push_back(&edi_tagStarPtr); edi_tagpacket.tag_items.push_back(&m_edi_tagDSTI); edi_tagpacket.tag_items.push_back(&edi_tagPayload); + edi_tagpacket.tag_items.push_back(&edi_tagAudioLevels); + + // Send version information only every 10 seconds to save bandwidth + if (m_send_version_at_time < m_edi_time) { + m_send_version_at_time += 10; + edi_tagpacket.tag_items.push_back(&edi_tagVersion); + } m_edi_sender->write(edi_tagpacket); diff --git a/src/Outputs.h b/src/Outputs.h index 131f35c..0f1f34f 100644 --- a/src/Outputs.h +++ b/src/Outputs.h @@ -147,7 +147,9 @@ class EDI: public Base { std::shared_ptr m_edi_sender; uint32_t m_timestamp = 0; + uint32_t m_num_seconds_sent = 0; std::time_t m_edi_time = 0; + std::time_t m_send_version_at_time = 0; edi::TagDSTI m_edi_tagDSTI; -- cgit v1.2.3