Windows Mobile 6.1 Loop Audio

winterwake

Utente Attivo
1
0
Buonasera, ho un problema con una applicazione windows mobile che sto scrivendo in C++.

Ho la necessità di fare un loopback audio con un bassisimo ritardo di propagazione, diciamo sui 90ms. Vi illustro la situazione: ho sviluppato una paio di librerie che usano le API waveIn e waveOut, registrando da microfono e riproducendo immediatamente in uscita i suoni registrati con una struttura a buffer circolari che usano una CALLBACK per avviare la riproduzione di un buffer mentre su un altro viene registrato.

In pratica, ho N buffer da 20ms, quando uno è pieno lo passo al modulo di OUT con una CALLBACK, e una volta riprodotto lo rimetto nella coda dei disponibili alla registrazione in IN. Con questo schema, usando un WAVEFORMATEX da 1 canale, a 16 bit con 8000 campioni, ho un ritardo di circa 320 ms. Dopo lunghe letture, ho scoperto che la CALLBACK ha un difetto, non scatta quando il mio buffer d'ingresso è pieno, ma quando è pieno il buffer del driver audio. Quando il buffer del driver audio si riempie, copia con un burst tutti i dati nei miei buffer, riempiendone in un sol colpo 120ms. Per "barare" ho scoperto che se porto il WAVEFORMATEX a 2 canali con 48000 campioni per canale, il buffer del driver audio si riempie prima, e questo fa scattare molto più in fretta la CALLBACK, riducendo così il ritardo a 160ms. Ho pensato di fare lo stesso trucco con il bufer di uscita, peccato che non funziona.

Ora mi chiedo, esiste un modo per pilotare il driver audio in uscita, riducendo il buffer del sistema operativo, oppure un modo per "barare" e far scattare la CALLBACK più velocemente, magari ogni 20ms, così da portare il ritardo del loopback a 90ms o meno?

Grazie a tutti dell'attenzione!

P.S. Lavoro con Windows Mobile 6.1, e purtroppo non ho Directsound perchè microsoft non lo supporta più, quindi la strada DirectX è da scartare.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!