我正在构建一个应用程序来使用 WASAPI 从设备捕获音频,其中使用的所有 API 都支持 Windows Vista 及更高版本的设备。
最初,我使用WASAPI Capture 作为共享计时器驱动模式从设备捕获音频,其中将有一个线程每 0 毫秒从设备捕获音频。它在 Windows Vista 及以上设备中工作的地方。
由于上述方法在 CPU 消耗方面效率不高,并且并非每项都经过优化,因此我尝试使用WASAPI Capture 作为共享事件驱动模式从设备捕获音频,其中仅当数据被系统触发事件时才会捕获音频。可用的。此方法确实完全降低了 CPU 消耗,但在 Windows VISTA 到 Windows Server 2016 设备中不起作用。
Initialization of audio client interface
音频接口使用共享模式初始化,并且给出的流标志用于 AUDCLNT_STREAMFLAGS_EVENTCALLBACK,因为我使用的是事件驱动模式。GetExtensibleMixFormat 方法提供使用 Windows 的 GetMixFormat() 获取的默认混合格式。
int enginelatency = 20;
HRESULT hr = _AudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_LOOPBACK , enginelatency * 10000, 0, (WAVEFORMATEX*)mix_format_wasapicap_ptr->GetExtensibleMixFormat(), NULL);
Run Code Online (Sandbox Code Playgroud)
Initializing the event
其中 _AudioSamplesReadyEvent 是提供给 SetEventHandle 方法的句柄。当音频缓冲区准备好由客户端处理时,系统将触发此事件。
hr = _AudioClient->SetEventHandle(_AudioSamplesReadyEvent);
Run Code Online (Sandbox Code Playgroud)
尽管 Windows VISTA 及以上设备支持所有使用的 API,但无法弄清楚为什么在 …