2010-10-14 101 views
7

我有一个C++对象,它接受声音请求并用ALSA播放它们。有线程处理声音请求。有些声音是周期性的,在wav文件内容写入ALSA库之后会重新安排。有什么方法可以查明所有数据何时播放?函数snd_pcm_writei是一个阻塞写入函数,但并不一定意味着该文件已被播放。ALSA:如何判断声音何时播放完毕

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

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

回答

4

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

看起来snd_pcm_status_t认为,应该给你的指示的状态信息流是否正在处理数据。

+0

我前几天看了一下PCM状态,看起来没有“播放”状态。 – waffleman 2010-10-19 18:38:08

+0

再次 - 没有使用它我不确定,但我会认为样本中的可用计数 - snd_pcm_status_get_avail()'可能会给你一个值,表明是否有剩余的东西可以播放。我建议把一些简单的测试用例放在一起,看看不同的值如何表现。 – paulw1128 2010-10-20 11:01:26