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.
在這裏插入圖片描述
進行原子設置。
在這裏插入圖片描述
分析到此在這裏插入圖片描述
暫時結束
有問題之後在修改 在這裏插入圖片描述

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