diff --git a/src/epggrab.h b/src/epggrab.h index 352e90ad..17ea2075 100644 --- a/src/epggrab.h +++ b/src/epggrab.h @@ -319,6 +319,11 @@ void epggrab_channel_mod ( struct channel *ch ); */ void epggrab_resched ( void ); +/* + * OTA kick + */ +void epggrab_ota_queue_mux( struct mpegts_mux *mm ); + #endif /* __EPGGRAB_H__ */ /* ************************************************************************** diff --git a/src/epggrab/otamux.c b/src/epggrab/otamux.c index 0caa6079..4a219f1d 100644 --- a/src/epggrab/otamux.c +++ b/src/epggrab/otamux.c @@ -61,6 +61,8 @@ pthread_mutex_t epggrab_ota_mutex; SKEL_DECLARE(epggrab_ota_mux_skel, epggrab_ota_mux_t); SKEL_DECLARE(epggrab_svc_link_skel, epggrab_ota_svc_link_t); +static void epggrab_ota_kick ( int delay ); + static void epggrab_ota_timeout_cb ( void *p ); static void epggrab_ota_data_timeout_cb ( void *p ); static void epggrab_ota_kick_cb ( void *p ); @@ -100,6 +102,41 @@ epggrab_ota_timeout_get ( void ) return timeout; } +static int +epggrab_ota_queue_one( epggrab_ota_mux_t *om ) +{ + om->om_done = 0; + om->om_requeue = 1; + if (om->om_q_type != EPGGRAB_OTA_MUX_IDLE) + return 0; + TAILQ_INSERT_TAIL(&epggrab_ota_pending, om, om_q_link); + om->om_q_type = EPGGRAB_OTA_MUX_PENDING; + return 1; +} + +void +epggrab_ota_queue_mux( mpegts_mux_t *mm ) +{ + const char *id = idnode_uuid_as_str(&mm->mm_id); + epggrab_ota_mux_t *om; + int epg_flag; + + if (!mm) + return; + + lock_assert(&global_lock); + + epg_flag = mm->mm_is_epg(mm); + if (epg_flag < 0 || epg_flag == MM_EPG_DISABLE) + return; + RB_FOREACH(om, &epggrab_ota_all, om_global_link) + if (!strcmp(om->om_mux_uuid, id)) { + if (epggrab_ota_queue_one(om)) + epggrab_ota_kick(4); + break; + } +} + static void epggrab_ota_requeue ( void ) { @@ -108,14 +145,8 @@ epggrab_ota_requeue ( void ) /* * enqueue all muxes, but ommit the delayed ones (active+pending) */ - RB_FOREACH(om, &epggrab_ota_all, om_global_link) { - om->om_done = 0; - om->om_requeue = 1; - if (om->om_q_type != EPGGRAB_OTA_MUX_IDLE) - continue; - TAILQ_INSERT_TAIL(&epggrab_ota_pending, om, om_q_link); - om->om_q_type = EPGGRAB_OTA_MUX_PENDING; - } + RB_FOREACH(om, &epggrab_ota_all, om_global_link) + epggrab_ota_queue_one(om); } static void diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index f460eb9e..034594ea 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -25,6 +25,7 @@ #include "settings.h" #include "dvb_charset.h" #include "config.h" +#include "epggrab.h" /* ************************************************************************** * Class definition @@ -427,7 +428,7 @@ mpegts_service_channel_icon ( service_t *s ) if (ms->s_dvb_mux && idnode_is_instance(&ms->s_dvb_mux->mm_id, &dvb_mux_class)) { int32_t hash = 0; - static __thread char buf[128]; + static char buf[128]; dvb_mux_t *mmd = (dvb_mux_t*)ms->s_dvb_mux; char dir; int pos; @@ -465,6 +466,12 @@ mpegts_service_channel_icon ( service_t *s ) return NULL; } +static void +mpegts_service_mapped ( service_t *t ) +{ + epggrab_ota_queue_mux(((mpegts_service_t *)t)->s_dvb_mux); +} + void mpegts_service_delete ( service_t *t, int delconf ) { @@ -532,6 +539,7 @@ mpegts_service_create0 s->s_channel_name = mpegts_service_channel_name; s->s_provider_name = mpegts_service_provider_name; s->s_channel_icon = mpegts_service_channel_icon; + s->s_mapped = mpegts_service_mapped; pthread_mutex_lock(&s->s_stream_mutex); service_make_nicename((service_t*)s); diff --git a/src/service.c b/src/service.c index 415748fc..3ee07fe0 100644 --- a/src/service.c +++ b/src/service.c @@ -1615,6 +1615,15 @@ service_get_encryption(service_t *t) return 0; } +/* + * + */ +void +service_mapped(service_t *s) +{ + if (s->s_mapped) s->s_mapped(s); +} + /* * Find the primary EPG service (to stop EPG trying to update * from multiple OTA sources) diff --git a/src/service.h b/src/service.h index fde13e1f..e3ce74b9 100644 --- a/src/service.h +++ b/src/service.h @@ -310,6 +310,7 @@ typedef struct service { const char *(*s_channel_name) (struct service *); const char *(*s_provider_name) (struct service *); const char *(*s_channel_icon) (struct service *); + void (*s_mapped) (struct service *); /** * Name usable for displaying to user @@ -589,4 +590,6 @@ const char *service_get_full_channel_name (service_t *s); int64_t service_get_channel_number (service_t *s); const char *service_get_channel_icon (service_t *s); +void service_mapped (service_t *s); + #endif // SERVICE_H__ diff --git a/src/service_mapper.c b/src/service_mapper.c index ddfe8360..dafe1591 100644 --- a/src/service_mapper.c +++ b/src/service_mapper.c @@ -217,6 +217,7 @@ service_mapper_link ( service_t *s, channel_t *c, void *origin ) csm->csm_svc = s; LIST_INSERT_HEAD(&s->s_channels, csm, csm_svc_link); LIST_INSERT_HEAD(&c->ch_services, csm, csm_chn_link); + service_mapped( s ); service_mapper_notify( csm, origin ); return 1; }