diff --git a/mythtv/libs/libmythtv/DeviceReadBuffer.cpp b/mythtv/libs/libmythtv/DeviceReadBuffer.cpp
index 2e1dfbc..f27c015 100644
--- a/mythtv/libs/libmythtv/DeviceReadBuffer.cpp
+++ b/mythtv/libs/libmythtv/DeviceReadBuffer.cpp
@@ -19,7 +19,7 @@ using namespace std;
 
 DeviceReadBuffer::DeviceReadBuffer(ReaderPausedCB *cb, bool use_poll)
     : videodevice(QString::null),   _stream_fd(-1),
-      readerPausedCB(cb),
+      readerPausedCB(cb),           thread(NULL),
 
       // Data for managing the device ringbuffer
       run(false),                   running(false),
@@ -35,7 +35,7 @@ DeviceReadBuffer::DeviceReadBuffer(ReaderPausedCB *cb, bool use_poll)
 
       // statistics
       max_used(0),                  avg_used(0),
-      avg_cnt(0),                   thread(NULL)
+      avg_cnt(0)
 {
 }
 
@@ -43,6 +43,8 @@ DeviceReadBuffer::~DeviceReadBuffer()
 {
     if (buffer)
         delete[] buffer;
+    if (thread)
+      Stop();
 }
 
 bool DeviceReadBuffer::Setup(const QString &streamName, int streamfd)
@@ -94,15 +96,14 @@ bool DeviceReadBuffer::Setup(const QString &streamName, int streamfd)
 
 void DeviceReadBuffer::Start(void)
 {
-    bool was_running;
+    QMutexLocker locker(&thread_lock);
 
     {
         QMutexLocker locker(&lock);
-        was_running = running;
         error = false;
     }
 
-    if (was_running)
+    if (thread)
     {
         VERBOSE(VB_IMPORTANT, LOC_ERR + "Start(): Already running.");
         SetRequestPause(false);
@@ -135,11 +136,11 @@ void DeviceReadBuffer::Reset(const QString &streamName, int streamfd)
 
 void DeviceReadBuffer::Stop(void)
 {
-    bool was_running = IsRunning();
-
-    if (!was_running)
+    QMutexLocker locker(&thread_lock);
+    if (!thread)
     {
         VERBOSE(VB_IMPORTANT, LOC + "Stop(): Not running.");
+        return;
     }
 
     {
@@ -147,10 +148,8 @@ void DeviceReadBuffer::Stop(void)
         run = false;
     }
 
-    if ( thread ) {
-      pthread_join(thread, NULL);
-      thread = (pthread_t)NULL;
-    }
+    pthread_join(thread, NULL);
+    thread = (pthread_t)NULL;
 }
 
 void DeviceReadBuffer::SetRequestPause(bool req)
@@ -491,6 +490,8 @@ uint DeviceReadBuffer::Read(unsigned char *buf, const uint count)
 }
 
 /** \fn DeviceReadBuffer::WaitForUnused(uint) const
+ *  \brief Return the amount of empty space in our internal buffer.
+ *         If there is less than what is needed, and something is emptying the buffer, wait.
  *  \param needed Number of bytes we want to write
  *  \return bytes available for writing
  */
@@ -517,6 +518,8 @@ uint DeviceReadBuffer::WaitForUnused(uint needed) const
 }
 
 /** \fn DeviceReadBuffer::WaitForUsed(uint) const
+ *  \brief Return the number of bytes available in our buffer.
+ *         Wait if another thread is actively  reading from the device.
  *  \param needed Number of bytes we want to read
  *  \return bytes available for reading
  */
diff --git a/mythtv/libs/libmythtv/DeviceReadBuffer.h b/mythtv/libs/libmythtv/DeviceReadBuffer.h
index 70fc262..84c1ba7 100644
--- a/mythtv/libs/libmythtv/DeviceReadBuffer.h
+++ b/mythtv/libs/libmythtv/DeviceReadBuffer.h
@@ -78,11 +78,12 @@ class DeviceReadBuffer
 
     ReaderPausedCB  *readerPausedCB;
     pthread_t        thread;
+    mutable QMutex   thread_lock;      // Manage access to thread variable
 
     // Data for managing the device ringbuffer
     mutable QMutex   lock;
-    bool             run;
-    bool             running;
+    bool             run;              // Set to false if we want the thread to stop
+    bool             running;          // If the read thread is running
     bool             eof;
     mutable bool     error;
     bool             request_pause;
