====== PulseAudio e ALSA ======
Il sistema predefinito per la gestione dell'audio in Debian GNU/Linux si avvale di **ALSA** e di **PulseAdio**. Vedere le pagine del Debian Wiki: **[[https://wiki.debian.org/ALSA|ALSA]]** e **[[https://wiki.debian.org/PulseAudio|PulseAudio]]**.
**ALSA** fornisce i **driver** e una libreria (API) di basso livello, **PulseAudio** invece implementa una architettura client-server per collegare tra loro **sources** (processi, hardware di cattura audio, ecc.) e **sinks** (schede audio, processi locali o remoti, ecc.).
===== ALSA =====
ALSA fornisce alcuni **moduli kernel** per pilotare l'hardware (schede audio), inoltre fornisce di una **libreria** (pacchetto Debian **libasound2**) che consente ai programmi di accedere a particolari funzioni, quali canali audio multipli, Dolby AC3, ecc. Vengono forniti anche alcuni tool (nel pacchetto Debian **alsa-utils**) generalmente utilizzabili da riga di comando, quali **aplay**, **alsamixer**, ecc.
Ecco alcuni consigli per verificare se il sistema ALSA funziona correttamente.
Verificare che siano stati caricati i **moduli kernel** **%%snd_*%%**, in particolar modo **snd_pcm**. Se si deve utilizzare un programma che richiede l'obsoleto sistema OSS (Open Sound System), si dovrà caricare il modulo di compatibilità **%%snd-*-oss%%**, ma in tal caso non è possibile utilizzare il sistema ALSA nativo. In una situazione normale e aggiornata il sistema OSS è deprecato, al punto tale che può essere consigliato mettere in blacklist il modulo kernel relativo.
Verificare che ALSA abbia identificato le **schede audio**:
cat /proc/asound/cards
0 [Device ]: USB-Audio - USB Audio Device
C-Media Electronics Inc. USB Audio Device at usb-0000:04:00.4-3, full speed
1 [Generic_1 ]: HDA-Intel - HD-Audio Generic
HD-Audio Generic at 0xfc9c8000 irq 69
2 [Generic ]: HDA-Intel - HD-Audio Generic
HD-Audio Generic at 0xfc9c0000 irq 70
3 [acp ]: acp - acp
HCTechnology.Ltd.-HCAR5000_MI-Defaultstring
**ATTENZIONE**: Il numero assegnato ad ogni scheda non è deterministico. Può capitare che l'hardware risponda al kernel con tempi diversi ad ogni reboot; pertanto, nell'esempio precedente, il numero **0** non è necessariamente associato alla scheda **USB-AUDIO**, ma potrebbe corrispondere ad una delle **HDA-Intel**. È opportuno quindi usare l'identificativo fra parentesi quadrate (es. **Generic_1**) quando si voglia indicare una specifica scheda audio, ad esempio con il comando ''alsactl''.
Verificare che ALSA abbia identificato l'**hardware di playback**:
aplay --list-devices
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC255 Analog [ALC255 Analog]
Subdevices: 0/1
Subdevice #0: subdevice #0
Verificare quali **dispositivi PCM** (Pulse-code modulation, cioè dispositivi di suono digitale, sia di input che di output) sono disponibili:
aplay --list-pcms
null
Discard all samples (playback) or generate zero samples (capture)
jack
JACK Audio Connection Kit
pulse
PulseAudio Sound Server
default:CARD=PCH
HDA Intel PCH, ALC255 Analog
Default Audio Device
sysdefault:CARD=PCH
HDA Intel PCH, ALC255 Analog
Default Audio Device
front:CARD=PCH,DEV=0
HDA Intel PCH, ALC255 Analog
Front speakers
...
plughw:CARD=Generic_1,DEV=3
HD-Audio Generic, PHL 243V7
Hardware device with all software conversions
...
**NOTA**: Nell'esempio sopra il device **%%plughw:CARD=Generic_1,DEV=3%%** è una porta HDMI alla quale risulta collegato un monitor **Philips 243V**, dotato di altoparlanti.
Eseguire **alsamixer**, selezionare la scheda audio desiderata con **F6** e **impostare i livelli** per i device di playback, accertarsi che i canali non siano muti (tasto **M**).
Provare sia da **utente root** che da utente normale ad inviare un **audio digitale** direttamente al **dispositivo hardware** predefinito. Provare eventualmente anche gli altri device elencati da **%%aplay --list-pcms%%**:
aplay --device="default" /usr/share/sounds/alsa/Front_Center.wav
aplay --device="plughw:CARD=Generic_1,DEV=3" /usr/share/sounds/alsa/Front_Center.wav
**ATTENZIONE**: Il dispositivo **default** potrebbe non corrispondere direttamente ad un hardware, ma essere uno stack software a sua volta; ad esempio l'output di ''%%aplay --list-pcms%%'' potrebbe evidenziare come il //default// sia in effetti //Playback/recording through the PulseAudio sound server//.
==== Configurazione ALSA ====
Con il programma **alsamixer** è possibile impostare i livelli e lo stato mute/unmute dei vari controlli delle varie schede audio.
Per salvare le impostazioni correnti:
alsactl store
I valori vengono salvati nel file **/var/lib/alsa/asound.state**. Per ricaricare le impostazioni relative alla prima scheda audio:
alsactl restore 0
FIXME: Sembra che allo shutdown del sistema (Debian 13) il file asound.state viene sovrascritto con le impostazioni predefinite, pertanto il salvataggio delle impostazioni non sparavvive al reboot.
===== PulseAudio =====
Per verificare che il sistema PulseAudio funzioni è necessario anzitutto avere l'**elenco dei device** riconosciuti:
pacmd list-sinks
3 sink(s) available.
* index: 1
name:
driver:
...
quindi si prova ad inviare dell'audio ad uno di essi:
paplay --device=alsa_output.default -p /usr/share/sounds/alsa/Front_Center.wav
Verificare che il demone **/usr/bin/pulseaudio** sia in esecuzione. Nei normali ambienti grafici viene avviato a nome dell'utente che ha effettuato il login.
L'utente può autonomamente fermare e riavviare il demone, ad esempio per rileggere la configurazione oppure per annullare tutte le modifiche temporanee fatte dalla console **pacmd**:
pulseaudio --kill
pulseaudio --start
Eseguire il mixer grafico **pavucontrol**. Nella sezione //Output Devices//, //Hardware Output Devices// deve risultare la scheda audio pilotata da ALSA, ad esempio **Built-in Audio Analog Stereo**.
Se risulta **No output devices available** ovviamente l'audio non può funzionare. Dalla console testuale **pacmd** è possibile indagare lo stato attuale del sistema PulseAudio. Ecco alcuni comandi utili:
help
list-cards
list-sinks
list-modules
In condizioni normali deve risultare almeno una **scheda audio** e un **sink** (cioè un dispositivo che può ricevere audio digitale) entrambi pilotati dal driver **module-alsa-card.c**, Se esiste solo il sink **auto_null** (driver **module-null-sink.c**) vuol dire che la scheda audio ALSA non è stata presa in considerazione e quindi non è utilizzabile.
In generale, se non funziona tutto in automatico, è il sintomo di qualche problema; tuttavia si può provare a caricare qualche **modulo PulseAudio** manualmente. Ecco alcuni comandi da provare sempre nella console **pacmd**:
load-module module-alsa-sink
list-sinks
Ad esempio il bug [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=901148|#901148]] di Debian 10 impedisce il funzionamento dell'audio se è attivo il demone Timidity, infatti risulta disponibile solo il **sink null**. Caricando manualmente il modulo //module-alsa-sink// compare un sink con driver **module-alsa-sink.c** e nome **alsa_output.default**; grazie a questo l'audio funziona nuovamente. In **pavucontrol**, //Output Devices// è infatti apparso un device hardware **Built-in Audio**.
load-module module-detect
list-sinks
Caricando il modulo **module-detect** viene rilevato un nuovo sink, sempre associato al driver **module-alsa-sink.c**, ma con il nome **alsa_output.0.hdmi-stereo**. Si tratta dell'uscita audio su porta HDMI presente sulla scheda madre. In **pavucontrol**, //Output Devices//, compare anche il device hardware **Built-in Audio Digital Stereo (HDMI)**. L'elenco prodotto da **list-modules** si è allungato di un elemento.
Se si caricano nuovamente gli stessi moduli, si ottiene una duplicazione inutile dei sink disponibili.
load-module module-alsa-card
list-cards
Verificare se qualche processo ha in uso i device audio, eseguite come **utente root**:
fuser -v /dev/snd/*
lsof /dev/snd/*
Nel caso del bug [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=901148|#901148]] pare che il demone timidity prende possesso della scheda audio prima che lo faccia pulse PulseAudio, infatti alcuni dei device risultavano utilizzati dal processo timidity.
==== Configurazione PulseAudio ====
=== default-sink ===
In un sistema con più di una scheda audio è opportuno configurare quella predefinita, soprattutto per la riproduzione. La libreria client PulseAudio può essere configurata in user-space oppure system-wide (il client comunque gira in user-space). La modalità consigliata per una configurazione **system-wide** è aggiungere un file in **/etc/pulse/client.conf.d/**, ad esempio **99-local.conf**. La sintassi del file è documentata in ''man 5 pulse-client.conf''.
# To get the list pulseaudio sink devices (where audio goes):
# pulseaudio --start; pacmd list-sinks
# USB audio device:
default-sink = alsa_output.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00.analog-stereo
# Analog port (stereo 3.5 mm jack):
#default-sink = alsa_output.platform-fe00b840.mailbox.stereo-fallback
# Video HDMI port:
#default-sink = alsa_output.platform-fef00700.hdmi.hdmi-stereo
La parte più a destra del nome del sink, separata da un punto, è il nome del **profilo**; ad esempio **analog-stereo** oppure **iec958-stereo**.
I profili disponibili per ogni scheda audio vengono generati in automatico all'avvio del sistema e sono elencati dal comando ''pacmd list-cards''. Un solo profilo è quello attivo e non è possibile impostare il default sink su un profilo diverso da quello attivo.
È possibile cambiare il default sink da riga di comando:
pactl set-default-sink 'alsa_output.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00.analog-stereo'
:!: **ATTENZIONE**: La modifica del //default sink// effettuata dall'utente in **user-space** viene salvata in **$HOME/.config/pulse/** pertanto sono persistenti al reboot o al restart del client PulseAudio. Queste prevalgono sulle impostazioni system-wide. Ovviamente devono essere impostazioni valide all'avvio del client, ad esempio il profilo richiesto deve essere quello attivo.
:!: **ATTENZIONE**: Il sistema PulseAudio memorizza quale sink è stato utilizzato da un determinato programma; se tale programma viene avviato nuovamente esso verrà **collegato al sink utilizzato in precedenza** indipendentemente da quale risulta essere il //default sink// corrente.
=== Profilo attivo ===
Per elencare i profili disponibili e quello attivo per ciascuna scheda audio:
pacmd list-cards
3 card(s) available.
index: 0
name:
...
profiles:
input:analog-stereo: Analog Stereo Input (priority 65, available: unknown)
...
output:analog-stereo: Analog Stereo Output (priority 6500, available: unknown)
...
output:iec958-stereo: Digital Stereo (IEC958) Output (priority 5500, available: unknown)
...
active profile:
...
ports:
analog-input-mic: Microphone (priority 8700, latency offset 0 usec, available: unknown)
...
analog-output-speaker: Speakers (priority 10000, latency offset 0 usec, available: unknown)
...
iec958-stereo-output: Digital Output (S/PDIF) (priority 0, latency offset 0 usec, available: unknown)
...
Per cambiare il profilo attivo da riga di comando:
pactl set-card-profile 'alsa_card.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00' 'output:analog-stereo'
Per cambiare **system-wide** il profilo attivo di una scheda si può creare un file **/etc/pulse/default.pa.d/99-local.pa** (attenzione all'estensione che deve essere ''.pa''). Vedere la documentazione ''man 5 default.pa'' e ''man 5 pulse-cli-syntax''. Per impostare il profilo si indica:
set-card-profile alsa_card.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00 output:analog-stereo
Questa impostazione viene letta dal client PulseAudio al suo avvio.
:!: **ATTENZIONE**: La modifica dell'//active profile// effettuata dall'utente in **user-space** **non è persistente** al reboot o al restart del client PulseAudio. Le impostazioni system-wide (es. ''/etc/pulse/default.pa.d/99-local.pa'') prevalgono.
=== Stato dei controlli ===
Per vedere/cambiare lo stato di mute/unmute da riga di comando:
pactl get-sink-mute 'alsa_output.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00.iec958-stereo'
pactl set-sink-mute 'alsa_output.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00.iec958-stereo' 0
Per vedere/cambiare il volume da riga di comando:
pactl get-sink-volume 'alsa_output.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00.iec958-stereo'
pactl set-sink-volume 'alsa_output.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00.iec958-stereo' 100% 100%
* **[[https://wiki.archlinux.org/title/PulseAudio/Examples|ArckWiki - PulseAudio Examples]]**
===== Configurazione programmi =====
In generale i programmi GNU/Linux possono utilizzare **vari sottosistemi audio**, ad esempio l'obsoleto **OSS**, oppure direttamente il sistema **ALSA**. L'utilizzo di **PulseAudio** (quando installato e supportato dal programma) è ovviamente preferibile perché consente l'accesso concorrente e non bloccante al device audio.
==== Mplayer ====
Per una configurazione system-wide su un sistema Debian è sufficiiente aggiungere una riga in **/etc/mplayer/mplayer.conf.local** (che viene incluso dal file principale mplayer.conf):
# Use Pulseaudio for output, instead of ALSA directly.
ao=pulse
==== Audacious ====
Dal menu **File** => Settings... => Audio => Output plugin => **PulseAudio Output**.
==== Avidemux ====
Dal menu **Edit** => Preferences => Audio => AudioDevice => **PulseAudioS**.
==== Ardour ====
**Ardour versione 5.12.0** (Debian 10) supporta i sottosistemi audio **ALSA** e **JACK**. Utilizzando ALSA il sistema audio viene impegnato in modo esclusivo da Ardour. FIXME Cosa significa e come si fa eventualmente ad usare JACK?
==== Audacity ====
È possibile scegliere indipendentemente il device per l'input (icona microfono) e per l'output (icona altoparlante) dal menu a discesa **Recording Device** e **Playback Device** rispettivamente. FIXME A cosa server il menu a discesa **Audio Host** che presenta la sola voce **ALSA**?
===== Web References =====
* **[[https://unix.stackexchange.com/questions/473694/pulseaudio-not-recognizing-intel-hda-after-upgrading-to-debian-testing-buster|PulseAudio not recognizing Intel HDA after upgrading to Debian testing (Buster)]]**
* **[[https://wiki.archlinux.org/index.php/PulseAudio_(Italiano)|PulseAudio Arch Linux Wiki]]**
* **[[https://askubuntu.com/questions/294512/setting-the-default-alsa-device-for-pulseaudio|Setting the default ALSA device for Pulseaudio]]**