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);
/**
* 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),
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;
}
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);
}
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
*
*/
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;
/* ************************************************************************
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
/* 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));
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) {
}
}