From 2faaa93785f25070fbfbcaf88c423eddd48b8b4f Mon Sep 17 00:00:00 2001 From: Denny Date: Sun, 22 Jan 2017 07:20:24 -0500 Subject: [PATCH] #111 resolves issue with probable thread contention on temporary streamed recording queue management that was causing processing thread backups and memory issues. Audio broadcaster was originally in this configuration but was changed to account for a potential issue where recordings could be streamed out of sequence if they occurred at the same time. Reverted queue type back to a more efficient FIFO linked transfer queue to minimize queue contention. --- src/audio/broadcast/AudioBroadcaster.java | 29 +++++++---------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/src/audio/broadcast/AudioBroadcaster.java b/src/audio/broadcast/AudioBroadcaster.java index 877543fc..8644e4da 100644 --- a/src/audio/broadcast/AudioBroadcaster.java +++ b/src/audio/broadcast/AudioBroadcaster.java @@ -28,9 +28,8 @@ import sample.Listener; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.file.Files; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.Queue; +import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -45,7 +44,7 @@ public abstract class AudioBroadcaster implements Listener private ScheduledFuture mScheduledTask; private RecordingQueueProcessor mRecordingQueueProcessor = new RecordingQueueProcessor(); - private List mAudioRecordingQueue = new CopyOnWriteArrayList<>(); + private Queue mAudioRecordingQueue = new LinkedTransferQueue<>(); private ISilenceGenerator mSilenceGenerator; @@ -197,7 +196,7 @@ public abstract class AudioBroadcaster implements Listener { if(connected()) { - mAudioRecordingQueue.add(recording); + mAudioRecordingQueue.offer(recording); broadcast(new BroadcastEvent(this, BroadcastEvent.Event.BROADCASTER_QUEUE_CHANGE)); } } @@ -261,7 +260,7 @@ public abstract class AudioBroadcaster implements Listener { try { - AudioRecording recording = mAudioRecordingQueue.get(0); + AudioRecording recording = mAudioRecordingQueue.remove(); recording.removePendingReplay(); } catch(Exception e) @@ -397,24 +396,12 @@ public abstract class AudioBroadcaster implements Listener mInputStream = null; - AudioRecording nextRecording = null; - - //Find the recording with the earliest start time - Iterator it = mAudioRecordingQueue.iterator(); - - while(it.hasNext()) - { - AudioRecording recording = it.next(); - - if(nextRecording == null || (recording.getStartTime() < nextRecording.getStartTime())) - { - nextRecording = recording; - } - } + //Peek at the next recording but don't remove it from the queue yet, so we can inspect the delay time + AudioRecording nextRecording = mAudioRecordingQueue.peek(); if(nextRecording != null && nextRecording.getStartTime() + mDelay <= System.currentTimeMillis()) { - mAudioRecordingQueue.remove(nextRecording); + nextRecording = mAudioRecordingQueue.remove(); try {