ALSA:如何判断声音播放完毕的时间

时间:2010-10-14 18:39:39

标签: c++ alsa

我有一个c ++对象接受声音请求并使用ALSA播放它们。有线程处理声音请求。一些声音是周期性的,并在将wav文件内容写入ALSA库后重新安排。有没有办法在发布所有数据时发现?函数snd_pcm_writei是一个阻塞写入函数,但它并不一定意味着该文件已被播放。

我正在考虑的一个选项是在播放每个声音文件后调用snd_pcm_drain,然后在播放下一个文件时调用snd_pcm_prepare。这会是一个很好的解决方案吗?或者效率低下?

更新:“排放解决方案”似乎有效,但效率不高。这些调用需要一段时间才能返回(可能会清理一些资源)并增加程序的延迟。当我连续播放许多小文件时,延迟最佳。每个文件之间可以听到几秒钟的沉默;这是snd_pcm_drain执行。

1 个答案:

答案 0 :(得分:4)

可能不正确(我在这方面做的工作很少),但是从这里查看ALSA文档:http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html

看起来snd_pcm_status_t包含状态信息,可以指示流当前是否正在处理数据。