tft每日頭條

 > 生活

 > buffer的機制

buffer的機制

生活 更新时间:2024-12-17 13:58:35

前兩篇主要給大家介紹了AudioFlinger流控中播放線程的睡眠策略,從本篇開始介紹AudioFlinger中的buffer管理。

先談幾個變量:

mFrameSize:一個音頻幀的大小,一般如果是16bit,雙聲道的話那就是4個字節

mBufferSize:hal層告訴Audioflinger的底層(ALSA)buffer的大小

mFormat:當前如果播放數據的格式類型,比如:

buffer的機制(AndroidAudioFlinger的流控三漫談buffer)1

mNormalFrameCount:Audioflinger中的各個buffer的大小

mFrameCount:hal層一下的buffer大小,和mNormalFrameCount是倍數關系,倍數關系如下:

buffer的機制(AndroidAudioFlinger的流控三漫談buffer)2

// Calculate size of normal sink buffer relative to the HAL output buffer size

下面介紹一下上述代碼的含義,第一行英文注釋寫的比較清楚,就是計算normalsink,也就是audioflinger的server層的buffer大小和hal層的輸出buffer大小的關系,這個關系直接影響了fastmix的創建進而影響線程的睡眠時間,kMinNormalSinkBufferSizeMs = 20,kMaxNormalSinkBufferSizeMs = 24代表一組經驗值,代表最小和最大的sinkbuffer數據的duration,minNormalFrameCount和maxNormalFrameCount是換算到frame後的變量,一個會round up到16的整數倍,一個會round down到16的整數倍,如果hal層的buffer設置的相對比較大,則multiplier會小于1,最終的系數會設置成1,也就是audioflinger的server和hal層的buffer大小保持一緻,如果hal層的buffer大小設置的比較小則multiplier會大于1,如果沒有超過2則系數最終是2,如果更小則系數就是maxNormalFrameCount / (double) mFrameCount,當然hal層的buffer size直接決定了audioflinger的延遲情況,關于延遲後續開辟專題來講。

mSinkBuffer:緊鄰hal層的寫buffer

buffer的機制(AndroidAudioFlinger的流控三漫談buffer)3

mMixerBuffer:混音後的buffer,所有的track共用

buffer的機制(AndroidAudioFlinger的流控三漫談buffer)4

mEffectBuffer:緊跟混音buffer,如果有音效的話

buffer的機制(AndroidAudioFlinger的流控三漫談buffer)5

由以上各個buffer的大小計算可以看出,雖然大小不一樣,但是frame都是一樣的,這三個buffer在工作的時候要麼保持滿的狀态,要麼保持為空,采用節拍的方式推進。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved