Sincronizzazione orologio

Un'attività critica da eseguire per il sink d'onda consiste nel risolvere la deviazione temporale tra i cristalli di orologio di riferimento e campione. Esegue questa operazione con l'equivalente software di un ciclo bloccato a fasi.

Il sink d'onda tiene traccia del numero di campione nel buffer in cui può essere scritto. Quindi, anche se sa che è acceso, ad esempio, campione 20, il sink d'onda deve comunque controllare l'orologio master per ottenere un'ora di riferimento. Ha un thread che si riattiva approssimativamente ogni 20 millisecondi e chiede l'orologio master per l'ora corrente. L'orologio master potrebbe segnalare che l'ora corrente (in millisecondi) è 420, ad esempio.

Il sink d'onda mantiene anche un orologio di latenza, che mostra l'offset tra l'ora corrente in base all'orologio master e all'ora del campione. Usa queste informazioni per calcolare l'ora dell'orologio master prevista e lo confronta con la lettura effettiva dell'orologio master per verificare se i due orologi sono separati.

Il sink d'onda usa un ciclo bloccato in fase per regolare l'ora del campione. Quando si controlla la deriva, il sink d'onda non si regola in base all'intera quantità, perché le letture contengono qualche instabilità. Sposta invece l'orologio campione di una frazione della distanza verso l'orologio master. In questo modo, il sink d'onda smussa gli errori di instabilità rimanendo approssimativamente sincronizzati. Richiede anche questo tempo e lo converte in un'ora di clock di latenza relativa all'orologio master. Questo è importante perché l'applicazione potrebbe dover sapere dove viene eseguito il rendering del sintetizzatore in qualsiasi momento.

L'orologio di latenza indica all'applicazione la prima volta in cui è possibile pianificare la riproduzione di una nuova nota. L'ora dell'orologio della latenza è l'ora dell'orologio master più un offset che rappresenta la latenza del sintetizzatore. Questa latenza rappresenta il ritardo minimo dal momento in cui l'applicazione invia una nuova nota da riprodurre al momento in cui il sintetizzatore riproduce effettivamente la nota. In qualsiasi momento, l'applicazione può pianificare una nota da riprodurre in corrispondenza o successivamente, ma non prima dell'ora dell'orologio di latenza corrente.

Ad esempio, se l'orologio master è attualmente all'ora 420 e l'applicazione ha una nota che vuole giocare il prima possibile, l'orologio di latenza indica la prima volta che la nota può essere riprodotta. Se il sintetizzatore software ha una latenza di 100 millisecondi, la volta successiva che può riprodurre una nota è alla volta 520.

Si supponga che un evento sia contrassegnato per essere riprodotto alla volta 520 nel tempo di riferimento. Il sintetizzatore esegue il suo lavoro eseguendo il rendering delle note in campioni ed eseguendo tutti i calcoli in fase di campionamento. Pertanto, deve sapere in che ora di riferimento 520 viene convertita in in fase di campionamento. In modalità utente, il sink wave fornisce due funzioni usate dal synth:

IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample**

Per eseguire la conversione in questo caso, il synth chiama IDirectMusicSynthSink::RefTimeToSample nel sink wave.

Il sink d'onda restituisce quindi un tempo campione (ad esempio, 600). Il rendering della nota in questione viene eseguito in fase di campionamento 600. Quindi, quando il metodo synth IDirectMusicSynth::Render viene chiamato dal sink d'onda per eseguire il rendering della parte successiva del flusso (ad esempio, dall'ora di esempio 600 a 800), il rendering della nota viene eseguito nel buffer in fase di campionamento 600.

Nota Il tempo di esempio viene mantenuto come numero a 64 bit per evitare il rollover. (Un valore DWORD esegue il roll over in 27 ore.

Per riepilogare, il synth esegue tutte le operazioni matematiche interne nel tempo di campionamento e il sink d'onda esegue la conversione in tempo campione dall'ora di riferimento e viceversa. Il sink wave gestisce anche la sincronizzazione con l'orologio master e fornisce informazioni sulla latenza. Nascondendo questa funzionalità nel sink d'onda, la scrittura del synth risulta più semplice.