微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

IXAudio2SourceVoice一个 GetState 函数,它返回一个 XAUDIO2_VOICE_STATE 结构。这个结构有一个 SamplesPlayed 成员,它是:

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

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

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

解决方法

查看 XAudio2 源代码,除了让数据包播放 XAUDIO2_END_OF_STREAM 之外,API 中没有其他公开的方法可以做到这一点。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。