ALSA的一个bug

背景:

  项目上用aplay播放提示语音,当循环播放一段时间(大概2-3小时,有时候时间短一点,有时候时间长一点),就再也播放不出声音

  要说明下:硬件是ARM9嵌入式系统,核心板是M287,内核是2.6.5

现象:

  播放不出声音之后,重启程序,仍然播放不出声音。

  播放不出声音之后,关闭程序,单独用命令aplay 播放,仍然播放不出声音。

  播放不出声音之后,只有reboot之后,才能恢复正常。

  使用不同版本的aplay,问题依旧,排除不同版本差异导致问题

  换过不同核心板,问题依旧,排除单板问题。

  播放不出声音之后,发现函数已经调用aplay,但aplay未能结束运行,也没有任何错误提示,导致一直卡在那里

       对比播放正常与异常时候的内存、CPU占有率,都相差不大,排除内存泄漏导致的问题

  仍然做了其他对比试验:在虚拟机Ubuntu下,是不存在这样的问题。

问题:aplay难道有bug?这个问题也不好解决,除非花精力去研究aplay的源码

解决办法:

  不用通过aplay,而是自己写一段代码调用asound的库(ALSA)里的函数

  代码就不贴了,原理上是自己建立一个缓冲,将语音文件里的语音部分数据放到缓冲里,然后依次利用

       snd_pcm_writei 写入到音频设备,就可以完成播放

  缓冲里的数据写完了,也就播放结束。

猜测 aplay也是这样调用的吧。

  结果,这样操作,连续播放超过24小时也是正常的。

结论:

  当连续播放的时候,使用ALSA的库函数直接播放(就是要麻烦自己写一个播放模块)是比较好的。

  aplay不适合连续播放或长时间重复操作(可能其他系统会不一样),至少在嵌入式系统下是不合适的

  

还有,一个问题,是否aplay方式(代码里 利用 system 调用aplay方式)在linux内核2.6下面是存在这样的问题?还是其他版本内核或其他核心板(例如A9)下是否也存在类似问题?

  以后,有机会可以在其他板子试试

  

猜你喜欢

转载自www.cnblogs.com/winafa/p/12717616.html