Compartir a través de


Sincronización del reloj

Una tarea crítica del sumidero de onda es resolver la desviación de tiempo entre los cristales de reloj de referencia y de muestra. Lo hace con el software equivalente de un bucle bloqueado por fases.

El sumidero de onda realiza un seguimiento de qué número de muestra en el búfer puede escribir a continuación. Por lo tanto, aunque sepa que está en, por ejemplo, ejemplo 20, el sumidero de ondas todavía necesita comprobar el reloj maestro para obtener un tiempo de referencia. Tiene un hilo que se activa aproximadamente cada 20 milisegundos y solicita la hora actual al reloj maestro. 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 onda 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 un poco de 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 sumidero de onda suaviza los errores de jitter mientras permanece aproximadamente sincronizado. También toma este tiempo y lo convierte en un tiempo de latencia relativo al reloj maestro. Esto es importante porque es posible que la aplicación necesite saber dónde está renderizando 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 principal más una diferencia 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 para que se reproduzca en un tiempo igual o posterior, pero no anterior, al tiempo de latencia actual.

Por ejemplo, si el reloj maestro se encuentra actualmente en el tiempo 420 y la aplicación tiene una nota que quiere reproducir cuanto antes, el reloj de latencia le indica el momento más temprano en que se puede reproducir la nota. Si el sintetizador de software tiene una latencia de 100 milisegundos, la próxima vez que pueda tocar una nota es en el momento 520.

Supongamos que un evento está marcado para reproducirse en el tiempo de referencia 520. El sintetizador realiza su trabajo transformando las notas en muestras y efectuando todos sus cálculos en tiempo de muestra. Por lo tanto, necesita saber a qué tiempo de muestra corresponde un tiempo de referencia de 520. En el modo de usuario, el receptor de onda proporciona dos funciones que usa el sintetizador:

IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample**

Para realizar la conversión en este caso, el sintetizador llama a IDirectMusicSynthSink::RefTimeToSample en el sumidero 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 tiempo de muestreo 600. A continuación, cuando el sumidero de ondas llama al método synth IDirectMusicSynth::Render para renderizar la siguiente parte de la secuencia (por ejemplo, del tiempo de muestra 600 al 800), la nota se renderiza en el búfer en el tiempo de muestra 600.

Nota El tiempo de muestra se mantiene como un número de 64 bits para evitar el desbordamiento. (Un valor DWORD vuelve a cero tras 27 horas).

En resumen, el sintetizador realiza todos sus cálculos internos en tiempo de muestra y el sumidero de onda realiza la conversión a tiempo de muestra desde el tiempo de referencia y viceversa. El receptor de onda también administra la sincronización con el reloj maestro y proporciona información de latencia. Ocultar esta funcionalidad en el proceso de absorción de ondas facilita la programación del sintetizador.