From f61645b4d2a73101c2a30c5b8b943bf96bc5da0d Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Tue, 4 Dec 2012 09:34:06 +0100 Subject: Synchronizing system time to the transponder time is now done using adjtime() in order to avoid discontinuities --- eit.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) (limited to 'eit.c') diff --git a/eit.c b/eit.c index a236b896..dc63cce8 100644 --- a/eit.c +++ b/eit.c @@ -8,10 +8,11 @@ * Robert Schneider and Rolf Hakenes . * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg . * - * $Id: eit.c 2.21 2012/08/25 11:13:00 kls Exp $ + * $Id: eit.c 2.22 2012/12/04 09:33:20 kls Exp $ */ #include "eit.h" +#include #include "epg.h" #include "i18n.h" #include "libsi/section.h" @@ -313,35 +314,48 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo // --- cTDT ------------------------------------------------------------------ +#define MAX_TIME_DIFF 1 // number of seconds the local time may differ from dvb time before making any corrections +#define MAX_ADJ_DIFF 10 // number of seconds the local time may differ from dvb time to allow smooth adjustment +#define ADJ_DELTA 300 // number of seconds between calls for smooth time adjustment + class cTDT : public SI::TDT { private: static cMutex mutex; - static int lastDiff; + static time_t lastAdj; public: cTDT(const u_char *Data); }; cMutex cTDT::mutex; -int cTDT::lastDiff = 0; +time_t cTDT::lastAdj = 0; cTDT::cTDT(const u_char *Data) :SI::TDT(Data, false) { CheckParse(); - time_t sattim = getTime(); + time_t dvbtim = getTime(); time_t loctim = time(NULL); - int diff = abs(sattim - loctim); - if (diff > 2) { + int diff = dvbtim - loctim; + if (abs(diff) > MAX_TIME_DIFF) { mutex.Lock(); - if (abs(diff - lastDiff) < 3) { - if (stime(&sattim) == 0) - isyslog("system time changed from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(sattim), sattim); + if (abs(diff) > MAX_ADJ_DIFF) { + if (stime(&dvbtim) == 0) + isyslog("system time changed from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(dvbtim), dvbtim); else esyslog("ERROR while setting system time: %m"); } - lastDiff = diff; + else if (time(NULL) - lastAdj > ADJ_DELTA) { + lastAdj = time(NULL); + timeval delta; + delta.tv_sec = diff; + delta.tv_usec = 0; + if (adjtime(&delta, NULL) == 0) + isyslog("system time adjustment initiated from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(dvbtim), dvbtim); + else + esyslog("ERROR while adjusting system time: %m"); + } mutex.Unlock(); } } -- cgit v1.2.3