2013-01-07 76 views
6

我正在開發一個教育性的multiseat項目,我們需要將36個鍵盤和36個USB聲卡連接到一臺計算機上。我們使用3.6.3-030603-通用內核運行Ubuntu Linux 12.04。在我的系統上需要32個以上的USB聲卡

到目前爲止,我們已經設法從36個鍵盤獲得輸入,並且在沒有發生內核恐慌(在更新內核之前發生)的情況下識別了36個聲卡。我們知道36聲卡已被識別,因爲$ lsusb | grep "Audio" -c輸出36

但是,$ aplay -l總共列出了32個播放設備(包括「內部」聲卡)。另外,$ alsamixer -c 32表示「無效卡片索引:32」(工作只是從0到31;也是32)。

所以我的問題是,我如何訪問其他聲卡,如果他們甚至沒有列出這些命令?我正在用python編寫一個應用程序,並且有一些庫可供選擇,但是由於這個原因,恐怕他們也會被限制爲32個設備。任何指導都會有用。

謝謝。

+2

你是害怕還是讓你測試它? – Crisfole

+0

我試過pyaudio,並且get_device_count()總共列出了32個,包括一些別名(不知道是否正確的單詞),比如「default」。所以我可以訪問更少的設備。 – picheto

+1

您是如何將所有這些設備連接到PC的? 對於總線帶寬,這不會太多嗎? 你實際上可以同時使用當前的31個設備嗎? –

回答

7

您提出的問題基本上是:在由ALSA控制的系統中是否可以有多於32個聲卡?很明顯,雖然您的USB控制器知道您連接的所有聲卡,但ALSA系統不會。

讓我們進入內核源碼來檢查這裏發生了什麼。在/sound/core/sound.c您還會發現的最大聲卡的問題的詳細信息:

39 static int cards_limit = 1; 
    40 
    41 MODULE_AUTHOR("Jaroslav Kysela <[email protected]>"); 
    42 MODULE_DESCRIPTION("Advanced Linux Sound Architecture driver for soundcards."); 
    43 MODULE_LICENSE("GPL"); 
    44 module_param(major, int, 0444); 
    45 MODULE_PARM_DESC(major, "Major # for sound driver."); 
    46 module_param(cards_limit, int, 0444); 
    47 MODULE_PARM_DESC(cards_limit, "Count of auto-loadable soundcards."); 
    48 MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR); 
    49 
    50 /* this one holds the actual max. card number currently available. 
    51 * as default, it's identical with cards_limit option. when more 
    52 * modules are loaded manually, this limit number increases, too. 
    53 */ 
    54 int snd_ecards_limit; 
    55 EXPORT_SYMBOL(snd_ecards_limit); 

從代碼和它的意見,我讀了兩兩件事:

  1. 變量cards_limit是一個模塊參數。我假設在你的安裝中,這個參數設置爲32.如果內核中內置了ALSA支持,你可以在你修改這個選項的時候構建一個定製的內核。如果ALSA支持不是內置的,而是作爲模塊加載的,則可以在模塊加載期間設置此參數。爲此,您可以更改系統配置(man modprobe.d)或卸載模塊,然後使用選項(man modprobe)重新加載它。

  2. 該限制被描述爲僅限制自動加載的聲卡的數量。爲了克服這個限制,手動加載負責你的聲卡的模塊就足夠了。內核中沒有設置用於手動添加聲卡的限制。

來源:Kernel 2.8 Git

+1

受'cards_limit'影響的自動加載機制不適用於USB聲卡。手動加載'snd-usb-audio'不能改變任何東西,因爲它是所有36個設備的相同驅動程序。 –

3

聲卡極限被定義爲在include/sound/core.h符號SNDRV_CARDS

當我七年前增加了這一點,我並沒有超越32,因爲上證指數被用作位指數爲sound/core/init.c變量snd_cards_lock,我不想改變超過必要的。

如果您使snd_cards_lock爲64位變量,請將所有訪問權限更改爲使用64位類型,並調整任何其他我可能已經忘記的副作用,您應該可以讓內核擁有更多ALSA牌。

該限制也存在於alsa-lib包中;您必須至少更改src/control/control_hw.csnd_ctl_hw_open的支票。

+0

我們會檢查這一點,非常感謝 – picheto

相關問題