2014-12-15 2 views
0

Java에서 .wav 사운드를 재생 중입니다. 호출되는wav 재생시 Java 충돌 발생

package tools; 

import javax.sound.sampled.Clip; 
import javax.sound.sampled.LineEvent; 
import javax.sound.sampled.LineListener; 

public class ClipHandler implements LineListener { 
    private Clip clip; 

    public ClipHandler(Clip clip) { 
     this.clip = clip; 
     clip.addLineListener(this); 
    } 

    public void play() { 
     clip.start(); 
    } 

    public void update(LineEvent e) { 
     if (e.getType() == LineEvent.Type.STOP) { 
      clip.close(); 
     } 
    } 
} 

방법 : 나는 .wav 파일을 재생하려고 할 때

public static void play(String path) { 
    try { 
     URL soundUrl = SoundTools.class.getResource(path); 
     AudioInputStream stream = AudioSystem.getAudioInputStream(soundUrl); 
     AudioFormat format = stream.getFormat(); 
     DataLine.Info info = new DataLine.Info(Clip.class, format); 
     Clip clip = (Clip) AudioSystem.getLine(info); 
     clip.open(stream); 
     clip.start(); 
     new ClipHandler(clip).play(); 
    } 
    catch (Exception e) { 
     System.out.println(e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

문제가 발생 I는 다음과 같다 몇 가지 코드가 있습니다. 항상 처음에는 작동하지만 몇 번 전화를 걸어 (경로) 호출하면 게임이 완전히 멈추고 있습니다. 내가 아무 것도하지 못하게 할 것이다. 도움이 필요해! 그런데 다음과 같은 코드를 호출합니다. SoundTools.play(soundPath);

+2

게임, 창, GUI 라이브러리에 대해 자세히 알려주십시오. 그네? 스윙 스레딩 규칙을 존중합니까? –

+0

@HovercraftFullOfEels 예 스윙을 사용하고 조금은 awt를 사용하고 있습니다. 그 밖의 무엇을 알고 싶습니까? – Jerfov2

+1

문제를 나타내는 [실행 가능한 예제] (https://stackoverflow.com/help/mcve)를 제공하십시오. 그러면 혼란이 줄어들고 응답이 향상됩니다. – MadProgrammer

답변

0

끔찍한 검색 스프린트가 끝나면, 나는 대답을 찾았습니다 !! 내가 필요한 건 clip.close()을 새 Thread에서 실행하는 것이 었습니다. 왜? 나는 이것이 닫히는 데 시간이 걸린다는 사실과 관련이 있다고 생각하지만, 내 것이 얼었다. 어, 작동합니다! 여기있다 :

package tools; 

import javax.sound.sampled.Clip; 
import javax.sound.sampled.LineEvent; 
import javax.sound.sampled.LineListener; 

public class ClipHandler implements LineListener, Runnable { 
    private Clip clip; 

    public ClipHandler(Clip clip) { 
     this.clip = clip; 
     clip.addLineListener(this); 
    } 

    public void play() { 
     clip.start(); 
    } 

    public void update(LineEvent e) { 
     if (e.getType() == LineEvent.Type.STOP) { 
      System.out.println("stopping!"); 
      new Thread(this).start(); 
     } 
    } 

    public void run() { 
     clip.close(); 
     System.out.println("stopped!"); 
    } 
} 

그리고 (같은 패키지에서 (가, 수입 SoundTools)가 아닌 경우) 방법 :

public static synchronized void play(String path) { 
    try { 
     URL soundUrl = SoundTools.class.getResource(path); 
     AudioInputStream stream = AudioSystem.getAudioInputStream(soundUrl); 
     AudioFormat format = stream.getFormat(); 
     DataLine.Info info = new DataLine.Info(Clip.class, format); 
     Clip clip = (Clip) AudioSystem.getLine(info); 
     clip.open(stream); 
     clip.start(); 
     new ClipHandler(clip).play(); 
    } 
    catch (Exception e) { 
     System.out.println(e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

난 당신이 도움이 되길 바라며! 오후 8시 30 분 P.S. 이것은 .jars에서 작동합니다!