我试图使用WASAPI打开一个带有输出设备的独占流。我在选择一种可接受的格式时遇到了困难,因为似乎没有迹象表明给定设备接受了哪些格式。
在我的示例中,IAudioClient::GetMixFormat()
将返回某种默认的设备格式,返回不能在独占模式下使用的格式(IAudioClient::IsFormatSupported()
返回AUDCLNT_E_UNSUPPORTED_FORMAT
)。我不知道从那里往哪里走。有一个可笑的组合的波形格式参数-我真的必须遍历每一个它们,直到有什么工作?
发布于 2014-03-26 23:44:47
嗯,我问了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。
https://stackoverflow.com/questions/22616924
复制相似问题