mpegts: improvements to the reworked network scanner

This commit is contained in:
Adam Sutton 2014-06-05 22:20:08 +01:00
parent a7c49bd9a1
commit d29e0fe0b7
4 changed files with 112 additions and 20 deletions

View file

@ -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;

View file

@ -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));

View file

@ -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);
}
/******************************************************************************

View file

@ -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) {