Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bcffb663 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "hal: add support for configurable mono speaker"

parents fb81b8a1 c09e5d22
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -26,6 +26,12 @@
<!-- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -->
<!-- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                          -->
<audio_platform_info>
    <acdb_ids>
        <device name="SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED" acdb_id="150"/>
        <device name="SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT" acdb_id="150"/>
        <device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1" acdb_id="151"/>
        <device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2" acdb_id="152"/>
    </acdb_ids>
    <bit_width_configs>
        <device name="SND_DEVICE_OUT_SPEAKER" bit_width="24"/>
    </bit_width_configs>
+88 −0
Original line number Diff line number Diff line
@@ -521,6 +521,14 @@
        <ctl name="SLIM_1_TX Channels" value="One" />
   </path>

    <path name="vbat-speaker-mono-2 echo-reference">
        <ctl name="VOC_EXT_EC MUX" value="SLIM_1_TX" />
        <ctl name="AIF3_CAP Mixer SLIM TX1" value="1" />
        <ctl name="SLIM TX1 MUX" value="RX_MIX_TX1" />
        <ctl name="RX MIX TX1 MUX" value="RX_MIX_VBAT8" />
        <ctl name="SLIM_1_TX Channels" value="One" />
   </path>

   <path name="vbat-speaker echo-reference">
        <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_1_TX" />
        <ctl name="AIF3_CAP Mixer SLIM TX1" value="1" />
@@ -1180,6 +1188,11 @@
        <path name="voice-call"/>
    </path>

    <path name="voice-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="voice-call"/>
    </path>

    <path name="voice2-call hdmi">
        <ctl name="HDMI_RX_Voice Mixer Voice2" value="1" />
        <ctl name="Voice2_Tx Mixer SLIM_0_TX_Voice2" value="1" />
@@ -1210,6 +1223,11 @@
        <path name="voice2-call"/>
    </path>

    <path name="voice2-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="voice2-call"/>
    </path>

    <path name="play-fm">
        <ctl name="Internal FM RX Volume" value="1" />
        <ctl name="SLIMBUS_0_RX Port Mixer INTERNAL_FM_TX" value="1" />
@@ -1386,6 +1404,11 @@
        <path name="volte-call"/>
    </path>

    <path name="volte-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="volte-call"/>
    </path>

    <path name="compress-voip-call">
        <ctl name="SLIM_0_RX_Voice Mixer Voip" value="1" />
        <ctl name="Voip_Tx Mixer SLIM_0_TX_Voip" value="1" />
@@ -1417,6 +1440,11 @@
        <path name="compress-voip-call"/>
    </path>

    <path name="compress-voip-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="compress-voip-call"/>
    </path>

    <path name="vowlan-call">
        <ctl name="SLIM_0_RX_Voice Mixer VoWLAN" value="1" />
        <ctl name="VoWLAN_Tx Mixer SLIM_0_TX_VoWLAN" value="1" />
@@ -1452,6 +1480,11 @@
        <path name="vowlan-call"/>
    </path>

    <path name="vowlan-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="vowlan-call"/>
    </path>

    <path name="voicemmode1-call">
        <ctl name="SLIM_0_RX_Voice Mixer VoiceMMode1" value="1" />
        <ctl name="VoiceMMode1_Tx Mixer SLIM_0_TX_MMode1" value="1" />
@@ -1487,6 +1520,11 @@
        <path name="voicemmode1-call"/>
    </path>

    <path name="voicemmode1-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="voicemmode1-call"/>
    </path>

    <path name="voicemmode2-call">
        <ctl name="SLIM_0_RX_Voice Mixer VoiceMMode2" value="1" />
        <ctl name="VoiceMMode2_Tx Mixer SLIM_0_TX_MMode2" value="1" />
@@ -1522,6 +1560,11 @@
        <path name="voicemmode2-call"/>
    </path>

    <path name="voicemmode2-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="voicemmode2-call"/>
    </path>

    <path name="listen-voice-wakeup-1">
        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
        <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
