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
{
* 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;
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 =
.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",
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));
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
/* 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
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);
}
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);
}
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);
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
{
int reload = 0;
+ if (weight <= 0) return;
+
if (weight > mm->mm_scan_weight) {
mm->mm_scan_weight = weight;
reload = 1;
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);
}
/******************************************************************************
} 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) {