最近基于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,这样就不会出现线程阻塞的问题了。

最新文章

  1. odi 12.2.1.1新特性
  2. [转]WinForms GridListEditor - How to restore values in the auto filter row
  3. sdut 2445 小学数学
  4. WPF 颜色转换
  5. XML的约束(dtd)
  6. IOS CALayer(二)
  7. 【翻译习作】 Windows Workflow Foundation程序开发-第一章01
  8. 自己编写的.sh脚本文件运行完闪退解决方案
  9. Check if KeyValuePair exists with LINQ's FirstOrDefault
  10. IAR FOR ARM 各版本,需要的大家可以收藏了
  11. centos mail使用外部SMTP发送邮件
  12. 通过maven test 报org.apache.ibatis.binding.BindingException: Invalid bound statement
  13. Linux V4L2之camera
  14. VS Code实用技能1 - 代码折叠、面包屑
  15. 各组对本组——《BBW》软件开发意见的汇总
  16. IdentityServer4(1)- 特性一览
  17. error: invalid use of void expression
  18. 关于各种BUF源语的研究
  19. hibernate中configuration和配置文件笔记
  20. Mysql 【影响性能的几个方面】以及【性能优化顺序】

热门文章

  1. Kubernetes 设置master相关
  2. django的模版
  3. VSCode 修改终端显示字体 字体间隔过大
  4. (已解决)nginx+php 上传文件大小设置。
  5. 题目集7-9总结性Blog
  6. AcWing 791. 高精度加法C++数组实现
  7. 详解搭建ubuntu版hadoop集群
  8. 树莓派3B 查看GPU、CPU温度
  9. wpf 自定义Messagebox时,对话框显示不居中问题
  10. 第一个helloworld程序