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

news2024/11/19 5:35:22

 需要实现的功能:

输入: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.coloradmin.cn/o/496044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【24】核心易中期刊推荐——图像处理研究大数据及智能处理研究

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

springboot内嵌tomcat文件上传路径不存在问题原因

错误提示: 临时文件目录被删除,导致文件上传报错,我们使用的是linux系统,10天没有使用,就会被删除 代码: 解决办法: 配置文件中自定义临时文件上传目录 server:port: 9090tomcat:basedir: /crm/tmp 特殊情况: 当我上传小文件的时候可以上传成功,大文件的时候上传失败 猜测可…

利用Linux的corntab定时任务和shell脚本,解决傻妞卡死、发信息没反应、一直卡在即将重启、查询数据异常等问题

利用Linux的corntab定时任务和shell脚本&#xff0c;解决傻妞卡死、数据异常等问题 安装corntab创建shell脚本添加corntab定时任务 原理 定时杀死傻妞进程&#xff0c;并自动重启傻妞 安装corntab Linux crontab是用来定期执行程序的命令。 CentOS安装命令如下 yum -y insta…

【Android -- 开发工具】Source Insight 4.0 安装和使用教程

简介 Source Insight 工具是一款功能强大的代码阅读器&#xff0c;它能使大量的代码产生联系&#xff0c;方便阅读&#xff0c;而且支持各种语言的程序代码。 安装 & 激活 1. 下载 下载地址 直接点击下载即可&#xff0c;我下载的是 4.0 版本。 然后按照步骤安装完成即…

chatGPT给出Python time.sleep()假死(挂起)的解决办法

1. time.sleep()假死&#xff08;挂起&#xff09;的原因与解决办法 最近&#xff0c;使用chatGPT帮着写程序&#xff0c;完成通过API获取天气数据的程序&#xff0c;运行起来后出现了状况&#xff1a;莫名其妙的的假死&#xff08;程序被挂起来&#xff0c;不执行了&#xff…

项目结构如何改造(利用RuoYi-Vue脚手架开发一个健身房会员管理系统,改造项目结构)

项目结构如何改造&#xff08;利用RuoYi-Vue脚手架开发一个健身房会员管理系统&#xff0c;改造项目结构&#xff09; 1. 全局查找替换&#xff08;Ctrl Shift R&#xff09;2. 全局查找替换版本号3. 全局查找替换模块名4. 修改项目名5. ShiftF6 重命名模块6. ShiftF6 重命名…

Nginx配置使用GeoIP2模块

一、Nginx简介 Nginx(engine x)是一个免费的、开源的、高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个…

不废话!CentOS 8 安装docker的详细过程

目录 1.更新系统 2. 安装依赖包 3.添加 Docker YUM 仓库 4.安装 Docker 5.启动 Docker 6.设置 Docker 开机自启 7.测试 Docker 1.更新系统 dnf update 这里直接输入y&#xff0c;耐心等待更新即可 直到看到complete表示更新完毕 2. 安装依赖包 Docker 需要一些依赖包才能正常…

什么是工业互联网?5G到底能在工业互联网中承担哪些重任呢?

一. 从消费互联网到工业互联网 在这个互联网如我们生活中的水和电一样无孔不入的时代&#xff0c;不能联网的设备是可耻的。它们像是一个一个的信息孤岛&#xff0c;原始而静寂。 然而50年前&#xff0c;这样的信息孤岛却是这个世界的常态&#xff0c;直到美国阿帕网的诞生…

运营-7.内容模型

在内容产品生态中&#xff0c;核心就是内容&#xff0c;内容驱使着所有的角色运转。具体而言&#xff0c;在整个生态模型中&#xff0c;内容的链条从上游 到下游的环节如下&#xff1a; PGC&#xff08;Professionally-generated Content&#xff09;专业生产内容 传统的门户…

最强无监督单目深度估计Baseline--MonoViT--简介与代码复现

