User Tools

Site Tools


doc:appunti:linux:sa:pulseaudio

This is an old revision of the document!


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: ALSA e 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 l'hardware di playback disponibile:

aplay -l
**** 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 -L
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
...

Eseguire alsamixer 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 -L:

aplay --device=default /usr/share/sounds/alsa/Noise.wav

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: <alsa_output.default>
        driver: <module-alsa-sink.c>
        ...

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 #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 #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.

Profilo attivo

Per elencare i profili disponibili e quello attivo per ciascuna scheda audio:

pacmd list-cards
3 card(s) available.
    index: 0
        name: <alsa_card.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00>
        ...
        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: <output:iec958-stereo>
        ...
        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. 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%

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

doc/appunti/linux/sa/pulseaudio.1760361396.txt.gz · Last modified: by niccolo