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

Commit 53a4e2f4 authored by Aniket Kumar Lata's avatar Aniket Kumar Lata Committed by Gerrit - the friendly Code Review server
Browse files

hal: Reset A2DP backend before SCO is started

- SCO and A2DP share the same Slimbus backend.
  During A2DP to SCO transition, A2DP sound device in
  audio HAL if disabled after SCO audio route is enabled
  overwrites SCO backend config with A2DP reset config.
- Reset A2DP config with A2DP suspension rather than
  wait for it to be handled from stop playback.
  Don't reset backend if stop playback is called
  while A2DP is suspended.
- Also, set/reset slimbus TX config only when usecase is
  LDAC ABR.

CRs-Fixed: 2325382
Change-Id: Ibde776364005a516ad0465b490b3ddc8a4d26c5e
parent e6fb6bc8
Loading
Loading
Loading
Loading
+46 −28
Original line number Diff line number Diff line
@@ -877,7 +877,7 @@ static int a2dp_set_backend_cfg()
        }

        /* Set Tx backend sample rate */
        if (a2dp.abr_config.is_abr_enabled)
        if (a2dp.abr_config.is_abr_enabled) {
            rate_str = ABR_TX_SAMPLE_RATE;

            ALOGD("%s: set backend tx sample rate = %s", __func__, rate_str);
@@ -892,6 +892,7 @@ static int a2dp_set_backend_cfg()
                ALOGE("%s: Failed to set backend sample rate = %s", __func__, rate_str);
                return -ENOSYS;
            }
        }
    } else {
        /* Fallback to legacy approch if MIXER_SAMPLE_RATE_RX and
        MIXER_SAMPLE_RATE_TX is not supported */
@@ -984,6 +985,7 @@ static int a2dp_reset_backend_cfg()
            return -ENOSYS;
        }

        if (a2dp.abr_config.is_abr_enabled) {
            ctl_sample_rate_tx = mixer_get_ctl_by_name(a2dp.adev->mixer,
                                            MIXER_SAMPLE_RATE_TX);
            if (!ctl_sample_rate_tx) {
@@ -995,6 +997,7 @@ static int a2dp_reset_backend_cfg()
                ALOGE("%s: Failed to reset Tx backend sample rate = %s", __func__, rate_str);
                return -ENOSYS;
            }
        }
    } else {

        ctl_sample_rate_rx = mixer_get_ctl_by_name(a2dp.adev->mixer,
@@ -1802,6 +1805,15 @@ static int reset_a2dp_dec_config_params()
    return ret;
}

static void reset_a2dp_config() {
    reset_a2dp_enc_config_params();
    reset_a2dp_dec_config_params();
    a2dp_reset_backend_cfg();
    if (a2dp.abr_config.is_abr_enabled && a2dp.abr_config.abr_started)
        stop_abr();
    a2dp.abr_config.is_abr_enabled = false;
}

int audio_extn_a2dp_stop_playback()
{
    int ret =0;
@@ -1821,13 +1833,9 @@ int audio_extn_a2dp_stop_playback()
        if (ret < 0)
            ALOGE("stop stream to BT IPC lib failed");
        else
            ALOGV("stop steam to BT IPC lib successful");
        reset_a2dp_enc_config_params();
        reset_a2dp_dec_config_params();
        a2dp_reset_backend_cfg();
        if (a2dp.abr_config.is_abr_enabled && a2dp.abr_config.abr_started)
            stop_abr();
        a2dp.abr_config.is_abr_enabled = false;
            ALOGV("stop stream to BT IPC lib successful");
        if (!a2dp.a2dp_suspended)
            reset_a2dp_config();
        a2dp.a2dp_started = false;
    }
    if(!a2dp.a2dp_total_active_session_request)
@@ -1892,8 +1900,7 @@ void audio_extn_a2dp_set_parameters(struct str_parms *parms)
                        pthread_mutex_lock(&a2dp.adev->lock);
                    }
                }
                reset_a2dp_enc_config_params();
                reset_a2dp_dec_config_params();
                reset_a2dp_config();
                if (a2dp.audio_suspend_stream)
                   a2dp.audio_suspend_stream();
            } else if (a2dp.a2dp_suspended == true) {
@@ -1921,8 +1928,19 @@ void audio_extn_a2dp_set_parameters(struct str_parms *parms)
                        if (ret != 0) {
                            ALOGE("BT controller start failed");
                            a2dp.a2dp_started = false;
                        } else {
                            if (!configure_a2dp_encoder_format()) {
                                ALOGE("%s: Encoder params configuration failed post suspend", __func__);
                                a2dp.a2dp_started = false;
                                ret = -ETIMEDOUT;
                            }
                        }
                    }
                    if (a2dp.a2dp_started) {
                        a2dp_set_backend_cfg();
                        if (a2dp.abr_config.is_abr_enabled)
                            start_abr();
                    }
                }
                list_for_each(node, &a2dp.adev->usecase_list) {
                    uc_info = node_to_item(node, struct audio_usecase, list);