Guida Come ottenere una migliore qualità del suono con PulseAudio

Stato
Discussione chiusa ad ulteriori risposte.

nullptr

Utente Emerald
26 Novembre 2015
1,096
21
368
356
Ultima modifica:
Salve, in questa guida presenterò dei metodi per ottenere una migliore qualità dell'audio con PulseAudio, dando alcuni ritocchi sulla configurazione del daemon quest'ultimo. Il problema l'ho affrontato qualche mese fa, dopo aver notato che con un numero elevato di volume l'audio si intorpidiva, portava al 70% con la musica attivata un frastuono fastidioso (una sorta d'effetto dell'audio clipping).

Originariamente ho preso spunto da questa guida, ma ho aggiunto molti più dettagli e qualche metodo in più sulle configurazioni che dovranno essere ritoccate

ATTENZIONE: Modificare con cautela, questa guida potrebbe portare ad avere grosso impatto alla CPU.

Bando alle ciance, iniziamo. Prima di tutto possiamo notare che il file di configurazione risiede qui: `/etc/pulse/daemon.conf`, se è stato alterato almeno una volta, create un file di backup:
Codice:
~ sudo cp /etc/pulse/daemon.conf /etc/pulse/daemon.conf.old
in caso non sia mai stato alterato, andate tranquilli e aprite il file da modificare senza toccare le parti commentate con il punto e virgola ';'.
Andate alla fine del file, e aggiungete il seguente:
Codice:
resample-method = src-sinc-best-quality
in questo modo state scegliendo la qualità più alta che c'è per il resampling filter. Il resampling consiste nel cambiare la risoluzione dell'audio alterando la frequenza di campionamento.

Ancora sotto scriviamo:
Codice:
default-sample-format = float32ne
con `default-sample-format` definiamo il formato del capionamento che verrà utilizzato, noi scegliamo float32ne. Tutti quelli disponibili sono: u8, s16le, s16be, s24le, s24be, s24-32le, s24-32be, s32le, s32be float32le, float32be, ulaw, alaw. Di default viene utilizzato l'endian nativo a 16bit, l'alias di questa modalità è s16le.
Certa gente utilizza il formato s32le, però trovo più opportuno utilizzare float32ne: certe informazioni comprovano che float32ne (32-bit big endian) dovrebbe essere un formato più sicuro di alta qualità (in quanto dovrebbe dare produzione di audio di qualità più alta), e a quanto pare è questo ad influire molto nello sminuire quelle distorsioni di audio che provavo prima che lo settassi. Infatti s32le rappresenta il metodo di campionamento basato su semplice integer, float32ne su tipo floating point.

Aggiungiamo sotto:
Codice:
alternate-sample-rate = 96000
di default viene utilizzata la configurazione di 48 kHz. Noi impostiamo a 96 kHz, così che se vogliamo ascoltare una traccia audio che ha un flusso di 96 kHz (che la scheda supporta, ovviamente) passiamo direttamente al rate di 96 kHz ed evitiamo il campionamento.

Per configurare più di 2 altoparlanti aggiungiamo:
Codice:
default-sample-channels = 6
default-channel-map = front-left,front-right,rear-left,rear-right,center,subwoofer


Personalmente ho aggiunto anche un tweak alla priorità per il miglioramento della qualità:
Codice:
nice-level = -15
io ho settato a -20 (il massimo), ma è sconsigliato e temerario.

Ultima messa a punto, questa impostazione vi servirà per prevenire blocchi del playback (ed è inadeguatamente documentata, perciò la considererei discrezionale/opzionale). Dobbiamo configurare i parametri `default-fragments` e `default-fragment-size-msec`; il primo è 4 e il secondo è 25 di default. Impostando questi valori, i campioni audio (le misurazioni del segnale) verranno divisi in più frammenti ogni `default-fragment-size-msec`.

