Android车载MCU控制音量和ARM控制音量的区别和优缺点—TEF6686 FM/AM芯片

不要嫌前进的慢,只要一直在前进就好

文章目录

  • 前言
  • 一、系统架构图
    • 1.MCU控制音量的架构图(老方法)
    • 2.ARM控制音量的架构图(新方法)
  • 二、为啥控制音量不是用AudioManager而是执着去直接控制TDA7729?
  • 三、MCU控制音量和ARM控制音量各自的优缺点
    • 1.MCU控制音量
    • 2.ARM控制音量
  • 总结


前言

Android车载系统开发定制晚于Android手机,但是也有10多年的时间,到8.0版本Android专门为车载添加AAOS(CarOS)分支。多年的从业经验也见证了行业的各种技术更新变化,这篇博客讲讲我个人理解的MCU控制音量和ARM控制音量的区别和优缺点。


一、系统架构图

1.MCU控制音量的架构图(老方法)

在这里插入图片描述
芯驰x9系列平台(Android 10)芯片其实是比较新的一个芯片平台,因为我司客户目标是商用车追求低成本,所以没有完全使用芯驰推荐的那套外设芯片。例如芯驰推荐的DSP是AK7738AVQ,我司用的是TDA7729。7729安卓端芯驰没有封装控制接口,我司MCU有控制7729的工作经验,故音量、音效、通道都是MCU端控制的。

音量和音效很好理解,通道没做过老式车载和车载的就很难理解,我尽量简单的把通道讲清楚。

通道:上图可以看到ARM(数字信号)和TEF6686(模拟信号)都是直连TDA7729输出声音信号,7729默认有多路声音通道,ARM默认通道0,TEF6686使用通道1。参照安卓音频交互矩阵,FM/AM和媒体(本地音乐/视频,酷狗,喜马拉雅等)相互属于独占的音频类型。
例如ARM端当前播放酷狗音乐(通道0)这时用户点想播放FM/AM,那么就需要点击Radio图标并切换到通道1才会有无线电台声音,听一会用户又点击了U盘音乐图标这时又需要切换到通道0才会有ARM端媒体声音。

我入行的时候就是用的这套MCU切通道、控制音量、音效的方法,我称之为“老方法”。

2.ARM控制音量的架构图(新方法)

在这里插入图片描述
杰发ATC8257平台(Android 9)也算是比较新的一个平台,平台的优点就是成本低,缺点也有此处不表。
这套方案杰发推荐使用TDA7729,Android端杰发也封装了java控制7729的音量、音效、增益等接口,所以项目启动的时候决定音量的控制放到ARM端。

这就有个TEF6686的音频怎样输出的新问题,杰发给的方案如上图,在ARM创建一个音频节点供6686数字音频输入(对应创建一个录音类型MediaRecorder.AudioSource.FM_CUSTOM),Android端使用AudioRecord + AudioTrack边录边播,我是参照vendor/mediatek/proprietary/packages/apps/FMRadio/这个工程完成的。

这样实现后在ARM端Radio APP跟U盘音乐、酷狗一样的是个媒体类型的APP,使用AudioManager.STREAM_MUSIC音频类型抢音频焦点播放。

从18年AAOS出来后基本都是这种ARM控制系统音量、音效的方法,我称之为“新方法”。

贴一点我当时实现数字FM/AM用的方法:
用命令可以查看pcm设备列表,杰发给的录音节点06,capture/playback 只有PCM设备才有这部分,只有c和p两种。c代表capture,说明这是一个提供录音的设备,p代表palyback,说明这是一个提供播放的设备。
1、查看当前的声卡:cat /proc/asound/cards
2、查看pcm设备列表:cat /proc/asound/pcm
3、查看当前有哪些进程占用了pcm设备节点:lsof |grep pcm
4、查看有哪些音频设备节点:ls /dev/snd/
在这里插入图片描述

Android端通过tinycap命令录制这个节点测试是否可用,tinyplay、tinymix、tinycap的使用可以先看下面这篇博客
如何查看声卡、pcm设备以及tinyplay、tinymix、tinycap的使用
用下面命令录制节点6,可录.pcm或者.wav的音频资源,录好pull出来用电脑或者发到手机微信播放,如果节点正常你可以听到6686里面FM/AM的声音。
控制搜台那些我司目前还是通过串口服务发命令给MCU来控制,后续开发ATC8025平台是打算把控制的部分也迁移到ARM端。

adb root
adb shell tinycap /data/test.pcm -D 0 -d 6 -b 16 -r 48000 -c 2
adb shell tinycap /data/radio.wav -D 0 -d 8 -b 16 -r 48000 -c 2
tinycap /data/radio.wav -D 0 -d 4 -b 16 -r 48000 -c 2
adb pull /data/test.pcm 

