ALSA: 如何判断声音何时播放完成

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

4

我几天前查看了PCM状态,似乎没有“播放”状态。 - waffleman
再次声明 - 我没有使用过它,所以我不确定,但我认为 可用样本数 - snd_pcm_status_get_avail() 可能会给您一个值,指示是否还有剩余内容可以播放。我建议编写一些简单的测试用例,并查看各个值的行为。 - paulw1128
如何使用snd_pcm_status_get_avail(),目前没有适当的文档。我正在使用snd_pcm_status_get_avail(status),但是它会出现错误pcm.c:6725: snd_pcm_status_get_avail: Assertion `obj' failed. - Parag Jain
1
@ParagJain 我建议你使用:snd_pcm_status_get_delay()。如果播放正在进行,它将给出一个正数,如果播放完成,则为零。希望这可以帮助到你。 - vinaymk
1
@waffleman 可以使用 snd_pcm_state() 函数。如果流正在运行,则它将返回 SND_PCM_STATE_RUNNING 值。 - vinaymk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接