Linux sul pc "delle radio" - l'audio


Tra i tanti motivi che mi hanno fatto scegliere Linux come piattaforma preferenziale nello shack ci sono la semplicità con cui vengono gestiti device multipli e la consapevolezza che di solito si può metter mano al software per adattarlo alle situazioni che si possono venire a creare. Nello specifico la mia esigenza del tempo era quella di un server che potesse controllare da remoto uno o più ricevitori e fare lo streaming dell'audio, tutto questo mentre il pc continuava a poter essere impiegato in locale. I test con Windows non diedero risultati soddisfacenti nella gestione di diverse porte seriali e schede audio in contemporanea mentre girava il robottino IRC, così mi attestai sul pinguino, che fino a quel momento avevo testato sporadicamente.
Il problema di Linux, lo sanno tutti quelli che ci sono passati, è che ha un potenziale enorme ma talvolta attività che diamo per scontate possono rivelarsi un incubo.
La gestione dell'audio è tra queste.
Il modello a bazar di sviluppo significa che iognuno va per la propria strada, a volte le scelte sono dettate da crociate ideologiche e se il tuo hardware non è tra i più diffusi scovare la soluzione può essere molto complicato. Si viene rimandati a manuali e procedure vecchi di anni in cui metà dei riferimenti non sono più validi, passando per bug-reports bellamente ignorati dagli sviluppatori in favore di sviluppi più fighi in mezzo ad una giungla in cui ogni installazione è sostanzialmente diversa dall'altra, quindi la stessa soluzione può benissimo non essere adatta a tutti.
Dopo anni di pesantissime imprecazioni sono comunque giunto ad una certa stabilità, con le mie tre schede funzionanti su Ubuntu 10.04LTS.
Alcuni passaggi cruciali sono stati:
nello specifico la scheda integrata sulla motherboard, riconosciuta come "HDA VIA VT82xx" crea problemi con alcune versioni di kernel, neanche troppo recenti. Si tratta di un bug riconosciuto e mai curato ufficialmente. Mesi di ricerche hanno portato alla soluzione implementando almeno questi due passaggi:
aprire, come root, il file che presenta le opzioni di boot: /boot/grub/grub.cfg
cercare verso la metà del testo i blocchi che definiscono le diverse versioni di kernel in uso sulla macchina e aggiungere il parametro in coda alla riga che inizia con "linux":
menuentry 'Ubuntu, con Linux 3.0.4oss3' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        set gfxpayload=$linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root bd7db985-74ae-450a-b4e6-50bd61e99ad2
        linux   /boot/vmlinuz-3.0.4oss3 root=UUID=bd7db985-74ae-450a-b4e6-50bd61e99ad2 ro   crashkernel=384M-2G:64M,2G-:128M quiet splash vt.handoff=7 pci=use_crs
        initrd  /boot/initrd.img-3.0.4oss3

