]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts: improvements to the reworked network scanner
authorAdam Sutton <dev@adamsutton.me.uk>
Thu, 5 Jun 2014 21:20:08 +0000 (22:20 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Mon, 9 Jun 2014 21:08:40 +0000 (22:08 +0100)
src/input/mpegts.h
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_network_scan.c
src/input/mpegts/mpegts_table.c

index 2fec1bf571b9b9570fd267ab1b47c79957309265..4ec7eda416cd0faf318fbc03bb202760e81208b7 100644 (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;
 
index 0856d90ace8debbea4bed463a1739151d24b3eb6..43e759f60daf0f7f27770b52baec92a2780e1406 100644 (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));
index 018041b750959679325cdec304268d2fd7be827a..d483e99d26384af61cda677d233b169430418406 100644 (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);
 }
 
 /******************************************************************************
index 995ad023b068cb60c317c4bef06f54e6fcc87157..e4896852a4c79de7da19fc5e60e4ac57876be982 100644 (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) {