通过环绕声扬声器输出多声道音频



我正在进行一个交互式声音安装,该安装使用Processing和Minim等工具运行。这个项目需要的不仅仅是一个简单的左/右输出(具体来说是5个扬声器),从我所读到的内容来看,这意味着Java Sound api是我设置的主要选项。我对Processing相当陌生,对较低级别的Java也完全陌生。

我在2011年的Macbook Pro上用这个外置USB声卡运行这一切:http://amzn.com/B004Y0ERRO,在Mac上似乎可以检测到单个USB音频接口。当使用JavaSoundapi时,理论上我应该能够从Mixer中获得一个Lines列表,该列表将对应于我需要访问的3个立体声输出插孔,但在JavaAudioapi文档和相关教程网站上花了很多时间后,我似乎不知道如何以及在哪里找到它们。

编辑:事实证明,大多数环绕声声卡都只能在Mac电脑上立体声兼容,这解释了我的很多麻烦。我将用3个立体声声卡重试。

以下是我在Processing:中使用的演示的基本版本

import javax.sound.sampled.*;
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
Mixer mixer = AudioSystem.getMixer(mixerInfo[8]);
void setup()
{
  size(200, 200);
  printArray(mixerInfo);
  for(Line.Info lineInfo : mixer.getTargetLineInfo()){
    Line thisLine = mixer.getLine(lineInfo);
    thisLine.open();
    println(thisLine);
  }
}

printArray返回这个:

[0] Default Audio Device, version Unknown Version
[1] Built-in Microphone, version Unknown Version
[2] Built-in Input, version Unknown Version
[3] Built-in Output, version Unknown Version
[4] USB Sound Device        , version Unknown Version
[5] Port Built-in Microphone, version Unknown Version
[6] Port Built-in Input, version Unknown Version
[7] Port Built-in Output, version Unknown Version
[8] Port USB Sound Device        , version Unknown Version

大概我想要最后一个设备(8)或4。我不太清楚,因为我看不清每个设备属于哪些线路/端口。当我尝试使用:

mixer.getTargetLineInfo()

我只得到一个结果:

SPEAKER target port

结尾的for循环应该循环通过混合器中的所有行并打开它们(直到这一点,你必须注释掉这一部分,以免抛出错误),但我得到了这个错误:

Unhandled exception type LineUnavailableException

我觉得我一定是找错地方了,当设备上有10个插孔时,环绕声USB卡怎么可能只有一个封闭的扬声器目标端口?无论我多么仔细地阅读文档,我都不知道哪里出了问题。感谢您的阅读,我非常感谢您提供的任何见解!

编辑:

包含基本最小播放的上述草图版本:

import ddf.minim.Minim;
import ddf.minim.ugens.Oscil;
import ddf.minim.AudioOutput;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.Line;
Minim       minim;
AudioOutput out;
Oscil       wave;
Mixer.Info[] mixerInfo;
javax.sound.sampled.Line.Info lineInfo;
javax.sound.sampled.Line Line;

void setup()
{
  size(200, 200);
  minim = new Minim(this);
  mixerInfo = AudioSystem.getMixerInfo();   
  Mixer mixer = AudioSystem.getMixer(mixerInfo[8]);
  try {
    for (Line.Info lineInfo : mixer.getTargetLineInfo()) {
      Line thisLine = mixer.getLine(lineInfo);
      thisLine.open();
      println(lineInfo);
    }
  }
  catch(LineUnavailableException e) {
    e.printStackTrace();
  }
  minim.setOutputMixer(mixer);
  out = minim.getLineOut(Minim.STEREO);
  wave = new Oscil( 440, 0.5f, Waves.SINE );
  wave.patch( out );
}

您得到Unhandled exception type LineUnavailableException错误,因为这两行都可以抛出LineUnavailableException:

Line thisLine = mixer.getLine(lineInfo);
thisLine.open();

这意味着你必须将这些行包装在一个try-catch块中:

  try {
    for (Line.Info lineInfo : mixer.getTargetLineInfo()) {
      Line thisLine = mixer.getLine(lineInfo);
      thisLine.open();
      println(thisLine);
    }
  }
  catch(LineUnavailableException e) {
    e.printStackTrace();
  }

我可以尝试解决您的其他问题,但第一步是解决这个问题,因为这是一个编译错误,可能会阻止您实际运行任何代码。

另外,看看这一行:

println(thisLine);

这里您正在打印一个Line实例。Processing不知道如何打印Line实例(Line类不会覆盖toString()方法),所以您只会得到它的哈希代码,而不会得到任何有用的信息。请尝试打印出`Line.Info实例:

println(lineInfo);

编辑:至于您关于Line不明确的错误,那是因为您使用了通配符导入-您正在导入ddf.minimddf.minim.ugensjavax.sound.sampled包中的所有内容。问题是ddf.minimjavax.sound.sampled都有一个Line类,所以Processing无法知道你指的是哪个类!

"真正的"解决方案可能是专门导入类,而不是使用导入通配符:

import ddf.minim.Minim;
import javax.sound.sampled.Line;
//1 import statement for each class...

但是lazy解决方案是使用完全限定名称,这样Processing就可以确切地知道Line类的含义:

for (javax.sound.sampled.Line.Info [] lineInfo : mixer.getTargetLineInfo()){

请注意,您必须对可能不明确的每一行执行此操作,因此更好的解决方案是直接导入类。

相关内容

  • 没有找到相关文章

最新更新