diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 4ec7eda4..086f972e 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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 diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 43e759f6..06154af6 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -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); diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index 0e93ae1d..9987883e 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -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", diff --git a/src/input/mpegts/mpegts_network_scan.c b/src/input/mpegts/mpegts_network_scan.c index d483e99d..f3d7528a 100644 --- a/src/input/mpegts/mpegts_network_scan.c +++ b/src/input/mpegts/mpegts_network_scan.c @@ -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) {