Can Java Sound be used to control the system volume?

前端 未结 6 1285
旧时难觅i
旧时难觅i 2020-11-29 10:22

Java Sound offers FloatControl instances for various sound line functionality, and both a MASTER_GAIN & VOLUME control type.

Can these controls be

6条回答
  •  忘掉有多难
    2020-11-29 10:58

    I am using VOLUME control type. This code works for me for XP and WIN 7, but not for OSX. See my example:

    import java.io.IOException;
    
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.FloatControl;
    import javax.sound.sampled.Line;
    import javax.sound.sampled.Mixer;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    public class VolumeExample extends JPanel {
    
    /**
     * @return main sound control object
     * @throws Exception for any problem
     */
    private FloatControl getVolumeControl() throws Exception {
        try {
            Mixer.Info mixers[] = AudioSystem.getMixerInfo();
            for (Mixer.Info mixerInfo : mixers) {
                Mixer mixer = AudioSystem.getMixer(mixerInfo);
                mixer.open();
    
                //we check only target type lines, because we are looking for "SPEAKER target port"
                for (Line.Info info : mixer.getTargetLineInfo()) {
                    if (info.toString().contains("SPEAKER")) {
                        Line line = mixer.getLine(info);
                        try {
                            line.open();
                        } catch (IllegalArgumentException iae) {}
                        return (FloatControl) line.getControl(FloatControl.Type.VOLUME);
                    }
                }
            }
        } catch (Exception ex) {
            System.out.println("problem creating volume control object:"+ex);
            throw ex;
        }
        throw new Exception("unknown problem creating volume control object");
    }
    
       VolumeExample() {
            JSlider slider = new JSlider();
            add(slider);
    
            //this is for setting the value
            slider.addChangeListener(new ChangeListener() {
    
                @Override
                public void stateChanged(ChangeEvent e) {
                    JSlider src = (JSlider)e.getSource();
                    //if (src.getValueIsAdjusting()) return; //optional
                    if (src.getValue() % 5 !=0) return;
                    float value = src.getValue() / 100.0f;
                    try {
                        getVolumeControl().setValue(value);
                        //you can put a click play code here to have nice feedback when moving slider
                    } catch (Exception ex) {
                        System.out.println(ex);
                    }
                }
            });
    
            //and this is for getting the value
            try {
                slider.setValue((int) (getVolumeControl().getValue()*100.0f));
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
    

提交回复
热议问题