1. 无监督单目深度估计 单目深度估计是指&#xff0c;借助于深度神经网络&#xff0c;从单张输入视图中推理场景的稠密深度信息&#xff1b;该技术可以广泛用于自动驾驶、虚拟现实、增强现实等依赖于三维场景感知理解的领域&#xff0c;同时也可以为其他视觉任务提供多模态深度…

部署simple-chat项目

simple-chat介绍&#xff1a;此项目是基于openAI3.5模型的h5端人工智能聊天项目&#xff0c;无需翻墙即可体验。 simple-chat线上地址&#xff1a;simple-chat simple-chat项目地址&#xff1a;GitHub - AMxiaoming/simple-chat nginx部署前端步骤&#xff1a; https://blo…

Android WebRtc+SRS/ZLM视频通话(1):虚拟机安装Ubuntu

Android WebRtcSRS/ZLM视频通话&#xff08;1&#xff09;&#xff1a;虚拟机安装Ubuntu 来自奔三人员的焦虑日志 秉着没事找事的原则&#xff0c;这里直接从服务器安装开始说起&#xff0c;也当记录自己这一路以来的愚昧之举&#xff0c;由于没有物理服务器&#xff0c;这里以…

使用七牛云进行上传图片

首先我们需要明确上传图片的注意点是什么&#xff1f; 1、表单组件标签只能用<input type"file"> 2、上传图片必须采用post请求 get:参数通过请求头提交到后台&#xff0c;参数放到url后面来提交的只能向后台提交文本数据或者字符串数据&#xff0c;二进制如以…

基于物联网可移动医疗设备智能监测节能应用研讨

智慧医疗、全民健康一直是社会关注的热点之一。医疗卫生体系的发展水平关系到人民群众的身心健康和社会和谐&#xff0c;智慧医疗旨在通过物联网技术实现准确、实时感知医疗信息&#xff0c;并进行全面、科学分析&#xff0c;作出智慧的决策&#xff0c;从而提升医疗服务的信息…

黄金投资品种有哪些,如何选择黄金品种

黄金是国际性的硬通货&#xff0c;具有世界货币的地位和国际都认可的流通性&#xff0c;在金融投资市场中黄金也一直属于热门产品&#xff0c;是全球都认可的避险保值投资产品&#xff0c;人们不管是想保值还是向投资增值都是不错的选择&#xff0c;但黄金投资市场中产品种类多…

前端基于uniapp[uniPush]实现APP消息推送(安卓、IOS)

前提概述&#xff1a;此文章都是基于uniapp中uniPush2实现的在线、离线推送 app消息推送流程 登录开发者中心先填写好项目信息以及配置厂商在manifest.json文件中勾选推送模块在前端项目中创建云函数&#xff08;此云函数的作用是接受后台发送的消息模板&#xff0c;解析出来…

项目中常见的几种策略模式实现方式

前言 本篇文章主要介绍本人在自己项目中和开源项目中策略模式的实现方式 基于spring实现策略模式 最近在使用nacos-sync同步工具时发现其使用了策略模式&#xff0c;下面主要介绍它是如何使用的 实现步骤 2.1 定义接口&#xff1a;SyncService public interface SyncService …

交叉导轨具体应用在哪些领域?

交叉导轨通过采用缩短了滚柱体的间距的R型滚柱保持器这种独特的滚柱保持机制&#xff0c;使滚柱体的有效接触长度增大&#xff0c;且交叉导轨的安装高度更低&#xff0c;由于是两付导轨平行安装组合成为一套&#xff0c;使得交叉导轨的机台整体性要好于直线导轨&#xff0c;倾覆…

5 分钟教你如何免费用上 GPT-4

今天要分享的就是普通用户&#xff0c;没有 OpenAI 账号&#xff0c;不需要写代码&#xff0c;你依然可以免费体验 GPT-4&#xff0c;当然&#xff0c;会有一些缺点&#xff0c;本篇文章将会手把手教你怎么用上免费版的 GPT-4 以及它的一些限制。 第一步&#xff1a;打开 Stea…