我正在开发一个使用 Processing 和 Minim 运行的交互式声音装置。这个项目需要的不仅仅是一个简单的左/右输出(具体来说是 5 个扬声器),据我所知,这意味着 Java Sound api 是我设置的主要选项。我对处理相当陌生,对较低级别的 Java 完全陌生。
我用这个外部 USB 声卡在 2011 Macbook Pro 上运行这一切:http: //amzn.com/B004Y0ERRO,它似乎在 Mac 上检测为单个 USB 音频接口就可以了。使用 Java Sound api 时,理论上我应该能够从混音器中获取对应于我需要访问的 3 个立体声输出插孔的线路列表,但我似乎无法弄清楚如何以及在哪里找到它们在 Java Audio api 文档和相关教程网站上花费了很多时间之后。
编辑:原来大多数环绕声声卡在 Mac 上只兼容立体声,这解释了我的大部分麻烦。我将用 3 个立体声声卡重试。
这是我在处理中使用的演示的基本版本:
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 卡怎么可能只有一个封闭的 SPEAKER 目标端口?无论我多么仔细地阅读文档,我都无法弄清楚我哪里出错了。感谢您的阅读,我非常感谢您提供的任何见解!
编辑:
具有基本最小播放的上述草图版本包括:
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 );
}