]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
channel: add mux to OTA EPG queue when service is mapped to channel to grab EPG ASAP...
authorJaroslav Kysela <perex@perex.cz>
Mon, 10 Nov 2014 08:39:34 +0000 (09:39 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 10 Nov 2014 08:44:03 +0000 (09:44 +0100)
src/epggrab.h
src/epggrab/otamux.c
src/input/mpegts/mpegts_service.c
src/service.c
src/service.h
src/service_mapper.c

index 352e90ad78cbf7d4d928583eafb1298c96859542..17ea20753ccfb7df8c18c26115eb79446e11e791 100644 (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__ */
 
 /* **************************************************************************
index 0caa6079c33d61ac3a80b0952beb7ea3c9c434b4..4a219f1df8e7c0e58a30fdb4e2c76f8a0e4b7a7c 100644 (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
index f460eb9ec1b2998f989ece060d81dff2884bf50f..034594ea51a7f9ba10d7343ad169a09eb0caca2e 100644 (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);
index 415748fceb7f792b743ef5ae772116618a442de6..3ee07fe0e6a49cd20cb0e6aa6780b3d4397e393d 100644 (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)
index fde13e1f2e9154c199939c49ccb3ee4b8a9b3110..e3ce74b9c067d1b6e9d53c8e367f94278d162d1c 100644 (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__
index ddfe8360f2ca38632b7d867a7428de529f73b261..dafe1591d580ebc04f3ba7745f424577a82d9512 100644 (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;
 }