From d29e0fe0b77157b1b6d409ac5ab342c92512bb41 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Thu, 5 Jun 2014 22:20:08 +0100 Subject: [PATCH] mpegts: improvements to the reworked network scanner --- src/input/mpegts.h | 16 +++++- src/input/mpegts/mpegts_mux.c | 79 +++++++++++++++++++++----- src/input/mpegts/mpegts_network_scan.c | 35 ++++++++++-- src/input/mpegts/mpegts_table.c | 2 +- 4 files changed, 112 insertions(+), 20 deletions(-) diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 2fec1bf5..4ec7eda4 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -279,6 +279,13 @@ typedef enum mpegts_mux_scan_state MM_SCAN_STATE_ACTIVE, // Scan is active } mpegts_mux_scan_state_t; +typedef enum mpegts_mux_scan_result +{ + MM_SCAN_NONE, + MM_SCAN_OK, + MM_SCAN_FAIL +} mpegts_mux_scan_result_t; + /* Multiplex */ struct mpegts_mux { @@ -303,13 +310,20 @@ struct mpegts_mux * Scanning */ - int mm_scan_ok; ///< Has been succesfully scanned + mpegts_mux_scan_result_t mm_scan_result; ///< Result of last scan int mm_scan_weight; ///< Scan priority int mm_scan_init; ///< Flag to timeout handler gtimer_t mm_scan_timeout; ///< Timer to handle timeout TAILQ_ENTRY(mpegts_mux) mm_scan_link; ///< Link to Queue mpegts_mux_scan_state_t mm_scan_state; ///< Scanning state +#if 0 + enum { + MM_ORIG_USER, ///< Manually added + MM_ORIG_FILE, ///< Added from scan file + MM_ORIG_AUTO ///< From NIT + } mm_dmc_origin2; +#endif mpegts_mux_t *mm_dmc_origin; time_t mm_dmc_origin_expire; diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 0856d90a..43e759f6 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -220,19 +220,63 @@ mpegts_mux_class_get_name ( void *ptr ) return &s; } -static void -mpegts_mux_class_scan_notify ( void *p ) -{ - mpegts_mux_t *mm = p; +static struct strtab +scan_state_tab[] = { + { "IDLE", MM_SCAN_STATE_IDLE }, + { "PEND", MM_SCAN_STATE_PEND }, + { "ACTIVE", MM_SCAN_STATE_ACTIVE }, +}; +static struct strtab +scan_result_tab[] = { + { "NONE", MM_SCAN_NONE }, + { "OK", MM_SCAN_OK }, + { "FAIL", MM_SCAN_FAIL }, +}; + +static int +mpegts_mux_class_scan_state_set ( void *o, const void *p ) +{ + mpegts_mux_t *mm = o; + int state = *(int*)p; + /* Start */ - if (!mm->mm_scan_ok) { + if (state == MM_SCAN_STATE_PEND || state == MM_SCAN_STATE_ACTIVE) { + + /* No change */ + if (mm->mm_scan_state != MM_SCAN_STATE_IDLE) + return 0; + + /* Start */ mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_USER); /* Stop */ - } else { + } else if (state == MM_SCAN_STATE_IDLE) { + + /* No change */ + if (state == MM_SCAN_STATE_IDLE) + return 0; + + /* Update */ mpegts_network_scan_mux_cancel(mm, 0); + + /* Invalid */ + } else { } + + return 1; +} + +static htsmsg_t * +mpegts_mux_class_scan_state_enum ( void *p ) +{ + return strtab2htsmsg(scan_state_tab); +} + +static htsmsg_t * +mpegts_mux_class_scan_result_enum ( void *p ) +{ + return strtab2htsmsg(scan_result_tab); } const idclass_t mpegts_mux_class = @@ -287,13 +331,22 @@ const idclass_t mpegts_mux_class = .off = offsetof(mpegts_mux_t, mm_crid_authority), }, { - .type = PT_BOOL, - .id = "scanned", - .name = "Scan Complete", - .off = offsetof(mpegts_mux_t, mm_scan_ok), - .notify = mpegts_mux_class_scan_notify, + .type = PT_INT, + .id = "scan_state", + .name = "Scan Status", + .off = offsetof(mpegts_mux_t, mm_scan_state), + .set = mpegts_mux_class_scan_state_set, + .list = mpegts_mux_class_scan_state_enum, + .opts = PO_NOSAVE | PO_SORTKEY, + }, + { + .type = PT_INT, + .id = "scan_result", + .name = "Scan Result", + .off = offsetof(mpegts_mux_t, mm_scan_result), + .opts = PO_RDONLY | PO_SORTKEY, + .list = mpegts_mux_class_scan_result_enum, }, - // TODO: need flag for ok/fail and fini/notfini { .type = PT_STR, .id = "charset", @@ -703,7 +756,7 @@ mpegts_mux_create0 idnode_load(&mm->mm_id, conf); /* Initial scan */ - if (!mm->mm_scan_ok || !mn->mn_skipinitscan) + if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan) mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT); mm->mm_display_name(mm, buf, sizeof(buf)); diff --git a/src/input/mpegts/mpegts_network_scan.c b/src/input/mpegts/mpegts_network_scan.c index 018041b7..d483e99d 100644 --- a/src/input/mpegts/mpegts_network_scan.c +++ b/src/input/mpegts/mpegts_network_scan.c @@ -34,10 +34,18 @@ gtimer_t mpegts_network_scan_timer; // Timer for activity static void mpegts_network_scan_timer_cb ( void *p ); +/* Notify */ +static void +mpegts_network_scan_notify ( mpegts_mux_t *mm ) +{ + idnode_updated(&mm->mm_id); + idnode_updated(&mm->mm_network->mn_id); +} + static int mm_cmp ( mpegts_mux_t *a, mpegts_mux_t *b ) { - return a->mm_scan_weight - b->mm_scan_weight; + return b->mm_scan_weight - a->mm_scan_weight; } static void @@ -91,8 +99,12 @@ mpegts_network_scan_timer_cb ( void *p ) /* Failed */ TAILQ_REMOVE(&mpegts_network_scan_pend, mm, mm_scan_link); - mm->mm_scan_ok = 0; - mm->mm_scan_state = MM_SCAN_STATE_IDLE; + if (mm->mm_scan_result != MM_SCAN_FAIL) { + mm->mm_scan_result = MM_SCAN_FAIL; + mm->mm_config_save(mm); + } + mm->mm_scan_state = MM_SCAN_STATE_IDLE; + mpegts_network_scan_notify(mm); } /* Re-arm (backstop, most things will auto-rearm at point of next event @@ -109,7 +121,10 @@ mpegts_network_scan_timer_cb ( void *p ) void mpegts_network_scan_mux_fail ( mpegts_mux_t *mm ) { - mm->mm_scan_ok = 0; + 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); } @@ -118,7 +133,10 @@ mpegts_network_scan_mux_fail ( mpegts_mux_t *mm ) void mpegts_network_scan_mux_done ( mpegts_mux_t *mm ) { - mm->mm_scan_ok = 1; + 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); } @@ -134,6 +152,9 @@ mpegts_network_scan_mux_timeout ( mpegts_mux_t *mm ) void 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); @@ -170,6 +191,7 @@ mpegts_network_scan_queue_del ( mpegts_mux_t *mm ) mm->mm_scan_state = MM_SCAN_STATE_IDLE; gtimer_disarm(&mm->mm_scan_timeout); mpegts_network_scan_timer_arm(0); + mpegts_network_scan_notify(mm); } void @@ -177,6 +199,8 @@ mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight ) { int reload = 0; + if (weight <= 0) return; + if (weight > mm->mm_scan_weight) { mm->mm_scan_weight = weight; reload = 1; @@ -197,6 +221,7 @@ mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight ) mm->mm_scan_state = MM_SCAN_STATE_PEND; TAILQ_INSERT_SORTED(&mpegts_network_scan_pend, mm, mm_scan_link, mm_cmp); mpegts_network_scan_timer_arm(0); + mpegts_network_scan_notify(mm); } /****************************************************************************** diff --git a/src/input/mpegts/mpegts_table.c b/src/input/mpegts/mpegts_table.c index 995ad023..e4896852 100644 --- a/src/input/mpegts/mpegts_table.c +++ b/src/input/mpegts/mpegts_table.c @@ -183,7 +183,7 @@ mpegts_table_add } else if (flags & MT_SKIPSUBS) { subscribe = 0; } else if (flags & MT_SCANSUBS) { - if (mm->mm_scan_ok) + if (mm->mm_scan_state == MM_SCAN_STATE_IDLE) subscribe = 0; } if (subscribe) {