我有一个C++对象,它接受声音请求并使用ALSA播放它们。有一个线程处理声音请求。一些声音是周期性的,并在将wav文件内容写入ALSA库后重新安排。我如何知道所有数据都已播放完毕?函数snd_pcm_writei是一个阻塞写函数,但这并不意味着文件已经播放。
我正在考虑的一个选项是在播放每个声音文件后调用snd_pcm_drain,然后在播放下一个文件时调用snd_pcm_prepare。这是一个好的解决方案吗?还是效率低下?
更新: "drain solution"似乎可以工作,但效率不高。调用需要一段时间才能返回(可能清理了一些资源),并向程序添加延迟。当我连续播放许多小文件时,最容易听到延迟。在每个文件之间可以听到几秒钟的静音;这是snd_pcm_drain执行的结果。
我正在考虑的一个选项是在播放每个声音文件后调用snd_pcm_drain,然后在播放下一个文件时调用snd_pcm_prepare。这是一个好的解决方案吗?还是效率低下?
更新: "drain solution"似乎可以工作,但效率不高。调用需要一段时间才能返回(可能清理了一些资源),并向程序添加延迟。当我连续播放许多小文件时,最容易听到延迟。在每个文件之间可以听到几秒钟的静音;这是snd_pcm_drain执行的结果。
可用样本数 - snd_pcm_status_get_avail()
可能会给您一个值,指示是否还有剩余内容可以播放。我建议编写一些简单的测试用例,并查看各个值的行为。 - paulw1128