Dobbiamo avviare il verbose logging di PulseAudio:
Codice:
# echo "autospawn = no" | sudo tee /etc/pulse/client.conf
# killall pulseaudio
# LANG=C pulseaudio -vvvv > ~/pulseverbose.log 2>&1
Adesso digitiamo:
Codice:
# cat ~/pulseverbose.log | grep device.buffering | head -2
l'output restituito sarà qualcosa del genere:
Codice:
: sink.c:     device.buffering.buffer_size = "705600"
: sink.c:     device.buffering.fragment_size = "352800"
calcoliamo i default-fragments e i default-fragment-size-msec da impostare.
Avviamo il comando: pacmd list-sinks | grep "sample spec":
Codice:
sample spec: s32le ch 2 44100 Hz
Nella mia configurazione utilizzo il sampling rate (44,1 kHz @ 32 bit). Faccio $44100\times32=1411200$ bps (bits per second, la norma è fare $Hz \times bit=bps$); se 44100 Hz moltiplicato per 16 fa 705600 bps e per stereo equivale a 1411200 bps, facciamo per $1411200\times2=2822400$ bps per stereo.
Riprendendo l'output del penultimo comando digitato (cat pulseverbose.log | grep device.buffering | head -2) nel mio caso faccio $705600\div2822400=0,25$s = 250ms, e $352800\div2822400=125$ms.
Il numero di frammenti si ottiene dividendo buffer size (705600) con il fragment size (352800) (quindi nel mio caso, 2):
Codice:
default-fragments = 2
default-fragment-size-msec = 125
e con questo abbiamo concluso.

Esempio di configurazione:
Codice:
resample-method = src-sinc-best-quality
default-sample-format = float32ne

alternate-sample-rate = 96000

default-sample-channels = 6
default-channel-map = front-left,front-right,rear-left,rear-right,center,subwoofer

nice-level = -20

default-fragments = 2
default-fragment-size-msec = 125


Salviamo il file, e applichiamo le modifiche con:
Codice:
# pulseaudio --kill
# pulseaudio --check # se non vi stampa nulla significa che la configurazione è valida
# pulseaudio --start

Se avete qualcosa da aggiungere non esitate a suggerirmi!
 
  • Mi piace
Reazioni: oscarandrea
Personalmente ho sempre avuto problemi con pulse, preferisco di gran lunga solo alsa (o anche apulse), comunque sposto nella sezione guide.Bel lavoro
 
Ultima modifica:
Personalmente ho sempre avuto problemi con pulse, preferisco di gran lunga solo alsa (o anche apulse), comunque sposto nella sezione guide.Bel lavoro
Teoricamente alsamixer è una dipendenza di pulseaudio. Questo grafico spiega come gerarchicamente è organizzato il sound server:
1000px-Pulseaudio-diagram.svg.png