@@ -1681,12 +1724,26 @@
        <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
    </path>

    <path name="wsa-speaker-mono-2">
        <ctl name="SLIM RX0 MUX" value="AIF_MIX1_PB" />
        <ctl name="SLIM_0_RX Channels" value="One" />
        <ctl name="RX INT8_1 MIX1 INP0" value="RX0" />
        <ctl name="SpkrRight COMP Switch" value="1" />
        <ctl name="SpkrRight BOOST Switch" value="1" />
        <ctl name="SpkrRight VISENSE Switch" value="1" />
        <ctl name="SpkrRight SWR DAC_Port Switch" value="1" />
    </path>

   <path name="vbat-speaker-mono">
       <path name="wsa-speaker-mono" />
       <ctl name="RX INT7 VBAT SPKRL VBAT Enable" value="1" />
   </path>

   <path name="vbat-speaker-mono-2">
       <path name="wsa-speaker-mono-2" />
       <ctl name="RX INT8 VBAT SPKRR VBAT Enable" value="1" />
   </path>

   <path name="vbat-speaker">
       <path name="wsa-speaker" />
       <ctl name="RX INT7 VBAT SPKRL VBAT Enable" value="1" />
@@ -1742,9 +1799,23 @@
        <ctl name="SLIM0_RX_VI_FB_LCH_MUX"  value="SLIM4_TX" />
    </path>

    <path name="voice-speaker-2-protected">
        <ctl name="AIF4_VI Mixer SPKR_VI_2" value="1" />
        <ctl name="SLIM_4_TX Format" value="PACKED_16B" />
        <path name="wsa-speaker-mono-2" />
        <ctl name="VI_FEED_TX Channels" value="One" />
        <ctl name="SLIM0_RX_VI_FB_LCH_MUX"  value="SLIM4_TX" />
    </path>

    <path name="vi-feedback">
    </path>

    <path name="vi-feedback-mono-1">
    </path>

    <path name="vi-feedback-mono-2">
    </path>

   <path name="speaker-protected-vbat">
       <path name="speaker-protected" />
       <ctl name="RX INT7 VBAT SPKRL VBAT Enable" value="1" />
@@ -1756,6 +1827,11 @@
       <ctl name="RX INT7 VBAT SPKRL VBAT Enable" value="1" />
   </path>

   <path name="voice-speaker-2-protected-vbat">
       <path name="voice-speaker-2-protected" />
       <ctl name="RX INT8 VBAT SPKRR VBAT Enable" value="1" />
   </path>

    <path name="handset">
        <ctl name="SLIM RX0 MUX" value="AIF_MIX1_PB" />
        <ctl name="SLIM_0_RX Channels" value="One" />
@@ -1841,14 +1917,26 @@
        <path name="vbat-speaker-mono" />
    </path>

    <path name="vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2" />
    </path>

    <path name="wsa-voice-speaker">
        <path name="wsa-speaker-mono" />
    </path>

    <path name="wsa-voice-speaker-2">
        <path name="wsa-speaker-mono-2" />
    </path>

    <path name="voice-speaker">
        <path name="wsa-speaker-mono" />
    </path>

    <path name="voice-speaker-2">
        <path name="wsa-speaker-mono-2" />
    </path>

    <path name="voice-speaker-mic">
        <path name="speaker-mic" />
    </path>
+88 −0
Original line number Diff line number Diff line
@@ -540,6 +540,14 @@
        <ctl name="SLIM_1_TX Channels" value="One" />
   </path>

    <path name="vbat-speaker-mono-2 echo-reference">
        <ctl name="VOC_EXT_EC MUX" value="SLIM_1_TX" />
        <ctl name="AIF3_CAP Mixer SLIM TX1" value="1" />
        <ctl name="SLIM TX1 MUX" value="RX_MIX_TX1" />
        <ctl name="RX MIX TX1 MUX" value="RX_MIX_VBAT8" />
        <ctl name="SLIM_1_TX Channels" value="One" />
   </path>

   <path name="vbat-speaker echo-reference">
        <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_1_TX" />
        <ctl name="AIF3_CAP Mixer SLIM TX1" value="1" />
@@ -1199,6 +1207,11 @@
        <path name="voice-call"/>
    </path>

    <path name="voice-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="voice-call"/>
    </path>

    <path name="voice2-call hdmi">
        <ctl name="HDMI_RX_Voice Mixer Voice2" value="1" />
        <ctl name="Voice2_Tx Mixer SLIM_0_TX_Voice2" value="1" />
