當有線耳機插入/拔出或藍牙耳機的插入/拔出等,這些事件都會引起Audio Route的重新配置。重新配置的過程實在AudioPolicyManager::setDeviceConnectionState中實現的。
/*status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device, audio_policy_dev_state_t state,const char *device_address)*/
該函數有三個參數,device:連接設備,state:連接狀態,device_address:設備地址
以有線耳機插入為例,device = 0x4 / 0x8(4環/3環),state = 0 / 1(拔出/插入), device_address = NULL.
完整流程可以分為以下幾個步驟:
Step1:device check,判斷該device是否為Output device or Input devices,若兩者都不是,則表示該設備不合理。
Step2:state check,根據state狀態來進入不同的switch block內。因為分析的是耳機插入,這里會進到插入block。
Step3:outputs check,尋找該device對應可以使用的Outputs,該Outputs由兩部分組成,一個是當前存在並且mSupportDevices支持該device的mOutputs;另一個是從剩余的profiles中生成的。
Step4:check output是否需要切換。
Step5:close no needed ouputs
Step6:set output devices