Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
linuxdvb: started updating to the new hardware API
I actually had this basically working, but then barrelled on with changing
satconf further, without committing anything (got back into old SVN bad habits)
so what's here is a bit of a half finsihed mess
  • Loading branch information
adamsutton committed Oct 27, 2013
1 parent a1592da commit 61a96da
Show file tree
Hide file tree
Showing 6 changed files with 416 additions and 282 deletions.
93 changes: 36 additions & 57 deletions src/input/mpegts/linuxdvb/linuxdvb_adapter.c
Expand Up @@ -41,15 +41,34 @@ static void
linuxdvb_adapter_class_save ( idnode_t *in )
{
linuxdvb_adapter_t *la = (linuxdvb_adapter_t*)in;
linuxdvb_device_save((linuxdvb_device_t*)la->lh_parent);
linuxdvb_device_save(la->la_device);
}

static idnode_set_t *
linuxdvb_adapter_class_get_childs ( idnode_t *in )
{
linuxdvb_frontend_t *lfe;
linuxdvb_adapter_t *la = (linuxdvb_adapter_t*)in;
idnode_set_t *is = idnode_set_create();
LIST_FOREACH(lfe, &la->la_frontends, lfe_link)
idnode_set_add(is, &lfe->ti_id, NULL);
return is;
}

static const char *
linuxdvb_adapter_class_get_title ( idnode_t *in )
{
linuxdvb_adapter_t *la = (linuxdvb_adapter_t*)in;
return la->la_name ?: la->la_rootpath;
}

