天天看點

切換聲音通道流程

5.4 切換聲音通道流程

A. 在驅動程式中切換:

比如: 插上耳麥發生中斷, 在中斷處理程式中設定聲霸卡讓聲音從耳機中輸出

B. 把輸出通道的選擇權交給android系統

驅動程式上報音頻拔插事件,

該事件為某個device插入或拔出,

Android系統需要切換聲音通道,

過程為(核心檔案為frameworks/av/services/audiopolicy/AudioPolicyManager.cpp):

(核心函數為 setDeviceConnectionState)

a. checkOutputsForDevice

針對該device, 打開新的output, 建立新的playbackthread.

方法:

從audio_policy.conf中确定"本該有多少個output"可以支援它,

mOutputs表示"已經打開的output",

兩者對比即可确定"尚未打開的output"

b. checkOutputForAllStrategies / checkOutputForStrategy

對所有的strategy分組聲音,

判斷是否需要遷移到新的output, 如果需要則遷移對應Track到新的output

方法:

b.1 判斷是否需要遷移

對于該strategy, 得到它的oldDevice, 進而得到它的outputs (srcOutputs);

對于該strategy, 得到它的newDevice, 進而得到它的outputs (dstOutputs);

如果這2個srcOutputs、dstOutputs不相同, 表示需要遷移

b.2 如果遷移:

把對應的Track設定為invalidate狀态即可,

App寫AudioTrack時發現它是invalidate狀态, 就會重新建立新的Track

audio_devices_t oldDevice = getDeviceForStrategy(strategy, true /*fromCache*/);
audio_devices_t newDevice = getDeviceForStrategy(strategy, false /*fromCache*/);
SortedVector<audio_io_handle_t> srcOutputs = getOutputsForDevice(oldDevice, mPreviousOutputs);
SortedVector<audio_io_handle_t> dstOutputs = getOutputsForDevice(newDevice, mOutputs);
           

c. getNewOutputDevice/setOutputDevice

這要操作HAL

切換聲音通道流程