retune on lostlock is now working :)
[enigma2.git] / lib / dvb / dvb.cpp
index f20ce8a286d9a64d3d88d7622837717e69ffdf9f..32e19308fb561f4a230b5dfe8603aaec986eacb3 100644 (file)
@@ -591,8 +591,9 @@ void eDVBChannel::frontendStateChanged(iDVBFrontend*fe)
                ourstate = state_tuning;
        } else if (state == iDVBFrontend::stateLostLock)
        {
-               eDebug("OURSTATE: lost lock");
-               ourstate = state_unavailable;
+               eDebug("OURSTATE: lost lock.. retune");
+               ourstate = state_tuning;
+               m_frontend->get().tune(*m_feparm);
        } else if (state == iDVBFrontend::stateFailed)
        {
                eDebug("OURSTATE: failed");
@@ -607,6 +608,17 @@ void eDVBChannel::frontendStateChanged(iDVBFrontend*fe)
        }
 }
 
+void eDVBChannel::pvrEvent(int event)
+{
+       switch (event)
+       {
+       case eFilePushThread::evtEOF:
+               eDebug("eDVBChannel: End of file!");
+               m_event(this, evtEOF);
+               break;
+       }
+}
+
 void eDVBChannel::AddUse()
 {
        ++m_use_count;
@@ -641,6 +653,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtr<iDVBFrontend
                        /* if tuning fails, shutdown the channel immediately. */
        int res;
        res = m_frontend->get().tune(*feparm);
+       m_feparm = feparm;
        
        if (res)
        {
@@ -658,6 +671,12 @@ RESULT eDVBChannel::connectStateChange(const Slot1<void,iDVBChannel*> &stateChan
        return 0;
 }
 
+RESULT eDVBChannel::connectEvent(const Slot2<void,iDVBChannel*,int> &event, ePtr<eConnection> &connection)
+{
+       connection = new eConnection((iDVBChannel*)this, m_event.connect(event));
+       return 0;
+}
+
 RESULT eDVBChannel::getState(int &state)
 {
        state = m_state;
@@ -732,7 +751,9 @@ RESULT eDVBChannel::playFile(const char *file)
        m_stateChanged(this);
        
        m_pvr_thread = new eFilePushThread();
+       m_pvr_thread->enablePVRCommit(1);
        m_pvr_thread->start(m_pvr_fd_src, m_pvr_fd_dst);
+       CONNECT(m_pvr_thread->m_event, eDVBChannel::pvrEvent);
 
        return 0;
 }