其他分享
首页 > 其他分享> > Android Audio:AudioTrack构造函数分析

Android Audio:AudioTrack构造函数分析

作者:互联网

分析AudioTrack之前先分析一下AudioTrack和MediaPlayer的区别:

个人感觉AudioTrack梳理起来的过程是非常痛苦的,中间可能也有很多问题,参考了很多博客,还有实习师傅的指导,整理一篇Android P的AudioTrack流程初文出来,以后工作用的多了熟悉了,再修改。

AudioTrack的构造函数分析:

android\frameworks\base\media\java\android\media\AudioTrack.java

走private的构造函数。
在这里插入图片描述
获取主线程的Looper,异步消息通信的机制。
在这里插入图片描述
获取采样率,声道掩码,编码类型,然后验证参数是否合法
在这里插入图片描述
调用native层的native_setup
在这里插入图片描述
native_setup()
在这里插入图片描述
android\frameworks\base\core\jni\android_media_AudioTrack.cpp
在这里插入图片描述
进入JNI层
在这里插入图片描述
创建native层的AudioTrack。
在这里插入图片描述
android\frameworks\av\media\libaudioclient\AudioTrack.cpp

进到lib层,通过set()方法将参数设置进去
在这里插入图片描述
status_t AudioTrack::set()
在这里插入图片描述
创建IAudioTrack.
在这里插入图片描述
获取音频策略服务。
在这里插入图片描述
frameworks\av\media\libaudioclient\AudioSystem.cpp
通过binder机制绑定服务。
在这里插入图片描述
android\frameworks\av\media\libaudioclient\AudioTrack.cpp
进入AudioFlinger
在这里插入图片描述
android\frameworks\av\services\audioflinger\AudioFlinger.cpp
在这里插入图片描述
依据播放线程ID号查找出相应的PlaybackThread,依据客户端进程pid查找是否已经为该客户进程创建了Client对象。假设没有,则创建一个Client对象。
在这里插入图片描述
依据进程pid。为请求播放音频的client创建一个Client对象。
在这里插入图片描述
AudioFlinger的成员变量mClients以键值对的形式保存pid和Client对象。这里首先取出pid相应的Client对象,假设该对象为空。则为client进程创建一个新的Client对象。MemoryDealer是个工具类。用于分配共享内存。每个Client都拥有一个MemoryDealer对象,这就意味着每个client进程都是在自己独有的内存空间中分配共享内存。
在这里插入图片描述
创建了如同所示的内存大小。
在这里插入图片描述
返回继续看AudioFlinger::createTrack()
在这里插入图片描述
frameworks\av\services\audioflinger\Threads.cpp
创建Track对象
在这里插入图片描述
前面进行一系列的参数赋值,最后返回一个track对象。
在这里插入图片描述
进入Track的构造函数,由图可见,继承于TrackBase,因此先进入TrackBase的构造函数进行分析。
在这里插入图片描述
TrackBase()
thread,所属播放线程,client所属的客户端,sampleRate,采样率,format音频格式,channelMask,声道,frameCount,音频帧个数。sharedBuffer,共享内存。
在这里插入图片描述
得到应用进程id
在这里插入图片描述
计算存放音频的buffer大小。
在这里插入图片描述
Client不为空。就通过Client来分配buffer,为空,则通过mallc动态分配。
在这里插入图片描述
由此可见,TrackBase构造过程主要是为音频播放分配共享内存。
接着进入Track的构造函数进行分析。在这里插入图片描述

为0创建AudioTrackServerProxy代理对象,不为0,创建StaticAudioTrackServerProxy代理对象;
在这里插入图片描述
接下来我们返回AudioFlinger的createTrack函数中,来看这个track对象到底做了什么事情。

android\frameworks\av\services\audioflinger\AudioFlinger.cpp

创建Track的binder对象TrackHandle,Track由于需要通过binder返回给AudioTrack,因此是个binder对象,该对象会包含share buffer的信息。由于share buffer不止会在AudioFlinger这端被读取,还会在AudioTrack这端被写入,因此创建出来的Track需要被传送回AudioTrack。而在binder间传送对象只有binder对象,因此需要构建binder对象TrackHandle,返回给AudioTrack。
在这里插入图片描述
frameworks\av\services\audioflinger\Tracks.cpp
至此,createTrack_l在AudioFlinger这端的工作基本完成了。
在这里插入图片描述

ps:这里我绕的不太清楚:可参考其他博客:[Android] createTrack_l

frameworks\av\media\libaudioclient\AudioTrack.cpp

返回AudioTrack.cpp中的creatTrack中。
在这里插入图片描述
构造函数暂时分析至此。
在这里插入图片描述

猫鸷 发布了38 篇原创文章 · 获赞 12 · 访问量 1万+ 私信 关注

标签:AudioFlinger,对象,AudioTrack,frameworks,创建,cpp,Android,构造函数
来源: https://blog.csdn.net/qq_43443900/article/details/103933776