我正在尝试使用 WASAPI 打开带有输出设备的独占流。我在选择可接受的格式时遇到了困难,因为似乎没有关于给定设备接受哪些格式的提示。
就我而言,IAudioClient::GetMixFormat()
,否则会返回设备的一种默认格式,返回一种不能在独占模式下使用的格式(IAudioClient::IsFormatSupported()
回报AUDCLNT_E_UNSUPPORTED_FORMAT
)。我不知道从那里该去哪里。波形格式参数的组合数量多得荒唐——我真的必须遍历每一个参数直到某些参数起作用吗?
嗯,我询问了 MSDN 论坛,他们给出了一个很好的答案。
您需要通过以下方式检查设备的默认设备格式IMMDevice::OpenPropertyStore()
,随后IPropertyStore::GetValue()
, not IAudioClient::GetMixFormat()
。以下是检索可接受的 WAVEFORMATEX 结构的代码:
//CoInitialize/Enumerate devices
IPropertyStore* store = nullptr;
hr = device->OpenPropertyStore(STGM_READ, &store);
if (FAILED(hr)) {
ExitProcess(1);
}
PROPVARIANT prop;
hr = store->GetValue(PKEY_AudioEngine_DeviceFormat, &prop);
if (FAILED(hr)) {
ExitProcess(2);
}
hr = device->Activate (
__uuidof(IAudioClient),
CLSCTX_ALL,
NULL,
(void**)&audioClient
);
device->Release();
device = nullptr;
if (FAILED(hr)) {
ExitProcess(3);
}
hr = audioClient->IsFormatSupported (
AUDCLNT_SHAREMODE_EXCLUSIVE,
(PWAVEFORMATEX)prop.blob.pBlobData,
NULL
);
if (FAILED(hr)) {
ExitProcess(4);
}
hr的最终值为S_OK。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)