aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/DabMultiplexer.cpp13
-rw-r--r--src/DabMultiplexer.h1
2 files changed, 11 insertions, 3 deletions
diff --git a/src/DabMultiplexer.cpp b/src/DabMultiplexer.cpp
index b9575fc..58e0f9b 100644
--- a/src/DabMultiplexer.cpp
+++ b/src/DabMultiplexer.cpp
@@ -49,6 +49,8 @@ static vector<string> split_pipe_separated_string(const std::string& s)
uint64_t MuxTime::init(uint32_t tist_at_fct0_us)
{
+ m_tist_at_fct0_us = tist_at_fct0_us;
+
/* At startup, derive edi_time, TIST and CIF count such that there is
* a consistency across mux restarts. Ensure edi_time and TIST represent
* current time.
@@ -112,14 +114,19 @@ void MuxTime::increment_timestamp()
std::pair<uint32_t, std::time_t> MuxTime::get_time()
{
+ // The user-visible configuration tist_offset is the effective
+ // offset, but since we implicityle add the tist_at_fct0 to it,
+ // we must compensate.
+ double corrected_tist_offset = tist_offset - (m_tist_at_fct0_us / 1e6);
+
// negative tist_offset not supported, because the calculation is annoying
- if (tist_offset < 0) return {m_timestamp, m_edi_time};
+ if (corrected_tist_offset < 0) return {m_timestamp, m_edi_time};
- double fractional_part = tist_offset - std::floor(tist_offset);
+ double fractional_part = corrected_tist_offset - std::floor(corrected_tist_offset);
const size_t steps = std::lround(std::floor(fractional_part / 24e-3));
uint32_t timestamp = m_timestamp + (24 << 14) * steps;
- std::time_t edi_time = m_edi_time + std::lround(std::floor(tist_offset));
+ std::time_t edi_time = m_edi_time + std::lround(std::floor(corrected_tist_offset));
if (timestamp > 0xf9FFff) {
edi_time += 1;
diff --git a/src/DabMultiplexer.h b/src/DabMultiplexer.h
index aa6adfb..bbb4bde 100644
--- a/src/DabMultiplexer.h
+++ b/src/DabMultiplexer.h
@@ -47,6 +47,7 @@ class MuxTime {
private:
uint32_t m_timestamp = 0;
std::time_t m_edi_time = 0;
+ uint32_t m_tist_at_fct0_us = 0;
public:
std::pair<uint32_t, std::time_t> get_time();