channel = m_cached_channel;
return 0;
}
+ m_cached_channel_state_changed_conn.disconnect();
m_cached_channel=0;
+ m_releaseCachedChannelTimer.stop();
}
// eDebug("allocate channel.. %04x:%04x", channelid.transport_stream_id.get(), channelid.original_network_id.get());
return errChidNotFound;
}
m_cached_channel = channel = ch;
- CONNECT(ch->m_stateChanged,eDVBResourceManager::DVBChannelStateChanged);
+ m_cached_channel_state_changed_conn =
+ CONNECT(ch->m_stateChanged,eDVBResourceManager::DVBChannelStateChanged);
return 0;
}
chan->getState(state);
switch (state)
{
+ case iDVBChannel::state_release:
case iDVBChannel::state_ok:
{
eDebug("stop release channel timer");
void eDVBResourceManager::releaseCachedChannel()
{
- eDebug("release cached channel");
+ eDebug("release cached channel (timer timeout)");
m_cached_channel=0;
}
ePtr<eDVBAllocatedFrontend> fe;
if (m_cached_channel)
+ {
+ m_cached_channel_state_changed_conn.disconnect();
m_cached_channel=0;
+ m_releaseCachedChannelTimer.stop();
+ }
if (allocateFrontendByIndex(fe, frontend_index))
return errNoFrontend;
{
ePtr<eDVBAllocatedDemux> demux;
- if (m_cached_channel)
- m_cached_channel=0;
-
eDVBChannel *ch;
ch = new eDVBChannel(this, 0);
void eDVBChannel::AddUse()
{
if (++m_use_count > 1 && m_state == state_last_instance)
+ {
m_state = state_ok;
+ m_stateChanged(this);
+ }
}
void eDVBChannel::ReleaseUse()
}
if (now < pos) /* wrap around */
- pos = now + ((pts_t)1)<<33 - pos;
+ pos = now + 0x200000000LL - pos;
else
pos = now - pos;