6

我正在开展一个教育性多座位项目,我们需要将 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 个设备。任何指导都会很有用。

谢谢。

4

2 回答 2

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. 该限制被描述为仅限制自动加载的声卡的数量。为了克服这个限制,手动加载负责声卡的模块就足够了。内核中对手动添加的声卡没有设置限制。

来源:内核 2.8 Git

于 2013-01-07T18:41:57.697 回答
3

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

当我七年前增加这个时,我并没有超过 32,因为卡片索引被用作变量snd_cards_lockin的位索引sound/core/init.c,我不想改变太多。

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

这个限制也存在于alsa-lib包中;您至少必须更改签到snd_ctl_hw_opensrc/control/control_hw.c

于 2013-01-07T20:25:58.723 回答