JLayer在播放时更改音量(JavaZoom)

JLayer在播放时更改音量(JavaZoom),java,audio,audio-player,jlayer,Java,Audio,Audio Player,Jlayer,我构建了一个JLayer,它可以播放网络音乐流,除了音量之外,效果很好。我无法改变它 我已经尝试了以下操作,但音量始终保持不变,没有错误: public synchronized void setVolume(float vol) { Line.Info source = Port.Info.SPEAKER; if (AudioSystem.isLineSupported(source)) { try { Port outline = (

我构建了一个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();
    }
}*/

我的经验是,Java支持的各种
控件的实现在某种程度上是成功或失败的。我不清楚为什么会这样。也许这与操作系统或特定机器支持的功能有关

在任何情况下,对于数量而言,通常是对数量的最佳选择

文章的结尾部分讨论了如何直接处理音频数据。我建议使用此选项,但是在使用JavaZoom代码时获取数据可能会有问题,并且可能需要调整库的源代码