]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Fix #1643 - dvb: close dvr device on each re-tune
authorAdam Sutton <dev@adamsutton.me.uk>
Fri, 25 Jan 2013 10:47:20 +0000 (10:47 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Tue, 26 Mar 2013 10:04:26 +0000 (10:04 +0000)
(cherry picked from commit 55ed28cb53307f77c7c767cd6f87f56b15951bcd)

src/dvb/dvb.h
src/dvb/dvb_adapter.c
src/dvb/dvb_fe.c

index b065467f48c1a14ee1335d71689e7a38d5ab768a..aaccd94600bc1ae077fbdc91361eb1ba0f519e7f 100644 (file)
@@ -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);
index 861c111788e1c2425d1d964a216445fc0a5eeb74..8b3878dc847d1e2e4cb941fc8725d19fc7d8dc31 100644 (file)
@@ -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);
 }
 
index 73a8cd0a1c1842ccc030a9b7651c91ee4203eceb..c21303e079d0de017a22f6732493335e97a31ad8 100644 (file)
@@ -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);