[vlc-commits] Linux DVB: always open demux/dvr0 (and ca0)

Rémi Denis-Courmont git at videolan.org
Wed May 25 22:01:04 CEST 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed May 25 22:30:03 2011 +0300| [aa524d8e0139636c345f2f673d260e6181361a48] | committer: Rémi Denis-Courmont

Linux DVB: always open demux/dvr0 (and ca0)

Multi-frontend adapters (single tuner, multiple standards) provide
multiple frontend nodes and only one demux. So the device number
is only used when selecting the frontend.

I am going to assume that devices with multiple independent tuners
show as multiple adapters (otherwise this is totally screwed).

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=aa524d8e0139636c345f2f673d260e6181361a48
---

 modules/access/dtv/linux.c |   50 ++++++++++++++++++-------------------------
 1 files changed, 21 insertions(+), 29 deletions(-)

diff --git a/modules/access/dtv/linux.c b/modules/access/dtv/linux.c
index 29426d2..4ff14a7 100644
--- a/modules/access/dtv/linux.c
+++ b/modules/access/dtv/linux.c
@@ -62,13 +62,13 @@ static int dvb_open_adapter (uint8_t adapter)
 }
 
 /** Opens the DVB device node of the specified type */
-static int dvb_open_node (int dirfd, uint8_t dev, const char *type, int flags)
+static int dvb_open_node (int dir, const char *type, unsigned dev, int flags)
 {
     int fd;
     char path[strlen (type) + 4];
 
     snprintf (path, sizeof (path), "%s%"PRIu8, type, dev);
-    fd = openat (dirfd, path, flags|O_CLOEXEC);
+    fd = openat (dir, path, flags|O_CLOEXEC);
     if (fd != -1)
         fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_NONBLOCK);
     return fd;
@@ -170,12 +170,11 @@ static int dvb_parse_fec (uint32_t fec)
 struct dvb_device
 {
     vlc_object_t *obj;
-    int frontend;
+    int dir;
     int demux;
+    int frontend;
 #ifndef USE_DMX
 # define MAX_PIDS 256
-    int dir;
-    uint8_t dev_id;
     struct
     {
         int fd;
@@ -195,24 +194,22 @@ struct dvb_device
  */
 dvb_device_t *dvb_open (vlc_object_t *obj, bool tune)
 {
+    dvb_device_t *d = malloc (sizeof (*d));
+    if (unlikely(d == NULL))
+        return NULL;
+
+    d->obj = obj;
+
     uint8_t adapter = var_InheritInteger (obj, "dvb-adapter");
     uint8_t device  = var_InheritInteger (obj, "dvb-device");
 
-    int dirfd = dvb_open_adapter (adapter);
-    if (dirfd == -1)
+    d->dir = dvb_open_adapter (adapter);
+    if (d->dir == -1)
     {
         msg_Err (obj, "cannot access adapter %"PRIu8": %m", adapter);
+        free (d);
         return NULL;
     }
-
-    dvb_device_t *d = malloc (sizeof (*d));
-    if (unlikely(d == NULL))
-    {
-        close (dirfd);
-        return NULL;
-    }
-
-    d->obj = obj;
     d->frontend = -1;
 #ifdef HAVE_DVBPSI
     d->cam = NULL;
@@ -223,12 +220,12 @@ dvb_device_t *dvb_open (vlc_object_t *obj, bool tune)
     if (d->budget)
 #endif
     {
-       d->demux = dvb_open_node (dirfd, device, "demux", O_RDONLY);
+       d->demux = dvb_open_node (d->dir, "demux", 0, O_RDONLY);
        if (d->demux == -1)
        {
            msg_Err (obj, "cannot access demultiplexer: %m");
+           close (d->dir);
            free (d);
-           close (dirfd);
            return NULL;
        }
 
@@ -253,17 +250,14 @@ dvb_device_t *dvb_open (vlc_object_t *obj, bool tune)
     }
     else
     {
-        d->dir = fcntl (dirfd, F_DUPFD_CLOEXEC);
-        d->dev_id = device;
-
         for (size_t i = 0; i < MAX_PIDS; i++)
             d->pids[i].pid = d->pids[i].fd = -1;
-        d->demux = dvb_open_node (d->dir, device, "dvr", O_RDONLY);
+        d->demux = dvb_open_node (d->dir, "dvr", 0, O_RDONLY);
         if (d->demux == -1)
         {
             msg_Err (obj, "cannot access DVR: %m");
+            close (d->dir);
             free (d);
-            close (dirfd);
             return NULL;
         }
 #endif
@@ -271,7 +265,7 @@ dvb_device_t *dvb_open (vlc_object_t *obj, bool tune)
 
     if (tune)
     {
-        d->frontend = dvb_open_node (dirfd, device, "frontend", O_RDWR);
+        d->frontend = dvb_open_node (d->dir, "frontend", device, O_RDWR);
         if (d->frontend == -1)
         {
             msg_Err (obj, "cannot access frontend %"PRIu8
@@ -298,7 +292,7 @@ dvb_device_t *dvb_open (vlc_object_t *obj, bool tune)
                  d->info.symbol_rate_tolerance);
 
 #ifdef HAVE_DVBPSI
-        int ca = dvb_open_node (dirfd, device, "ca", O_RDWR);
+        int ca = dvb_open_node (d->dir, "ca", 0, O_RDWR);
         if (ca != -1)
         {
             d->cam = en50221_Init (obj, ca);
@@ -309,11 +303,9 @@ dvb_device_t *dvb_open (vlc_object_t *obj, bool tune)
             msg_Dbg (obj, "conditional access module not available (%m)");
 #endif
     }
-    close (dirfd);
     return d;
 
 error:
-    close (dirfd);
     dvb_close (d);
     return NULL;
 }
@@ -323,7 +315,6 @@ void dvb_close (dvb_device_t *d)
 #ifndef USE_DMX
     if (!d->budget)
     {
-        close (d->dir);
         for (size_t i = 0; i < MAX_PIDS; i++)
             if (d->pids[i].fd != -1)
                 close (d->pids[i].fd);
@@ -336,6 +327,7 @@ void dvb_close (dvb_device_t *d)
     if (d->frontend != -1)
         close (d->frontend);
     close (d->demux);
+    close (d->dir);
     free (d);
 }
 
@@ -419,7 +411,7 @@ int dvb_add_pid (dvb_device_t *d, uint16_t pid)
         if (d->pids[i].fd != -1)
             continue;
 
-        int fd = dvb_open_node (d->dir, d->dev_id, "demux", O_RDONLY);
+        int fd = dvb_open_node (d->dir, "demux", 0, O_RDONLY);
         if (fd == -1)
             goto error;
 



More information about the vlc-commits mailing list