Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un'attività critica per il ricevitore d'onda consiste nel risolvere lo sfasamento temporale tra i cristalli del clock di riferimento e dell'orologio del campione. Questa operazione viene eseguita con l'equivalente software di un ciclo bloccato a fasi.
Il ricevitore d'onda tiene traccia del numero di campione nel buffer a cui scrivere successivamente. Pertanto, anche se è consapevole di essere sul campione di dati 20, il ricevitore d'onda deve comunque verificare il clock principale per ottenere un tempo di riferimento. Ha un thread che si riattiva approssimativamente ogni 20 millisecondi e chiede all'orologio principale l'ora corrente. L'orologio master potrebbe segnalare che l'ora corrente (in millisecondi) è 420, ad esempio.
Il sink d'onda mantiene anche un clock 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.
L'assorbitore d'onda utilizza un anello ad aggancio di fase per regolare il tempo di campionamento. Quando si controlla la deriva, l'assorbitore d'onda non si regola in base all'intera quantità, perché le letture contengono qualche variazione. Sposta invece l'orologio campione di una frazione della distanza verso l'orologio master. In questo modo, il wave sink smussa gli errori di jitter mentre rimane approssimativamente sincronizzato. Trasforma anche questo tempo e lo converte in un tempo di clock di latenza relativo al clock principale. 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 del clock 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 un momento uguale o successivo all'orario corrente dell'orologio di latenza, ma non prima.
Ad esempio, se l'orologio master è attualmente all'ora 420 e l'applicazione ha una nota che vuole riprodurre il prima possibile, l'orologio di latenza indica il primo momento in cui 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 la riproduzione alla volta 520 nel tempo di riferimento. Il sintetizzatore svolge il suo lavoro trasformando le note in campioni e compiendo tutti i calcoli durante la campionatura. Pertanto, deve sapere a quale tempo di riferimento corrisponde 520 nel tempo di campionamento. In modalità utente, il wave sink fornisce due funzioni utilizzate dal sintetizzatore:
IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample**
Per eseguire la conversione in questo caso, il synth chiama IDirectMusicSynthSink::RefTimeToSample sul sink audio.
Il dissipatore d'onda restituisce quindi un tempo di campionamento (ad esempio, 600). Il rendering della nota in questione avviene al tempo del campione 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, dal tempo campione 600 al 800), la nota viene renderizzata nel buffer al tempo campione 600.
Nota Il tempo di esempio viene mantenuto come numero a 64 bit per evitare il rollover. Un valore DWORD si resetta in 27 ore.
Per riepilogare, il synth esegue tutte le operazioni matematiche interne nel tempo di campionamento, mentre il ripetitore d'onda esegue la conversione tra il tempo di campionamento e il tempo di riferimento, e viceversa. Il ricevitore d'onda gestisce anche la sincronizzazione con l'orologio principale e fornisce informazioni sulla latenza. Nascondere questa funzionalità nel wave sink rende la scrittura del synth più semplice.