首页 > 解决方案 > 独占模式下的 IAudioClient 初始化问题

问题描述

我正在尝试在 UWP 应用程序中以独占模式使用 WASAPI 访问特定的 USB 音频设备。首先,我正在创建一个WAVEFORMATEXTENSIBLE并检查我的设备是否支持这种格式:

WAVEFORMATEXTENSIBLE wf;

wf.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
wf.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
wf.Format.nChannels = 2;
wf.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;

// PCM 16
wf.Format.wBitsPerSample = 16;
wf.Samples.wValidBitsPerSample = wf.Format.wBitsPerSample;
wf.Format.nBlockAlign = wf.Format.nChannels * (wf.Format.wBitsPerSample / 8);
wf.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;

wf.Format.nSamplesPerSec = 48000;
wf.Format.nAvgBytesPerSec = wf.Format.nSamplesPerSec * wf.Format.nBlockAlign;
hr = IAudioClient_IsFormatSupported(
    pAudioClient,
    AUDCLNT_SHAREMODE_EXCLUSIVE,
    (WAVEFORMATEX*)&wf,
    NULL);

IsFormatSupported返回S_OK。然后,我正在初始化AudioClient这样的:

hr = IAudioClient_Initialize(
    pAudioClient,
    AUDCLNT_SHAREMODE_EXCLUSIVE,
    AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
    bufferDuration,
    bufferDuration,
    (WAVEFORMATEX*) &wf,
    NULL);

问题就在这里:Initialize返回E_INVALIDARG。根据Microsoft 文档,这可能是由一些问题引起的,但在我的情况下,我怀疑这是“参数 pFormat 指向无效的格式描述”,因为我没有使用任何提到的标志,也没有调用SetClientProperty.

我是否正确初始化WAVEFORMAT

标签: cwinapiaudiouwpwasapi

解决方案


推荐阅读