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

Commit 79415e70 authored by Dhanalakshmi Siddani's avatar Dhanalakshmi Siddani
Browse files

hal: fix DTS HPX fade during pause and resume

During pause/resume, don't send DTS HPX fade-out and fade-in
to all active streams, we should only send to the one that is
pausing or resuming.

Change-Id: Ib527e0be29e81a38f702152b1263a140de773145
CRs-fixed: 780001
parent 6ab6e562
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -275,7 +275,7 @@ void audio_extn_compr_cap_deinit();
#ifndef DTS_EAGLE
#define audio_extn_dts_eagle_set_parameters(adev, parms)     (0)
#define audio_extn_dts_eagle_get_parameters(adev, query, reply) (0)
#define audio_extn_dts_eagle_fade(adev, fade_in) (0)
#define audio_extn_dts_eagle_fade(adev, fade_in, out) (0)
#define audio_extn_dts_create_state_notifier_node(stream_out) (0)
#define audio_extn_dts_notify_playback_state(stream_out, has_video, sample_rate, \
                                    channels, is_playing) (0)
@@ -286,7 +286,7 @@ void audio_extn_dts_eagle_set_parameters(struct audio_device *adev,
                                         struct str_parms *parms);
int audio_extn_dts_eagle_get_parameters(const struct audio_device *adev,
                  struct str_parms *query, struct str_parms *reply);
int audio_extn_dts_eagle_fade(const struct audio_device *adev, bool fade_in);
int audio_extn_dts_eagle_fade(const struct audio_device *adev, bool fade_in, const struct stream_out *out);
void audio_extn_dts_create_state_notifier_node(int stream_out);
void audio_extn_dts_notify_playback_state(int stream_out, int has_video, int sample_rate,
                                  int channels, int is_playing);
+25 −16
Original line number Diff line number Diff line
@@ -88,24 +88,33 @@ static int do_DTS_Eagle_params_stream(struct stream_out *out, struct dts_eagle_p
    return -EINVAL;
}

static int do_DTS_Eagle_params(const struct audio_device *adev, struct dts_eagle_param_desc_alsa *t, bool get) {
static int do_DTS_Eagle_params(const struct audio_device *adev, struct dts_eagle_param_desc_alsa *t, bool get, const struct stream_out *out) {
    struct listnode *node;
    struct audio_usecase *usecase;
    int ret = 0, sent = 0;
    int ret = 0, sent = 0, tret = 0;

    ALOGV("DTS_EAGLE_HAL (%s): enter", __func__);

    if (out) {
        /* if valid out stream is given, then send params to this stream only */
        tret = do_DTS_Eagle_params_stream(out, t, get);
        if (tret < 0)
            ret = tret;
        else
            sent = 1;
    } else {
        list_for_each(node, &adev->usecase_list) {
            usecase = node_to_item(node, struct audio_usecase, list);
            /* set/get eagle params for offload usecases only */
            if ((usecase->type == PCM_PLAYBACK) && is_offload_usecase(usecase->id)) {
            int tret = do_DTS_Eagle_params_stream(usecase->stream.out, t, get);
                tret = do_DTS_Eagle_params_stream(usecase->stream.out, t, get);
                if (tret < 0)
                    ret = tret;
                else
                    sent = 1;
            }
        }
    }

    if (!sent) {
        int fd = open(DEVICE_NODE, O_RDWR);
@@ -163,7 +172,7 @@ static void fade_node(bool need_data) {
        ALOGE("DTS_EAGLE_HAL (%s): error writing to fade notifier node", __func__);
}

int audio_extn_dts_eagle_fade(const struct audio_device *adev, bool fade_in) {
int audio_extn_dts_eagle_fade(const struct audio_device *adev, bool fade_in, const struct stream_out *out) {
    char prop[PROPERTY_VALUE_MAX];

    ALOGV("DTS_EAGLE_HAL (%s): enter with fade %s requested", __func__, fade_in ? "in" : "out");
@@ -177,10 +186,10 @@ int audio_extn_dts_eagle_fade(const struct audio_device *adev, bool fade_in) {

    if (fade_in) {
        if (fade_in_data)
            return do_DTS_Eagle_params(adev, fade_in_data, false);
            return do_DTS_Eagle_params(adev, fade_in_data, false, out);
    } else {
        if (fade_out_data)
            return do_DTS_Eagle_params(adev, fade_out_data, false);
            return do_DTS_Eagle_params(adev, fade_out_data, false, out);
    }
    return 0;
}
@@ -297,7 +306,7 @@ void audio_extn_dts_eagle_set_parameters(struct audio_device *adev, struct str_p
                ALOGD("DTS_EAGLE_HAL (%s): id: 0x%X, size: %d, offset: %d, device: %d", __func__,
                       (*t)->d.id, (*t)->d.size, (*t)->d.offset, (*t)->d.device);
                if (!fade_in) {
                    ret = do_DTS_Eagle_params(adev, *t, false);
                    ret = do_DTS_Eagle_params(adev, *t, false, NULL);
                    if (ret < 0)
                        ALOGE("DTS_EAGLE_HAL (%s): failed setting params in kernel with error %i", __func__, ret);
                }
@@ -378,7 +387,7 @@ int audio_extn_dts_eagle_get_parameters(const struct audio_device *adev,
                    ALOGE("%s: requested data too large", __func__);
                    return -1;
                }
                ret = do_DTS_Eagle_params(adev, t, true);
                ret = do_DTS_Eagle_params(adev, t, true, NULL);
                if (ret >= 0) {
                    data = (int*)(params + sizeof(struct dts_eagle_param_desc_alsa));
                    for (i = 0; i < count; i++)
+2 −2
Original line number Diff line number Diff line
@@ -2322,7 +2322,7 @@ static int out_pause(struct audio_stream_out* stream)

            out->offload_state = OFFLOAD_STATE_PAUSED;

            audio_extn_dts_eagle_fade(adev, false);
            audio_extn_dts_eagle_fade(adev, false, out);
            audio_extn_dts_notify_playback_state(out->usecase, 0,
                                                 out->sample_rate, popcount(out->channel_mask),
                                                 0);
@@ -2350,7 +2350,7 @@ static int out_resume(struct audio_stream_out* stream)

            out->offload_state = OFFLOAD_STATE_PLAYING;

            audio_extn_dts_eagle_fade(adev, true);
            audio_extn_dts_eagle_fade(adev, true, out);
            audio_extn_dts_notify_playback_state(out->usecase, 0, out->sample_rate,
                                                     popcount(out->channel_mask), 1);
        }