From 88830ea78984ebe5ad3b100bc5487c61be727c08 Mon Sep 17 00:00:00 2001 From: alitvinov Date: Tue, 24 Jan 2017 15:29:23 +0300 Subject: [PATCH] 8168751: Two "Direct Clip" threads are created to play the same "AudioClip" object, what makes clip sound corrupted Reviewed-by: serb, amenkov --- .../sun/media/sound/DirectAudioDevice.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/share/classes/com/sun/media/sound/DirectAudioDevice.java b/src/share/classes/com/sun/media/sound/DirectAudioDevice.java index 698bac9f7..078b857e2 100644 --- a/src/share/classes/com/sun/media/sound/DirectAudioDevice.java +++ b/src/share/classes/com/sun/media/sound/DirectAudioDevice.java @@ -1017,15 +1017,15 @@ final class DirectAudioDevice extends AbstractMixer { private static final class DirectClip extends DirectDL implements Clip, Runnable, AutoClosingClip { - private Thread thread; - private byte[] audioData = null; - private int frameSize; // size of one frame in bytes - private int m_lengthInFrames; - private int loopCount; - private int clipBytePosition; // index in the audioData array at current playback - private int newFramePosition; // set in setFramePosition() - private int loopStartFrame; - private int loopEndFrame; // the last sample included in the loop + private volatile Thread thread; + private volatile byte[] audioData = null; + private volatile int frameSize; // size of one frame in bytes + private volatile int m_lengthInFrames; + private volatile int loopCount; + private volatile int clipBytePosition; // index in the audioData array at current playback + private volatile int newFramePosition; // set in setFramePosition() + private volatile int loopStartFrame; + private volatile int loopEndFrame; // the last sample included in the loop // auto closing clip support private boolean autoclosing = false; @@ -1355,7 +1355,8 @@ final class DirectAudioDevice extends AbstractMixer { // main playback loop public void run() { if (Printer.trace) Printer.trace(">>> DirectClip: run() threadID="+Thread.currentThread().getId()); - while (thread != null) { + Thread curThread = Thread.currentThread(); + while (thread == curThread) { // doIO is volatile, but we could check it, then get // pre-empted while another thread changes doIO and notifies, // before we wait (so we sleep in wait forever). @@ -1363,7 +1364,12 @@ final class DirectAudioDevice extends AbstractMixer { if (!doIO) { try { lock.wait(); - } catch(InterruptedException ie) {} + } catch(InterruptedException ie) { + } finally { + if (thread != curThread) { + break; + } + } } } while (doIO) { -- GitLab