我编写了一个小程序,可以捕获设备上的音频,然后将其呈现给另一个。所有这些工作正常,但我想减少延迟。即减小缓冲区大小。
当我使用以下代码初始化设备时:
_pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, 0, 0, 0, _pFormat, nullptr)
我得到970samples的缓冲区,对于44.1kHz流来说大约是22ms。这对我来说很重要。
我已经尝试过IAudioClient3接口来设置较短的音频引擎延迟,但没有成功。
//Get current audio engine period
WAVEFORMATEX *p;
UINT32 pCurrentPeriodInFrames;
_pAudioClient->GetCurrentSharedModeEnginePeriod(&p, &pCurrentPeriodInFrames);
pCurrentPeriodInFrames = 441
//Get audio engine period span
UINT32 default_, fundamental, min, max;
_pAudioClient->GetSharedModeEnginePeriod(_pFormat, &default_, &fundamental, &min, &max);
默认值=基本=最小值=最大值= 441
//Use the min period to init the device
_pAudioClient->InitializeSharedAudioStream(0, min, _pFormat, nullptr);
//Get current buffer size
_pAudioClient->GetBufferSize(&_bufferFrameCount);
_bufferFrameCount = 970
所以我的问题如下:
1)为什么所有引擎周期都相同?最大值和最小值之间应该没有跨度吗?
2)为什么在两种情况下都要求最小的缓冲区时,为什么从Initialize和InitializeSharedAudioStream都获得970的缓冲区大小?