]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mux stop: pass the stop reason for OTA epggrab to avoid re-tuning on muxes with no...
authorJaroslav Kysela <perex@perex.cz>
Wed, 21 Jan 2015 11:02:50 +0000 (12:02 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 21 Jan 2015 11:02:50 +0000 (12:02 +0100)
src/epggrab/otamux.c
src/input/mpegts.h
src/input/mpegts/iptv/iptv.c
src/input/mpegts/linuxdvb/linuxdvb_frontend.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c

index 80cb3c009bbb5bc5c298f0d3dc0d6f7d00a64868..3caacff005e72413af513df2c1c65f9111eec3d2 100644 (file)
@@ -192,7 +192,7 @@ epggrab_ota_done ( epggrab_ota_mux_t *om, int reason )
   om->om_q_type = EPGGRAB_OTA_MUX_IDLE;
   if (reason == EPGGRAB_OTA_DONE_STOLEN) {
     /* Do not requeue completed muxes */
-    if (!om->om_done && om->om_requeue && mm->mm_scan_result != MM_SCAN_FAIL) {
+    if (!om->om_done && om->om_requeue) {
       TAILQ_INSERT_HEAD(&epggrab_ota_pending, om, om_q_link);
       om->om_q_type = EPGGRAB_OTA_MUX_PENDING;
     } else {
@@ -295,15 +295,18 @@ epggrab_mux_start ( mpegts_mux_t *mm, void *p )
 }
 
 static void
-epggrab_mux_stop ( mpegts_mux_t *mm, void *p )
+epggrab_mux_stop ( mpegts_mux_t *mm, void *p, int reason )
 {
   epggrab_ota_mux_t *ota;
   const char *uuid = idnode_uuid_as_str(&mm->mm_id);
+  int done = EPGGRAB_OTA_DONE_STOLEN;
 
+  if (reason == SM_CODE_NO_INPUT)
+    done = EPGGRAB_OTA_DONE_NO_DATA;
   tvhtrace("epggrab", "mux %p (%s) stop", mm, uuid);
   TAILQ_FOREACH(ota, &epggrab_ota_active, om_q_link)
     if (!strcmp(ota->om_mux_uuid, uuid)) {
-      epggrab_ota_done(ota, EPGGRAB_OTA_DONE_STOLEN);
+      epggrab_ota_done(ota, done);
       break;
     }
 }
index 0a26eeecdc95c1c99f857a8f912607e584d59bb1..3c8a4916b73aff6aeab55ee05ef6a76c06b02ef4 100644 (file)
@@ -415,7 +415,7 @@ struct mpegts_mux
   void (*mm_display_name)     (mpegts_mux_t*, char *buf, size_t len);
   int  (*mm_is_enabled)       (mpegts_mux_t *mm);
   int  (*mm_start)            (mpegts_mux_t *mm, mpegts_input_t *mi, const char *r, int w, int flags);
-  void (*mm_stop)             (mpegts_mux_t *mm, int force);
+  void (*mm_stop)             (mpegts_mux_t *mm, int force, int reason);
   void (*mm_open_table)       (mpegts_mux_t*,mpegts_table_t*,int subscribe);
   void (*mm_close_table)      (mpegts_mux_t*,mpegts_table_t*);
   void (*mm_create_instances) (mpegts_mux_t*);
@@ -913,7 +913,7 @@ typedef struct mpegts_listener
   LIST_ENTRY(mpegts_listener) ml_link;
   void *ml_opaque;
   void (*ml_mux_start)  (mpegts_mux_t *mm, void *p);
-  void (*ml_mux_stop)   (mpegts_mux_t *mm, void *p);
+  void (*ml_mux_stop)   (mpegts_mux_t *mm, void *p, int reason);
   void (*ml_mux_create) (mpegts_mux_t *mm, void *p);
   void (*ml_mux_delete) (mpegts_mux_t *mm, void *p);
 } mpegts_listener_t;
@@ -933,6 +933,13 @@ LIST_HEAD(,mpegts_listener) mpegts_listeners;
     if (ml->op) ml->op(t, ml->ml_opaque);\
 } (void)0
 
+#define mpegts_fire_event1(t, op, arg1)\
+{\
+  mpegts_listener_t *ml;\
+  LIST_FOREACH(ml, &mpegts_listeners, ml_link)\
+    if (ml->op) ml->op(t, ml->ml_opaque, arg1);\
+} (void)0
+
 /*
  * Misc
  */
index ce36fcebf1110ebcc1a401245eeefc4957cbab7c..9aac168d6483fc2637652ebf71dd08d9ac1ab9d5 100644 (file)
@@ -208,7 +208,7 @@ iptv_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
   
     /* Stop */
     if (s)
-      s->mmi_mux->mm_stop(s->mmi_mux, 1);
+      s->mmi_mux->mm_stop(s->mmi_mux, 1, SM_CODE_ABORTED);
   }
   return 0;
 }
