2009-12-10 105 views
3

我使用4个USB声卡(华硕Xonar U1)。我想发送给他们中的每一个不同的声音(用不同的语言叙述相同的文字)。现在,我做什么,以获得混声器是我感兴趣的,是这样的:Java声音API - 区分多个相同的USB声卡

Info[] mixerInfo = AudioSystem.getMixerInfo(); 
int count = 0; 
for (Info i : mixerInfo) { 
    System.out.println("["+(count++)+"]" + i.getName() + " - " + i.getDescription()+" - "+i.getVendor()); 
} 

这给了我类似如下:

[5] Device [plughw:1,0] - Direct Audio Device: USB Advanced Audio Device, USB Audio, USB Audio - ALSA (http://www.alsa-project.org) 
[6] Device_1 [plughw:2,0] - Direct Audio Device: USB Advanced Audio Device, USB Audio, USB Audio - ALSA (http://www.alsa-project.org) 
[7] Device_2 [plughw:3,0] - Direct Audio Device: USB Advanced Audio Device, USB Audio, USB Audio - ALSA (http://www.alsa-project.org) 

现在,在我的配置文件,我将声卡与Info []索引(“count”变量)相关联。

问题是如果我更改声卡连接的USB端口。然后Info []数组有一个全新的顺序,我不知道哪个声卡应该播放语言en_US和哪个pt_PT例如。

此外,“plughw:1,0”字符串更改时没有任何明显的模式。如果我只有一个声卡,无论连接到哪个端口,它都将始终为“plughw:1,0”。

如果计算机重新启动,混音器Info []有时也会重新排序。

我也看过jUSB,但声卡的设备信息对于所有声卡都完全相同,我不知道如何映射它为我提供的Java Sound API混音器的USB信息信息。

那么,有谁知道如何唯一标识与Java Sound API相同的声卡?

另外,有没有人有另一个建议,我可以用哪种语言/库编写一个应用程序,在同一台机器上输出不同的音频文件到4个不同的USB声卡?

回答

1

因为我们需要这种在Linux下工作,我们最后使用此解决方案:http://alsa.opensrc.org/Udev

它指定音频设备一样hwplug:X,Y每个他们在插入时更具体地说,它分配一个固定hwplug:x,y每个USB端口。因此,我们总是知道哪个USB端口会发送特定的声音。

1

查看以C语言编写的BASS音频库。有一个JNI库,NativeBass,这是一种在Java中本地使用的桥梁。你失去了一些跨平台的能力,但是这个库的表现明显更好,在多次输出时效果很好,并且我相信在每个音频设备上都有更好的识别。

(安装NativeBass,你还需要下载BASS本身,合并两个/ lib目录,这是不完全记录。)

如果我要坚持你使用的解决方案,我会得到一个便宜的USB集线器,将音频USB连接到集线器,并将集线器连接到计算机。这应该每次都以相同的顺序初始化音频,至少让您在JavaSound中使用的顺序一致。

+0

我应该提到我们需要使用Linux。从我看到的情况来看,NativeBass在Linux上不起作用。无论如何,谢谢你的回答,它给了我们一些见解。我特别喜欢USB hub技巧,但我没有机会测试它。 – 2009-12-11 11:01:58