From 1c1ac9dc89d18b727a3a118891a0990acbc136ca Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Wed, 27 Jun 2012 11:31:51 +0100 Subject: [PATCH] Simplification of the epggrab api used within the dvb code. --- src/dvb/dvb.h | 7 +++--- src/dvb/dvb_adapter.c | 54 ++++++++++++++++++++--------------------- src/dvb/dvb_fe.c | 4 ++- src/dvb/dvb_multiplex.c | 11 +++------ 4 files changed, 36 insertions(+), 40 deletions(-) diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 1b8c3f94..20427302 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -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; diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index 12e13066..0b6c8d5b 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -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; } } } diff --git a/src/dvb/dvb_fe.c b/src/dvb/dvb_fe.c index a964240f..536067cb 100644 --- a/src/dvb/dvb_fe.c +++ b/src/dvb/dvb_fe.c @@ -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; diff --git a/src/dvb/dvb_multiplex.c b/src/dvb/dvb_multiplex.c index a204e875..1d5cbc97 100644 --- a/src/dvb/dvb_multiplex.c +++ b/src/dvb/dvb_multiplex.c @@ -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); }