Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
channel: add mux to OTA EPG queue when service is mapped to channel t…
…o grab EPG ASAP, fixes #2447
  • Loading branch information
perexg committed Nov 10, 2014
1 parent 4c1f0fa commit 679989e
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 9 deletions.
5 changes: 5 additions & 0 deletions src/epggrab.h
Expand Up @@ -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__ */

/* **************************************************************************
Expand Down
47 changes: 39 additions & 8 deletions src/epggrab/otamux.c
Expand Up @@ -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 );
Expand Down Expand Up @@ -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 )
{
Expand All @@ -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
Expand Down
10 changes: 9 additions & 1 deletion src/input/mpegts/mpegts_service.c
Expand Up @@ -25,6 +25,7 @@
#include "settings.h"
#include "dvb_charset.h"
#include "config.h"
#include "epggrab.h"

/* **************************************************************************
* Class definition
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 )
{
Expand Down Expand Up @@ -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);
Expand Down
9 changes: 9 additions & 0 deletions src/service.c
Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions src/service.h
Expand Up @@ -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
Expand Down Expand Up @@ -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__
1 change: 1 addition & 0 deletions src/service_mapper.c
Expand Up @@ -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;
}
Expand Down

0 comments on commit 679989e

Please sign in to comment.