Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的系统上需要32个以上的USB声卡_Python_Linux_Alsa_Udev_Soundcard - Fatal编程技术网

Python 我的系统上需要32个以上的USB声卡

Python 我的系统上需要32个以上的USB声卡,python,linux,alsa,udev,soundcard,Python,Linux,Alsa,Udev,Soundcard,我正在从事一个教育性的multiseat项目,我们需要将36个键盘和36个USB声卡连接到一台计算机上。我们使用3.6.3-030603-generic内核运行UbuntuLinux12.04 到目前为止,我们已经成功地从36个键盘获取了输入,并且在没有内核恐慌的情况下识别了36个声卡(这是在更新内核之前发生的)。我们知道36张声卡已被识别,因为$lsusb | grep“Audio”-c输出36 但是,$aplay-l总共列出了32个播放设备(包括“内部”声卡)。另外,$alsamixer-c

我正在从事一个教育性的multiseat项目,我们需要将36个键盘和36个USB声卡连接到一台计算机上。我们使用3.6.3-030603-generic内核运行UbuntuLinux12.04

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

但是,
$aplay-l
总共列出了32个播放设备(包括“内部”声卡)。另外,
$alsamixer-c32
表示“无效卡片索引:32”(仅从0到31工作;总共32个)

所以我的问题是,如果其他声卡没有列出这些命令,我如何访问它们?我正在用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);
39静态整数卡\u限制=1;
40
41单元作者(“Jaroslav Kysela”);
42模块描述(“声卡的高级Linux声音体系结构驱动程序”);
43模块许可证(“GPL”);
44模块参数(主要,内部,0444);
45单元描述(大调,“大调”用于声音驱动);
46模块参数(卡片限制,int,0444);
47模块描述(卡限制,“自动加载声卡计数”);
48模块别名专业(配置专业);
49
50/*此卡保留当前可用的实际最大卡号。
51*默认情况下,它与cards_limit选项相同。当更多
52*模块手动加载,此限制数量也会增加。
53  */
54国际信用证限额;
55出口符号(snd ecards限制);
从代码及其注释中,我了解到两件事:

  • 变量U限制是一个模块参数。我假设在您的安装中,此参数设置为32。如果内核内置了ALSA支持,您可以在更改此选项的地方构建自定义内核。如果ALSA支持不是内置的,而是作为模块加载的,则可以在模块加载期间设置此参数。为此,您可以更改系统配置(
    manmodprobe.d
    )或卸载模块,然后使用选项(
    manmodprobe
    )重新加载模块

  • 该限制仅用于限制自动加载声卡的数量。要克服此限制,手动加载负责声卡的模块就足够了。内核中没有设置手动添加声卡的限制


  • 来源:

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

    七年前,当我增加这个值时,我没有超过32,因为卡片索引被用作
    sound/core/init.c
    中变量
    snd_cards\u lock
    的位索引,我不想做过多的更改

    如果您将
    snd\u cards\u lock
    设置为64位变量,将所有访问更改为使用64位类型,并调整我可能已经忘记的任何其他副作用,您应该能够使内核具有更多ALSA卡


    此限制也存在于
    alsa lib
    包中;您必须至少更改
    src/control/control\u hw.c

    中的签入
    snd\u ctl\u hw\u open
    ,您害怕还是测试了它?我尝试了pyaudio,get\u device\u count()总共列出了32个,包括一些别名(不确定是否正确的单词),例如“default”。所以我可以访问更少的设备。你是如何将所有这些设备连接到电脑的?这对总线带宽来说不是太多了吗?你真的可以同时使用当前的31台设备吗?对于我们正在试用的应用程序,它们不需要同时播放(但它们都必须在某个时间播放声音)。它们使用2个根集线器连接到另一个级别的集线器,每个集线器有3个声卡和3个键盘。我们还需要找出它是否以这种方式工作,或者找到另一种解决方案,例如添加另一个根集线器并重新分发它们,或者添加一个队列或其他东西。我将阅读有关总线带宽的信息,谢谢;)受
    卡\u限制影响的自动加载机制不用于USB声卡。手动加载
    snd usb音频
    无法更改任何内容,因为所有36台设备的驱动程序都相同。