]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts network_scan: add proper enable/disable of mux and idle scan feature
authorAdam Sutton <dev@adamsutton.me.uk>
Thu, 5 Jun 2014 21:53:36 +0000 (22:53 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Mon, 9 Jun 2014 21:08:41 +0000 (22:08 +0100)
src/input/mpegts.h
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_network.c
src/input/mpegts/mpegts_network_scan.c

index 4ec7eda416cd0faf318fbc03bb202760e81208b7..086f972e8c9ecf2fa4946141f8d6651417608ba5 100644 (file)
@@ -270,6 +270,7 @@ struct mpegts_network
   int      mn_autodiscovery;
   int      mn_skipinitscan;
   char    *mn_charset;
+  int      mn_idlescan;
 };
 
 typedef enum mpegts_mux_scan_state
index 43e759f60daf0f7f27770b52baec92a2780e1406..06154af69d0a5f2d8998dbf85c229a7fea64c5e4 100644 (file)
@@ -239,6 +239,10 @@ mpegts_mux_class_scan_state_set ( void *o, const void *p )
 {
   mpegts_mux_t *mm = o;
   int state = *(int*)p;
+
+  /* Ignore */
+  if (!mm->mm_is_enabled(mm))
+    return 0;
   
   /* Start */
   if (state == MM_SCAN_STATE_PEND || state == MM_SCAN_STATE_ACTIVE) {
@@ -279,6 +283,16 @@ mpegts_mux_class_scan_result_enum ( void *p )
   return strtab2htsmsg(scan_result_tab);
 }
 
+static void
+mpegts_mux_class_enabled_notify ( void *p )
+{
+  mpegts_mux_t *mm = p;
+  if (!mm->mm_is_enabled(mm)) {
+    mm->mm_stop(mm, 1);
+    mpegts_network_scan_mux_cancel(mm, 0);
+  }
+}
+
 const idclass_t mpegts_mux_class =
 {
   .ic_class      = "mpegts_mux",
@@ -294,6 +308,7 @@ const idclass_t mpegts_mux_class =
       .name     = "Enabled",
       .off      = offsetof(mpegts_mux_t, mm_enabled),
       .def.i    = 1,
+      .notify   = mpegts_mux_class_enabled_notify,
     },
     {
       .type     = PT_STR,
@@ -385,7 +400,7 @@ mpegts_mux_delete ( mpegts_mux_t *mm, int delconf )
   char buf[256];
 
   mm->mm_display_name(mm, buf, sizeof(buf));
-  tvhinfo("mpegts", "%s - deleting", buf);
+  tvhinfo("mpegts", "%s (%p) - deleting", buf, mm);
   
   /* Stop */
   mm->mm_stop(mm, 1);
@@ -758,6 +773,8 @@ mpegts_mux_create0
   /* Initial scan */
   if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan)
     mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT);
+  else if (mm->mm_network->mn_idlescan)
+    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE);
 
   mm->mm_display_name(mm, buf, sizeof(buf));
   tvhtrace("mpegts", "%s - created", buf);
index 0e93ae1dce8bf198e96d1a79cfb6492ca3caa8fc..9987883e9b42aeaaad51057d837f688de3c67068 100644 (file)
@@ -91,6 +91,20 @@ mpegts_network_class_get_scanq_length ( void *ptr )
   return &n;
 }
 
+static void
+mpegts_network_class_idlescan_notify ( void *p )
+{
+  mpegts_network_t *mn = p;
+  mpegts_mux_t *mm;
+  LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
+    if (mn->mn_idlescan)
+      mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE);
+    else if (mm->mm_scan_state  == MM_SCAN_STATE_PEND &&
+             mm->mm_scan_weight == SUBSCRIPTION_PRIO_SCAN_IDLE)
+      mpegts_network_scan_queue_del(mm);
+  }
+}
+
 const idclass_t mpegts_network_class =
 {
   .ic_class      = "mpegts_network",
@@ -127,6 +141,14 @@ const idclass_t mpegts_network_class =
       .off      = offsetof(mpegts_network_t, mn_skipinitscan),
       .def.i    = 1
     },
