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

Commit f2829017 authored by Ravi Kumar Alamanda's avatar Ravi Kumar Alamanda Committed by Eric Laurent
Browse files

hal: Fix EC not working in VoIP calls

Ensure the EC reference path is reset while switching device
for VoIP calls.

Bug: 17986908
Change-Id: I7eca6842ee2ba298493cb1cd479f90318a437e12
parent 5f113add
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -551,7 +551,8 @@ int select_devices(struct audio_device *adev,
                                            usecase->stream.out->devices);
                if (usecase->stream.out == adev->primary_output &&
                        adev->active_input &&
                        adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
                        adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION &&
                        out_snd_device != usecase->out_snd_device) {
                    select_devices(adev, adev->active_input->usecase);
                }
            }
@@ -563,6 +564,7 @@ int select_devices(struct audio_device *adev,
                if (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION &&
                        adev->primary_output && !adev->primary_output->standby) {
                    out_device = adev->primary_output->devices;
                    platform_set_echo_reference(adev, false, AUDIO_DEVICE_NONE);
                } else if (usecase->id == USECASE_AUDIO_RECORD_AFE_PROXY) {
                    out_device = AUDIO_DEVICE_OUT_TELEPHONY_TX;
                }
+15 −13
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ struct platform_data {
    struct csd_data *csd;
    bool ext_speaker;
    bool ext_earpiece;
    char ec_ref_mixer_path[64];
};

static int pcm_device_table[AUDIO_USECASE_MAX][2] = {
@@ -409,23 +410,24 @@ bool is_operator_tmus()

void platform_set_echo_reference(struct audio_device *adev, bool enable, audio_devices_t out_device)
{
    char mixer_path[50] = { 0 } ;
    struct platform_data *my_data = (struct platform_data *)adev->platform;
    snd_device_t snd_device = SND_DEVICE_NONE;
    struct listnode *node;
    struct audio_usecase *usecase;

    strcpy(mixer_path, "echo-reference");
    if (strcmp(my_data->ec_ref_mixer_path, "")) {
        ALOGV("%s: diabling %s", __func__, my_data->ec_ref_mixer_path);
        audio_route_reset_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
    }

    if (enable) {
        strcpy(my_data->ec_ref_mixer_path, "echo-reference");
        if (out_device != AUDIO_DEVICE_NONE) {
            snd_device = platform_get_output_snd_device(adev->platform, out_device);
        platform_add_backend_name(adev->platform, mixer_path, snd_device);
            platform_add_backend_name(adev->platform, my_data->ec_ref_mixer_path, snd_device);
        }

    if (enable)
        audio_route_apply_and_update_path(adev->audio_route, mixer_path);
    else
        audio_route_reset_and_update_path(adev->audio_route, mixer_path);

    ALOGV("Setting EC Reference: %d for %s", enable, mixer_path);
        ALOGD("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
        audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
    }
}

static struct csd_data *open_csd_client(bool i2s_ext_modem)