summaryrefslogtreecommitdiff
path: root/eit.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2012-12-04 09:34:06 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2012-12-04 09:34:06 +0100
commitf61645b4d2a73101c2a30c5b8b943bf96bc5da0d (patch)
treef760c97d7219defd1112d05207660bde70745025 /eit.c
parentf1603e91280feb26051537b2287a69a23a96fc1e (diff)
downloadvdr-f61645b4d2a73101c2a30c5b8b943bf96bc5da0d.tar.gz
vdr-f61645b4d2a73101c2a30c5b8b943bf96bc5da0d.tar.bz2
Synchronizing system time to the transponder time is now done using adjtime() in order to avoid discontinuities
Diffstat (limited to 'eit.c')
-rw-r--r--eit.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/eit.c b/eit.c
index a236b896..dc63cce8 100644
--- a/eit.c
+++ b/eit.c
@@ -8,10 +8,11 @@
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
*
- * $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 <sys/time.h>
#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();
}
}