-D 哪个声卡的意思, 比如usb声卡, 本机mic …
-d 当前声卡下的哪个设备录音, 一般一个声卡下会有多个设备
-c 录音通道数
-b 采样精度,一般是16bit,但是如果需要标记位就要升高精度,如24bit或32bit
-r 录音采样率
-p period size:每个中断周期需要准备的音频空间大小
-n 有多少组 period size

二、为啥控制音量不是用AudioManager而是执着去直接控制TDA7729?

1.能问出这种问题的小伙伴说明你的水平已经是个小高手,起码也是玩过Android多媒体、音量控制的工程师。我曾经也这么灵魂拷问过我的技术领导,他当时给我一个白眼,说车载就是这么做的,现在想想他还是想有所保留的。我一度反复思索多年不得要领,后面在另一家公司我又又灵魂拷问我的副总,这个副总是硬件出身,他说你不直接控制7729音量指标过不了,虽然你在Android把音量调到0但是音频芯片7729有底噪,到这时我才恍然大悟。

2.再结合Android在8.0的时候给车载开的分叉AAOS里面控制音量是CarAudioManager,CarAudioManager有耐心的小伙伴可以追踪一下代码,它也是直接控制的DSP音频芯片音量,也就是跟我前面讲的两种控制音量的方法一样的控制硬件音量,到这里突然就像打通了任督二脉懂了整个车载音频架构设计的逻辑。

3.AudioManager控制的是软件音量,我们称之为软音量;控制7729音量和AAOS的CarAudioManager控制音量都是控制硬件音量,我们称之为硬音量。

4.Android车载一定控制硬音量,不然底噪太大过不了指标。

三、MCU控制音量和ARM控制音量各自的优缺点

1.MCU控制音量

优点:从我Android软件开发工程师角度来说毫无优点,唯一的优点就是搞出产品能卖钱
缺点:APP需要通过串口服务来控制MCU从而达到控制音量,还需要通知MCU当前ARM的媒体播放状态,比较繁琐,出了问题不能快速debug

2.ARM控制音量

优点:ARM控制音量少了跟MCU交互那一层,代码逻辑更清晰明了,有问题可快速debug快速解决
缺点:无,在车载行业目前来看是无缺点,完美

总结

Android车载音频设计是最复杂、最难做、最重要的一部分,把音频部分做好这个系统基本上大差不差可以说做好了。
小伙伴们如果向往这方面发展可以先从多媒体入手,懂了多媒体模块就能懂:音频流、音频焦点,进而可以学习音量管理、音频矩阵、车载音频配置、音频控制hal、多区音频路由等等。

AAOS音频设计的部分每个版本之间也有变化,具体的可以去开源网站上学习
https://source.android.google.cn/docs/automotive?hl=zh-cn

学海无涯苦作舟!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/380149.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wls2下的centos使用桥接模式连接宿主机网络独立静态ip

前提:wsl2已安装,可正常更新 1.在控制面板中,打开开启或关闭windows功能,将里面的 Hyper-V功能打开,此处涉及重启 2. 按一下win键,输入hy,上面可以看到Hyper-V Manager,点进去 3.选择右边的 Vi…

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言函数 🌹🌹期待您的关注 🌹🌹 ❀数组 📒1. 什么是数组…

npm install报错:npm error ERESOLVE could not resolve

从git上拉取一个新vue项目下来,在npm install时报错:npm error ERESOLVE could not resolve 有网友分析原因是因为依赖冲突导致报错,解决方法如下: # --legacy-peer-deps:安装时忽略所有peerDependencies&#xff0c…

大鲸鱼docker-compose单机容器集群编排工具

目录 一、Docker-compose 概述 二、Docker-compose简介 三、YML文件格式及编写注意事项 1.yml文件是什么 2.yml问价使用注意事项 3.yml文件的基本数据结构 四、Docker-compose 配置 1.Docker-Compose 配置常用字段 2.Docker Compose常用命令 3.使用Docker-compose创建…

win10删除鼠标右键选项

鼠标右键菜单时,发现里面的选项特别多,找一下属性,半天找不到。删除一些不常用的选项,让右键菜单变得干净整洁。 1、按下键盘上的“winR”组合按键,调出“运行”对话框,输入“regedit”命令,点击…

创建鸿蒙手机模拟器(HarmonyOS Emulator)

文 | Promise Sun 一.前提条件: 鸿蒙项目开发需要使用模拟器进行开发测试,但目前想在DevEco Studio开发工具中使用模拟器就必须到华为官网进行报名申请,参加“鸿蒙模拟器(HarmonyOS Emulator)Beta活动申请”。 申请审…

gitlab新建仓库

总贴 每个git网站都有不同的创建项目的方式,现在举例gitlab,其他例如gitee,gitcode,都是差不多的,自行百度 1![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dae875d9048940c0aeb292c07d6a4a62.png)1和2是项…

C# 之工控机数据类型 高低位(大小端)、BitConverter、IsLittleEndian、字节数组转换(高低位)

