我的系统需要超过32个USB声卡

时间:2013-01-07 18:08:53

标签: python linux alsa udev soundcard

我正在开展一个教育性的多项目项目,我们需要将36个键盘和36个USB声卡连接到一台计算机上。我们使用3.6.3-030603通用内核运行Ubuntu Linux 12.04。

到目前为止,我们已经设法从36个键盘获得输入,并且在没有内核恐慌(在更新内核之前发生)的情况下识别了36个声卡。我们知道已经识别出36张声卡,因为$ lsusb | grep "Audio" -c输出36

但是,$ aplay -l总共列出了32个播放设备(包括"内部"声卡)。此外,$ alsamixer -c 32表示"无效的卡片索引:32" (仅适用于0到31;总共32个)。

所以我的问题是,如果他们甚至没有列出这些命令,我​​怎么能访问其他声卡?我在python中编写了一个应用程序,并且有一些库可供选择,但我担心他们也会因此而被限制为32个设备。任何指导都会有用。

感谢。

2 个答案:

答案 0 :(得分:7)

您提出的问题基本上是:ALSA控制的系统中是否可以有超过32张声卡?很明显,虽然您的USB控制器知道您附加的所有声卡,但ALSA系统却没有。

让我们进入内核源代码来检查这里发生了什么。在/sound/core/sound.c中,您可以找到有关最大声卡问题的更多信息:

  39 static int cards_limit = 1;
  40 
  41 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
  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. 限制被描述为仅限制自动加载的声卡的数量。要克服此限制,手动加载负责声卡的模块可能就足够了。内核中没有为手动添加的声卡设置限制。

  3. 来源:Kernel 2.8 Git

答案 1 :(得分:3)

声卡限制定义为SNDRV_CARDS中的符号include/sound/core.h

当我七年前增加时,我没有超过32,因为卡索引被用作snd_cards_lock中变量sound/core/init.c的位索引,我不想更改更多不必要的。

如果你使snd_cards_lock为64位变量,将所有访问更改为使用64位类型,并调整我可能忘记的任何其他副作用,你应该能够将内核变为有更多的ALSA卡。

此限制也存在于alsa-lib包中;您必须至少更改snd_ctl_hw_opensrc/control/control_hw.c的支票。