Я вижу странное поведение с экземплярами Clip
на Java.Захват аудиозахвата
Целью класса, над которым я работаю, является подсчет количества экземпляров Clip
, содержащих один и тот же образец звука (с индексом URI
.) Когда приложение запрашивает воспроизведение клипа, и есть уже три или более клипов из того же источника уже играет, выполняются следующие шаги:
- Сортировать по воспроизводимый в настоящее время клипы взвешенной суммы
PAN
иframePosition
. - Выберите клип с максимальным значением, которое будет остановлено и перезапущено.
- Повторно запустить клип (следующий метод):
void restart(Clip clip, float gain, float pan) {
clip.stop();
clip.flush();
pan = Math.max(-1f, Math.min(pan, 1f));
((FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN))
.setValue(gain);
((FloatControl) clip.getControl(FloatControl.Type.PAN))
.setValue(pan);
clip.setFramePosition(0);
clip.start();
}
Странное поведение имеет место, если этот метод вызывается много раз в быстрой последовательности (например, 20 раз в течение 1 мс):
- Клип играет
- Зажигает событие
START
, чтобы сообщить, что он начал играть - Клип никогда не запускает событие
STOP
. - Последующие вызовы
stop
иstart
не имеют никакого эффекта (но не бросать исключения.) - getFramePosition всегда возвращает
0
, даже когда клип слышно (в последний раз.)
Любая идея может быть причиной этого?
Я не думаю, что это проблема многопоточности (по крайней мере, не в моем коде.) Только один поток вызывает публичные методы моего класса (и все они synchronized
так или иначе)
Может быть связанные с this bug.
В качестве быстрого теста вы можете попробовать синхронизировать экземпляр клипа для всего метода перезапуска, чтобы исключить любые проблемы с потоками. – mdma
@mdma, я попробую это, но я был бы удивлен, если бы это имело значение. 'restart' вызывается только из другого метода' synchronized'. – finnw