我正在尝试使用WASAPI在单线程应用程序中呈现音频,主循环如下所示:
(我在这里使用 frame 来指代循环的迭代,而不是音频帧。)
while (!quitting)
{
AudioClips* audioClipsToPlay = AppLogic();
RenderGraphics();
// Calls WASAPI IAudioRenderClient::GetBuffer and ReleaseBuffer, render
// buffer size being initialized with N*TargetFrameDuration size.
// N is the amount of frames between the App wanting to play the clip,
// until it is played (latency).
OutputAudio(audioClipsToPlay);
SynchronizeToFrameDuration(TargetFrameDuration);
}
audioClipsToPlay
是应用程序想要播放的音频剪辑的集合(带有时钟和数据,例如预期会重复播放)。
只要帧速率比N*TargetFrameDuration
快,该系统就可以正常工作,但有时并非如此。解决此问题的一种明显方法是增加N
,但这样做可能会将延迟增加到不需要的水平。
是否可以重写/重置已写入渲染缓冲区的部分数据?