Изменение громкости системы с помощью JLGui

В настоящее время я учусь создавать простой MP3-плеер с jlgui (используя swt для управления им). В то время как я хорошо лажу, есть одна вещь, которая меня по-настоящему волнует - это регулировка громкости и панорамирования звука, выходящего из компьютера.

У меня есть класс, который создает объект BasicPlayer и BasicController, чтобы пойти с ним. Я попытался использовать метод BasicController.setGain, но все, что он делает, если я помещаю в него какое-либо значение, это устанавливает громкость, которая должна быть отключена, и я не могу изменить это значение во время воспроизведения песни. Буду очень признателен, если кто-нибудь сможет мне помочь, так как это сводит меня с ума:-(

Также рассматривается попытка следующего предложения

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:\\Kasabian.mp3"));
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);

Но не совсем уверен, как совместить это с JLGUI.

1 ответ

Решение "ROLL YOUR OWN":

Учебное пособие по звуку Java имеет очень скудный раздел под названием "Управление аудиоданными напрямую" в конце страницы "Обработка звука с помощью элементов управления". http://docs.oracle.com/javase/tutorial/sound/controls.html

Я отказался от "Контроля" и просто сделал это сам. Если у кого-то есть работающее решение, которое использует элементы управления Java для управления объемом и панорамой, я буду рад услышать об этом.

Чтобы самостоятельно контролировать громкость, вам нужно попасть в "буфер" данных, которые считываются из вашей AudioInputLine, преобразовать данные в кадры PCM, умножить значения PCM на долю 1 (где 1.0 - полный объем, а 0 - тишина), преобразуйте обратно в байты, а затем, наконец, запишите в ваш SourceDataLine.

Кроме того (если вы еще не обескуражены), это помогает, если переменная громкости слабо связана и изменчива, и еще больше помогает, если указанный вами объем является "целевым", а переменная внутри буферного цикла постепенно приближается к цели на основе кадра. Это сделано для того, чтобы избежать скачков громкости, которые могут создавать щелчки.

И (если этого недостаточно) полезно сопоставить диапазон от 0 до 1,0 с уравнением (например, экспоненциальным или логарифмическим), которое лучше соответствует уровням слышимости.

Другие вопросы по тегам