From faee94bcb30e3c3f39dc476e18c0c506cf294215 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Thu, 27 Dec 2012 00:48:14 +0000 Subject: [PATCH] Fix #1459 - fix removal of all autorec recordings on startup There were 2 issues here: - recent changes meant that recordings were purged on every startup - long standing issue meant complete recordings were removed on removal of an autorec rule (which I don't think was intended). (cherry picked from commit d23f60b0311abc3d0b516bbd7ab5163e7cdfdc43) --- src/dvr/dvr.h | 2 ++ src/dvr/dvr_autorec.c | 20 ++++++++++++-------- src/dvr/dvr_db.c | 4 +--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index d814c524..977c403f 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -247,6 +247,8 @@ void dvr_config_delete(const char *name); void dvr_entry_notify(dvr_entry_t *de); +void dvr_entry_save(dvr_entry_t *de); + const char *dvr_entry_status(dvr_entry_t *de); const char *dvr_entry_schedstatus(dvr_entry_t *de); diff --git a/src/dvr/dvr_autorec.c b/src/dvr/dvr_autorec.c index 3924a0d3..0dd88353 100644 --- a/src/dvr/dvr_autorec.c +++ b/src/dvr/dvr_autorec.c @@ -42,10 +42,10 @@ static int dvr_autorec_in_init = 0; struct dvr_autorec_entry_queue autorec_entries; -static void dvr_autorec_changed(dvr_autorec_entry_t *dae); +static void dvr_autorec_changed(dvr_autorec_entry_t *dae, int purge); /** - * + * Unlink - and remove any unstarted */ static void dvr_autorec_purge_spawns(dvr_autorec_entry_t *dae) @@ -55,7 +55,10 @@ dvr_autorec_purge_spawns(dvr_autorec_entry_t *dae) while((de = LIST_FIRST(&dae->dae_spawns)) != NULL) { LIST_REMOVE(de, de_autorec_link); de->de_autorec = NULL; - dvr_entry_cancel(de); + if (de->de_sched_state == DVR_SCHEDULED) + dvr_entry_cancel(de); + else + dvr_entry_save(de); } } @@ -425,7 +428,7 @@ autorec_record_update(void *opaque, const char *id, htsmsg_t *values, dae->dae_serieslink->getref(dae->dae_serieslink); } if (!dvr_autorec_in_init) - dvr_autorec_changed(dae); + dvr_autorec_changed(dae, 1); return autorec_record_build(dae); } @@ -478,7 +481,7 @@ dvr_autorec_update(void) { dvr_autorec_entry_t *dae; TAILQ_FOREACH(dae, &autorec_entries, dae_link) { - dvr_autorec_changed(dae); + dvr_autorec_changed(dae, 0); } } @@ -539,7 +542,7 @@ _dvr_autorec_add(const char *config_name, htsmsg_add_u32(m, "reload", 1); notify_by_msg("autorec", m); - dvr_autorec_changed(dae); + dvr_autorec_changed(dae, 1); } void @@ -608,12 +611,13 @@ void dvr_autorec_check_serieslink(epg_serieslink_t *s) * */ static void -dvr_autorec_changed(dvr_autorec_entry_t *dae) +dvr_autorec_changed(dvr_autorec_entry_t *dae, int purge) { channel_t *ch; epg_broadcast_t *e; - dvr_autorec_purge_spawns(dae); + if (purge) + dvr_autorec_purge_spawns(dae); RB_FOREACH(ch, &channel_name_tree, ch_name_link) { RB_FOREACH(e, &ch->ch_epg_schedule, sched_link) { diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 07a7e6c4..c1d3e80a 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -37,8 +37,6 @@ int dvr_iov_max; struct dvr_config_list dvrconfigs; struct dvr_entry_list dvrentries; -static void dvr_entry_save(dvr_entry_t *de); - static void dvr_timer_expire(void *aux); static void dvr_timer_start_recording(void *aux); @@ -573,7 +571,7 @@ dvr_db_load(void) /** * */ -static void +void dvr_entry_save(dvr_entry_t *de) { htsmsg_t *m = htsmsg_create_map();