2009-12-10 109 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