Priorità processo driver audio

3 risposte [Ultimo contenuto]
Ritratto di rousou
rousou
(Junior)
Offline
Junior
Iscritto: 29/04/2008
Messaggi: 12

PREFAZIONE

Ciao a tutti! Sono contento possessore da innumerevoli anni della scheda audio DAC ILTW. Questo DAC monta il chip Tenor 8802 affetto da un bug che ne limita le prestazioni a partire da una certa versione del kernel linux (su windows e mac nessun problema Worried ). A quanto ho appreso online gli utenti si sono dati da fare e qualcuno ha sviluppato una patch che sembra funzionare, io non sono mai riuscito a mettermi in contatto con queste persone e la patch non sembra mai essere stata inserita nel codice del kernel, ed a questo punto probabilmente non lo sarà mai...

...inutile dire che da qualche anno non sono più un così tanto contento possessore Crying
IL CRIMINE

Il bug affligge la periferica solo in modalità "asincrona" cioè quando è attivato il generatore di clock interno alla scheda (più stabile di quello di sistema, il dettaglio riprodotto è su un altro pianeta, meno impastato, si distinguono tutti i suoni nei pieni d'orchestra...una favola insomma!). Il bug genera un disturbo sonoro che in inglese definiscono "crackling" (click, pop, crack) ogni tot secondi (30~200). [che non pare di ascoltare un vinile solo perchè saltuario]

LA SCOPERTA
Ho iniziato ad usare il kernel RT qualche mese fa ed ho ridotto l'entità del problema, ieri però ho tentato una nuova strada ed ho provato ad aumentare la priorità del processo del software di riproduzione, DeadBeef, con tanto eccellenti risultati da rendere la scheda audio quasi utilizzabile in questa modalità! In particolare il disturbo è meno frequente, ed è più breve...insomma passa quasi inosservato.

LA CONFIGURAZIONE
Da DeadBeef esco con "ALSA Output Plugin" -> "Direct Hardware Device Without Any Conversion" ed è mia premura sopra ogni cosa rimanere in questa modalità che, all'orecchiotest, garantisce miglior qualità audio.

LA DOMANDA
Come si fa a portare alla priorità massima i processi che gestiscono l'audio, ALSA e tutto ciò che sta fra il lettore BlueRay e la periferica? Quali sono questi processi?

Grazie in anticipo a chiunque si prenda la briga di leggere questo papiro! =)

Buonanotte Sleepy

Ritratto di mcortese
mcortese
(Moderatore)
Offline
Moderatore
Iscritto: 27/02/2009
Messaggi: 2918

Se per leggere il BlueRay usi MPlayer, allora il processo sarà MPlayer. Se usi VLC, sarà VLC. Se usi un lettore che a sua volta lancia altri processi di contorno dovresti vedere la gerarchia con pstree. Se non mandassi l'output direttamente all'hardware potrebbe entrare in gioco anche il server PulseAudio, ma hai detto che lo scavalchi.

Ritratto di rousou
rousou
(Junior)
Offline
Junior
Iscritto: 29/04/2008
Messaggi: 12

Non leggo bluray, leggo CD! E per la musica utilizzo DeadBeef, che ho già portato alla massima priorità. Quindi alzando il processo di DeadBeef si alza automaticamente anche tutta la catena di ALSA?

Grazie!

Ritratto di homeless
homeless
(Guru)
Offline
Guru
Iscritto: 21/10/2011
Messaggi: 1288

rousou ha scritto:

Quindi alzando il processo di DeadBeef si alza automaticamente anche tutta la catena di ALSA?


No.

ALSA ha componenti che operano sia in spazio utente (e, quindi, se ne può implicitamente aumentare il livello di priorità di esecuzione a livello di spazio utente, come ti è stato indicato) che componenti eseguiti direttamente dal kernel linux. Questi ultimi componenti sono quelli in diretta comunicazione con l'hardware audio e, quindi, se desideri una maggiore affidabilità della tempistica di riproduzione, oltre che aumentare la priorità dei processi in spazio utente, hai l'opportunità di utilizzare un kernel linux di tipo "RT" ("real time") disponibile nei repository Debian. Naturalmente, se il computer non ha le necessarie risorse di calcolo per gestire un flusso audio in RT simultaneamente ad altri processi in spazio utente, ogni tentativo sarà vano.

In ogni caso, credo che la patch al kernel a cui fai riferimento è questa trovata qui tramite https://volumio.org/forum/usb-dac-with-tenor-te8802l-sound-drops-crackels-t4504.html:

sound/usb/card.h | 1 +
sound/usb/endpoint.c | 15 ++++++++++++++-
2 files changed, 15 insertions(+), 1 deletion(-)
 
diff --git a/sound/usb/card.h b/sound/usb/card.h
index 9867ab8..97acb90 100644
--- a/sound/usb/card.h
+++ b/sound/usb/card.h
@@ -92,6 +92,7 @@ struct snd_usb_endpoint {
unsigned int curframesize; /* current packet size in frames (for capture) */
unsigned int syncmaxsize; /* sync endpoint packet size */
unsigned int fill_max:1; /* fill max packet size always */
+ unsigned int udh01_fb_quirk:1; /* corrupted feedback data */
unsigned int datainterval; /* log_2 of data packet interval */
unsigned int syncinterval; /* P for adaptive mode, 0 otherwise */
unsigned char silence_value;
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
index e70a87e..289f582 100644
--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -471,6 +471,10 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
ep->syncinterval = 3;
 
ep->syncmaxsize = le16_to_cpu(get_endpoint(alts, 1)->wMaxPacketSize);
+
+ if (chip->usb_id == USB_ID(0x0644, 0x8038) /* TEAC UD-H01 */ &&
+ ep->syncmaxsize == 4)
+ ep->udh01_fb_quirk = 1;
}
 
list_add_tail(&ep->list, &chip->ep_list);
@@ -1105,7 +1109,16 @@ void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
if (f == 0)
return;
 
- if (unlikely(ep->freqshift == INT_MIN)) {
+ if (unlikely(sender->udh01_fb_quirk)) {
+ /*
+ * The TEAC UD-H01 firmware sometimes changes the feedback value
+ * by +/- 0x1.0000.
+ */
+ if (f < ep->freqn - 0x8000)
+ f += 0x10000;
+ else if (f > ep->freqn + 0x8000)
+ f -= 0x10000;
+ } else if (unlikely(ep->freqshift == INT_MIN)) {
/*
* The first time we see a feedback value, determine its format
* by shifting it left or right until it matches the nominal

Perché non verifichi se si applica alla versione del kernel che stai usando ?