dvb: Remove the idlescan feature

This commit is contained in:
Andreas Öman 2012-11-16 09:22:24 +01:00
parent 44dd4042a9
commit 607010c3df
8 changed files with 55 additions and 101 deletions

View file

@ -177,23 +177,17 @@ typedef struct dvb_table_feed {
*/
#define TDA_MUX_HASH_WIDTH 101
#define TDA_SCANQ_BAD 0 ///< Bad muxes (monitor quality)
#define TDA_SCANQ_OK 1 ///< OK muxes
#define TDA_SCANQ_NUM 2
typedef struct th_dvb_adapter {
TAILQ_ENTRY(th_dvb_adapter) tda_global_link;
struct th_dvb_mux_instance_list tda_muxes;
struct th_dvb_mux_instance_queue tda_scan_queues[TDA_SCANQ_NUM];
int tda_scan_selector;
struct th_dvb_mux_instance_queue tda_initial_scan_queue;
int tda_initial_num_mux;
th_dvb_mux_instance_t *tda_mux_current;
char *tda_tune_reason; // Reason for last tune
th_dvb_mux_instance_t *tda_mux_epg;
@ -202,7 +196,6 @@ typedef struct th_dvb_adapter {
const char *tda_rootpath;
char *tda_identifier;
uint32_t tda_autodiscovery;
uint32_t tda_idlescan;
uint32_t tda_idleclose;
uint32_t tda_skip_initialscan;
uint32_t tda_skip_checksubscr;
@ -344,8 +337,6 @@ 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);
void dvb_adapter_set_idlescan(th_dvb_adapter_t *tda, int on);
void dvb_adapter_set_skip_checksubscr(th_dvb_adapter_t *tda, int on);
void dvb_adapter_set_qmon(th_dvb_adapter_t *tda, int on);
@ -450,8 +441,6 @@ const char *dvb_mux_add_by_params(th_dvb_adapter_t *tda,
int dvb_mux_copy(th_dvb_adapter_t *dst, th_dvb_mux_instance_t *tdmi_src,
dvb_satconf_t *satconf);
void dvb_mux_add_to_scan_queue (th_dvb_mux_instance_t *tdmi);
th_dvb_mux_instance_t *dvb_mux_find
(th_dvb_adapter_t *tda, const char *netname, uint16_t onid, uint16_t tsid,
int enabled );

View file

@ -56,12 +56,9 @@ static void *dvb_adapter_input_dvr(void *aux);
static th_dvb_adapter_t *
tda_alloc(void)
{
int i;
th_dvb_adapter_t *tda = calloc(1, sizeof(th_dvb_adapter_t));
pthread_mutex_init(&tda->tda_delivery_mutex, NULL);
for (i = 0; i < TDA_SCANQ_NUM; i++ )
TAILQ_INIT(&tda->tda_scan_queues[i]);
TAILQ_INIT(&tda->tda_initial_scan_queue);
TAILQ_INIT(&tda->tda_satconfs);
streaming_pad_init(&tda->tda_streaming_pad);
@ -82,7 +79,6 @@ 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);
htsmsg_add_u32(m, "idlescan", tda->tda_idlescan);
htsmsg_add_u32(m, "idleclose", tda->tda_idleclose);
htsmsg_add_u32(m, "skip_checksubscr", tda->tda_skip_checksubscr);
htsmsg_add_u32(m, "sidtochan", tda->tda_sidtochan);
@ -161,24 +157,6 @@ dvb_adapter_set_skip_initialscan(th_dvb_adapter_t *tda, int on)
}
/**
*
*/
void
dvb_adapter_set_idlescan(th_dvb_adapter_t *tda, int on)
{
if(tda->tda_idlescan == on)
return;
lock_assert(&global_lock);
tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" idle mux scanning set to: %s",
tda->tda_displayname, on ? "On" : "Off");
tda->tda_idlescan = on;
tda_save(tda);
}
/**
*
*/
@ -481,7 +459,7 @@ tda_add(int adapter_num)
free(tda);
return;
}
if (tda->tda_idlescan || !tda->tda_idleclose)
if (!tda->tda_idleclose)
tda->tda_fe_fd = fe;
else
close(fe);
@ -499,7 +477,6 @@ tda_add(int adapter_num)
tda->tda_identifier = strdup(buf);
tda->tda_autodiscovery = tda->tda_type != FE_QPSK;
tda->tda_idlescan = 1;
tda->tda_sat = tda->tda_type == FE_QPSK;
@ -549,7 +526,6 @@ tda_add_from_file(const char *filename)
tda->tda_identifier = strdup(buf);
tda->tda_autodiscovery = 0;
tda->tda_idlescan = 0;
tda->tda_sat = 0;
@ -608,30 +584,33 @@ dvb_adapter_start ( th_dvb_adapter_t *tda )
void
dvb_adapter_stop ( th_dvb_adapter_t *tda )
{
assert(tda->tda_mux_current == NULL);
/* Poweroff */
dvb_adapter_poweroff(tda);
/* Don't stop/close */
if (!tda->tda_idleclose) return;
if(tda->tda_idleclose) {
/* Close front end */
if (tda->tda_fe_fd != -1) {
tvhlog(LOG_DEBUG, "dvb", "%s closing frontend", tda->tda_rootpath);
close(tda->tda_fe_fd);
tda->tda_fe_fd = -1;
}
/* Close front end */
if (tda->tda_fe_fd != -1) {
tvhlog(LOG_DEBUG, "dvb", "%s closing frontend", tda->tda_rootpath);
close(tda->tda_fe_fd);
tda->tda_fe_fd = -1;
}
/* Stop DVR thread */
if (tda->tda_dvr_pipe[0] != -1) {
tvhlog(LOG_DEBUG, "dvb", "%s stopping thread", tda->tda_rootpath);
int err = write(tda->tda_dvr_pipe[1], "", 1);
assert(err != -1);
pthread_join(tda->tda_dvr_thread, NULL);
close(tda->tda_dvr_pipe[0]);
close(tda->tda_dvr_pipe[1]);
tda->tda_dvr_pipe[0] = -1;
tvhlog(LOG_DEBUG, "dvb", "%s stopped thread", tda->tda_rootpath);
/* Stop DVR thread */
if (tda->tda_dvr_pipe[0] != -1) {
tvhlog(LOG_DEBUG, "dvb", "%s stopping thread", tda->tda_rootpath);
int err = write(tda->tda_dvr_pipe[1], "", 1);
assert(err != -1);
pthread_join(tda->tda_dvr_thread, NULL);
close(tda->tda_dvr_pipe[0]);
close(tda->tda_dvr_pipe[1]);
tda->tda_dvr_pipe[0] = -1;
tvhlog(LOG_DEBUG, "dvb", "%s stopped thread", tda->tda_rootpath);
}
}
dvb_adapter_notify(tda);
}
/**
@ -686,7 +665,6 @@ dvb_adapter_init(uint32_t adapter_mask, const char *rawfile)
tda->tda_displayname = strdup(name);
htsmsg_get_u32(c, "autodiscovery", &tda->tda_autodiscovery);
htsmsg_get_u32(c, "idlescan", &tda->tda_idlescan);
htsmsg_get_u32(c, "idleclose", &tda->tda_idleclose);
htsmsg_get_u32(c, "skip_checksubscr", &tda->tda_skip_checksubscr);
htsmsg_get_u32(c, "sidtochan", &tda->tda_sidtochan);
@ -725,7 +703,6 @@ dvb_adapter_mux_scanner(void *aux)
{
th_dvb_adapter_t *tda = aux;
th_dvb_mux_instance_t *tdmi;
int i;
if(tda->tda_rootpath == NULL)
return; // No hardware
@ -770,20 +747,6 @@ dvb_adapter_mux_scanner(void *aux)
dvb_fe_tune(tda->tda_mux_epg, "EPG scan");
return;
/* Normal */
} else if (tda->tda_idlescan) {
/* Alternate queue */
for(i = 0; i < TDA_SCANQ_NUM; i++) {
tda->tda_scan_selector++;
if (tda->tda_scan_selector == TDA_SCANQ_NUM)
tda->tda_scan_selector = 0;
tdmi = TAILQ_FIRST(&tda->tda_scan_queues[tda->tda_scan_selector]);
if (tdmi) {
dvb_fe_tune(tdmi, "Autoscan");
return;
}
}
}
/* Ensure we stop current mux and power off (if required) */
@ -833,6 +796,7 @@ dvb_adapter_destroy(th_dvb_adapter_t *tda)
free(tda->tda_identifier);
free(tda->tda_displayname);
free(tda->tda_tune_reason);
free(tda);
@ -1052,6 +1016,22 @@ dvb_adapter_build_msg(th_dvb_adapter_t *tda)
htsmsg_add_u32(m, "ber", tdmi->tdmi_ber);
htsmsg_add_u32(m, "unc", tdmi->tdmi_unc);
htsmsg_add_u32(m, "uncavg", tdmi->tdmi_unc_avg);
htsmsg_add_str(m, "reason", tda->tda_tune_reason);
} else {
htsmsg_add_str(m, "currentMux", "");
htsmsg_add_u32(m, "signal", 0);
htsmsg_add_u32(m, "snr", 0);
htsmsg_add_u32(m, "ber", 0);
htsmsg_add_u32(m, "unc", 0);
htsmsg_add_u32(m, "uncavg", 0);
if(tda->tda_fe_fd == -1) {
htsmsg_add_str(m, "reason", "Closed");
} else {
htsmsg_add_str(m, "reason", "Idle");
}
}
if(tda->tda_rootpath == NULL)

