Как воспроизводить файлы.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)
{
}
}