diff --git a/mythtv/libs/libmythtv/DeviceReadBuffer.cpp b/mythtv/libs/libmythtv/DeviceReadBuffer.cpp
index 0004437..2a08a0f 100644
--- a/mythtv/libs/libmythtv/DeviceReadBuffer.cpp
+++ b/mythtv/libs/libmythtv/DeviceReadBuffer.cpp
@@ -34,7 +34,7 @@ DeviceReadBuffer::DeviceReadBuffer(
 
       size(0),                      used(0),
       read_quanta(0),
-      dev_read_size(0),             min_read(0),
+      dev_read_size(0),             readThreshold(0),
 
       buffer(NULL),                 readPtr(NULL),
       writePtr(NULL),               endPtr(NULL),
@@ -95,7 +95,7 @@ bool DeviceReadBuffer::Setup(const QString &streamName, int streamfd,
     dev_read_size = read_quanta * (using_poll ? 256 : 48);
     dev_read_size = (deviceBufferSize) ?
         min(dev_read_size, (size_t)deviceBufferSize) : dev_read_size;
-    min_read      = read_quanta * 4;
+    readThreshold      = read_quanta * 128;
 
     buffer        = new unsigned char[size + dev_read_size];
     readPtr       = buffer;
@@ -358,9 +358,10 @@ void DeviceReadBuffer::run(void)
         size_t read_size = min(dev_read_size, unused);
 
         // if read_size > 0 do the read...
+        ssize_t len = 0;
         if (read_size)
         {
-            ssize_t len = read(_stream_fd, writePtr, read_size);
+            len = read(_stream_fd, writePtr, read_size);
             if (!CheckForErrors(len, read_size, errcnt))
             {
                 if (errcnt > 5)
@@ -374,6 +375,12 @@ void DeviceReadBuffer::run(void)
                 memcpy(buffer, endPtr, writePtr + len - endPtr);
             IncrWritePointer(len);
         }
+
+        // Slow down reading if not under load
+        if( len < int32_t(dev_read_size/2) )
+        {
+            usleep(1000);
+        }
     }
 
     ClosePipes();
@@ -612,7 +619,7 @@ bool DeviceReadBuffer::CheckForErrors(
  */
 uint DeviceReadBuffer::Read(unsigned char *buf, const uint count)
 {
-    uint avail = WaitForUsed(min(count, (uint)min_read), 500);
+    uint avail = WaitForUsed(min(count, (uint)readThreshold), 20);
     size_t cnt = min(count, avail);
 
     if (!cnt)
diff --git a/mythtv/libs/libmythtv/DeviceReadBuffer.h b/mythtv/libs/libmythtv/DeviceReadBuffer.h
index 9af61c9..9101c87 100644
--- a/mythtv/libs/libmythtv/DeviceReadBuffer.h
+++ b/mythtv/libs/libmythtv/DeviceReadBuffer.h
@@ -103,7 +103,7 @@ class DeviceReadBuffer : protected MThread
     size_t           used;
     size_t           read_quanta;
     size_t           dev_read_size;
-    size_t           min_read;
+    size_t           readThreshold;
     unsigned char   *buffer;
     unsigned char   *readPtr;
     unsigned char   *writePtr;
diff --git a/mythtv/libs/libmythtv/asistreamhandler.cpp b/mythtv/libs/libmythtv/asistreamhandler.cpp
index 6544874..9349211 100644
--- a/mythtv/libs/libmythtv/asistreamhandler.cpp
+++ b/mythtv/libs/libmythtv/asistreamhandler.cpp
@@ -206,12 +206,6 @@ void ASIStreamHandler::run(void)
             _error = true;
         }
 
-        if ((0 == len) || (-1 == len))
-        {
-            usleep(100);
-            continue;
-        }
-
         len += remainder;
 
         if (len < 10) // 10 bytes = 4 bytes TS header + 6 bytes PES header
diff --git a/mythtv/libs/libmythtv/dvbstreamhandler.cpp b/mythtv/libs/libmythtv/dvbstreamhandler.cpp
index f1f6369..bcc301a 100644
--- a/mythtv/libs/libmythtv/dvbstreamhandler.cpp
+++ b/mythtv/libs/libmythtv/dvbstreamhandler.cpp
@@ -238,12 +238,12 @@ void DVBStreamHandler::RunTS(void)
                 len = read(dvr_fd, &(buffer[remainder]),
                            buffer_size - remainder);
             }
-        }
 
-        if ((0 == len) || (-1 == len))
-        {
-            usleep(100);
-            continue;
+            if ((0 == len) || (-1 == len))
+            {
+                usleep(100);
+                continue;
+            }
         }
 
         len += remainder;
