Java: быстро увеличивать и уменьшать усиление javax.sound.sampled.Clip - PullRequest
2 голосов
/ 26 августа 2010

Я хочу плавно перейти между двумя аудиоклипами, которые загружены в массив javax.sound.sampled.Clips в моем Java-апплете.В данный момент я останавливаю один клип и запускаю следующий, но это производит слышимые щелкающие шумы из-за остановки звука и внезапного запуска.Мне нужно использовать интерфейс Clip, чтобы я мог выполнять зацикливание и переход между клипами, сохраняя ту же позицию дорожки.

Я пытался уменьшить усиление перед остановкой одного клипа, а затем увеличить усиление при запускеследующий с помощью FloatControl.Type.MASTER_GAIN.Это требует очистки буфера, если я хочу быстро изменить усиление, и даже тогда я получаю щелчок и заикание, если я пытаюсь изменить усиление слишком быстро.Плюс очистка буфера требует, чтобы я остановил и перезапустил клип, чтобы вернуть буфер, который был очищен (поэтому я не перепрыгиваю через очищенную часть), и это приводит к тому же щелчку, от которого я пытаюсь избавиться.*

Есть ли у кого-нибудь опыт быстрого изменения усиления (в течение 200 мс), скажем, от 0 дБ до -60 дБ.Я думаю, что мне, возможно, придется опуститься до уровня буфера и начать манипулировать битами напрямую, но я не знаю, как добраться до этого из интерфейса Clip.

Есть предложения?

1 Ответ

1 голос
/ 02 сентября 2010

Обнаружено замечательное расширение класса Clip, которое позволяет создавать один объект Clip с несколькими потоками, а затем использовать пользовательские переходы, такие как постепенное исчезновение и уменьшение, для переключения между потоками. Это избавляет от назойливого нажатия!

Я нашел это на форумах HydrogenAudio, написанных потрясающим парнем, который обращается к ручке googlebot. Это открытый исходный код под лицензией GNU.

Вот ссылка на сообщения на форуме, описывающие программу, для которой был создан класс: Hydroaudio.org/forums/index.php?showtopic=80673 (спам-бот говорит, что я могу опубликовать только одну ссылку: P)

Вот ссылка на кодовую страницу Google, где вы можете получить файлы классов Java: http://code.google.com/p/advancedabx/source/browse/#hg/AdvancedABX/src/de/uebber/sound/lib

Если вы в конечном итоге используете эти классы, вы можете обнаружить некоторые ошибки ограничения массива в функциях open и addstream в классе SwitchableArrayClip.java.

Вам нужно будет изменить:

// Fill it
    int numRead = 0;
    int offset = 0;
    while (numRead != -1) {
        numRead = stream.read(audioData[0], offset - numRead, len - numRead);
    }

до:

// Fill it
    int numRead = 0;
    int offset = 0;
    while (numRead != -1) {
        numRead = stream.read(audioData[0], offset, len - offset);
        offset += numRead;
    }

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

Надеюсь, это кому-нибудь поможет!

...