背景

  • Platform: RK3399
  • OS: Android7.1.2
  • Kernel: v4.4.103

问题:

当使用MediaPlayer停止本地播放后,如果切换我们自定义的音频通道(线路输入,只有模拟通道,数字通道没有工作),开始正常但隔几秒钟后就会没声音输出

原因分析

Android系统默认播放停止后3秒(默认)会进入Standby模式来降低功耗。
这个主要是通过AudioFlinger控制的,当AudioFlinger检测到没有AudioTrack处于活动状态,且达到standbyTime的延时时间就会进入Standby模式,系统系统会进入待机,关闭所有的输出设备,Standby模式后具体的一些操作可在tinyalsa HAL层standby调用接口里找到

解决

1. 禁止Standby
tinyalsa HAL层有standby调用接口(out->stream.common.standby = out_standby),开始打算直接屏蔽掉,但发现里面有route_pcm_close等其他操作,而且有很多地方有调用,可能会引起系统其他问题,所以就采用了下面的方法
2. 延长Standby的时间
改成一天或者更长,我是通过property来设置的
system.prop文件中添加或者修改属性ro.audio.flinger_standbytime_ms=86400000
也可以通过property_set函数动态修改

参考

  1. https://blog.csdn.net/kris_fei/article/details/70145918