]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
epg: update the running state in sync with dvr update
authorJaroslav Kysela <perex@perex.cz>
Thu, 2 Nov 2017 13:25:21 +0000 (14:25 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 3 Nov 2017 15:18:53 +0000 (16:18 +0100)
src/dvr/dvr.h
src/dvr/dvr_db.c
src/epg.c
src/epg.h
src/epggrab/module/eit.c

index 3547d582a7addae5f23dc388a551d528c2a5d34a..efbf852fdaf10e7da1d9a9a26f8890bb1bc3d803 100644 (file)
@@ -589,7 +589,7 @@ void dvr_event_removed(epg_broadcast_t *e);
 
 void dvr_event_updated(epg_broadcast_t *e);
 
-void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, epg_running_t running);
+void dvr_event_running(epg_broadcast_t *e, epg_running_t running);
 
 dvr_entry_t *dvr_entry_find_by_id(int id);
 
index e591f46ee3569c2c573639f0fc67b7f457097212..e6155344020d0e76e7c12e5b9d57555d6d25602c 100644 (file)
@@ -2294,13 +2294,13 @@ void dvr_event_updated(epg_broadcast_t *e)
 /**
  * Event running status is updated
  */
-void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, epg_running_t running)
+void dvr_event_running(epg_broadcast_t *e, epg_running_t running)
 {
   dvr_entry_t *de;
   const char *srcname;
   char ubuf[UUID_HEX_SIZE];
 
-  if (esrc != EPG_SOURCE_EIT || e->dvb_eid == 0 || e->channel == NULL)
+  if (e->dvb_eid == 0 || e->channel == NULL)
     return;
   tvhtrace(LS_DVR, "dvr event running check for %s on %s running %d",
            epg_broadcast_get_title(e, NULL),
index c38f295b83ce1c54367aa503aa2f65bd2946eaf0..474c7e13bf3517515b7280bec4335550dd11c580 100644 (file)
--- a/src/epg.c
+++ b/src/epg.c
@@ -1910,6 +1910,28 @@ static void _epg_broadcast_destroy ( void *eo )
   free(ebc);
 }
 
+static void _epg_broadcast_update_running ( epg_broadcast_t *broadcast )
+{
+  channel_t *ch;
+  epg_broadcast_t *now;
+  int orunning = broadcast->running;
+
+  broadcast->running = broadcast->update_running;
+  ch = broadcast->channel;
+  now = ch ? ch->ch_epg_now : NULL;
+  if (broadcast->update_running == EPG_RUNNING_STOP) {
+    if (now == broadcast && orunning == broadcast->running)
+      broadcast->stop = gclk() - 1;
+  } else {
+    if (broadcast != now && now) {
+      now->running = EPG_RUNNING_STOP;
+      dvr_event_running(now, EPG_RUNNING_STOP);
+    }
+  }
+  dvr_event_running(broadcast, broadcast->running);
+  broadcast->update_running = EPG_RUNNING_NOTSET;
+}
+
 static void _epg_broadcast_updated ( void *eo )
 {
   epg_broadcast_t *ebc = eo;
@@ -1929,6 +1951,8 @@ static void _epg_broadcast_updated ( void *eo )
   }
   if (ebc->channel) {
     dvr_event_updated(eo);
+    if (ebc->update_running != EPG_RUNNING_NOTSET)
+      _epg_broadcast_update_running(ebc);
     dvr_autorec_check_event(eo);
     channel_event_updated(eo);
   }
@@ -2059,26 +2083,12 @@ epg_broadcast_t *epg_broadcast_find_by_eid ( channel_t *ch, uint16_t eid )
   return NULL;
 }
 
-void epg_broadcast_notify_running
-  ( epg_broadcast_t *broadcast, epg_source_t esrc, epg_running_t running )
+int epg_broadcast_set_running
+  ( epg_broadcast_t *broadcast, epg_running_t running )
 {
-  channel_t *ch;
-  epg_broadcast_t *now;
-  int orunning = broadcast->running;
-
-  broadcast->running = running;
-  ch = broadcast->channel;
-  now = ch ? ch->ch_epg_now : NULL;
-  if (running == EPG_RUNNING_STOP) {
-    if (now == broadcast && orunning == broadcast->running)
-      broadcast->stop = gclk() - 1;
-  } else {
-    if (broadcast != now && now) {
-      now->running = EPG_RUNNING_STOP;
-      dvr_event_running(now, esrc, EPG_RUNNING_STOP);
-    }
-  }
-  dvr_event_running(broadcast, esrc, running);
+  int save = running != broadcast->running;
+  broadcast->update_running = running;
+  return save;
 }
 
 int epg_broadcast_set_episode 
index add1ab08968e0d592488b542685b4dfbe0cca8fe..42ee1a14622280c2b1459c53ae1a4b24487b16dd 100644 (file)
--- a/src/epg.h
+++ b/src/epg.h
@@ -62,15 +62,11 @@ extern int epg_in_load;
  *
  */
 typedef enum {
-  EPG_SOURCE_NONE   = 0,
-  EPG_SOURCE_EIT    = 1,
-} epg_source_t;
-
-typedef enum {
-  EPG_RUNNING_STOP  = 0,
-  EPG_RUNNING_WARM  = 1,
-  EPG_RUNNING_NOW   = 2,
-  EPG_RUNNING_PAUSE = 3,
+  EPG_RUNNING_NOTSET = 0,
+  EPG_RUNNING_STOP   = 1,
+  EPG_RUNNING_WARM   = 2,
+  EPG_RUNNING_NOW    = 3,
+  EPG_RUNNING_PAUSE  = 4,
 } epg_running_t;
 
 /* ************************************************************************
@@ -520,6 +516,7 @@ struct epg_broadcast
   uint8_t                    is_new;           ///< New series / file premiere
   uint8_t                    is_repeat;        ///< Repeat screening
   uint8_t                    running;          ///< EPG running flag
+  uint8_t                    update_running;   ///< new EPG running flag
 
   /* Broadcast level text */
   lang_str_t                *summary;          ///< Summary
@@ -556,13 +553,14 @@ int epg_broadcast_change_finish( epg_broadcast_t *b, uint32_t changed, int merge
 /* Special */
 epg_broadcast_t *epg_broadcast_clone
   ( struct channel *channel, epg_broadcast_t *src, int *save );
-void epg_broadcast_notify_running
-  ( epg_broadcast_t *b, epg_source_t esrc, epg_running_t running );
 
 /* Mutators */
 int epg_broadcast_set_dvb_eid
   ( epg_broadcast_t *b, uint16_t dvb_eid, uint32_t *changed )
   __attribute__((warn_unused_result));
+int epg_broadcast_set_running
+  ( epg_broadcast_t *b, epg_running_t running )
+  __attribute__((warn_unused_result));
 int epg_broadcast_set_episode
   ( epg_broadcast_t *b, epg_episode_t *e, uint32_t *changed )
   __attribute__((warn_unused_result));
index 9add68ff9e2edccc44579ea976b6a9b8fb1a8460..5aecb48457d004d19d5182be34bea0a35049a916 100644 (file)
@@ -746,7 +746,7 @@ tidy:
       case 4:  run = EPG_RUNNING_NOW;   break;
       default: run = EPG_RUNNING_STOP;  break;
       }
-      epg_broadcast_notify_running(ebc, EPG_SOURCE_EIT, run);
+      *save |= epg_broadcast_set_running(ebc, run);
     } else if (sect == 1 && running != 2 && running != 3 && running != 4) {
     }
   }