Windows Core Audio Api 在捕获设备上获取所有支持的格式

Posted

技术标签:

【中文标题】Windows Core Audio Api 在捕获设备上获取所有支持的格式【英文标题】:Windows Core Audio Api get all supported formats on capture device 【发布时间】:2016-02-24 14:18:16 【问题描述】:

我想在设备属性 -> 高级 -> DefaultFormat 部分中枚举捕获设备上所有支持的格式。

我想使用 Windows Core Audio Api 来执行此操作,但是我真的找不到合适的接口来读取这些格式。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd370858(v=vs.85).aspx#

知道哪个界面可以为我提供这样的功能吗?

【问题讨论】:

请在这里查看我的问题***.com/q/50396224/307093,它确实回答了这个问题,但以非常不明显的方式 【参考方案1】:

有IMMDeviceEnumerator接口可以帮助你获取指向你需要的IMMDevice的指针(IMMDevice接口代表一个音频端点设备:渲染或捕获):

您可以使用IMMDeviceEnumerator::EnumAudioEndpoints方法获取系统中所有活动的捕获设备,或者 您可以调用IMMDeviceEnumerator::GetDefaultAudioEndpoint 获取指向默认捕获设备的指针。

无论如何,当您拥有指向需要查找支持格式的 IMMDevice 的指针时,您可以使用 IMMDevice::Activate 方法获取指向 IAudioClient 接口的指针。 IAudioClient接口允许您检查设备是否支持音频格式(方法IAudioClient::IsFormatSupported,音频格式由WAVEFORMATEX结构描述)。不幸的是,目前 Core Audio API 中没有返回设备支持格式列表的方法,因此您需要枚举 WAVEFORMATEX 成员结构的可能值并检查设备是否支持每种格式。

但是您可以通过使用 IMMDevice 属性存储 (IMMDevice::OpenPropertyStore) 获取用户在 DefaultFormat 部分中选择的格式,然后检查 PKEY_AudioEngine_DeviceFormat 键(这里是描述:MSDN: PKEY_AudioEngine_DeviceFormat)。

阅读会很有用:

MSDN: Device Formats MSDN: Device Properties MSDN: Audio Endpoint Properties

【讨论】:

关于 IAudioClient::IsFormatSupported 解决方案,您需要提供 AUDCLNT_SHAREMODE_EXCLUSIVE 标志。如果没有这个标志,音频客户端将支持比音频设备支持更多的输入格式。

以上是关于Windows Core Audio Api 在捕获设备上获取所有支持的格式的主要内容,如果未能解决你的问题,请参考以下文章

Windows Core Audio Api 在捕获设备上获取所有支持的格式

windows core audio apis

实现 Core Audio API 事件

iOS 音频系列之一:Core Audio简介

Core Audio (WASAPI) 缓冲区事件计时

iOS:音频单元 vs OpenAL vs Core Audio