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

Commit 6ee7afb6 authored by Ramjee Singh's avatar Ramjee Singh
Browse files

audio: Re-initialize ACDB after SSR

- If Modem SSR happens during boot up, Audio HAL
  fails to initialize ACDB. It does not check the
  error from acdb_init and does not re-initialize
  when Sound Card is ONLINE after SSR
- Fix is to re-initialize ACDB after Sound Card is
  ONLINE

Change-Id: Icb7a7ca7bb682d55a3cc8f7b26dc0bf511c30a69

Conflicts:
	hal/msm8916/platform.c
parent 346dd6cc
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -2915,6 +2915,12 @@ static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
        } else if (strstr(snd_card_status, "ONLINE")) {
            ALOGD("Received sound card ONLINE status");
            set_snd_card_state(adev,SND_CARD_STATE_ONLINE);
            if (!platform_is_acdb_initialized(adev->platform)) {
                ret = platform_acdb_init(adev->platform);
                if(ret)
                   ALOGE("acdb initialization is failed");

            }
        }
    }

+40 −12
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ struct platform_data {
    bool slowtalk;
    bool hd_voice;
    bool ec_ref_enabled;
    bool is_acdb_initialized;
    /* Audio calibration related functions */
    void                       *acdb_handle;
    int                        voice_feature_set;
@@ -982,6 +983,37 @@ static void audio_hwdep_send_cal(struct platform_data *plat_data)
        ALOGE("%s: Could not send anc cal", __FUNCTION__);
}

int platform_acdb_init(void *platform)
{
    struct platform_data *my_data = (struct platform_data *)platform;
    char *cvd_version = NULL;
    int key = 0;
    const char *snd_card_name;
    int result;
    char value[PROPERTY_VALUE_MAX];
    cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
    if (!cvd_version)
        ALOGE("Failed to allocate cvd version");
    else
        get_cvd_version(cvd_version, my_data->adev);

    property_get("audio.ds1.metainfo.key",value,"0");
    key = atoi(value);
    snd_card_name = mixer_get_name(my_data->adev->mixer);
    result = my_data->acdb_init(snd_card_name, cvd_version, key);
    if (cvd_version)
        free(cvd_version);
    if (!result) {
        my_data->is_acdb_initialized = true;
        ALOGD("ACDB initialized");
        audio_hwdep_send_cal(my_data);
    } else {
        my_data->is_acdb_initialized = false;
        ALOGD("ACDB initialization failed");
    }
    return result;
}

void *platform_init(struct audio_device *adev)
{
    char platform[PROPERTY_VALUE_MAX];
@@ -1104,8 +1136,6 @@ void *platform_init(struct audio_device *adev)
        acdb_device_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 131;
        acdb_device_table[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 131;
    }
    property_get("audio.ds1.metainfo.key",value,"0");
    key = atoi(value);

    my_data->voice_feature_set = VOICE_FEATURE_SET_DEFAULT;
    my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
@@ -1150,16 +1180,7 @@ void *platform_init(struct audio_device *adev)
            ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror());
            goto acdb_init_fail;
        }

        cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
        if (!cvd_version)
            ALOGE("Failed to allocate cvd version");
        else
            get_cvd_version(cvd_version, adev);

        my_data->acdb_init(snd_card_name, cvd_version, key);
        if (cvd_version)
            free(cvd_version);
        platform_acdb_init(my_data);
    }
    audio_extn_pm_vote();

@@ -1198,6 +1219,13 @@ void platform_deinit(void *platform)
    audio_extn_dap_hal_deinit();
}

int platform_is_acdb_initialized(void *platform)
{
    struct platform_data *my_data = (struct platform_data *)platform;
    ALOGD("%s: acdb initialized %d\n", __func__, my_data->is_acdb_initialized);
    return my_data->is_acdb_initialized;
}

const char *platform_get_snd_device_name(snd_device_t snd_device)
{
    if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
+40 −11
Original line number Diff line number Diff line
@@ -146,6 +146,7 @@ struct platform_data {
    bool hd_voice;
    bool ec_ref_enabled;
    bool is_i2s_ext_modem;
    bool is_acdb_initialized;
    /* Audio calibration related functions */
    void                       *acdb_handle;
    int                        voice_feature_set;
@@ -913,6 +914,37 @@ static void audio_hwdep_send_cal(struct platform_data *plat_data)
        ALOGE("%s: Could not send anc cal", __FUNCTION__);
}

int platform_acdb_init(void *platform)
{
    struct platform_data *my_data = (struct platform_data *)platform;
    char *cvd_version = NULL;
    int key = 0;
    const char *snd_card_name;
    int result;
    char value[PROPERTY_VALUE_MAX];
    cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
    if (!cvd_version)
        ALOGE("Failed to allocate cvd version");
    else
        get_cvd_version(cvd_version, my_data->adev);

    property_get("audio.ds1.metainfo.key",value,"0");
    key = atoi(value);
    snd_card_name = mixer_get_name(my_data->adev->mixer);
    result = my_data->acdb_init(snd_card_name, cvd_version, key);
    if (cvd_version)
        free(cvd_version);
    if (!result) {
        my_data->is_acdb_initialized = true;
        ALOGD("ACDB initialized");
        audio_hwdep_send_cal(my_data);
    } else {
        my_data->is_acdb_initialized = false;
        ALOGD("ACDB initialization failed");
    }
    return result;
}

void *platform_init(struct audio_device *adev)
{
    char platform[PROPERTY_VALUE_MAX];
@@ -1032,8 +1064,6 @@ void *platform_init(struct audio_device *adev)
            my_data->fluence_mode = FLUENCE_BROADSIDE;
        }
    }
    property_get("audio.ds1.metainfo.key",value,"0");
    key = atoi(value);

    my_data->voice_feature_set = VOICE_FEATURE_SET_DEFAULT;
    my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
@@ -1079,15 +1109,7 @@ void *platform_init(struct audio_device *adev)
            goto acdb_init_fail;
        }

        cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
        if (!cvd_version)
            ALOGE("failed to allocate cvd_version");
        else
            get_cvd_version(cvd_version, adev);

        my_data->acdb_init(snd_card_name, cvd_version, key);
        if (cvd_version)
            free(cvd_version);
        platform_acdb_init(my_data);
    }

acdb_init_fail:
@@ -1158,6 +1180,13 @@ void platform_deinit(void *platform)
    audio_extn_dap_hal_deinit();
}

int platform_is_acdb_initialized(void *platform)
{
    struct platform_data *my_data = (struct platform_data *)platform;
    ALOGD("%s: acdb initialized %d\n", __func__, my_data->is_acdb_initialized);
    return my_data->is_acdb_initialized;
}

const char *platform_get_snd_device_name(snd_device_t snd_device)
{
    if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@

void *platform_init(struct audio_device *adev);
void platform_deinit(void *platform);
int platform_is_acdb_initialized(void *platform);
int platform_acdb_init(void *platform);
const char *platform_get_snd_device_name(snd_device_t snd_device);
int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
                                      char *device_name);