channel: add mux to OTA EPG queue when service is mapped to channel to grab EPG ASAP, fixes #2447

This commit is contained in:
Jaroslav Kysela 2014-11-10 09:39:34 +01:00
parent 4c1f0fa1b6
commit 679989e91f
6 changed files with 66 additions and 9 deletions

View file

@ -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__ */
/* **************************************************************************

View file

@ -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

View file

@ -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);

View file

@ -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)

View file

@ -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__

View file

@ -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;
}