@@ -1229,6 +1242,11 @@
        <path name="voice2-call"/>
    </path>

    <path name="voice2-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="voice2-call"/>
    </path>

    <path name="play-fm">
        <ctl name="Internal FM RX Volume" value="1" />
        <ctl name="SLIMBUS_0_RX Port Mixer INTERNAL_FM_TX" value="1" />
@@ -1405,6 +1423,11 @@
        <path name="volte-call"/>
    </path>

    <path name="volte-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="volte-call"/>
    </path>

    <path name="compress-voip-call">
        <ctl name="SLIM_0_RX_Voice Mixer Voip" value="1" />
        <ctl name="Voip_Tx Mixer SLIM_0_TX_Voip" value="1" />
@@ -1436,6 +1459,11 @@
        <path name="compress-voip-call"/>
    </path>

    <path name="compress-voip-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="compress-voip-call"/>
    </path>

    <path name="vowlan-call">
        <ctl name="SLIM_0_RX_Voice Mixer VoWLAN" value="1" />
        <ctl name="VoWLAN_Tx Mixer SLIM_0_TX_VoWLAN" value="1" />
@@ -1471,6 +1499,11 @@
        <path name="vowlan-call"/>
    </path>

    <path name="vowlan-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="vowlan-call"/>
    </path>

    <path name="voicemmode1-call">
        <ctl name="SLIM_0_RX_Voice Mixer VoiceMMode1" value="1" />
        <ctl name="VoiceMMode1_Tx Mixer SLIM_0_TX_MMode1" value="1" />
@@ -1506,6 +1539,11 @@
        <path name="voicemmode1-call"/>
    </path>

    <path name="voicemmode1-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="voicemmode1-call"/>
    </path>

    <path name="voicemmode2-call">
        <ctl name="SLIM_0_RX_Voice Mixer VoiceMMode2" value="1" />
        <ctl name="VoiceMMode2_Tx Mixer SLIM_0_TX_MMode2" value="1" />
@@ -1541,6 +1579,11 @@
        <path name="voicemmode2-call"/>
    </path>

    <path name="voicemmode2-call vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2 echo-reference" />
        <path name="voicemmode2-call"/>
    </path>

    <path name="listen-voice-wakeup-1">
        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
        <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
@@ -1700,12 +1743,26 @@
        <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
    </path>

    <path name="wsa-speaker-mono-2">
        <ctl name="SLIM RX0 MUX" value="AIF_MIX1_PB" />
        <ctl name="SLIM_0_RX Channels" value="One" />
        <ctl name="RX INT8_1 MIX1 INP0" value="RX0" />
        <ctl name="SpkrRight COMP Switch" value="1" />
        <ctl name="SpkrRight BOOST Switch" value="1" />
        <ctl name="SpkrRight VISENSE Switch" value="1" />
        <ctl name="SpkrRight SWR DAC_Port Switch" value="1" />
    </path>

   <path name="vbat-speaker-mono">
       <path name="wsa-speaker-mono" />
       <ctl name="RX INT7 VBAT SPKRL VBAT Enable" value="1" />
   </path>

   <path name="vbat-speaker-mono-2">
       <path name="wsa-speaker-mono-2" />
       <ctl name="RX INT8 VBAT SPKRR VBAT Enable" value="1" />
   </path>

   <path name="vbat-speaker">
       <path name="wsa-speaker" />
       <ctl name="RX INT7 VBAT SPKRL VBAT Enable" value="1" />
@@ -1761,9 +1818,23 @@
        <ctl name="SLIM0_RX_VI_FB_LCH_MUX"  value="SLIM4_TX" />
    </path>

    <path name="voice-speaker-2-protected">
        <ctl name="AIF4_VI Mixer SPKR_VI_1" value="1" />
        <ctl name="SLIM_4_TX Format" value="PACKED_16B" />
        <path name="wsa-speaker-mono-2" />
        <ctl name="VI_FEED_TX Channels" value="One" />
        <ctl name="SLIM0_RX_VI_FB_LCH_MUX"  value="SLIM4_TX" />
    </path>

    <path name="vi-feedback">
    </path>

    <path name="vi-feedback-mono-1">
    </path>

    <path name="vi-feedback-mono-2">
    </path>

   <path name="speaker-protected-vbat">
       <path name="speaker-protected" />
       <ctl name="RX INT7 VBAT SPKRL VBAT Enable" value="1" />
