есть приложение, которое обрабатывает данные в реальном времени и должно звучать, когда происходит определенное событие. Событие триггера может происходить несколько раз в секунду, и если звуковой сигнал уже воспроизводится, когда другое событие запускает код, он просто должен игнорировать его (в отличие от прерывания текущего звукового сигнала и запуска нового). Вот основной код:Мне нужно закрыть аудиоклип?
Clip clickClip
public void prepareProcess() {
super.prepareProcess();
clickClip = null;
try {
clipFile = new File("C:/WINDOWS/Media/CHIMES.wav");
ais = AudioSystem.getAudioInputStream(clipFile);
clickClip = AudioSystem.getClip();
clickClip.open(ais);
fileIsLoaded = true;
} catch (Exception ex) {
clickClip = null;
fileIsLoaded = false;
}
}
public void playSound() {
if (fileIsLoaded) {
if ((clickClip==null) || (!clickClip.isRunning())) {
try {
clickClip.setFramePosition(0);
clickClip.start();
} catch (Exception ex) {
System.out.println("Cannot play click noise");
ex.printStackTrace();
}
}
}
Метод prepareProcess получает запустить один раз в самом начале, и метод PlaySound вызывается каждый раз, когда происходит событие запуска. Мой вопрос: мне нужно закрыть объект clickClip? Я знаю, что могу добавить actionListener для мониторинга события Stop, но так как событие происходит так часто, я беспокоюсь о том, что дополнительная обработка замедлит сбор данных в режиме реального времени.
Код, кажется, работает нормально, но мое беспокойство - утечка памяти. Вышеприведенный код основан на примере, который я нашел при поиске в сети, но в примере использовался actionListener для закрытия Clip специально «для устранения утечек памяти, которые могут возникнуть, когда метод остановки не был реализован». Моя программа предназначена для работы в течение нескольких часов, поэтому любые утечки памяти, которые у меня возникают, вызовут проблемы.
Я буду честен: я понятия не имею, как проверить, есть ли у меня проблема. Я использую Netbeans, и запуск профилировщика памяти просто дал мне огромный список вещей, которые я не знаю, как читать. Это должно быть простой частью программы, и я трачу на нее часы. Любая помощь будет принята с благодарностью!
Майкл
Большое спасибо за ответ. Я согласен с вами в том, что, основываясь на коде, который я даю, это не кажется проблемой. Но (как вы говорите) я не знаю, что происходит за кулисами объекта Clip.Обманывая больше с помощью профилировщика памяти Netbeans, кажется, что каждый новый объект выделяется каждый раз при воспроизведении звука. Тем не менее, колонка «Живой объект» никогда не увеличивается, поэтому я предполагаю, что это означает, что сбор мусора позаботится об этом немедленно. Странное поведение, но я обязательно буду следить за ним во время тестирования, чтобы убедиться, что все в порядке. Еще раз спасибо. Michael – Michael