9

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

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

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

4

1 回答 1

4

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

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

于 2010-10-19T17:16:02.197 回答