Форматы устройств

Для звукового приложения преимущество использования API звука более высокого уровня, например DirectSound или функций Windows multimedia waveOutXxx , заключается в том, что API автоматически преобразуется между форматами потоков, используемыми приложением, и форматами, используемыми звуковым устройством. В отличие от этого, основные API аудио являются более строгими, так как они требуют, чтобы потоки приложений использовали форматы, которые совпадают с форматами, или тесно связаны с форматами, используемыми устройством. Таким образом, приложения, использующие основные API аудио для воспроизведения или записи аудиопотоков, могут потребоваться для выполнения некоторых или всех преобразований между форматами потоков.

Приложение, использующее WASAPI для управления потоками общего режима, может полагаться на подсистему аудио, чтобы выполнять только ограниченные преобразования формата. Звуковой модуль может преобразоваться между стандартным размером образца PCM, используемым приложением, и примерами с плавающей запятой, используемыми подсистемой для внутренней обработки. Однако формат потока приложений обычно должен иметь одинаковое количество каналов и ту же частоту выборки, что и формат потока, используемый устройством.

Если приложение использует устройство в монопольном режиме, приложение должно использовать формат потока, который звуковое оборудование явно поддерживает. В монопольном режиме приложение и устройство обмениваются звуковыми данными напрямую без вмешательства звукового модуля.

Многие звуковые устройства поддерживают форматы потоков PCM и не PCM. Однако звуковой модуль может смешивать только потоки PCM. Таким образом, только потоки в монопольном режиме могут иметь форматы, отличные от PCM. Кроме того, в монопольном режиме поддерживаются только форматы, отличные от PCM с фиксированными тарифами данных. Пример формата фиксированной скорости, отличного от PCM, — это аудиопоток Windows Media Audio Professional (WMA Pro), который проходит по ссылке Sony/Philips digital interface (S/PDIF) в цифровой форме, не декодируемый. Дополнительные сведения об использовании потоков WMA Pro по протоколу S/PDIF см. в разделе "Указание диапазонов данных WMA Pro".

WASAPI использует структуру WAVEFORMATEX или WAVEFORMATEXTENSIBLE для указания формата потока. Структура WAVEFORMATEXTENSIBLE фактически является структурой WAVEFORMATEX, которая была расширена для описания большего диапазона форматов. Любой формат, который можно описать отдельной структурой WAVEFORMATEX , также можно описать структурой WAVEFORMATEXTENSIBLE .

Первым элементом структуры WAVEFORMATEXTENSIBLE является структура WAVEFORMATEX. Содержимое структуры WAVEFORMATEX указывает, является ли она автономной структурой WAVEFORMATEX или частью структуры WAVEFORMATEXTENSIBLE.

Автономная структура WAVEFORMATEX может достаточно описать формат с одним или двумя каналами и размером выборки, который является несколькими 8 битами. Сама по себе структура WAVEFORMATEX не может указывать сопоставление каналов с позициями говорящего. Кроме того, хотя WAVEFORMATEX указывает размер контейнера для каждого звукового примера, он не может указать количество битов точности в образце (например, 20 битов точности в 24-разрядном контейнере). В отличие от этого, структура WAVEFORMATEXTENSIBLE может указывать как сопоставление каналов с динамиками, так и количество битов точности в каждом образце.

Дополнительные сведения о WAVEFORMATEX и WAVEFORMATEXTENSIBLE см. в документации по Windows DDK.

Начиная с Windows 7, WAVEFORMATEXTENSIBLE был расширен для представления форматов устройств для передачи закодированного звука через интерфейс, совместимый с IEC 61937. Сведения о новой структуре см. в разделе "Форматы представления" для передачи IEC 61937.

Указание формата устройства

Следующие методы WASAPI используют структуры WAVEFORMATEX и WAVEFORMATEXTENSIBLE для описания форматов потоков:

Метод GetMixFormat извлекает формат потока, используемый обработчиком аудио для внутренней обработки потоков общего режима. Метод всегда использует структуру WAVEFORMATEXTENSIBLE вместо автономной структуры WAVEFORMATEX , чтобы указать формат.

