在前面分析了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.
進行原子設置。
分析到此
暫時結束
有問題之後在修改