我正在从事一个教育性多座位项目,我们需要将 36 个键盘和 36 个 USB 声卡连接到一台计算机。我们正在运行带有 3.6.3-030603 通用内核的 Ubuntu Linux 12.04。
到目前为止,我们已经成功地从 36 个键盘获得了输入,并识别了 36 个声卡而没有出现内核 panic (发生在更新内核之前)。我们知道 36 声卡已被识别,因为 $ lsusb | grep "Audio"-c
输出 36
。
但是,$ aplay -l
总共列出了 32 个播放设备(包括“内部”声卡)。此外,$ alsamixer -c 32
表示“无效的卡片索引:32”(仅适用于 0 到 31;总共 32)。
所以我的问题是,如果这些命令甚至没有列出其他声卡,我该如何访问它们?我正在用 python 编写一个应用程序,有一些库可供选择,但恐怕它们也会因此而被限制为总共 32 个设备。任何指导都会很有用。
谢谢。
您提出的问题基本上是:ALSA 控制的系统中可以有超过 32 个声卡吗?很明显,虽然您的 USB Controller 知道您连接的所有声卡,但 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
) 重新加载它。
<
限制被描述为仅限制自动加载声卡的数量。要克服此限制,手动加载负责声卡的模块可能就足够了。内核中没有为手动添加的声卡设置限制。
来源:Kernel 2.8 Git