Especificando intervalos de dados AC-3
O arquivo de cabeçalho Mmreg.h define o valor 0x0092 para ser a marca de formato de onda para AC-3-over-S/PDIF:
#define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092
Marcas de formato de onda 0x0240 e 0x0241 são sinônimos de 0x0092 e muitos aplicativos de DVD tratam as três marcas como idênticas. No entanto, para eliminar a redundância, drivers e aplicativos devem dar suporte apenas a 0x0092 de marcação (e não dar suporte a marcas 0x0240 e 0x0241).
O GUID de formato-subtipo correspondente pode ser especificado em termos da marca de formato de onda usando a macro DEFINE_WAVEFORMATEX_GUID do arquivo de cabeçalho Ksmedia.h da seguinte maneira:
#define KSDATAFORMAT_SUBTYPE_AC3_SPDIF \
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
O exemplo de código a seguir mostra como um driver de miniporta WaveCyclic ou WavePci pode especificar as entradas da tabela KSDATARANGE_AUDIO para um pin que dá suporte ao formato AC-3-over-S/PDIF:
static KSDATARANGE_AUDIO PinDataRangesAC3Stream[] =
{
// 48-kHz AC-3 over S/PDIF
{
{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
2, // Max number of channels
16, // Minimum number of bits per sample
16, // Maximum number of bits per channel
48000, // Minimum rate
48000 // Maximum rate
},
// If you do not include this second data range (which is identical
// to the first except for the value KSDATAFORMAT_SPECIFIER_DSOUND),
// then your non-PCM pin is not seen by DirectSound on Windows 98 SE
// or Windows 2000, regardless of the DirectX version or whether a
// hotfix or service pack is installed.
{
{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_DSOUND)
},
2, // Max number of channels
16, // Minimum number of bits per sample
16, // Maximum number of bits per channel
48000, // Minimum rate
48000 // Maximum rate
}
};
A segunda entrada de intervalo de dados na tabela anterior é necessária para permitir que o DirectSound manipule o formato AC-3-over-S/PDIF não PCM no Windows 2000 SP2 e no Microsoft Windows 98 SE + hotfix.
Para cada intervalo de dados que o driver de miniporto especifica com KSDATAFORMAT_SPECIFIER_WAVEFORMATEX, o driver de porta adiciona automaticamente um segundo intervalo de dados especificado com KSDATAFORMAT_SPECIFIER_DSOUND mas, de outra forma, é idêntico ao primeiro. (Você pode verificar isso usando o utilitário KsStudio para exibir a lista de intervalos de dados.) No Windows 2000 e no Windows 98, o driver de porta cria KSDATAFORMAT_SPECIFIER_DSOUND versões de intervalos de dados somente para formatos de KSDATAFORMAT_SUBTYPE_PCM porque as versões do DirectSound antes do DirectSound 8 dão suporte apenas ao PCM. Essa limitação é removida no Windows XP e posterior e no Windows Me. No entanto, ele não é removido no Windows 2000 SP2 ou no pacote de hot-fix para Windows 98 SE e, para dar suporte a não PCM no DirectSound nessas versões do Windows, um driver deve listar explicitamente dois intervalos de dados para cada formato de dados não PCM– um com KSDATAFORMAT_SPECIFIER_WAVEFORMATEX e outro com KSDATAFORMAT_SPECIFIER_DSOUND.
Conforme explicado em S/PDIF Pass-Through Transmissão de Fluxos não PCM, os dois intervalos de dados AC-3-over-S/PDIF usam os seguintes parâmetros PCM: dois canais e 16 bits por canal.