From: Jaroslav Kysela Date: Thu, 2 Nov 2017 13:25:21 +0000 (+0100) Subject: epg: update the running state in sync with dvr update X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=517bc485d33f4d012a1d3a70730439f80ec56d3f;p=thirdparty%2Ftvheadend.git epg: update the running state in sync with dvr update --- diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 3547d582a..efbf852fd 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -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); diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index e591f46ee..e61553440 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -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), diff --git a/src/epg.c b/src/epg.c index c38f295b8..474c7e13b 100644 --- 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 diff --git a/src/epg.h b/src/epg.h index add1ab089..42ee1a146 100644 --- 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)); diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index 9add68ff9..5aecb4845 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -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) { } }