IDirectMusicSynth e IDirectMusicSynthSink
Conforme descrito em Sintetizadores e Coletores de Ondas, você pode implementar um sintetizador de software personalizado ou coletor de ondas que é executado no modo de usuário e se comunica com o DirectMusic. O objeto sintetizador deve ter uma interface IDirectMusicSynth. O objeto coletor de ondas deve ter uma interface IDirectMusicSynthSink.
O DirectMusic se comunica com um sintetizador de software por meio de sua interface IDirectMusicSynth . O DirectMusic dá suporte a essa interface no DirectX 6.1 e posterior. IDirectMusicSynth dá suporte aos métodos mostrados na tabela a seguir, que organiza os métodos em grupos funcionais.
Grupo | Nomes de método |
---|---|
Ativação | IDirectMusicSynth::Activate |
Canais | IDirectMusicSynth::GetChannelPriority, IDirectMusicSynth::SetChannelPriority |
Instrumentos | IDirectMusicSynth::D ownload, IDirectMusicSynth::Unload |
Informações | IDirectMusicSynth::GetAppend, IDirectMusicSynth::GetFormat, IDirectMusicSynth::GetLatencyClock, IDirectMusicSynth::GetPortCaps , IDirectMusicSynth::GetRunningStats |
Reprodução | IDirectMusicSynth::P layBuffer, IDirectMusicSynth::Render |
Portas | IDirectMusicSynth::Open, IDirectMusicSynth::Close, IDirectMusicSynth::SetNumChannelGroups |
Parâmetros diversos | IDirectMusicSynth::SetMasterClock, IDirectMusicSynth::SetSynthSink |
A maioria dos aplicativos não precisa chamar os métodos na interface IDirectMusicSynth diretamente; A porta DirectMusic normalmente gerencia o sintetizador. No entanto, seu aplicativo pode se conectar diretamente ao sintetizador durante o desenvolvimento e o teste.
O sintetizador não é concluído sem uma conexão com um coletor de ondas, que é representado como um objeto com uma interface IDirectMusicSynthSink . O coletor de ondas conecta o fluxo de saída de áudio do sintetizador a um módulo de renderização de áudio, como DirectSound, DirectShow ou a API waveOut do Windows Multimídia.
Por padrão, o DirectMusic usa sua implementação interna de IDirectMusicSynthSink para lidar com os dados de onda gerados pelo sintetizador de software. Esse coletor de ondas alimenta os dados para DirectSound.
Antes que o sintetizador possa ser ativado, um coletor de ondas deve primeiro ser criado e conectado ao sintetizador por meio de uma chamada para IDirectMusicSynth::SetSynthSink. Essa deve ser a primeira chamada depois de criar o sintetizador porque muitas das chamadas relacionadas ao tempo, incluindo IDirectMusicSynth::GetLatencyClock e IDirectMusicSynth::SetMasterClock, são realmente passadas para chamadas equivalentes em IDirectMusicSynthSink.
Somente o DirectX 6.1 e o DirectX 7 dão suporte à implementação de um coletor de ondas do modo de usuário personalizado com uma interface IDirectMusicSynthSink . IDirectMusicSynthSink dá suporte aos métodos mostrados na tabela a seguir, que organiza os métodos em grupos funcionais.
Grupo | Nomes de método |
---|---|
Inicialização | IDirectMusicSynthSink::Activate, IDirectMusicSynthSink::GetDesiredBufferSize |
IDirectMusicSynthSink::Init, IDirectMusicSynthSink::SetDirectSound | |
Timing | IDirectMusicSynthSink::GetLatencyClock, IDirectMusicSynthSink::RefTimeToSample |
IDirectMusicSynthSink::SampleToRefTime, IDirectMusicSynthSink::SetMasterClock |
No DirectX 8 e posterior, o DirectMusic sempre usa seu coletor de ondas interno com um sintetizador de modo de usuário. Essas versões posteriores do DirectMusic não dão suporte a implementações personalizadas de IDirectMusicSynthSink.
No entanto, no DirectX 6.1 e no DirectX 7, você está livre para implementar seu próprio objeto IDirectMusicSynthSink e usá-lo para gerenciar o fluxo de saída de áudio do sintetizador da maneira que desejar. Por exemplo, você pode alimentar os dados de onda no DirectShow ou na API waveOut . Se você criar um objeto de fluxo de onda, ele deverá ter uma interface IDirectMusicSynthSink para conectar-se ao objeto IDirectMusicSynth .
Além de gerenciar o fluxo de ondas, o coletor de ondas é responsável por controlar o tempo do sintetizador. O coletor de ondas recebe o relógio master por uma chamada para IDirectMusicSynth::SetMasterClock, que passa a master fonte de tempo com uma chamada idêntica para IDirectMusicSynthSink::SetMasterClock. Como o relógio master não é gerado do mesmo cristal que o fluxo de ondas, o coletor de ondas deve mantê-los sincronizados compensando a descompasso do relógio.
Além disso, para que o sintetizador possa acompanhar o tempo adequadamente, ele fornece duas chamadas para converter de master hora do relógio para a hora de exemplo e voltar:
IDirectMusicSynthSink::RefTimeToSample
IDirectMusicSynthSink::SampleToRefTime
O coletor de ondas gera o relógio de latência porque ele realmente gerencia os horários em que os exemplos são gravados por chamadas para IDirectMusicSynth::Render. Quando DirectMusic chama IDirectMusicSynth::GetLatencyClock na porta DirectMusic, ele simplesmente se vira e chama IDirectMusicSynthSink::GetLatencyClock.
Quando um sintetizador de software é aberto pela primeira vez, o DirectMusic fornece ao sintetizador uma estrutura DMUS_PORTPARAMS (descrita na documentação do SDK do Microsoft Windows) que especifica a taxa de exemplo e o número de canais para o fluxo de saída de áudio. Em seguida, o sintetizador os converte em uma estrutura WAVEFORMATEX padrão que passa para o coletor de ondas quando o coletor de ondas chama o método IDirectMusicSynth::GetFormat .
Para obter informações adicionais, consulte as descrições das interfaces IDirectMusic e IDirectMusicPort na documentação do SDK do Windows.