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,
.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
- },
{}
}
};
.list = linuxdvb_satconf_type_list,
.def.s = "simple"
},
+ {
+ .id = "networks",
+ .type = PT_NONE,
+ },
{}
}
};
.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
- },
{}
}
};
.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
- },
{}
}
};
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;
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;
#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 );
( 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;
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 )\
.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,
},
{}
.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,
},
{}
.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,
},
{}
.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,
},
{
.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,
},
{}
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);
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);
}
}
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 )
{
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;
}
.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",