linuxdvb: update to new multiple networks setup
This commit is contained in:
parent
1298adb956
commit
4d5d259cbb
3 changed files with 77 additions and 174 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Add table
Reference in a new issue