Compartilhar via


Latência do sintetizador

Outra consideração no tempo do sintetizador é a latência, que é a diferença entre a hora atual e a primeira vez que uma anotação pode ser reproduzida. Uma mensagem MIDI não pode ser enviada ao sintetizador e renderizada no buffer de saída no momento da amostra atual. A concessão deve ser feita para dados que já foram colocados no buffer, mas que ainda não foram transmitidos para o dispositivo de saída de onda.

Portanto, o coletor de ondas deve implementar um relógio de latência, que é um objeto IReferenceClock (descrito na documentação do SDK do Microsoft Windows). O método IReferenceClock::GetTime do relógio de latência recupera o tempo de amostra até o qual os dados já foram gravados no buffer e converte isso em tempo de referência em relação ao relógio master. O coletor de ondas faz conversões entre referência e tempo de amostra com IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample, portanto, nesse caso, o sintetizador chama IDirectMusicSynthSink::RefTimeToSample para realizar a conversão.

O tempo de latência é gerenciado pelo coletor de ondas. Sua implementação do método IDirectMusicSynthSink::GetLatencyClock deve gerar um ponteiro para o relógio de latência, e esse ponteiro deve, por sua vez, ser recuperado por IDirectMusicSynth::GetLatencyClock. O aplicativo usa o relógio de latência para determinar o ponto mais antigo no tempo em que uma mensagem MIDI pode ser enfileirada para reprodução quando ela é passada para o sintetizador chamando o método IDirectMusicSynth::P layBuffer .

Um exemplo da latência de uma mensagem MIDI é mostrado na figura a seguir.

Diagrama ilustrando a latência de uma mensagem MIDI em um loop de buffer PCM.

Na figura anterior, o relógio de latência aponta para o primeiro lugar no loop de buffer PCM em que uma anotação pode ser reproduzida. Observe que o relógio master está em 22 unidades de tempo, que é o ponto em que o som está sendo reproduzido no momento, mas o espaço entre 22 e 30 unidades de tempo já foi preenchido com dados de onda e não pode mais ser gravado. Portanto, o primeiro lugar em que um novo evento MIDI com carimbo de data/hora pode ser agendado para ser reproduzido é no momento 30. Assim, o relógio de latência lê 30 unidades de tempo.

As mensagens podem ser agendadas para reprodução ou a qualquer momento após esse tempo de latência. Portanto, as mensagens que devem ser renderizadas imediatamente são carimbadas com a hora de latência (não a hora atual) antes de serem colocadas no buffer de entrada do sintetizador.