Come fermare una clip musicale in Java?

Sto lavorando con alcuni compagni di class in un gioco, abbiamo programmato tutto tranne la musica fino ad ora. La class music.java è pubblicata qui sotto.

Abbiamo un problema nel fermare il nostro suono, quindi ho bisogno di un modo per interrompere la riproduzione di questo clip in modo da poter avviare un’altra clip, in questo modo possiamo spostare la musica durante il gioco (come quando inizi una partita, la canzone dovrebbe essere diversa dal menu principale). Qualcuno può aiutarmi con questo problema?

Anche se riesco a distruggere l’object per crearne uno nuovo, se è una possibilità, sono disposto a farlo, ma non ho la minima idea di come farlo. Preferirei avere la possibilità di fermare il file di clip corrente e sostituirlo con uno nuovo.

package sound; import java.io.File; import java.io.IOException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; import javax.sound.sampled.FloatControl; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; public class Music implements LineListener, Runnable { private File soundFile; private Thread thread; private static Music player; private Music audio; private Clip clip; private boolean stoppen = false; /** * Private because of the singleton */ public Music() { } /** * Play a siren sound */ public void playSiren(String musicFileName) { audio = getPlayer(); audio.playSirenFile(musicFileName); } /** * Play the siren file */ private void playSirenFile(String musicFileName) { this.soundFile = new File("Music/"+musicFileName+".wav"); thread = new Thread(this); thread.setName("SoundPlayer"); thread.start(); } /** * Invoked when the thread kicks off */ public void run() { try { AudioInputStream stream = AudioSystem.getAudioInputStream(this.soundFile); AudioFormat format = stream.getFormat(); /** * we can't yet open the device for ALAW/ULAW playback, convert * ALAW/ULAW to PCM */ if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW)) { AudioFormat tmp = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), format.getSampleSizeInBits() * 2, format.getChannels(), format.getFrameSize() * 2, format.getFrameRate(), true); stream = AudioSystem.getAudioInputStream(tmp, stream); format = tmp; } DataLine.Info info = new DataLine.Info(Clip.class, stream .getFormat(), ((int) stream.getFrameLength() * format .getFrameSize())); this.clip = (Clip) AudioSystem.getLine(info); this.clip.addLineListener(this); this.clip.open(stream); this.clip.start(); try { thread.sleep(99); } catch (Exception e) { } while (clip.isActive() && thread != null) { try { thread.sleep(99); } catch (Exception e) { break; } } clip.loop(999999999); clip.drain(); } catch (UnsupportedAudioFileException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (LineUnavailableException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static Music getPlayer() { if (player == null) { player = new Music(); } return player; } public void update(LineEvent event) { } public void stopClip() { //TODO NEED HELP HERE } public void startClip() { //TODO need help here } public void volume(float volume) { //TODO NEED HELP HERE /* FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); gainControl.setValue(-50.0f); // Reduce volume IN DECIBELS clip.start(); */ } } 

Cose che potresti dover sapere:

Nel mio GuiController, creo un nuovo object Music, attraverso il metodo playSiren, do il mio nome della canzone, e poi viene eseguito automaticamente.

    Guarda nel metodo DataLine.stop() . Clip implementa DataLine .


    EG ClipControl.java

     import java.awt.event.*; import javax.swing.*; import javax.sound.sampled.*; import java.net.URL; class ClipControl { public static void main(String[] args) throws Exception { URL url = new URL("http://pscode.org/media/leftright.wav"); AudioInputStream ais = AudioSystem.getAudioInputStream(url); final Clip clip = AudioSystem.getClip(); clip.open( ais ); Runnable r = new Runnable() { public void run() { final JToggleButton startStop = new JToggleButton("Stop"); startStop.addActionListener( new ActionListener() { public void actionPerformsd(ActionEvent ae) { if (startStop.isSelected()) { clip.stop(); startStop.setText("Start"); } else { clip.loop(-1); clip.start(); startStop.setText("Stop"); } } } ); clip.loop(-1); JOptionPane.showMessageDialog(null, startStop); } }; SwingUtilities.invokeLater(r); } }