@@ -1775,6 +1846,11 @@
       <ctl name="RX INT7 VBAT SPKRL VBAT Enable" value="1" />
   </path>

   <path name="voice-speaker-2-protected-vbat">
       <path name="voice-speaker-2-protected" />
       <ctl name="RX INT8 VBAT SPKRR VBAT Enable" value="1" />
   </path>

   <path name="handset">
        <ctl name="SLIM RX0 MUX" value="AIF_MIX1_PB" />
        <ctl name="SLIM_0_RX Channels" value="One" />
@@ -1874,14 +1950,26 @@
        <path name="vbat-speaker-mono" />
    </path>

    <path name="vbat-voice-speaker-2">
        <path name="vbat-speaker-mono-2" />
    </path>

    <path name="wsa-voice-speaker">
        <path name="wsa-speaker-mono" />
    </path>

    <path name="wsa-voice-speaker-2">
        <path name="wsa-speaker-mono-2" />
    </path>

    <path name="voice-speaker">
        <path name="wsa-speaker-mono" />
    </path>

    <path name="voice-speaker-2">
        <path name="wsa-speaker-mono-2" />
    </path>

    <path name="voice-speaker-mic">
        <path name="speaker-mic" />
    </path>
+2 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014, The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -131,6 +131,7 @@ static audio_devices_t get_audio_device(snd_device_t snd_device)
        {SND_DEVICE_OUT_VOICE_HANDSET, AUDIO_DEVICE_OUT_EARPIECE},
        {SND_DEVICE_OUT_SPEAKER, AUDIO_DEVICE_OUT_SPEAKER},
        {SND_DEVICE_OUT_VOICE_SPEAKER, AUDIO_DEVICE_OUT_SPEAKER},
        {SND_DEVICE_OUT_VOICE_SPEAKER_2, AUDIO_DEVICE_OUT_SPEAKER},
        {SND_DEVICE_OUT_HEADPHONES, AUDIO_DEVICE_OUT_WIRED_HEADPHONE},
        {SND_DEVICE_OUT_VOICE_HEADPHONES, AUDIO_DEVICE_OUT_WIRED_HEADPHONE},
        {SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES,
+108 −5
Original line number Diff line number Diff line
@@ -111,6 +111,11 @@ enum speaker_protection_mode {
    SPKR_PROTECTION_MODE_CALIBRATE = 1,
};

struct spkr_prot_r0t0 {
    int r0[SP_V2_NUM_MAX_SPKRS];
    int t0[SP_V2_NUM_MAX_SPKRS];
};

struct speaker_prot_session {
    int spkr_prot_mode;
    int spkr_processing_state;
@@ -136,6 +141,7 @@ struct speaker_prot_session {
    bool spkr_prot_enable;
    bool spkr_in_use;
    struct timespec spkr_last_time_used;
    struct spkr_prot_r0t0 sp_r0t0_cal;
    bool wsa_found;
    const char *spkr_1_tz_name;
    const char *spkr_2_tz_name;
@@ -322,6 +328,7 @@ static int set_spkr_prot_cal(int cal_fd,
    int ret = 0;
    struct audio_cal_fb_spk_prot_cfg    cal_data;
    char value[PROPERTY_VALUE_MAX];
    static int cal_done = 0;

    if (cal_fd < 0) {
        ALOGE("%s: Error: cal_fd = %d", __func__, cal_fd);
@@ -364,6 +371,13 @@ static int set_spkr_prot_cal(int cal_fd,
        ret = -ENODEV;
        goto done;
    }
    if (protCfg->mode == MSM_SPKR_PROT_CALIBRATED  && !cal_done) {
        handle.sp_r0t0_cal.r0[SP_V2_SPKR_1] = protCfg->r0[SP_V2_SPKR_1];
        handle.sp_r0t0_cal.r0[SP_V2_SPKR_2] = protCfg->r0[SP_V2_SPKR_2];
        handle.sp_r0t0_cal.t0[SP_V2_SPKR_1] = protCfg->t0[SP_V2_SPKR_1];
        handle.sp_r0t0_cal.t0[SP_V2_SPKR_2] = protCfg->t0[SP_V2_SPKR_2];
        cal_done = 1;
    }
done:
    return ret;
}
@@ -958,16 +972,26 @@ void audio_extn_spkr_prot_init(void *adev)
            ALOGD("%s: WSA analog mode", __func__);
            platform_set_snd_device_backend(SND_DEVICE_OUT_VOICE_SPEAKER_WSA,
                                            "speaker-protected");
            platform_set_snd_device_backend(SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA,
                                            "speaker-protected");
            platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED,
                                            ACDB_DEVICE_SPKR_PROT_WSA_ANALOG);
            platform_set_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
                                            ACDB_DEVICE_SPKR_PROT_WSA_ANALOG);
            platform_set_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED,
                                            ACDB_DEVICE_SPKR_PROT_WSA_ANALOG);
            platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
                                            ACDB_DEVICE_SPKR_PROT_WSA_ANALOG);
            platform_set_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT,
                                            ACDB_DEVICE_SPKR_PROT_WSA_ANALOG);
            platform_set_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT,
                                            ACDB_DEVICE_SPKR_PROT_WSA_ANALOG);
	    platform_set_snd_device_acdb_id(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK,
                                            ACDB_DEVICE_VI_FEEDBACK_WSA_ANALOG);
            platform_set_snd_device_acdb_id(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1,
                                            ACDB_DEVICE_VI_FEEDBACK_WSA_ANALOG);
            platform_set_snd_device_acdb_id(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2,
                                            ACDB_DEVICE_VI_FEEDBACK_WSA_ANALOG);
            pcm_config_skr_prot.channels = 2;
        }