Метод IsFormatSupported указывает, поддерживает ли устройство аудиоконечную точку определенного формата потока. Вызывающий объект должен указать, предназначен ли формат потока для использования в общем режиме или в монопольном режиме. Для форматов общего режима метод запрашивает звуковой модуль, чтобы определить, поддерживает ли он указанный формат. Для форматов монопольного режима метод запрашивает драйвер устройства. Некоторые драйверы устройств будут сообщать о том, что они поддерживают формат 1-канала или 2-канала PCM, если формат указан отдельной структурой WAVEFORMATEX , но отклонит тот же формат, если он указан структурой WAVEFORMATEXTENSIBLE . Чтобы получить надежные результаты от этих драйверов, приложения в монопольном режиме должны вызывать IsFormatSupported дважды для каждого формата 1-канала или 2-канала PCM. Один вызов должен использовать автономную структуру WAVEFORMATEX для указания формата, а другой вызов должен использовать структуру WAVEFORMATEXTENSIBLE для указания того же формата.

После того как приложение использовало GetMixFormat или IsFormatSupported для поиска соответствующего формата для потока общего или эксклюзивного режима, приложение может вызвать метод Initialize для инициализации потока с таким форматом. Приложение, которое пытается инициализировать поток общего режима с форматом, который не идентичен формату смеси, полученному из метода GetMixFormat , но с таким же числом каналов и той же скоростью выборки, что и формат смеси, скорее всего, завершится успешно. Перед вызовом Initialize приложение может вызвать IsFormatSupported, чтобы убедиться, что инициализация примет формат.

Формат смешивания, используемый обработчиком звука для внутренней обработки потоков общего режима, тесно связан с, но не обязательно идентичен формату потока, используемому устройством аудио конечной точки в общем режиме. С помощью панели управления мультимедиа Windows Mmsys.cpl пользователь может выбрать формат потока, который будет использоваться устройством аудио конечной точки при работе в общем режиме. Для этого необходимо выполнить следующие шаги:

  1. Чтобы запустить Mmsys.cpl, откройте окно командной строки и введите следующую команду:

    элемент управления mmsys.cpl

    Кроме того, можно запустить Mmsys.cpl, щелкнув правой кнопкой мыши значок говорящего в области уведомлений, расположенную справа от панели задач, и выбрав "Устройства воспроизведения" или "Устройства записи".

  2. После открытия окна Mmsys.cpl выберите устройство из списка устройств воспроизведения или списка устройств записи и нажмите кнопку "Свойства".

  3. Когда откроется окно свойств, нажмите кнопку "Дополнительно" и выберите формат из списка доступных форматов в поле с меткой "Формат по умолчанию".

Например, предположим, что пользователь выбирает следующий формат по умолчанию из списка доступных форматов для устройства воспроизведения:

2 канала, 16 бит, 44100 Гц (CD Quality)

Это формат, который устройство будет использовать при работе в общем режиме. В Windows Vista звуковой модуль будет использовать немного измененную версию этого формата для внутренней обработки потоков общего режима. Звуковой модуль будет использовать формат с одинаковым количеством каналов (два) и той же частотой выборки (44100 Гц), но он преобразует образцы в числа с плавающей запятой перед обработкой. Звуковой механизм преобразует примеры с плавающей запятой в смешивании выходных данных в 16-разрядные целые числа, прежде чем воспроизводить их через устройство.

Приложение может запрашивать свойство PKEY_AudioEngine_DeviceFormat устройства аудио конечной точки, чтобы получить формат общего режима, выбранный пользователем для устройства. Сведения о запросе свойств устройства см. в разделе "Свойства устройства".

Некоторые приложения могут найти формат, указанный свойством PKEY_AudioEngine_DeviceFormat устройства, подходящим для открытия потока в монопольном режиме на устройстве. Другие приложения, которые управляют потоками в монопольном режиме, могут иметь дополнительные требования, требующие сложного согласования формата с устройством. Как правило, одно из этих приложений создает список подходящих форматов с предпочитаемыми форматами в начале списка. Затем приложение выполняет итеративный вызов IsFormatSupported с каждым последовательным форматом в списке, начиная с начала списка, пока не обнаружит формат, поддерживаемый устройством.

Устройства аудиоконечной точки