WASAPI:为独占输出选择波形格式

时间:2014-03-24 17:52:15

标签: c++ audio wasapi

我尝试使用WASAPI打开输出设备的独占流。我在选择可接受的格式时遇到问题,因为似乎没有关于给定设备接受哪种格式的提示。

在我的情况下,IAudioClient::GetMixFormat(),否则将返回设备的一种默认格式,返回一种不能以独占模式使用的格式(IAudioClient::IsFormatSupported()返回{{1 }})。我不知道从哪里去。波形格式参数的组合数量非常多 - 我真的必须迭代它们中的每一个直到有效吗?

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。