我尝试使用WASAPI打开输出设备的独占流。我在选择可接受的格式时遇到问题,因为似乎没有关于给定设备接受哪种格式的提示。
在我的情况下,IAudioClient::GetMixFormat()
,否则将返回设备的一种默认格式,返回一种不能以独占模式使用的格式(IAudioClient::IsFormatSupported()
返回{{1 }})。我不知道从哪里去。波形格式参数的组合数量非常多 - 我真的必须迭代它们中的每一个直到有效吗?
答案 0 :(得分:5)
好吧,我问了MSDN论坛,他们得到了一个很好的答案。
您需要通过IMMDevice::OpenPropertyStore()
检查设备的默认设备格式,然后检查IPropertyStore::GetValue()
,而不是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。