From b7c8bb78058dc1b0173f3678b3b50fe46413201b Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 6 Oct 2016 10:30:44 +0200 Subject: [PATCH] mux scheduler: add restart flag --- src/input/mpegts/mpegts_mux_sched.c | 36 +++++++++++++++++++---------- src/input/mpegts/mpegts_mux_sched.h | 2 ++ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/input/mpegts/mpegts_mux_sched.c b/src/input/mpegts/mpegts_mux_sched.c index 640a078bc..7b7a95820 100644 --- a/src/input/mpegts/mpegts_mux_sched.c +++ b/src/input/mpegts/mpegts_mux_sched.c @@ -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); } } diff --git a/src/input/mpegts/mpegts_mux_sched.h b/src/input/mpegts/mpegts_mux_sched.h index 97d01ed49..b5e664f08 100644 --- a/src/input/mpegts/mpegts_mux_sched.h +++ b/src/input/mpegts/mpegts_mux_sched.h @@ -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 -- 2.47.3