]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
linuxdvb: update to new multiple networks setup
authorAdam Sutton <dev@adamsutton.me.uk>
Mon, 17 Mar 2014 23:44:25 +0000 (23:44 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Tue, 18 Mar 2014 21:46:11 +0000 (21:46 +0000)
src/input/mpegts/linuxdvb/linuxdvb_frontend.c
src/input/mpegts/linuxdvb/linuxdvb_mux.c
src/input/mpegts/linuxdvb/linuxdvb_satconf.c

index 48c6e6bfb98fd67478da533edccf6f533e2a6902..d9b9ca878bc1fc79bcbb8f9c75e10ef1684e006c 100644 (file)
@@ -48,58 +48,6 @@ linuxdvb_frontend_class_save ( idnode_t *in )
   linuxdvb_adapter_save(la);
 }
 
-static const void*
-linuxdvb_frontend_class_network_get(void *o)
-{
-  static const char *s;
-  linuxdvb_frontend_t *lfe = o;
-  if (lfe->mi_network)
-    s = idnode_uuid_as_str(&lfe->mi_network->mn_id);
-  else
-    s = NULL;
-  return &s;
-}
-
-static int
-linuxdvb_frontend_class_network_set(void *o, const void *v)
-{
-  mpegts_input_t   *mi = o;
-  mpegts_network_t *mn = mi->mi_network;
-  linuxdvb_network_t *ln = (linuxdvb_network_t*)mn;
-  linuxdvb_frontend_t *lfe = o;
-  const char *s = v;
-
-  if (lfe->lfe_info.type == FE_QPSK) {
-    tvherror("linuxdvb", "cannot set network on DVB-S FE");
-    return 0;
-  }
-
-  if (mi->mi_network && !strcmp(idnode_uuid_as_str(&mn->mn_id), s ?: ""))
-    return 0;
-
-  if (ln && ln->ln_type != lfe->lfe_info.type) {
-    tvherror("linuxdvb", "attempt to set network of wrong type");
-    return 0;
-  }
-
-  mpegts_input_set_network(mi, s ? mpegts_network_find(s) : NULL);
-  return 1;
-}
-
-static htsmsg_t *
-linuxdvb_frontend_class_network_enum(void *o)
-{
-  htsmsg_t *m = htsmsg_create_map();
-  htsmsg_t *p = htsmsg_create_map();
-  htsmsg_add_str(m, "type",  "api");
-  htsmsg_add_str(m, "uri",   "mpegts/input/network_list");
-  htsmsg_add_str(p, "uuid",  idnode_uuid_as_str((idnode_t*)o));
-  htsmsg_add_str(m, "event", "mpegts_network");
-  htsmsg_add_msg(m, "params", p);
-
-  return m;
-}
-
 const idclass_t linuxdvb_frontend_class =
 {
   .ic_super      = &mpegts_input_class,
@@ -157,14 +105,6 @@ const idclass_t linuxdvb_frontend_dvbt_class =
   .ic_class      = "linuxdvb_frontend_dvbt",
   .ic_caption    = "Linux DVB-T Frontend",
   .ic_properties = (const property_t[]){
-    {
-      .type     = PT_STR,
-      .id       = "network",
-      .name     = "Network",
-      .get      = linuxdvb_frontend_class_network_get,
-      .set      = linuxdvb_frontend_class_network_set,
-      .list     = linuxdvb_frontend_class_network_enum
-    },
     {}
   }
 };
@@ -218,6 +158,10 @@ const idclass_t linuxdvb_frontend_dvbs_class =
       .list     = linuxdvb_satconf_type_list,
       .def.s    = "simple"
     },
+    {
+      .id       = "networks",
+      .type     = PT_NONE,
+    },
     {}
   }
 };
@@ -228,14 +172,6 @@ const idclass_t linuxdvb_frontend_dvbc_class =
   .ic_class      = "linuxdvb_frontend_dvbc",
   .ic_caption    = "Linux DVB-C Frontend",
   .ic_properties = (const property_t[]){
-    {
-      .type     = PT_STR,
-      .id       = "network",
-      .name     = "Network",
-      .get      = linuxdvb_frontend_class_network_get,
-      .set      = linuxdvb_frontend_class_network_set,
-      .list     = linuxdvb_frontend_class_network_enum
-    },
     {}
   }
 };
@@ -246,14 +182,6 @@ const idclass_t linuxdvb_frontend_atsc_class =
   .ic_class      = "linuxdvb_frontend_atsc",
   .ic_caption    = "Linux ATSC Frontend",
   .ic_properties = (const property_t[]){
-    {
-      .type     = PT_STR,
-      .id       = "network",
-      .name     = "Network",
-      .get      = linuxdvb_frontend_class_network_get,
-      .set      = linuxdvb_frontend_class_network_set,
-      .list     = linuxdvb_frontend_class_network_enum
-    },
     {}
   }
 };
