From: Adam Sutton Date: Mon, 17 Mar 2014 23:44:25 +0000 (+0000) Subject: linuxdvb: update to new multiple networks setup X-Git-Tag: v4.1~2215 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4d5d259cbb047ab537636751eb885131f7044859;p=thirdparty%2Ftvheadend.git linuxdvb: update to new multiple networks setup --- diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 48c6e6bfb..d9b9ca878 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -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; diff --git a/src/input/mpegts/linuxdvb/linuxdvb_mux.c b/src/input/mpegts/linuxdvb/linuxdvb_mux.c index 803c9803a..501a2a50d 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_mux.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_mux.c @@ -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); } diff --git a/src/input/mpegts/linuxdvb/linuxdvb_satconf.c b/src/input/mpegts/linuxdvb/linuxdvb_satconf.c index 0e66b4d52..d406fdfef 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_satconf.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_satconf.c @@ -29,18 +29,6 @@ #include #include -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",