rk平台调试音频(从驱动到apk)

 需要实现的功能:

输入:hdmiin、uvc、mic可以实时切换

输出:耳机和HDMI OUT同时输出声音

这里注意:mic是存在hedset情况,4节耳机,即可输出又可输出同时进行

开发情况:

一、先熟悉大致的Android的音频架构及流程:

1.apk想要录音,播音的接口:常用接口

AudioManager:音频管理器,包括音量管理、AudioFocus管理、音频设备管理、模式管理;

录音:AudioRecord、MediaRecorder;

播放:AudioTrack、MedaiPlayer、SoundPool、ToneGenerator;

编解码:MediaCodec,音视频数据 编解码接口。

2.JNI

与 android.media 关联的 JNI 代码会调用较低级别的原生代码来访问音频硬件。JNI 位于 frameworks/base/core/jni/ 和 frameworks/base/media/jni 中。

3.Native framework 原生框架

原生框架提供相当于 android.media 软件包的原生软件包,它调用 Binder IPC 代理来访问媒体服务器的音频专属服务。 原生框架代码位于 frameworks/av/media/libmedia 中。

原生框架代码位于 frameworks/av/media/libmedia 或frameworks/av/media/libaudioclient中(不同版本,位置有所改变)。

4.Binder IPC

Binder IPC 代理用于促进跨越进程边界的通信。代理位于 frameworks/av/media/libmedia 中,并以字母“I”开头。

5.Audio Server 媒体服务器

Audio系统在Android中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。这个部分作为Android的Audio系统的输入/输出层次,一般负责播放PCM声音输出和从外部获取PCM声音,以及管理声音设备和设置(注意:解码功能不在这里实现,在android系统里音频视频的解码是opencore或stagefright完成的,在解码之后才调用音频系统的接口,创建音频流并播放)。Audio服务在Android N(7.0)之前存在于mediaserver中,Android N开始以audioserver形式存在,这些音频服务是与HAL 实现进行交互的实际代码。媒体服务器位于 frameworks/av/services/audioflinger 和frameworks/av/services/audiopolicy中。

6.Audio服务包含AudioFlinger 和AudioPolicyService:

AudioFlinger:主要负责音频流设备的管理以及音频流数据的处理传输,⾳量计算,重采样、混⾳、⾳效等。

AudioPolicyService:主要负责⾳频策略相关,⾳量调节⽣效,设备选择,⾳频通路选择等。

7.hal层

定义了音频服务会调用且您必须实现才能使音频硬件正常运行的标准接口。音频 HAL 接口位于 hardware/libhardware/include/hardware 中。详情可参阅 audio.h。对于不同的平台可能具体代码路径不一样,这里rk3588Android12平台hal层相关处理代码在 /hardware/rockchip/audio目录

8.内核声卡驱动程序

音频驱动程序用于同您的硬件和 HAL 实现进行交互。可以使用高级 Linux 声音架构 (ALSA)、开放声音系统 (OSS) 或自定义驱动程序(HAL 与驱动程序无关)。

对于驱动具体的详细不在这里说,驱动涉及了codec和i2s或者pdm等的适配,及相关寄存器,snd_control操作

9.开源的调试用例

使用的是 ALSA,建议将 external/tinyalsa 用于驱动程序的用户部分,因为它具有兼容的许可(标准的用户模式库已获得 GPL 许可)。通常sdk里面都自带了tinyalsa相关测试源码,

 

二、介绍里面相关功能的具体是西安及相关修改

1.查看原理图,

1)我们需要驱动es8388这颗芯片做模拟输入和模拟输出使用。

2)hdmiout接口自带音频输出,需要进行配置

3)hdmiin接口,需要配置音频输入(这里涉及到rk自己的驱动)

4)uvc 需要配置相关uac驱动,usb相关驱动内核已有支持

rk3588自带的hdmi in、out,以及usb具体配置不细说了。有文档可以参考文档,这里简单说一下es8388相关处理

 

查看原理图,知道具体使用哪路i2s,adc检测,模拟输出走哪一路,模拟输入走哪一路。因为这里没有做耳机检测,我们需要去掉es8388官方驱动里面相关的中断触发以及extcon状态上报

添加adc接口读取电压值,检测mic插入。因为耳机需要一直保持输出且输入也是固定一个通路,只需要设置extcon状态一直为1即可,然后配置LINE1 通路寄存器使能

相关初始化寄存器配置

 

matchine驱动对于相关拔插检测和exton注册都可以去掉

 

codec相关配置

 

驱动编译成功,正常跑起来如果看到如下,说明声卡已经创建成功1:

 

此时我们可以编译tinyalsa进行测试驱动是否可行。tinyalsa路径: /external

相关使用方法

1.录制:

