基于ALSA库实现音频采集和播放遇到的问题
2024-10-21 13:43:32
最近基于Linux系统C语言实现音频的采集和播放,建立了两个子线程,一个通过调用snd_pcm_readi来实现采集数据,并存入FIFO中,另一个从FIFO中取数据并通过udp的sendto发送出去,由于不想频繁打开(snd_pcm_open)和关闭(snd_pcm_close)PCM设备,因此在程序启动的时候调用一次snd_pcm_open,在程序结束时调用一次snd_pcm_close。但是此时会出现一个问题,就是当长时间不播音后再去播音就会发生线程阻塞,而在发生阻塞的线程中能够导致阻塞的只有snd_pcm_readi语句,于是在网上找到了类似的说明:ALSA:打开和关闭 PCM On-The-Fly(ALSA: Opening and closing PCM On-The-Fly)答案 - 爱码网 (likecs.com),里面提到了两个函数snd_pcm_drop和snd_pcm_prepare,snd_pcm_prepare这个函数我们用的比较多,而snd_pcm_drop这个函数又找到了它的说明:ALSA子系统(十四)------snd_pcm_drain和snd_pcm_drop_风筝丶的博客-CSDN博客,就是播放结束时清理未播放完的数据,因此修改了我的程序,每当播放开始时调用一下snd_pcm_prepare,结束时调用一下snd_pcm_drop,这样就不会出现线程阻塞的问题了。
最新文章
- odi 12.2.1.1新特性
- [转]WinForms GridListEditor - How to restore values in the auto filter row
- sdut 2445 小学数学
- WPF 颜色转换
- XML的约束(dtd)
- IOS CALayer(二)
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章01
- 自己编写的.sh脚本文件运行完闪退解决方案
- Check if KeyValuePair exists with LINQ's FirstOrDefault
- IAR FOR ARM 各版本,需要的大家可以收藏了
- centos mail使用外部SMTP发送邮件
- 通过maven test 报org.apache.ibatis.binding.BindingException: Invalid bound statement
- Linux V4L2之camera
- VS Code实用技能1 - 代码折叠、面包屑
- 各组对本组——《BBW》软件开发意见的汇总
- IdentityServer4(1)- 特性一览
- error: invalid use of void expression
- 关于各种BUF源语的研究
- hibernate中configuration和配置文件笔记
- Mysql 【影响性能的几个方面】以及【性能优化顺序】