*/
void epggrab_resched ( void );
+/*
+ * OTA kick
+ */
+void epggrab_ota_queue_mux( struct mpegts_mux *mm );
+
#endif /* __EPGGRAB_H__ */
/* **************************************************************************
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 );
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 )
{
/*
* 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
#include "settings.h"
#include "dvb_charset.h"
#include "config.h"
+#include "epggrab.h"
/* **************************************************************************
* Class definition
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;
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 )
{
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);
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)
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
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__
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;
}