tinycap  /sdcard/xxx.wav -D X -d 0 -r 48000 (-D是选择声卡,录制的数据保存到xx.wav中,采样率使用48000)

tinyplay  /sdcard/xxx.wav -D X -d 0 -r 48000(播放,其他同理)

tinymix 主要配置驱动相关接口控制,比如音频通道,模拟音量,Tinymix 可以得到音频通路相关的各项配置参数。也可以通过添加参数修改

其中的配置。如下:

 

Tinypcminfo 查看 pcm 通道的相关信息 比如查看声卡0如下:

 

2.音频hal层相关修改

确定声卡注册成功后,开机加载 hal 层音频模块的时候,会根据声卡的名字找到声卡对应的codec 通道配置文件,我们可以通过抓取logcat log 确定声卡对应的通道配置文件。 

具体可以修改如下代码,打开相关log,然后查看log进行相关codec配置以及声卡通路的选择

我的修改如下:

  

 

为了快速调试,我们可以直接编译hal层相关代码,到目录下mm即可。编译完会生成一个audio.primary.rk30board.so,我们用adb直接push到

system/vendor/lib64/hw/目录覆盖掉,重启即可生效。查看log

 

我们可以知道使用哪个config,在config_list.h中定义(Android平台都是此文件名)

 

这个时候我们就需要针对不同的场景配置不同的config,参考tinymix打印,比如配置播音

 

 

相关配置完成后,我们要查看具体选择声卡实现的代码 audio_hw.c 关注这两个接口

 

 

加上打印,进行调试,比如采样率,声卡,type等,比如同时出声需要在这里强制设置。同时打开两个声卡

3.进行策略选择的调试

 Andorid相关测略的选择,具体实现内容复杂,涉及到进程间通信,我们这里直接看影响到选择哪个输入输出设备的地方

文件路径:

frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp

输入策略相关接口

sp<DeviceDescriptor> Engine::getDeviceForInputSource(audio_source_t inputSource) const

我们可以打开debug进行调试,最终我们是uvc hdmi mic切换修改如下:

 

 

最好对于apk也要进行相关设置,主要是通过设置属性,来选择通道。

如下:

 

 

大致就是这些,具体一些没说清楚的可以讨论

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArcMap最短路径分析和网络数据集的构建

打断相交点 1.单击【编辑器】工具条上的编辑工具。 2.选择要在交叉点处进行分割的线要素。 3.单击【高级编辑】工具条上的打断相交线工具。 4.默认或可输入拓扑容差。 5.单击确定。 结果:所选线在相交处分割为多个新要素。“打断”操作还会移除叠置的线段-例如&#xff0…

怎么控制别人的电脑屏幕?

为什么需要控制别人的屏幕&#xff1f; 我们不可避免地会遇到一些情况&#xff0c;比如我们需要为我们的朋友、同事或家人提供有关 IT 相关问题的帮助&#xff0c;如果他们不知道它该怎么处理这些问题该怎么办呢&#xff1f; 这时&#xff0c;我们可能需要用我们的电脑…

测试20K要什么水平?25岁测试工程师成功斩下offer(附面试题)

年少不懂面试经&#xff0c;读懂已是测试人。 大家好&#xff0c;我是一名历经沧桑&#xff0c;看透互联网行业百态的测试从业者&#xff0c;经过数年的勤学苦练&#xff0c;精钻深研究&#xff0c;终于从初出茅庐的职场新手成长为现在的测试老鸟&#xff0c;早已看透了面试官…

三维数据学习笔记:ply数据内容介绍

目录 前言1. 三维数据的组成1.1 点云数据1.2 网格数据 2. ply数据内容2.1 属性2.1.1 文本描述属性2.1.2 数据描述属性2.1.2.1 顶点(vertex)2.1.2.2 面(face)2.1.2.3 相机(camera) 2.2 数据2.2.1 顶点(vertex)2.2.2 面(face)2.2.3 相机(camera) 3. 示例3.1 示例13.2 示例2 前言 …

Java基础(十七)File类与IO流

1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…

JDK17新特性之--JDK9到JDK17 String 新增的新方法

JDK9之后对String底层存储数据结构进行了重大的修改1&#xff0c;同步也增加了许多新的方法&#xff0c;主要有Text Blocks、chars()、codePoints()、describeConstable()、formatted()、indent()、isBlank()、isEmpty()、lines()、repeat()、strip()、stripLeading()、stripIn…

DolphinScheduler 3.1.4详细教程

文章目录 第一章 DolphinScheduler介绍1.1 关于DolphinScheduler1.2 特性1.3 名词解释1.3.1 名词解释1.3.2 模块介绍 第二章 DolphinScheduler系统架构2.1 系统架构图2.2 架构说明该服务包含&#xff1a; 2.3 启动流程活动图2.4 架构设计思想2.4.1 去中心化vs中心化2.4.1.1 中心…