View file

@ -277,12 +277,8 @@ dvb_fe_stop(th_dvb_mux_instance_t *tdmi, int retune)
assert(tdmi->tdmi_scan_queue == NULL);
if(tdmi->tdmi_enabled) {
dvb_mux_add_to_scan_queue(tdmi);
}
epggrab_mux_stop(tdmi, 0);
time(&tdmi->tdmi_lost_adapter);
if (!retune) {
@ -411,9 +407,14 @@ dvb_fe_tune(th_dvb_mux_instance_t *tdmi, const char *reason)
lock_assert(&global_lock);
if(tda->tda_mux_current == tdmi)
free(tda->tda_tune_reason);
tda->tda_tune_reason = strdup(reason);
if(tda->tda_mux_current == tdmi) {
dvb_adapter_notify(tda);
return 0;
}
if(tdmi->tdmi_scan_queue != NULL) {
TAILQ_REMOVE(tdmi->tdmi_scan_queue, tdmi, tdmi_scan_link);
tdmi->tdmi_scan_queue = NULL;

View file

@ -299,8 +299,6 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
tda->tda_initial_num_mux++;
tdmi->tdmi_table_initial = 1;
mux_link_initial(tda, tdmi);
} else {
dvb_mux_add_to_scan_queue(tdmi);
}
}
@ -1255,16 +1253,6 @@ dvb_mux_copy(th_dvb_adapter_t *dst, th_dvb_mux_instance_t *tdmi_src,
return 0;
}
void dvb_mux_add_to_scan_queue ( th_dvb_mux_instance_t *tdmi )
{
int ti;
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
ti = tdmi->tdmi_quality == 100 ? TDA_SCANQ_OK
: TDA_SCANQ_BAD;
tdmi->tdmi_scan_queue = &tda->tda_scan_queues[ti];
TAILQ_INSERT_TAIL(tdmi->tdmi_scan_queue, tdmi, tdmi_scan_link);
}
th_dvb_mux_instance_t *dvb_mux_find
( th_dvb_adapter_t *tda, const char *netname, uint16_t onid, uint16_t tsid,
int enabled )

