当前位置: 首页 > 面试题库 >

可以使用Java Sound来控制系统音量吗?

訾旭
2023-03-14
问题内容

Java
Sound提供FloatControl了各种声音线功能以及MASTER_GAINVOLUME控件类型的实例。

可以使用这些控件来更改系统音量吗?


问题答案:

不,它不能。这是从“ 调整码位上的主音量”的答案改编而来的资源。源代码会迭代可用的行,检查它们是否具有正确类型的控件,如果有,则将它们放入连接到命令行的GUI中。JSlider

import java.awt.*;
import javax.swing.*;
import javax.sound.sampled.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class SoundMixer {

    public Component getGui() {
        JPanel gui = new JPanel(new GridLayout(0,1));

        Mixer.Info[] mixers = AudioSystem.getMixerInfo();
        System.out.println(
                "There are " + mixers.length + " mixer info objects");
        for (Mixer.Info mixerInfo : mixers) {
            System.out.println("mixer name: " + mixerInfo.getName());
            Mixer mixer = AudioSystem.getMixer(mixerInfo);
            Line.Info[] lineInfos = mixer.getSourceLineInfo();
            for (Line.Info lineInfo : lineInfos) {
                System.out.println("  Line.Info: " + lineInfo);
                try {
                    Line line = mixer.getLine(lineInfo);
                    FloatControl volCtrl = (FloatControl)line.getControl(
                            FloatControl.Type.MASTER_GAIN);
                    VolumeSlider vs = new VolumeSlider(volCtrl);
                    gui.add( new JLabel(volCtrl.toString()) );
                    gui.add( vs.getVolume() );
                    System.out.println(
                            "    volCtrl.getValue() = " + volCtrl.getValue());
                } catch (LineUnavailableException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException iaEx) {
                    System.out.println("    " + iaEx);
                }
            }
        }

        return gui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                SoundMixer sm = new SoundMixer();
                Component c = sm.getGui();
                JOptionPane.showMessageDialog(null, c);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}

class VolumeSlider {

    JSlider volume;

    VolumeSlider(final FloatControl volumeControl) {
        volume = new JSlider(
                (int) volumeControl.getMinimum() * 100,
                (int) volumeControl.getMaximum() * 100,
                (int) volumeControl.getValue() * 100);
        ChangeListener listener = new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
                float val = volume.getValue() / 100f;
                volumeControl.setValue(val);
                System.out.println(
                        "Setting volume of " + volumeControl.toString() + 
                        " to " + val);
            }
        };
        volume.addChangeListener(listener);
    }

    public JSlider getVolume() {
        return volume;
    }
}

在这台Windows 7计算机上,我有两个控件,都来自“ Java Sound Audio Engine”。都不会影响当前的系统容量。

run:
There are 4 mixer info objects
mixer name: Primary Sound Driver
  Line.Info: interface SourceDataLine supporting 8 audio formats, and buffers of at least 32 bytes
    java.lang.IllegalArgumentException: Unsupported control type: Master Gain
  Line.Info: interface Clip supporting 8 audio formats, and buffers of at least 32 bytes
    java.lang.IllegalArgumentException: Unsupported control type: Master Gain
mixer name: Speakers (VIA High Definition Audio)
  Line.Info: interface SourceDataLine supporting 8 audio formats, and buffers of at least 32 bytes
    java.lang.IllegalArgumentException: Unsupported control type: Master Gain
  Line.Info: interface Clip supporting 8 audio formats, and buffers of at least 32 bytes
    java.lang.IllegalArgumentException: Unsupported control type: Master Gain
mixer name: Java Sound Audio Engine
  Line.Info: interface SourceDataLine supporting 8 audio formats
    volCtrl.getValue() = 0.0
  Line.Info: interface Clip supporting 8 audio formats, and buffers of 0 to 4194304 bytes
    volCtrl.getValue() = 0.0
mixer name: Port Speakers (VIA High Definition A
Setting volume of Master Gain with current value: 0.0 dB (range: -80.0 - 13.9794) to 0.0
Setting volume of Master Gain with current value: 0.0 dB (range: -80.0 - 13.9794) to -0.41
Setting volume of Master Gain with current value: 0.0 dB (range: -80.0 - 13.9794) to -0.68
...

交换FloatControl.Type.MASTER_GAINFloatControl.Type.VOLUME看..没有控制



 类似资料:
  • 1.1.1. 音量控制 1.1.1. 音量控制 这是一个音量控制的接口,可以控制整体音量,也可以控制单个通道的音量。下面是头文件: #include <vol_ctrl/volumecontrol.h> 除了要 include 头文件外,还需要链接 -lrkvolumecontrol.so。 API int set_all_volume(int vol); // 设置整体音量接口,参数vol:

  • 问题内容: 历史和情况: 我目前正在更新一个Java应用程序,该应用程序是几年前为客户端开发的(可在WinXP上运行),用于测试和培训患有某些听力障碍的人。购买此应用程序的用户将获得特定的USB声音设备和耳机。 该软件最重要的要求之一是必须以特定的分贝声音级别向用户播放音频。使用Java Sound API,开发了该应用程序,以将Windows Volume动态调整为计算的水平(基于在开发过程中校

  • 我正在制作一个游戏,这里我希望最终用户按下Ctrl W退出系统。 这是我使用的代码: ……但它似乎不起作用 有人能告诉我我的代码有什么问题吗? 提前谢谢!

  • translated_page: https://github.com/PX4/Devguide/blob/master/en/debug/system_console.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e PX4 System Console(系统控制台) System Console(系统控制台)允许访问系统底层

  • 在开发项目中使用版本控制系统有很多好处。本章节将向你介绍其中的一些细节。 协同合作 试想一下,如果没有版本控制系统,当你需要处理那些共享文件夹中的文件时,你必须告知办公室里的所有人,你正在对哪些文件进行编辑;与此同时,其他人必须要避免与操作相同的文件。这是一个不现实和完全错误的流程。当你花了很长时间完成你的编辑后,可能这些文件早已经被团队里的其他开发成员修改或者删除了。 如果使用了版本控制系统,每