La PlayStation TV continua a dimostrarsi una piattaforma particolarmente interessante per la scena homebrew, soprattutto grazie a piccoli progetti capaci di risolvere alcune delle limitazioni hardware della console.

Tra questi c’è uac-pstv-host, un plugin sviluppato dal developer SJK132 che permette di utilizzare dispositivi audio USB direttamente sulla PlayStation TV.
uac-pstv v.1.0.1 by SJK132 can now be downloaded from VitaDB or Easy Plugin! More info: https://www.rinnegatamante.eu/vitadb/#/info/1458
Il limite principale della console è sempre stato l’assenza di un’uscita audio dedicata: il sonoro viene normalmente trasmesso esclusivamente attraverso l’HDMI.
Il plugin interviene proprio su questo aspetto, consentendo di collegare DAC USB, schede audio esterne e dongle per cuffie compatibili con lo standard USB Audio Class 1 (UAC1).
Una volta installato, il funzionamento è completamente automatico. Collegando un dispositivo compatibile, l’audio viene instradato immediatamente verso l’USB, mentre scollegandolo torna automaticamente all’uscita HDMI. Non sono quindi necessarie applicazioni aggiuntive né configurazioni manuali durante l’utilizzo.
Il plugin gestisce l’audio proveniente dai giochi, dai titoli PSX, dalla LiveArea e dagli effetti di sistema. L’output è fissato a 48 kHz, stereo e 16 bit, mentre l’input audio non è supportato: il plugin è infatti pensato esclusivamente per l’uscita sonora.
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.skprxinur0:tai/. - Aggiungere il plugin nella sezione
*KERNELdiur0: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 conbInterval=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:
- NID del modulo — identifica la build esatta e deve essere uno degli undici valori previsti.
- Piccolo controllo di integrità — ogni entry degli hook deve contenere ancora l’istruzione registrata e la coppia
movw/movtdeve 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 v1.0.1
Output latency ridotta da circa 22 ms a 13 ms, una correzione dell’ordinamento della memoria nel passaggio PCM e correzioni per il recupero dal percorso sospensione/riattivazione — quest’ultima a seguito di una segnalazione relativa all’assenza di audio dopo un gioco PSX seguito dalla modalità standby, fino a quando il dispositivo non veniva ricollegato.
Latenza
- I blocchi di cattura sono stati dimezzati a 240 frame (5 ms). La latenza è di circa due periodi di blocco: uno per riempire un blocco e un altro perché il consumer deve iniziare con un intero blocco di ritardo per sopravvivere alla cadenza discreta degli arrivi. La dimensione del blocco è quindi l’unico parametro che può modificarla. È stato confermato sull’hardware che l’output RAM di Sony accetta la pagina più piccola.
- Lo staging PCM è stato ampliato da due slot a quattro, ripristinando la tolleranza agli stalli che i blocchi più piccoli avrebbero altrimenti dimezzato. Il numero di slot non comporta alcuna latenza: stabilisce quanto il feeder possa rimanere indietro, non da dove inizi a leggere.
- Un terzo contesto di trasporto, che porta il margine del feeder da un periodo di pacchetto a due, in cambio di 1 ms di ritardo.
- Il thread feeder viene eseguito con priorità 0x20 invece di 0x40 ed è vincolato al core del worker di cattura, così un blocco appena pubblicato si trova ancora nella L1 quando viene letto nuovamente, invece di richiedere quindici trasferimenti di cache line per blocco.
Correzioni
- Corretto l’ordinamento della memoria sul lato di lettura del seqlock. La seconda lettura della guardia utilizzava un caricamento acquire, che posiziona la propria barriera dopo la lettura e lascia che la copia dei dati venga riordinata oltre la validazione: il modo classico in cui una lettura incoerente può passare come valida. Ora viene inserita una barriera prima di una lettura relaxed, in linea con
read_seqretry()di Linux. Le stesse due istruzioni, nell’ordine corretto. Il sintomo sarebbe stato un click raro e impossibile da riprodurre. - Il lato di scrittura non utilizza più uno store
seq_cstquando è sufficiente uno store relaxed più una barriera release, rimuovendo una barriera per ogni blocco pubblicato.
Recupero
- Un collegamento che arriva mentre è ancora in corso uno smantellamento ora viene memorizzato e ritentato una volta completato lo smantellamento. USBD presenta un dispositivo esattamente una volta, quindi in precedenza rifiutare quel collegamento significava perderlo definitivamente: il dispositivo rimaneva enumerato senza alcuna sessione associata e solo un nuovo collegamento permetteva di recuperarlo. La finestra è più ampia al ritorno dalla sospensione con lo streaming audio attivo, momento in cui lo smantellamento è più lento.
- Il rilascio del percorso AVConfig non attende più che Sony dia conferma attraverso il wrapper di arresto del dispositivo sottoposto a hook. A quel punto la cattura è già stata interrotta, quindi Sony può ragionevolmente decidere che non ci sia nulla da arrestare e non chiamarlo mai. Il comportamento è stato osservato in entrambi i modi tra le sessioni, motivo per cui il rilascio non deve dipendere da questa conferma; quando non arrivava, l’attesa consumava l’intero timeout di un secondo.
Strumentazione
- Le build con logging mostrano la versione e la revisione git come prima riga di ogni sessione e riportano per ogni sessione i conteggi di pacchetti, starve, attese PCM e risincronizzazioni, oltre al margine minimo del producer, registrando dove si è verificata ogni risincronizzazione. Le build di rilascio sono identiche a livello di byte con o senza queste funzionalità.
Misurato su 3.65. Il rilascio del percorso si stabilizza in modo ripetibile in circa ~401 ms. La sospensione chiude la sessione prima del detach che segue, quindi SET_INTERFACE(alt 0) viene comunque inviato e un DAC esterno torna al proprio clock interno.
È stato rilevato che i completamenti USB possono bloccarsi per circa ~250 ms alla volta, diverse volte per sessione, indipendentemente dalle nostre priorità dei thread (verificato tramite A/B).
Il producer continua a funzionare durante questo tipo di stallo e finisce circa 50 blocchi avanti; lo staging latest-wins scarta l’arretrato e riprende dall’audio corrente.
Una FIFO, invece, metterebbe in coda l’arretrato e aggiungerebbe permanentemente quei 250 ms alla latenza di output, a ogni stallo.
Download: uac-pstv-host v1.0.1
Download: Source code uac-pstv-host v1.0.1
Alcune parti di questo articolo sono state generate con l’aiuto dell’intelligenza artificiale. Questo articolo contiene link affiliati a Amazon. Se acquisti tramite questi link, potrei guadagnare una commissione senza costi aggiuntivi per te.🔥 Prodotti in promozione e articoli più venduti: Xbox Series
Vedi altri prodotti Xbox Series
Ultimo aggiornamento 2026-09-13 / Link di affiliazione / Immagini da Amazon Product Advertising API