@@ -917,7 +845,7 @@ linuxdvb_frontend_create
     struct dvb_frontend_info *dfi )
 {
   const idclass_t *idc;
-  const char *uuid = NULL, *scuuid = NULL, *sctype = NULL;
+  const char *str, *uuid = NULL, *scuuid = NULL, *sctype = NULL;
   char id[12], name[256];
   linuxdvb_frontend_t *lfe;
   htsmsg_t *scconf = NULL;
@@ -929,6 +857,16 @@ linuxdvb_frontend_create
   if (conf)
     uuid = htsmsg_get_str(conf, "uuid");
 
+  /* Fudge configuration for old network entry */
+  if (conf) {
+    if (!htsmsg_get_list(conf, "networks") &&
+        (str = htsmsg_get_str(conf, "network"))) {
+      htsmsg_t *l = htsmsg_create_list();
+      htsmsg_add_str(l, NULL, str);
+      htsmsg_add_msg(conf, "networks", l);
+    }
+  }
+
   /* Class */
   if (dfi->type == FE_QPSK)
     idc = &linuxdvb_frontend_dvbs_class;
index 803c9803ae8e806f411aca980edf62c10362cfbb..501a2a50d96e092c23c2abc3202b547ee766b079 100644 (file)
@@ -603,8 +603,9 @@ linuxdvb_mux_display_name ( mpegts_mux_t *mm, char *buf, size_t len )
 static void
 linuxdvb_mux_create_instances ( mpegts_mux_t *mm )
 {
-  mpegts_input_t *mi;
-  LIST_FOREACH(mi, &mm->mm_network->mn_inputs, mi_network_link) {
+  mpegts_network_link_t *mnl;
+  LIST_FOREACH(mnl, &mm->mm_network->mn_inputs, mnl_mn_link) {
+    mpegts_input_t *mi = mnl->mnl_input;
     if (mi->mi_is_enabled(mi))
       mi->mi_create_mux_instance(mi, mm);
   }
index 0e66b4d52c7057a30b91ae4a74677dc52cb5c2a0..d406fdfef5bce4ec444dc425566013d56169f62a 100644 (file)
 #include <assert.h>
 #include <linux/dvb/dmx.h>
 
-static const void*
-linuxdvb_satconf_ele_class_network_get(void *o);
-
-static char *
-linuxdvb_satconf_ele_class_network_rend ( void *o );
-
-static int
-linuxdvb_satconf_ele_class_network_set(void *o, const void *v);
-
-static htsmsg_t *
-linuxdvb_satconf_ele_class_network_enum(void *o);
-
 static struct linuxdvb_satconf_type *
 linuxdvb_satconf_type_find ( const char *type );
 
@@ -60,20 +48,19 @@ linuxdvb_satconf_class_network_get
   ( linuxdvb_satconf_t *ls, int idx )
 {
   int i = 0;
-  static const char *s = NULL;
   linuxdvb_satconf_ele_t *lse;
   TAILQ_FOREACH(lse, &ls->ls_elements, ls_link) {
     if (i == idx) break;
     i++;
   }
   if (lse)
-    return linuxdvb_satconf_ele_class_network_get(lse);
-  return &s;
+    return mpegts_input_class_network_get(lse);
+  return NULL;
 }
 
 static int
 linuxdvb_satconf_class_network_set
-  ( linuxdvb_satconf_t *ls, int idx, const char *uuid )
+  ( linuxdvb_satconf_t *ls, int idx, const void *networks )
 {
   int i = 0;
   linuxdvb_satconf_ele_t *lse;
@@ -82,10 +69,27 @@ linuxdvb_satconf_class_network_set
     i++;
   }
   if (lse)
-    return linuxdvb_satconf_ele_class_network_set(lse, uuid);
+    return mpegts_input_class_network_set(lse, networks);
   return 0;
 }
 
+static htsmsg_t *
+linuxdvb_satconf_class_network_enum(void *o)
+{
+  extern const idclass_t linuxdvb_network_dvbs_class;
+  htsmsg_t *m = htsmsg_create_map();
+  htsmsg_t *p = htsmsg_create_map();
+  htsmsg_add_str(m, "type",  "api");
+  htsmsg_add_str(m, "uri",   "idnode/load");
+  htsmsg_add_str(m, "event", "mpegts_network");
+  htsmsg_add_u32(p, "enum",  1);
+  htsmsg_add_str(p, "class", linuxdvb_network_dvbs_class.ic_class);
+  htsmsg_add_msg(m, "params", p);
+
+  return m;
+}
+
+
 #define linuxdvb_satconf_class_network_getset(x)\
 static int \
 linuxdvb_satconf_class_network_set##x ( void *o, const void *v )\
@@ -216,11 +220,13 @@ const idclass_t linuxdvb_satconf_lnbonly_class =
   .ic_properties = (const property_t[]) {
     {
       .type     = PT_STR,
-      .id       = "network",
-      .name     = "Network",
+      .id       = "networks",
+      .name     = "Networks",
+      .islist   = 1,
       .get      = linuxdvb_satconf_class_network_get0,
       .set      = linuxdvb_satconf_class_network_set0,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
+      .list     = linuxdvb_satconf_class_network_enum,
+      .rend     = mpegts_input_class_network_rend,
       .opts     = PO_NOSAVE,
     },
     {}
@@ -240,18 +246,22 @@ const idclass_t linuxdvb_satconf_2port_class =
       .type     = PT_STR,
       .id       = "network_a",
       .name     = "A",
+      .islist   = 1,
       .get      = linuxdvb_satconf_class_network_get0,
       .set      = linuxdvb_satconf_class_network_set0,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
+      .list     = linuxdvb_satconf_class_network_enum,
+      .rend     = mpegts_input_class_network_rend,
       .opts     = PO_NOSAVE,
     },
     {
       .type     = PT_STR,
       .id       = "network_b",
       .name     = "B",
+      .islist   = 1,
       .get      = linuxdvb_satconf_class_network_get1,
       .set      = linuxdvb_satconf_class_network_set1,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
+      .list     = linuxdvb_satconf_class_network_enum,
+      .rend     = mpegts_input_class_network_rend,
       .opts     = PO_NOSAVE,
     },
     {}
@@ -271,36 +281,44 @@ const idclass_t linuxdvb_satconf_4port_class =
       .type     = PT_STR,
       .id       = "network_aa",
       .name     = "AA",
+      .islist   = 1,
       .get      = linuxdvb_satconf_class_network_get0,
       .set      = linuxdvb_satconf_class_network_set0,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
+      .list     = linuxdvb_satconf_class_network_enum,
+      .rend     = mpegts_input_class_network_rend,
       .opts     = PO_NOSAVE,
     },
     {
       .type     = PT_STR,
       .id       = "network_ab",
       .name     = "AB",
+      .islist   = 1,
       .get      = linuxdvb_satconf_class_network_get1,
       .set      = linuxdvb_satconf_class_network_set1,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
+      .list     = linuxdvb_satconf_class_network_enum,
+      .rend     = mpegts_input_class_network_rend,
       .opts     = PO_NOSAVE,
     },
     {
       .type     = PT_STR,
       .id       = "network_ba",
       .name     = "BA",
+      .islist   = 1,
       .get      = linuxdvb_satconf_class_network_get2,
       .set      = linuxdvb_satconf_class_network_set2,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
+      .list     = linuxdvb_satconf_class_network_enum,
+      .rend     = mpegts_input_class_network_rend,
       .opts     = PO_NOSAVE,
     },
     {
       .type     = PT_STR,
       .id       = "network_bb",
       .name     = "BB",
+      .islist   = 1,
       .get      = linuxdvb_satconf_class_network_get3,
       .set      = linuxdvb_satconf_class_network_set3,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
+      .list     = linuxdvb_satconf_class_network_enum,
+      .rend     = mpegts_input_class_network_rend,
       .opts     = PO_NOSAVE,
     },
     {}
@@ -405,7 +423,8 @@ const idclass_t linuxdvb_satconf_en50494_class =
       .name     = "Network A",
       .get      = linuxdvb_satconf_class_network_get0,
       .set      = linuxdvb_satconf_class_network_set0,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
+      .list     = linuxdvb_satconf_class_network_enum,
+      .rend     = mpegts_input_class_network_rend,
       .opts     = PO_NOSAVE,
     },
     {
@@ -414,7 +433,8 @@ const idclass_t linuxdvb_satconf_en50494_class =
       .name     = "Netwotk B",
       .get      = linuxdvb_satconf_class_network_get1,
       .set      = linuxdvb_satconf_class_network_set1,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
+      .list     = linuxdvb_satconf_class_network_enum,
+      .rend     = mpegts_input_class_network_rend,
       .opts     = PO_NOSAVE,
     },
     {}