alsamixer in questo caso è il master volume controller di pulseaudio. Probabile che tu preferisci utilizzare solo alsamixer perchè pulseaudio ti arreca problemi, però bisogna "appurare" che pulseaudio è in grado di fare cose molto più accorte (eg. gestire l'audio individualmente per ogni applicazione, controllare direttamente le schede audio, e molto altro), è molto più flessibile, robusto ed è più portatile (è multipiattaforma), alsamixer è Linux-only.
Comunque, grazie per aver spostato la guida, non avevo considerato questa sottosezione.
 
Teoricamente pulseaudio è una dipendenza di alsamixer. Questo grafico spiega come gerarchicamente è organizzato il sound server:
1000px-Pulseaudio-diagram.svg.png

alsamixer in questo caso è il master volume controller di pulseaudio. Probabile che tu preferisci utilizzare solo alsamixer perchè pulseaudio ti arreca problemi, però bisogna "appurare" che pulseaudio è in grado di fare cose molto più accorte (eg. gestire l'audio individualmente per ogni applicazione, controllare direttamente le schede audio, e molto altro), è molto più flessibile, robusto ed è più portatile (è multipiattaforma), alsamixer è Linux-only.
Comunque, grazie per aver spostato la guida, non avevo considerato questa sottosezione.
bella l'immagine, personalmente con alsa ho parecchi problemi. non avendo bisogno di configurazioni flessibili e complesse uso solamente alsa, comunque con apulse si possono fare moltissime cose che si potrebbero fare con pulse, dato che lo va ad emulare
https://github.com/i-rinat/apulse
 
Ultima modifica:
bella l'immagine, personalmente con alsa ho parecchi problemi. non avendo bisogno di configurazioni flessibili e complesse uso solamente alsa, comunque con apulse si possono fare moltissime cose che si potrebbero fare con pulse, dato che lo va ad emulare
https://github.com/i-rinat/apulse
Utilizzare apulse è la peggior cosa da fare: in primo luogo bisogna sottolineare che non è nemmeno nelle repository ufficiali di ArchLinux (e ciò significa che quel package è saltuariamente seguito e scarsamente rettificato in caso di bug o problemi), secondo l'ultimo aggiornamento di questo package è avvenuto moooolto tempo fa, in data del 15 febbraio del 2016 e dubito che un altro bump avverrà alla svelta. Terzo, l'autore ha scritto in chiaro questo su Github:
I don't have any plans for further development.
e ciononostante (che sia ancora disponibile da AUR), lo sviluppo del progetto è sospeso a tempo indeterminato. Molta gente si è lamentata del fatto che non funziona col 60% delle applicazioni (tra cui Skype e altro); tra l'altro nota che utilizzando 'sta roba non ti munisci del vero sound server pulseaudio, ma solo di conciliabili dipendenze/librerie che permettono ai software che quest'ultime vengano utilizzate per far svolgere qualcosa che dovrebbe essere fatta con pulseaudio. Qualcosa di fatto male a mio parere, io la considero fino ad adesso una peggior alternativa a pulseaudio, però renderla più versatile sarebbe una buona idea almeno per classificarla come una buona occasione per utilizzare una decente "versione di pulseaudio" ma minimalista.

@SpeedJack pareri?
 
Utilizzare apulse è la peggior cosa da fare: in primo luogo bisogna sottolineare che non è nemmeno nelle repository ufficiali di ArchLinux (e ciò significa che quel package è saltuariamente seguito e scarsamente rettificato in caso di bug o problemi), secondo l'ultimo aggiornamento di questo package è avvenuto moooolto tempo fa, in data del 15 febbraio del 2016 e dubito che un altro bump avverrà alla svelta. Terzo, l'autore ha scritto in chiaro questo su Github:

e ciononostante (che sia ancora disponibile da AUR), lo sviluppo del progetto è sospeso a tempo indeterminato. Molta gente si è lamentata del fatto che non funziona col 60% delle applicazioni (tra cui Skype e altro); tra l'altro nota che utilizzando 'sta roba non ti munisci del vero sound server pulseaudio, ma solo di conciliabili dipendenze/librerie che permettono ai software che quest'ultime vengano utilizzate per far svolgere qualcosa che dovrebbe essere fatta con pulseaudio. Qualcosa di fatto male a mio parere, io la considero fino ad adesso una peggior alternativa a pulseaudio, però renderla più versatile sarebbe una buona idea almeno per classificarla come una buona occasione per utilizzare una decente "versione di pulseaudio" ma minimalista.

@SpeedJack pareri?
ma in fatti come ho detto io non lo uso, so solo che molta gente che conosco la usa e funziona bene, comunque è presente nei repository di gentoo
FoJGqW0.png
 
ma in fatti come ho detto io non lo uso, so solo che molta gente che conosco la usa e funziona bene, comunque è presente nei repository di gentoo
FoJGqW0.png
Può indubbiamente esserci pure nella main repository di Gentoo, ma gli ultimi aggiornamenti fatti risalgono, come già detto, al periodo dell'anteguerra :asd:.
Su ArchLinux invece la cosa è molto più ordinata: nelle repository ufficiali tutti i package vengono costantemente aggiornati in un massimo di tempo specificato dato che molti utenti segnalano richieste, bug e altro. Su AUR, beh... dipende. Infatti apulse sta su AUR.
 
Ho sistemato alcune cose nel post utilizzando LaTeX. Per vedere le formule matematiche dovete utilizzare questo bookmarklet:
JavaScript:
javascript:(function(){if(window.MathJax===undefined){var%20script%20=%20document.createElement("script");script.type%20=%20"text/javascript";script.src%20=%20"https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML";var%20config%20=%20%27MathJax.Hub.Config({%27%20+%20%27extensions:%20["tex2jax.js"],%27%20+%20%27tex2jax:%20{%20inlineMath:%20[["$","$"],["\\\\\\\\\\\\(","\\\\\\\\\\\\)"]],%20displayMath:%20[["$$","$$"],["\\\\[","\\\\]"]],%20processEscapes:%20true%20},%27%20+%20%27jax:%20["input/TeX","output/HTML-CSS"]%27%20+%20%27});%27%20+%20%27MathJax.Hub.Startup.onload();%27;if%20(window.opera)%20{script.innerHTML%20=%20config}%20else%20{script.text%20=%20config}%20document.getElementsByTagName("head")[0].appendChild(script);}else{MathJax.Hub.Queue(["Typeset",MathJax.Hub]);}})();
incollatelo al posto del link di questa pagina e vedere l'effetto. Se utilizzate Chrome fate attenzione a far sì che non venga omesso il suffisso `javascript:`, alcuni browser lo elidono in automatico.
 
  • Mi piace
Reazioni: oscarandrea
Stato
Discussione chiusa ad ulteriori risposte.