channel: add mux to OTA EPG queue when service is mapped to channel to grab EPG ASAP, fixes #2447
This commit is contained in:
parent
4c1f0fa1b6
commit
679989e91f
6 changed files with 66 additions and 9 deletions
|
@ -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__ */
|
||||
|
||||
/* **************************************************************************
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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__
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue