]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts network idlescan: fix behaviour, add more documentation, fixes #2422
authorJaroslav Kysela <perex@perex.cz>
Sun, 9 Nov 2014 19:34:20 +0000 (20:34 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 9 Nov 2014 19:34:20 +0000 (20:34 +0100)
docs/html/config_networks.html
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_network.c
src/input/mpegts/mpegts_network_scan.c
src/input/mpegts/mpegts_network_scan.h

index 0c58597e99fcdcc2ee7e9db1ba66c4e1ab384400..4404bb8baf20558bcaa7a223366fa03e51d37ffd 100644 (file)
@@ -58,7 +58,9 @@ Buttons have the following functions:
                <dd>Don't scan this network for muxes at Tvheadend start.
 <p>
                <dt><b>Idle Scan Muxes</b>
-               <dd>When nothing else happens Tvheadend will continuously rotate among all muxes and tune to them to verify that they are still working. If your adapter have problems with lots of tuning, try to disable this.
+               <dd>When nothing else happens Tvheadend will continuously rotate among all muxes and tune to them to verify that they are still working
+                   when the inputs are not used for streaming. If your adapter have problems with lots of (endless) tuning, try to disable this.
+                   Note that this option should be OFF for the normal operation. This type of mux probing is not required.
 <p>
                <dt><b>Ignore Provider's Channel Numbers</b>
                <dd>Some providers will try to set a channel number so that every receiver is consistent - "tune to Channel x on 150". This option allows you to ignore this and let tvhheadend allocate a channel number itself.
index 37b18d0046678d8fc7f1087d640f24d0b00146dc..a5295475ed713b78771b23d2ddfaf26b51be9eca 100644 (file)
@@ -275,7 +275,7 @@ mpegts_mux_class_scan_state_set ( void *o, const void *p )
       return 0;
 
     /* Start */
-    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_USER);
+    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_USER, 0);
 
   /* Stop */
   } else if (state == MM_SCAN_STATE_IDLE) {
@@ -734,9 +734,6 @@ mpegts_mux_stop ( mpegts_mux_t *mm, int force )
 
   /* Scanning */
   mpegts_network_scan_mux_cancel(mm, 1);
-  if (mm->mm_scan_state == MM_SCAN_STATE_IDLE &&
-      mm->mm_network->mn_idlescan)
-    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE);
 
   /* Events */
   mpegts_fire_event(mm, ml_mux_stop);
@@ -982,9 +979,9 @@ 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);
+    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT, 10);
   else if (mm->mm_network->mn_idlescan)
-    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE);
+    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE, 10);
 
   mpegts_mux_nice_name(mm, buf, sizeof(buf));
   tvhtrace("mpegts", "%s - created", buf);
index 943cc542b2ef79a7f3d2cf4d9988c37a86098bbb..5e95da3b0074a7a69e2021eed2a2fd8f57ebb288 100644 (file)
@@ -118,7 +118,7 @@ mpegts_network_class_idlescan_notify ( void *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);
+      mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE, 0);
     else if (mm->mm_scan_state  == MM_SCAN_STATE_PEND &&
              mm->mm_scan_weight == SUBSCRIPTION_PRIO_SCAN_IDLE)
       mpegts_network_scan_queue_del(mm);
