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

Posted

技术标签:

【中文标题】ALSA:如何判断声音何时播放完毕【英文标题】:ALSA: How to tell when a sound is finished playing 【发布时间】:2011-04-25 14:02:30 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

前几天看了PCM状态,好像没有“正在播放”的状态。 再一次 - 没有使用它我不确定,但我认为available count in samples - snd_pcm_status_get_avail() 可能会给你一个值,表明是否还有任何东西可以玩。我建议将一些简单的测试用例放在一起,看看各种值的行为方式。 如何使用 snd_pcm_status_get_avail() ,没有正确的文档我正在使用 snd_pcm_status_get_avail(status) 但它给出了错误 pcm.c:6725: snd_pcm_status_get_avail: Assertion `obj' failed. @ParagJain 我建议你使用:snd_pcm_status_get_delay()。如果正在播放,这会给你一个正数,如果播放完成,这会给你一个零。希望这会有所帮助。 @waffleman snd_pcm_state() 可以使用。如果流当前正在运行,它会给出值 SND_PCM_STATE_RUNNING。

以上是关于ALSA:如何判断声音何时播放完毕的主要内容,如果未能解决你的问题,请参考以下文章

montouch 检测声音何时播放完毕

在 JavaScript 中播放一段声音时如何获取回调?

如何检测声音文件何时完成?

ALSA 需要 MMAP 来在我的游戏中同时播放即时声音吗?

您如何检测声音文件何时完成?

ALSA:循环声音问题