Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Uma tarefa crítica para o módulo de absorção de ondas a ser feita é resolver o descompasso de tempo entre os cristais do relógio de referência e do relógio de amostragem. Ele faz isso com o equivalente de software de um loop bloqueado por fases.
O coletor de ondas controla qual número de exemplo no buffer ele pode gravar em seguida. Portanto, mesmo sabendo que está, por exemplo, na amostra 20, o sumidouro de ondas ainda precisa verificar o relógio mestre para obter um tempo de referência. Ele tem um thread que acorda aproximadamente a cada 20 milissegundos e solicita ao relógio mestre a hora atual. O relógio mestre pode relatar de volta 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 mestre e a hora de exemplo. Ele usa essas informações para calcular o tempo de relógio mestre esperado e o compara com a leitura real do relógio mestre para verificar se houve desvio entre os dois relógios.
O dissipador de ondas usa uma malha de fase travada para ajustar o tempo de amostra. Ao verificar se há deriva, o sumidouro de ondas não é ajustado pela quantidade inteira, pois as leituras contêm algumas oscilações. Em vez disso, ele move o relógio de exemplo por alguma fração da distância em direção ao relógio mestre. Dessa forma, o coletor de ondas suaviza os erros de tremulação enquanto permanece praticamente sincronizado. Ele também leva esse tempo e o converte em um tempo de relógio de latência relativo ao relógio mestre. 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 o momento mais cedo em que uma nova nota pode ser agendada para tocar. O tempo do relógio de latência é o tempo do relógio mestre 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 no momento em que o sintetizador realmente reproduz a nota. A qualquer instante, o aplicativo pode agendar uma nota a ser reproduzida no horário igual ou posterior ao tempo do relógio de latência atual.
Por exemplo, se o relógio mestre estiver atualmente no tempo 420 e o aplicativo tiver uma nota que deseja tocar o mais rápido possível, o relógio de latência informará o horário mais cedo que a nota pode ser tocada. Se o sintetizador de software tiver uma latência de 100 milissegundos, a próxima vez que ele puder reproduzir uma nota será no momento 520.
Suponha que um evento esteja marcado para ocorrer às 520 no tempo de referência. O sintetizador faz seu trabalho renderizando notas em amostras e executando todos os seus cálculos em tempo de amostra. Portanto, ele precisa saber a que tempo de referência 520 se converte em tempo de amostra. 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 dissipador de ondas retorna um tempo de amostragem (por exemplo, 600). A nota em questão é renderizada no tempo de exemplo 600. Em seguida, quando o método de sintetizador IDirectMusicSynth::Render é chamado pelo receptor de ondas para renderizar a próxima parte do fluxo (por exemplo, do tempo de amostra 600 a 800), a nota é renderizada no buffer no tempo de amostra 600.
Nota O tempo de exemplo é mantido como um número de 64 bits para evitar o estouro. (Um valor DWORD é substituído em 27 horas.)
Para resumir, o sintetizador realiza toda a sua matemática interna em tempo de amostragem, e o sistema de saída de ondas faz a conversão do tempo de referência para o tempo de amostragem e vice-versa. O coletor de ondas também gerencia a sincronização com o relógio mestre e fornece informações de latência. Ocultar essa funcionalidade no coletor de ondas facilita a gravação do sintetizador.