diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-01-30 00:20:57 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-01-30 00:20:57 +0000 |
| commit | 6a4d3199f96849af7ef9fae324f34ec4d1b7412b (patch) | |
| tree | fe1e5fabe75bcf46919bced1dbdcd787fecb3a53 /lib | |
| parent | 81aa63ccad4fbbb82e256295cec014189ff3e623 (diff) | |
| download | enigma2-6a4d3199f96849af7ef9fae324f34ec4d1b7412b.tar.gz enigma2-6a4d3199f96849af7ef9fae324f34ec4d1b7412b.zip | |
release cached channel after 3 seconds when not needed
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dvb/dvb.cpp | 41 | ||||
| -rw-r--r-- | lib/dvb/dvb.h | 10 | ||||
| -rw-r--r-- | lib/dvb/idvb.h | 1 |
3 files changed, 48 insertions, 4 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 601e6279..8b442e3d 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -43,6 +43,7 @@ DEFINE_REF(eDVBResourceManager); eDVBResourceManager *eDVBResourceManager::instance; eDVBResourceManager::eDVBResourceManager() + :m_releaseCachedChannelTimer(eApp) { avail = 1; busy = 0; @@ -63,6 +64,8 @@ eDVBResourceManager::eDVBResourceManager() eDebug("found %d adapter, %d frontends and %d demux", m_adapter.size(), m_frontend.size(), m_demux.size()); + + CONNECT(m_releaseCachedChannelTimer.timeout, eDVBResourceManager::releaseCachedChannel); } @@ -355,10 +358,40 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse return errChidNotFound; } m_cached_channel = channel = ch; + CONNECT(ch->m_stateChanged,eDVBResourceManager::DVBChannelStateChanged); return 0; } +void eDVBResourceManager::DVBChannelStateChanged(iDVBChannel *chan) +{ + int state=0; + chan->getState(state); + switch (state) + { + case iDVBChannel::state_ok: + { + eDebug("stop release channel timer"); + m_releaseCachedChannelTimer.stop(); + break; + } + case iDVBChannel::state_last_instance: + { + eDebug("start release channel timer"); + m_releaseCachedChannelTimer.start(3000, true); + break; + } + default: // ignore all other events + break; + } +} + +void eDVBResourceManager::releaseCachedChannel() +{ + eDebug("release cached channel"); + m_cached_channel=0; +} + RESULT eDVBResourceManager::allocateRawChannel(eUsePtr<iDVBChannel> &channel, int frontend_index) { ePtr<eDVBAllocatedFrontend> fe; @@ -780,7 +813,8 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off void eDVBChannel::AddUse() { - ++m_use_count; + if (++m_use_count > 1 && m_state == state_last_instance) + m_state = state_ok; } void eDVBChannel::ReleaseUse() @@ -790,6 +824,11 @@ void eDVBChannel::ReleaseUse() m_state = state_release; m_stateChanged(this); } + else if (m_use_count == 1) + { + m_state = state_last_instance; + m_stateChanged(this); + } } RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtr<iDVBFrontendParameters> &feparm) diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h index 0e449144..15e27536 100644 --- a/lib/dvb/dvb.h +++ b/lib/dvb/dvb.h @@ -117,13 +117,11 @@ private: eSmartPtrList<eDVBDemux> m_demux; }; -class eDVBResourceManager: public iObject +class eDVBResourceManager: public iObject, public Object { DECLARE_REF(eDVBResourceManager); int avail, busy; - eUsePtr<iDVBChannel> m_cached_channel; - eSmartPtrList<iDVBAdapter> m_adapter; eSmartPtrList<eDVBRegisteredDemux> m_demux; @@ -167,6 +165,11 @@ class eDVBResourceManager: public iObject Signal1<void,eDVBChannel*> m_channelAdded; bool canAllocateFrontend(ePtr<iDVBFrontendParameters> &feparm); + + eUsePtr<iDVBChannel> m_cached_channel; + eTimer m_releaseCachedChannelTimer; + void DVBChannelStateChanged(iDVBChannel*); + void releaseCachedChannel(); public: eDVBResourceManager(); virtual ~eDVBResourceManager(); @@ -196,6 +199,7 @@ public: class eDVBChannel: public iDVBPVRChannel, public iFilePushScatterGather, public Object { DECLARE_REF(eDVBChannel); + friend class eDVBResourceManager; public: eDVBChannel(eDVBResourceManager *mgr, eDVBAllocatedFrontend *frontend); virtual ~eDVBChannel(); diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index f20de190..eacc4929 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -392,6 +392,7 @@ public: state_failed, /* tuning failed. */ state_unavailable, /* currently unavailable, will be back without further interaction */ state_ok, /* ok */ + state_last_instance, /* just one reference to this channel is left */ state_release /* channel is being shut down. */ }; |
