mpegts network_scan: add proper enable/disable of mux and idle scan feature
This commit is contained in:
parent
d29e0fe0b7
commit
88e07ba84a
4 changed files with 68 additions and 21 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue