From d19b9b85a1fb0e55d0a4bde2cc909b4c5663517d Mon Sep 17 00:00:00 2001 From: BtbN Date: Sun, 6 Jan 2013 22:28:00 +0100 Subject: [PATCH] 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);