linuxdvb: update to new multiple networks setup

This commit is contained in:
Adam Sutton 2014-03-17 23:44:25 +00:00
parent 1298adb956
commit 4d5d259cbb
3 changed files with 77 additions and 174 deletions

View 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;

View 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);
}

View file

@ -29,18 +29,6 @@
#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",