在前面分析了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.
进行原子设置。
分析到此
暂时结束
有问题之后在修改