Compartilhar via


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.