View file

@ -149,7 +149,6 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
htsmsg_add_str(r, "name", tda->tda_displayname);
htsmsg_add_u32(r, "automux", tda->tda_autodiscovery);
htsmsg_add_u32(r, "skip_initialscan", tda->tda_skip_initialscan);
htsmsg_add_u32(r, "idlescan", tda->tda_idlescan);
htsmsg_add_u32(r, "idleclose", tda->tda_idleclose);
htsmsg_add_u32(r, "skip_checksubscr", tda->tda_skip_checksubscr);
htsmsg_add_u32(r, "qmon", tda->tda_qmon);
@ -179,9 +178,6 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
s = http_arg_get(&hc->hc_req_args, "skip_initialscan");
dvb_adapter_set_skip_initialscan(tda, !!s);
s = http_arg_get(&hc->hc_req_args, "idlescan");
dvb_adapter_set_idlescan(tda, !!s);
s = http_arg_get(&hc->hc_req_args, "idleclose");
dvb_adapter_set_idleclose(tda, !!s);

View file

@ -1086,7 +1086,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
var confreader = new Ext.data.JsonReader({
root : 'dvbadapters'
}, [ 'name', 'automux', 'skip_initialscan', 'idlescan', 'diseqcversion',
}, [ 'name', 'automux', 'skip_initialscan', 'diseqcversion',
'diseqcrepeats', 'qmon', 'skip_checksubscr',
'poweroff', 'sidtochan', 'nitoid', 'extrapriority',
,'disable_pmt_monitor', 'full_mux_rx', 'idleclose' ]);
@ -1115,10 +1115,6 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
fieldLabel : 'Skip initial scan',
name : 'skip_initialscan'
}),
new Ext.form.Checkbox({
fieldLabel : 'Idle scanning',
name : 'idlescan'
}),
new Ext.form.Checkbox({
fieldLabel : 'Close device handle when idle',
name : 'idleclose'
@ -1235,7 +1231,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
+ '<h3>Symbolrate range:</h3>'
+ '{symrateMin} Baud - {symrateMax} Baud</tpl>'
+ '<h2 style="font-size: 150%">Status</h2>'
+ '<h3>Currently tuned to:</h3>{currentMux}&nbsp'
+ '<h3>Currently tuned to:</h3>{currentMux}&nbsp({reason})'
+ '<h3>Services:</h3>{services}' + '<h3>Muxes:</h3>{muxes}'
+ '<h3>Muxes awaiting initial scan:</h3>{initialMuxes}'
+ '<h3>Signal Strength:</h3>{signal}%'

View file

@ -160,6 +160,10 @@ tvheadend.status_adapters = function() {
width : 100,
header : "Currently tuned to",
dataIndex : 'currentMux'
},{
width : 50,
header : "Used for",
dataIndex : 'reason'
},{
width : 50,
header : "Bit error rate",

View file

@ -7,7 +7,7 @@ tvheadend.tvAdapterStore = new Ext.data.JsonStore({
fields : [ 'identifier', 'type', 'name', 'path', 'devicename',
'hostconnection', 'currentMux', 'services', 'muxes', 'initialMuxes',
'satConf', 'deliverySystem', 'freqMin', 'freqMax', 'freqStep',
'symrateMin', 'symrateMax', 'signal', 'snr', 'ber', 'unc', 'uncavg'],
'symrateMin', 'symrateMax', 'signal', 'snr', 'ber', 'unc', 'uncavg', 'reason'],
autoLoad : true,
url : 'tv/adapter'
});