我有一个接受声音请求并使用 ALSA 播放它们的 C++ 对象。有处理声音请求的线程。有些声音是周期性的,在 wav 文件内容写入 ALSA 库后重新安排。有什么办法可以知道所有数据都播放完了吗?函数snd_pcm_writei是阻塞写函数,但并不一定代表文件已经播放。
我正在考虑的一个选项是在播放每个声音文件后调用 snd_pcm_drain,然后在播放下一个文件时调用 snd_pcm_prepare。这是一个好的解决方案吗?或者这是低效的?
更新:“排空解决方案”似乎有效,但效率不高。调用需要一段时间才能返回(可能会清理一些资源)并增加程序的延迟。当我连续播放许多小文件时,延迟最明显。每个文件之间可以听到几秒钟的沉默;这是 snd_pcm_drain 正在执行。
最佳答案
可能不正确(我在这方面做的工作很少),但是从这里查看 ALSA 文档:http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html
看起来像snd_pcm_status_t包含状态信息,该信息应指示流当前是否正在处理数据。
关于c++ - ALSA:如何判断声音何时播放完毕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3936420/