X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/547419c9a9e81d29395e87e53bcd6174d744a4e2..3c63f506284a82e013ab8c02af0b2779e5168d09:/lib/dvb/dvbtime.cpp diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp index 12e52a9f..5ece09d3 100644 --- a/lib/dvb/dvbtime.cpp +++ b/lib/dvb/dvbtime.cpp @@ -76,7 +76,7 @@ void TDT::ready(int error) eDVBLocalTimeHandler::getInstance()->updateTime(error, chan, ++update_count); } -int TDT::createTable(int nr, const __u8 *data, unsigned int max) +int TDT::createTable(unsigned int nr, const __u8 *data, unsigned int max) { if ( data && data[0] == 0x70 || data[0] == 0x73 ) { @@ -84,7 +84,8 @@ int TDT::createTable(int nr, const __u8 *data, unsigned int max) if ( length >= 5 ) { time_t tptime = parseDVBtime(data[3], data[4], data[5], data[6], data[7]); - eDVBLocalTimeHandler::getInstance()->updateTime(tptime, chan, update_count); + if (tptime && tptime != -1) + eDVBLocalTimeHandler::getInstance()->updateTime(tptime, chan, update_count); error=0; return 1; } @@ -189,20 +190,21 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up time_t rtc_time = getRTC(); if ( rtc_time ) // RTC Ready? { - tm now = *localtime(&rtc_time); + tm now; + localtime_r(&rtc_time, &now); eDebug("[eDVBLocalTimerHandler] RTC time is %02d:%02d:%02d", now.tm_hour, now.tm_min, now.tm_sec); time_t linuxTime=time(0); time_t nowTime=linuxTime+m_time_difference; - now = *localtime(&nowTime); + localtime_r(&nowTime, &now); eDebug("[eDVBLocalTimerHandler] Receiver time is %02d:%02d:%02d", now.tm_hour, now.tm_min, now.tm_sec); m_time_difference = rtc_time - linuxTime; - eDebug("[eDVBLocalTimerHandler] RTC to Receiver time difference is %d seconds", nowTime - rtc_time ); + eDebug("[eDVBLocalTimerHandler] RTC to Receiver time difference is %ld seconds", nowTime - rtc_time ); if ( abs(m_time_difference) > 59 ) { eDebug("[eDVBLocalTimerHandler] set Linux Time to RTC Time"); @@ -268,7 +270,7 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up time_t rtc=getRTC(); m_timeOffsetMap[chan->getChannelID()] = rtc-tp_time; new_diff = rtc-nowTime; // set enigma time to rtc - eDebug("[eDVBLocalTimerHandler] update stored correction to %d (calced against RTC time)", rtc-tp_time ); + eDebug("[eDVBLocalTimerHandler] update stored correction to %ld (calced against RTC time)", rtc-tp_time ); } else if ( abs(ddiff) <= 120 ) { @@ -313,7 +315,8 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up return; } - tm now = *localtime(&t); + tm now; + localtime_r(&t, &now); eDebug("[eDVBLocalTimerHandler] time update to %02d:%02d:%02d", now.tm_hour, now.tm_min, @@ -370,6 +373,7 @@ void eDVBLocalTimeHandler::DVBChannelAdded(eDVBChannel *chan) m_knownChannels.insert( std::pair(chan, channel_data()) ); tmp.first->second.tdt = NULL; tmp.first->second.channel = chan; + tmp.first->second.m_prevChannelState = -1; chan->connectStateChange(slot(*this, &eDVBLocalTimeHandler::DVBChannelStateChanged), tmp.first->second.m_stateChangedConn); } } @@ -382,18 +386,24 @@ void eDVBLocalTimeHandler::DVBChannelStateChanged(iDVBChannel *chan) { int state=0; chan->getState(state); - switch (state) + if ( state != it->second.m_prevChannelState ) { - case iDVBChannel::state_ok: - eDebug("[eDVBLocalTimerHandler] channel %p running", chan); - it->second.tdt = new TDT(it->second.channel); - it->second.tdt->start(); - break; - case iDVBChannel::state_release: - eDebug("[eDVBLocalTimerHandler] remove channel %p", chan); - delete it->second.tdt; - m_knownChannels.erase(it); - break; + switch (state) + { + case iDVBChannel::state_ok: + eDebug("[eDVBLocalTimerHandler] channel %p running", chan); + it->second.tdt = new TDT(it->second.channel); + it->second.tdt->start(); + break; + case iDVBChannel::state_release: + eDebug("[eDVBLocalTimerHandler] remove channel %p", chan); + delete it->second.tdt; + m_knownChannels.erase(it); + break; + default: // ignore all other events + return; + } + it->second.m_prevChannelState = state; } } }