From f470226eb7345771ff8015f399fe7d91ebc2b740 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Fri, 25 Jan 2013 10:47:20 +0000 Subject: [PATCH] Fix #1643 - dvb: close dvr device on each re-tune (cherry picked from commit 55ed28cb53307f77c7c767cd6f87f56b15951bcd) --- src/dvb/dvb.h | 2 ++ src/dvb/dvb_adapter.c | 30 ++++++++++++++++++------------ src/dvb/dvb_fe.c | 1 + 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index b065467f..aaccd946 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -346,6 +346,8 @@ void dvb_adapter_start (th_dvb_adapter_t *tda); void dvb_adapter_stop (th_dvb_adapter_t *tda); +void dvb_adapter_stop_dvr (th_dvb_adapter_t *tda); + void dvb_adapter_set_displayname(th_dvb_adapter_t *tda, const char *s); void dvb_adapter_set_enabled(th_dvb_adapter_t *tda, int on); diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index 861c1117..8b3878dc 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -715,6 +715,22 @@ dvb_adapter_start ( th_dvb_adapter_t *tda ) } } +void +dvb_adapter_stop_dvr ( th_dvb_adapter_t *tda ) +{ + /* Stop DVR thread */ + if (tda->tda_dvr_pipe.rd != -1) { + tvhlog(LOG_DEBUG, "dvb", "%s stopping thread", tda->tda_rootpath); + int err = tvh_write(tda->tda_dvr_pipe.wr, "", 1); + assert(!err); + pthread_join(tda->tda_dvr_thread, NULL); + close(tda->tda_dvr_pipe.rd); + close(tda->tda_dvr_pipe.wr); + tda->tda_dvr_pipe.rd = -1; + tvhlog(LOG_DEBUG, "dvb", "%s stopped thread", tda->tda_rootpath); + } +} + void dvb_adapter_stop ( th_dvb_adapter_t *tda ) { @@ -731,18 +747,8 @@ dvb_adapter_stop ( th_dvb_adapter_t *tda ) tda->tda_fe_fd = -1; } - /* Stop DVR thread */ - if (tda->tda_dvr_pipe.rd != -1) { - tvhlog(LOG_DEBUG, "dvb", "%s stopping thread", tda->tda_rootpath); - int err = tvh_write(tda->tda_dvr_pipe.wr, "", 1); - assert(!err); - pthread_join(tda->tda_dvr_thread, NULL); - close(tda->tda_dvr_pipe.rd); - close(tda->tda_dvr_pipe.wr); - tda->tda_dvr_pipe.rd = -1; - tvhlog(LOG_DEBUG, "dvb", "%s stopped thread", tda->tda_rootpath); - } - + dvb_adapter_stop_dvr(tda); + dvb_adapter_notify(tda); } diff --git a/src/dvb/dvb_fe.c b/src/dvb/dvb_fe.c index 73a8cd0a..c21303e0 100644 --- a/src/dvb/dvb_fe.c +++ b/src/dvb/dvb_fe.c @@ -285,6 +285,7 @@ dvb_fe_stop(th_dvb_mux_instance_t *tdmi, int retune) dvb_mux_save(tdmi); } + dvb_adapter_stop_dvr(tda); dvb_table_flush_all(tdmi); assert(tdmi->tdmi_scan_queue == NULL);