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

标签 c++ alsa

我有一个接受声音请求并使用 ALSA 播放它们的 C++ 对象。有处理声音请求的线程。有些声音是周期性的,在 wav 文件内容写入 ALSA 库后重新安排。有什么办法可以知道所有数据都播放完了吗?函数snd_pcm_writei是阻塞写函数,但并不一定代表文件已经播放。

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

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

最佳答案

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

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

关于c++ - ALSA:如何判断声音何时播放完毕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3936420/

相关文章:

c++ - Qt C++ - 如何保护文件

Alsa 全双工通信

C : problem with audio gain 中的音频录制和播放

c++ - 这个模板解析冲突叫什么?

c++ - SFML 链接器错误 : unresolved external symbol _WinMain@16, Visual Studio 2012

c++ - 将某些字符和结构写入文件并读回时,fread 和 fwrite 出现问题

c++ - 没有匹配的调用函数

android - 在 Android 自定义 ROM 中修改通话中的语音播放

audio - ALSA中rate的含义

c++ - 在 C++ 中使用 ALSA 捕获默认音频流