3

我正在尝试使用 WASAPI 打开带有输出设备的独占流。我在选择可接受的格式时遇到了麻烦,因为似乎没有任何关于给定设备接受哪些格式的提示。

在我的情况下,IAudioClient::GetMixFormat(),否则将返回设备的一种默认格式,返回不能在独占模式下使用的格式(IAudioClient::IsFormatSupported()返回AUDCLNT_E_UNSUPPORTED_FORMAT)。我不知道从那里去哪里。波形格式参数的组合数量多得离谱——我真的必须遍历它们中的每一个直到某些东西起作用吗?

4

1 回答 1

6

好吧,我问了 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。

于 2014-03-26T23:44:47.270 回答