X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/6a4d3199f96849af7ef9fae324f34ec4d1b7412b..a3ccac772dd40db6e4878f1a818dfb346ac27341:/lib/dvb/dvb.cpp diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 8b442e3d..93065074 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -310,7 +310,9 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse 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()); @@ -358,7 +360,8 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse 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; } @@ -369,6 +372,7 @@ void eDVBResourceManager::DVBChannelStateChanged(iDVBChannel *chan) chan->getState(state); switch (state) { + case iDVBChannel::state_release: case iDVBChannel::state_ok: { eDebug("stop release channel timer"); @@ -388,7 +392,7 @@ void eDVBResourceManager::DVBChannelStateChanged(iDVBChannel *chan) void eDVBResourceManager::releaseCachedChannel() { - eDebug("release cached channel"); + eDebug("release cached channel (timer timeout)"); m_cached_channel=0; } @@ -397,7 +401,11 @@ RESULT eDVBResourceManager::allocateRawChannel(eUsePtr &channel, in ePtr 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; @@ -414,9 +422,6 @@ RESULT eDVBResourceManager::allocatePVRChannel(eUsePtr &channel) { ePtr demux; - if (m_cached_channel) - m_cached_channel=0; - eDVBChannel *ch; ch = new eDVBChannel(this, 0); @@ -814,7 +819,10 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off void eDVBChannel::AddUse() { if (++m_use_count > 1 && m_state == state_last_instance) + { m_state = state_ok; + m_stateChanged(this); + } } void eDVBChannel::ReleaseUse()