Как остановить клип/объект за определенное время?

Привет, Stackoverflow!

Таким образом, в основном, у меня есть два аудиоклипа, которые происходят в моей программе Java, и я хочу, чтобы один из них остановился в определенное время, а другой - в определенное время.

Я постараюсь объяснить код как можно лучше. http://pastebin.com/1zGdb30x Music.java

package testingground;


import java.io.IOException;
import java.net.URL;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;


public class Music {
 public void musictwo() {
 URL url;
 try {
 url = new URL("file:///D:/Yes/GUI/song.wav");
 Clip clip = AudioSystem.getClip();
 AudioInputStream ais = AudioSystem.
 getAudioInputStream( url );
 clip.open(ais);
 clip.loop(100);

 } catch (UnsupportedAudioFileException | IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (LineUnavailableException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }

 }


 public void musicone() {
 URL url;
 try {
 url = new URL("file:///D:/Yes/GUI/rival.wav");
 Clip clip = AudioSystem.getClip();
 AudioInputStream ais = AudioSystem.
 getAudioInputStream( url );
 clip.open(ais);
 clip.loop(100);
 } catch (UnsupportedAudioFileException | IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (LineUnavailableException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }

}

http://pastebin.com/nGm4DZfr Program.java

package testingground;

import javax.swing.JOptionPane;

public class Program {
 public static void main(String[] args) {
 System.out.println("The first song should play now!");
 Music a = new Music();
 a.musicone();
 System.out.println("The second song should play now!");
 a.musictwo();
 JOptionPane.showMessageDialog(null,"Press 'ok' to end the application.");
 }
}

В Music.java у меня есть звуковые файлы, и они являются только локальными.wav файлами, которые доступны только на моем компьютере. В program.java, выход - musicone и musictwo одновременно играют одновременно. Есть ли способ, чтобы мускус играл, останавливался, а затем играл в музыке?

Вещи, которые у меня есть tried- - Имейте оператор if и else в program.java для выполнения clip.stop(). Нет ошибок, это просто не сработало. - Имейте if и else boolean из program.java для выполнения clip.stop() в Music.java. Нет синтаксических ошибок, это просто не сработало.

1 ответ

Как я понимаю ваш вопрос, вы можете использовать LineListener.

Просто, например, вот класс, который проходит через List, воспроизводя следующий поток каждый раз, когда текущий завершается:

class Playlist implements LineListener {
 private final List<audioinputstream> list = new ArrayList<>();
 private Clip clip;
 private int next;

 @Override
 public void update(LineEvent evt) {
 if(evt.getType() == LineEvent.STOP) {
 try {
 playNext();
 } catch(LineUnavailableException | IOException e) {
 e.printStackTrace();
 }
 }
 }

 void enqueue(AudioInputStream ais) {
 synchronized(this) {
 list.add(ais);
 }
 }

 void playNext() throws LineUnavailableException, IOException {
 synchronized(this) {
 if(list.isEmpty()) {
 throw new IllegalStateException();
 }
 if(clip != null) {
 if(clip.isRunning()) clip.stop();
 if(clip.isOpen()) clip.close();
 }

 clip = AudioSystem.getClip();
 clip.addLineListener(listener);
 try {
 clip.open(list.get(next));
 } finally {
 next = (next + 1) % list.size();
 }
 clip.start();
 }
 }
}
</audioinputstream>

licensed under cc by-sa 3.0 with attribution.