@@ -520,6 +540,7 @@ linuxdvb_satconf_create
   htsmsg_t *l, *e;
   htsmsg_field_t *f;
   linuxdvb_satconf_ele_t *lse;
+  const char *str;
   struct linuxdvb_satconf_type *lst
     = linuxdvb_satconf_type_find(type);
   assert(lst);
@@ -544,6 +565,14 @@ linuxdvb_satconf_create
     if ((l = htsmsg_get_list(conf, "elements"))) {
       HTSMSG_FOREACH(f, l) {
         if (!(e = htsmsg_field_get_map(f))) continue;
+
+        /* Fix config */
+        if ((str = htsmsg_get_str(e, "network")) &&
+            !htsmsg_get_list(e, "networks")) {
+          htsmsg_t *l = htsmsg_create_list();
+          htsmsg_add_str(l, NULL, str);
+          htsmsg_add_msg(e, "networks", l);
+        }
         (void)linuxdvb_satconf_ele_create0(htsmsg_get_str(e, "uuid"), e, ls);
       }
     }
@@ -619,64 +648,6 @@ linuxdvb_satconf_save ( linuxdvb_satconf_t *ls, htsmsg_t *m )
 
 extern const idclass_t mpegts_input_class;
 
-static const void*
-linuxdvb_satconf_ele_class_network_get(void *o)
-{
-  static const char *s;
-  linuxdvb_satconf_ele_t *ls = o;
-  s = ls->mi_network ? idnode_uuid_as_str(&ls->mi_network->mn_id) : NULL;
-  return &s;
-}
-
-static char *
-linuxdvb_satconf_ele_class_network_rend ( void *o )
-{
-  const char *buf;
-  linuxdvb_satconf_ele_t *ls = o;
-  if (ls->mi_network)
-    if ((buf = idnode_get_title(&ls->mi_network->mn_id)))
-      return strdup(buf);
-  return NULL;
-}
-
-static int
-linuxdvb_satconf_ele_class_network_set(void *o, const void *v)
-{
-  extern const idclass_t linuxdvb_network_class;
-  mpegts_input_t   *mi = o;
-  mpegts_network_t *mn = mi->mi_network;
-  const char *s = v;
-
-  if (mi->mi_network && !strcmp(idnode_uuid_as_str(&mn->mn_id), s ?: ""))
-    return 0;
-
-  mn = s ? idnode_find(s, &linuxdvb_network_class) : NULL;
-
-  if (mn && ((linuxdvb_network_t*)mn)->ln_type != FE_QPSK) {
-    tvherror("linuxdvb", "attempt to set network of wrong type");
-    return 0;
-  }
-
-  mpegts_input_set_network(mi, mn);
-  return 1;
-}
-
-static htsmsg_t *
-linuxdvb_satconf_ele_class_network_enum(void *o)
-{
-  extern const idclass_t linuxdvb_network_dvbs_class;
-  htsmsg_t *m = htsmsg_create_map();
-  htsmsg_t *p = htsmsg_create_map();
-  htsmsg_add_str(m, "type",  "api");
-  htsmsg_add_str(m, "uri",   "idnode/load");
-  htsmsg_add_str(m, "event", "mpegts_network");
-  htsmsg_add_u32(p, "enum",  1);
-  htsmsg_add_str(p, "class", linuxdvb_network_dvbs_class.ic_class);
-  htsmsg_add_msg(m, "params", p);
-
-  return m;
-}
-
 static int
 linuxdvb_satconf_ele_class_lnbtype_set ( void *o, const void *p )
 {
@@ -764,11 +735,13 @@ static const char *
 linuxdvb_satconf_ele_class_get_title ( idnode_t *o )
 {
   static char buf[128];
+#if 0
   linuxdvb_satconf_ele_t *ls = (linuxdvb_satconf_ele_t*)o;
   if (ls->mi_network)
     ls->mi_network->mn_display_name(ls->mi_network, buf, sizeof(buf));
   else
     *buf = 0;
+#endif
   return buf;
 }
 
@@ -804,15 +777,6 @@ const idclass_t linuxdvb_satconf_ele_class =
   .ic_get_childs = linuxdvb_satconf_ele_class_get_childs,
   .ic_save       = linuxdvb_satconf_ele_class_save,
   .ic_properties = (const property_t[]) {
-    {
-      .type     = PT_STR,
-      .id       = "network",
-      .name     = "Network",
-      .get      = linuxdvb_satconf_ele_class_network_get,
-      .set      = linuxdvb_satconf_ele_class_network_set,
-      .list     = linuxdvb_satconf_ele_class_network_enum,
-      .rend     = linuxdvb_satconf_ele_class_network_rend,
-    },
     {
       .type     = PT_STR,
       .id       = "lnb_type",