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

Commit 2b0e5a6f authored by vivek mehta's avatar vivek mehta Committed by Andy Hung
Browse files

hal: optimize worst case soundcard detection time

current sound card detection logic
   - iterate from sound card 0 to Max i.e. 8
   - on each iteration check if soundcard is not enumerated then
     wait for 500 ms and check again, try up-to 10 retries
   - worst case time is 40 sec  (8 * 10 * 500ms)
New sound card detection logic
   - iterate for max retries i.e. 10
   - on each iteration check if any new sound card enumerated i.e.
     probe soundcard only if on previous iteration it failed
   - on failure move to next card until all card are verified
   - at this point wait for 500ms and retry
   - worst case time is 5 sec  (10 * 500ms)

BUG: 31189013
Change-Id: Ice4b8362e59c60be69e92e33d502f469d41a7b46
parent 3bec48b2
Loading
Loading
Loading
Loading
+29 −16
Original line number Diff line number Diff line
@@ -1010,24 +1010,37 @@ void *platform_init(struct audio_device *adev)
    list_init(&operator_info_list);

    set_platform_defaults(my_data);
    bool card_verifed[MAX_SND_CARD] = {0};
    const int retry_limit = property_get_int32("audio.snd_card.open.retries", RETRY_NUMBER);

    while (snd_card_num < MAX_SND_CARD) {
        adev->mixer = mixer_open(snd_card_num);
    for (;;) {
        if (snd_card_num >= MAX_SND_CARD) {
            if (retry_num++ >= retry_limit) {
                ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
                goto init_failed;
            }

        while (!adev->mixer && retry_num < RETRY_NUMBER) {
            snd_card_num = 0;
            usleep(RETRY_US);
            adev->mixer = mixer_open(snd_card_num);
            retry_num++;
            continue;
        }

        if (card_verifed[snd_card_num]) {
            ++snd_card_num;
            continue;
        }

        adev->mixer = mixer_open(snd_card_num);

        if (!adev->mixer) {
            ALOGE("%s: Unable to open the mixer card: %d", __func__,
               snd_card_num);
            retry_num = 0;
            snd_card_num++;
            ++snd_card_num;
            continue;
        }

        card_verifed[snd_card_num] = true;

        snd_card_name = mixer_get_name(adev->mixer);
        my_data->hw_info = hw_info_init(snd_card_name);

@@ -1106,8 +1119,9 @@ void *platform_init(struct audio_device *adev)
                        min(strlen(snd_card_name), strlen(my_data->snd_card_name))) != 0) {
            ALOGI("%s: found valid sound card %s, but not primary sound card %s",
                   __func__, snd_card_name, my_data->snd_card_name);
            retry_num = 0;
            snd_card_num++;
            ++snd_card_num;
            mixer_close(adev->mixer);
            adev->mixer = NULL;
            hw_info_deinit(my_data->hw_info);
            my_data->hw_info = NULL;
            continue;
@@ -1120,6 +1134,10 @@ void *platform_init(struct audio_device *adev)

        if (!adev->audio_route) {
            ALOGE("%s: Failed to init audio route controls, aborting.", __func__);
            mixer_close(adev->mixer);
            adev->mixer = NULL;
            hw_info_deinit(my_data->hw_info);
            my_data->hw_info = NULL;
            goto init_failed;
        }
        adev->snd_card = snd_card_num;
@@ -1127,11 +1145,6 @@ void *platform_init(struct audio_device *adev)
        break;
    }

    if (snd_card_num >= MAX_SND_CARD) {
        ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
        goto init_failed;
    }

    //set max volume step for voice call
    property_get("ro.config.vc_call_vol_steps", value, TOSTRING(MAX_VOL_INDEX));
    my_data->max_vol_index = atoi(value);