2012-04-10 2 views
3

Я, вероятно, подошел к этому неправильно, но мне нужно выяснить, как остановить цикл javax.sound.sampled клип. У меня 9 разных звуков. Я хочу, чтобы другой звук воспроизводился, когда пользователь нажимает кнопку увеличения амплитуды. В настоящий момент я вызываю метод playSound каждый раз, когда нажимают кнопку и он работает, однако это не останавливает звуки, которые уже играют. Звуки просто играют друг над другом.Закройте зацикленный javax.sound.sampled клип

Есть ли способ закрыть все существующие звуки, когда пользователь нажимает кнопку?

Вот мой PlaySound код:

public void playSound(){ 
    try { 
     audio = AudioSystem.getAudioInputStream(soundFile[activeSound]); 
     clip = AudioSystem.getClip(); 
     clip.open(audio); 
     clip.start(); 
     clip.loop(Clip.LOOP_CONTINUOUSLY);   
    } 

    catch (IOException ex){ 
     System.out.println("Sorry but there has been a problem reading your file."); 
     ex.printStackTrace(); 
    } 

    catch (UnsupportedAudioFileException ex1){ 
     System.out.println("Sorry but the audio file format you are using is not supported."); 
     ex1.printStackTrace(); 
    } 

    catch (LineUnavailableException ex2){ 
     System.out.println("Sorry but there are audio line problems."); 
     ex2.printStackTrace(); 
    } 
} 

Я был на этом в течение двух дней, и теперь это сводит меня с ума. Любая помощь приветствуется.

+0

Отличная обработка исключений. +1 Кроме того, добро пожаловать в SO. :) –

ответ

1

Вы хотите остановить воспроизведение всех существующих клипов. Это можно сделать, используя метод Dataline.stop(). Все, что вам нужно, это доступ ко всем существующим клипам. Ниже мое предложение. Обратите внимание, что я использую только одну ссылку для ссылки на текущий клип. Если у вас более одного, используйте ArrayList<Clip> вместо одного.

private Clip activeClip; 
public void playSound(){ 
    activeClip.stop(); 
    try { 
     audio = AudioSystem.getAudioInputStream(soundFile[activeSound]); 
     clip = AudioSystem.getClip(); 
     clip.open(audio); 
     clip.start(); 
     clip.loop(Clip.LOOP_CONTINUOUSLY); 
     activeClip = clip; 
    } 

    catch (IOException ex){ 
     System.out.println("Sorry but there has been a problem reading your file."); 
     ex.printStackTrace(); 
     } 

    catch (UnsupportedAudioFileException ex1){ 
     System.out.println("Sorry but the audio file format you are using is not  supported."); 
     ex1.printStackTrace(); 
    } 

    catch (LineUnavailableException ex2){ 
     System.out.println("Sorry but there are audio line problems."); 
     ex2.printStackTrace(); 
    } 
} 
+0

+1 но одно незначительное предложение. По вашему маршруту атрибут 'clip' может быть объявлен локально методу. –

+0

Не могли бы? У меня создалось впечатление, что продолжительность жизни переменной ограничена временем, которое требуется для завершения метода. – Honoki

+0

Спасибо, что ответили, но NetBeans сообщает об ошибке в файле activeClip.stop(); линия. Я полагаю, это потому, что в первый раз, когда метод вызван, нет клипа? –

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