2009-12-17 3 views
1

У меня есть проблема правильно воспроизводить звук на Java, используя интерфейс Clip.Проблемы с Java, воспроизводящие звуковые клипы

Воспроизведение звука работает с помощью:

clip = (Clip)mixer.getLine(dataLineInfo); 
clip.open(audioFormat, byteData, 0, byteData.length); 
clip.start(); 

Однако есть утечка памяти, если клипы не закрыты.

Я попытался добавить строку слушателя перед началом клипа, а также использовать следующий код:

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

Однако, это вызывает звук degrage.

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

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

Есть ли у кого-нибудь идеи по лучшему пути решения этой проблемы?

(относящиеся к this, this и this, но ни один из них решения для меня)

ответ

1

Это, как представляется, симптомы, описанные в bug 4434125.

Предлагаемое решение в этих комментариях об ошибках заключается в вызове clip.drain() (в соответствующем потоке, поскольку это блокирующий вызов), а затем закрытие клипа при завершении дренажа (поскольку он будет блокироваться до тех пор, пока внутренний буфер линии данных не будет опустошен (согласно Javadocs for the drain method).

+0

Спасибо, это проблема. «Старая реализация (Java Sound Engine) не будет исправлена». Следовательно, теперь код пытается использовать микшер System default. – Pool

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