Поделиться через


Указание диапазонов данных AC-3

Файл заголовка Mmreg.h определяет значение, 0x0092 быть тегом формата волны для AC-3-over-S/PDIF:

    #define WAVE_FORMAT_DOLBY_AC3_SPDIF  0x0092

Теги в формате волн, 0x0240 и 0x0241, являются синонимами 0x0092 и многие приложения DVD рассматривают эти три тега как идентичные. Однако, чтобы исключить избыточность, драйверы и приложения должны поддерживать только 0x0092 тегов (а не теги 0x0240 и 0x0241).

Соответствующий GUID подтипа формата можно указать в виде тега wave-format с помощью макроса DEFINE_WAVEFORMATEX_GUID из файла заголовка Ksmedia.h следующим образом:

  #define KSDATAFORMAT_SUBTYPE_AC3_SPDIF    \
                      DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)

В следующем примере кода показано, как драйвер miniport WaveCyclic или WavePci может указать записи таблицы KSDATARANGE_AUDIO для закрепления, поддерживающего формат 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
  }
};

Вторая запись диапазона данных в предыдущей таблице необходима, чтобы включить DirectSound для обработки формата AC-3-over-S/PDIF в Windows 2000 с пакетом обновления 2 (SP2) и в Microsoft Windows 98 SE + исправление.

Для каждого диапазона данных, заданного драйвером мини-порта с помощью KSDATAFORMAT_SPECIFIER_WAVEFORMATEX, драйвер порта автоматически добавляет второй диапазон данных, указанный с помощью KSDATAFORMAT_SPECIFIER_DSOUND но в противном случае идентичен первому. (Это можно проверить с помощью служебной программы KsStudio для просмотра списка диапазонов данных.) В Windows 2000 и Windows 98 драйвер порта создает KSDATAFORMAT_SPECIFIER_DSOUND версии диапазонов данных только для KSDATAFORMAT_SUBTYPE_PCM форматов, так как версии DirectSound до DirectSound 8 поддерживают только PCM. Это ограничение снимается в Windows XP и более поздних версиях, а также в Windows Me. Однако он не удаляется в Windows 2000 с пакетом обновления 2 (SP2) или пакетом горячего исправления для Windows 98 SE. Для поддержки directSound в этих версиях Windows драйвер должен явно перечислить два диапазона данных для каждого формата данных, отличного от PCM: один с KSDATAFORMAT_SPECIFIER_WAVEFORMATEX, а другой с KSDATAFORMAT_SPECIFIER_DSOUND.

Как описано в разделе S/PDIF Pass-Through передачи потоков, отличных от PCM, два диапазона данных AC-3-over-S/PDIF используют следующие параметры PCM: два канала и 16 бит на канал.