Почему я не могу использовать многопоточность для воспроизведения файла WAV? - PullRequest
1 голос
/ 17 февраля 2020

// Этот класс AudioTest должен использовать клип для воспроизведения музыки c

    import java.io.IOException;
    import javax.sound.sampled.*;

    class AudioTest {

        public void AudioPlay() {

        ClassLoader classLoader = 

Thread.currentThread().getContextClassLoader();

        try{
          Clip clip = AudioSystem.getClip();
          AudioInputStream inputStream = 
AudioSystem.getAudioInputStream(
classLoader.getResourceAsStream("audio1.wav"));

           clip.open(inputStream);
           clip.start();
           while (!clip.isRunning())
               Thread.sleep(10);
           while (clip.isRunning())
               Thread.sleep(10);
           clip.close();
          } catch (Exception e)
            {
             System.out.println("Something failed");
            }
        //to see if the sound is finished playing 
        System.out.println("done");
        } 
    }

public class Test11 {

       public static void main(String[] args)
       throws IOException
       {
        AudioTest au1 = new AudioTest();
        au1.AudioPlay();
       }

    }

// Приведенный выше класс Test11 отлично работает при воспроизведении файла .wav musi c. Но в классе Test15 я поместил этот файл вместе с другим потоком и выполнил его, он обнаружил сообщение «Something filed» для воспроизведения файла audio1.wav musi c.

// Многопоточное кодирование, Test15 , перечислены ниже:

    import java.io.IOException;
    import javax.sound.sampled.*;

// Следующий класс AudioTest точно такой же, как и в предыдущем кодировании

    class AudioTest {

      public void AudioPlay() {

        ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
        try{
              Clip clip = AudioSystem.getClip();
              AudioInputStream inputStream = 
              AudioSystem.getAudioInputStream(
              classLoader.getResourceAsStream(
              "audio1.wav"));
              clip.open(inputStream);
              clip.start();
              while (!clip.isRunning())
                      Thread.sleep(0);
              while (clip.isRunning())
                      Thread.sleep(0);
              clip.close();
            } catch (Exception e)
              {
               System.out.println("something failed");
              }

        System.out.println("done"); 
        }
    }

    class ThreadDemo extends Thread {
       private Thread t;
       private String threadName;

       ThreadDemo( String name) {
          threadName = name;
          System.out.println("Creating " +  threadName );
       }

       public void run() {
         //System.out.println("Running " +  threadName );
       try {
           if (threadName == "Thread-1") {
               System.out.println("Thread-1 is been started.");  
           // Start to play .wav file here
           AudioTest au1 = new AudioTest();
                au1.AudioPlay();
           }  
           else if (threadName == "Thread-2") {
               for (int i = 0; i < 100; i ++) {
                   System.out.println(i + ": " +  threadName + " is been executed."); 
               }
           }
      }catch (Exception e) {
         System.out.println("Thread " +  threadName + " failed.");
      }
   }

   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class Test15 {
   public static void main(String args[]) throws IOException
   {
      ThreadDemo T1 = new ThreadDemo("Thread-1");
      T1.start();

      ThreadDemo T2 = new ThreadDemo("Thread-2");
      T2.start();
   }   
 }

// Вышеприведенный класс Test15 может быть запущен, но Thread -1 можно было запустить только без воспроизведения музыки c и «что-то не получилось». показал. Похоже, что Thread-2 работает нормально.

// Моя конечная цель - показать движущуюся партитуру, сопровождаемую соответствующими музыками c, audio.wav. Если Thread-1 в Test15 работает, тогда я добавлю код подвижной оценки как Thread-2 в мой код. Если вам интересно, я могу выслать вам эту кодировку движущихся очков в Stackoverflow или по электронной почте: dienfoonwu@gmail.com

...