From 04bc7b609f7ef88a9c263a47a8299b4b760a0b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Tue, 26 Aug 2008 17:04:09 +0000 Subject: [PATCH] Add support for switching automatic DVB multiplex discovery on/off. Fixes issue #17 --- dvb/dvb.h | 2 ++ dvb/dvb_adapter.c | 60 +++++++++++++++++++++++++++++++++-------------- dvb/dvb_tables.c | 6 +++++ tvhead.h | 2 +- webui/extjs.c | 7 +++++- 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/dvb/dvb.h b/dvb/dvb.h index dfb22da1..6f42c393 100644 --- a/dvb/dvb.h +++ b/dvb/dvb.h @@ -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); diff --git a/dvb/dvb_adapter.c b/dvb/dvb_adapter.c index b4f11338..d418c3f4 100644 --- a/dvb/dvb_adapter.c +++ b/dvb/dvb_adapter.c @@ -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); - } diff --git a/dvb/dvb_tables.c b/dvb/dvb_tables.c index f0efafb0..951bc5c5 100644 --- a/dvb/dvb_tables.c +++ b/dvb/dvb_tables.c @@ -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; diff --git a/tvhead.h b/tvhead.h index f1fe7e4f..51310f60 100644 --- a/tvhead.h +++ b/tvhead.h @@ -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; diff --git a/webui/extjs.c b/webui/extjs.c index a86ccb30..a250e0fc 100644 --- a/webui/extjs.c +++ b/webui/extjs.c @@ -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")) {