diff --git a/docs/html/config_networks.html b/docs/html/config_networks.html
index 0c58597e..4404bb8b 100644
--- a/docs/html/config_networks.html
+++ b/docs/html/config_networks.html
@@ -58,7 +58,9 @@ Buttons have the following functions:
Don't scan this network for muxes at Tvheadend start.
Idle Scan Muxes
- 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.
+ 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.
Ignore Provider's Channel Numbers
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.
diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c
index 37b18d00..a5295475 100644
--- a/src/input/mpegts/mpegts_mux.c
+++ b/src/input/mpegts/mpegts_mux.c
@@ -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);
diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c
index 943cc542..5e95da3b 100644
--- a/src/input/mpegts/mpegts_network.c
+++ b/src/input/mpegts/mpegts_network.c
@@ -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);
diff --git a/src/input/mpegts/mpegts_network_scan.c b/src/input/mpegts/mpegts_network_scan.c
index 1c86b262..d90ffa9a 100644
--- a/src/input/mpegts/mpegts_network_scan.c
+++ b/src/input/mpegts/mpegts_network_scan.c
@@ -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);
}
diff --git a/src/input/mpegts/mpegts_network_scan.h b/src/input/mpegts/mpegts_network_scan.h
index 0c5c69df..349d7878 100644
--- a/src/input/mpegts/mpegts_network_scan.h
+++ b/src/input/mpegts/mpegts_network_scan.h
@@ -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 );
/*