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

Commit d399e6f8 authored by Preetam Singh Ranawat's avatar Preetam Singh Ranawat
Browse files

hal : fix a2dp-sco concurrency issue with combo use case.

A2dp playback is not working fine if sco path setup
is done post bt_sco off.

Add speaker-safe and a2dp combo device for force restart.
Reroute existing combo use cases from speaker-btsco to speaker-a2dp
if any of use case is routed from speaker-btsco to speaker-a2dp.

Change-Id: I694145facdb0ed6d642c356c620e43297bbaaff1
parent ae1f96a9
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -1599,6 +1599,15 @@ case 8
  new_uc->dev d11 (a1), d2 (a2)  B1, B2
  resolution: compared to case 1, for this case, d1 and d11 are related
  then need to do the same as case 2 to siwtch to new uc

case 9
  uc->dev d1 (a1), d2(a2)        B1  B2
  new_uc->dev d1 (a1), d22 (a2)  B1, B2
  resolution: disable enable uc-dev on d2 since backends match
  we cannot enable two streams on two different devices if they
  share the same backend. This is special case for combo use case
  with a2dp and sco devices which uses same backend.
  e.g. speaker-a2dp and speaker-btsco
*/
static snd_device_t derive_playback_snd_device(void * platform,
                                               struct audio_usecase *uc,
@@ -1645,6 +1654,9 @@ static snd_device_t derive_playback_snd_device(void * platform,
        if (platform_check_backends_match(d3[0], d3[1])) {
            return d2; // case 5
        } else {
            if ((list_length(&a1) > 1) && (list_length(&a2) > 1) &&
                 platform_check_backends_match(d1, d2))
                return d2; //case 9
            if (list_length(&a1) > 1)
                return d1; //case 7
            // check if d1 is related to any of d3's
@@ -1701,7 +1713,8 @@ static void check_usecases_codec_backend(struct audio_device *adev,
     * with new AFE encoder format based on a2dp state
     */
    if ((SND_DEVICE_OUT_BT_A2DP == snd_device ||
         SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP == snd_device) &&
         SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP == snd_device ||
         SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP == snd_device) &&
         audio_extn_a2dp_is_force_device_switch()) {
         force_routing = true;
         force_restart_session = true;