首页 > 解决方案 > 刷新源缓冲区后如何重置 IXAudio2SourceVoice 的“SamplesPlayed”计数器?

问题描述

IXAudio2SourceVoice有一个GetState返回XAUDIO2_VOICE_STATE结构的函数。该结构有一个SamplesPlayed成员,即:

此语音自上次启动或自上次音频流结束以来​​处理的样本总数(用 XAUDIO2_END_OF_STREAM 标志标记)。

我希望能够停止源语音,刷新其所有缓冲区,然后将SamplesPlayed计数器重置为零。既不会调用StopFlushSourceBuffers不会自行重置SamplesPlayed。虽然标记最后一个缓冲区XAUDIO2_END_OF_STREAM 确实正确重置SamplesPlayed为零,但这似乎只有在最后一个缓冲区播放完成时才有效;如果缓冲区被刷新,则SamplesPlayed不会重置。我也尝试过Discontinuity在停止/冲洗之前和之后都没有效果。

我目前的解决方法是,在停止并刷新源语音之后,提交一个带有XAUDIO2_END_OF_STREAM标志集的微小 1-sample 无声缓冲区,然后让源语音播放以处理该缓冲区,从而重置SamplesPlayed为零。这对我的用例来说效果很好,但看起来很笨拙/笨拙。有更好的解决方案吗?

标签: xaudio2

解决方案


查看 XAudio2 源代码,除了让数据包使用XAUDIO2_END_OF_STREAM.

调用Discontinuity在当前正在播放的缓冲区上设置流结束标志,或者如果没有播放和排队的缓冲区,则将其设置在那里。您需要打电话Discontinuity,然后让语音播放完成,然后再回收。


推荐阅读