send write error messages down to service events
authorFelix Domke <tmbinc@elitedvb.net>
Mon, 30 Apr 2007 21:39:35 +0000 (21:39 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Mon, 30 Apr 2007 21:39:35 +0000 (21:39 +0000)
lib/base/filepush.cpp
lib/dvb/demux.cpp
lib/dvb/demux.h
lib/service/iservice.h
lib/service/servicedvbrecord.cpp
lib/service/servicedvbrecord.h

index 92c580c..76e01ea 100644 (file)
@@ -61,6 +61,8 @@ void eFilePushThread::thread()
                        {
                                if (errno == EINTR)
                                        continue;
+                               eDebug("eFilePushThread WRITE ERROR");
+                               sendEvent(evtWriteError);
                                break;
                                // ... we would stop the thread
                        }
index 0fbd6fb..22b09ff 100644 (file)
@@ -443,6 +443,7 @@ eDVBTSRecorder::eDVBTSRecorder(eDVBDemux *demux): m_demux(demux)
        m_running = 0;
        m_target_fd = -1;
        m_thread = new eDVBRecordFileThread();
+  CONNECT(m_thread->m_event, eDVBTSRecorder::filepushEvent);
 #ifndef HAVE_ADD_PID
        m_demux->m_dvr_busy = 1;
 #endif
@@ -648,3 +649,13 @@ void eDVBTSRecorder::stopPID(int pid)
 #endif
        m_pids[pid] = -1;
 }
+
+void eDVBTSRecorder::filepushEvent(int event)
+{
+       switch (event)
+       {
+       case eFilePushThread::evtWriteError:
+               m_event(eventWriteError);
+               break;
+       }
+}
index ee731ef..e375933 100644 (file)
@@ -109,6 +109,7 @@ private:
        void stopPID(int pid);
        
        eDVBRecordFileThread *m_thread;
+       void filepushEvent(int event);
        
        std::map<int,int> m_pids;
        Signal1<void,int> m_event;
index df4e302..b004273 100644 (file)
@@ -768,8 +768,8 @@ public:
                evRecordRunning,
                evRecordStopped,
                evNewProgramInfo,
-               evRecordFailed
-               /*evDiskFull*/
+               evRecordFailed,
+               evRecordWriteError
        };
        enum {
                NoError=0,
index acd4a82..b34dad1 100644 (file)
@@ -207,6 +207,8 @@ int eDVBServiceRecord::doRecord()
                }
                m_record->setTargetFD(fd);
                m_record->setTargetFilename(m_filename.c_str());
+               m_record->connectEvent(slot(*this, &eDVBServiceRecord::recordEvent), m_con_record_event);
+
                m_target_fd = fd;
        }
        
@@ -374,3 +376,16 @@ PyObject *eDVBServiceRecord::getStreamingData()
        return r;
 }
 
+void eDVBServiceRecord::recordEvent(int event)
+{
+       switch (event)
+       {
+       case iDVBTSRecorder::eventWriteError:
+               eWarning("[eDVBServiceRecord] record write error");
+               stop();
+               m_event((iRecordableService*)this, evRecordWriteError);
+               return;
+       default:
+               eDebug("unhandled record event %d", event);
+       }
+}
index 018e83f..dcce338 100644 (file)
@@ -38,6 +38,7 @@ private:
        eServiceReferenceDVB m_ref;
        
        ePtr<iDVBTSRecorder> m_record;
+       ePtr<eConnection>       m_con_record_event;
        
        int m_recording, m_tuned, m_error;
        std::set<int> m_pids_active;
@@ -51,6 +52,9 @@ private:
                        /* events */
        void serviceEvent(int event);
        Signal2<void,iRecordableService*,int> m_event;
+       
+                       /* recorder events */
+       void recordEvent(int event);
 };
 
 #endif