const idclass_t linuxdvb_adapter_class =
{
.ic_super = &linuxdvb_hardware_class,
.ic_class = "linuxdvb_adapter",
.ic_caption = "LinuxDVB Adapter",
.ic_save = linuxdvb_adapter_class_save,
.ic_get_childs = linuxdvb_adapter_class_get_childs,
.ic_get_title = linuxdvb_adapter_class_get_title,
.ic_properties = (const property_t[]){
{
.type = PT_STR,
Expand All @@ -69,57 +88,21 @@ void
linuxdvb_adapter_save ( linuxdvb_adapter_t *la, htsmsg_t *m )
{
htsmsg_t *l;
linuxdvb_hardware_t *lh;
linuxdvb_frontend_t *lfe;

idnode_save(&la->ti_id, m);
idnode_save(&la->la_id, m);
htsmsg_add_u32(m, "number", la->la_number);

/* Frontends */
l = htsmsg_create_map();
LIST_FOREACH(lh, &la->lh_children, lh_parent_link) {
LIST_FOREACH(lfe, &la->la_frontends, lfe_link) {
htsmsg_t *e = htsmsg_create_map();
linuxdvb_frontend_save((linuxdvb_frontend_t*)lh, e);
htsmsg_add_msg(l, idnode_uuid_as_str(&lh->ti_id), e);
linuxdvb_frontend_save(lfe, e);
htsmsg_add_msg(l, idnode_uuid_as_str(&lfe->ti_id), e);
}
htsmsg_add_msg(m, "frontends", l);
}

/*
* Check is free
*/
int
linuxdvb_adapter_is_free ( linuxdvb_adapter_t *la )
{
return 0;
}

/*
* Get current weight
*/
int
linuxdvb_adapter_current_weight ( linuxdvb_adapter_t *la )
{
return 0;
}

/*
* Enabled
*/
static int
linuxdvb_adapter_is_enabled ( mpegts_input_t *mi )
{
linuxdvb_adapter_t *la = (linuxdvb_adapter_t*)mi;
linuxdvb_hardware_t *lh;

if (la->la_dvb_number == -1)
return 0;

LIST_FOREACH(lh, &la->lh_children, lh_parent_link)
if (lh->mi_is_enabled && lh->mi_is_enabled((mpegts_input_t*)lh))
return 1;
return 0;
}

/*
* Create
*/
Expand All @@ -133,22 +116,20 @@ linuxdvb_adapter_create0
linuxdvb_adapter_t *la;

la = calloc(1, sizeof(linuxdvb_adapter_t));
if (idnode_insert(&la->ti_id, uuid, &linuxdvb_adapter_class)) {
if (idnode_insert(&la->la_id, uuid, &linuxdvb_adapter_class)) {
free(la);
return NULL;
}

LIST_INSERT_HEAD(&ld->lh_children, (linuxdvb_hardware_t*)la, lh_parent_link);
la->lh_parent = (linuxdvb_hardware_t*)ld;
la->mi_is_enabled = linuxdvb_adapter_is_enabled;
la->mi_enabled = 1;
LIST_INSERT_HEAD(&ld->ld_adapters, la, la_link);
la->la_device = ld;
la->la_dvb_number = -1;

/* No conf */
if (!conf)
return la;

idnode_load(&la->ti_id, conf);
idnode_load(&la->la_id, conf);
if (!htsmsg_get_u32(conf, "number", &u32))
la->la_number = u32;

Expand All @@ -171,7 +152,6 @@ linuxdvb_adapter_find_by_number ( int adapter )
{
int a;
char buf[1024];
linuxdvb_hardware_t *lh;
linuxdvb_device_t *ld;
linuxdvb_adapter_t *la;

Expand All @@ -181,11 +161,10 @@ linuxdvb_adapter_find_by_number ( int adapter )

/* Find existing adapter */
a = adapter - ld->ld_devid.di_min_adapter;
LIST_FOREACH(lh, &ld->lh_children, lh_parent_link) {
if (((linuxdvb_adapter_t*)lh)->la_number == a)
LIST_FOREACH(la, &ld->ld_adapters, la_link) {
if (la->la_number == a)
break;
}
la = (linuxdvb_adapter_t*)lh;

/* Create */
if (!la) {
Expand Down Expand Up @@ -252,10 +231,10 @@ linuxdvb_adapter_added ( int adapter )
return NULL;
}
la->la_dvb_number = adapter;
if (!la->mi_displayname) {
char buf[256];
if (!la->la_name) {
char buf[512];
snprintf(buf, sizeof(buf), "%s #%d", dfi.name, la->la_number);
la->mi_displayname = strdup(buf);
la->la_name = strdup(buf);
}
}

Expand All @@ -266,7 +245,7 @@ linuxdvb_adapter_added ( int adapter )
}

if (la)
linuxdvb_device_save((linuxdvb_device_t*)la->lh_parent);
linuxdvb_device_save(la->la_device);

return la;
}
89 changes: 50 additions & 39 deletions src/input/mpegts/linuxdvb/linuxdvb_device.c
Expand Up @@ -31,7 +31,7 @@
#include <fcntl.h>

/* ***************************************************************************
* DVB Device
* Device/BUS Info
* **************************************************************************/

/*
Expand Down Expand Up @@ -167,42 +167,40 @@ get_min_dvb_adapter ( device_info_t *di )
di->di_min_adapter = mina;
}

/* ***************************************************************************
* Class
* **************************************************************************/

static void
linuxdvb_device_class_save ( idnode_t *in )
{
linuxdvb_device_save((linuxdvb_device_t*)in);
}
void linuxdvb_device_save ( linuxdvb_device_t *ld )
{
htsmsg_t *m, *e, *l;
linuxdvb_hardware_t *lh;

m = htsmsg_create_map();

idnode_save(&ld->ti_id, m);

/* Adapters */
l = htsmsg_create_map();
LIST_FOREACH(lh, &ld->lh_children, lh_parent_link) {
e = htsmsg_create_map();
linuxdvb_adapter_save((linuxdvb_adapter_t*)lh, e);
htsmsg_add_msg(l, idnode_uuid_as_str(&lh->ti_id), e);
}
htsmsg_add_msg(m, "adapters", l);
static const char *
linuxdvb_device_class_get_title ( idnode_t *in )
{
return ((linuxdvb_device_t*)in)->ld_devid.di_id;
}

/* Save */
hts_settings_save(m, "input/linuxdvb/devices/%s",
idnode_uuid_as_str(&ld->ti_id));
htsmsg_destroy(m);
static idnode_set_t *
linuxdvb_device_class_get_childs ( idnode_t *in )
{
linuxdvb_adapter_t *la;
linuxdvb_device_t *ld = (linuxdvb_device_t*)in;
idnode_set_t *is = idnode_set_create();
LIST_FOREACH(la, &ld->ld_adapters, la_link)
idnode_set_add(is, &la->la_id, NULL);
return is;
}

const idclass_t linuxdvb_device_class =
{
.ic_super = &linuxdvb_hardware_class,
.ic_class = "linuxdvb_device",
.ic_caption = "LinuxDVB Device",
.ic_save = linuxdvb_device_class_save,
.ic_get_childs = linuxdvb_device_class_get_childs,
.ic_get_title = linuxdvb_device_class_get_title,
.ic_properties = (const property_t[]){
{
.type = PT_STR,
Expand All @@ -215,14 +213,31 @@ const idclass_t linuxdvb_device_class =
}
};

static linuxdvb_hardware_list_t linuxdvb_device_all;

idnode_set_t *
linuxdvb_root ( void )
void linuxdvb_device_save ( linuxdvb_device_t *ld )
{
return linuxdvb_hardware_enumerate(&linuxdvb_device_all);
htsmsg_t *m, *e, *l;
linuxdvb_adapter_t *la;

m = htsmsg_create_map();

idnode_save(&ld->th_id, m);

/* Adapters */
l = htsmsg_create_map();
LIST_FOREACH(la, &ld->ld_adapters, la_link) {
e = htsmsg_create_map();
linuxdvb_adapter_save(la, e);
htsmsg_add_msg(l, idnode_uuid_as_str(&la->la_id), e);
}
htsmsg_add_msg(m, "adapters", l);

/* Save */
hts_settings_save(m, "input/linuxdvb/devices/%s",
idnode_uuid_as_str(&ld->th_id));
htsmsg_destroy(m);
}


linuxdvb_device_t *
linuxdvb_device_create0 ( const char *uuid, htsmsg_t *conf )
{
Expand All @@ -232,21 +247,18 @@ linuxdvb_device_create0 ( const char *uuid, htsmsg_t *conf )

/* Create */
ld = calloc(1, sizeof(linuxdvb_device_t));
if (idnode_insert(&ld->ti_id, uuid, &linuxdvb_device_class)) {
if (idnode_insert(&ld->th_id, uuid, &linuxdvb_device_class)) {
free(ld);
return NULL;
}
LIST_INSERT_HEAD(&linuxdvb_device_all, (linuxdvb_hardware_t*)ld, lh_parent_link);

/* Defaults */
ld->mi_enabled = 1;
LIST_INSERT_HEAD(&tvh_hardware, (tvh_hardware_t*)ld, th_link);

/* No config */
if (!conf)
return ld;

/* Load config */
idnode_load(&ld->ti_id, conf);
idnode_load(&ld->th_id, conf);
get_min_dvb_adapter(&ld->ld_devid);

/* Adapters */
Expand All @@ -263,11 +275,11 @@ linuxdvb_device_create0 ( const char *uuid, htsmsg_t *conf )
static linuxdvb_device_t *
linuxdvb_device_find_by_hwid ( const char *hwid )
{
linuxdvb_hardware_t *lh;
LIST_FOREACH(lh, &linuxdvb_device_all, lh_parent_link) {

if (!strcmp(hwid, ((linuxdvb_device_t*)lh)->ld_devid.di_id ?: ""))
return (linuxdvb_device_t*)lh;
tvh_hardware_t *lh;
LIST_FOREACH(lh, &tvh_hardware, th_link) {
if (idnode_is_instance(&lh->th_id, &linuxdvb_device_class))
if (!strcmp(hwid, ((linuxdvb_device_t*)lh)->ld_devid.di_id ?: ""))
return (linuxdvb_device_t*)lh;
}
return NULL;
}
Expand Down Expand Up @@ -302,7 +314,6 @@ linuxdvb_device_find_by_adapter ( int a )

/* Copy device info */
memcpy(&ld->ld_devid, &dev, sizeof(dev));
ld->mi_displayname = strdup(dev.di_id);
ld->ld_devid.di_id = dev.di_id;
return ld;
}
Expand Down

0 comments on commit 61a96da

Please sign in to comment.