首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在刷新源缓冲区后重置IXAudio2SourceVoice的“SamplesPlayed”计数器?

如何在刷新源缓冲区后重置IXAudio2SourceVoice的“SamplesPlayed”计数器?
EN

Stack Overflow用户
提问于 2021-01-16 21:32:53
回答 1查看 154关注 0票数 0

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重置为零。这对于我的用例来说很好,但它看起来相当笨拙/笨拙。有没有更好的解决办法?

EN

回答 1

Stack Overflow用户

发布于 2021-02-03 02:57:45

从XAudio2源代码来看,除了允许包使用XAUDIO2_END_OF_STREAM之外,在API中没有公开的方法可以做到这一点。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65754955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档