Изменение громкости системы с помощью 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 с уравнением (например, экспоненциальным или логарифмическим), которое лучше соответствует уровням слышимости.