2012-04-10 2 views
3

아마도이 방법은 잘못 접근하고 있지만 루핑 된 javax.sound.sampled 클립을 중지하는 방법을 찾아야합니다. 9 가지 소리가 난다. 사용자가 진폭 증가 버튼을 누르면 다른 소리가 재생되기를 원합니다. 지금은 버튼을 클릭 할 때마다 playSound 메서드를 호출하고 작동하지만 이미 재생중인 소리는 멈추지 않습니다. 소리가 서로 연주됩니다.루핑 javax.sound.sampled 클립 닫기

사용자가 버튼을 누를 때 기존 사운드를 모두 닫을 수 있습니까?

여기 내 꺼내, 코드입니다 :

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(); 선. 처음으로 메서드가 호출되면 클립이 재생되지 않기 때문입니다. –