【问题标题】:WASAPI: Choosing a wave format for exclusive outputWASAPI:为独占输出选择波形格式
【发布时间】:2016-03-11 18:15:00
【问题描述】:

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

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

【问题讨论】:

    标签: c++ audio wasapi


    【解决方案1】:

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

    【讨论】:

    • 这通常有效,但请记住它可能仍然会失败。我实际上已经看到它在运行 Windows 7 的虚拟机上失败(即设备不支持设备格式 =))。恕我直言,确定格式的唯一真正可靠的方法是继续调用 IsFormatSupported 直到找到您喜欢的内容。
    猜你喜欢
    • 2012-04-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多