Android 8 Audiopolicy Analysis

Source: Internet
Author: User

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 () &&amp                ; (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 &amp ;        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;&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

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.