+    {
+      .type     = PT_BOOL,
+      .id       = "idlescan",
+      .name     = "Idle Scan Muxes",
+      .off      = offsetof(mpegts_network_t, mn_idlescan),
+      .def.i    = 0,
+      .notify   = mpegts_network_class_idlescan_notify,
+    },
     {
       .type     = PT_STR,
       .id       = "charset",
index d483e99d26384af61cda677d233b169430418406..f3d7528aee3ebecbb9aca86305ee4197ec40df93 100644 (file)
@@ -117,35 +117,45 @@ mpegts_network_scan_timer_cb ( void *p )
  * Mux transition
  *****************************************************************************/
 
+/* Finished */
+static inline void
+mpegts_network_scan_mux_done0
+  ( mpegts_mux_t *mm, mpegts_mux_scan_result_t result, int weight )
+{
+  mpegts_mux_unsubscribe_by_name(mm, "scan");
+  mpegts_network_scan_queue_del(mm);
+
+  if (result != MM_SCAN_NONE && mm->mm_scan_result != result) {
+    mm->mm_scan_result = result;
+    mm->mm_config_save(mm);
+  }
+
+  /* Re-enable? */
+  if (mm->mm_network->mn_idlescan && !weight)
+    weight = SUBSCRIPTION_PRIO_SCAN_IDLE;
+  if (weight > 0)
+    mpegts_network_scan_queue_add(mm, weight);
+}
+
 /* Failed - couldn't start */
 void
 mpegts_network_scan_mux_fail    ( mpegts_mux_t *mm )
 {
-  if (mm->mm_scan_result != MM_SCAN_FAIL) {
-    mm->mm_scan_result = MM_SCAN_FAIL;
-    mm->mm_config_save(mm);
-  }
-  mpegts_mux_unsubscribe_by_name(mm, "scan");
-  mpegts_network_scan_queue_del(mm);
+  mpegts_network_scan_mux_done0(mm, MM_SCAN_FAIL, 0);
 }
 
 /* Completed succesfully */
 void
 mpegts_network_scan_mux_done    ( mpegts_mux_t *mm )
 {
-  if (mm->mm_scan_result != MM_SCAN_OK) {
-    mm->mm_scan_result = MM_SCAN_OK;
-    mm->mm_config_save(mm);
-  }
-  mpegts_mux_unsubscribe_by_name(mm, "scan");
-  mpegts_network_scan_queue_del(mm);
+  mpegts_network_scan_mux_done0(mm, MM_SCAN_OK, 0);
 }
 
 /* Failed - no input */
 void
 mpegts_network_scan_mux_timeout ( mpegts_mux_t *mm )
 {
-  mpegts_network_scan_mux_fail(mm);
+  mpegts_network_scan_mux_done0(mm, MM_SCAN_FAIL, 0);
 }
 
 /* Interrupted (re-add) */
@@ -155,13 +165,8 @@ mpegts_network_scan_mux_cancel  ( mpegts_mux_t *mm, int reinsert )
   if (mm->mm_scan_state != MM_SCAN_STATE_ACTIVE)
     return;
 
-  /* Remove */
-  mpegts_mux_unsubscribe_by_name(mm, "scan");
-  mpegts_network_scan_queue_del(mm);
-
-  /* Re-insert */
-  if (reinsert)
-    mpegts_network_scan_queue_add(mm, mm->mm_scan_weight);
+  mpegts_network_scan_mux_done0(mm, MM_SCAN_NONE,
+                                reinsert ? mm->mm_scan_weight : 0);
 }
 
 /* Mux has been started */
@@ -199,6 +204,8 @@ mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight )
 {
   int reload = 0;
 
+  if (!mm->mm_is_enabled(mm)) return;
+
   if (weight <= 0) return;
 
   if (weight > mm->mm_scan_weight) {