我正在为一个程序开发音频代码,该程序需要能够在各种设备上录制和播放,其中一些是高端设备,具有各种不同的 wav 和 AIFF 格式。我希望能够使用 WASAPI 库,但我遇到了一些重大问题。目前最大的问题是,据我所知,设备只允许播放格式完全匹配的流。
这就是我正在做的 - 我将设备(这里我只是获取默认控制台设备)设置为:
hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pPlaybackDevice);
我通过以下方式激活设备:
hr = pPlaybackDevice->Activate( __uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pTakeAudioClient);
然后我检查混合格式:
hr = pTakeAudioClient->GetMixFormat(&pWaveFormatEx);
但是,如果我在调用 Initialize 时使用不同的格式:
hr = pTakeAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST,hnsRequestedDuration, 0, pAnotherWaveFormatEx,NULL);
我得到一个错误。似乎该文件绝对必须采用 GetMixFormat 返回的格式。如果我调用 IsFormatSupported 来了解我可以提交哪些格式:
hr = pTakeAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, &waveFormatEx, &pAnotherWaveFormatEx);
我明白E_INVALIDARG
了,即使两个结构完全相同。根据 WASAPI 文档,当“Parameter ShareMode is an value than AUDCLNT_SHAREMODE_SHARED
or AUDCLNT_SHAREMODE_EXCLUSIVE
”时返回。我路过AUDCLNT_SHAREMODE_SHARED
。这似乎是文档中的错误。
为了实验,我尝试:
hr = pTakeAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, &waveFormatEx, NULL);
错误返回是0x8889000e
- 我无法找到对该错误的引用。您可以提供的任何帮助都将非常感激,即使它是“使用 MMSystem”。我会从 MMSystem 开始,只是我们需要能够在有多个设备时控制播放设备。