Simplification of the epggrab api used within the dvb code.

This commit is contained in:
Adam Sutton 2012-06-27 11:31:51 +01:00
parent 17930c18f5
commit 1c1ac9dc89
4 changed files with 36 additions and 40 deletions

View file

@ -120,8 +120,6 @@ typedef struct th_dvb_mux_instance {
int tdmi_enabled;
LIST_HEAD(, epggrab_ota_mux) tdmi_epg_grabbers;
time_t tdmi_got_adapter;
time_t tdmi_lost_adapter;
@ -152,8 +150,7 @@ typedef struct th_dvb_mux_instance {
#define TDA_SCANQ_BAD 0 ///< Bad muxes (monitor quality)
#define TDA_SCANQ_OK 1 ///< OK muxes
#define TDA_SCANQ_EPG 2 ///< EPG muxes (TBD)
#define TDA_SCANQ_NUM 3
#define TDA_SCANQ_NUM 2
typedef struct th_dvb_adapter {
@ -169,6 +166,8 @@ typedef struct th_dvb_adapter {
th_dvb_mux_instance_t *tda_mux_current;
th_dvb_mux_instance_t *tda_mux_epg;
int tda_table_epollfd;
const char *tda_rootpath;

View file

@ -41,7 +41,7 @@
#include "tsdemux.h"
#include "notify.h"
#include "service.h"
#include "epggrab/ota.h"
#include "epggrab.h"
struct th_dvb_adapter_queue dvb_adapters;
struct th_dvb_mux_instance_tree dvb_muxes;
@ -420,7 +420,6 @@ dvb_adapter_init(uint32_t adapter_mask)
void
dvb_adapter_mux_scanner(void *aux)
{
epggrab_ota_mux_t *ota;
th_dvb_adapter_t *tda = aux;
th_dvb_mux_instance_t *tdmi;
int i;
@ -449,15 +448,14 @@ dvb_adapter_mux_scanner(void *aux)
return;
}
/* Mark any incomplete EPG grabbers as timed out (basically complete) */
if (tda->tda_mux_current)
LIST_FOREACH(ota, &tda->tda_mux_current->tdmi_epg_grabbers, tdmi_link) {
epggrab_ota_timeout(ota);
}
/* Check EPG */
if (tda->tda_mux_epg)
tda->tda_mux_epg = NULL; // skip this time
else
tda->tda_mux_epg = epggrab_mux_next(tda);
/* Idle or EPG scan enabled */
idle_epg = tda->tda_idlescan ||
TAILQ_FIRST(&tda->tda_scan_queues[TDA_SCANQ_EPG]);
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) {
@ -472,27 +470,27 @@ dvb_adapter_mux_scanner(void *aux)
return;
}
/* Alternate between the three queues (BAD, OK, EPG) */
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;
/* EPG */
if (tda->tda_mux_epg) {
int period = epggrab_mux_period(tda->tda_mux_epg);
if (period > 20)
gtimer_arm(&tda->tda_mux_scanner_timer,
dvb_adapter_mux_scanner, tda, period);
dvb_fe_tune(tda->tda_mux_epg, "EPG scan");
/* Normal */
} else {
tdmi = TAILQ_FIRST(&tda->tda_scan_queues[tda->tda_scan_selector]);
if(tdmi != NULL) {
/* EPG - adjust dwell time */
if (tda->tda_scan_selector == TDA_SCANQ_EPG) {
epggrab_ota_mux_t *ota;
int period = 20;
LIST_FOREACH(ota, &tdmi->tdmi_epg_grabbers, tdmi_link) {
if (ota->timeout > period) period = ota->timeout;
}
gtimer_arm(&tda->tda_mux_scanner_timer, dvb_adapter_mux_scanner, tda, period);
/* 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;
}
dvb_fe_tune(tdmi, scan_string[tda->tda_scan_selector]);
return;
}
}
}

View file

@ -230,6 +230,8 @@ dvb_fe_stop(th_dvb_mux_instance_t *tdmi)
if(tdmi->tdmi_enabled) {
dvb_mux_add_to_scan_queue(tdmi);
}
epggrab_mux_stop(tdmi);
time(&tdmi->tdmi_lost_adapter);
}
@ -518,7 +520,7 @@ dvb_fe_tune(th_dvb_mux_instance_t *tdmi, const char *reason)
dvb_table_add_default(tdmi);
epggrab_tune(tdmi);
epggrab_mux_start(tdmi);
dvb_adapter_notify(tda);
return 0;

View file

@ -44,7 +44,7 @@
#include "dvb_support.h"
#include "notify.h"
#include "subscriptions.h"
#include "epggrab/ota.h"
#include "epggrab.h"
struct th_dvb_mux_instance_tree dvb_muxes;
@ -298,7 +298,6 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
void
dvb_mux_destroy(th_dvb_mux_instance_t *tdmi)
{
epggrab_ota_mux_t *ota;
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
service_t *t;
@ -332,8 +331,7 @@ dvb_mux_destroy(th_dvb_mux_instance_t *tdmi)
if(tdmi->tdmi_table_initial)
tda->tda_initial_num_mux--;
while ((ota = LIST_FIRST(&tdmi->tdmi_epg_grabbers)))
epggrab_ota_unregister(ota);
epggrab_mux_delete(tdmi);
hts_settings_remove("dvbmuxes/%s", tdmi->tdmi_identifier);
@ -1172,9 +1170,8 @@ void dvb_mux_add_to_scan_queue ( th_dvb_mux_instance_t *tdmi )
{
int ti;
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
ti = LIST_FIRST(&tdmi->tdmi_epg_grabbers) ? TDA_SCANQ_EPG
: tdmi->tdmi_quality == 100 ? TDA_SCANQ_OK
: TDA_SCANQ_BAD;
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);
}