mpegts: improvements to the reworked network scanner
This commit is contained in:
parent
a7c49bd9a1
commit
d29e0fe0b7
4 changed files with 112 additions and 20 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue