Home Homebrew Rilasciato uac-pstv-host v1.4: fix al bug dei 20 unplug e audio USB...

Rilasciato uac-pstv-host v1.4: fix al bug dei 20 unplug e audio USB più stabile su PlayStation TV

88
0

Pubblicato un rapido aggiornamento per uac-pstv-host, un plugin sviluppato dal developer SJK132 che permette di utilizzare dispositivi USB Audio Class 1 come schede audio, DAC e dongle per cuffie come uscita audio sulla PlayStation TV.

uac-pstv-host permette di trasferire l’intero audio di sistema della PlayStation TV verso un dispositivo USB compatibile con lo standard UAC1.

Una volta collegata la periferica, l’audio di giochi, titoli PlayStation 1, LiveArea ed effetti di sistema viene automaticamente indirizzato verso l’uscita USB, senza dover avviare applicazioni aggiuntive.

Il plugin supporta l’audio stereo a 16 bit e 48 kHz ed è compatibile con i firmware dalla versione 3.60 alla 3.73. È stato progettato esclusivamente per la PlayStation TV e si disattiva automaticamente quando viene utilizzato sulla PlayStation Vita. Non è invece previsto il supporto per microfoni o altri dispositivi di ingresso audio.

Tra gli aspetti più interessanti c’è anche la gestione automatica dell’uscita. Scollegando il dispositivo USB, l’audio torna infatti a essere riprodotto attraverso l’HDMI senza necessità di riavviare la console.

La nuova versione 1.4 si concentra principalmente sulla stabilità del plugin, intervenendo in particolare sulla gestione delle risorse USB durante i ripetuti collegamenti e scollegamenti delle periferiche.

Questo ha portato alla correzione di un problema che, dopo circa venti cicli di scollegamento e ricollegamento, poteva impedire all’audio di ripartire correttamente.

Installazione

Avvertenza: Utenti di StorageMgr: uac_pstv.skprx deve comparire prima di storagemgr.skprx nella sezione *KERNEL. In caso contrario, il dispositivo audio USB potrebbe non essere rilevato durante l’avvio.

  • Scaricare e copiare il plugin uac_pstv.skprx in ur0:tai/.
  • Aggiungere il plugin nella sezione *KERNEL di ur0:tai/config.txt

*KERNEL
ur0:tai/uac_pstv.skprx
ur0:tai/storagemgr.skprx

  • Riavviare la console per permettere di caricare il plugin in memoria.

Il dispositivo funzionerà?

Probabilmente sì, se si tratta di un modello semplice. Il trasporto è fisso, quindi un dispositivo deve dichiarare tutti i seguenti requisiti:

  • PCM a 48 kHz, stereo, 16-bit (USB Audio Class 1).
  • un endpoint OUT isocrono, adattivo o sincrono.
  • full speed con bInterval=1, oppure high speed con bInterval=4 — pacchetti da 1 ms.
  • una dimensione massima del pacchetto di almeno 192 byte.

Nella pratica, la maggior parte dei dongle per cuffie USB-C/USB-A economici e delle schede audio USB di base utilizza UAC1 e funziona. I dispositivi solo UAC2 non funzioneranno: questo include molti DAC audiophile di fascia alta, anche se molti di questi offrono anche una modalità UAC1.

Qualsiasi dispositivo non idoneo viene rifiutato durante il probe e la console continua a funzionare normalmente. Se un dispositivo non funziona e vuoi sapere perché, esegui la build con logging (vedi sotto) e cerca una riga reject ep: indicherà il motivo esatto.

Firmware supportati

I profili verificati sono 3.60, 3.61, 3.63, 3.65, 3.67, 3.68, 3.69, 3.70, 3.71, 3.72 e 3.73. Solo PlayStation TV; il plugin effettua un controllo e si scarica automaticamente su una PlayStation Vita portatile.

Il firmware non verificato (attualmente solo 3.74) viene rifiutato al collegamento USB senza installare alcun hook. Prima di poterlo aggiungere in sicurezza è necessario un campione reale del modulo SceAVConfig.

Come funziona

La console non dispone di un’API pubblica per “dammi l’audio che sta per essere riprodotto”, quindi il plugin utilizza il percorso proprietario di Sony.

SceAVConfig sa già come elaborare l’audio di sistema in un buffer RAM invece di inviarlo all’HDMI: è il percorso utilizzato per gestire l’audio Bluetooth.

Il plugin prende il controllo di quel percorso, quindi esegue un worker che fornisce alla funzione di output RAM SceAudio di Sony una coppia di buffer da 240 frame in modalità ping-pong.

Il PCM catturato viene inserito in un buffer di staging seqlock a quattro slot. Il formato della pagina più piccola è stato validato sull’hardware; per il resto, il contratto di output RAM di Sony rimane invariato.

Sul lato USB, un driver UAC1 enumera il dispositivo e analizza i suoi descrittori per trovare un’interfaccia di streaming che possa effettivamente gestire, seleziona l’impostazione alternativa e configura la frequenza di campionamento.

Un thread feeder suddivide i blocchi di staging da 240 frame in pacchetti da 48 frame (192 byte) e ruota quattro contesti isocroni fissi: tre gestiti da USBD e uno in stato READY o in fase di preparazione.

La callback di completamento invia il contesto READY più vecchio prima di risvegliare il feeder, mantenendo la pianificazione USB periodica in anticipo senza creare una coda audio profonda.

Due hook taiHEN permettono a Sony di cooperare mentre il percorso è sotto il controllo USB: uno reindirizza l’avvio di DataSend al worker di cattura del plugin, mentre l’altro assorbe localmente il wrapper di arresto fisico, in modo che lo smantellamento dello stream USB non debba attendere un completamento Bluetooth che non può mai arrivare.

Entrambi gli hook vengono rimossi dopo uno smantellamento completato correttamente; in caso di smantellamento fallito, il modulo rimane deliberatamente residente mantenendo intatto il proprio stato di possesso.

Il passaggio a Bluetooth non è implementato nella v1: un worker BT già attivo impedisce all’USB di prendere il controllo del percorso e il dispositivo USB dovrebbe essere scollegato prima di avviare una nuova sessione audio Bluetooth.

Alcuni dettagli sono importanti se vuoi esaminare il codice sorgente:

  • La latenza è di circa 13 ms: 5 ms per riempire un blocco di cattura, circa 5 ms perché il consumer è indietro di un blocco rispetto al producer, più 3 ms inviati all’USB.
  • Il buffer di staging utilizza una politica latest-wins, non è una coda. Il worker di cattura non è vincolato alla frequenza di 48 kHz: pubblica ciò che restituisce ram_submit, ogni volta che viene restituito, quindi una FIFO sottostante entrerebbe rapidamente in conflitto. Il seqlock consente al lettore di acquisire invece il blocco più recente.
  • Un singolo thread gestisce una sessione dall’inizio alla fine — apertura dei pipe, trasferimenti di controllo di configurazione, acquisizione del percorso e intero smantellamento. Le callback USB si limitano a notificare il thread e tornare, perché il rilascio del percorso può richiedere secondi e bloccare una callback di detach è ciò che provoca la perdita di eventi durante i ricollegamenti rapidi.
  • L’impostazione alternativa 0 viene selezionata durante uno smantellamento pulito, così un DAC esterno riceve l’indicazione che lo stream è terminato e torna al proprio clock interno invece di rimanere sincronizzato con l’USB.
  • La modalità USB host viene impostata all’avvio e nuovamente alla ripresa. La PSTV è normalmente già in modalità host — è proprio lo scopo della porta — quindi si tratta di una nuova impostazione piuttosto che di un cambio di modalità, ed è principalmente importante al ritorno dalla sospensione.

NID dei moduli e come è stato stabilito l’intervallo

Il segmento text di SceAVConfig è identico a livello di byte su ogni firmware indicato: in tutti i casi il modulo differisce esclusivamente per il proprio NID e per una cifra della stringa di versione interna.

Gli offset privati utilizzati da questo plugin sono quindi fissi anziché specifici per firmware e un unico binario copre l’intero intervallo.

Firmware NID del modulo SceAVConfig
3.60 0x222DDEB1
3.61 0xCC9A71FB
3.63 0x83636271
3.65 0x55A6E312
3.67 0x1A5B797C
3.68 0xA1F08F46
3.69 0x4069C16D
3.70 0x3F226D11
3.71 0x5B294543
3.72 0x0790F1A9
3.73 0x136D0561

Verificato confrontando i moduli decrittografati: i due prologhi delle funzioni sottoposte a hook, la coppia movw/movt che restituisce la base dei dati privati e la dimensione del segmento dati sono identici in tutti e undici i firmware.

Le versioni retail e devkit utilizzano lo stesso modulo: una console retail con firmware 3.65 restituisce 0x55A6E312, corrispondente al dump del devkit 3.65.

Le tre funzioni di output RAM di SceAudio sono individuate tramite offset nel segmento text sulla base delle stesse evidenze e vengono controllate rispetto alla loro prima istruzione prima dell’utilizzo. SceAudio è identico a livello di byte sugli stessi undici firmware.

L’elenco dei NID viene applicato effettivamente, non rappresenta soltanto documentazione: un NID del modulo che non rientra nell’elenco viene rifiutato e non viene installato alcun hook.

I firmware al di fuori di questo elenco verificato perdono il supporto all’audio USB, ma nient’altro: il plugin e il driver USB continuano a essere caricati e il resto del sistema non viene modificato.

Vengono eseguiti due controlli, nell’ordine:

  1. NID del modulo — identifica la build esatta e deve essere uno degli undici valori previsti.
  2. Piccolo controllo di integrità — ogni entry degli hook deve contenere ancora l’istruzione registrata e la coppia movw/movt deve essere decodificata per il registro previsto. Anche i tre entry point di SceAudio devono iniziare con la relativa istruzione registrata.

Il secondo controllo è volutamente limitato, perché il NID ha già identificato con precisione il firmware. Verifica i due entry degli hook e la coppia di istruzioni utilizzata per ricavare la base dei dati; non si tratta di uno scanner generico per l’integrità del modulo.

Le build con logging segnalano un NID non verificato e il limite di validazione che non è stato superato.

Cosa modifica

I plugin kernel meritano una certa cautela, quindi ecco esattamente cosa fa questo plugin e quando.

Senza un dispositivo audio USB collegato, non esegue alcuna operazione di instradamento audio. Mantiene registrati soltanto il driver USB, il thread del ciclo di vita e il gestore degli eventi di sistema.

SceAVConfig non viene mai letto e nessun hook viene installato. Se viene collegato un dispositivo che non utilizza UAC1, questo viene rifiutato durante il probe senza modificare lo stato audio di Sony.

I due hook taiHEN vengono installati solo dopo che un dispositivo UAC1 è stato sottoposto a probe, acquisito, configurato, dopo aver selezionato l’interfaccia di streaming e accettato la frequenza di campionamento.

Vengono rimossi dopo il completamento dello smantellamento; se lo smantellamento fallisce, rimangono installati affinché il modulo residente possa riprovare in sicurezza.

Nulla viene salvato in modo permanente. La build di rilascio non scrive nulla sullo storage: nessuna chiave di registro, nessuna memoria flash e nessun file. Tutto ciò che fa rimane in RAM: due hook e scritture nel segmento dati di AVConfig.

Un riavvio rappresenta un ripristino completo, quindi non può rimanere alcuno stato in una condizione errata.

module_start non risolve né dereferenzia gli indirizzi privati di Sony. Un profilo errato non può quindi influire sull’avvio: la risoluzione e l’installazione degli hook avvengono soltanto dopo che un dispositivo UAC1 è stato configurato correttamente.

Se qualcosa dovesse andare storto, rimuovere la riga da config.txt e riavviare la PlayStation TV.

C’è una limitazione nota, perché una sezione sulla sicurezza che si limita a vantarsi vale meno: se il rilascio del percorso audio dovesse andare in timeout, AVConfig potrebbe rimanere in uno stato intermedio e l’audio di sistema potrebbe rimanere silenzioso fino al riavvio.

Non viene scritto nulla da nessuna parte, quindi un ciclo di spegnimento e riaccensione ripristina sempre il funzionamento, ma questo è l’unico caso che richiede tale operazione.

Changelog

  • Risolto il problema per cui l’audio USB rifiutava di avviarsi dopo circa venti cicli di scollegamento/ricollegamento, situazione che fino a ora richiedeva un riavvio per essere risolta. SceUsbd rimuove il pipe del dispositivo scollegato senza annullare le richieste isocroniche accodate su di esso, quindi tre vengono persi dal suo pool di 64 elementi ogni volta; il plugin ora li restituisce dopo ogni scollegamento.
  • Registrato come driver USB composito, acquisendo l’interfaccia audio anziché l’intero dispositivo.
  • La tabella del firmware ora contiene i NID dei moduli SceAudio e SceUsbd insieme a quelli di AVConfig e verifica tutti e tre. Ogni offset è stato riletto dai moduli decrittografati di tutti gli undici firmware supportati.
  • Sostituita la coda di puntatori con una singola sequenza di blocchi pubblicata e un cursore a due blocchi, mantenendo il recupero dell’audio più recente con uno stato condiviso ridotto.
  • Risolto il problema del rapido scollegamento/ricollegamento mantenendo la fase di teardown serializzata fino a quando il worker e il percorso di Sony non sono stati ripuliti; una sessione sostitutiva rimane accodata finché lo spazio di acquisizione della vecchia sessione non è sicuro da riutilizzare.
  • Un invio USB iniziale non riuscito ora causa il fallimento della sessione invece di segnalare erroneamente che lo streaming è in esecuzione.

Download: uac-pstv-host v1.4

Download: Source code uac-pstv-host v1.4

Alcune parti di questo articolo sono state generate con l’aiuto dell’intelligenza artificiale.

🔥 Prodotti in promozione e articoli più venduti: PS5

Vedi altri prodotti PS5

Questo articolo contiene link affiliati a Amazon. Se acquisti tramite questi link, potrei guadagnare una commissione senza costi aggiuntivi per te.

Ultimo aggiornamento 2026-09-09 / Link di affiliazione / Immagini da Amazon Product Advertising API

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui
Captcha verification failed!
Punteggio utente captcha non riuscito. Ci contatti per favore!

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.