Android智能手機中各類音頻場景下的audio data path

上一篇文章(Android智能手機上的音頻淺析)說本篇將詳細講解Android智能手機中各類音頻場景下的音頻數據流向,如今咱們就開始。智能手機中音頻的主要場景有音頻播放、音頻錄製、語音通訊等。不一樣場景下的音頻數據流向有很大差別,即便是同一場景,在不一樣的模式下音頻數據流向也有所不一樣。html

 

1,音頻播放android

Android系統audio框架中主要有三種播放模式:low latency playback、deep buffer playback和compressed offload playback。網絡

a)low latency playback:用於按鍵音、遊戲背景音等對時延要求高的聲音輸出。音頻文件是在AP側解碼成PCM數據,而後再經由Audio DSP送給codec芯片播放出來。框架

b)deep buffer playback:用於音樂等對時延要求不高的聲音輸出。音頻文件是在AP側解碼成PCM數據,若是有音效的話會再對PCM數據處理(android audio framework中有effect音效模塊,支持的音效有均衡器、低音加強、環繞聲等),而後再經由Audio DSP送給codec芯片播放出來。編碼

c)compressed offload playback:用於音樂等聲音輸出,可是音頻解碼部分的工做是在Audio DSP中完成,AP側只負責把音頻碼流送到Audo DSP中,送出去後AP側會進行休眠,Audo DSP中會分配一塊較大的buffer去處理此數據,在Audo DSP中進行解碼、音效的處理等工做,在Audo DSP解碼器處理完數據以前,它會喚醒AP側去送下一包數據。用這種模式播放音頻能有效的下降功耗,是最爲推薦的播放音樂的模式。可是在目前的主流的音樂播放APP中用的基本上都是deep buffer的播放模式,好比QQ音樂、網易雲音樂和酷狗音樂等。看來系統平臺廠商和APP廠商的作法是有差別的。至於哪些格式的音樂用這種模式播放,這須要在audioPolicy中去控制,我作的平臺上是MP3(*.mp3)和AAC(*.m4a)用offload模式播放,由於這兩種格式最主流。3d

 

綜上low latency 模式和deep buffer模式都是在AP側解碼完後送PCM數據給Audio DSP,故音頻數據流向相似,我將放在一塊兒講,而compressed offload模式是碼流送給Audio DSP解碼。播放系統音和遊戲音用low latency 模式,播放音樂用deep buffer或者compressed offload模式,播放錄音用deep buffer模式。接下來咱們看看low latency /deep buffer和compressed offload兩種模式下的音頻數據流向。在音頻播放時音頻數據只通過AP和audio DSP。code

 

1)low latency / deep buffer模式下的音頻數據流向htm

從上圖看出,音頻文件先在AP上軟解碼獲得PCM後通過AudioTrack/audioFlinger中的Mixer thread(有可能要作音效後處理)/audio HAL/tinyALSA後送給kernel,而後用IPC將PCM送給Audio DSP經重採樣混音等後播放出來。因爲在AP上已作解碼和音效後處理,Audio DSP上就不須要作了。blog

 

2)compressed offload模式下的音頻數據流向遊戲

從上圖看出,音頻碼流通過AP上的AudioTrack/audioFlinger中的Offload thread(不須要作音效後處理)/audio HAL/tinyALSA後送給kernel,而後用IPC將碼流送給Audio DSP經解碼、後處理、重採樣、混音等後播放出來。

 

2,音頻錄製

不少人喜歡把參加的重要會議或者演講的音頻錄下來,以便重複聽或者他用。下圖就是錄音時音頻數據的流向。同音頻播放同樣,錄音時音頻數據也是隻通過AP和audio DSP。

從上圖看出,codec芯片採集到的PCM數據送給Audio DSP經重採樣、前處理後送給AP的kernel,再經由tinyALSA/audio HAL /audioFlinger中的Record thread/audioRecord等後作軟編碼獲得錄音碼流文件並保持起來。

 

3,語音通訊

語音通訊就是打電話啦。它同音頻播放或者錄製不同,它是雙向的,分上行(uplink,把採集到的語音發送給對方)和下行(downlink,把收到的語音播放出來),而音頻播放或者錄製是單向的。它音頻數據流向也跟音頻播放或者錄製不同,只通過audio DSP和CP,下圖就是打電話時音頻數據的流向。

從上圖看出,在上行方向上codec芯片採集到的PCM數據送給Audio DSP經重採樣、前處理(AEC/ANS/AGC等)、編碼後獲得碼流,並將碼流送給CP,CP處理後通過空口(air interface)送給對方。在下行方向上先從空口收對方送過來的語音數據,並作網絡側處理(jitter buffer等),而後送給Audio DSP,Audio DSP收到後作解碼、後處理(ANS/AGC等)、重採樣等,再把PCM數據經DMA/I2S送給codec芯片播放出來。

相關文章
相關標籤/搜索