Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
mpegts network idlescan: fix behaviour, add more documentation, fixes…
… #2422
  • Loading branch information
perexg committed Nov 9, 2014
1 parent ab810bb commit ffbc62a
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 14 deletions.
4 changes: 3 additions & 1 deletion docs/html/config_networks.html
Expand Up @@ -58,7 +58,9 @@
<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.
Expand Down
9 changes: 3 additions & 6 deletions src/input/mpegts/mpegts_mux.c
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts/mpegts_network.c
Expand Up @@ -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);
Expand Down
32 changes: 27 additions & 5 deletions src/input/mpegts/mpegts_network_scan.c
Expand Up @@ -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;
Expand All @@ -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 */
Expand Down Expand Up @@ -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);
Expand All @@ -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];;
Expand Down Expand Up @@ -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);
}

Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts/mpegts_network_scan.h
Expand Up @@ -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 );

/*
Expand Down

0 comments on commit ffbc62a

Please sign in to comment.