Configuração do alto-falante DSSPEAKER_DIRECTOUT
Nota Essas informações se aplicam ao Windows XP e a sistemas operacionais anteriores. A partir do Windows Vista, IDirectSound::GetSpeakerConfig e IDirectSound::SetSpeakerConfig foram preteridos.
Um programa de aplicativo pode alterar a configuração do alto-falante DirectSound para o modo de saída direto chamando o método IDirectSound::SetSpeakerConfig com o parâmetro speaker-configuration definido como DSSPEAKER_DIRECTOUT (consulte SDK do Microsoft Windows documentação). Isso especifica uma configuração sem alto-falante na qual os canais no fluxo de reprodução do aplicativo são gerados diretamente para o adaptador de áudio sem serem interpretados como posições de alto-falante. No entanto, o fluxo de entrada ainda pode ser modificado por conversão de taxa de exemplo, atenuação, filtragem e outros tipos de processamento que não exigem suposições sobre a atribuição de alto-falantes a canais.
Depois que ele entra em vigor, o DSSPEAKER_DIRECTOUT definição de configuração do alto-falante é global e afeta o dispositivo de áudio como um todo. Todos os aplicativos de áudio executados posteriormente estão sujeitos à nova configuração até que o DirectSound altere a configuração novamente.
No modo de saída direta, o dispositivo de áudio renderiza o primeiro canal para o primeiro conector de saída no dispositivo, o segundo canal para a segunda saída no dispositivo e assim por diante. Isso permite que um aplicativo de criação de áudio gere dados multicanal diretamente para um dispositivo, como um mixer externo ou um dispositivo de armazenamento de áudio (disco rígido, ADAT e assim por diante). Por exemplo, os canais em um fluxo de 48 canais podem ser atribuídos, conforme mostrado na tabela a seguir.
Conteúdo do Número do Canal 0
Vocal
1
Bateria
2
Guitarra
3
Baixo
...
47
Piano
Para esse tipo de dados de áudio brutos, as posições do alto-falante não têm sentido e atribuir posições de alto-falante aos fluxos de entrada ou saída pode causar efeitos colaterais indesejados. Por exemplo, um componente como o KMixer pode intervir inadequadamente aplicando efeitos específicos do locutor, como virtualização 3D ou codificação do Dolby Surround Pro Logic ao fluxo. Observe que o número de canais de dados brutos não é limitado pelo número de bits na máscara de canal.
Mesmo um dispositivo que não foi projetado especificamente para edição de áudio normalmente deve aceitar uma solicitação KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property para alterar sua configuração de alto-falante para KSAUDIO_SPEAKER_DIRECTOUT. Em geral, um dispositivo deve evitar falhar na solicitação, a menos que possa de alguma forma verificar se suas saídas estão conectadas a alto-falantes e não podem ser usadas externamente para qualquer outra finalidade (por exemplo, como entradas para um mixer externo).
Um aplicativo que usa o modo de saída direta normalmente é escrito para um dispositivo de hardware específico. Isso permite que o aplicativo saiba com antecedência quais formatos de dados de saída direta o dispositivo dá suporte, incluindo o número de canais e como os dados nesses canais devem ser interpretados. Esse conhecimento é necessário porque quando um aplicativo chama IDirectSound::GetSpeakerConfig em um dispositivo configurado no modo de saída direta, o dispositivo apenas confirma que ele está nesse modo; ele não fornece informações adicionais sobre o número de canais nos formatos de fluxo aos quais dá suporte no modo de saída direta. (Essas informações podem ser obtidas, no entanto, enviando um KSPROPERTY_AUDIO_MIX_LEVEL_CAPS solicitação get-property para o nó supermixer no pin do mixer do dispositivo; consulte Requisitos de Node-Ordering do DirectSound.)
Ao especificar o formato de onda para um fluxo direto, um aplicativo deve definir o membro dwChannelMask da estrutura WAVEFORMATEXTENSIBLE para o valor KSAUDIO_SPEAKER_DIRECTOUT, que é zero. Uma máscara de canal de zero indica que nenhuma posição do alto-falante está definida. Como sempre, o número de canais no fluxo é especificado no membro Format.nChannels .
Os fornecedores de hardware têm a opção de dar suporte à aceleração de hardware directSound quando seus dispositivos são configurados no modo de saída direta. Um aplicativo DirectSound pode reproduzir um fluxo direto por meio de um dos pinos de combinação do dispositivo, se houver um disponível. Depois que todas as instâncias de pino de hardware disponíveis tiverem sido esgotadas, todos os novos fluxos passarão pelo KMixer.
Ao misturar fluxos para um dispositivo configurado no modo de saída direta, o KMixer aplica um mapeamento um-para-um entre os canais dos fluxos de entrada dos aplicativos e os canais do fluxo de combinação que ele gera para o dispositivo. Isso significa que, se o aplicativo gerar vários fluxos de saída direta que têm o mesmo número de canais, por exemplo, cada canal N da combinação de saída será simplesmente a soma dos canais N de todos os fluxos que entram no KMixer.
Ao misturar vários fluxos diretos que diferem no número de canais que eles contêm, o algoritmo de combinação do KMixer é um pouco mais complexo. Nesse caso, cada canal N da combinação é a soma dos canais N de todos os fluxos de entrada que têm um canal N. Por exemplo, se o KMixer misturar fluxos de entrada quad e estéreo para formar uma combinação de saída quad, os canais zero e um da combinação de saída serão as somas dos canais zero e um, respectivamente, dos fluxos estéreo e quad de entrada. No entanto, o fluxo de entrada estéreo não contribui em nada para os canais dois e três da mistura, que são obtidos exclusivamente dos dois últimos canais do fluxo de entrada quad.
Um aplicativo que tenta fazer um dos seguintes procedimentos está arriscando um comportamento imprevisível:
Reproduza um fluxo que não esteja no formato de saída direta por meio de um dispositivo configurado no modo de saída direta.
Reproduza um fluxo de saída direto por meio de um dispositivo que não está configurado no modo de saída direta.
Quando confrontado com um desses casos, o KMixer evita simplesmente falhar na tentativa de abrir o fluxo. Em vez disso, ele tenta lidar com a incompatibilidade aparente usando o algoritmo de mapeamento um-para-um descrito acima. O usuário pode ou não estar satisfeito com o resultado. Não se pode esperar que outros componentes de áudio lidem com esses casos da mesma forma que o KMixer. Por exemplo, o driver de um dispositivo configurado no modo de saída direta deve falhar uma tentativa de abrir um buffer de hardware para um fluxo de saída que não está no formato de saída direta e vice-versa.
Um aplicativo de criação de áudio pode precisar permitir que o usuário ouça os dados que ele misturou nos primeiros vários canais de seu fluxo de saída, mas ignorar os dados brutos que ainda estão contidos nos canais restantes do fluxo. O comportamento do KMixer torna isso simples. Por exemplo, se um fluxo de reprodução de 24 canais contiver uma combinação estéreo nos canais 0 e 1 e dados brutos nos canais 2 a 23, o aplicativo fará o seguinte:
Configura o dispositivo de áudio de destino (esse não é necessariamente o dispositivo que o aplicativo usa para editar o fluxo) no modo estéreo chamando SetSpeakerConfig com DSSPEAKER_STEREO.
Altera dwChannelMask na estrutura WAVEFORMATEXTENSIBLE do fluxo de reprodução para KSAUDIO_SPEAKER_STEREO, mas deixa Format.nChannels definido como 24, que é o número total de canais no fluxo.
O KMixer mistura apenas os canais estéreo do fluxo de reprodução, que são descritos na máscara de canal, e descarta os 22 canais restantes, que contêm dados brutos. Lembre-se de que qualquer alteração feita na configuração do alto-falante DirectSound não terá efeito até que o objeto DirectSound atual seja destruído e outro seja criado (consulte Aplicando configurações de Speaker-Configuration).