2014-12-15 6 views
0

Я играю звук .wav в Java. У меня есть некоторый код, который выглядит следующим образом:Ошибка Java при воспроизведении wav

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(); 
     } 
    } 
} 

Метод, который вызывается:

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(); 
    } 
} 

Проблема происходит, когда я пытаюсь воспроизвести файл .wav. Он всегда работает в первый раз, но после нескольких раз вызова игры (путь) окно, в которое я играю, полностью замораживается; это не позволит мне что-либо сделать. Мне нужна помощь! Кстати, я называю код следующим образом: SoundTools.play(soundPath);

+2

Сообщите нам подробнее о вашей игре, вашем окне, вашей графической библиотеке. Свинг? И если да, уважаете ли вы правила потоковой передачи Swing? –

+0

@HovercraftFullOfEels Да, я использую Swing и немного awt. Что еще вы хотели бы знать? – Jerfov2

+1

Рассмотрите возможность использования [runnable example] (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(); 
    } 
} 

Я надеюсь, что вы все найдете это полезно! P.S. Это работает в .jars!