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
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 643c593..71f2285 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -275,7 +275,7 @@
#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 @@
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);
diff --git a/hal/audio_extn/dts_eagle.c b/hal/audio_extn/dts_eagle.c
index 7fa2c9b..88c255d 100644
--- a/hal/audio_extn/dts_eagle.c
+++ b/hal/audio_extn/dts_eagle.c
@@ -88,22 +88,31 @@
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__);
- 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);
- if (tret < 0)
- ret = tret;
- else
- sent = 1;
+ 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)) {
+ tret = do_DTS_Eagle_params_stream(usecase->stream.out, t, get);
+ if (tret < 0)
+ ret = tret;
+ else
+ sent = 1;
+ }
}
}
@@ -163,7 +172,7 @@
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 @@
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 @@
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 @@
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++)
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 53c9cf4..c2d3400 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2322,7 +2322,7 @@
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 @@
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);
}