Questa non è la procedura ideale in quanto il parametro aggiuntivo decade tutte le volte che Grub viene aggiornato, in concomitanza con l'installazione di un nuovo kernel. Tant'è al momento non ricordo quale fosse il modo corretto di farlo, questo funziona e non c'è bisogno di metterci le mani così spesso. Quindi a me basta.
se non viene imposto diversamente, infatti, ad ogni boot in presenza di più schede le carte si mescolano. Quindi una volta /dev/dsp1 corrisponde alla scheda integrata sulla motherboard, la volta successiva magari a quella esterna USB. Chiaramente in questo modo è un fastidio perché non si può mai contare su un setup affidabile.
Si risolve specificando ad Alsa l'ordine in cui caricare i driver.  Ecco come:
Aprire come root il file /etc/modprobe.d/alsa-base.conf
Aggiungere a fianco dei moduli impiagati dalle proprie schede (al fondo del file) l'ordine desiderato attraverso il parametro index:
options snd-cmipci mpu_port=0x330 fm_port=0x388 index=0
options snd-via82xx index=1
options snd-hda-intel index=2
options snd-usb-audio index=3
Riavviare Alsa.
Il pannellino di controllo dei livelli sotto Gnome serve a selezionare quali schede audio debbano essere attive (per esempio ho "spento" quella integrata nell'uscita HDMI della scheda audio) e quali debbano gestire i livelli di ingresso (microfono) e uscita (speaker) di default.


Per avere il pieno controllo su tutte le entrate ed uscite, è bene invece ricorrere ad alsamixer
L'impiego dello strumento è intuito: con gli slider si può controllare se ogni ingresso/uscita debba essere attivato e con quale livello di ingresso/uscita.
Molto spesso quando si ha l'impressione che la scheda audio non funzioni correttamente è perché la voce specifica è disattivata oppure a livello zero.
I comandi principali per selezionare su quale scheda operare e se "riproduzione" o "registrazione" sono riportati direttamente sulla schermata dell'applicativo, sicché c'è poco da dire.



La scomparsa di /dev/dsp
Con il rilascio di Ubuntu 10.10 gli sviluppatori hanno avuto l'alzata d'ingegno di eliminare il supporto per OSS o, come si dice nel loro linguaggio, "deprecarlo".
Il motivo è tutt'altro che ovvio: da una parte dicono di averlo fatto perché complicava lo sviluppo di altre parti (OSSp... che però non veniva distribuito nello stesso rilascio!), dall'altra perchè "era ora di superare OSS con tutti i suoi difetti", tant'è hanno lasciato in braghe di tela tutti coloro che fino al giorno prima usavano software non più soggetto a sviluppo attivo e che richiede espressamente la storica architettura audio.
Questo non ha ripercussioni solo sui pochi che usano DSD, MultiMon e qualche altro software che non dispone di sostituti, ma anche la comunità ben più ampia di chi abbia giochi non open source e utenti di applicazioni multimediali di non ultimissima generazione.
Esistono alcuni workaround (per esempio padsp) che però non funzionano con tutti i pacchetti.

Per averci provato ed essermene pentito, non raccomando di seguire la strada della rimozione di PulseAudio/Alsa e loro sostituzione con OSS4 come suggerito in alcuni blog. La mia esperienza è che ci si troverà con limiti di natura diversa e, nel complesso, analogo risultato netto. Il desktop di Ubuntu infatti è ricco di interdipendenze e la rimozione dei due pacchetti lascia sempre qualche ferito sul campo (ovvero applicazioni non funzionanti). Inoltre OSS4 sembra avere ancora qualche problema con le periferiche USB, quindi chiude nettamente alcune strade come quella del FunCube Dongle.

Fortunatamente in Linux possiamo ricostruirci come vogliamo il sistema operativo. Quando ho iniziato a smanettare sulle prime distribuzioni, con le Slackware e Red Hat dei prmi anni '90, la compilazione del kernel non solo era procedura normale se si voleva che tutto l'hardware funzionasse, ma in ogni caso raccomandata per non portarsi dietro pezzi di codice che avrebbero sprecato risorse. Se le distribuzioni moderne hanno reso Linux molto più user friendly, è vero che al tempo stesso la connotazione "fai da te" diminuisce, con file di configurazione automatici orribilmente complicati e composti a loro volta da script automatici.

Per avre indietro i nostri /dev/dsp occorre ricompilare il kernel prevedendo il supporto per OSS. Ecco come ho fatto su Ubuntu 10.10 e 11.10:
[le righe che seguono sono per buona parte mutuate questa pagina:  http://www.question-defense.com/2010/09/26/how-to-recompile-your-ubuntu-10-10-kernel-for-patching-or-to-add-support-for-a-specific-device]

sudo apt-get install fakeroot kernel-wedge build-essential makedumpfile kernel-package libncurses5 libncurses5-dev
sudo apt-get build-dep --no-install-recommends linux-image-$(uname -r)

mkdir ~/source
cd ~/source
apt-get source linux-image-$(uname
-r)
cd <directory della versione di kernel scaricata>
make menuconfig
<M>   Sequencer support
<M>     Sequencer dummy client
<M>   OSS Mixer API
<M>   OSS PCM (digital audio) API
[*]     OSS PCM (digital audio) API - Include plugin system
[*]   OSS Sequencer API 

 <M>   OSS sound modules

il "-QD" evidenziato è una stringa a vostro piacimento che consenta di distinguere il kernel così compilato da quello fornito di serie. Non possono essere impiegati tutti i caratteri, ma occorre limitarsi agli alfanumerici.

cd ~/source
sudo dpkg -i linux-image-[qualcosa che dipende dalla versione e dall'identificatore che ci avete messo].deb
sudo dpkg -i linux-headers-
[qualcosa che dipende dalla versione e dall'identificatore che ci avete messo].deb

Naturalmente il nome esatto dei due file .deb da installare può essere appurato chiedendo la lista dei file con ls

sudo update-initramfs -c -k 2.6.35+QD

sudo update-grub

A questo punto dovremmo disporre degli agognati dispositivi.
sinager@SIRAD:~$ ls /dev/dsp*
/dev/dsp  /dev/dsp1  /dev/dsp3
sinager@SIRAD:~$

Ho anche installato dal repository oss-compat : non sono sicuro al 100% se serva, ma a me l'ambaradan adesso funziona con tutti i vecchi pacchetti.


Contact:indirizzo come immagine per diminuire lo spam


Pubblicato: Nov 2011 - Home