diff --git a/.idea/dictionaries/denny.xml b/.idea/dictionaries/denny.xml index 24e59925..7f72f826 100644 --- a/.idea/dictionaries/denny.xml +++ b/.idea/dictionaries/denny.xml @@ -7,6 +7,7 @@ fleetsync icecast ident + overflowable polyphase remez samplerate diff --git a/src/sample/OverflowableTransferQueue.java b/src/sample/OverflowableTransferQueue.java index 24f4b949..d70308ca 100644 --- a/src/sample/OverflowableTransferQueue.java +++ b/src/sample/OverflowableTransferQueue.java @@ -18,20 +18,27 @@ ******************************************************************************/ package sample; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import source.tuner.TunerChannelSource; + import java.util.Collection; import java.util.concurrent.LinkedTransferQueue; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; public class OverflowableTransferQueue { + private final static Logger mLog = LoggerFactory.getLogger(OverflowableTransferQueue.class); + public enum State {NORMAL, OVERFLOW}; private Listener mStateListener; private LinkedTransferQueue mQueue = new LinkedTransferQueue(); private AtomicInteger mCounter = new AtomicInteger(); + private AtomicBoolean mOverflow = new AtomicBoolean(); private int mMaximumSize; private int mResetThreshold; - private boolean mOverflow = false; /** * Concurrent transfer queue that couples a higher-throughput linked transfer queue with an atomic integer for @@ -53,7 +60,7 @@ public class OverflowableTransferQueue */ public void offer(E e) { - if(!mOverflow) + if(!mOverflow.get()) { mQueue.offer(e); @@ -73,14 +80,16 @@ public class OverflowableTransferQueue { int drainCount = mQueue.drainTo(collection, maxElements); - if(drainCount > 0) - { - int size = mCounter.addAndGet(-drainCount); + int size = mCounter.addAndGet(-drainCount); - if(mOverflow && size <= mResetThreshold) - { - setOverflow(false); - } + if(mOverflow.get()) + { + mLog.debug("Overflow - current size:" + size + " threshold:" + mResetThreshold); + } + + if(mOverflow.get() && size <= mResetThreshold) + { + setOverflow(false); } return drainCount; @@ -100,7 +109,7 @@ public class OverflowableTransferQueue */ public State getState() { - return mOverflow ? State.OVERFLOW : State.NORMAL; + return mOverflow.get() ? State.OVERFLOW : State.NORMAL; } /** @@ -108,11 +117,12 @@ public class OverflowableTransferQueue */ private void setOverflow(boolean overflow) { - mOverflow = overflow; - - if(mStateListener != null) + if(mOverflow.compareAndSet(!overflow, overflow)) { - mStateListener.receive(getState()); + if(mStateListener != null) + { + mStateListener.receive(overflow ? State.OVERFLOW : State.NORMAL); + } } } @@ -125,7 +135,7 @@ public class OverflowableTransferQueue { mQueue.clear(); mCounter.set(0); - mOverflow = false; + mOverflow.set(false); } } } diff --git a/src/source/tuner/TunerChannelSource.java b/src/source/tuner/TunerChannelSource.java index c50fd267..369b6079 100644 --- a/src/source/tuner/TunerChannelSource.java +++ b/src/source/tuner/TunerChannelSource.java @@ -51,7 +51,7 @@ public class TunerChannelSource extends ComplexSource implements IFrequencyChang private static final int BUFFER_MAX_CAPACITY = 300; //Threshold for resetting buffer overflow condition - private static final int BUFFER_OVERFLOW_RESET_THRESHOLD = 200; + private static final int BUFFER_OVERFLOW_RESET_THRESHOLD = 100; private static int CHANNEL_RATE = 48000; private static int CHANNEL_PASS_FREQUENCY = 12000; @@ -108,11 +108,11 @@ public class TunerChannelSource extends ComplexSource implements IFrequencyChang { if(state == OverflowableTransferQueue.State.NORMAL) { - mLog.debug("Channel [" + mTunerFrequency + "] buffer overflow - temporary pause until processing catches up"); + mLog.debug("Channel [" + mTunerChannel.getFrequency() + "] buffer overflow - temporary pause until processing catches up"); } else { - mLog.debug("Channel [" + mTunerFrequency + "] buffer overflow cleared - resuming normal processing"); + mLog.debug("Channel [" + mTunerChannel.getFrequency() + "] buffer overflow cleared - resuming normal processing"); } } }); diff --git a/src/source/tuner/usb/USBTransferProcessor.java b/src/source/tuner/usb/USBTransferProcessor.java index 053250f3..5039a0d4 100644 --- a/src/source/tuner/usb/USBTransferProcessor.java +++ b/src/source/tuner/usb/USBTransferProcessor.java @@ -56,7 +56,7 @@ public class USBTransferProcessor implements TransferCallback private static final int FILLED_BUFFER_MAX_CAPACITY = 300; //Threshold for resetting buffer overflow condition - private static final int FILLED_BUFFER_OVERFLOW_RESET_THRESHOLD = 200; + private static final int FILLED_BUFFER_OVERFLOW_RESET_THRESHOLD = 100; private String mDeviceName;