Compartilhar via


Sincronização de relógio

Uma tarefa crítica para o coletor de ondas fazer é resolve descompasso de tempo entre os cristais do relógio de referência e do relógio de exemplo. Ele faz isso com o software equivalente a um loop com bloqueio de fase.

O coletor de ondas controla qual número de exemplo no buffer ele pode gravar em seguida. Portanto, mesmo sabendo que está ativado, por exemplo, exemplo 20, o coletor de ondas ainda precisa marcar o relógio master para obter um tempo de referência. Ele tem um thread que acorda aproximadamente a cada 20 milissegundos e solicita o relógio master para a hora atual. O relógio master pode relatar que a hora atual (em milissegundos) é 420, por exemplo.

O coletor de ondas também mantém um relógio de latência, que mostra o deslocamento entre a hora atual de acordo com o relógio master e a hora de exemplo. Ele usa essas informações para calcular a hora esperada do relógio master e compara isso com a leitura real do relógio master para ver se os dois relógios se separaram.

O coletor de ondas usa um loop com bloqueio de fase para ajustar o tempo de exemplo. Ao verificar se há descompasso, o coletor de ondas não é ajustado pela quantidade inteira, pois as leituras contêm alguma tremulação. Em vez disso, ele move o relógio de exemplo por alguma fração da distância em direção ao relógio master. Dessa forma, o coletor de ondas suaviza os erros de tremulação enquanto permanece aproximadamente em sincronia. Ele também leva esse tempo e o converte em um tempo de relógio de latência relativo ao relógio master. Isso é importante porque o aplicativo pode precisar saber onde o sintetizador está sendo renderizado a qualquer momento.

O relógio de latência informa ao aplicativo a hora mais antiga em que uma nova anotação pode ser agendada para ser reproduzida. A hora do relógio de latência é a hora do relógio master mais um deslocamento 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 a ser reproduzida até o momento em que o sintetizador realmente reproduz a nota. A qualquer momento, o aplicativo pode agendar uma anotação a ser reproduzida em ou posterior , mas não antes da hora atual do relógio de latência.

Por exemplo, se o relógio master estiver no momento na hora 420 e o aplicativo tiver uma observação de que deseja reproduzir o mais rápido possível, o relógio de latência informará na primeira vez que a anotação pode ser reproduzida. Se o sintetizador de software tiver uma latência de 100 milissegundos, a próxima vez que ele puder reproduzir uma anotação será no momento 520.

Suponha que um evento esteja marcado para ser reproduzido no momento 520 em tempo de referência. O sintetizador faz seu trabalho renderizando anotações em amostras e executando todos os seus cálculos em tempo de exemplo. Portanto, ele precisa saber em que tempo de referência 520 se converte em em tempo de exemplo. No modo de usuário, o coletor de ondas 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 ondas.

Em seguida, o coletor de ondas retorna um tempo de exemplo (por exemplo, 600). A observação em questão é renderizada no tempo de exemplo 600. Em seguida, quando o método Sintetizador IDirectMusicSynth::Render é chamado pelo coletor de ondas para renderizar a próxima parte do fluxo (por exemplo, do tempo de exemplo 600 a 800), a anotação é renderizada no buffer na hora de amostra 600.

Nota O tempo de exemplo é mantido como um número de 64 bits para evitar a substituição. (Um valor DWORD é revertida em 27 horas.)

Para resumir, o sintetizador faz toda a sua matemática interna em tempo de amostra e o coletor de ondas faz a conversão em tempo de exemplo do tempo de referência e vice-versa. O coletor de ondas também gerencia a sincronização com o relógio master e fornece informações de latência. Ocultar essa funcionalidade no coletor de ondas facilita a gravação do sintetizador.