文档说明

本文档以SC826(MSM8953平台,Android 7)为例,说明如何修改开机声音从耳机通道输出。

不想看分析过程的,直接看 patch文件 章节。

应用背景

默认代码,在不插入耳机时,声音从SPEAKER输出。 插入耳机,声音则从耳机通道输出。

客户在硬件设计时,用耳机通道+功放作为声音输出的唯一通道。

发现一个问题,在Android开机动画时应该播放的开机声音,无法从耳机通道输出,还是从SPEAKER通道输出。但系统开机完成之后,声音就能从耳机通道输出了。

音频文件

开机声音对应的音频文件所在位置:

系统:

/system/media/boot.wav

源代码:

vendor/qcom/proprietary/qrdplus/Extension/apps/BootAnimation/boot.wav

耳机中断

最初怀疑开机阶段没有检测到耳机,下面是耳机中断处理函数:

kernel/sound/soc/codecs/wcd-mbhc-v2.c -> wcd_mbhc_swch_irq_handler()

增加调试打印

经测试,开机阶段能够触发耳机中断,但是声音仍然从SPEAKER输出。

耳机事件驱动

上层UI或应用层,是通过事件(event)与底层驱动沟通。

可以通过发送事件模拟耳机插入拔出,可以看到界面上耳机图标的变化:

耳机插入:

adb shell

sendevent /dev/input/event5 5 2 1

sendevent /dev/input/event5 0 0 0

耳机拔出

sendevent /dev/input/event5 5 2 0

sendevent /dev/input/event5 0 0 0

也可以事件监控实际的耳机插入拔出动作,见下图:

在播放开机声音之前,耳机插入的事件已经产生,但是仍然从SPEAKER播放。说明上层UI并没有处理该事件。

xml文件

从音频配置的xml文件入手, SC826对应的是:

源码路径:

hardware/qcom/audio/configs/msm8953/mixer_paths_mtp.xml

系统路径:

/system/etc/mixer_paths_mtp.xml

SPEAKER通道输出对应:

耳机通道输出对应:

这里所使用的耳机是headphones,和headset有区别。

尝试把SPEAKER通道强制配成耳机通道:

更新xml文件:

adb root

adb remount

adb push d:\mixer_paths_mtp.xml /system/etc/

重启系统,很不幸,开机声音仍然从SPEAKER通道输出。

Audio-routing

上面尝试了各种方法,开机声音仍然不为所动,坚持不懈的从SPEAKER通道输出。

音频驱动的HAL相关代码路径如下:

hardware/qcom/audio/hal/audio_hw.c

在该文件中增加调试信息,可以确定,播放开机声音时并没有走到这里。 说明HAL层没有初始化。

回过头来,再看看播放开机声音的源码是如何实现的。

播放开机声音的源码路径如下:

frameworks/base/cmds/bootanimation/audioplay.c

调用底层驱动播放音频文件的函数如下:

这里选择了一个pcm device进行音频播放。 这部分代码是照抄tinyplay的实现,相当于tinyplay命令。tinyplay属于alsa驱动的一部分,相关路径如下:

external/tinyalsa/tinyplay.c

audioplay.c只是选择了pcm device,但是并没有配置audio-routing,所以开机声音还是按照默认的routing通道输出。

正常系统起来之后,可以通过以下命令切换routing到耳机通道,并播放开机声音:

adb shell
tinymix 'PRI_MI2S_RX Audio Mixer MultiMedia1' '1'
tinymix 'MI2S_RX Channels' 'Two'
tinymix 'RX1 MIX1 INP1' 'RX1'
tinymix 'RX2 MIX1 INP1' 'RX2'
tinymix 'RX HPH Mode' 'HD2'
tinymix 'COMP0 RX1' '1'
tinymix 'COMP0 RX2' '1'
tinymix 'RDAC2 MUX' 'RX2'
tinymix 'HPHL' 'Switch'
tinymix 'HPHR' 'Switch'tinyplay /system/media/boot.wav

我们只要在audioplay.c里面增加 tinymix的这部分实现即可。

参考 external/tinyalsa/tinymix.c, 增加 fibo_config_path函数,切换audio-routing为耳机通道。

测试方法:

  1. 先source / lunch
  2. 在 frameworks/base/cmds/bootanimation/ 路径下执行: mm
  3. 把编译生成的 out\target\product\msm8953_64\system\bin\bootanimation   拷出来。
  4. adb push d:\bootanimation /system/bin
  5. 重启系统

这样就能听到开机声音从耳机通道输出了。

patch文件

修改路径 frameworks/base/cmds/bootanimation/audioplay.c

