Come riprodurre campioni audio durante la generazione

0

Sto provando a scrivere un semplice generatore sinusoidale live da zero in Qt.

Cerco di non utilizzare alcuna API esterna come ASIO o VST. E voglio generare nuovo audio durante la riproduzione. (Contrariamente al Qt esempio , ripete solo alcuni esempi)

Qt ti dà solo un QIODevice in cui scrivi i dati a una frequenza di campionamento fissa. (Se la frequenza di campionamento dell'host fissa è 44100 Hz, è necessario fornire esattamente 44100 campioni al secondo)

Ho bisogno di un algoritmo o disegno come sincronizzare la riproduzione e la generazione di un'onda sinusoidale.

Oppure, qual è l'approccio generale alla generazione audio?

Ecco i miei tentativi per ottenere ciò:

  1. Due buffer, uno viene scritto, uno viene riprodotto, quindi lo scambio, sincronizzato con i mutex

    Problema: i mutex non riprendono l'audio generano un thread abbastanza veloce

  2. Un buffer, che viene riprodotto e sovrascritto periodicamente

    Problema: salti in fase (ho provato a risolverli)

  3. Anche questa doveva essere un'onda sinusoidale, ho cercato di ottenere la fase dal flusso audio

posta KeksArmee 21.08.2016 - 18:10
fonte

1 risposta

1

Per il tuo primo problema è necessario creare una piccola quantità di latenza per consentire al driver audio di bufferizzare alcuni dati audio in più al millisecondo per tenere conto di qualsiasi jitter causato da un sistema casuale.

Per il tuo secondo problema devi tenere un conteggio di quanti byte hai già prodotto e usarlo per calcolare la fase del seno, in questo modo la fine di un buffer dovrebbe allinearsi perfettamente con l'inizio del successivo.

    
risposta data 22.08.2016 - 09:56
fonte

Leggi altre domande sui tag