八种基本数据类型:byte、short、int、long、float、double、boolean、char byte 8位、有符号的以二进制补码表示的整数 min : -128(-2^7) max: 127(2^7-1) default: 0 对应包装类:Byte short 16位、有符号的以二进制补码表示…

spark shell

1.进行shell命令行 spark-shell 2.创建RDD 2.1 读取文件创建RDD 2.1.1读取linux文件系统的文件创建RDD --需要保证每一个worker中都有该文件 val data1 sc.textFile("file:/opt/file/word.txt") 2.1.2读取hdfs文件系统上的文件创建RDD val data2sc.textFile("…

正点原子STM32(基于HAL库)6

目录 TFTLCD&#xff08;MCU 屏&#xff09;实验TFTLCD 简介TFTLCD 简介液晶显示控制器FSMC 简介FSMC 关联寄存器简介 硬件设计程序设计FSMC 和SRAM 的HAL 库驱动程序流程图程序解析 下载验证 LTDC LCD&#xff08;RGB 屏&#xff09;实验RGBLCD<DC 简介RGBLCD 简介LTDC 简介…

Proxyman for Mac v5.6.1 抓包调试工具

Mac分享吧 文章目录 效果一、下载软件二、功能三、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 四、运行测试1、打开软件 安装完成&#xff01;&#xff01;&#xff01; 效果 一…

虚拟机及其Debian(kali)安装

本机电脑为Windows10系统专业版&#xff0c;在此基础上安装VMware和系统&#xff08;Kali&#xff09; 步骤如下 一、安装 VMware Workstation Pro v16.2.4 安装步骤可参照网上博客&#xff0c;该步骤较简单&#xff0c;此处不做讲解。文件中共计两个&#xff0c;其中一个是激活…

.NET C# 配置 Options

.NET C# 配置 Options 使用 options 模式可以带来许多好处&#xff0c;包括清晰的配置管理、类型安全、易于测试和灵活性。但在使用过程中&#xff0c;也需要注意配置复杂性、性能开销和依赖框架等问题。通过合理设计和使用&#xff0c;可以充分发挥 options 模式的优势&#…

【.NET全栈】ASP.NET开发Web应用——计算器

文章目录 一、简单计算器二、复杂计算器 一、简单计算器 新建Web应用项目&#xff0c;窗体页面 窗体设计代码&#xff1a; <% Page Language"C#" AutoEventWireup"true" CodeBehind"Default.aspx.cs" Inherits"AdoDemo.Default"…

JVM:常用工具总结

文章目录 一、jstat工具 一、jstat工具 Jstat工具是JDK自带的一款监控工具&#xff0c;可以提供各种垃圾回收、类加载、编译信息等不同的数据。使用方法为&#xff1a;jstat -gc进程ID每次统计的时间间隔&#xff08;毫秒&#xff09;统计次数。 C代表Capacity容量&#xff0c…

数据库系统概论:事务与并发一致性问题

随着网络应用的普及&#xff0c;数据库并发问题变得越来越重要。数据库并发指的是多个用户或进程同时访问和操作数据库的能力。它是数据库系统性能优化的重要方面&#xff0c;旨在提高系统的吞吐量和响应时间&#xff0c;以满足多用户同时访问数据库的需求。然而&#xff0c;这…

使用viso画流程图做PPT

参考链接&#xff1a;Visio如何快速制作流程图_哔哩哔哩_bilibili 调出框图&#xff1a; 将需要的图形拖过来 小四的话&#xff0c;是12pt 连接框图 改变线的连接类型 添加箭头 选中所有需要添加箭头的图片&#xff0c;然后选择不同样式的箭头&#xff0c;查看号他们的朝向…

测试用例的设计方法

等价类 等价类概念&#xff1a;在所有测试的数据中&#xff0c;具有某种共同特征的数据子集 边界值 边界值分析是对程序输入或输出的边界值进行测试的一种黑盒测试方法 边界值是作为等价类的补充&#xff0c;其主要区别是&#xff1a; 边界值测试设计不是从某一个等价类中…

jenkins 插件版本冲突

一、Jenkins安装git parameter 插件重启后报错与临时解决方案 cd /root/.jenkins cp config.xml config.xml.bak vim config.xml <authorizationStrategy class"hudson.security.FullControlOnceLoggedInAuthorizationStrategy"><denyAnonymousReadAcces…

邮件安全篇:邮件传输加密(SSL/TLS or STATRTTLS)

1. 前言 使用过邮件客户端的同学一定见过下面这张图。这是客户端账号配置界面&#xff0c;里面有SSL、STARTTLS选项。刚接触邮件客户端的同学肯定会有这些疑问&#xff1a;什么是SSL&#xff1f;什么是STARTTLS&#xff1f;两者有什么区别&#xff1f;具体该如何选择呢&#x…