Audiotrack will eventually call Audiopolicymanager::getoutput ();
frameworks\av\services\audiopolicy\managerdefault\audiopolicymanager.cppaudio_io_handle_t AudioPolicyManager:: GetOutput (audio_stream_type_t stream, uint32_t samplingrate, audio_format_t format, Audio_channel_mask_ T Channelmask, audio_output_flags_t flags, Const audio_offload_info_t *offloadinfo) {//apm_audiopolicymanager:getoutput () device 2, stream 1, Samp Lingrate 0, Format 0, Channelmask 3, Flags 0//stream = 1, audio_stream_system, get strategy = Strategy_media Routin G_strategy strategy = Getstrategy (stream); Audio_device_none & audio_device_out_speaker audio_devices_t DEVICE = Getdeviceforstrategy (strategy, False/*fro mcache*/); Apm_audiopolicymanager:getoutput () device 2, stream 1, samplingrate 0, format 0, Channelmask 3, Flags 0 ALOGV ("getoutput () device%d, stream%d, samplingrate%d, format%x, channelmask%x, Flags%x", Devic E, stream, samplingrate, format, channelmask, flags); Aloge ("Liutao getoutput () device%d, stream%d, samplingrate%d, format%x, channelmask%x, flags%x", device, St Ream, Samplingrate, format, channelmask, flags); Return Getoutputfordevice (device, Audio_session_allocate, Stream, samplingrate, format, Chann Elmask, flags, offloadinfo);}
Get strategy based on stream
Streamtype refers to the generation type of PCM. Is the movie produced? Or a call?
The strategy pointer to a stream in which the policy is adopted. In the strategy, a specific audio Devices will be selected according to other information.
Routing_strategy Audiopolicymanager::getstrategy (audio_stream_type_t stream) const{Alog_assert (Stream! = AUDIO_ Stream_patch, "Getstrategy () called for Audio_stream_patch"); return Mengine->getstrategyforstream (stream);} Different stream types correspond to Stragegy, play music, system ringtones, stream = 1, Audio_stream_system = 1,frameworks\av\services\audiopolicy\ Enginedefault\src\engine.cpprouting_strategy Engine::getstrategyforstream (audio_stream_type_t stream) {//stream to Strategy mapping switch (stream) {case Audio_stream_voice_call:case Audio_stream_bluetooth_sco:return S Trategy_phone; Case Audio_stream_ring:case Audio_stream_alarm:return strategy_sonification; Case Audio_stream_notification:return strategy_sonification_respectful; Case Audio_stream_dtmf:return STRATEGY_DTMF; Default:aloge ("Unknown stream type%d", stream); Case Audio_stream_system://Note:system STREAM uses MEDIA strategy because muting music and switching OUTPUTS/While key clicks is played produces a poor result case audio_stream_music:return Strategy_media; Case Audio_stream_enforced_audible:return strategy_enforced_audible; Case Audio_stream_tts:return Strategy_transmitted_through_speaker; Case Audio_stream_accessibility:return strategy_accessibility; Case Audio_stream_rerouting:return strategy_rerouting; }}frameworks\av\services\audiopolicy\common\include\routingstrategy.henum Routing_strategy {STRATEGY_MEDIA, Strategy_phone, Strategy_sonification, strategy_sonification_respectful, STRATEGY_DTMF, STRATEGY_ENFORCED_AUDI BLE, Strategy_transmitted_through_speaker, strategy_accessibility, strategy_rerouting, NUM_STRATEGIES};//STRE AM Type definition typedef enum {Audio_stream_default =-1,//( -1) audio_stream_min = 0, Audio_stream_voice_call = 0, AUD Io_stream_system = 1, audio_stream_ring = 2, Audio_stream_music = 3, audio_stream_alarM = 4, audio_stream_notification = 5, Audio_stream_bluetooth_sco = 6, audio_stream_enforced_audible = 7, AUDIO _STREAM_DTMF = 8, Audio_stream_tts = 9, audio_stream_accessibility = ten, audio_stream_rerouting = one, AUDIO_ST Ream_patch = audio_stream_public_cnt = one,//(accessibility + 1) audio_stream_for_policy_cnt = A,//PATCH AUDIO_STREAM_CNT = +,//(PATCH + 1)} audio_stream_type_t;
Get device based on strategy
audio_devices_t Audiopolicymanager::getdeviceforstrategy (Routing_strategy strategy, BOOL Fromcache) {//Routing//See if we have a explicit route//scan the whole routemap, for Each entry, convert the stream type to a strategy//(Getstrategy (Stream)). If the strategy from the stream type in the Routemap are the same as the argument above,//and activity count is non -zero and the device in the route descriptor are available//then select this device. for (size_t routeindex = 0; Routeindex < moutputroutes.size (); routeindex++) {sp<sessionroute> route = MO Utputroutes.valueat (Routeindex); Routing_strategy routestrategy = Getstrategy (Route->mstreamtype); Determine if the input stragegy is in the system-supported Moutputroutes list if ((Routestrategy = = strategy) && route->isactive () && ; (Mavailableoutputdevices.indexof (Route->mdevicedescriptor) >= 0)) { return Route->mdevicedescriptor->type (); }} if (Fromcache) {ALOGVV ("Getdeviceforstrategy () from cache strategy%d, device%x", strategy , Mdeviceforstrategy[strategy]); return Mdeviceforstrategy[strategy]; }//Incoming stragegy = Strategy_media return mengine->getdeviceforstrategy (strategy);} audio_devices_t Engine::getdeviceforstrategy (Routing_strategy strategy) const{devicevector availableOutputDevices = Mapmobserver->getavailableoutputdevices (); Devicevector availableinputdevices = Mapmobserver->getavailableinputdevices (); Const Swaudiooutputcollection &outputs = Mapmobserver->getoutputs (); Return Getdeviceforstrategyint (strategy, availableoutputdevices, Availableinputdevices, outputs);} frameworks\av\services\audiopolicy\enginedefault\src\engine.cppaudio_devices_t Engine::getDeviceForStrategyInt ( Routing_strategy Strategy,Devicevector availableoutputdevices, Devicevector availableinputdevices, Const swaudiooutputcollection &outputs) const{uint32_t device = AUDIO _device_none; uint32_t availableoutputdevicestype = Availableoutputdevices.types (); BOOL Isfma2dpconcurrencyon = Property_get_bool ("vendor.fm.a2dp.conc.disabled", false); A2DP device When the FM is active based the Concurrency property if (Isfma2dpconcurrencyon && (AVA Ilableoutputdevicestype & audio_device_out_fm) {ALOGV ("FM a2dp concurrency are set, not considering A2DP for D Evice selection "); Availableoutputdevicestype = Availableoutputdevicestype & ~audio_device_out_all_a2dp; }//incoming stragegy = Strategy_media = 0 switch (strategy) {//fixme:strategy_rerouting follow strategy_media for now Case Strategy_rerouting:case Strategy_media: {uint32_t device2 = Audio_devicE_none; If you are calling if (Isincall () && (device = = Audio_device_none)) {//When on call, get the device for Phone Strategy device = getdeviceforstrategy (Strategy_phone); Break } if (strategy! = strategy_sonification) {//no sonification on remote submix (e.g. WFD)// See if there are remote devices if (Availableoutputdevices.getdevice (Audio_device_out_remote_submix, String8 ("0"))! = 0) {Device2 = Availableoutputdevices.types () & Audio_device_out_remot E_submix; }}//Call and play music with system ringtone when handling if (Isincall () && (strategy = = Strategy_media)) {Dev Ice = Getdeviceforstrategyint (Strategy_phone, availableoutputdevices, availableinputdevices, outputs); Break }//Bluetooth headset if ((Device2 = = Audio_device_none) && (mforceuse[audio_policY_force_for_media]! = AUDIO_POLICY_FORCE_NO_BT_A2DP) && (outputs.isa2dponprimary () | | | (Outputs.geta2dpoutput ()! = 0))) {Device2 = Availableoutputdevicestype & audio_device_out_bluetooth_a2dp; if (Device2 = = audio_device_none) {Device2 = Availableoutputdevicestype & audio_device_out_bluetooth_a 2dp_headphones; } if (Device2 = = audio_device_none) {Device2 = Availableoutputdevicestype & Audio_device_ou T_bluetooth_a2dp_speaker; }}//SPEAKER if ((Device2 = = Audio_device_none) && (mforceuse[audio_policy_force _for_media] = = audio_policy_force_speaker) {Device2 = Availableoutputdevicestype & Audio_device_out_speak ER; }//Handset if (Device2 = = audio_device_none) {Device2 = Availableoutputdevicestype & Audio_devi Ce_out_wired_headphone; } if (Device2 = = Audio_device_none) {Device2 = Availableoutputdevicestype & audio_device_out_line; }//Wired headset if (Device2 = = audio_device_none) {Device2 = Availableoutputdevicestype & Audio_de Vice_out_wired_headset; }//USB headset if (Device2 = = audio_device_none) {Device2 = Availableoutputdevicestype & Audio_d Evice_out_usb_headset; } if (Device2 = = audio_device_none) {Device2 = Availableoutputdevicestype & Audio_device_out_usb_ac Cessory; } if (Device2 = = audio_device_none) {Device2 = Availableoutputdevicestype & Audio_device_out_usb_de VICE; } if (Device2 = = audio_device_none) {Device2 = Availableoutputdevicestype & audio_device_out_dgtl_d Ock_headset; } if ((Device2 = = Audio_device_none) && (strategy! = strategy_sonification) && (Devi Ce = = Audio_device_none)) {//no sonification on aux DigitaL (e.g HDMI) Device2 = Availableoutputdevicestype & audio_device_out_aux_digital; } if ((Device2 = = Audio_device_none) && (strategy! = strategy_sonification) && (mfor Ceuse[audio_policy_force_for_dock] = = Audio_policy_force_analog_dock)) {Device2 = Availableoutputdevicestype & Amp Audio_device_out_anlg_dock_headset; } if ((Device2 = = Audio_device_none) && (strategy! = strategy_sonification) && (Devi Ce = = Audio_device_none)) {//no sonification on WFD sink device2 = Availableoutputdevicestype & ; Audio_device_out_proxy; } if (Device2 = = audio_device_none) {Device2 = Availableoutputdevicestype & Audio_device_out_speake R } int device3 = Audio_device_none; Several devices simultaneously output if (strategy = = Strategy_media) {//ARC, SPDIF and Aux_line can co-exist with others. Device3 = AvailabLeoutputdevicestype & Audio_device_out_hdmi_arc; Device3 |= (Availableoutputdevicestype & Audio_device_out_spdif); Device3 |= (Availableoutputdevicestype & Audio_device_out_aux_line); } device2 |= Device3; Device is Device_out_speaker if we come from case strategy_sonification or//strategy_enforced_audible, Audio_d Evice_none otherwise device |= Device2; If HDMI system audio mode is on, the remove speaker out of output list. if ((strategy = = Strategy_media) && (mforceuse[audio_policy_force_for_hdmi_system_audio] = = audio_policy_force_hdmi_system_audio_enforced) {device &= ~audio_device_out_speaker; }//For strategy_sonification://If SPEAKER was selected, and Speaker_safe are available, use Speaker_safe instead if (strategy = = strategy_sonification) && (Device & Audio_device_out_speaker) & Amp;& (Availableoutputdevicestype & Audio_device_out_speaker_safe)) {Device |= Audio_device_out_speaker_safe; Device &= ~audio_device_out_speaker; }} break; DEFAULT:ALOGW ("Getdeviceforstrategy () Unknown strategy:%d", strategy); Break } if (device = = Audio_device_none) {ALOGV ("getdeviceforstrategy () no device found for strategy%d", strategy); device = Mapmobserver->getdefaultoutputdevice ()->type (); ALOGE_IF (device = = Audio_device_none, "getdeviceforstrategy () No default device defined"); } alogvv ("Getdeviceforstrategy () strategy%d, device%x", strategy, device); return device;}
Output channel selected for the device
Apm_audiopolicymanager:getoutput () device 2, stream 1, samplingrate 0, format 0, Channelmask 3, flags 0
audio_io_handle_t Audiopolicymanager::getoutputfordevice (audio_devices_t device, audio_session_t session, audio_stream_type_t Stream, uint32_t samplingrate, audio_format_t format, audio_channel_mask_t Channelmask, audio_output_flags_t flags, const audio_offload_info_t *offloadinfo) HARDWARE\QCOM\AUDIO\HAL\MSM 8916\platform.cstatic int Msm_device_to_be_id_internal_codec [][no_cols] = {{Audio_device_out_earpiece , Audio_device_out_speaker}, {Audio_device_out_wired_h Eadset, Audio_device_out_wired_headphone}, {Audio_devi Ce_out_bluetooth_sco, one}, {audio_device_out_bluetooth_sco_headset, 11}, {Audio_device_out_bluetooth_sco_carkit, one}, {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP, -1}, {Audio_Device_out_bluetooth_a2dp_headphones,-1}, {Audio_device_out_bluetooth_a2dp_speaker,-1}, {audio_device_out_aux_digital, 4}, {Audio_device_out_anlg_dock_headset , 9}, {Audio_device_out_dgtl_dock_headset, 9}, {Audio_device_out_usb_accessory ,-1}, {Audio_device_out_usb_device,-1}, {audio_device_out_usb_ HEADSET,-1}, {audio_device_out_remote_submix, 9}, {Audio_de Vice_out_proxy, 9}, {AUDIO_DEVICE_OUT_FM, 7}, {AUDIO_DEVICE_OUT_FM_TX, 8}, {Audio_device_out_all, -1}, {Audio_device_none,-1}, {Audio_device_out_default , -1},};static int Msm_device_to_be_id_external_codec [][no_cols] = {{audio_device_out_earpiece, 2}, {Audio_device_out_speaker, 2}, {Audio_device_out_wired_headset , the Audio_device_out_wired_headphone}, {AUDIO_DEVICE_OUT_BLUETOOTH_SC O, one}, {audio_device_out_bluetooth_sco_headset, one}, {Audio_device_ou T_bluetooth_sco_carkit, one}, {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,-1}, {A Udio_device_out_bluetooth_a2dp_headphones,-1}, {audio_device_out_bluetooth_a2dp_speaker, -1}, {audio_device_out_aux_digital, 4}, {Audio_device_out_anlg_dock_headset , 9}, {Audio_device_out_dgtl_dock_headset, 9}, {Audio_device_out_usb_accessory , -1}, {Audio_device_out_usb_device,-1}, {Audio_device_out_usb_headset ,-1}, {audio_device_out_remote_submix, 9}, {Audio_device_out_proxy , 9}, {AUDIO_DEVICE_OUT_FM, 7}, {Audio_device_ou T_FM_TX, 8}, {Audio_device_out_all,-1}, {AUD Io_device_none,-1}, {Audio_device_out_default,-1} ,};
Android 8 Audiopolicy Analysis