我正在使用4个USB声卡(华硕Xonar U1)。我想向他们每个人发送一个不同的声音(同一个文本用不同的语言叙述)。现在,我为了获得我感兴趣的混音器而采取的措施是这样的:
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混音器信息
那么,有没有人知道如何使用Java Sound API唯一识别相同的声卡?
或者,是否还有人建议我使用哪种语言/库来编写一个应用程序,将同一机器中的4种不同USB声卡输出不同的音频文件?
答案 0 :(得分:1)
看一下用C语言编写的BASS音频库。有一个JNI库NativeBass,它是在Java中本地使用它的桥梁。你失去了一些跨平台的能力,但是图书馆表现更好,多次出局效果很好,我相信每个音频设备都有更好的识别能力。
(安装NativeBass,您还需要下载BASS本身,并合并两个/ lib目录,这些目录尚未完整记录。)
如果我要坚持使用您正在使用的解决方案,我会得到一个便宜的USB集线器,将音频USB连接到集线器,并将集线器连接到计算机。这应该每次都以相同的顺序初始化音频,至少给你一个在JavaSound中使用的一致顺序。
答案 1 :(得分:1)
由于我们需要在Linux中使用它,我们最终使用了这个解决方案:http://alsa.opensrc.org/Udev
每次插入时,它都会为音频设备分配相同的hwplug:x,y。更具体地说,它为每个USB端口分配一个固定的hwplug:x,y。因此,我们始终知道将发送特定声音的USB端口。