记一次Android音频问题的解决--外挂音频codec与内部av音频输出的冲突

问题背景

由于中小型企业机顶盒市场的消亡,各个企业不得不另寻出路,寻找更好的产品,这里只举由其变形出来的一款新产品,Android系统soundbar,姑且土里土气地称之为智能电视音箱吧。由于涉及到音频部分的修改,着实也算是一项相当程度上专业的产品。针对音频部分的调试,问题的兼容,音效等等的要求也是在一定程度上考验一个企业的资源实力和应变实力。好了,再说下去话题就会有点跑偏了。

问题的产生

项目使用的是全志平台H系列型号板子,应客户需求需要I2S信号输出给其功放板音频输出。当时调试发现主板无法使用主模式,只能作为从模式跟全志平台自家音频IC,ac100的方式一样。打入ac100补丁后发现可以使用,因此直接用上这个补丁(曾经出现过语音助手无法识别的问题,后已被解决),这里便出现了模拟音频输出(AV输出)无声音的问题。

原因查找

a.对于一个全能的Android工程师,咳咳咳嗯,有时候打字也是能被噎到的。。。简单强调的意思是,全局的思想和查找问题有法有度对于系统问题的定位是很重要的。
因此第一步当然从原理图上查,发现现在主板上使用的AV通道是用的主控内部的声卡接口,而标准外挂的ac100板子(因为本次项目无ac100,因此对比了另外项目的原理图)是使用的ac100 Codec的AV接口。
这里写图片描述

由此进一步思路,猜想缺少了内部codex驱动的加载,查看内部codec的驱动是否没有加载,经查,确实如此。

由于移植ac100驱动的时候切换了编译指向,在目录lichee\linux-3.4\arch\arm\configs中由sun8iw7p1smp_android_defconfig切至sun8iw7p1smp_android_karaok_defconfig,有几个驱动没有被加载,其中注释的一个是因为代码后期被我移植到ac100驱动里面(此处主要是节点),编译进去之后,av声音有了!
这里写图片描述

至此,解决了关键的问题,接av线无声音的问题。嗯,事实证明脚踏实地,一步一步的检查问题的思路还是正确的,催眠一下自己,给自己一点前进的鼓励和希望。因为,接下来问题还没完。。。

b.此时虽然av输出声音有了,但是问题是ac100处hdmi声音无输出,如果是做过box或者是电视相关的产品的朋友们应该比较熟悉,这里的验证操作,无非就是进入设置,将声音部分的音频支持设备勾选,列表一般会有:CODEC,HDMI,SPDIF,这里先不谈及SPDIF。
这里情况就是,先前是切换电视机HDMI时候有声音,且av显示模式的时候无声音,现在av通道有声音之后,两者打开,却是切av有声音,切HDMI时无声音,这就很奇怪了,明明HDMI部分没有修改,其实这里的HDMI的声音输出,用的正是ac100这块IC的通信驱动,因此这里猜想是两者有什么冲突。

原因的继续查找

发现是由于av模拟输出和ac100是两个声卡设备,并且系统里面共用了一个节点(要么使用ac100,要么使用内部codec,个人猜想可能是全志当时设计的时候没打算让客户同时使用这两个声卡)

这里写图片描述

最终原因是在上图看出。

问题的最终解决

由于客户需求是要模拟通道声音av输出和HDMI声音(使用的ac100驱动的修改)同时出来,所以免去人为勾选,直接给默认勾选。题外话,这里也查找了上层的设置,但是Settings中的勾选是从数据库Settings.db中去读取,了解上层的人都知道这是在SettingsProvider中的default.xml可以配置,但是还必须有底层功能的支持才能有这样的节点配置项,因此还是老老实实将底层的通路打通吧。

解决的过程
在驱动中将内部codec的节点移至ac100驱动代码里面(当然,但从节点移植这个看,不移应该也没问题,只是没有验证),然后再同时注册两个声卡节点(以下是驱动代码修改补丁)

diff --git a/linux-3.4/arch/arm/configs/sun8iw7p1smp_android_karaok_defconfig b/linux-3.4/arch/arm/configs/sun8iw7p1smp_android_karaok_defconfig
index 9008005..5cb65a5 100755
--- a/linux-3.4/arch/arm/configs/sun8iw7p1smp_android_karaok_defconfig
+++ b/linux-3.4/arch/arm/configs/sun8iw7p1smp_android_karaok_defconfig
@@ -2194,9 +2194,9 @@ CONFIG_SND_USB_AUDIO=m
 # CONFIG_SND_USB_6FIRE is not set
 CONFIG_SND_SOC=y
 CONFIG_SND_SOC_DMAENGINE_PCM=y
-# CONFIG_SND_SUNXI_SOC_AUDIOCODEC is not set
-# CONFIG_SND_SUNXI_SOC_PUBLUC_MACHINE is not set
-# CONFIG_SND_SUN8IW7_SNDCODEC is not set
+CONFIG_SND_SUNXI_SOC_AUDIOCODEC=y
+#CONFIG_SND_SUNXI_SOC_PUBLUC_MACHINE=y
+CONFIG_SND_SUN8IW7_SNDCODEC=y
 CONFIG_SND_SUNXI_SOC_DAUDIO0_INTERFACE=y
 CONFIG_SND_SUNXI_SOC_DAUDIO0_KARAOKE_MACHINE=y
 CONFIG_SND_VIRBB_DAI=y
diff --git a/linux-3.4/sound/soc/sunxi/daudio0/h3_ac100.c b/linux-3.4/sound/soc/sunxi/daudio0/h3_ac100.c
index 2dd220b..e029662 100755
--- a/linux-3.4/sound/soc/sunxi/daudio0/h3_ac100.c
+++ b/linux-3.4/sound/soc/sunxi/daudio0/h3_ac100.c
@@ -41,6 +41,<
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值