Compartir a través de


Sincronización del reloj

Una tarea crítica para que el receptor de onda lo haga es resolver el desfase de tiempo entre los cristales de reloj de referencia y reloj de muestra. Lo hace con el software equivalente de un bucle bloqueado por fases.

El receptor de onda realiza un seguimiento del número de muestra del búfer que puede escribir a continuación. Por lo tanto, aunque sepa que está activado, por ejemplo, muestra 20, el receptor de onda todavía necesita comprobar el reloj maestro para obtener una hora de referencia. Tiene un subproceso que se activa aproximadamente cada 20 milisegundos y pide al reloj maestro la hora actual. El reloj maestro podría informar de que la hora actual (en milisegundos) es 420, por ejemplo.

El receptor de onda también mantiene un reloj de latencia, que muestra el desplazamiento entre la hora actual según el reloj maestro y la hora de muestra. Usa esta información para calcular el tiempo esperado del reloj maestro y lo compara con la lectura real del reloj maestro para ver si los dos relojes se han desfasado.

El receptor de ondas usa un bucle bloqueado por fases para ajustar el tiempo de muestra. Al comprobar el desfase, el receptor de onda no se ajusta por toda la cantidad, ya que las lecturas contienen cierta vibración. En su lugar, mueve el reloj de muestra por alguna fracción de la distancia hacia el reloj maestro. De este modo, el receptor de onda suaviza los errores de vibración mientras permanece aproximadamente sincronizado. También tarda este tiempo y lo convierte en una hora de reloj de latencia relativa al reloj maestro. Esto es importante porque es posible que la aplicación necesite saber dónde se representa el sintetizador en cualquier momento.

El reloj de latencia indica a la aplicación la hora más temprana en la que se puede programar una nueva nota para reproducirse. La hora del reloj de latencia es la hora del reloj maestra más un desplazamiento que representa la latencia del sintetizador. Esta latencia representa el retraso mínimo desde el momento en que la aplicación envía una nueva nota que se reproducirá hasta el momento en que el sintetizador reproduce realmente la nota. En cualquier momento, la aplicación puede programar una nota que se reproducirá en o una versión posterior a,pero no anterior a la hora del reloj de latencia actual.

Por ejemplo, si el reloj maestro está actualmente en el momento 420 y la aplicación tiene una nota de que desea reproducir lo antes posible, el reloj de latencia le indica la primera vez que se puede reproducir la nota. Si el sintetizador de software tiene una latencia de 100 milisegundos, la próxima vez que pueda reproducir una nota es a la vez 520.

Supongamos que un evento está marcado para reproducirse en el momento de la referencia 520. El sintetizador realiza su trabajo mediante la representación de notas en muestras y realizando todos sus cálculos en tiempo de muestra. Por lo tanto, debe saber a qué hora de referencia de 520 se convierte en en tiempo de ejemplo. En el modo de usuario, el receptor de ondas proporciona dos funciones que usa el sintetizador:

IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample**

Para realizar la conversión en este caso, la síntesis llama a IDirectMusicSynthSink::RefTimeToSample en el receptor de onda.

A continuación, el receptor de onda devuelve un tiempo de muestra (por ejemplo, 600). La nota en cuestión se representa en el momento de la muestra 600. A continuación, cuando el receptor de onda llama al método IDirectMusicSynth::Render de synth para representar la siguiente parte de la secuencia (por ejemplo, de la hora de muestra de 600 a 800), la nota se representa en el búfer en tiempo de muestra 600.

Nota El tiempo de muestra se mantiene como un número de 64 bits para evitar la sustitución. (Un valor DWORD se acumula en 27 horas).

En resumen, el sintetizador realiza todas sus matemáticas internas en tiempo de muestra y el receptor de onda realiza la conversión a tiempo de muestra desde el tiempo de referencia y viceversa. El receptor de ondas también administra la sincronización con el reloj maestro y proporciona información de latencia. Ocultar esta funcionalidad en el receptor de onda facilita la escritura del sintetizador.