Java Sound API - 区分多个相同的USB声卡

时间:2009-12-10 15:25:45

标签: java api audio

我正在使用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声卡输出不同的音频文件?

2 个答案:

答案 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端口。