2014-05-11 5 views
0

Je souhaite créer un programme qui lit un certain fichier .wav lorsqu'un bouton donné est enfoncé. Par exemple, JButton b1, b2, b3 lit respectivement "Music1.wav", "Music2.wav" et "Music3.wav", mais un seul fichier wav ne peut être lu qu'à la fois. C'est ce que j'ai fait, qui a des problèmes avec l'arrêt du clip précédent et provoquant la lecture simultanée de deux ou plusieurs fichiers wav.Comment lire les fichiers .wav un à la fois?

... //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. 
} 

Répondre

1

Lorsque vous appelez playMusic1 (true) suivie playMusic1 (false), le second appel va créer une nouvelle instance d'un clip, puis arrêter la nouvelle instance. La première instance créée par le premier appel va continuer à jouer. Vous devriez vous accrocher à une référence au clip pour pouvoir l'arrêter. J'ai également pris la liberté d'enlever votre code en double.

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) 
    { 
    } 
} 
Questions connexes