]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
linuxdvb: split the adapter source into 3 files.
authorAdam Sutton <dev@adamsutton.me.uk>
Fri, 24 May 2013 14:23:34 +0000 (15:23 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Fri, 24 May 2013 14:23:34 +0000 (15:23 +0100)
Makefile
src/input/mpegts/linuxdvb/linuxdvb.c
src/input/mpegts/linuxdvb/linuxdvb_adapter.c
src/input/mpegts/linuxdvb/linuxdvb_device.c [new file with mode: 0644]
src/input/mpegts/linuxdvb/linuxdvb_hardware.c [new file with mode: 0644]
src/input/mpegts/linuxdvb/linuxdvb_private.h

index 1c2680efe625616629c7400f053a7d72afd4c3ff..b79cefd842b3b2e2fdc4059a26cc618a91595ffc 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -167,6 +167,8 @@ SRCS-$(CONFIG_MPEGTS) += \
 # DVB
 SRCS-${CONFIG_LINUXDVB} += \
   src/input/mpegts/linuxdvb/linuxdvb.c \
+  src/input/mpegts/linuxdvb/linuxdvb_hardware.c \
+  src/input/mpegts/linuxdvb/linuxdvb_device.c \
   src/input/mpegts/linuxdvb/linuxdvb_adapter.c \
   src/input/mpegts/linuxdvb/linuxdvb_frontend.c \
 
index b2e96cdcdbb5f1d65ff5c3c8797ef49032733d84..34915a7de530676c58932be04f088612abd9f9ae 100644 (file)
 
 void linuxdvb_init ( int adapter_mask )
 {
-  int a;
-  DIR *dp;
-  htsmsg_t *s, *e;
-  htsmsg_field_t *f;
+  /* Initialise networks */
+  //linuxdvb_network_init();
 
-  /* Load configuration */
-  if ((s = hts_settings_load_r(1, "input/linuxdvb/devices"))) {
-    HTSMSG_FOREACH(f, s) {
-      if ((e = htsmsg_get_map_by_field(f))) {
-        (void)linuxdvb_device_create0(f->hmf_name, e);
-      }
-    }
-  }
-  
-  /* Scan for hardware */
-  if ((dp = opendir("/dev/dvb"))) {
-    struct dirent *de;
-    while ((de = readdir(dp))) {
-      if (sscanf(de->d_name, "adapter%d", &a) != 1) continue;
-      if ((0x1 << a) & adapter_mask)
-        linuxdvb_adapter_added(a);
-    }
-  }
-
-  // TODO: add udev support for hotplug
+  /* Initialsie devices */
+  linuxdvb_device_init(adapter_mask);
 }
index 8d7cf4dca215041c7eb53c1d89631bada2980503..f560cbaf632cb6a5706b49ef79534e0cd3a3f75b 100644 (file)
 #include <dirent.h>
 #include <fcntl.h>
 
-/* ***************************************************************************
- * DVB Hardware class
- * **************************************************************************/
-
-static idnode_t **
-linuxdvb_hardware_enumerate ( linuxdvb_hardware_list_t *list )
-{
-  linuxdvb_hardware_t *lh;
-  idnode_t **v;
-  int cnt = 1;
-  LIST_FOREACH(lh, list, lh_parent_link)
-    cnt++;
-  v = malloc(sizeof(idnode_t *) * cnt);
-  cnt = 0;
-  LIST_FOREACH(lh, list, lh_parent_link)
-    v[cnt++] = &lh->mi_id;
-  v[cnt] = NULL;
-  return v;
-}
-
-static const char *
-linuxdvb_hardware_class_get_title ( idnode_t *in )
-{
-  return ((linuxdvb_hardware_t*)in)->lh_displayname;
-}
-
-static idnode_t **
-linuxdvb_hardware_class_get_childs ( idnode_t *in )
-{
-  return linuxdvb_hardware_enumerate(&((linuxdvb_hardware_t*)in)->lh_children);
-}
-
-const idclass_t linuxdvb_hardware_class =
-{
-  .ic_class      = "linuxdvb_hardware",
-  .ic_caption    = "LinuxDVB Hardware",
-  .ic_get_title  = linuxdvb_hardware_class_get_title,
-  .ic_get_childs = linuxdvb_hardware_class_get_childs,
-  .ic_properties = (const property_t[]){
-    { PROPDEF1("enabled", "Enabled",
-               PT_BOOL, linuxdvb_hardware_t, lh_enabled) },
-    { PROPDEF1("displayname", "Name",
-               PT_STR, linuxdvb_hardware_t, lh_displayname) },
-    {}
-  }
-};
-
-/* ***************************************************************************
- * DVB Device
- * **************************************************************************/
-
-/*
- * BUS str table
- */
-static struct strtab bustab[] = {
-  { "PCI",  BUS_PCI  },
-  { "USB1", BUS_USB1 },
-  { "USB2", BUS_USB2 },
-  { "USB3", BUS_USB3 }
-};
-static const char*
-devinfo_bus2str ( int p )
-{
-  return val2str(p, bustab);
-}
-
-/*
- * Get bus information
- */
-static void
-get_device_info ( device_info_t *di, int a )
-{
-  FILE *fp;
-  DIR *dp;
-  struct dirent *de;
-  uint16_t u16;
-  int speed;
-  char path[512], buf[512];
-  ssize_t c;
-  int mina = a;
-
-  /* Check for subsystem */
-#define DVB_DEV_PATH "/sys/class/dvb/dvb%d.frontend0/device"
-  snprintf(path, sizeof(path), DVB_DEV_PATH "/subsystem", a);
-  if ((c = readlink(path, buf, sizeof(buf))) != -1) {
-    buf[c] = '\0';
-    char *bus = basename(buf);
-    if (!strcmp(bus, "pci")) {
-      di->di_bus = BUS_PCI;
-      snprintf(path, sizeof(path), DVB_DEV_PATH "/subsystem_vendor", a);
-      if ((fp = fopen(path, "r"))) {
-        if (fscanf(fp, "0x%hx", &u16) == 1)
-          di->di_dev = u16;
-      }
-      di->di_dev <<= 16;
-      snprintf(path, sizeof(path), DVB_DEV_PATH "/subsystem_device", a);
-      if ((fp = fopen(path, "r"))) {
-        if (fscanf(fp, "0x%hx", &u16) == 1)
-          di->di_dev |= u16;
-      }
-
-    } else if (!strcmp(bus, "usb")) {
-      di->di_bus = BUS_USB1;
-      snprintf(path, sizeof(path), DVB_DEV_PATH "/idVendor", a);
-      if ((fp = fopen(path, "r"))) {
-        if (fscanf(fp, "%hx", &u16) == 1)
-          di->di_dev = u16;
-      }
-      di->di_dev <<= 16;
-      snprintf(path, sizeof(path), DVB_DEV_PATH "/idProduct", a);
-      if ((fp = fopen(path, "r"))) {
-        if (fscanf(fp, "%hx", &u16) == 1)
-          di->di_dev |= u16;
-      }
-      snprintf(path, sizeof(path), DVB_DEV_PATH "/speed", a);
-      if ((fp = fopen(path, "r"))) {
-        if (fscanf(fp, "%d", &speed) == 1) {
-          if (speed > 480) {
-            di->di_bus = BUS_USB3;
-          } else if (speed == 480) {
-            di->di_bus = BUS_USB2;
-          }
-        }
-        fclose(fp);
-      }
-    } else {
-      tvhlog(LOG_WARNING, "linuxdvb",
-             "could not determine host connection for adapter%d", a);
-    }
-  }
-
-  /* Get Path */
-  snprintf(path, sizeof(path), DVB_DEV_PATH, a);
-  if ((c = readlink(path, buf, sizeof(buf))) != -1) {
-    buf[c] = '\0';
-    strcpy(di->di_path, basename(buf));
-  }
-  
-  /* Find minimum adapter number */
-  snprintf(path, sizeof(path), DVB_DEV_PATH "/dvb", a);
-  if ((dp = opendir(path))) {
-    while ((de = readdir(dp))) {
-      int t;
-      if ((sscanf(de->d_name, "dvb%d.frontend0", &t)))
-        if (t < mina) mina = t;
-    }
-    closedir(dp);
-  }
-  di->di_min_adapter = mina;
-
-  /* Create ID */
-  if (*di->di_path && di->di_dev) {
-    snprintf(buf, sizeof(buf), "%s/%s/%04x:%04x",
-             devinfo_bus2str(di->di_bus), di->di_path,
-             di->di_dev >> 16, di->di_dev & 0xFFFF);
-  } else {
-    snprintf(buf, sizeof(buf), "/dev/dvb/adapter%d", a);
-  }
-  di->di_id = strdup(buf);
-}
-
-const idclass_t linuxdvb_device_class =
-{
-  .ic_super      = &linuxdvb_hardware_class,
-  .ic_class      = "linuxdvb_device",
-  .ic_caption    = "LinuxDVB Device",
-  .ic_properties = (const property_t[]){
-    { PROPDEF2("devid", "Device ID",
-               PT_STR, linuxdvb_device_t, ld_devid.di_id, 1) },
-    {}
-  }
-};
-
-static linuxdvb_hardware_list_t linuxdvb_device_all;
-
-idnode_t **
-linuxdvb_root ( void )
-{
-  return linuxdvb_hardware_enumerate(&linuxdvb_device_all);
-}
-
-linuxdvb_device_t *
-linuxdvb_device_create0 ( const char *uuid, htsmsg_t *conf )
-{
-  uint32_t u32;
-  const char *str;
-  linuxdvb_device_t *ld;
-
-  /* Create */
-  ld = calloc(1, sizeof(linuxdvb_device_t));
-  if (idnode_insert(&ld->mi_id, uuid, &linuxdvb_device_class)) {
-    free(ld);
-    return NULL;
-  }
-  LIST_INSERT_HEAD(&linuxdvb_device_all, (linuxdvb_hardware_t*)ld, lh_parent_link);
-
-  /* No config */
-  if (!conf)
-    return ld;
-
-  /* Load config */
-  if (!htsmsg_get_u32(conf, "enabled", &u32) && u32)
-    ld->lh_enabled     = 1;
-  if ((str = htsmsg_get_str(conf, "displayname")))
-    ld->lh_displayname = strdup(str);
-  if ((str = htsmsg_get_str(conf, "devid")))
-    strncpy(ld->ld_devid.di_id, str, sizeof(ld->ld_devid.di_id));
-
-  // TODO: adapters
-  // TODO: frontends
-
-  return ld;
-}
-
-static linuxdvb_device_t *
-linuxdvb_device_find_by_hwid ( const char *hwid )
-{
-  linuxdvb_hardware_t *lh;
-  LIST_FOREACH(lh, &linuxdvb_device_all, lh_parent_link)
-    if (!strcmp(hwid, ((linuxdvb_device_t*)lh)->ld_devid.di_id))
-      return (linuxdvb_device_t*)lh;
-  return NULL;
-}
-
-static linuxdvb_device_t *
-linuxdvb_device_find_by_adapter ( int a )
-{
-  linuxdvb_device_t *ld;
-  device_info_t dev;
-
-  /* Get device info */
-  get_device_info(&dev, a);
-
-  /* Find existing */
-  if ((ld = linuxdvb_device_find_by_hwid(dev.di_id)))
-    return ld;
-
-  /* Create new */
-  if (!(ld = linuxdvb_device_create0(NULL, NULL))) {
-    tvhlog(LOG_ERR, "linuxdvb", "failed to create device for adapter%d", a);
-    return NULL;
-  }
-
-  /* Copy device info */
-  memcpy(&ld->ld_devid, &dev, sizeof(dev));
-  ld->lh_displayname = strdup(dev.di_id);
-  return ld;
-}
-
 /* ***************************************************************************
  * DVB Adapter
  * **************************************************************************/
diff --git a/src/input/mpegts/linuxdvb/linuxdvb_device.c b/src/input/mpegts/linuxdvb/linuxdvb_device.c
new file mode 100644 (file)
index 0000000..3025f12
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+ *  Tvheadend - Linux DVB device management
+ *
+ *  Copyright (C) 2013 Adam Sutton
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "tvheadend.h"
+#include "input.h"
+#include "linuxdvb_private.h"
+#include "queue.h"
+#include "settings.h"
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <fcntl.h>
+  
+/* ***************************************************************************
+ * DVB Device
+ * **************************************************************************/
+
+/*
+ * BUS str table
+ */
+static struct strtab bustab[] = {
+  { "PCI",  BUS_PCI  },
+  { "USB1", BUS_USB1 },
+  { "USB2", BUS_USB2 },
+  { "USB3", BUS_USB3 }
+};
+static const char*
+devinfo_bus2str ( int p )
+{
+  return val2str(p, bustab);
+}
+
+/*
+ * Get bus information
+ */
+static void
+get_device_info ( device_info_t *di, int a )
+{
+  FILE *fp;
+  DIR *dp;
+  struct dirent *de;
+  uint16_t u16;
+  int speed;
+  char path[512], buf[512];
+  ssize_t c;
+  int mina = a;
+
+  /* Check for subsystem */
+#define DVB_DEV_PATH "/sys/class/dvb/dvb%d.frontend0/device"
+  snprintf(path, sizeof(path), DVB_DEV_PATH "/subsystem", a);
+  if ((c = readlink(path, buf, sizeof(buf))) != -1) {
+    buf[c] = '\0';
+    char *bus = basename(buf);
+    if (!strcmp(bus, "pci")) {
+      di->di_bus = BUS_PCI;
+      snprintf(path, sizeof(path), DVB_DEV_PATH "/subsystem_vendor", a);
+      if ((fp = fopen(path, "r"))) {
+        if (fscanf(fp, "0x%hx", &u16) == 1)
+          di->di_dev = u16;
+      }
+      di->di_dev <<= 16;
+      snprintf(path, sizeof(path), DVB_DEV_PATH "/subsystem_device", a);
+      if ((fp = fopen(path, "r"))) {
+        if (fscanf(fp, "0x%hx", &u16) == 1)
+          di->di_dev |= u16;
+      }
+
+    } else if (!strcmp(bus, "usb")) {
+      di->di_bus = BUS_USB1;
+      snprintf(path, sizeof(path), DVB_DEV_PATH "/idVendor", a);
+      if ((fp = fopen(path, "r"))) {
+        if (fscanf(fp, "%hx", &u16) == 1)
+          di->di_dev = u16;
+      }
+      di->di_dev <<= 16;
+      snprintf(path, sizeof(path), DVB_DEV_PATH "/idProduct", a);
+      if ((fp = fopen(path, "r"))) {
+        if (fscanf(fp, "%hx", &u16) == 1)
+          di->di_dev |= u16;
+      }
+      snprintf(path, sizeof(path), DVB_DEV_PATH "/speed", a);
+      if ((fp = fopen(path, "r"))) {
+        if (fscanf(fp, "%d", &speed) == 1) {
+          if (speed > 480) {
+            di->di_bus = BUS_USB3;
+          } else if (speed == 480) {
+            di->di_bus = BUS_USB2;
+          }
+        }
+        fclose(fp);
+      }
+    } else {
+      tvhlog(LOG_WARNING, "linuxdvb",
+             "could not determine host connection for adapter%d", a);
+    }
+  }
+
+  /* Get Path */
+  snprintf(path, sizeof(path), DVB_DEV_PATH, a);
+  if ((c = readlink(path, buf, sizeof(buf))) != -1) {
+    buf[c] = '\0';
+    strcpy(di->di_path, basename(buf));
+  }
+  
+  /* Find minimum adapter number */
+  snprintf(path, sizeof(path), DVB_DEV_PATH "/dvb", a);
+  if ((dp = opendir(path))) {
+    while ((de = readdir(dp))) {
+      int t;
+      if ((sscanf(de->d_name, "dvb%d.frontend0", &t)))
+        if (t < mina) mina = t;
+    }
+    closedir(dp);
+  }
+  di->di_min_adapter = mina;
+
+  /* Create ID */
+  if (*di->di_path && di->di_dev) {
+    snprintf(buf, sizeof(buf), "%s/%s/%04x:%04x",
+             devinfo_bus2str(di->di_bus), di->di_path,
+             di->di_dev >> 16, di->di_dev & 0xFFFF);
+  } else {
+    snprintf(buf, sizeof(buf), "/dev/dvb/adapter%d", a);
+  }
+  di->di_id = strdup(buf);
+}
+
+const idclass_t linuxdvb_device_class =
+{
+  .ic_super      = &linuxdvb_hardware_class,
+  .ic_class      = "linuxdvb_device",
+  .ic_caption    = "LinuxDVB Device",
+  .ic_properties = (const property_t[]){
+    { PROPDEF2("devid", "Device ID",
+               PT_STR, linuxdvb_device_t, ld_devid.di_id, 1) },
+    {}
+  }
+};
+
+static linuxdvb_hardware_list_t linuxdvb_device_all;
+
+idnode_t **
+linuxdvb_root ( void )
+{
+  return linuxdvb_hardware_enumerate(&linuxdvb_device_all);
+}
+
+linuxdvb_device_t *
+linuxdvb_device_create0 ( const char *uuid, htsmsg_t *conf )
+{
+  uint32_t u32;
+  const char *str;
+  linuxdvb_device_t *ld;
+
+  /* Create */
+  ld = calloc(1, sizeof(linuxdvb_device_t));
+  if (idnode_insert(&ld->mi_id, uuid, &linuxdvb_device_class)) {
+    free(ld);
+    return NULL;
+  }
+  LIST_INSERT_HEAD(&linuxdvb_device_all, (linuxdvb_hardware_t*)ld, lh_parent_link);
+
+  /* No config */
+  if (!conf)
+    return ld;
+
+  /* Load config */
+  if (!htsmsg_get_u32(conf, "enabled", &u32) && u32)
+    ld->lh_enabled     = 1;
+  if ((str = htsmsg_get_str(conf, "displayname")))
+    ld->lh_displayname = strdup(str);
+  if ((str = htsmsg_get_str(conf, "devid")))
+    strncpy(ld->ld_devid.di_id, str, sizeof(ld->ld_devid.di_id));
+
+  // TODO: adapters
+  // TODO: frontends
+
+  return ld;
+}
+
+static linuxdvb_device_t *
+linuxdvb_device_find_by_hwid ( const char *hwid )
+{
+  linuxdvb_hardware_t *lh;
+  LIST_FOREACH(lh, &linuxdvb_device_all, lh_parent_link)
+    if (!strcmp(hwid, ((linuxdvb_device_t*)lh)->ld_devid.di_id))
+      return (linuxdvb_device_t*)lh;
+  return NULL;
+}
+
+linuxdvb_device_t *
+linuxdvb_device_find_by_adapter ( int a )
+{
+  linuxdvb_device_t *ld;
+  device_info_t dev;
+
+  /* Get device info */
+  get_device_info(&dev, a);
+
+  /* Find existing */
+  if ((ld = linuxdvb_device_find_by_hwid(dev.di_id)))
+    return ld;
+
+  /* Create new */
+  if (!(ld = linuxdvb_device_create0(NULL, NULL))) {
+    tvhlog(LOG_ERR, "linuxdvb", "failed to create device for adapter%d", a);
+    return NULL;
+  }
+
+  /* Copy device info */
+  memcpy(&ld->ld_devid, &dev, sizeof(dev));
+  ld->lh_displayname = strdup(dev.di_id);
+  return ld;
+}
+
+void linuxdvb_device_init ( int adapter_mask )
+{
+  int a;
+  DIR *dp;
+  htsmsg_t *s, *e;
+  htsmsg_field_t *f;
+
+  /* Load configuration */
+  if ((s = hts_settings_load_r(1, "input/linuxdvb/devices"))) {
+    HTSMSG_FOREACH(f, s) {
+      if ((e = htsmsg_get_map_by_field(f))) {
+        (void)linuxdvb_device_create0(f->hmf_name, e);
+      }
+    }
+  }
+  
+  /* Scan for hardware */
+  if ((dp = opendir("/dev/dvb"))) {
+    struct dirent *de;
+    while ((de = readdir(dp))) {
+      if (sscanf(de->d_name, "adapter%d", &a) != 1) continue;
+      if ((0x1 << a) & adapter_mask)
+        linuxdvb_adapter_added(a);
+    }
+  }
+
+  // TODO: add udev support for hotplug
+}
diff --git a/src/input/mpegts/linuxdvb/linuxdvb_hardware.c b/src/input/mpegts/linuxdvb/linuxdvb_hardware.c
new file mode 100644 (file)
index 0000000..1e7b921
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ *  Tvheadend - Linux DVB hardware class
+ *
+ *  Copyright (C) 2013 Adam Sutton
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "tvheadend.h"
+#include "input.h"
+#include "linuxdvb_private.h"
+#include "queue.h"
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <fcntl.h>
+
+idnode_t **
+linuxdvb_hardware_enumerate ( linuxdvb_hardware_list_t *list )
+{
+  linuxdvb_hardware_t *lh;
+  idnode_t **v;
+  int cnt = 1;
+  LIST_FOREACH(lh, list, lh_parent_link)
+    cnt++;
+  v = malloc(sizeof(idnode_t *) * cnt);
+  cnt = 0;
+  LIST_FOREACH(lh, list, lh_parent_link)
+    v[cnt++] = &lh->mi_id;
+  v[cnt] = NULL;
+  return v;
+}
+
+static const char *
+linuxdvb_hardware_class_get_title ( idnode_t *in )
+{
+  return ((linuxdvb_hardware_t*)in)->lh_displayname;
+}
+
+static idnode_t **
+linuxdvb_hardware_class_get_childs ( idnode_t *in )
+{
+  return linuxdvb_hardware_enumerate(&((linuxdvb_hardware_t*)in)->lh_children);
+}
+
+const idclass_t linuxdvb_hardware_class =
+{
+  .ic_class      = "linuxdvb_hardware",
+  .ic_caption    = "LinuxDVB Hardware",
+  .ic_get_title  = linuxdvb_hardware_class_get_title,
+  .ic_get_childs = linuxdvb_hardware_class_get_childs,
+  .ic_properties = (const property_t[]){
+    { PROPDEF1("enabled", "Enabled",
+               PT_BOOL, linuxdvb_hardware_t, lh_enabled) },
+    { PROPDEF1("displayname", "Name",
+               PT_STR, linuxdvb_hardware_t, lh_displayname) },
+    {}
+  }
+};
index 7a0276087d487213b4b1c2bf5bba55fb22c99396..54d3c44b49d1da494422fba84afbccee0aebe046 100644 (file)
@@ -64,6 +64,12 @@ struct linuxdvb_hardware
   char                         *lh_displayname;
 };
 
+extern const idclass_t linuxdvb_hardware_class;
+
+idnode_t **
+linuxdvb_hardware_enumerate ( linuxdvb_hardware_list_t *list );
+
+
 struct linuxdvb_device
 {
   linuxdvb_hardware_t;
@@ -74,9 +80,13 @@ struct linuxdvb_device
   device_info_t               ld_devid;
 };
 
+void linuxdvb_device_init ( int adapter_mask );
+
 linuxdvb_device_t *linuxdvb_device_create0
   (const char *uuid, htsmsg_t *conf);
 
+linuxdvb_device_t * linuxdvb_device_find_by_adapter ( int a );
+
 struct linuxdvb_adapter
 {
   linuxdvb_hardware_t;