add own demux policy for dm8000 which now have 5 demux devices one for each
[enigma2.git] / lib / dvb / demux.cpp
index 931c6c71fa8ac26220eba3bba3e2a0e32dec3cf6..29bbf264c7f6fa71dea0ae40e6a43af7a7db486e 100644 (file)
@@ -76,11 +76,12 @@ RESULT eDVBDemux::setSourceFrontend(int fenum)
 {
 #if HAVE_DVB_API_VERSION >= 3
        int fd = openDemux();
-       
        int n = DMX_SOURCE_FRONT0 + fenum;
        int res = ::ioctl(fd, DMX_SET_SOURCE, &n);
        if (res)
                eDebug("DMX_SET_SOURCE failed! - %m");
+       else
+               source = fenum;
        ::close(fd);
        return res;
 #endif
@@ -93,6 +94,7 @@ RESULT eDVBDemux::setSourcePVR(int pvrnum)
        int fd = openDemux();
        int n = DMX_SOURCE_DVR0 + pvrnum;
        int res = ::ioctl(fd, DMX_SET_SOURCE, &n);
+       source = -1;
        ::close(fd);
        return res;
 #endif
@@ -632,10 +634,17 @@ RESULT eDVBTSRecorder::startPID(int pid)
        }
        m_pids[pid] = fd;
 #else
-       if (::ioctl(m_source_fd, DMX_ADD_PID, pid))
-               perror("DMX_ADD_PID");
-       else
-               m_pids[pid] = 1;
+       while(true) {
+               if (::ioctl(m_source_fd, DMX_ADD_PID, pid) < 0) {
+                       perror("DMX_ADD_PID");
+                       if (errno == EAGAIN || errno == EINTR) {
+                               eDebug("retry!");
+                               continue;
+                       }
+               } else
+                       m_pids[pid] = 1;
+               break;
+       }
 #endif
        return 0;
 }
@@ -648,8 +657,16 @@ void eDVBTSRecorder::stopPID(int pid)
 #else
        if (m_pids[pid] != -1)
        {
-               if (::ioctl(m_source_fd, DMX_REMOVE_PID, pid))
-                       perror("DMX_REMOVE_PID");
+               while(true) {
+                       if (::ioctl(m_source_fd, DMX_REMOVE_PID, pid) < 0) {
+                               perror("DMX_REMOVE_PID");
+                               if (errno == EAGAIN || errno == EINTR) {
+                                       eDebug("retry!");
+                                       continue;
+                               }
+                       }
+                       break;
+               }
        }
 #endif
        m_pids[pid] = -1;