JLayer Изменение громкости во время игры (JavaZoom)

Я создаю JLayer, который воспроизводит поток веб-музыки, который отлично работает, за исключением громкости. Я не могу заставить это изменить.

Я уже пробовал следующее, но громкость всегда остается прежней, ошибок нет:

public synchronized void setVolume(float vol) {
    Line.Info source = Port.Info.SPEAKER;

    if (AudioSystem.isLineSupported(source)) {
        try {
            Port outline = (Port) AudioSystem.getLine(source);
            outline.open();

            FloatControl volumeControl = (FloatControl) outline.getControl(FloatControl.Type.VOLUME);
            System.out.println("volume: " + volumeControl.getValue());

            volumeControl.setValue(vol);
            System.out.println("new volume: " + volumeControl.getValue());

        } catch (LineUnavailableException ex) {
            System.err.println("source not supported");
            ex.printStackTrace();
        }
    }
}


/*public synchronized void setVolume(double vol) {
    try {
        Mixer.Info[] infos = AudioSystem.getMixerInfo();
        for (Mixer.Info info : infos) {
            Mixer mixer = AudioSystem.getMixer(info);
            if (mixer.isLineSupported(Port.Info.SPEAKER)) {
                Port port = (Port) mixer.getLine(Port.Info.SPEAKER);
                port.open();
                if (port.isControlSupported(FloatControl.Type.VOLUME)) {
                    FloatControl volume = (FloatControl) port.getControl(FloatControl.Type.VOLUME);
                    volume.setValue((float) (vol / 100));
                }
                port.close();
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}*/

person Community    schedule 12.06.2020    source источник


Ответы (1)


Мой опыт показывает, что реализация различных Controls, поддерживаемых Java, в какой-то мере промахивается. Я не понимаю, почему так должно быть. Возможно, это связано с возможностями, поддерживаемыми ОС или конкретной машиной?

В любом случае для объема MASTER_GAIN обычно является лучшим выбором для объема.

В заключительной части раздела Руководства по Java по использованию элементов управления обсуждается управление аудиоданные напрямую. Я рекомендую этот вариант, но получение данных при использовании кода JavaZoom может быть проблематичным и, вероятно, требует настройки исходного кода библиотеки.

person Phil Freihofner    schedule 13.06.2020