Форматы устройств
Для звукового приложения преимущество использования API аудио более высокого уровня, например DirectSound или мультимедиа Windows 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.
Первый элемент структуры WAVEFORMATEXTENS IBLE является структурой WAVEFORMATEX. Содержимое структуры WAVEFORMATEX указывает, является ли она автономной структурой WAVEFORMATEX или частью структуры WAVEFORMATEXTENS IBLE.
Автономная структура 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 дважды для каждого формата PCM 1-канала или 2-канала. Один вызов должен использовать автономную структуру WAVEFORMATEX для указания формата, а другой вызов должен использовать структуру WAVEFORMATEXTENSIBLE, чтобы указать тот же формат.
После того как приложение использовало GetMixFormat или IsFormatSupported для поиска соответствующего формата для потока общего или монопольного режима, приложение может вызвать метод Initialize для инициализации потока с этим форматом. Приложение, которое пытается инициализировать поток общего режима с форматом, который не идентичен формату смешивания, полученному из метода GetMixFormat, но с таким же количеством каналов и той же скоростью выборки, что и формат смешивания, скорее всего, завершится успешно. Перед вызовом Initializeприложение может вызвать IsFormatSupported, чтобы убедиться, что Initialize примет формат.
Формат смешивания, используемый обработчиком звука для внутренней обработки потоков общего режима, тесно связан с, но не обязательно идентичен формату потока, используемому устройством аудио конечной точки в общем режиме. С помощью панели управления мультимедиа Windows Mmsys.cplпользователь может выбрать формат потока, который будет использоваться устройством аудио конечной точки при работе в общем режиме. Ниже приведены действия.
Чтобы запустить Mmsys.cpl, откройте окно командной строки и введите следующую команду:
mmsys.cplэлемента управления
Кроме того, можно запустить Mmsys.cpl, щелкнув правой кнопкой мыши значок говорящего в области уведомлений, расположенную справа от панели задач, и выбрав устройства воспроизведения или устройства записи.
После открытия окна Mmsys.cpl выберите устройство из списка устройств воспроизведения или списка устройств записи и щелкните Свойства.
Когда откроется окно свойств, щелкните Advancedи выберите формат из списка доступных форматов в поле с меткой формат по умолчанию.
Например, предположим, что пользователь выбирает следующий формат по умолчанию из списка доступных форматов для устройства воспроизведения:
2 канала, 16 бит, 44100 Гц (КАЧЕСТВО CD)
Это формат, который устройство будет использовать при работе в общем режиме. В Windows Vista звуковой модуль будет использовать немного измененную версию этого формата для внутренней обработки потоков общего режима. Звуковой модуль будет использовать формат с одинаковым количеством каналов (два) и той же частотой выборки (44100 Гц), но он преобразует образцы в числа с плавающей запятой перед обработкой. Звуковой механизм преобразует примеры с плавающей запятой в смешивании выходных данных в 16-разрядные целые числа, прежде чем воспроизводить их через устройство.
Приложение может запрашивать свойство PKEY_AudioEngine_DeviceFormat устройства аудио конечной точки, чтобы получить формат общего режима, выбранный пользователем для устройства. Сведения о запросе свойств устройства см. в разделе Свойства устройства.
Некоторые приложения могут найти формат, указанный свойством PKEY_AudioEngine_DeviceFormat устройства, подходящим для открытия потока в монопольном режиме на устройстве. Другие приложения, которые управляют потоками в монопольном режиме, могут иметь дополнительные требования, требующие сложного согласования формата с устройством. Как правило, одно из этих приложений создает список подходящих форматов с предпочитаемыми форматами в начале списка. Затем приложение выполняет итеративный вызов IsFormatSupported с каждым последовательным форматом в списке, начиная с начала списка, пока не найдет формат, поддерживаемый устройством.
Связанные разделы
-
устройствах звуковых конечных точек