Updated the mux scanner to better handle cases where we no longer need to be tuned to a mux. Also general simplification with signal monitoring no longer directly influencing mux scanner code. Incidentally fixes #1147 and relates #892.
This commit is contained in:
parent
d47634a921
commit
fab1f902bb
5 changed files with 42 additions and 54 deletions
|
@ -175,7 +175,7 @@ typedef struct th_dvb_adapter {
|
|||
uint32_t tda_autodiscovery;
|
||||
uint32_t tda_idlescan;
|
||||
uint32_t tda_qmon;
|
||||
uint32_t tda_off;
|
||||
uint32_t tda_poweroff;
|
||||
uint32_t tda_nitoid;
|
||||
uint32_t tda_diseqc_version;
|
||||
char *tda_displayname;
|
||||
|
@ -289,7 +289,7 @@ void dvb_adapter_set_qmon(th_dvb_adapter_t *tda, int on);
|
|||
|
||||
void dvb_adapter_set_dump_muxes(th_dvb_adapter_t *tda, int on);
|
||||
|
||||
void dvb_adapter_set_off(th_dvb_adapter_t *tda, int on);
|
||||
void dvb_adapter_set_poweroff(th_dvb_adapter_t *tda, int on);
|
||||
|
||||
void dvb_adapter_set_nitoid(th_dvb_adapter_t *tda, int nitoid);
|
||||
|
||||
|
@ -309,6 +309,8 @@ htsmsg_t *dvb_fe_opts(th_dvb_adapter_t *tda, const char *which);
|
|||
|
||||
void dvb_adapter_set_extrapriority(th_dvb_adapter_t *tda, int extrapriority);
|
||||
|
||||
void dvb_adapter_poweroff(th_dvb_adapter_t *tda);
|
||||
|
||||
/**
|
||||
* DVB Multiplex
|
||||
*/
|
||||
|
@ -392,8 +394,6 @@ int dvb_fe_tune(th_dvb_mux_instance_t *tdmi, const char *reason);
|
|||
|
||||
void dvb_fe_stop(th_dvb_mux_instance_t *tdmi);
|
||||
|
||||
void dvb_fe_turn_off(th_dvb_adapter_t *tda);
|
||||
|
||||
|
||||
/**
|
||||
* DVB Tables
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include "notify.h"
|
||||
#include "service.h"
|
||||
#include "epggrab.h"
|
||||
#include "diseqc.h"
|
||||
|
||||
struct th_dvb_adapter_queue dvb_adapters;
|
||||
struct th_dvb_mux_instance_tree dvb_muxes;
|
||||
|
@ -86,7 +87,7 @@ tda_save(th_dvb_adapter_t *tda)
|
|||
htsmsg_add_u32(m, "idlescan", tda->tda_idlescan);
|
||||
htsmsg_add_u32(m, "qmon", tda->tda_qmon);
|
||||
htsmsg_add_u32(m, "dump_muxes", tda->tda_dump_muxes);
|
||||
htsmsg_add_u32(m, "off", tda->tda_off);
|
||||
htsmsg_add_u32(m, "poweroff", tda->tda_poweroff);
|
||||
htsmsg_add_u32(m, "nitoid", tda->tda_nitoid);
|
||||
htsmsg_add_u32(m, "diseqc_version", tda->tda_diseqc_version);
|
||||
htsmsg_add_u32(m, "extrapriority", tda->tda_extrapriority);
|
||||
|
@ -199,17 +200,17 @@ dvb_adapter_set_qmon(th_dvb_adapter_t *tda, int on)
|
|||
*
|
||||
*/
|
||||
void
|
||||
dvb_adapter_set_off(th_dvb_adapter_t *tda, int on)
|
||||
dvb_adapter_set_poweroff(th_dvb_adapter_t *tda, int on)
|
||||
{
|
||||
if(tda->tda_off == on)
|
||||
if(tda->tda_poweroff == on)
|
||||
return;
|
||||
|
||||
lock_assert(&global_lock);
|
||||
|
||||
tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" idle off set to: %s",
|
||||
tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" idle poweroff set to: %s",
|
||||
tda->tda_displayname, on ? "On" : "Off");
|
||||
|
||||
tda->tda_off = on;
|
||||
tda->tda_poweroff = on;
|
||||
tda_save(tda);
|
||||
}
|
||||
|
||||
|
@ -441,7 +442,7 @@ dvb_adapter_init(uint32_t adapter_mask)
|
|||
htsmsg_get_u32(c, "idlescan", &tda->tda_idlescan);
|
||||
htsmsg_get_u32(c, "qmon", &tda->tda_qmon);
|
||||
htsmsg_get_u32(c, "dump_muxes", &tda->tda_dump_muxes);
|
||||
htsmsg_get_u32(c, "off", &tda->tda_off);
|
||||
htsmsg_get_u32(c, "poweroff", &tda->tda_poweroff);
|
||||
htsmsg_get_u32(c, "nitoid", &tda->tda_nitoid);
|
||||
htsmsg_get_u32(c, "diseqc_version", &tda->tda_diseqc_version);
|
||||
htsmsg_get_u32(c, "extrapriority", &tda->tda_extrapriority);
|
||||
|
@ -465,7 +466,6 @@ dvb_adapter_mux_scanner(void *aux)
|
|||
th_dvb_adapter_t *tda = aux;
|
||||
th_dvb_mux_instance_t *tdmi;
|
||||
int i;
|
||||
int idle_epg;
|
||||
|
||||
if(tda->tda_rootpath == NULL)
|
||||
return; // No hardware
|
||||
|
@ -473,11 +473,15 @@ dvb_adapter_mux_scanner(void *aux)
|
|||
// default period
|
||||
gtimer_arm(&tda->tda_mux_scanner_timer, dvb_adapter_mux_scanner, tda, 20);
|
||||
|
||||
if(LIST_FIRST(&tda->tda_muxes) == NULL)
|
||||
goto off; // No muxes configured
|
||||
/* No muxes */
|
||||
if(LIST_FIRST(&tda->tda_muxes) == NULL) {
|
||||
dvb_adapter_poweroff(tda);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Someone is actively using */
|
||||
if(service_compute_weight(&tda->tda_transports) > 0)
|
||||
return; /* someone is here */
|
||||
return;
|
||||
|
||||
/* Check if we have muxes pending for quickscan, if so, choose them */
|
||||
if((tdmi = TAILQ_FIRST(&tda->tda_initial_scan_queue)) != NULL) {
|
||||
|
@ -493,22 +497,6 @@ dvb_adapter_mux_scanner(void *aux)
|
|||
tda->tda_mux_epg = epggrab_mux_next(tda);
|
||||
}
|
||||
|
||||
/* Idle or EPG scan enabled */
|
||||
idle_epg = tda->tda_idlescan || tda->tda_mux_epg;
|
||||
|
||||
/* Idlescan is disabled and no muxes are bad */
|
||||
if(!idle_epg && TAILQ_FIRST(&tda->tda_scan_queues[TDA_SCANQ_BAD]) == NULL) {
|
||||
|
||||
if(!tda->tda_qmon)
|
||||
goto off; // Quality monitoring is disabled
|
||||
|
||||
/* If the currently tuned mux is ok, we can stick to it */
|
||||
|
||||
tdmi = tda->tda_mux_current;
|
||||
if(tdmi != NULL && tdmi->tdmi_quality > 90)
|
||||
goto off;
|
||||
}
|
||||
|
||||
/* EPG */
|
||||
if (tda->tda_mux_epg) {
|
||||
int period = epggrab_mux_period(tda->tda_mux_epg);
|
||||
|
@ -516,9 +504,10 @@ dvb_adapter_mux_scanner(void *aux)
|
|||
gtimer_arm(&tda->tda_mux_scanner_timer,
|
||||
dvb_adapter_mux_scanner, tda, period);
|
||||
dvb_fe_tune(tda->tda_mux_epg, "EPG scan");
|
||||
return;
|
||||
|
||||
/* Normal */
|
||||
} else {
|
||||
} else if (tda->tda_idlescan) {
|
||||
|
||||
/* Alternate queue */
|
||||
for(i = 0; i < TDA_SCANQ_NUM; i++) {
|
||||
|
@ -533,9 +522,10 @@ dvb_adapter_mux_scanner(void *aux)
|
|||
}
|
||||
}
|
||||
|
||||
off:
|
||||
/* turn off the LNB voltage */
|
||||
dvb_fe_turn_off(tda);
|
||||
/* Ensure we stop current mux and power off (if required) */
|
||||
if (tda->tda_mux_current)
|
||||
dvb_fe_stop(tda->tda_mux_current);
|
||||
dvb_adapter_poweroff(tda);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -848,3 +838,16 @@ dvb_fe_opts(th_dvb_adapter_t *tda, const char *which)
|
|||
htsmsg_destroy(a);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn off the adapter
|
||||
*/
|
||||
void
|
||||
dvb_adapter_poweroff(th_dvb_adapter_t *tda)
|
||||
{
|
||||
lock_assert(&global_lock);
|
||||
if (!tda->tda_poweroff || tda->tda_type != FE_QPSK)
|
||||
return;
|
||||
diseqc_voltage_off(tda->tda_fe_fd);
|
||||
tvhlog(LOG_DEBUG, "dvb", "\"%s\" is off", tda->tda_rootpath);
|
||||
}
|
||||
|
|
|
@ -526,18 +526,3 @@ dvb_fe_tune(th_dvb_mux_instance_t *tdmi, const char *reason)
|
|||
dvb_adapter_notify(tda);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void dvb_fe_turn_off(th_dvb_adapter_t *tda)
|
||||
{
|
||||
lock_assert(&global_lock);
|
||||
if (!tda->tda_off)
|
||||
return;
|
||||
if (tda->tda_mux_current)
|
||||
dvb_fe_stop(tda->tda_mux_current);
|
||||
if (tda->tda_type == FE_QPSK)
|
||||
diseqc_voltage_off(tda->tda_fe_fd);
|
||||
tvhlog(LOG_DEBUG, "dvb", "\"%s\" is off", tda->tda_rootpath);
|
||||
}
|
||||
|
|
|
@ -152,7 +152,7 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
|
|||
htsmsg_add_u32(r, "idlescan", tda->tda_idlescan);
|
||||
htsmsg_add_u32(r, "qmon", tda->tda_qmon);
|
||||
htsmsg_add_u32(r, "dumpmux", tda->tda_dump_muxes);
|
||||
htsmsg_add_u32(r, "off", tda->tda_off);
|
||||
htsmsg_add_u32(r, "poweroff", tda->tda_poweroff);
|
||||
htsmsg_add_u32(r, "nitoid", tda->tda_nitoid);
|
||||
htsmsg_add_str(r, "diseqcversion",
|
||||
((const char *[]){"DiSEqC 1.0 / 2.0",
|
||||
|
@ -178,8 +178,8 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
|
|||
s = http_arg_get(&hc->hc_req_args, "qmon");
|
||||
dvb_adapter_set_qmon(tda, !!s);
|
||||
|
||||
s = http_arg_get(&hc->hc_req_args, "off");
|
||||
dvb_adapter_set_off(tda, !!s);
|
||||
s = http_arg_get(&hc->hc_req_args, "poweroff");
|
||||
dvb_adapter_set_poweroff(tda, !!s);
|
||||
|
||||
s = http_arg_get(&hc->hc_req_args, "dumpmux");
|
||||
dvb_adapter_set_dump_muxes(tda, !!s);
|
||||
|
|
|
@ -1106,7 +1106,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
|
|||
var confreader = new Ext.data.JsonReader({
|
||||
root: 'dvbadapters'
|
||||
}, ['name', 'automux', 'skip_initialscan', 'idlescan', 'diseqcversion', 'qmon',
|
||||
'dumpmux', 'off', 'nitoid','extrapriority']);
|
||||
'dumpmux', 'poweroff', 'nitoid','extrapriority']);
|
||||
|
||||
|
||||
function saveConfForm () {
|
||||
|
@ -1152,7 +1152,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
|
|||
}),
|
||||
new Ext.form.Checkbox({
|
||||
fieldLabel: 'Turn off adapter when idle',
|
||||
name: 'off'
|
||||
name: 'poweroff'
|
||||
}),
|
||||
{
|
||||
fieldLabel: 'NIT-o Network ID',
|
||||
|
|
Loading…
Add table
Reference in a new issue