Add support for switching automatic DVB multiplex discovery on/off.

Fixes issue #17
This commit is contained in:
Andreas Öman 2008-08-26 17:04:09 +00:00
parent 8066398c0b
commit 04bc7b609f
5 changed files with 58 additions and 19 deletions

View file

@ -44,6 +44,8 @@ void dvb_adapter_notify_reload(th_dvb_adapter_t *tda);
void dvb_adapter_set_displayname(th_dvb_adapter_t *tda, const char *s);
void dvb_adapter_set_auto_discovery(th_dvb_adapter_t *tda, int on);
void dvb_adapter_clone(th_dvb_adapter_t *dst, th_dvb_adapter_t *src);
int dvb_adapter_destroy(th_dvb_adapter_t *tda);

View file

@ -78,6 +78,7 @@ tda_save(th_dvb_adapter_t *tda)
htsmsg_add_str(m, "type", dvb_adaptertype_to_str(tda->tda_type));
htsmsg_add_str(m, "displayname", tda->tda_displayname);
htsmsg_add_u32(m, "autodiscovery", tda->tda_autodiscovery);
hts_settings_save(m, "dvbadapters/%s", tda->tda_identifier);
htsmsg_destroy(m);
}
@ -89,7 +90,15 @@ tda_save(th_dvb_adapter_t *tda)
void
dvb_adapter_set_displayname(th_dvb_adapter_t *tda, const char *s)
{
htsmsg_t *m = htsmsg_create();
htsmsg_t *m;
if(!strcmp(s, tda->tda_displayname))
return;
tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" renamed to \"%s\"",
tda->tda_displayname, s);
m = htsmsg_create();
htsmsg_add_str(m, "id", tda->tda_identifier);
free(tda->tda_displayname);
@ -103,6 +112,23 @@ dvb_adapter_set_displayname(th_dvb_adapter_t *tda, const char *s)
}
/**
*
*/
void
dvb_adapter_set_auto_discovery(th_dvb_adapter_t *tda, int on)
{
if(tda->tda_autodiscovery == on)
return;
tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" mux autodiscovery set to %s",
tda->tda_displayname, on ? "On" : "Off");
tda->tda_autodiscovery = on;
tda_save(tda);
}
/**
*
*/
@ -161,7 +187,8 @@ tda_add(const char *path)
buf[i] = '_';
tda->tda_identifier = strdup(buf);
tda->tda_autodiscovery = tda->tda_type != FE_QPSK;
/* Come up with an initial displayname, user can change it and it will
be overridden by any stored settings later on */
@ -205,33 +232,32 @@ dvb_adapter_init(void)
name = htsmsg_get_str(c, "displayname");
if((tda = dvb_adapter_find_by_identifier(f->hmf_name)) != NULL) {
/* Already loaded */
free(tda->tda_displayname);
tda->tda_displayname = strdup(name);
continue;
}
if((s = htsmsg_get_str(c, "type")) == NULL ||
(type = dvb_str_to_adaptertype(s)) < 0)
continue;
tda = tda_alloc();
tda->tda_identifier = strdup(f->hmf_name);
if((tda = dvb_adapter_find_by_identifier(f->hmf_name)) == NULL) {
/* Not discovered by hardware, create it */
tda = tda_alloc();
tda->tda_identifier = strdup(f->hmf_name);
tda->tda_type = type;
TAILQ_INSERT_TAIL(&dvb_adapters, tda, tda_global_link);
} else {
if(type != tda->tda_type)
continue; /* Something is wrong, ignore */
}
free(tda->tda_displayname);
tda->tda_displayname = strdup(name);
tda->tda_type = type;
TAILQ_INSERT_TAIL(&dvb_adapters, tda, tda_global_link);
htsmsg_get_u32(c, "autodiscovery", &tda->tda_autodiscovery);
}
htsmsg_destroy(l);
}
TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link)
dvb_mux_load(tda);
}

View file

@ -537,6 +537,9 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
int freq, symrate;
struct dvb_frontend_parameters fe_param;
if(!tdmi->tdmi_adapter->tda_autodiscovery)
return;
if(len < 11) {
printf("Invalid CABLE DESCRIPTOR\n");
return;
@ -578,6 +581,9 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
int freq, symrate, pol;
struct dvb_frontend_parameters fe_param;
if(!tdmi->tdmi_adapter->tda_autodiscovery)
return;
if(len < 11)
return;

View file

@ -232,7 +232,7 @@ typedef struct th_dvb_adapter {
const char *tda_rootpath;
char *tda_identifier;
uint32_t tda_autodiscovery;
char *tda_displayname;
pthread_mutex_t tda_lock;

View file

@ -392,7 +392,7 @@ extjs_dvbadapter(http_connection_t *hc, http_reply_t *hr,
htsmsg_add_str(r, "id", tda->tda_identifier);
htsmsg_add_str(r, "device", tda->tda_rootpath ?: "No hardware attached");
htsmsg_add_str(r, "name", tda->tda_displayname);
htsmsg_add_u32(r, "automux", 1);
htsmsg_add_u32(r, "automux", tda->tda_autodiscovery);
out = json_single_record(r, "dvbadapters");
} else if(!strcmp(op, "save")) {
@ -400,6 +400,11 @@ extjs_dvbadapter(http_connection_t *hc, http_reply_t *hr,
if((s = http_arg_get(&hc->hc_req_args, "name")) != NULL)
dvb_adapter_set_displayname(tda, s);
if((s = http_arg_get(&hc->hc_req_args, "automux")) != NULL)
dvb_adapter_set_auto_discovery(tda, 1);
else
dvb_adapter_set_auto_discovery(tda, 0);
out = htsmsg_create();
htsmsg_add_u32(out, "success", 1);
} else if(!strcmp(op, "addnetwork")) {