我正在为一个程序开发音频代码,该程序需要能够在各种设备(其中一些是高端设备)上使用各种不同的wav和AIFF格式进行记录和回放。我希望能够使用WASAPI库,但是遇到了一些主要问题。据我所知,目前最大的问题是,仅允许设备播放格式完全匹配的流。

这是我正在做的事情-使用以下方法设置设备(这里我只是获得默认的控制台设备):

hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pPlaybackDevice);

我通过以下方式激活设备:
hr = pPlaybackDevice->Activate( __uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pTakeAudioClient);

然后我用以下命令检查混合格式:
hr = pTakeAudioClient->GetMixFormat(&pWaveFormatEx);

但是,如果在调用初始化时使用其他格式:
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文档,当“参数ShareMode是AUDCLNT_SHAREMODE_SHAREDAUDCLNT_SHAREMODE_EXCLUSIVE以外的值”时,将返回此值。我正在传递AUDCLNT_SHAREMODE_SHARED。这似乎是文档中的错误。

为了进行实验,当我尝试:
hr = pTakeAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, &waveFormatEx, NULL);

错误返回为0x8889000e-我无法找到对该错误的引用。
我们将非常感谢您提供的任何帮助,即使它是“使用MMSystem”。我将开始使用MMSystem,不同之处在于,当有多个设备时,我们需要能够控制播放设备。

最佳答案

0x8889000e = AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED( HRESULT reading utility),说明了很多原因:该格式不适用于独占模式音频客户端。而且您可能不需要独占,共享模式可能就足够了。无论如何,要通过WASAPI进行记录和回放,您将需要协商一种硬件支持的格式,该格式通常是PCM音频格式之一。

要在格式之间进行转换,您可以使用几种API(ACM,DirectShow,Media Foundation)。诸如DirectShow和Media Foundation之类的某些API既可以将播放的数据自动转换为支持的格式,也可以通过音频设备进行播放。

关于windows - WASAPI问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12994567/

10-09 23:34