aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-12-17 15:25:32 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-12-17 15:25:32 +0000
commit358845c0c1b60f79831ee81ccf55c7c5f5d771e3 (patch)
tree7045d2bc860d3da0835dbc09961733f4117f40c5 /lib/dvb
parentde62aa9ce9d8b1ff8ffe12b334e68802c120e35b (diff)
downloadenigma2-358845c0c1b60f79831ee81ccf55c7c5f5d771e3.tar.gz
enigma2-358845c0c1b60f79831ee81ccf55c7c5f5d771e3.zip
fix channel state handling
Diffstat (limited to 'lib/dvb')
-rw-r--r--lib/dvb/dvbtime.cpp29
-rw-r--r--lib/dvb/dvbtime.h1
-rw-r--r--lib/dvb/epgcache.cpp39
-rw-r--r--lib/dvb/epgcache.h1
4 files changed, 43 insertions, 27 deletions
diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp
index 12e52a9f..3bd0a78d 100644
--- a/lib/dvb/dvbtime.cpp
+++ b/lib/dvb/dvbtime.cpp
@@ -370,6 +370,7 @@ void eDVBLocalTimeHandler::DVBChannelAdded(eDVBChannel *chan)
m_knownChannels.insert( std::pair<iDVBChannel*, channel_data>(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 +383,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;
}
}
}
diff --git a/lib/dvb/dvbtime.h b/lib/dvb/dvbtime.h
index 8f75ab7f..34c5d5f6 100644
--- a/lib/dvb/dvbtime.h
+++ b/lib/dvb/dvbtime.h
@@ -40,6 +40,7 @@ class eDVBLocalTimeHandler: public Object
TDT *tdt;
ePtr<eDVBChannel> channel;
ePtr<eConnection> m_stateChangedConn;
+ int m_prevChannelState;
};
friend class TDT;
DECLARE_REF(eDVBLocalTimeHandler)
diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp
index 28718800..6d811194 100644
--- a/lib/dvb/epgcache.cpp
+++ b/lib/dvb/epgcache.cpp
@@ -191,6 +191,7 @@ void eEPGCache::DVBChannelAdded(eDVBChannel *chan)
// eDebug("[eEPGCache] add channel %p", chan);
channel_data *data = new channel_data(this);
data->channel = chan;
+ data->prevChannelState = -1;
singleLock s(channel_map_lock);
m_knownChannels.insert( std::pair<iDVBChannel*, channel_data* >(chan, data) );
chan->connectStateChange(slot(*this, &eEPGCache::DVBChannelStateChanged), data->m_stateChangedConn);
@@ -256,25 +257,31 @@ void eEPGCache::DVBChannelStateChanged(iDVBChannel *chan)
{
int state=0;
chan->getState(state);
- switch (state)
+ if ( it->second->prevChannelState != state )
{
- case iDVBChannel::state_ok:
+ switch (state)
{
- eDebug("[eEPGCache] channel %p running", chan);
- DVBChannelRunning(chan);
- break;
- }
- case iDVBChannel::state_release:
- {
- eDebug("[eEPGCache] remove channel %p", chan);
- messages.send(Message(Message::leaveChannel, chan));
- while(!it->second->can_delete)
- usleep(1000);
- delete it->second;
- m_knownChannels.erase(it);
- // -> gotMessage -> abortEPG
- break;
+ case iDVBChannel::state_ok:
+ {
+ eDebug("[eEPGCache] channel %p running", chan);
+ DVBChannelRunning(chan);
+ break;
+ }
+ case iDVBChannel::state_release:
+ {
+ eDebug("[eEPGCache] remove channel %p", chan);
+ messages.send(Message(Message::leaveChannel, chan));
+ while(!it->second->can_delete)
+ usleep(1000);
+ delete it->second;
+ m_knownChannels.erase(it);
+ // -> gotMessage -> abortEPG
+ break;
+ }
+ default: // ignore all other events
+ return;
}
+ it->second->prevChannelState = state;
}
}
}
diff --git a/lib/dvb/epgcache.h b/lib/dvb/epgcache.h
index fe461d9d..eec08cc8 100644
--- a/lib/dvb/epgcache.h
+++ b/lib/dvb/epgcache.h
@@ -142,6 +142,7 @@ class eEPGCache: public eMainloop, private eThread, public Object
channel_data(eEPGCache*);
eEPGCache *cache;
eTimer abortTimer, zapTimer;
+ int prevChannelState;
__u8 state, isRunning, haveData, can_delete;
ePtr<eDVBChannel> channel;
ePtr<eConnection> m_stateChangedConn, m_NowNextConn, m_ScheduleConn, m_ScheduleOtherConn;