eDVBResourceManager *eDVBResourceManager::instance;
eDVBResourceManager::eDVBResourceManager()
+ :m_releaseCachedChannelTimer(eApp)
{
avail = 1;
busy = 0;
eDebug("found %d adapter, %d frontends and %d demux",
m_adapter.size(), m_frontend.size(), m_demux.size());
+
+ CONNECT(m_releaseCachedChannelTimer.timeout, eDVBResourceManager::releaseCachedChannel);
}
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;
void eDVBChannel::AddUse()
{
- ++m_use_count;
+ if (++m_use_count > 1 && m_state == state_last_instance)
+ m_state = state_ok;
}
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)
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;
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();
class eDVBChannel: public iDVBPVRChannel, public iFilePushScatterGather, public Object
{
DECLARE_REF(eDVBChannel);
+ friend class eDVBResourceManager;
public:
eDVBChannel(eDVBResourceManager *mgr, eDVBAllocatedFrontend *frontend);
virtual ~eDVBChannel();
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. */
};