index 1c86b262cd99a19d519c097f473d30cd57d4c8c6..d90ffa9a3634009cba0af03037ff17b7f3005548 100644 (file)
@@ -95,8 +95,26 @@ static inline void
 mpegts_network_scan_mux_done0
   ( mpegts_mux_t *mm, mpegts_mux_scan_result_t result, int weight )
 {
+  mpegts_network_t *mn = mm->mm_network;
+
   mpegts_mux_unsubscribe_by_name(mm, "scan");
-  mpegts_network_scan_queue_del(mm);
+  if (mm->mm_scan_state == MM_SCAN_STATE_PEND) {
+    if (weight || mn->mn_idlescan) {
+      if (!weight)
+        mm->mm_scan_weight = SUBSCRIPTION_PRIO_SCAN_IDLE;
+      TAILQ_REMOVE(&mn->mn_scan_pend, mm, mm_scan_link);
+      TAILQ_INSERT_SORTED_R(&mn->mn_scan_pend, mpegts_mux_queue,
+                            mm, mm_scan_link, mm_cmp);
+      gtimer_arm(&mn->mn_scan_timer, mpegts_network_scan_timer_cb, mn, 10);
+      weight = 0;
+    } else {
+      mpegts_network_scan_queue_del(mm);
+    }
+  } else {
+    if (!weight && mn->mn_idlescan)
+      weight = SUBSCRIPTION_PRIO_SCAN_IDLE;
+    mpegts_network_scan_queue_del(mm);
+  }
 
   if (result != MM_SCAN_NONE && mm->mm_scan_result != result) {
     mm->mm_scan_result = result;
@@ -105,7 +123,7 @@ mpegts_network_scan_mux_done0
 
   /* Re-enable? */
   if (weight > 0)
-    mpegts_network_scan_queue_add(mm, weight);
+    mpegts_network_scan_queue_add(mm, weight, 10);
 }
 
 /* Failed - couldn't start */
@@ -161,11 +179,15 @@ void
 mpegts_network_scan_queue_del ( mpegts_mux_t *mm )
 {
   mpegts_network_t *mn = mm->mm_network;
+  char buf[256], buf2[256];
   if (mm->mm_scan_state == MM_SCAN_STATE_ACTIVE) {
     TAILQ_REMOVE(&mn->mn_scan_active, mm, mm_scan_link);
   } else if (mm->mm_scan_state == MM_SCAN_STATE_PEND) {
     TAILQ_REMOVE(&mn->mn_scan_pend, mm, mm_scan_link);
   }
+  mpegts_mux_nice_name(mm, buf, sizeof(buf));
+  mn->mn_display_name(mn, buf2, sizeof(buf2));
+  tvhdebug("mpegts", "%s - removing mux %s from scan queue", buf2, buf);
   mm->mm_scan_state  = MM_SCAN_STATE_IDLE;
   mm->mm_scan_weight = 0;
   gtimer_disarm(&mm->mm_scan_timeout);
@@ -174,7 +196,7 @@ mpegts_network_scan_queue_del ( mpegts_mux_t *mm )
 }
 
 void
-mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight )
+mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay )
 {
   int reload = 0;
   char buf[256], buf2[256];;
@@ -202,14 +224,14 @@ mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight )
 
   mpegts_mux_nice_name(mm, buf, sizeof(buf));
   mn->mn_display_name(mn, buf2, sizeof(buf2));
-  tvhdebug("mpegts", "%s - adding mux %s to queue weight %d",
+  tvhdebug("mpegts", "%s - adding mux %s to scan queue weight %d",
            buf2, buf, weight);
 
   /* Add new entry */
   mm->mm_scan_state = MM_SCAN_STATE_PEND;
   TAILQ_INSERT_SORTED_R(&mn->mn_scan_pend, mpegts_mux_queue,
                         mm, mm_scan_link, mm_cmp);
-  gtimer_arm(&mn->mn_scan_timer, mpegts_network_scan_timer_cb, mn, 0);
+  gtimer_arm(&mn->mn_scan_timer, mpegts_network_scan_timer_cb, mn, delay);
   mpegts_network_scan_notify(mm);
 }
 
index 0c5c69df7ec9b136f87dba3c2ef0ce1bb84309bb..349d7878a212d205c3d58982bfc3107da08fb51a 100644 (file)
@@ -33,7 +33,7 @@ void mpegts_network_scan_timer_cb ( void *p );
 /*
  * Registration functions
  */
-void mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight );
+void mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay );
 void mpegts_network_scan_queue_del ( mpegts_mux_t *mm );
 
 /*