java - 列出 Applet 中的输入和输出音频设备

标签 java javasound

我正在运行一个已签名的小程序,它需要为用户提供选择输入和输出音频设备的能力(类似于 skype 提供的功能)。

我从其他thread那里借用了下面的代码:

import javax.sound.sampled.*;
public class SoundAudit {
  public static void main(String[] args) { try {
    System.out.println("OS: "+System.getProperty("os.name")+" "+
      System.getProperty("os.version")+"/"+
      System.getProperty("os.arch")+"\nJava: "+
      System.getProperty("java.version")+" ("+
      System.getProperty("java.vendor")+")\n");
      for (Mixer.Info thisMixerInfo : AudioSystem.getMixerInfo()) {
        System.out.println("Mixer: "+thisMixerInfo.getDescription()+
          " ["+thisMixerInfo.getName()+"]");
        Mixer thisMixer = AudioSystem.getMixer(thisMixerInfo);
        for (Line.Info thisLineInfo:thisMixer.getSourceLineInfo()) {
            if (thisLineInfo.getLineClass().getName().equals(
              "javax.sound.sampled.Port")) {
              Line thisLine = thisMixer.getLine(thisLineInfo);
              thisLine.open();
              System.out.println("  Source Port: "
                +thisLineInfo.toString());
              for (Control thisControl : thisLine.getControls()) {
                System.out.println(AnalyzeControl(thisControl));}
              thisLine.close();}}
        for (Line.Info thisLineInfo:thisMixer.getTargetLineInfo()) {
          if (thisLineInfo.getLineClass().getName().equals(
            "javax.sound.sampled.Port")) {
            Line thisLine = thisMixer.getLine(thisLineInfo);
            thisLine.open();
            System.out.println("  Target Port: "
              +thisLineInfo.toString());
            for (Control thisControl : thisLine.getControls()) {
              System.out.println(AnalyzeControl(thisControl));}
            thisLine.close();}}}
  } catch (Exception e) {e.printStackTrace();}}
  public static String AnalyzeControl(Control thisControl) {
    String type = thisControl.getType().toString();
    if (thisControl instanceof BooleanControl) {
      return "    Control: "+type+" (boolean)"; }
    if (thisControl instanceof CompoundControl) {
      System.out.println("    Control: "+type+
        " (compound - values below)");
      String toReturn = "";
      for (Control children:
        ((CompoundControl)thisControl).getMemberControls()) {
        toReturn+="  "+AnalyzeControl(children)+"\n";}
      return toReturn.substring(0, toReturn.length()-1);}
    if (thisControl instanceof EnumControl) {
      return "    Control:"+type+" (enum: "+thisControl.toString()+")";}
    if (thisControl instanceof FloatControl) {
      return "    Control: "+type+" (float: from "+
        ((FloatControl) thisControl).getMinimum()+" to "+
        ((FloatControl) thisControl).getMaximum()+")";}
    return "    Control: unknown type";}
}

但我得到的是:

Mixer: Software mixer and synthesizer [Java Sound Audio Engine]
Mixer: No details available [Microphone (Pink Front)]

我期待获得我的设备的真实列表(我的首选项面板显示 3 个输出设备和 1 个麦克风)。我在 Mac OS X 10.6.7 上运行。

还有其他方法可以从 Java 获取该信息吗?

最佳答案

多年来,对于 OS X 的 Java 实现来说,这是一个非常不幸的限制,顺便说一下,对于该平台来说,“Java 声音音频引擎”是唯一可用编程方式输出的音频线。因此,无论您发送到这条线,即从您创建的任何 Java 应用程序中发送出去,都将始终路由到 OS X 中设置为默认输出的内容,通常是内部扬声器。所以 JSAE 只是“默认音频输出”的 Java 术语。据我们了解 - 遗憾的是 - 最新版本仍然如此。

为什么不幸?因为它有效地禁用了即使是不起眼的音频路由。我们每天都在处理这些问题,这需要各种额外的复杂性。有变通办法,但通过 SoundFlower 和 HiJack Pro 等第三方应用程序。例如 www.soundPimp.com。

关于java - 列出 Applet 中的输入和输出音频设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7971574/

相关文章:

Java 播放声音。有默认的系统声音吗?

java - 为每个线程生成一个新的对象实例是线程安全的操作吗?

java - Java中的两个数组声明有什么区别?

java - 如何在 Android 上使用 EditText 更改按钮的文本

java - 如何使用 Java 在 wav 文件的末尾消除静音?

java - 音频格式转换

java - "Nested"回收者 View

c# - 在 Windows 中对 'live' 文件使用 grep

java - 使用java从wav文件中提取人声

java - 小程序录音机