Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Otra consideración en el tiempo del sintetizador es la latencia, que es la diferencia entre la hora actual y la primera vez que se puede reproducir una nota. No se puede enviar un mensaje MIDI al sintetizador y representarse en el búfer de salida en el momento de la muestra actual. La asignación debe realizarse para los datos que ya se han colocado en el búfer, pero que aún no se han transmitido al dispositivo de salida de onda.
Por lo tanto, el receptor de onda debe implementar un reloj de latencia, que es un objeto IReferenceClock (que se describe en la documentación de Microsoft Windows SDK). El método IReferenceClock::GetTime del reloj de latencia recupera la hora de ejemplo hasta la que ya se han escrito los datos en el búfer y lo convierte en la hora de referencia relativa al reloj maestro. El sintetizador realiza conversiones entre el tiempo de referencia y el tiempo de muestra con IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample, por lo que, en este caso, el sintetizador llama a IDirectMusicSynthSink::RefTimeToSample para realizar la conversión.
El sumidero de ondas administra todo el tiempo de latencia. La implementación del método IDirectMusicSynthSink::GetLatencyClock debe generar un puntero al reloj de latencia y este puntero debe recuperarse a su vez por IDirectMusicSynth::GetLatencyClock. La aplicación usa el reloj de latencia para determinar el punto más temprano en el que se puede poner en cola un mensaje MIDI para reproducirse cuando se pasa al sintetizador llamando al método IDirectMusicSynth::PlayBuffer.
En la ilustración siguiente se muestra un ejemplo de la latencia de un mensaje MIDI.
En la ilustración anterior, el reloj de latencia apunta al primer lugar en el bucle de búfer de PCM donde se puede reproducir una nota. Tenga en cuenta que el reloj maestro está en 22 unidades de tiempo, el punto desde donde el sonido se está reproduciendo actualmente. Sin embargo, el espacio entre 22 y 30 unidades de tiempo ya se ha llenado con datos de onda y no se puede volver a escribir en él. Por lo tanto, el primer lugar donde se puede programar un nuevo evento MIDI con marca de tiempo es en el momento 30. Por lo tanto, el reloj de latencia lee 30 unidades de tiempo.
Los mensajes se pueden programar para reproducirse en, o en cualquier momento posterior, este tiempo de latencia. Por lo tanto, los mensajes que se van a representar inmediatamente se marcan con el tiempo de latencia (no la hora actual) antes de colocarse en el búfer de entrada del sintetizador.