2013-01-07 13 views
6

Ich arbeite an einem erzieherischen Multiseat-Projekt, bei dem wir 36 Tastaturen und 36 USB-Soundkarten an einen Computer anschließen müssen. Wir betreiben Ubuntu Linux 12.04 mit dem generischen Kernel 3.6.3-030603.Benötige mehr als 32 USB-Soundkarten auf meinem System

Bis jetzt haben wir es geschafft, die Eingabe von den 36 Tastaturen zu bekommen und die 36 Soundkarten zu erkennen, ohne einen Kernel Panic zu bekommen (was vor der Aktualisierung des Kernels passiert ist). Wir wissen, dass die 36 Soundkarten erkannt wurden, da $ lsusb | grep "Audio" -c Ausgaben 36 sind.

Allerdings enthält $ aplay -l insgesamt 32 Wiedergabegeräte (einschließlich der "internen" Soundkarte). Auch $ alsamixer -c 32 sagt "Invalid Card Index: 32" (funktioniert nur von 0 bis 31; 32 insgesamt auch).

Meine Frage ist also, wie kann ich auf die anderen Soundkarten zugreifen, wenn sie nicht mit diesen Befehlen aufgelistet sind? Ich schreibe eine Anwendung in Python und es gibt einige Bibliotheken zur Auswahl, aber ich befürchte, dass sie deswegen insgesamt auf 32 Geräte beschränkt sind. Jede Anleitung wird nützlich sein.

Danke.

+2

Haben Sie Angst oder haben Sie es getestet? – Crisfole

+0

Ich versuchte Pyaudio, und get_device_count() listet 32 ​​insgesamt, einschließlich einiger Aliase (nicht sicher, ob das richtige Wort) wie "Standard". So kann ich auf noch weniger Geräte zugreifen. – picheto

+1

Wie haben Sie alle diese Geräte an den PC angeschlossen? Wird das nicht zu viel für die Busbandbreite sein? Können Sie tatsächlich die aktuellen 31 Geräte gleichzeitig nutzen? –

Antwort

7

Die Frage, die Sie stellen, ist im Grunde: Können mehr als 32 Soundkarten im System von ALSA gesteuert werden? Offensichtlich wissen Ihre USB-Controller zwar alle angeschlossenen Soundkarten, das ALSA-System jedoch nicht.

Lassen Sie uns in die Kernelquellen gehen, um zu überprüfen, was hier vor sich geht.

39 static int cards_limit = 1; 
    40 
    41 MODULE_AUTHOR("Jaroslav Kysela <[email protected]>"); 
    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); 

Vom Code und seine Kommentare Ich las zwei Dinge:

  1. Die Variable cards_limit ist ein Modulparameter in /sound/core/sound.c finden Sie weitere Informationen über die Frage der maximalen Soundkarten finden. Ich nehme an, dass dieser Parameter bei Ihrer Installation auf 32 gesetzt ist. Wenn die ALSA-Unterstützung in den Kernel integriert ist, können Sie einen benutzerdefinierten Kernel erstellen, in dem Sie diese Option geändert haben. Wenn die ALSA-Unterstützung nicht integriert, sondern als Modul geladen ist, können Sie diesen Parameter während des Ladens des Moduls festlegen. Dazu ändern Sie entweder Ihre Systemkonfiguration (man modprobe.d) oder entladen das Modul und laden es dann mit der Option (man modprobe) neu.

  2. Die Begrenzung wird beschrieben, um nur die Anzahl der automatisch geladenen Soundkarten zu begrenzen. Um dieses Limit zu überwinden, reicht es aus, das für Ihre Soundkarten zuständige Modul manuell zu laden. Für manuell hinzugefügte Soundkarten ist im Kernel kein Limit festgelegt.

Quelle: Kernel 2.8 Git

+1

Der automatische Lade-Mechanismus, der von 'cards_limit' betroffen ist, wird nicht für USB-Soundkarten verwendet. Das manuelle Laden von 'snd-usb-audio' kann nichts ändern, da es sich um den gleichen Treiber für alle 36 Geräte handelt. –

3

Die Soundkarte Grenze wird als Symbol definiert SNDRV_CARDS in include/sound/core.h.

Als ich vor sieben Jahren stieg, ging ich nicht über 32 hinaus, weil der Kartenindex als Bit-Index für die Variable snd_cards_lock in sound/core/init.c verwendet wurde, und ich wollte nicht mehr als nötig ändern.

Wenn Sie snd_cards_lock eine 64-Bit-Variable machen, alle Zugriffe ändern, um einen 64-Bit-Typ zu verwenden, und alle anderen Nebeneffekte korrigieren, die ich vielleicht vergessen habe, sollten Sie mehr ALSA bekommen Karten.

Diese Grenze existiert auch im alsa-lib Paket; Sie müssen mindestens den Check-in snd_ctl_hw_open in src/control/control_hw.c ändern.

+0

Wir werden das überprüfen, vielen Dank – picheto