我在做一个教育性的multiseat项目,我们需要把36个键盘和36个USB声卡连接到一台电脑上。我们运行的是UbuntuLinux12.04和3.6.3-030603-generic内核。在
到目前为止,我们已经成功地从36个键盘上获得了输入,并且在没有得到内核恐慌(这发生在更新内核之前)的情况下识别了36个声卡。我们知道36个声卡已经被识别,因为$ lsusb | grep "Audio" -c
输出{
但是,$ aplay -l
总共列出了32个播放设备(包括“内部”声卡)。另外,$ alsamixer -c 32
表示“无效的卡索引:32”(从0到31工作;总共32个)。在
所以我的问题是,如果其他声卡都没有列出这些命令,我怎么能访问它们呢?我正在用python编写一个应用程序,有一些库可供选择,但我担心,由于这个原因,它们总共只能使用32个设备。任何指导都是有用的。在
谢谢。在
你提出的问题基本上是:在ALSA控制的系统中,能有超过32个声卡吗?显然,当你的USB控制器知道你连接的所有声卡时,ALSA系统却不知道。在
让我们进入内核源代码来检查这里发生了什么。在
/sound/core/sound.c
中,您将找到有关声卡最大值问题的更多信息:从代码和它的注释中,我读到两件事:
可变卡的限制是一个模块参数。我假设在安装时这个参数被设置为32。如果内核中内置了ALSA支持,则可以在更改此选项的位置构建自定义内核。如果ALSA支持不是内置的,而是作为模块加载的,则可以在模块加载期间设置此参数。为此,您可以更改系统配置(
man modprobe.d
)或卸载模块,然后使用选项(man modprobe
)重新加载它。这个限制被描述为只限制自动加载声卡的数量。为了克服这个限制,手动加载负责声卡的模块就足够了。对于手动添加的声卡,内核中没有设置限制。
来源:Kernel 2.8 Git
声卡限制定义为
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.c
中的签入snd_ctl_hw_open
。在相关问题 更多 >
编程相关推荐