#endif
@@ -1056,12 +1080,21 @@ int audio_extn_spkr_prot_get_acdb_id(snd_device_t snd_device)
    case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
        acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT);
        break;
    case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
        acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT);
        break;
    case SND_DEVICE_OUT_VOICE_SPEAKER:
#ifdef PLATFORM_MSM8916
    case SND_DEVICE_OUT_VOICE_SPEAKER_WSA:
#endif
        acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
        break;
    case SND_DEVICE_OUT_VOICE_SPEAKER_2:
#ifdef PLATFORM_MSM8916
    case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
#endif
        acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
        break;
    default:
        acdb_id = -EINVAL;
        break;
@@ -1084,22 +1117,79 @@ int audio_extn_get_spkr_prot_snd_device(snd_device_t snd_device)
        return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
    case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
        return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
    case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
        return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
    case SND_DEVICE_OUT_VOICE_SPEAKER:
#ifdef PLATFORM_MSM8916
    case SND_DEVICE_OUT_VOICE_SPEAKER_WSA:
#endif
        return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
    case SND_DEVICE_OUT_VOICE_SPEAKER_2:
#ifdef PLATFORM_MSM8916
    case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
#endif
        return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
    default:
        return snd_device;
    }
}

int audio_extn_get_vi_feedback_snd_device(snd_device_t snd_device)
{
    switch(snd_device) {
    case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
    case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
        return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1;
    case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
    case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
        return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2;
    default:
        return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
    }
}

int audio_extn_select_spkr_prot_cal_data(snd_device_t snd_device)
{
    struct audio_cal_info_spk_prot_cfg protCfg;
    int acdb_fd = -1;
    int ret = 0;

    acdb_fd = open("/dev/msm_audio_cal", O_RDWR | O_NONBLOCK);
    if (acdb_fd < 0) {
        ALOGE("%s: open msm_acdb failed", __func__);
        return -ENODEV;
    }
    switch(snd_device) {
        case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
        case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
            protCfg.r0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_2];
            protCfg.r0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_1];
            protCfg.t0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_2];
            protCfg.t0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_1];
            break;
        default:
            protCfg.r0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_1];
            protCfg.r0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_2];
            protCfg.t0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_1];
            protCfg.t0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_2];
            break;
    }
    protCfg.mode = MSM_SPKR_PROT_CALIBRATED;
    ret = set_spkr_prot_cal(acdb_fd, &protCfg);
    if (ret)
        ALOGE("%s: speaker protection cal data swap failed", __func__);

    close(acdb_fd);
    return ret;
}

