< prev index next >
src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDevice.java
Print this page
@@ -1003,11 +1003,11 @@
* This clip is realized in software only
*/
private static final class DirectClip extends DirectDL
implements Clip, Runnable, AutoClosingClip {
- private Thread thread;
+ private volatile 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
@@ -1343,19 +1343,25 @@
// main playback loop
@Override
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).
synchronized(lock) {
if (!doIO) {
try {
lock.wait();
- } catch(InterruptedException ie) {}
+ } catch(InterruptedException ie) {
+ } finally {
+ if (thread != curThread) {
+ break;
+ }
+ }
}
}
while (doIO) {
if (newFramePosition >= 0) {
clipBytePosition = newFramePosition * frameSize;
< prev index next >