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;