From 680b5fb2020385a08a34579af87b5c613d4810bd Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sat, 28 Jun 2014 15:34:33 +0200 Subject: [PATCH] epg: add tune callback for ota modules (fixes opentv) --- src/epggrab.h | 3 ++- src/epggrab/module.c | 12 +++++------- src/epggrab/module/eit.c | 31 +++++++++++++++++++++++-------- src/epggrab/module/opentv.c | 14 +++++++++++--- src/epggrab/otamux.c | 3 ++- src/epggrab/private.h | 12 ++++++++---- src/input/mpegts/mpegts_mux.c | 13 +------------ 7 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/epggrab.h b/src/epggrab.h index 22850298..ed56e1d4 100644 --- a/src/epggrab.h +++ b/src/epggrab.h @@ -221,7 +221,8 @@ struct epggrab_module_ota /* Transponder tuning */ void (*start) ( epggrab_module_ota_t *m, struct mpegts_mux *mm ); - void (*done) ( epggrab_module_ota_t *m ); + void (*done) ( epggrab_module_ota_t *m ); + int (*tune) ( epggrab_module_ota_t *m, struct mpegts_mux *mm ); }; /* diff --git a/src/epggrab/module.c b/src/epggrab/module.c index a0de9011..86cec38d 100644 --- a/src/epggrab/module.c +++ b/src/epggrab/module.c @@ -448,10 +448,7 @@ epggrab_module_ext_t *epggrab_module_ext_create epggrab_module_ota_t *epggrab_module_ota_create ( epggrab_module_ota_t *skel, const char *id, const char *name, int priority, - void (*start) (epggrab_module_ota_t*m, - struct mpegts_mux *dm), - int (*enable) (void *m, uint8_t e ), - void (*done) (epggrab_module_ota_t *m), + epggrab_ota_module_ops_t *ops, epggrab_channel_tree_t *channels ) { if (!skel) skel = calloc(1, sizeof(epggrab_module_ota_t)); @@ -461,9 +458,10 @@ epggrab_module_ota_t *epggrab_module_ota_create /* Setup */ skel->type = EPGGRAB_OTA; - skel->enable = enable; - skel->start = start; - skel->done = done; + skel->enable = ops->enable; + skel->start = ops->start; + skel->done = ops->done; + skel->tune = ops->tune; //TAILQ_INIT(&skel->muxes); return skel; diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index 10aacdfa..2b9ece68 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -676,14 +676,29 @@ static void _eit_start tvhlog(LOG_DEBUG, m->id, "installed table handlers"); } +static int _eit_tune + ( epggrab_module_ota_t *m, mpegts_mux_t *mm ) +{ + mpegts_service_t *s; + + lock_assert(&global_lock); + + LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link) + if (LIST_FIRST(&s->s_channels)) + break; + + return s ? 1 : 0; +} + void eit_init ( void ) { - epggrab_module_ota_create(NULL, "eit", "EIT: DVB Grabber", 1, - _eit_start, NULL, NULL, NULL); - epggrab_module_ota_create(NULL, "uk_freesat", "UK: Freesat", 5, - _eit_start, NULL, NULL, NULL); - epggrab_module_ota_create(NULL, "uk_freeview", "UK: Freeview", 5, - _eit_start, NULL, NULL, NULL); - epggrab_module_ota_create(NULL, "viasat_baltic", "VIASAT: Baltic", 5, - _eit_start, NULL, NULL, NULL); + static epggrab_ota_module_ops_t ops = { + .start = _eit_start, + .tune = _eit_tune, + }; + + epggrab_module_ota_create(NULL, "eit", "EIT: DVB Grabber", 1, &ops, NULL); + epggrab_module_ota_create(NULL, "uk_freesat", "UK: Freesat", 5, &ops, NULL); + epggrab_module_ota_create(NULL, "uk_freeview", "UK: Freeview", 5, &ops, NULL); + epggrab_module_ota_create(NULL, "viasat_baltic", "VIASAT: Baltic", 5, &ops, NULL); } diff --git a/src/epggrab/module/opentv.c b/src/epggrab/module/opentv.c index 91dc1c69..982e46a8 100644 --- a/src/epggrab/module/opentv.c +++ b/src/epggrab/module/opentv.c @@ -692,6 +692,11 @@ static void _opentv_done( epggrab_module_ota_t *m ) free(mod->summary); } +static int _opentv_tune ( epggrab_module_ota_t *m, mpegts_mux_t *mm ) +{ + return 1; +} + static int _opentv_prov_load_one ( const char *id, htsmsg_t *m ) { char ibuf[100], nbuf[1000]; @@ -701,6 +706,11 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m ) opentv_dict_t *dict; opentv_genre_t *genre; opentv_module_t *mod; + static epggrab_ota_module_ops_t ops = { + .start = _opentv_start, + .done = _opentv_done, + .tune = _opentv_tune, + }; /* Check config */ if (!(name = htsmsg_get_str(m, "name"))) return -1; @@ -730,9 +740,7 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m ) sprintf(nbuf, "OpenTV: %s", name); mod = (opentv_module_t*) epggrab_module_ota_create(calloc(1, sizeof(opentv_module_t)), - ibuf, nbuf, 2, - _opentv_start, NULL, - _opentv_done, NULL); + ibuf, nbuf, 2, &ops, NULL); /* Add provider details */ mod->dict = dict; diff --git a/src/epggrab/otamux.c b/src/epggrab/otamux.c index de3e59b6..62b97ba8 100644 --- a/src/epggrab/otamux.c +++ b/src/epggrab/otamux.c @@ -325,7 +325,8 @@ next_one: /* Check we have modules attached and enabled */ LIST_FOREACH(map, &om->om_modules, om_link) { - if (map->om_module->enabled) + if (map->om_module->enabled && + map->om_module->tune && map->om_module->tune(map->om_module, mm)) break; } if (!map) { diff --git a/src/epggrab/private.h b/src/epggrab/private.h index dd7b6289..0a2e1dc2 100644 --- a/src/epggrab/private.h +++ b/src/epggrab/private.h @@ -85,13 +85,17 @@ epggrab_module_ext_t *epggrab_module_ext_create * OTA module routines * *************************************************************************/ +typedef struct epggrab_ota_module_ops { + void (*start) (epggrab_module_ota_t *m, struct mpegts_mux *mm); + int (*enable) (void *m, uint8_t e ); + void (*done) (epggrab_module_ota_t*m); + int (*tune) (epggrab_module_ota_t *m, struct mpegts_mux *mm); +} epggrab_ota_module_ops_t; + epggrab_module_ota_t *epggrab_module_ota_create ( epggrab_module_ota_t *skel, const char *id, const char *name, int priority, - void (*start) (epggrab_module_ota_t*m, - struct mpegts_mux *mm), - int (*enable) (void *m, uint8_t e ), - void (*done) (epggrab_module_ota_t*m), + epggrab_ota_module_ops_t *ops, epggrab_channel_tree_t *channels ); /* ************************************************************************** diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 429584e3..4518313d 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -449,18 +449,7 @@ mpegts_mux_is_enabled ( mpegts_mux_t *mm ) static int mpegts_mux_is_epg ( mpegts_mux_t *mm ) { - mpegts_service_t *s; - - lock_assert(&global_lock); - - if (!mm->mm_epg) - return 0; - - LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link) - if (LIST_FIRST(&s->s_channels)) - break; - - return s ? 1 : 0; + return mm->mm_epg; } static void