微软核心音频API:从默认端点获取WAVEFORMATEX信息
Microsoft Core Audio API: Getting WAVEFORMATEX info from default endpoint
我正在研究游戏音频引擎和微软核心音频api之间的交互。我试图弄清楚,游戏如何从默认端点获得'WAVEFORMATEX'信息。我看到在游戏开始时,IsFormatSupported() [https://msdn.microsoft.com/en-us/library/windows/desktop/dd370876(v=vs.85).aspx]被调用,使用*pFormat (IsFormatSupported的第二个参数)填充默认端点的格式信息(即通道,bitspersample,采样率等)。我还看到游戏在此之前没有调用GetMixFormat() [https://msdn.microsoft.com/en-us/library/windows/desktop/dd370872(v=vs.85).aspx]。
然而,有一系列与IMMDeviceEnumerator (EnumAudioEndpoints, QuryInterface, AddRef等),IMMDeviceCollection (GetCount, Item)和IMMDevice (QueryInterface, AddRef等)相关的调用。查看这些文档,似乎没有派生"格式"(WAVEFORMATEX)信息的直接方法。虽然,MMDevice::OpenPropertyStore()被调用,随后'GetId()',但我没有看到调用'GetValue()'与'PKEY_AudioEngine_DeviceFormat'参数,它可以提供'格式'信息。因此,我对游戏如何获得"格式"信息感到困惑。上述调用是否可以间接获得"格式"信息?
我正在使用API监视器应用程序[http://www.rohitab.com/downloads]为我的分析与'音频和视频'过滤器启用。
实际上可以从IsFormatSupported
获得混音器格式。
HRESULT IsFormatSupported(
[in] AUDCLNT_SHAREMODE ShareMode,
[in] const WAVEFORMATEX *pFormat,
[out] WAVEFORMATEX **ppClosestMatch //< Audio format suggested by the Windows audio engine
);
IsFormatSupported
用于格式协商,在Windows中,如果音频图形中有一个能够进行转换的音频处理对象,则可以打开与混音器格式不同的音频格式。但是,如果您提供的pFormat
不是混合器格式,并且没有可用的转换,那么Windows将为ppClosestMatch
分配分配的WAVEFORMATEX
与混合器格式填充。下面是我测试过的示例代码,它能够从IsFormatSupported
获得混合器格式(为了简单起见,没有错误处理):
CComPtr<IMMDeviceEnumerator> pEnum;
pEnum.CoCreateInstance(__uuidof(MMDeviceEnumerator));
CComPtr<IMMDevice> pDevice;
pEnum->GetDefaultAudioEndpoint(eRender, eMultimedia,&pDevice);
CComPtr<IAudioClient> pAudioClient;
pDevice->Activate( __uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient);
// Provide an empty weveformatex
WAVEFORMATEX wfxEmpty = {};
WAVEFORMATEX *pClosestWfx;
HRESULT hr = pAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, &wfxEmpty, &pClosestWfx);
if (hr == S_FALSE) {
// The audio engine suggest us a format in pClosestWfx
// which is the mixer format because we did not provide a valid input format.
// the current application did not use any windows API to get the mixer format directly
// ...
CoTaskMemFree(pClosestWfx);
}
这是获得混合器格式的另一种方法
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 如何从udp端点获取*my*ip
- Windows音频端点API.正在获取我的音频设备的名称
- 如何在async boost::asio处理程序中获取接收消息的端点
- 微软核心音频API:从默认端点获取WAVEFORMATEX信息