Audio Audio:AudioTrack()中write()函数梳理过程

在前面分析了AudioTrack的构造函数:Android Audio:AudioTrack构造函数分析

现在来分析AudioTrack中的另一个重要的函数:write()

在这里插入图片描述

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

将音频数据写入音频接收器进行播放或复制音频数据供以后播放。进行参数和状态的验证。
在这里插入图片描述
进入native
在这里插入图片描述
进入JNI层

android\frameworks\base\core\jni\android_media_AudioTrack.cpp
在这里插入图片描述
jint android_media_AudioTrack_writeArray()

取出之前创建的AudioTrack。
在这里插入图片描述
然后把取出的AudioTrack写进去。
在这里插入图片描述
将数据给本地的AudioTrack的对象。如果共享buffer为0,stream模式,则写入数据。
在这里插入图片描述
android\frameworks\av\media\libaudioclient\AudioTrack.cpp
进行参数的验证
在这里插入图片描述
frameworks\av\media\libaudioclient\include\media\AudioTrack.h

存数据Buffer的定义:
无符号8位,偏移0x80
在这里插入图片描述
继续write()函数。

obtainBuffer()获取可用Buffer,memcpy()写入,releaseBuffer()释放Buffer。
在这里插入图片描述
首先看obtainBuffer()
在这里插入图片描述
获得一个代理,进入proxy的obtainBuffer()
在这里插入图片描述
Proxy的定义
在这里插入图片描述
android\frameworks\av\include\private\media\ AudioTrackShared.h

由于AudiotrackClientProxy继承ClientProxy,因此走父类的obtainBuffer()。
在这里插入图片描述
android\frameworks\av\media\libaudioclient\AudioTrackShared.cpp
在这里插入图片描述
获取audiotrack客户端对象。
在这里插入图片描述
原子变量的与操作
在这里插入图片描述
原子变量的读取,从cblk的流中把mFront(读指针)的值读出来。rear写指针。
在这里插入图片描述
得到填充多少数据。
在这里插入图片描述
获取剩下的空的buffer。
在这里插入图片描述
写数据。
在这里插入图片描述
采用环形写法。
借用别人的图
返回buffer的指针,否则应用程序得到一个空白buffer
在这里插入图片描述
进行超时的选择赋值。
在这里插入图片描述
最后进行一些时间的计算,至此得到一个有数据的obtainbuffer。
获得buffer的帧数和size。
在这里插入图片描述
进行memcpy()后,获得copy后的audiobuffer。
然后释放空间。
之前复制得到的audioBuffer,在此处被使用。
在这里插入图片描述
android\frameworks\av\media\libaudioclient\AudioTrackShared.cpp
进入ClientProxy的releaseBuffer.
在这里插入图片描述
防止意外重复使用缓冲区将buffer的这几个值置为0.
在这里插入图片描述
进行原子设置。
在这里插入图片描述
分析到此在这里插入图片描述
暂时结束
有问题之后在修改 在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章