IXAudio2SourceVoice有一个GetState函数,它返回XAUDIO2_VOICE_STATE结构。此结构有一个SamplesPlayed成员,即:
自上次启动以来或自上一次音频流结束以来该语音处理的示例总数(标记为XAUDIO2_END_OF_STREAM标志)。
我想要做的是停止源声音,冲洗它的所有缓冲区,然后将SamplesPlayed计数器重置为零。无论是调用Stop还是FlushSourceBuffers,都不会自行重置SamplesPlayed。虽然用XAUDIO2_END_OF_STREAM标记最后一个缓冲区可以正确地将SamplesPlayed重新设置为零,但这似乎只有在最后一个缓冲区被播放完成时才能工作;如果缓冲区被刷新,则SamplesPlayed不会被重置。我还尝试在停止/冲洗之前和之后调用Discontinuity,但没有任何效果。
我目前的解决办法是,在停止并刷新源语音之后,提交一个设置了XAUDIO2_END_OF_STREAM标志的小型1样本无声缓冲区,然后让源语音播放以处理该缓冲区,从而将SamplesPlayed重置为零。这对于我的用例来说很好,但它看起来相当笨拙/笨拙。有没有更好的解决办法?
发布于 2021-02-03 02:57:45
从XAudio2源代码来看,除了允许包使用XAUDIO2_END_OF_STREAM之外,在API中没有公开的方法可以做到这一点。
调用Discontinuity会在当前播放的缓冲区上设置流结束标志,或者如果没有播放和队列缓冲区,则将其设置在那里。您需要调用Discontinuity,然后让声音播放到完成,然后再回收它。
https://stackoverflow.com/questions/65754955
复制相似问题