Partilhar via


Sincronização de relógio

Uma tarefa crítica para o dissipador de onda é resolver a deriva de tempo entre os cristais do relógio de referência e do relógio de amostra. O software faz isso com o equivalente de um circuito de bloqueio de fase.

O coletor de onda controla o número da amostra no buffer em que ele pode gravar em seguida. Assim, mesmo sabendo que está ligado, por exemplo, na amostra 20, o dissipador de onda ainda precisa verificar o relógio mestre para obter um tempo de referência. Tem um fio que acorda aproximadamente a cada 20 milissegundos e pede ao relógio mestre para a hora atual. O relógio mestre pode informar que a hora atual (em milissegundos) é 420, por exemplo.

O dissipador de onda também mantém um relógio de latência, que mostra o deslocamento entre a hora atual de acordo com o relógio mestre e a hora da amostra. Ele usa essas informações para calcular o tempo esperado do relógio mestre principal e compara o resultado com a leitura real do relógio mestre para ver se os dois relógios divergiram.

O coletor de onda usa um loop de bloqueio de fase para ajustar o tempo da amostra. Ao verificar o desvio, o coletor de ondas não se ajusta pela quantidade total, porque as leituras contêm alguma instabilidade. Em vez disso, ele move o relógio de amostra por alguma fração da distância em direção ao relógio mestre. Desta forma, o dissipador de onda suaviza os erros de desvio enquanto permanece aproximadamente em sincronia. Ele também leva esse tempo e o converte em um tempo de relógio de latência que é relativo ao relógio mestre. Isso é importante porque o aplicativo pode precisar saber onde o sintetizador está renderizando a qualquer momento.

O relógio de latência informa ao aplicativo o primeiro momento em que uma nova nota pode ser programada para ser reproduzida. O tempo do relógio de latência é o tempo do relógio mestre mais um offset que representa a latência do sintetizador. Essa latência representa o atraso mínimo desde o momento em que o aplicativo envia uma nova nota para ser reproduzida até o momento em que o sintetizador realmente reproduz a nota. A qualquer momento, o aplicativo pode agendar uma nota para ser reproduzida em ou depois - mas não antes - da hora do relógio de latência atual.

Por exemplo, se o relógio mestre estiver atualmente no horário 420 e o aplicativo tiver uma nota que deseja reproduzir o mais rápido possível, o relógio de latência informará a primeira hora em que a nota pode ser reproduzida. Se o sintetizador de software tem uma latência de 100 milissegundos, a próxima vez que ele pode reproduzir uma nota é no tempo 520.

Suponha que um evento esteja marcado para ocorrer no tempo 520 em relação ao tempo de referência. O sintetizador faz o seu trabalho renderizando notas em amostras e realizando todos os seus cálculos em tempo de amostragem. ** Portanto, ele precisa saber em que um tempo de referência de 520 se converte em tempo de amostra. No modo de usuário, o coletor de onda fornece duas funções que o sintetizador usa:

IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample**

Para fazer a conversão nesse caso, o sintetizador chama IDirectMusicSynthSink::RefTimeToSample no coletor de onda.

O dissipador de onda devolve então um tempo de amostra (por exemplo, 600). A nota em questão é renderizada no tempo de amostra 600. Em seguida, quando o método IDirectMusicSynth::Render do sintetizador é chamado pelo coletor de onda para renderizar a próxima parte do fluxo (por exemplo, do tempo de amostra 600 a 800), a nota é processada no buffer no tempo de amostra 600.

Observação O tempo da amostra é mantido como um número de 64 bits para evitar a sobreposição. (Um valor DWORD é redefinido em 27 horas.)

Para resumir, o sintetizador faz todas as suas contas internas em tempo de amostra e o dissipador de onda faz a conversão para tempo de amostra a partir do tempo de referência e vice-versa. O coletor de onda também gerencia a sincronização com o relógio mestre e fornece informações de latência. Esconder essa funcionalidade no sumidouro de ondas facilita o desenvolvimento do sintetizador.