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

Commit 0cc2f31c authored by Arun Mirpuri's avatar Arun Mirpuri Committed by Nadav Bar
Browse files

hal: Fix in call music stream muted issue when mic is muted

Fix in-call music stream mute issue when mic is muted within
dialer app. Issue is caused due to mute applied on mixed
voice stream containing both Voice Tx and incall music stream.
Solution is to apply mute on voice device as and when mic is
muted and incall music usecase is active. Mute cannot be
always applied on device as comfort noise can only be applied
after Mute in Voice stream topology.

Change-Id: I5f3eefdc78590b74beb9c2031139c1da2e41bd1e
Test: manual.
Bug: 70800193
parent d2b5ef4d
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -1980,6 +1980,9 @@ static int stop_output_stream(struct stream_out *out)
        audio_low_latency_hint_end();
    }

    if (out->usecase == USECASE_INCALL_MUSIC_UPLINK)
        voice_set_device_mute_flag(adev, false);

    /* 1. Get and set stream specific mixer controls */
    disable_audio_route(adev, uc_info);

@@ -2103,6 +2106,9 @@ int start_output_stream(struct stream_out *out)

    audio_extn_extspk_update(adev->extspk);

    if (out->usecase == USECASE_INCALL_MUSIC_UPLINK)
        voice_set_device_mute_flag(adev, true);

    ALOGV("%s: Opening PCM device card_id(%d) device_id(%d) format(%#x)",
          __func__, adev->snd_card, out->pcm_device_id, out->config.format);
    if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
+1 −0
Original line number Diff line number Diff line
@@ -329,6 +329,7 @@ struct audio_device {
    bool enable_voicerx;
    bool enable_hfp;
    bool mic_break_enabled;
    bool use_voice_device_mute;

    int snd_card;
    void *platform;
+1 −1
Original line number Diff line number Diff line
@@ -2479,7 +2479,7 @@ int platform_set_mic_mute(void *platform, bool state)
              __func__, mixer_ctl_name);
        return -EINVAL;
    }
    ALOGV("Setting voice mute state: %d", state);
    ALOGV("%s: Setting voice mute state: %d", __func__, state);
    mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));

    if (my_data->csd != NULL) {
+32 −2
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ int voice_start_usecase(struct audio_device *adev, audio_usecase_t usecase_id)
    uc_info->devices = adev->current_call_output ->devices;
    uc_info->in_snd_device = SND_DEVICE_NONE;
    uc_info->out_snd_device = SND_DEVICE_NONE;
    adev->use_voice_device_mute = false;

    list_add_tail(&adev->usecase_list, &uc_info->list);

@@ -356,11 +357,19 @@ int voice_check_and_set_incall_music_usecase(struct audio_device *adev,
int voice_set_mic_mute(struct audio_device *adev, bool state)
{
    int err = 0;
    struct audio_usecase *usecase = NULL;

    adev->voice.mic_mute = state;
    if (adev->mode == AUDIO_MODE_IN_CALL ||
        adev->mode == AUDIO_MODE_IN_COMMUNICATION)
        adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
        /* Use device mute if incall music delivery usecase is in progress */
        if (adev->use_voice_device_mute)
            err = platform_set_device_mute(adev->platform, state, "tx");
        else
            err = platform_set_mic_mute(adev->platform, state);
        ALOGV("%s: voice mute status=%d, use_voice_device_mute_flag=%d",
            __func__, state, adev->use_voice_device_mute);
    }

    return err;
}
@@ -370,6 +379,25 @@ bool voice_get_mic_mute(struct audio_device *adev)
    return adev->voice.mic_mute;
}

// Following function is called when incall music uplink usecase is
// created or destroyed while mic is muted. If incall music uplink
// usecase is active, apply voice device mute to mute only voice Tx
// path and not the mixed voice Tx + inncall-music path. Revert to
// voice stream mute once incall music uplink usecase is inactive
void voice_set_device_mute_flag (struct audio_device *adev, bool state)
{
    if (adev->voice.mic_mute) {
        if (state) {
            platform_set_device_mute(adev->platform, true, "tx");
            platform_set_mic_mute(adev->platform, false);
        } else {
            platform_set_mic_mute(adev->platform, true);
            platform_set_device_mute(adev->platform, false, "tx");
        }
    }
    adev->use_voice_device_mute = state;
}

int voice_set_volume(struct audio_device *adev, float volume)
{
    int vol, err = 0;
@@ -516,6 +544,8 @@ void voice_init(struct audio_device *adev)
    adev->voice.volume = 1.0f;
    adev->voice.mic_mute = false;
    adev->voice.in_call = false;
    adev->use_voice_device_mute = false;

    for (i = 0; i < MAX_VOICE_SESSIONS; i++) {
        adev->voice.session[i].pcm_rx = NULL;
        adev->voice.session[i].pcm_tx = NULL;
+2 −0
Original line number Diff line number Diff line
@@ -95,4 +95,6 @@ void voice_set_sidetone(struct audio_device *adev,
                       snd_device_t out_snd_device,
                       bool enable);
bool voice_is_call_state_active(struct audio_device *adev);
void voice_set_device_mute_flag (struct audio_device *adev, bool state);

#endif //VOICE_H