我正在从事一个教育多座项目,我们需要将36个键盘和36个USB声卡连接到一台计算机上。我们运行的是Ubuntu Linux 12.04,内核是3.6.3-030603-generic。
到目前为止,我们已经设法从36个键盘中获得输入,并识别出36个声卡,而不会出现内核恐慌(在更新内核之前发生)。我们知道36个声卡已经被识别,因为$ lsusb | grep "Audio" -c
输出36
。
然而,$ aplay -l
总共列出了32个播放设备(包括"内部"声卡)。此外,$ alsamixer -c 32
表示"无效卡片索引:32"(仅从0到31有效;
所以我的问题是,我怎么能访问其他声卡,如果他们甚至没有列出这些命令?我正在用python编写一个应用程序,有一些库可供选择,但我担心它们也会因此被限制在总共32个设备上。任何指导都会有用的。
谢谢。
你提出的问题基本上是:在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);
从代码和注释中我读到了两件事:
变量cards_limit是一个模块参数。我假设在安装时该参数被设置为32。如果在内核中内置了ALSA支持,则可以在修改此选项的地方构建自定义内核。如果ALSA支持不是内置的,而是作为模块加载的,则可以在模块加载时设置此参数。为此,您可以更改系统配置(
man modprobe.d
)或卸载模块,然后使用选项(man modprobe
)重新加载它。该限制描述为仅限制自动加载声卡的数量。要克服这个限制,手动加载负责声卡的模块就足够了。在内核中没有设置手动添加声卡的限制
声卡限制值定义为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
中的检查