]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvr: implement file size change notifications
authorJaroslav Kysela <perex@perex.cz>
Sun, 1 Feb 2015 16:36:26 +0000 (17:36 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 1 Feb 2015 16:36:26 +0000 (17:36 +0100)
src/dvr/dvr.h
src/dvr/dvr_rec.c

index 4a996c3e015424f49d684cb5094ab5e133d17c3c..dde45fc40aad29bd073486a6faf4490442acc4c6 100644 (file)
@@ -235,6 +235,11 @@ typedef struct dvr_entry {
   LIST_ENTRY(dvr_entry) de_inotify_link;
 #endif
 
+  /**
+   * Entry change notification timer
+   */
+  time_t de_last_notify;
+
 } dvr_entry_t;
 
 #define DVR_CH_NAME(e) ((e)->de_channel == NULL ? (e)->de_channel_name : channel_get_name((e)->de_channel))
index 92e120da0d438d44b62380598ebc23961bfca778..53682834e574fe4b613d96c4544b28a6f4e14f00 100644 (file)
@@ -309,6 +309,17 @@ dvr_rec_fatal_error(dvr_entry_t *de, const char *fmt, ...)
         de->de_filename ?: lang_str_get(de->de_title, NULL), msgbuf);
 }
 
+/**
+ *
+ */
+static void
+dvr_notify(dvr_entry_t *de, int now)
+{
+  if (now || de->de_last_notify + 5 < dispatch_clock) {
+    idnode_notify_simple(&de->de_id);
+    de->de_last_notify = dispatch_clock;
+  }
+}
 
 /**
  *
@@ -328,7 +339,7 @@ dvr_rec_set_state(dvr_entry_t *de, dvr_rs_state_t newstate, int error)
       de->de_errors++;
   }
   if (notify)
-    idnode_notify_simple(&de->de_id);
+    dvr_notify(de, 1);
 }
 
 /**
@@ -505,14 +516,14 @@ dvr_thread(void *aux)
         pb = ((th_pkt_t*)sm->sm_data)->pkt_payload;
         if (((th_pkt_t*)sm->sm_data)->pkt_err) {
           de->de_data_errors += ((th_pkt_t*)sm->sm_data)->pkt_err;
-          idnode_notify_simple(&de->de_id);
+          dvr_notify(de, 0);
         }
       }
       else if (sm->sm_type == SMT_MPEGTS) {
         pb = sm->sm_data;
         if (pb->pb_err) {
           de->de_data_errors += pb->pb_err;
-          idnode_notify_simple(&de->de_id);
+          dvr_notify(de, 0);
         }
       }
       if (pb)
@@ -543,6 +554,7 @@ dvr_thread(void *aux)
       if(started) {
        muxer_write_pkt(prch->prch_muxer, sm->sm_type, sm->sm_data);
        sm->sm_data = NULL;
+       dvr_notify(de, 0);
       }
       break;
 
@@ -551,6 +563,7 @@ dvr_thread(void *aux)
        dvr_rec_set_state(de, DVR_RS_RUNNING, 0);
        muxer_write_pkt(prch->prch_muxer, sm->sm_type, sm->sm_data);
        sm->sm_data = NULL;
+       dvr_notify(de, 0);
       }
       break;
 
@@ -729,6 +742,7 @@ dvr_thread_epilog(dvr_entry_t *de)
   muxer_close(prch->prch_muxer);
   muxer_destroy(prch->prch_muxer);
   prch->prch_muxer = NULL;
+  dvr_notify(de, 1);
 
   dvr_config_t *cfg = de->de_config;
   if(cfg && cfg->dvr_postproc && de->de_filename)