北京地铁:充分发挥数据价值,全面提升业财融合能力

4月19日-4月21日&#xff0c;一年一度的用友BIP技术大会圆满召开。来自行业领先企业的CIO/CDO、生态伙伴、开发者、分析师、媒体等共聚北京用友产业园&#xff0c;了解最新技术发展趋势、探讨行业热点话题。会上&#xff0c;北京地铁运营有限公司&#xff08;以下简称“北京地铁…

使用 ChatGPT 辅助学习——为自己找一个老师

我们每个人都有许多标签&#xff0c;例如高中生、成绩中等、文科&#xff0c;根据这些标签我和其他拥有相同标签的人分配了相同的教程、班级和老师&#xff0c;这可以带来效率上的提升&#xff0c;因为同一份教程、老师就可以服务几十上百人&#xff0c;而无须为每个人定制&…

2023年腾讯云轻量服务器性能评测

腾讯云轻量应用服务器性能评测 轻量应用服务器是腾讯云推出的一款开箱即用的轻量级的云服务器&#xff0c;轻量服务器CPU内存带宽配置更高&#xff0c;价格却又很便宜&#xff0c;很多同学认为是不是轻量应用服务器性能不行呀&#xff0c;轻量服务器和云服务器有什么区别&…

浪潮盒子IPBS9505-多遥控版-S905L/M2芯片-安卓4.4.2-线刷固件包

浪潮盒子IPBS9505-多遥控版-S905L&#xff0f;M2芯片-安卓4.4.2-线刷固件包-内有教程和短接点-当贝纯净桌面。 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&…

因子挖掘框架cs优缺点介绍和使用说明

cs框架的优点和缺点 优点和ts一样,就是速度非常快缺点有好几个:必须使用根据过去一定天数计算因子值,持有一定天数之后再平衡的模式;必须使用连续的数据,如果是期货期权等需要合成连续数据。资金不足的时候不会拒单。cs框架使用方法 设计理念 计算因子由用户进行计算,因…

Springboot +Flowable,任务认领和回退(一)

一.简介 有的时候&#xff0c;一个任务节点会存在多个候选人&#xff0c;例如&#xff1a;张三提交一个任务&#xff0c;这个任务即可以由李四处理&#xff0c;又可以由王五处理&#xff0c;那么针对这种多个任务候选人的情况&#xff0c;该如何处理&#xff1f; 二.绘制流程…

项目管理-数据管理能力DCMM模型

DCMM 数据管理能力成熟度评估模型简介 DCMM&#xff08;Data Management Capability Maturity Assessment Model&#xff0c;数据管理能力成熟度评估模型&#xff09;是我国首个数据管理领域国家标准。该标准将组织对象的数据管理划分为八大能力域&#xff08;数据战略、数据治…

python4delphi之初体验

最近需要做一个excel导入的工具, excel表格是python的强项,于是想delphi结合python实现 delphi环境xe2 python 3.6.6 上图可以看到,真的很爽,我在vscode写python脚本,然后给delphi调用 读取了一个excel文件,打印出了列头。 最爽的是,我在没wps,office环境的机…

( “图“ 之 二分图 ) 785. 判断二分图 ——【Leetcode每日一题】

❓785. 判断二分图 难度&#xff1a;中等 存在一个 无向图 &#xff0c;图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给你一个二维数组 graph &#xff0c;其中 graph[u] 是一个节点数组&#xff0c;由节点 u 的邻接节点组成。形式上&#xff0c;…

MySQL一次大量内存消耗的跟踪

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。文章来源&#xff1a;GreatSQL社区原创 线上使用MySQL8.0.25的数据库&#xff0c;通过监控发现数据库在查询一个视图(80张表的u…

xcode打包导出ipa

xcode打包导出ipa 众所周知&#xff0c;在开发苹果应用时需要使用签名&#xff08;证书&#xff09;才能进行打包安装苹果IPA&#xff0c;作为刚接触ios开发的同学&#xff0c;只是学习ios app开发内测&#xff0c;并没有上架appstore需求&#xff0c;对于苹果开发者账号认证需…

Java基础(十九)反射机制

1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型和运行时类型&#xff0c;而很多时候对象的编译时类型和运行时类型不一致。 Object obj new String(“hello”); obj.getClass() 例如&#xff1a;某些变…

Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)

原论文:EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES 一般本人的习惯是先看论文熟悉它,然后代码去实现它,这样感觉要好点。因为论文讲解的比较全面和一些实验对比还有很多的引用等,另外大家知道好论文基本都是英文,所以对于英文弱点的伙伴们可能需要多花点时间去研读了…
最新文章