]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mux scheduler: add restart flag
authorJaroslav Kysela <perex@perex.cz>
Thu, 6 Oct 2016 08:30:44 +0000 (10:30 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 6 Oct 2016 08:30:44 +0000 (10:30 +0200)
src/input/mpegts/mpegts_mux_sched.c
src/input/mpegts/mpegts_mux_sched.h

index 640a078bc858eccc7581b98f38a8ec5bd6f76c99..7b7a95820f560a22fa16629b353ea0138a410cbb 100644 (file)
@@ -35,7 +35,7 @@ mpegts_mux_sched_list_t mpegts_mux_sched_all;
 static void
 mpegts_mux_sched_set_timer ( mpegts_mux_sched_t *mms )
 {
-  /* Upate timer */
+  /* Update timer */
   if (!mms->mms_enabled) {
     if (mms->mms_sub)
       subscription_unsubscribe(mms->mms_sub, UNSUBSCRIBE_FINAL);
@@ -50,9 +50,9 @@ mpegts_mux_sched_set_timer ( mpegts_mux_sched_t *mms )
                      mms->mms_timeout);
     }
   } else {
-    time_t now, nxt;
-    time(&now);
-    if (!cron_next(&mms->mms_cronjob, now, &nxt)) {
+    time_t nxt;
+    if (!cron_next(&mms->mms_cronjob, gclk(), &nxt)) {
+      mms->mms_start = nxt;
       gtimer_arm_absn(&mms->mms_timer, mpegts_mux_sched_timer, mms, nxt);
     }
   }
@@ -151,7 +151,7 @@ const idclass_t mpegts_mux_sched_class =
       .type     = PT_STR,
       .id       = "cron",
       .name     = N_("Cron"),
-      .desc     = N_("Schedule frequency (in Cron format)."),
+      .desc     = N_("Schedule frequency (in cron format)."),
       .doc      = prop_doc_cron,
       .off      = offsetof(mpegts_mux_sched_t, mms_cronstr),
       .set      = mpegts_mux_sched_class_cron_set,
@@ -159,11 +159,18 @@ const idclass_t mpegts_mux_sched_class =
     {
       .type     = PT_INT,
       .id       = "timeout",
-      .name     = N_("Timout (secs)"),
+      .name     = N_("Timeout (secs)"),
       .desc     = N_("The length of time (in seconds) to play the mux "
-                     "for. 1 hour = 3600."),
+                     "(1 hour = 3600)."),
       .off      = offsetof(mpegts_mux_sched_t, mms_timeout),
     },
+    {
+      .type     = PT_BOOL,
+      .id       = "restart",
+      .name     = N_("Restart"),
+      .desc     = N_("Restart when the subscription is overriden (in then timeout time window)."),
+      .off      = offsetof(mpegts_mux_sched_t, mms_restart),
+    },
     {
     },
   }
@@ -210,7 +217,7 @@ mpegts_mux_sched_timer ( void *p )
 {
   mpegts_mux_t *mm;
   mpegts_mux_sched_t *mms = p;
-  time_t now, nxt;
+  time_t nxt;
 
   /* Not enabled (shouldn't be running) */
   if (!mms->mms_enabled)
@@ -227,9 +234,6 @@ mpegts_mux_sched_timer ( void *p )
     return;
   }
 
-  /* Current time */
-  time(&now);
-
   /* Start sub */
   if (!mms->mms_active) {
     assert(mms->mms_sub == NULL);
@@ -266,13 +270,21 @@ mpegts_mux_sched_timer ( void *p )
     }
     mms->mms_active = 0;
 
+    if (mms->mms_restart &&
+        (mms->mms_timeout <= 0 ||
+         mms->mms_start + mms->mms_timeout < gclk() - 60)) {
+      gtimer_arm_rel(&mms->mms_timer, mpegts_mux_sched_timer, mms, 15);
+      return;
+    }
+
     /* Find next */
-    if (cron_next(&mms->mms_cronjob, now, &nxt)) {
+    if (cron_next(&mms->mms_cronjob, gclk(), &nxt)) {
       tvherror(LS_MUXSCHED, "failed to find next event");
       return;
     }
 
     /* Timer */
+    mms->mms_start = nxt;
     gtimer_arm_absn(&mms->mms_timer, mpegts_mux_sched_timer, mms, nxt);
   }
 }
index 97d01ed49ba7dcd25f37f54e21aadbb744a032e4..b5e664f08c83949c913ddb46d82858b851fbb541 100644 (file)
@@ -47,12 +47,14 @@ typedef struct mpegts_mux_sched
   char           *mms_mux;      ///< Mux UUID
   char           *mms_creator;  ///< Creator of entry
   int             mms_timeout;  ///< Timeout (in seconds)
+  int             mms_restart;  ///< Restart subscription when overriden
   int             mms_weight;   ///< Weighting
 
   /*
    * Cron handling
    */
   int             mms_active;   ///< Subscription is active
+  time_t          mms_start;    ///< Start time
   gtimer_t        mms_timer;    ///< Timer for start/end
   cron_t          mms_cronjob;  ///< Cron spec