https://uploader.shimo.im/f/eOPGL2mvxowRc68B.patch?attname=audioplay.patch&download

参考文档

附一遍CSDN大神文章链接,对理解高通音频架构很有帮助:

https://blog.csdn.net/LoongEmbedded/article/details/80404839

修改Android开机声音从耳机通道输出相关推荐

  1. 修改Android开机画面

    Android系统开机动画包括两部分: 开机显示的 ANDROID 文字: ANDROID发光动画. 这篇文章说的开机动画是第一种,下面开始正文!1. 制作当前屏幕像素的图片(模拟器默认为320*48 ...

  2. 修改android 开机画面

    对于使用安卓手机的人来说,能够自由定制手机的各种界面是每个用户之所以喜欢安卓系统的最根本的缘由,比如手机的开机界面中的bootanimation.zip文件.本文就如何修改开机界面,做一个简单的流程介 ...

  3. 触觉智能分享-修改Android开机动画

    本文适用于我司基于RK PX30开发的系列主板(IDO-SOM3020/IDO-EVB3020)修改开机画面,搭载四核A35处理器,主频高达1.5  GHz,采用 Mali-G31 MP2 GPU,支 ...

  4. android实时声音信号波形_Android输出正弦波音频信号(左右声道对称)-阿里云开发者社区...

    转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 需求:左右声道分别输出不同的音频数据,波形要是一个正弦波,左右声道还要对称! 对硬件不是很了解,说是要通过音波避障. 效果图 之前已经 ...

  5. 计算机怎样设置开机音乐,电脑开机声音听腻了怎么办?一招教你搞定

    Hello,大家好,我是余生.如果今天带来的内容足够精彩,希望各位动手来给小编评论点赞喔!您的每一次评论点赞都会带来好运气喔! 如何修改电脑开机声音?一招教你搞定 对于经常使用电脑的朋友,每次电脑开机 ...

  6. android 开机画面定制

    一. 修改化定制Android4.0系统 Android系统启动时,先加载Linux内核,在Linux的framebuffer驱动里可以定制开机界面,Linux内核启动成功后,挂载根文件系统,启动An ...

  7. Android:Android开机动画

    Android系统的开机画面显示过程分析 三个开机画面修改方式:目录 DIY固件系列教程--实现开机LOGO三屏动画的完全替换 一.第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面 二.第 ...

  8. Android开机logo修改方法

    一体机平台开机logo修改方法 1:修改Kernel中的Logo: 若是要替换Kernel中的开机Logo,只需要把内核目录drivers/video/logo下的logo_android_1024_ ...

  9. android4.0.3 修改启动动画和开机声音

    1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片): 2. Android平台启动初始化,出现"A N D R I O ...

最新文章

  1. 构建之法课后作业第二次作业第一题
  2. hadoop 2.x HA 出现ssh不能解析问题记录。
  3. Python中maketrans和translate方法
  4. Springmvc整合mybatis
  5. 微信卡券 - 微信公众平台 整理笔记
  6. chdir、getcwd、mkdir、rmdir函数
  7. python 购物车程序_购物车程序python
  8. linux5分钟打印一次的脚本,centos7中crontab定时计划任务5分钟一次命令写法
  9. @postconstruct 不执行_一张图:Spring Boot 应用在启动阶段执行代码的几种方式
  10. 【视频流上传播放功能】前后端分离用springboot-vue简单实现视频流上传和播放功能【详细注释版本,包含前后端代码】
  11. linux查看数据库实例名端口号,查看数据库tns配置
  12. Android实战开发--制作圆形头像(简易篇)
  13. wav 文件头 删除_Yate for mac(音频文件标记和管理工具)
  14. 如何正确地卸载Service Worker?
  15. 今日芯声 | 印度 “真香”?苹果三家制造商及三星申请印度智能手机生产计划...
  16. Java 用键盘输入 int型 String型 char型数据 示例:简单计算功能 eclipse
  17. [C语言数据结构]栈
  18. web前端第二周学习
  19. php怎样获取当前时间,php中获取当前时间的函数
  20. 本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。

热门文章

  1. 软件测试工程师如何提高提BUG逼格
  2. gadget usb 增加端点
  3. 台式计算机按电源开关无法开机,台式电脑没法启动,按下开机键电源灯闪一下就什么反应都没...
  4. 轮式机器人初设计随笔
  5. Ubuntu安装MotionPro
  6. SAD与SATD的对比,以及一些相关扩展
  7. 根据文件流判断是否是Android备份文件
  8. android 工业平板 编程,Android工业级平板电脑开发与应用
  9. 叉车轮胎的种类有哪些?
  10. 智慧景区导览系统可以为游客提供哪些服务?