]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
linuxdvb: share file-descriptor across frontends in exclusive adapter mode, fixes...
authorJaroslav Kysela <perex@perex.cz>
Sun, 12 Mar 2017 20:21:17 +0000 (21:21 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 12 Mar 2017 20:21:17 +0000 (21:21 +0100)
src/input/mpegts/linuxdvb/linuxdvb_frontend.c

index 65bb711172ba4b5f2c0df404d242dc4d31cf31a1..4105937033717f8178ccd316680c7248e90c9698 100644 (file)
@@ -416,7 +416,7 @@ static void
 linuxdvb_frontend_enabled_updated ( mpegts_input_t *mi )
 {
   char buf[512];
-  linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi;
+  linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi, *lfe2;
 
   mi->mi_display_name(mi, buf, sizeof(buf));
 
@@ -433,7 +433,19 @@ linuxdvb_frontend_enabled_updated ( mpegts_input_t *mi )
 
   /* Ensure FE opened (if not powersave) */
   } else if (!lfe->lfe_powersave && lfe->lfe_fe_fd <= 0 && lfe->lfe_fe_path) {
-    lfe->lfe_fe_fd = tvh_open(lfe->lfe_fe_path, O_RDWR | O_NONBLOCK, 0);
+
+    /* Share FD across frontends */
+    if (lfe->lfe_adapter->la_exclusive) {
+      LIST_FOREACH(lfe2, &lfe->lfe_adapter->la_frontends, lfe_link) {
+        if (lfe2->lfe_fe_fd > 0) {
+          lfe->lfe_fe_fd = dup(lfe2->lfe_fe_fd);
+          break;
+        }
+      }
+    }
+
+    if (lfe->lfe_fe_fd <= 0)
+      lfe->lfe_fe_fd = tvh_open(lfe->lfe_fe_path, O_RDWR | O_NONBLOCK, 0);
     tvhtrace(LS_LINUXDVB, "%s - opening FE %s (%d)",
              buf, lfe->lfe_fe_path, lfe->lfe_fe_fd);
   }