From 5f41fde7b63e88f997d9e767c3e1cad7191bdaff Mon Sep 17 00:00:00 2001 From: BtbN Date: Sun, 6 Jan 2013 21:52:28 +0100 Subject: [PATCH 1/3] Add variable frontend/demux to tda_add --- src/dvb/dvb_adapter.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index 75681b5e..7e85382a 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -445,7 +445,7 @@ check_full_stream(th_dvb_adapter_t *tda) * */ static void -tda_add(int adapter_num) +tda_add(int adapter_num, int frontend_num, int demux_num) { char path[200], fname[256]; int fe, i, r; @@ -453,7 +453,7 @@ tda_add(int adapter_num) char buf[400]; snprintf(path, sizeof(path), "/dev/dvb/adapter%d", adapter_num); - snprintf(fname, sizeof(fname), "%s/frontend0", path); + snprintf(fname, sizeof(fname), "%s/frontend%d", path, frontend_num); fe = tvh_open(fname, O_RDWR | O_NONBLOCK, 0); if(fe == -1) { @@ -468,7 +468,7 @@ tda_add(int adapter_num) tda->tda_adapter_num = adapter_num; tda->tda_rootpath = strdup(path); tda->tda_demux_path = malloc(256); - snprintf(tda->tda_demux_path, 256, "%s/demux0", path); + snprintf(tda->tda_demux_path, 256, "%s/demux%d", path, demux_num); tda->tda_fe_path = strdup(fname); tda->tda_fe_fd = -1; tda->tda_dvr_pipe.rd = -1; @@ -651,7 +651,7 @@ dvb_adapter_init(uint32_t adapter_mask, const char *rawfile) /* Initialise hardware */ for(i = 0; i < 32; i++) if ((1 << i) & adapter_mask) - tda_add(i); + tda_add(i, 0, 0); /* Initialise rawts test file */ if(rawfile) From d19b9b85a1fb0e55d0a4bde2cc909b4c5663517d Mon Sep 17 00:00:00 2001 From: BtbN Date: Sun, 6 Jan 2013 22:28:00 +0100 Subject: [PATCH 2/3] Add new tda_enabled flag and close frontend after getting information so other frontends can be proped --- src/dvb/dvb.h | 4 ++++ src/dvb/dvb_adapter.c | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 80d8c666..5f6cfbb7 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -200,6 +200,8 @@ typedef struct th_dvb_adapter { int tda_table_epollfd; + uint32_t tda_enabled; + const char *tda_rootpath; char *tda_identifier; uint32_t tda_autodiscovery; @@ -342,6 +344,8 @@ void dvb_adapter_stop (th_dvb_adapter_t *tda); void dvb_adapter_set_displayname(th_dvb_adapter_t *tda, const char *s); +void dvb_adapter_set_enabled(th_dvb_adapter_t *tda, uint32_t enabled); + void dvb_adapter_set_auto_discovery(th_dvb_adapter_t *tda, int on); void dvb_adapter_set_skip_initialscan(th_dvb_adapter_t *tda, int on); diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index 7e85382a..3d727f12 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -80,6 +80,7 @@ tda_save(th_dvb_adapter_t *tda) lock_assert(&global_lock); + htsmsg_add_u32(m, "enabled", tda->tda_enabled); 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); @@ -124,6 +125,25 @@ dvb_adapter_set_displayname(th_dvb_adapter_t *tda, const char *s) } +/** + * + */ +void +dvb_adapter_set_enabled(th_dvb_adapter_t *tda, uint32_t enabled) +{ + if(tda->tda_enabled == enabled) + return; + + lock_assert(&global_lock); + + tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" enabled set to \"%s\"", + tda->tda_displayname, enabled ? "Enabled" : "Disabled"); + + tda->tda_enabled = enabled; + tda_save(tda); +} + + /** * */ @@ -473,6 +493,7 @@ tda_add(int adapter_num, int frontend_num, int demux_num) tda->tda_fe_fd = -1; tda->tda_dvr_pipe.rd = -1; tda->tda_full_mux_rx = -1; + tda->tda_enabled = 0; tda->tda_fe_info = malloc(sizeof(struct dvb_frontend_info)); @@ -482,7 +503,9 @@ tda_add(int adapter_num, int frontend_num, int demux_num) free(tda); return; } - tda->tda_fe_fd = fe; + + close(fe); + fe = -1; tda->tda_type = tda->tda_fe_info->type; @@ -540,6 +563,8 @@ tda_add_from_file(const char *filename) tda->tda_fe_fd = -1; tda->tda_dvr_pipe.rd = -1; + tda->tda_enabled = 1; + tda->tda_type = -1; snprintf(buf, sizeof(buf), "%s", filename); @@ -588,6 +613,11 @@ static void tda_init_input (th_dvb_adapter_t *tda) void dvb_adapter_start ( th_dvb_adapter_t *tda ) { + if(tda->tda_enabled == 0) { + tvhlog(LOG_INFO, "dvb", "Adapter \"%s\" cannot be started - it's disabled", tda->tda_displayname); + return; + } + /* Open front end */ if (tda->tda_fe_fd == -1) { tda->tda_fe_fd = tvh_open(tda->tda_fe_path, O_RDWR | O_NONBLOCK, 0); @@ -642,7 +672,7 @@ dvb_adapter_init(uint32_t adapter_mask, const char *rawfile) htsmsg_t *l, *c; htsmsg_field_t *f; const char *name, *s; - int i, type; + int i, j, type; uint32_t u32; th_dvb_adapter_t *tda; @@ -651,7 +681,8 @@ dvb_adapter_init(uint32_t adapter_mask, const char *rawfile) /* Initialise hardware */ for(i = 0; i < 32; i++) if ((1 << i) & adapter_mask) - tda_add(i, 0, 0); + for(j = 0; j < 32; j++) + tda_add(i, j, 0); /* Initialise rawts test file */ if(rawfile) @@ -675,6 +706,7 @@ dvb_adapter_init(uint32_t adapter_mask, const char *rawfile) tda = tda_alloc(); tda->tda_identifier = strdup(f->hmf_name); tda->tda_type = type; + tda->tda_enabled = 0; TAILQ_INSERT_TAIL(&dvb_adapters, tda, tda_global_link); } else { if(type != tda->tda_type) @@ -684,6 +716,7 @@ dvb_adapter_init(uint32_t adapter_mask, const char *rawfile) free(tda->tda_displayname); tda->tda_displayname = strdup(name); + htsmsg_get_u32(c, "enabled", &tda->tda_enabled); htsmsg_get_u32(c, "autodiscovery", &tda->tda_autodiscovery); htsmsg_get_u32(c, "idlescan", &tda->tda_idlescan); htsmsg_get_u32(c, "idleclose", &tda->tda_idleclose); From 77b3057f76584212a9aebb09c0cdc0e002fc2c59 Mon Sep 17 00:00:00 2001 From: BtbN Date: Sun, 6 Jan 2013 23:01:22 +0100 Subject: [PATCH 3/3] Add new dvb adapter enabled setting to extjs --- src/webui/extjs_dvb.c | 4 ++++ src/webui/static/app/dvb.js | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/webui/extjs_dvb.c b/src/webui/extjs_dvb.c index d1ce5b15..0919e5ac 100644 --- a/src/webui/extjs_dvb.c +++ b/src/webui/extjs_dvb.c @@ -145,6 +145,7 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque) if(!strcmp(op, "load")) { r = htsmsg_create_map(); htsmsg_add_str(r, "id", tda->tda_identifier); + htsmsg_add_u32(r, "enabled", tda->tda_enabled); htsmsg_add_str(r, "device", tda->tda_rootpath ?: "No hardware attached"); htsmsg_add_str(r, "name", tda->tda_displayname); htsmsg_add_u32(r, "automux", tda->tda_autodiscovery); @@ -173,6 +174,9 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque) if((s = http_arg_get(&hc->hc_req_args, "name")) != NULL) dvb_adapter_set_displayname(tda, s); + s = http_arg_get(&hc->hc_req_args, "enabled"); + dvb_adapter_set_enabled(tda, !!s); + s = http_arg_get(&hc->hc_req_args, "automux"); dvb_adapter_set_auto_discovery(tda, !!s); diff --git a/src/webui/static/app/dvb.js b/src/webui/static/app/dvb.js index c3a3f314..a3808527 100644 --- a/src/webui/static/app/dvb.js +++ b/src/webui/static/app/dvb.js @@ -1095,7 +1095,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { var confreader = new Ext.data.JsonReader({ root : 'dvbadapters' - }, [ 'name', 'automux', 'skip_initialscan', 'idlescan', 'diseqcversion', + }, [ 'name', 'enabled', 'automux', 'skip_initialscan', 'idlescan', 'diseqcversion', 'diseqcrepeats', 'qmon', 'skip_checksubscr', 'poweroff', 'sidtochan', 'nitoid', 'extrapriority', ,'disable_pmt_monitor', 'full_mux_rx', 'idleclose' ]); @@ -1116,6 +1116,10 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { name : 'name', width : 250 }, + new Ext.form.Checkbox({ + fieldLabel : 'Enabled', + name : 'enabled' + }), new Ext.form.Checkbox({ fieldLabel : 'Autodetect muxes', name : 'automux'