GUIDs de tecnologia da música
Um driver de miniporto MIDI ou DMus deve especificar o intervalo de formatos de fluxo que cada um de seus pinos é capaz de manipular. Conforme descrito em Pin Factories, o driver especifica essas informações como uma matriz de um ou mais descritores de intervalo de dados, cada um deles é uma estrutura do tipo KSDATARANGE_MUSIC. O membro De tecnologia dessa estrutura indica que tipo de tecnologia de sintetizador o dispositivo MIDI ou DirectMusic usa. Um driver de miniporta pode definir o membro Technology como um dos valores guid mostrados na tabela a seguir (coluna à esquerda).
GUID de tecnologia KSDATARANGE_MUSIC | MIDIOUTCAPS wTechnology Value | Significado |
---|---|---|
KSMUSIC_TECHNOLOGY_PORT |
MOD_MIDIPORT |
O dispositivo é um dispositivo MPU-401. |
KSMUSIC_TECHNOLOGY_SYNTH |
MOD_SYNTH |
O dispositivo é um sintetizador. |
KSMUSIC_TECHNOLOGY_SQSYNTH |
MOD_SQSYNTH |
O dispositivo é um sintetizador de onda quadrada. |
KSMUSIC_TECHNOLOGY_FMSYNTH |
MOD_FMSYNTH |
O dispositivo é um sintetizador FM. |
KSMUSIC_TECHNOLOGY_MAPPER |
MOD_MAPPER |
O dispositivo é o mapeador midi da Microsoft. |
KSMUSIC_TECHNOLOGY_WAVETABLE |
MOD_WAVETABLE |
O dispositivo é um sintetizador de tabela de ondas de hardware. |
KSMUSIC_TECHNOLOGY_SWSYNTH |
MOD_SWSYNTH |
O dispositivo é um sintetizador de software. |
A função midiOutGetDevCaps converte o GUID de tecnologia que recebe do driver para um índice que ele grava no membro wTechnology da estrutura MIDIOUTCAPS que ele gera para o chamador. A tabela anterior mostra o valor wTechnology (coluna central) correspondente a cada GUID de tecnologia. Para obter mais informações sobre midiOutGetDevCaps e MIDIOUTCAPS, consulte a documentação do SDK do Microsoft Windows.
Ao enumerar dispositivos, um aplicativo MIDI que usa o midiOut multimídia do Windows ou a API midiIn pode ver pinos MIDI, mas não pinos DirectMusic. Um aplicativo DirectMusic pode ver os pinos MIDI e DirectMusic. Um driver de miniporta MIDI ou DMus identifica um pino MIDI definindo o GUID do subtipo nos intervalos de dados do pino como KSDATAFORMAT_SUBTYPE_MIDI. Um driver de miniporta DMus identifica um pino DirectMusic definindo o GUID do subtipo como KSDATAFORMAT_SUBTYPE_DIRECTMUSIC. Para obter exemplos de intervalos de dados para pinos MIDI e DirectMusic, consulte Intervalo de dados de fluxo midi e intervalo de dados de fluxo directmusic.
Conforme explicado em FILTROS MIDI e DirectMusic, um driver de adaptador chama a função PcNewMiniport para criar uma instância de um dos drivers de miniporto fornecidos pelo sistema em Portcls.sys. O chamador especifica um dos GUIDs do driver na tabela a seguir para especificar qual driver de miniporto será instanciado.
Driver GUID | GUID de tecnologia |
---|---|
CLSID_MiniportDriverDMusUART |
KSMUSIC_TECHNOLOGY_PORT |
CLSID_MiniportDriverDMusUARTCapture |
KSMUSIC_TECHNOLOGY_PORT |
CLSID_MiniportDriverFmSynth |
KSMUSIC_TECHNOLOGY_FMSYNTH |
CLSID_MiniportDriverFmSynthWithVol |
KSMUSIC_TECHNOLOGY_FMSYNTH |
CLSID_MiniportDriverUart |
KSMUSIC_TECHNOLOGY_PORT |
A coluna direita da tabela anterior indica o GUID de tecnologia que o driver de miniporto correspondente especifica nos intervalos de dados de seus pinos. Por exemplo, o driver de miniporta FmSynth atribui o GUID de tecnologia KSMUSIC_TECHNOLOGY_FMSYNTH a seus pinos.
Alguns dispositivos sintetizadores de tabela de ondas se expõem a aplicativos como dispositivos MPU-401 (com guid de tecnologia KSMUSIC_TECHNOLOGY_PORT). Na ausência de um sintetizador externo, eles são capazes de reproduzir um fluxo de bytes MIDI bruto através do sintetizador de tabela de ondas.
No entanto, a API midiOut prefere dispositivos sintetizadores wavetable (com guid de tecnologia KSMUSIC_TECHNOLOGY_WAVETABLE) ao selecionar o dispositivo de reprodução MIDI padrão (preferencial). Ele evita explicitamente selecionar um dispositivo MPU-401 para ser o dispositivo padrão.
Para se tornar elegível para ser o dispositivo padrão, um dispositivo que pode reproduzir MIDI bruto deve se expor como um dispositivo que permite ondas, não um dispositivo MPU-401. No entanto, se um driver de adaptador estiver usando o driver de miniporta MPU-401 fornecido pelo sistema, DMusUART, para gerenciar seu dispositivo sintetizador de tabela de ondas, esse driver de miniporta atribuirá estaticamente o GUID de tecnologia KSMUSIC_TECHNOLOGY_PORT aos seus pinos.
Ao chamar o método IMusicTechnology::SetTechnology , um driver de adaptador pode substituir os GUIDs de tecnologia em intervalos de dados de um driver de miniporto. No exemplo de código a seguir, um driver de adaptador altera o GUID de tecnologia nos intervalos de dados do driver de miniporto DMusUART de seu valor padrão, KSMUSIC_TECHNOLOGY_PORT, para o valor KSMUSIC_TECHNOLOGY_WAVETABLE. Com essa nova configuração, o dispositivo de tabela de ondas semelhante a MPU está qualificado para ser selecionado pela API midiOut como o dispositivo MIDI padrão.
// Create the miniport object.
PUNKNOWN miniport;
ntStatus = PcNewMiniport((PMINIPORT*)&miniport, CLSID_MiniportDriverDMusUART);
// Query the miniport driver for the IMusicTechnology interface.
IMusicTechnology* pMusicTechnology;
if (NT_SUCCESS(ntStatus))
{
ntStatus = miniport->QueryInterface(IID_IMusicTechnology, (PVOID*)&pMusicTechnology);
}
// Set the Technology members in the DirectMusic data-range entries
// for all the pins that are exposed by this miniport.
// SetTechnology should be called before initializing the miniport.
if (NT_SUCCESS(ntStatus))
{
ntStatus = pMusicTechnology->SetTechnology(&KSMUSIC_TECHNOLOGY_WAVETABLE);
}
Conforme indicado no comentário no exemplo de código anterior, o driver do adaptador deve chamar SetTechnology antes de chamar o método do driver de Init
porta (que, por sua vez, chama o método do driver de Init
miniporto). Os drivers de miniporta DMusUART e UART fornecidos pelo sistema dão suporte à interface IMusicTechnology . Para outros drivers de miniporta, o suporte para IMusicTechnology é opcional. Para obter mais informações, consulte a implementação do método SetTechnology no driver de áudio de exemplo DMusUART no WDK (Microsoft Windows Driver Kit).