From d5ad3f807d40256eaef88ceb3305e6fb41b7a4f5 Mon Sep 17 00:00:00 2001 From: Denny Date: Sun, 9 Jul 2017 08:21:07 -0400 Subject: [PATCH] Resolves issue where the tuner's buffer processor is logging that an overflow state has been cleared, caused by a clearing of the buffer when the tuner is being shutdown because there are no more channel consumers registered on the tuner. Tweaked buffer size limits and buffer handling to attempt to avoid overflow situations in the first place. Resolved an issue where the tuner processor was not deregistering correctly from the LIBUSB tuner processor during tuner shutdown. --- src/sample/OverflowableTransferQueue.java | 4 --- .../tuner/usb/USBTransferProcessor.java | 32 +++++++++++-------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/sample/OverflowableTransferQueue.java b/src/sample/OverflowableTransferQueue.java index f9c9c190..2deeca07 100644 --- a/src/sample/OverflowableTransferQueue.java +++ b/src/sample/OverflowableTransferQueue.java @@ -124,10 +124,6 @@ public class OverflowableTransferQueue mQueue.clear(); mCounter.set(0); mOverflow.set(false); - if(mOverflowListener != null) - { - mOverflowListener.sourceOverflow(false); - } } } } diff --git a/src/source/tuner/usb/USBTransferProcessor.java b/src/source/tuner/usb/USBTransferProcessor.java index aeb56bb9..7052db0c 100644 --- a/src/source/tuner/usb/USBTransferProcessor.java +++ b/src/source/tuner/usb/USBTransferProcessor.java @@ -54,7 +54,7 @@ public class USBTransferProcessor implements TransferCallback private static final int TRANSFER_BUFFER_POOL_SIZE = 16; //Maximum number of filled buffers for the blocking queue - private static final int FILLED_BUFFER_MAX_CAPACITY = 300; + private static final int FILLED_BUFFER_MAX_CAPACITY = 500; //Threshold for resetting buffer overflow condition private static final int FILLED_BUFFER_OVERFLOW_RESET_THRESHOLD = 100; @@ -200,7 +200,7 @@ public class USBTransferProcessor implements TransferCallback //Unregister from LibUSB processor so that it auto-stops LibUSB processing - TunerManager.LIBUSB_TRANSFER_PROCESSOR.registerTransferProcessor(this); + TunerManager.LIBUSB_TRANSFER_PROCESSOR.unregisterTransferProcessor(this); //Directly invoke the timeout handler to ensure that our cancelled transfer buffers are flushed. int result = LibUsb.handleEventsTimeoutCompleted(null, USB_TIMEOUT_MS, @@ -415,23 +415,27 @@ public class USBTransferProcessor implements TransferCallback @Override public void run() { - try - { - mFilledBuffers.drainTo(mBuffersToDispatch, 15); + mFilledBuffers.drainTo(mBuffersToDispatch, 50); - for(byte[] buffer : mBuffersToDispatch) + while(!mBuffersToDispatch.isEmpty()) + { + try { - float[] complexSamples = mSampleAdapter.convert(buffer); + for(byte[] buffer : mBuffersToDispatch) + { + float[] complexSamples = mSampleAdapter.convert(buffer); - mComplexBufferBroadcaster.broadcast(new ComplexBuffer(complexSamples)); + mComplexBufferBroadcaster.broadcast(new ComplexBuffer(complexSamples)); + } + } + catch(Exception e) + { + mLog.error(mDeviceName + " - error while dispatching complex IQ buffer samples", e); } - } - catch(Exception e) - { - mLog.error(mDeviceName + " - error while dispatching complex IQ buffer samples", e); - } - mBuffersToDispatch.clear(); + mBuffersToDispatch.clear(); + mFilledBuffers.drainTo(mBuffersToDispatch, 50); + } } } }