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