From: Jaroslav Kysela Date: Sun, 9 Nov 2014 19:34:20 +0000 (+0100) Subject: mpegts network idlescan: fix behaviour, add more documentation, fixes #2422 X-Git-Tag: v4.1~806 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ffbc62a0eef47fd0cf8d82afb8eec5f3959639db;p=thirdparty%2Ftvheadend.git mpegts network idlescan: fix behaviour, add more documentation, fixes #2422 --- diff --git a/docs/html/config_networks.html b/docs/html/config_networks.html index 0c58597e9..4404bb8ba 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 37b18d004..a5295475e 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 943cc542b..5e95da3b0 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 1c86b262c..d90ffa9a3 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 0c5c69df7..349d7878a 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 ); /*