int audio_extn_spkr_prot_start_processing(snd_device_t snd_device)
{
    struct audio_usecase *uc_info_tx;
    struct audio_device *adev = handle.adev_handle;
    int32_t pcm_dev_tx_id = -1, ret = 0;
    bool disable_tx = false;
    snd_device_t in_snd_device;

    ALOGV("%s: Entry", __func__);
    /* cancel speaker calibration */
@@ -1108,6 +1198,16 @@ int audio_extn_spkr_prot_start_processing(snd_device_t snd_device)
       return -EINVAL;
    }
    snd_device = audio_extn_get_spkr_prot_snd_device(snd_device);

    if (handle.spkr_prot_mode == MSM_SPKR_PROT_CALIBRATED) {
        ret = audio_extn_select_spkr_prot_cal_data(snd_device);
        if (ret) {
            ALOGE("%s: Setting speaker protection cal data failed", __func__);
            return ret;
        }
    }

    in_snd_device = audio_extn_get_vi_feedback_snd_device(snd_device);
    spkr_prot_set_spkrstatus(true);
    uc_info_tx = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
    if (!uc_info_tx) {
@@ -1122,12 +1222,12 @@ int audio_extn_spkr_prot_start_processing(snd_device_t snd_device)
    if (handle.spkr_processing_state == SPKR_PROCESSING_IN_IDLE) {
        uc_info_tx->id = USECASE_AUDIO_SPKR_CALIB_TX;
        uc_info_tx->type = PCM_CAPTURE;
        uc_info_tx->in_snd_device = SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
        uc_info_tx->in_snd_device = in_snd_device;
        uc_info_tx->out_snd_device = SND_DEVICE_NONE;
        handle.pcm_tx = NULL;
        list_add_tail(&adev->usecase_list, &uc_info_tx->list);
        disable_tx = true;
        enable_snd_device(adev, SND_DEVICE_IN_CAPTURE_VI_FEEDBACK);
        enable_snd_device(adev, in_snd_device);
        enable_audio_route(adev, uc_info_tx);

        pcm_dev_tx_id = platform_get_pcm_device_id(uc_info_tx->id, PCM_CAPTURE);
@@ -1167,9 +1267,9 @@ exit:
        list_remove(&uc_info_tx->list);
        uc_info_tx->id = USECASE_AUDIO_SPKR_CALIB_TX;
        uc_info_tx->type = PCM_CAPTURE;
        uc_info_tx->in_snd_device = SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
        uc_info_tx->in_snd_device = in_snd_device;
        uc_info_tx->out_snd_device = SND_DEVICE_NONE;
        disable_snd_device(adev, SND_DEVICE_IN_CAPTURE_VI_FEEDBACK);
        disable_snd_device(adev, in_snd_device);
        disable_audio_route(adev, uc_info_tx);
        free(uc_info_tx);
    } else
@@ -1183,17 +1283,20 @@ void audio_extn_spkr_prot_stop_processing(snd_device_t snd_device)
{
    struct audio_usecase *uc_info_tx;
    struct audio_device *adev = handle.adev_handle;
    snd_device_t in_snd_device;

    ALOGV("%s: Entry", __func__);
    snd_device = audio_extn_get_spkr_prot_snd_device(snd_device);
    spkr_prot_set_spkrstatus(false);
    in_snd_device = audio_extn_get_vi_feedback_snd_device(snd_device);

    pthread_mutex_lock(&handle.mutex_spkr_prot);
    if (adev && handle.spkr_processing_state == SPKR_PROCESSING_IN_PROGRESS) {
        uc_info_tx = get_usecase_from_list(adev, USECASE_AUDIO_SPKR_CALIB_TX);
        if (handle.pcm_tx)
            pcm_close(handle.pcm_tx);
        handle.pcm_tx = NULL;
        disable_snd_device(adev, SND_DEVICE_IN_CAPTURE_VI_FEEDBACK);
        disable_snd_device(adev, in_snd_device);
        if (uc_info_tx) {
            list_remove(&uc_info_tx->list);
            disable_audio_route(adev, uc_info_tx);
Loading