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

Commit 5e51fec8 authored by Preetam Singh's avatar Preetam Singh Committed by Automerger Merge Worker
Browse files

hal: retry a2dp path start up when failed am: 3077da8e

Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/qcom/audio/+/12324832

Change-Id: I0f594199d65b357773a25cd70e33c6cf4108b659
parents 7f6f7edf 3077da8e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1424,6 +1424,7 @@ int audio_extn_a2dp_start_playback()
        if (ret != 0 ) {
           ALOGE("%s: Bluetooth controller start failed", __func__);
           a2dp.a2dp_started = false;
           ret = -ETIMEDOUT;
        } else {
           if (configure_a2dp_encoder_format() == true) {
                a2dp.a2dp_started = true;
+31 −22
Original line number Diff line number Diff line
@@ -803,10 +803,13 @@ int enable_snd_device(struct audio_device *adev,

        ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name);

        if (is_a2dp_device(snd_device) &&
            (audio_extn_a2dp_start_playback() < 0)) {
        if (is_a2dp_device(snd_device)) {
            if (audio_extn_a2dp_start_playback() < 0) {
                ALOGE("%s: failed to configure A2DP control path", __func__);
                goto on_error;
            } else {
                adev->a2dp_started = true;
            }
        }

        audio_route_apply_and_update_path(adev->audio_route, device_name);
@@ -839,9 +842,10 @@ int disable_snd_device(struct audio_device *adev,
    if (adev->snd_dev_ref_cnt[snd_device] == 0) {
        audio_extn_dsm_feedback_enable(adev, snd_device, false);

        if (is_a2dp_device(snd_device))
        if (is_a2dp_device(snd_device)) {
            audio_extn_a2dp_stop_playback();

            adev->a2dp_started = false;
        }
        if ((snd_device == SND_DEVICE_OUT_SPEAKER ||
            snd_device == SND_DEVICE_OUT_SPEAKER_SAFE ||
            snd_device == SND_DEVICE_OUT_SPEAKER_REVERSE ||
@@ -2463,18 +2467,15 @@ int start_output_stream(struct stream_out *out)
    }

    if (out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
        if (!audio_extn_a2dp_is_ready()) {
        if (out->devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
            a2dp_combo = true;
            } else {
                if (!(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) {
        } else if (!audio_extn_a2dp_is_ready() &&
                !(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) {
            ALOGE("%s: A2DP profile is not ready, return error", __func__);
            ret = -EAGAIN;
            goto error_config;
        }
    }
        }
    }
    out->pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
    if (out->pcm_device_id < 0) {
        ALOGE("%s: Invalid PCM device id(%d) for the usecase(%d)",
@@ -2505,11 +2506,14 @@ int start_output_stream(struct stream_out *out)
    audio_streaming_hint_start();
    audio_extn_perf_lock_acquire();

    if (!(out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) ||
            audio_extn_a2dp_is_ready()) {
        select_devices(adev, out->usecase);
    }

    if ((out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) &&
        (!audio_extn_a2dp_is_ready())) {
        if (!a2dp_combo) {
            check_a2dp_restore_l(adev, out, false);
        } else {
            (!audio_extn_a2dp_is_ready() || !adev->a2dp_started)) {
        if (a2dp_combo) {
            audio_devices_t dev = out->devices;
            if (dev & AUDIO_DEVICE_OUT_SPEAKER_SAFE)
                out->devices = AUDIO_DEVICE_OUT_SPEAKER_SAFE;
@@ -2517,9 +2521,13 @@ int start_output_stream(struct stream_out *out)
                out->devices = AUDIO_DEVICE_OUT_SPEAKER;
            select_devices(adev, out->usecase);
            out->devices = dev;
        }
        } else if (!audio_extn_a2dp_is_ready()) {
            check_a2dp_restore_l(adev, out, false);
        } else {
         select_devices(adev, out->usecase);
            ALOGE("%s: A2DP is not started, return error", __func__);
            ret = -EINVAL;
            goto error_open;
        }
    }

    audio_extn_extspk_update(adev->extspk);
@@ -6606,6 +6614,7 @@ static int adev_open(const hw_module_t *module, const char *name,
    adev->primary_output = NULL;
    adev->bluetooth_nrec = true;
    adev->acdb_settings = TTY_MODE_OFF;
    adev->a2dp_started = false;
    /* adev->cur_hdmi_channels = 0;  by calloc() */
    adev->snd_dev_ref_cnt = calloc(SND_DEVICE_MAX, sizeof(int));
    voice_init(adev);
+1 −0
Original line number Diff line number Diff line
@@ -431,6 +431,7 @@ struct audio_device {
    snd_device_t last_logged_snd_device[AUDIO_USECASE_MAX][2]; /* [out, in] */
    int camera_orientation; /* CAMERA_BACK_LANDSCAPE ... CAMERA_FRONT_PORTRAIT */
    bool bt_sco_on;
    bool a2dp_started;
};

int select_devices(struct audio_device *adev,