2013-01-07 13 views
6

Sto lavorando a un progetto educativo multiseat in cui è necessario collegare 36 tastiere e 36 schede audio USB a un singolo computer. Stiamo eseguendo Ubuntu Linux 12.04 con il kernel 3.6.3-030603-generico.Sono necessarie più di 32 schede audio USB sul mio sistema

Finora siamo riusciti a ottenere l'input dalle 36 tastiere e abbiamo riconosciuto le 36 schede audio senza ottenere il panico del kernel (cosa che accadeva prima dell'aggiornamento del kernel). Sappiamo che le 36 schede audio sono state riconosciute perché le uscite $ lsusb | grep "Audio" -c36.

Tuttavia, $ aplay -l elenca 32 dispositivi di riproduzione in totale (compresa la scheda audio "interna"). Inoltre, $ alsamixer -c 32 dice "indice carta non valido: 32" (funziona solo da 0 a 31, anche 32 in totale).

Quindi la mia domanda è: come posso accedere alle altre schede audio se non sono nemmeno elencate con questi comandi? Sto scrivendo un'applicazione in python e ci sono alcune librerie tra cui scegliere, ma temo che saranno limitati a 32 dispositivi in ​​totale a causa di questo. Qualsiasi guida sarà utile.

Grazie.

+2

Hai paura o l'hai provato? – Crisfole

+0

Ho provato pyaudio e get_device_count() elenca 32 in totale, inclusi alcuni alias (non sono sicuro se la parola giusta) come "default". Così posso accedere anche a meno dispositivi. – picheto

+1

Come hai collegato tutti questi dispositivi al PC? Non sarà troppo per la larghezza di banda del bus? È possibile utilizzare attualmente tutti i 31 dispositivi allo stesso tempo? –

risposta

7

La domanda che ponete è fondamentalmente: possono esserci più di 32 schede audio nel sistema controllato da ALSA? Ovviamente sembra che mentre i controller USB conoscono tutte le schede audio collegate, il sistema ALSA no.

Entriamo nei sorgenti del kernel per verificare cosa sta succedendo qui. In /sound/core/sound.c troverete ulteriori informazioni sul problema delle schede audio massimo:

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); 

Dal codice e dei suoi commenti che ho letto due cose:

  1. Il cards_limit variabile è un parametro del modulo. Presumo che durante l'installazione questo parametro sia impostato su 32. Se il supporto ALSA è integrato nel kernel, è possibile creare un kernel personalizzato in cui è stata modificata questa opzione. Se il supporto ALSA non è integrato, ma caricato come modulo, è possibile impostare questo parametro durante il caricamento del modulo. Per questo è necessario modificare la configurazione del sistema (man modprobe.d) o scaricare il modulo, quindi ricaricarlo con l'opzione (man modprobe).

  2. Il limite è descritto per limitare solo il numero di schede audio caricate automaticamente. Per superare questo limite, potrebbe essere sufficiente caricare manualmente il modulo responsabile delle tue schede audio. Non ci sono limiti impostati nel kernel per le schede audio aggiunte manualmente.

Fonte: Kernel 2.8 Git

+1

Il meccanismo di caricamento automatico influenzato da 'cards_limit' non viene utilizzato per le schede audio USB. Il caricamento manuale di 'snd-usb-audio' non può cambiare nulla perché è lo stesso driver per tutti e 36 i dispositivi. –

3

Il limite scheda audio è definito come il simbolo SNDRV_CARDS in include/sound/core.h.

Quando ho aumentato questo sette anni fa, non sono andato al di là di 32, perché l'indice di carta viene utilizzata come un indice di bit per la variabile snd_cards_lock in sound/core/init.c, e non mi ha voluto cambiare più del necessario.

Se si effettua snd_cards_lock una variabile a 64 bit, modificare tutti gli accessi ad utilizzare un tipo a 64-bit, e regolare ogni altro effetto collaterale che avrei potuto dimenticato, si dovrebbe essere in grado di ottenere il kernel di avere più ALSA carte.

Questo limite esiste anche nel pacchetto alsa-lib; sarà necessario modificare almeno il check-in snd_ctl_hw_open in src/control/control_hw.c.

+0

Faremo un controllo, grazie mille – picheto