- 博客(221)
- 资源 (12)
- 问答 (1)
- 收藏
- 关注
转载 I2S和PCM协议记录
slot槽的概念是针对DIN/DOUT数据引脚上的,一个slot表示一个通道的一帧数据,比如5.1通道数据,其采样Bit时24,那么一个槽slot就代表5.1通道其中一个通道的24bit的数据;看了上面的I2S介绍后,WCLK可能只能发送2通道的数据,设计之初也是这样的,但随着音频立体声的扩展,如5.1、7.1等多个通道数据扩展后,I2S也引入TDM时分复用技术,扩展到多通道数据的收发;在WCLK信号有效后,BCLK的第二个周期的上升沿数据位有效,数据位先MSB高位Bit,后低位LSB的Bit。
2024-08-14 17:59:06
21
原创 Provider(6) - Reformat和ClampBufferProvider
ReformatBufferProvider就是用于转换输入和输出的数据format不一致,比如输入是float、输出是int32_t;ClampFloatBufferProvider则是将float类型的音频数据其能量限制在[-3dB,3dB]中。
2024-07-20 12:53:48
398
原创 Provider(5) - AdjustChannelsBufferProvider
adjust Channels更新是为了满足dst的channels配置,强行进行映射和填充,没有去确认dst和src的通道是不是对应,举个其实现的例子就明白了:|1|2|1|2| ===>>> |1|2|3|4|1|2|3|4| 3、4通道填充0|1|2|3|4| ==>>> |1|2|1|2|…|3|4|3|4|,多余的3、4通道拼接到数据末尾。
2024-07-20 12:53:00
449
原创 Provider(4) - RemixBufferProvider
Remix顾名思义,在音乐作品中代指重新编排歌曲,这里将对音频数据进行重新编排,也就是其数据的组合位置等,与上一边文章DownmixerBufferProvider区别的是,支持mix后的channel是多通道,而不仅限于channel_left和channel_right。
2024-07-20 12:52:01
665
原创 Provider(3)-Mix之DownmixerBufferProvider
看完后是不是觉得很简单,复杂的是如何和effect的downmix库建立连接,真正做downmix的也就是按照几个策略来做,DOWNMIX_TYPE_STRIP和DOWNMIX_TYPE_FOLD;找出音频数据源中,每个channel位置的数据,按照mix的策略进行加法即可。
2024-07-20 12:49:33
1008
原创 Provider(2)- SourceAudioBufferProvider
从Source源端出来的数据,通常是来自于应用层,但没有与应用层直接连接,通过MonoPipe相关类连接,其SourceAudioBufferProvider和MonoPipe相关类的包含关系图如下:如上图,SourceAudioBufferProvider持有MonoPipeReader,依次持有audio_utils_reader,而audio_utils_fifo是一个队列fifo的管理类,应用侧逻辑通过audio_utils_writer往fifo队列写数据,而audio_utils_reader
2024-07-13 17:55:13
819
原创 Provider(1)- 什么是AudioBufferProvider
顾名思义,Audio音频数据缓冲提供,就是提供音频数据的缓冲类,而且这个AudioBufferProvider派生出许多子类,每个子类有不同的用途,至关重要;那它在Android哪个地方使用呢?在PlaybackTread中,接收应用层传递而来的数据,那为什么要专门用这么多Provider类来处理呢?而不只是简单的转发,将应用层的数据转发到PlaybackThread就行了;No、No、No!
2024-07-13 17:52:46
840
原创 音频Balance源码总结
顾名思义,Balance及平衡,平衡也就是涉及多方,音频左右甚至四通道,调节所有通道的音量比,使用户在空间内听到各个通道的音频大小不一,好似置身于真实环境中;博主分析的Balance源码在。
2024-06-27 19:02:30
1150
原创 谨慎使用android.view.SurfaceView.setVisibility方法
原因就是此方法会导致native的内存暴增,前提条件你使用surfaceview去绘制一些复杂的3D图形,绘制复杂、业务复杂的场景;setVisibility方法会调用surfaceView的updateSurface,而此方法内部就可能会分配大量的native内存。
2023-12-01 11:54:20
545
原创 如何从日志中快速定位Android系统重启?
同样的userId为u0,且为它启动了2次,明显就重启了;可以查看两个时间点的日志确定重启原因。一般来说系统重启都是zygot被干掉了,发送了9就是kill信号,杀掉孵化进程自然就重启了。
2023-10-26 10:24:53
489
原创 音频焦点使用及原理
因为实际上就是通过这种流程触发的,假如我们第一个音乐App申请焦点成功后,在播放音乐music,此时它的FocusRequestor位于FocusStack栈顶,此时若有电话接入,电话App应用会申请音频焦点,电话App会位于FocusStack的栈顶,而music的app在电话App的下面,就会触发对于音乐App失去焦点的回调,当然还有其他焦点触发变化的情况,此处解释就是上述流程图的。这里主要分析上节的2和3步骤,申请焦点与焦点回调两个过程,在framework中是如何运作的?
2023-05-06 14:56:23
2490
原创 Android Audio音量设置原理流程分析
在改变音量时或插入耳机设备时,防止音量突变过大,对人耳造成伤害;如手机上music的音量设置到最大值,当我们插上耳机戴上时,如果音量仍不变保持最大输出,听力可能会受损,这时这个安全音量设备就其作用了,插入耳机时音量值变为安全音量值,保护我们的听力。以上代码关键理解点在于return这句,srcRange代表srcStream可调整的音量等级范围,假如[1, 10],同理dstRange,有可能是[10, 20],如传入的srcStream的index音量等级是5,对应到dstStream是都少呢?
2023-04-11 20:43:44
5374
1
原创 MediaPlayer框架总结
在GenericSource中,FileSource是与本地音视频文件直接连接的一个类,而MediaExtractor则是不同类型音频的解析类,如wav、mp3、midi等多达十多个的解析解析类,不同的音频文件会创建不同Extractor类,但是他们都集成MediaExtractor,拥有统一的操作API接口,而这些Extractor类使用类似链式的模式,最后都指向FileSourece,逐级解析音频,拿到文件里面的metaData元数据以及音频数据。暂用一幅图总结,待后续有时间了在细细补充;
2023-03-24 10:17:07
388
原创 Android Studio自带模拟器卡死问题解决
Studio自带的模拟器很方便,不用安装其他的插件即可运行,但是经常会莫名其妙的点不动、卡死,把它杀掉后、重启Android Studio还是一样的结果;
2023-02-20 09:36:46
3078
5
原创 Android trace文件分析小技巧
网上有很多trace文件分析博客,但是都是解释anr发生得原因,没有指导anr文件如何着手分析?本篇文章就是讲trace文件怎么切入?
2022-10-24 11:02:10
3572
4
原创 widget使用setImageViewBitmap方法设置bug分析
在widget里面,Imageview设置bitmap时,通常可以使用更新ImageView,使用此方法容易引起以下问题:从以上错误日志分析大致意思就是,AppCompatImageView不能在RemoteViews里面使用setImageBitmap这个方法可是why?remoteViews明明提供了setImageViewBitmap,现在又说不能用method实质就是ImageView的setImageBitmap方法,klass.getName()理论上应该返回的是ImageView,因为
2022-06-22 22:11:01
988
原创 Android Audio混音实践篇
Android Audio混音实践篇简介本篇文章主要介绍Android Audio模块的MixerThread混音业务如何实现的?建议在阅读这篇文章之间先阅读混音理论基础篇,并且在分析源码之前:头脑里构想一个大致的混音过程,多路音频AudioTrack叠加在一起进行混音,多路音频混音的是数据对象是pcm数据,它如何叠加,混音后的音量又是如何处理?首先回忆一下单路AudioTrack的音频播放流程,如下:应用层创建AudioTrack,并配置播放音频的模式mode、采样率、format以及usag
2022-04-27 21:07:07
9229
23
原创 混音理论篇
混音基础理论篇什么是声音声音是由物体震动,从而对周围空气产生的一种挤压压力,形成的声音效果。可以在脑海中想象一下水波纹的效果图。并且声音在传输时需要介质,无介质如真空是无法传递声音的,由于声音从音源出来会经过各种反射如墙面,各种反射声音经过叠加混音后传入人耳,才是我们听到的声音,所以大部分情况下我们听到的都是混音,除混音外也有可能同一音源经过墙面反射后先后到达我们的耳朵,但当两次声音间隔小于0.1s时人耳是无法感知的。声音的基本属性从上图声波示图中,知道波有频率、振幅和波形等特性,频率代表音阶
2022-03-05 22:06:22
3753
2
原创 Android Audio播放音频之数据传递
AudioTrack之数据传递简介接上一篇AudioTrack播放音频之建立通道找到了通道的唯一句柄值output,这个output实质就是在AudioFlinger创建PlaybackThread后,以key-value形式上保存(output, PlaybackThread)的key值,通过output就可以找到播放音频将从哪个PlaybackThread线程传递数据,这个线程相当于一个中间角色,应用层进程将音频数据以匿名共享内存方式传递给PlaybackThread,而PlaybackThrea
2022-02-10 20:05:26
8525
4
原创 Audio播放音频 --- 建立播放通道
Audio播放音频 — 建立播放通道简介虽然文章标题是《建立播放通道》,其实播放通道早在AudioPolicyManager解析configuration配置文件时,openoutput业务逻辑就已经把输出通道打开并建立好了,而播放音频流程就是根据音频属性Attribute来决定使用哪个输出通道output而已,但是这个流程业务相对openoutput更加复杂,也涉及更多的音频专业知识;并且播放音频不只是选择输出通道,还涉及往这个输出通道灌音频数据,传送到设备去播放;本篇文章只涉及输出通道的选择,音频
2022-01-12 20:06:36
7988
5
原创 Audio解析strategy配置文件
Audio解析strategy配置文件简介audio_policy_configuration配置文件配置了音频Audio的设备、数据流信息,而strategy相关配置文件则配置某种streamType的音频使用哪种音量曲线,如voice_call和music他们的音量曲线是不一样,后者这种关系叫做strategy策略.默认解析路径在/vendor/etc/audio_policy_engine_configuration.xml下,如果找不到可以去:char* POLICY_USAGE_LIBRA
2021-12-30 20:42:59
3952
原创 音频Open Output业务逻辑
open output顾名思义,你可以理解为打开一条输出通道,这条通道上跑着一定格式、采样率等特定的数据,通道的终点是一个音频设备,用于播放;所以这个open output业务就是初始化这条通道,为这个通道建立各种所需功能等。
2021-12-24 20:38:07
3835
原创 AudioFlinger、AudioPolicyService和AudioPolicyManager之间的关系?
AudioFlinger和AudioPolicyService属于binder服务,而AudioPolicyManager是AudioPolicyService服务进程下的一个独立功能模块,该模块可以由厂家自行实现(但必须遵循aosp的接口定义),最后提供so库,由AudioPolicyService服务load进来调用即可。
2021-12-22 20:40:49
5874
2
原创 audio_policy_configuration.xml文件解析
audio_policy_configuration.xml文件解析简介audio音频数据从一个源走到一个目的都是需要根据配置文件来决定,所以理解configuration配置文件中各个标签项转化为c++实体类的及各成员至关重要,本文先直接给出各标签和对应实体类的结果,后再简单分析其解析过程audio_policy_configuration.xml文件对应C++实体类configuration文件(audio_policy_configuration的缩写)为音频audio的设备、流以及路由等配
2021-12-16 20:26:18
9703
原创 枚举对比转换思路
枚举对比转换思路需求分析在Android系统开发中,我们经常会有这样的需求:a. 首先,我们会在代码中定义许多配置类型,如定义音频输出设备,耳机、扬声器、蓝牙音箱等等,你会想到用枚举,如下:enum audio_device_t { AUDIO_DEVICE_OUT_EARPIECE, AUDIO_DEVICE_OUT_SPEAKER, ....};b. 其次,我们在使用时会配置我们的输出设备,你可以在代码或者xml配置文件中配置,通常我们使用时,不一定和定义enum类
2021-12-16 20:23:29
1879
原创 JetPack Compose理解
每次点击该按钮时,调用方都会更新 clicks 的值。Compose 会再次调用 lambda 与 Text 函数以显示新值;此过程称为“重组”。不依赖于该值的其他函数不会进行重组。重组过程组合只能通过初始组合生成且只能通过重组进行更新。重组是修改组合的唯一方式。重组通常由对 State 对象的更改触发。Compose 会跟踪这些操作,并运行组合中读取该特定 State 的所有可组合项以及这些操作调用的无法跳过的所有可组合项。在重组期间,可组合项调用的可组合项与上个组合期间调用的可组合项不同,Com
2021-09-17 09:04:58
1076
原创 Android开发工具视频Android 12(S)准备
Android开发工具视频Android 12(S)准备适配步骤下载最新的Android studio工具,点我到官网下载最新的吧!最新版的studio规定jdk使用必须至少11,所以请移步下载jdk吧,我用的是jdk16,点我跳转下载jdkwrapper文件夹下面的gradle.properties里面的gradle地址建议用7以上,如下:https\://services.gradle.org/distributions/gradle7.0.0-bin.zip同时,也建议根
2021-08-28 11:35:26
2719
1
原创 Android studio打包so动态链接库没有符号表问题
什么时符号表?动态链接库so文件结构是由一个个Section段构成,一般来说在文件最后会附件一个符号表段,描述其他段对应的函数、变量等符号,当so执行错误时,就会打印so有函数、变量等具体的堆栈符号信息,而不是一堆二进制数据;当然,这附加的符号表并不是执行必须的,可以去除掉,而且一般也是去除掉!否则so库size会特别大为什么Android studio生成的so不带符号表起初查询了网上的资料都是在cmakelist里面去:set(CMAKE_BUILD_TYPE DEBUG)set(CMAKE
2021-08-16 19:12:49
5020
原创 Android权限浅析
Android权限浅析权限,是对想要操作文件或者设备的使用者的约束;使用者拥有某个文件的操作权限方可对齐操作,反之则无法操作文件!浅谈Linux的权限如上图,是Linux系统中的一个JCamera文件夹,d表示一个文件夹,r可读,w可写,x表示可以执行;这三位是固定顺序,假如其中某一项为‘-’,则表示不拥有此项权限;drwxr-xr-x : 表示jackzhous文件拥有者UID,具有可读可写可执行的权限,用户组staff有可读和可执行权限,其他用户有可读和可执行权限;在Linux系统底层对读写
2020-12-23 12:28:36
308
原创 android内存管理机制与优化
android内存管理机制与优化心得简介android使用Dvalik/ART虚拟机来对应用管理,其使用专门的垃圾回收机制来管理堆上的内存,程序员无需自己去释放分配的内存;虽然减轻了我们许多的工作量,但是当我们开发的时候分配内存不合理,也很容易造成内存管理不当,如内存抖动、内存泄漏和内存碎片,所以我们也要弄明白虚拟机是如何管理内存,然后我们在去针对性的优化内存管理机制android内存采用...
2020-12-11 12:30:19
468
原创 Android OTA使用及原理浅析
Android OTA使用及原理浅析OTA(over the air)通过无线网络下载、删除更新等操作,完成业务操作;在Android系统方面,使用OTA可以解决系统升级,而其差分包会增量更新系统,具有占比流量小,适用于Android端;制作OTA升级包OTA包分区全量包和差分包;全量包包含编译整个系统后的所有内容,差分包则是在两个全量包基础上,对比产生的差分包;假如你有两个全量包Full A和Full B,此时设备上的系统是A版本,你之多的差分包C = Full B - Full A,则可以使用O
2020-12-11 11:59:09
2838
原创 Android 8.1高通msm8950平台Camera HAL层架构
Android 8.1 Camera架构及API解释基础使用先看看基础适用,然后以此为例逐步展开获取camera service服务CameraManager service = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);打开相机,并传入回调service.openCamera(cameraId, stateCallback, handler);private CaptureRequest.Builder
2020-12-04 17:51:22
1618
1
原创 解析高通vendor层mct框架
解析qcom mct module凡越底层的代码,更能体现代码的精髓所在 — 数据结构 + 算法模型,所以在研究其代码时,可以先重点关注其数据结构,能更好的帮助我们解析其背后的原理逻辑!今天来分析一下高通的camera vendor下与camera hal相关的部分,mct模块,mct算是其中一个基础模块,其他所有的sensor、isp、imagelib等都会使用mct,所以对它的理解至关重要,更能帮助我们理解其他模块基础数据结构体mct_module_tmct_module_t是mct的重要模块
2020-12-04 16:16:57
5168
1
AMS注释源码(ActivityManagerService)
2020-10-15
清楚android项目工程drawable/mipmap/layout/menu路径下无用的资源文件
2018-10-26
ffmpeg移植到android的基础工程
2016-01-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人