index bc2c53475bf4d7f7715e6a676ba2f1bb78a732db..286534ca0e864fc4ec7cc694e0430a00460e64c1 100644 (file)
@@ -510,7 +510,7 @@ linuxdvb_frontend_monitor ( void *aux )
   
   /* Disabled */
   if (!lfe->mi_enabled && mmi)
-    mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1);
+    mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1, SM_CODE_ABORTED);
 
   /* Close FE */
   if (lfe->lfe_fe_fd > 0 && !mmi && lfe->lfe_powersave) {
index d077ac3adc204bd163472e7d05eb6be422cdddf5..1ebd901c6260b4835670d2964aa9c2546437201c 100644 (file)
@@ -133,7 +133,7 @@ mpegts_input_enabled_notify ( void *p )
 
   /* Stop */
   LIST_FOREACH(mmi, &mi->mi_mux_active, mmi_active_link)
-    mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1);
+    mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1, SM_CODE_ABORTED);
 
   /* Alert */
   if (mi->mi_enabled_updated)
@@ -382,7 +382,7 @@ mpegts_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
       return 0;
 
     /* Stop current */
-    cur->mmi_mux->mm_stop(cur->mmi_mux, 1);
+    cur->mmi_mux->mm_stop(cur->mmi_mux, 1, SM_CODE_SUBSCRIPTION_OVERRIDDEN);
   }
   if (LIST_FIRST(&mi->mi_mux_active))
     return SM_CODE_TUNING_FAILED;
@@ -540,7 +540,7 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s )
   pthread_mutex_unlock(&mi->mi_output_lock);
 
   /* Stop mux? */
-  s->s_dvb_mux->mm_stop(s->s_dvb_mux, 0);
+  s->s_dvb_mux->mm_stop(s->s_dvb_mux, 0, SM_CODE_OK);
 }
 
 static void
@@ -1393,7 +1393,7 @@ mpegts_input_stop_all ( mpegts_input_t *mi )
 {
   mpegts_mux_instance_t *mmi;
   while ((mmi = LIST_FIRST(&mi->mi_mux_active)))
-    mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1);
+    mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1, SM_CODE_OK);
 }
 
 void
index 1f744e94f64daa8f56673b6260a5778334fb1d43..771eabde9006031b738326a5b33bb10b128bb45e 100644 (file)
@@ -427,7 +427,7 @@ mpegts_mux_class_enabled_notify ( void *p )
 {
   mpegts_mux_t *mm = p;
   if (!mm->mm_is_enabled(mm)) {
-    mm->mm_stop(mm, 1);
+    mm->mm_stop(mm, 1, SM_CODE_MUX_NOT_ENABLED);
     mpegts_network_scan_mux_cancel(mm, 0);
   }
 }
@@ -583,7 +583,7 @@ mpegts_mux_delete ( mpegts_mux_t *mm, int delconf )
   tvhinfo("mpegts", "%s (%p) - deleting", buf, mm);
   
   /* Stop */
-  mm->mm_stop(mm, 1);
+  mm->mm_stop(mm, 1, SM_CODE_ABORTED);
 
   /* Remove from network */
   LIST_REMOVE(mm, mm_network_link);
@@ -815,7 +815,7 @@ mpegts_mux_has_subscribers ( mpegts_mux_t *mm, const char *name )
 }
 
 static void
-mpegts_mux_stop ( mpegts_mux_t *mm, int force )
+mpegts_mux_stop ( mpegts_mux_t *mm, int force, int reason )
 {
   char buf[256], *s;
   mpegts_mux_instance_t *mmi = mm->mm_active, *mmi2;
@@ -895,7 +895,7 @@ mpegts_mux_stop ( mpegts_mux_t *mm, int force )
   mpegts_network_scan_mux_cancel(mm, 1);
 
   /* Events */
-  mpegts_fire_event(mm, ml_mux_stop);
+  mpegts_fire_event1(mm, ml_mux_stop, reason);
 
 }
 
@@ -1275,7 +1275,7 @@ mpegts_mux_remove_subscriber
   tvhtrace("mpegts", "%s - remove subscriber", buf);
 #endif
   subscription_unlink_mux(s, reason);
-  mm->mm_stop(mm, 0);
+  mm->mm_stop(mm, 0, reason);
 }
 
 int