hal: support bus dev volume over audio port config
Support bus device based audio stream volume
control in dsp or codec h/w over audio HAL port
config interface for automotive audio.
Change-Id: I87be963c0af96bf27dfa65900d8a916525ba0356
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index b2c23fe..29289f8 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -3508,6 +3508,8 @@
out->usecase == USECASE_AUDIO_PLAYBACK_ULL) && (out->apply_volume)) {
out_set_pcm_volume(&out->stream, out->volume_l, out->volume_r);
out->apply_volume = false;
+ } else if (audio_extn_auto_hal_is_bus_device_usecase(out->usecase)) {
+ out_set_pcm_volume(&out->stream, out->volume_l, out->volume_r);
}
} else {
platform_set_stream_channel_map(adev->platform, out->channel_mask,
@@ -3570,6 +3572,22 @@
adev->offload_effects_start_output(out->handle, out->pcm_device_id, adev->mixer);
audio_extn_check_and_set_dts_hpx_state(adev);
}
+
+ if (out->devices & AUDIO_DEVICE_OUT_BUS) {
+ /* Update cached volume from media to offload/direct stream */
+ struct listnode *node = NULL;
+ list_for_each(node, &adev->active_outputs_list) {
+ streams_output_ctxt_t *out_ctxt = node_to_item(node,
+ streams_output_ctxt_t,
+ list);
+ if (out_ctxt->output->usecase == USECASE_AUDIO_PLAYBACK_MEDIA) {
+ out->volume_l = out_ctxt->output->volume_l;
+ out->volume_r = out_ctxt->output->volume_r;
+ }
+ }
+ out_set_compr_volume(&out->stream,
+ out->volume_l, out->volume_r);
+ }
}
if (ret == 0) {
@@ -4948,6 +4966,13 @@
out->volume_l = left;
out->volume_r = right;
return ret;
+ } else if (audio_extn_auto_hal_is_bus_device_usecase(out->usecase)) {
+ ALOGV("%s: bus device set volume called", __func__);
+ if (!out->standby)
+ ret = out_set_pcm_volume(stream, left, right);
+ out->volume_l = left;
+ out->volume_r = right;
+ return ret;
}
return -ENOSYS;
@@ -8908,13 +8933,21 @@
int adev_get_audio_port(struct audio_hw_device *dev, struct audio_port *config)
{
- return audio_extn_hw_loopback_get_audio_port(dev, config);
+ int ret = 0;
+
+ ret = audio_extn_hw_loopback_get_audio_port(dev, config);
+ ret |= audio_extn_auto_hal_get_audio_port(dev, config);
+ return ret;
}
int adev_set_audio_port_config(struct audio_hw_device *dev,
const struct audio_port_config *config)
{
- return audio_extn_hw_loopback_set_audio_port_config(dev, config);
+ int ret = 0;
+
+ ret = audio_extn_hw_loopback_set_audio_port_config(dev, config);
+ ret |= audio_extn_auto_hal_set_audio_port_config(dev, config);
+ return ret;
}
static int adev_dump(const audio_hw_device_t *device __unused,