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).
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:
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:
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:
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:
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:
Personalmente ho aggiunto anche un tweak alla priorità per il miglioramento della qualità:
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:
Adesso digitiamo:
l'output restituito sarà qualcosa del genere:
calcoliamo i default-fragments e i default-fragment-size-msec da impostare.
Avviamo il comando: pacmd list-sinks | grep "sample spec":
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):
e con questo abbiamo concluso.
Esempio di configurazione:
Salviamo il file, e applichiamo le modifiche con:
Se avete qualcosa da aggiungere non esitate a suggerirmi!
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
Andate alla fine del file, e aggiungete il seguente:
Codice:
resample-method = src-sinc-best-quality
Ancora sotto scriviamo:
Codice:
default-sample-format = float32ne
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
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
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
Codice:
# cat ~/pulseverbose.log | grep device.buffering | head -2
Codice:
: sink.c: device.buffering.buffer_size = "705600"
: sink.c: device.buffering.fragment_size = "352800"
Avviamo il comando: pacmd list-sinks | grep "sample spec":
Codice:
sample spec: s32le ch 2 44100 Hz
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
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!