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


Фон поддержки без PCM

Некоторые проблемы не позволяли более ранним версиям Microsoft Windows поддерживать форматы, не относящиеся к PCM, через API waveOut и DirectSound. Эти вопросы и способы их решения рассматриваются ниже.

API waveOut

Программный уровень, который отделяет приложения waveOut от драйверов волн VxD, довольно тонкий. Драйверы и приложения, поддерживающие пользовательский формат волн, могут выполнять потоковую передачу данных в этом формате независимо от того, понимает ли операционная система этот формат.

Однако в Windows 2000 и Windows 98 платформа WDM передает все звуковые данные, обрабатываемые API waveOut (и отрисовщиком DirectShow waveOut), через системный драйвер KMixer (Kmixer.sys), который является аудиомиксером ядра. Вызов waveOutOpen завершается успешно, только если KMixer поддерживает формат, независимо от того, поддерживает ли драйвер этот формат.

KMixer обрабатывает WAVE_FORMAT_PCM во всех операционных системах WDM. Windows 2000 и более поздних версий и Windows 98 SE расширяют возможности KMixer для поддержки не только WAVE_FORMAT_IEEE_FLOAT но и версий WAVEFORMATEXTENSIBLE форматов PCM и IEEE-float. Так как KMixer не поддерживает форматы, отличные от PCM, попытка передать данные, не относящиеся к PCM, через KMixer завершается ошибкой.

Windows поддерживает форматы, отличные от PCM, позволяя аудиоданным без PCM просто обходить KMixer. В частности, данные waveOut, не относящиеся к PCM, передаются непосредственно в PortCls (или USBAudio), а не сначала через KMixer. Любое смешивание данных, не относящихся к PCM, должно выполняться на оборудовании, но приложения, использующие данные, не относящиеся к PCM, в таком формате, как AC-3 или WMA Pro, обычно не требуют смешивания, а драйверы обычно не поддерживают аппаратное смешивание в этом формате.

DirectSound API

В устаревших драйверах waveOut и драйверах VxD DirectSound поддерживает форматы PCM WAVEFORMATEX (но не WAVEFORMATEXTENSIBLE) для первичных и вторичных буферов с 8 или 16 битами на выборку, одним или двумя каналами и частотой выборки от 100 Гц до 100 кГц. Драйверы VxD могут дополнительно ограничить форматы, разрешенные для первичных буферов, если для уровня совместной работы задано значение DSSCL_WRITEPRIMARY (см. описание метода IDirectSoundBuffer::SetFormat в пакете SDK для DirectX). Эти ограничения не изменились в Windows Me или Windows XP.

Драйверы WDM могут поддерживать форматы PCM в формах WAVEFORMATEX и WAVEFORMATEXTENSIBLE. Для Windows 2000 и более поздних версий, Windows Me и Windows 98 SE драйверы также могут поддерживать формат WAVE_FORMAT_IEEE_FLOAT для основного и дополнительного буферов DSBCAPS_LOCSOFTWARE (смешанных KMixer) в форме WAVEFORMATEX и WAVEFORMATEXTENSIBLE.

Вызов SetFormat для указания формата данных основного буфера оказывает косвенное влияние только на окончательный формат микширования, выбранный карта звука. Основной объект буфера используется для получения интерфейса IDirectSound3DListener, а также для задания глобального тома и сдвига устройства, но не представляет единый выходной поток из звукового карта. Вместо этого KMixer смешивает данные из основного буфера, чтобы обеспечить одновременное выполнение нескольких DSSCL_WRITEPRIMARY клиентов DirectSound.

В Windows 2000 и Windows 98 DirectSound поддерживает только данные PCM. (То же самое относится и к DirectShow, который использует отрисовщик DirectSound.) Вызов CreateSoundBuffer в формате, отличном от PCM, всегда завершается ошибкой, даже если драйвер поддерживает этот формат. Сбой происходит по двум причинам. Во-первых, всякий раз, когда DirectSound создает закрепление KS, он автоматически задает KSDATAFORMAT_SUBTYPE_PCM вместо наследования подтипа от члена wFormatTag структуры WAVEFORMATEX, которая используется для создания объекта IDirectSoundBuffer . Во-вторых, для DirectSound требуется, чтобы каждый путь к данным должен иметь узлы тома и SRC (преобразование частоты выборки) (KSNODETYPE_VOLUME и KSNODETYPE_SRC), независимо от того, запрашивает ли клиент элементы управления сдвига, громкости или частоты в буфере DirectSound. Это требование выполняется, если данные проходят через KMixer или устройство выполняет смешивание оборудования. Однако для форматов, отличных от PCM, KMixer отсутствует в пути к данным, и сами драйверы обычно завершаются сбоем при запросе на смешивание оборудования.

Windows XP и более поздних версий, а также Windows Me снимите ограничения, которые не позволяли приложениям DirectSound использовать форматы, не связанные с PCM. DirectSound 8 (и более поздних версий) использует правильный подтип формата и больше не требует автоматического использования узлов тома и SRC в каждом пути к данным.