Устройства и типы данных
[Функция, связанная с этой страницей, Audiowaveform, является устаревшей функцией. Он был заменен WASAPI и звуковых графов. WASAPI и Звуковые графы оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код WASAPI и звуковых графов вместо аудиоформата. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
В этом разделе описывается работа с устройствами волнового звука и сведения о том, как открывать, закрывать и запрашивать их возможности. В нем также описывается, как отслеживать устройства в системе с помощью дескрипторов и идентификаторов устройств.
Открытие устройств вывода Waveform-Audio
Используйте функцию waveOutOpen, чтобы открыть выходное устройство волнового звука для воспроизведения. Эта функция открывает устройство, связанное с указанным идентификатором устройства, и возвращает дескриптор открытого устройства, записывая дескриптор указанного расположения памяти.
Некоторые мультимедийные компьютеры имеют несколько устройств вывода звука в формате волны. Если вы не хотите открывать определенное устройство вывода звука в системе, при открытии устройства следует использовать флаг WAVE_MAPPER для идентификатора устройства. Функция waveOutOpen выбирает устройство в системе, которое лучше всего может воспроизводить указанный формат данных.
Запрос аудиоустройств
Windows предоставляет следующие функции, чтобы определить, сколько устройств определенного типа доступно в системе.
Функция | Описание |
---|---|
auxGetNumDevs | Извлекает количество вспомогательных выходных устройств, присутствующих в системе. |
waveInGetNumDevs | Извлекает количество устройств ввода в формате волны, присутствующих в системе. |
waveOutGetNumDevs | Извлекает количество устройств вывода волны-аудио, присутствующих в системе. |
Звуковые устройства определяются идентификатором устройства. Идентификатор устройства определяется неявно из числа устройств, присутствующих в системе. Идентификаторы устройств варьируются от нуля до одного меньше, чем количество устройств, присутствующих. Например, если в системе есть два устройства вывода волнового звука, допустимые идентификаторы устройств — 0 и 1.
После определения количества устройств определенного типа в системе можно использовать одну из следующих функций для запроса возможностей каждого устройства.
Функция | Описание |
---|---|
auxGetDevCaps | Извлекает возможности указанного вспомогательного выходного устройства. |
волнаInGetDevCaps | Извлекает возможности указанного устройства ввода волны-аудио. |
waveOutGetDevCaps | Извлекает возможности указанного устройства вывода волны-аудио. |
Каждая из этих функций заполняет структуру сведениями о возможностях указанного устройства. В следующей таблице перечислены структуры, соответствующие каждой из этих функций.
Функция | Структура |
---|---|
auxGetDevCaps | AUXCAPS |
волнаInGetDevCaps | WAVEINCAPS |
waveOutGetDevCaps | WAVEOUTCAPS |
Стандартные форматы перечислены в dwFormats член структуры WAVEOUTCAPS. Устройства waveform-audio могут поддерживать нестандартные форматы. Чтобы определить, поддерживается ли определенный формат (стандартный или нестандартный) устройством, можно вызвать функцию waveOutOpen с флагом WAVE_FORMAT_QUERY. Этот флаг не открывает устройство. Формат, заданный в структуре WAVEFORMATEX, на который указывает параметр pwfx, переданный waveOutOpen.
Устройства вывода waveform-audio зависят от возможностей, которые они поддерживают. Элемент dwSupport структуры WAVEOUTCAPS указывает, поддерживает ли устройство такие возможности, как изменения тома и шага.
Дескрипторы устройств и идентификаторы устройств
Каждая функция, открывающая звуковое устройство, указывает идентификатор устройства, указатель на расположение памяти и некоторые параметры, уникальные для каждого типа устройства. Расположение памяти заполняется дескриптором устройства. Используйте этот дескриптор устройства для идентификации открытого звукового устройства при вызове других звуковых функций.
Разница между идентификаторами и дескрипторами для звуковых устройств является тонкой, но важной:
- Идентификаторы устройств определяются неявно из числа устройств, присутствующих в системе. Это число получается с помощью auxGetNumDevs, waveInGetNumDevsили функции waveOutGetNumDevs.
- Маркеры устройств возвращаются при открытии драйверов устройств с помощью функции waveInOpen или waveOutOpen.
Нет функций, которые открывают или закрывают вспомогательные звуковые устройства. Вспомогательные звуковые устройства не должны быть открыты и закрыты, такие как звуковые устройства волны, так как с ними не связан непрерывный перенос данных. Все вспомогательные звуковые функции используют идентификаторы устройств для идентификации устройств.
Типы выходных данных Waveform-Audio
Следующие типы данных определяются для функций выходных данных waveform-audio.
Тип | Описание |
---|---|
HWAVEOUT | Обработка открытого устройства вывода волнового звука. |
WAVEFORMATEX | Структура, указывающая форматы данных, поддерживаемые определенным устройством ввода волны-аудио. Эта структура также используется для устройств ввода волны-аудио. |
WAVEHDR | Структура, используемая в качестве заголовка для блока входных данных waveform-audio. Эта структура также используется для устройств ввода в формате waveform-audio. |
WAVEOUTCAPS | Структура, используемая для запроса возможностей конкретного устройства вывода волнового звука. |
Указание форматов данных Waveform-Audio
При вызове функции waveOutOpen для открытия драйвера устройства для воспроизведения или запроса о том, поддерживает ли драйвер определенный формат данных, используйте параметр pwfx, чтобы указать указатель на структуру WAVEFORMATEX, содержащую запрошенный формат данных волнового звука. WAVEFORMATEX заменяет структурыWAVEFORMAT и PCMWAVEFORMAT.
Для звуковых данных, разделенных на более чем двух каналов, или имеет размер образца, который не равен 8, следует использовать WAVEFORMATEXTENSIBLE. Эта структура просто настраивает дополнительные байты, на которые указывает cbSize член WAVEFORMATEX, чтобы предоставить дополнительные сведения о формате. WAVEFORMATEXTENSIBLE можно привести как WAVEFORMATEX.
Существует также два формата буфера обмена, которые можно использовать для представления звуковых данных: CF_WAVE и CF_RIFF. Используйте формат CF_WAVE для представления данных в одном из стандартных форматов, таких как 11 кГц или 22 кГц PCM. Используйте формат CF_RIFF для представления более сложных форматов данных, которые не могут быть представлены как стандартные звуковые файлы волны.
Запись данных Waveform-Audio
После успешного открытия драйвера вывода аудиоформата можно начать воспроизведение звука. Windows предоставляет функцию waveOutWrite для отправки блоков данных на устройства вывода волнового звука.
Используйте структуруWAVEHDR, чтобы указать блок данных waveform-audio, который вы отправляете с помощью waveOutWrite. Эта структура содержит указатель на блок заблокированных данных, длину блока данных и некоторые флаги. Этот блок данных необходимо подготовить, прежде чем использовать его; Сведения о подготовке блока данных см. в разделе блоки звуковых данных.
После отправки блока данных на выходное устройство с помощью waveOutWriteнеобходимо ждать, пока драйвер устройства завершит работу с блоком данных, прежде чем освободить его. При отправке нескольких блоков данных необходимо отслеживать завершение блоков данных, чтобы узнать, когда отправлять дополнительные блоки. Дополнительные сведения о блоках данных см. в блоках звуковых данных.
Формат данных Waveform-Audio PCM
Элемент lpData элемента структуры WAVEHDR указывает на примеры данных волнового звука. Для 8-разрядных данных PCM каждый пример представлен одним байтом без знака данных. Для 16-разрядных данных PCM каждый пример представлен 16-разрядным значением подписи. В следующей таблице приведены максимальные, минимальные и средние значения для данных волны PCM.
Формат данных | Максимальное значение | Минимальное значение | Среднее значение |
---|---|---|---|
8-разрядная PCM | 255 (0xFF) | 0 | 128 (0x80) |
16-разрядная PCM | 32 767 (0x7FFF) | –32 768 (0x8000) | 0 |
Упаковка данных PCM
Порядок байтов данных зависит от 8-разрядных и 16-разрядных форматов и между моно-и стереоформатами. В следующем списке описана упаковка данных для различных форматов данных волны PCM.
Формат волны PCM | Описание |
---|---|
8-разрядная моно | Каждый пример — 1 байт, соответствующий одному звуковому каналу. За примером 1 следует примеры 2, 3, 4 и т. д. |
8-разрядная стерео | Каждый пример составляет 2 байта. За примером 1 следует примеры 2, 3, 4 и т. д. Для каждого примера первый байт — канал 0 (левый канал), а второй байт — канал 1 (правый канал). |
16-разрядная моно | Каждый пример составляет 2 байта. За примером 1 следует примеры 2, 3, 4 и т. д. Для каждого примера первый байт — это байт низкого порядка канала 0, а второй байт — байт высокого порядка канала 0. |
16-разрядная стерео | Каждый пример составляет 4 байта. За примером 1 следует примеры 2, 3, 4 и т. д. Для каждого примера первый байт — это байт низкого порядка канала 0 (левый канал); второй байт — это байт верхнего порядка канала 0; третий байт — это байт низкого порядка канала 1 (правый канал); и четвертый байт — это байт высокого порядка канала 1. |
Другие | Каждый пример содержится в блоке с несколькими 4 байтами, но примеры могут быть неровными. Расположение каналов определяется маской. Дополнительные сведения см. в WAVEFORMATEXTENSIBLE. |
Закрытие устройств вывода Waveform-Audio
После завершения воспроизведения звуковых сигналов вызовите waveOutClose, чтобы закрыть выходное устройство. Если waveOutClose вызывается во время воспроизведения звукового файла волны, операция закрытия завершается сбоем, а функция возвращает код ошибки, указывающий, что устройство не было закрыто. Если вы не хотите ждать завершения воспроизведения перед закрытием устройства, вызовите функцию waveOutReset перед закрытием. Это завершает воспроизведение и позволяет устройству быть закрытым. Не забудьте использовать функцию waveOutUnprepareHeader для очистки подготовки всех блоков данных перед закрытием устройства.