Как воспроизводить файлы.wav по одному?

Я хочу создать программу, которая воспроизводит один определенный файл.wav при нажатии определенной кнопки. Например, JButton b1, b2, b3 пьесы "Music1.wav", "Music2.wav", а также "Music3.wav" соответственно, но только один файл WAV может быть воспроизведен только за один раз. Это то, что я сделал, у меня проблемы с остановкой предыдущего клипа и одновременным воспроизведением двух или более файлов wav.

...   //imports the important stuff 
public class WAVButtons extends JFrame implements ActionListener
{
    private JButtons b1, b2, b3;
    private File[] sounds;

    public WAVButtons()
    {
         try
         {
               sounds = new File[]
                        {new File("Music1.wav"),
                         new File("Music2.wav"),
                         new File("Music3.wav")};
         }catch(Exception e)
         {
         }
         b1 = new JButton("play Music1");
         b2 = new JButton("play Music2");
         b3 = new JButton("play Music3");
         b1.addActionListener(this);
         b2.addActionListener(this);
         b3.addActionListener(this);
         ... //codes for GUI
    }

    public void actionPerformed(ActionEvent ae)
    {
         if(ae.getSource() == b1)
         { 
              playMusic1(true);
              playMusic2(false);
              playMusic3(false);
         }
         else if(ae.getSource() == b2)
         {
              playMusic1(false);
              playMusic2(true);
              playMusic3(false);
         }
         else if(ae.getSource() == b3)
         {
              playMusic1(false);
              playMusic2(false);
              playMusic3(true);
         }
    }

    public void playMusic1(boolean action)
    {
        try
        {
            AudioInputStream stream = AudioSystem.getAudioInputStream(sounds[0]);
            AudioFormat format = stream.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);
            Clip clip = (Clip)AudioSystem.getLine(info);
            clip.open(stream);
            if(action)
            {
                clip.start();
                clip.loop(Clip.LOOP_CONTINUOUSLY);
            }
            else
                clip.stop();
        }catch (Exception e)
        {
        }
    }

    ... //playMusic2() and playMusic3() looks exactly the same as playMusic1(), except that the
        //parameter of AudioSystem.getAudioInputStream() is sounds[1] and sounds[2], respectively.
}

1 ответ

Когда вы вызываете playMusic1(true), а затем playMusic1(false), второй вызов создаст новый экземпляр клипа, а затем остановит новый экземпляр. Первый экземпляр, созданный первым вызовом, будет продолжать играть. Вы должны придерживаться ссылки на клип, чтобы его можно было остановить. Я также позволил себе удалить ваш дубликат кода.

Clip clip;

public void actionPerformed(ActionEvent ae)
{
     if(ae.getSource() == b1)
     { 
          playMusic(0);
     }
     else if(ae.getSource() == b2)
     {
          playMusic(1);
     }
     else if(ae.getSource() == b3)
     {
          playMusic(2);
     }
}

public void playMusic(int clipNum)
{
    try
    {
        if (clip != null)
            clip.stop();

        if (action)
        { 
            AudioInputStream stream = AudioSystem.getAudioInputStream(sounds[clipNum]);
            AudioFormat format = stream.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);
            clip = (Clip)AudioSystem.getLine(info);
            clip.open(stream);
            clip.start();
            clip.loop(Clip.LOOP_CONTINUOUSLY);
        }
    }catch (Exception e)
    {
    }
}
Другие вопросы по тегам