2014-01-22 7 views
3

Мне нужно сделать аудиоплеер, который воспроизводит звуковой клип всякий раз, когда выполняется эта подпрограмма. Он также должен остановить предыдущий звуковой клип, прежде чем воспроизводить новый.Клип AudioSystem не прекращает воспроизведение, когда clip.stop(); запускается

Проблема, с которой я сталкиваюсь, заключается в том, что клип никогда не регистрируется как работающий. Ни один из двух операторов if, которые проверяют, будет ли он работать, когда-либо используются. Это означает, что клип останавливается только тогда, когда он закончен, и они могут перекрываться и разрушать программу.

Я бы использовал clip.stop(); в других подпрограммах, но он скажет мне, что символ «клип» не может быть найден. Я не знаю, как сделать его доступным для других подпрограмм.

Единственный способ получить clip.stop(); работать в этой подпрограмме - поместить ее прямо после клипа.start(); линия, которая останавливает клип сразу после запуска, поэтому его вообще не слышно.

Ниже приведена подпрограмма, которую я использую для воспроизведения аудиоклипов.

public void play(String filename){ 
    try { 
     Clip clip = AudioSystem.getClip(); 
     audFile = audDir + filename; 
     if (clip.isRunning()){ 
      System.out.println("Sounds playing 1"); 
      clip.stop(); 
     } 
     clip.open(AudioSystem.getAudioInputStream(new File(audFile))); 
     clip.start(); 
     if (clip.isRunning()){ 
      System.out.println("Sounds playing 2"); 
      clip.stop(); 
     } 
    } catch (Exception exc) { 
     exc.printStackTrace(System.out); 
    } 
} 
+0

Посмотрите здесь, может быть, это поможет или дать вам отслеживать решение: http://stackoverflow.com/questions/5833553/how-to-stop-a-music-clip-in-java –

+0

'Я бы использовал clip.stop(); в других подпрограммах, но он скажет мне, что символ «clip» не может быть найден ». Означает ли это, что ваш код дает вам ошибки? Если да, то где именно? –

ответ

2

Я хотел бы использовать clip.stop(); в других подпрограммах, но он скажет мне , что символ «clip» не найден. Я не знаю, как сделать это доступным для других подпрограмм.

Объявите частное поле клип в классе

private Clip clip; 

и установить его, когда вы получите его от AudioSystem.getClip().

/* 
* clip (local variable) is invisible from other methods 
*/ 
Clip clip = AudioSystem.getClip(); 
this.clip = clip; // `this.clip` is a field, it's visible from other methods 

Тогда вы можете получить доступ к нему из других методов («Подпрограмма» методы класса в Java).

Проблема, с которой я сталкиваюсь, заключается в том, что клип никогда не регистрируется как работающий.

Это не работает, когда вы звоните clip.isRunning(), но вы уверены, что это никогда не работает?

Вы не можете предположить, что clip.isRunning() возвращает true сразу после clip.start(). Механизм, являющийся асинхронным, может помочь зарегистрировать LineListener и прослушать событие START.

clip.start(); 
LineListener listener = new LineListener() { 
    public void update(LineEvent event) { 
    if (event.getType() == LineEvent.Type.START) { 
      /* 
      * here you are sure the clip is started 
      */ 
     } 
    } 
}; 
clip.addLineListener(listener); 
+0

Я все еще смущен. Я бы использовал что-то вроде 'this.clip.start();'/'this.clip.stop();' вместе с 'Clip clip = AudioSystem.getClip();' и 'this.clip = clip;'? – HewwoCraziness

+1

Да, вы бы. (Кстати, вам не нужно писать 'this.clip.start()' и 'this.clip.stop()', просто 'clip.start()' или 'clip.stop()' будет делать). – Bludzee

 Смежные вопросы

  • Нет связанных вопросов^_^