the epgcache can now handle more then one channel(transponder),
[enigma2.git] / lib / dvb / dvb.cpp
index e0df1dc1a889fde7a3a29a61f5d5be65082c016d..ea51d6a194f31ac912bf00f6fc8c944f7f9baf7d 100644 (file)
@@ -240,7 +240,7 @@ RESULT eDVBResourceManager::getChannelList(ePtr<iDVBChannelList> &list)
 }
 
 
-RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, ePtr<iDVBChannel> &channel)
+RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUsePtr<iDVBChannel> &channel)
 {
                /* first, check if a channel is already existing. */
        
@@ -289,7 +289,7 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, ePtr
        return 0;
 }
 
-RESULT eDVBResourceManager::allocateRawChannel(ePtr<iDVBChannel> &channel)
+RESULT eDVBResourceManager::allocateRawChannel(eUsePtr<iDVBChannel> &channel)
 {
        ePtr<eDVBAllocatedFrontend> fe;
        
@@ -321,6 +321,7 @@ RESULT eDVBResourceManager::addChannel(const eDVBChannelID &chid, eDVBChannel *c
 {
        eDebug("add channel %p", ch);
        m_active_channels.push_back(active_channel(chid, ch));
+       /* emit */ m_channelAdded(ch);
        return 0;
 }
 
@@ -342,6 +343,12 @@ RESULT eDVBResourceManager::removeChannel(eDVBChannel *ch)
        return -ENOENT;
 }
 
+RESULT eDVBResourceManager::connectChannelAdded(const Slot1<void,eDVBChannel*> &channelAdded, ePtr<eConnection> &connection)
+{
+       connection = new eConnection((eDVBResourceManager*)this, m_channelAdded.connect(channelAdded));
+       return 0;
+}
+
 DEFINE_REF(eDVBChannel);
 
 eDVBChannel::eDVBChannel(eDVBResourceManager *mgr, eDVBAllocatedFrontend *frontend, eDVBAllocatedDemux *demux): m_state(state_idle), m_mgr(mgr)
@@ -363,6 +370,11 @@ void eDVBChannel::frontendStateChanged(iDVBFrontend*fe)
 {
        eDebug("fe state changed!");
        int state, ourstate = 0;
+       
+               /* if we are already in shutdown, don't change state. */
+       if (m_state == state_release)
+               return;
+       
        if (fe->getState(state))
                return;
        
@@ -388,6 +400,20 @@ void eDVBChannel::frontendStateChanged(iDVBFrontend*fe)
        }
 }
 
+void eDVBChannel::AddUse()
+{
+       ++m_use_count;
+}
+
+void eDVBChannel::ReleaseUse()
+{
+       if (!--m_use_count)
+       {
+               m_state = state_release;
+               m_stateChanged(this);
+       }
+}
+
 RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid)
 {
        if (m_channel_id)