< 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 >