【FAQ】全志R329如何使用audiocodec如何减少snd_pcm_open的耗时
-
问题背景
客户在使用audiocodec进行声音播放时,发现调用snd_pcm_open所用的时间达400多ms,客户希望能减少耗时开发环境
硬件:R328
软件:Tina
内核: Linux-4.9问题分析
客户调用snd_pcm_open时,传入的PCM NAME是使用了dmix插件的,dmix插件的功能是可以让多个应用同时访问音频通道,实现声音同时输出的效果。当不使用任何插件时(-D hw:audiocodec,0),调用snd_pcm_open会马上获取对应的pcm句柄,获取成功后再配置音频通路和寄存器,而当使用dmix插件时,调用snd_pcm_open会先解析插件中的参数,再根据参数配置音频通路和寄存器,通过dapm打开功放和操作DAC寄存器,之后再获取对应的pcm句柄,执行的逻辑更多。
当打开功放和操作DAC寄存器时,为了防止pop音的产生,驱动中加上了160ms + 2*30ms的sleep(乘以2是因为有左右声道),这里的sleep就是耗时产生的地方
解决方案
- 保证没有pop音的前提下,可以在dts中减少pa_msleep的值,这个值是操作功放的使能位后产生的延迟,对应上图的spk_cfg->pa_msleep
- 调整内核printk打印级别
snd_pcm_open,2646,s:0.439500 Used Time:0.439527 ----> 调整前 snd_pcm_open,2646,s:0.258538 Used Time:0.258548 ----> 调整后
- 删去内核不必要的打印或者用ftrace代替,调试发现一条内核打印耗时约4ms,过多的打印会严重影响性能
- 列表保证没有pop音的前提下,可以在驱动程序中直接减少sunxi_codec_playback_event的msleep值,因为这个sleep是为了避免操作DAC后出现尖刺导致的pop音,因此此方式应为最低优先级
-
-
-
-
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号