hal: Fix backend for 24 bit playback on speaker
Configure backend at 48khz for 24 bit playback on speakers.
Currently, ADM can be configured only at the begining of stream
playback. During device switch, in the middle of a playback, the
backend remains at the previous configuration.
By allowing ADM and backend re-configuration during playback, 24-bit
playback is enforced on appropriate backend.
Change-Id: I6a6df5699972b0992a217fb2a4c9dc94fd2230ce
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index aa22193..5287ae8 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -472,6 +472,7 @@
struct audio_device *adev;
struct mixer_ctl *ctl;
int pcm_device_id, acdb_dev_id, snd_device = usecase->out_snd_device;
+ int32_t sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
ALOGV("%s", __func__);
@@ -513,13 +514,21 @@
rc = -EINVAL;
goto exit_send_app_type_cfg;
}
+
+ if ((24 == usecase->stream.out->bit_width) &&
+ (AUDIO_DEVICE_OUT_SPEAKER == snd_device)) {
+ sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ } else {
+ sample_rate = out->app_type_cfg.sample_rate;
+ }
+
app_type_cfg[len++] = out->app_type_cfg.app_type;
app_type_cfg[len++] = acdb_dev_id;
- app_type_cfg[len++] = out->app_type_cfg.sample_rate;
+ app_type_cfg[len++] = sample_rate;
mixer_ctl_set_array(ctl, app_type_cfg, len);
ALOGI("%s app_type %d, acdb_dev_id %d, sample_rate %d",
- __func__, out->app_type_cfg.app_type, acdb_dev_id, out->app_type_cfg.sample_rate);
+ __func__, out->app_type_cfg.app_type, acdb_dev_id, sample_rate);
rc = 0;
exit_send_app_type_cfg:
return rc;
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 1f53aa7..baac2af 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -797,6 +797,27 @@
usecase->in_snd_device = in_snd_device;
usecase->out_snd_device = out_snd_device;
+ if (usecase->type == PCM_PLAYBACK) {
+ if ((24 == usecase->stream.out->bit_width) &&
+ (AUDIO_DEVICE_OUT_SPEAKER == usecase->stream.out->devices)) {
+ audio_extn_utils_update_stream_app_type_cfg(adev->platform,
+ &adev->streams_output_cfg_list,
+ usecase->stream.out->flags,
+ usecase->stream.out->format,
+ DEFAULT_OUTPUT_SAMPLING_RATE,
+ usecase->stream.out->bit_width,
+ &usecase->stream.out->app_type_cfg);
+ } else {
+ audio_extn_utils_update_stream_app_type_cfg(adev->platform,
+ &adev->streams_output_cfg_list,
+ usecase->stream.out->flags,
+ usecase->stream.out->format,
+ usecase->stream.out->sample_rate,
+ usecase->stream.out->bit_width,
+ &usecase->stream.out->app_type_cfg);
+ }
+ ALOGI("%s Selected apptype: %d", __func__, usecase->stream.out->app_type_cfg.app_type);
+ }
enable_audio_route(adev, usecase);
/* Applicable only on the targets that has external modem.
@@ -2382,6 +2403,7 @@
struct stream_out *out;
int i, ret = 0;
audio_format_t format;
+ int32_t sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
*stream_out = NULL;
@@ -2567,11 +2589,20 @@
out->sample_rate = out->config.rate;
}
- ALOGV("%s flags %x, format %x, out->sample_rate %d, out->bit_width %d",
- __func__, flags, format, out->sample_rate, out->bit_width);
+ if ((24 == out->bit_width) &&
+ (devices == AUDIO_DEVICE_OUT_SPEAKER)) {
+ sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ ALOGI("%s 24-bit playback on Speaker is allowed ONLY at 48khz. Hence changing sample rate to: %d",
+ __func__, sample_rate);
+ } else {
+ sample_rate = out->sample_rate;
+ }
+
+ ALOGV("%s flags %x, format %x, sample_rate %d, out->bit_width %d",
+ __func__, flags, format, sample_rate, out->bit_width);
audio_extn_utils_update_stream_app_type_cfg(adev->platform,
&adev->streams_output_cfg_list,
- flags, format, out->sample_rate,
+ flags, format, sample_rate,
out->bit_width, &out->app_type_cfg);
if ((out->usecase == USECASE_AUDIO_PLAYBACK_PRIMARY) ||
(flags & AUDIO_OUTPUT_FLAG_PRIMARY)) {
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index cf26f68..7fa4859 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -2546,8 +2546,10 @@
}
// 16 bit playbacks is allowed through 16 bit/48 khz backend only
- if (16 == bit_width)
+ if ((16 == bit_width) ||
+ ((24 == bit_width) && (SND_DEVICE_OUT_SPEAKER == usecase->devices))) {
sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+ }
// Force routing if the expected bitwdith or samplerate
// is not same as current backend comfiguration
if ((bit_width != adev->cur_codec_backend_bit_width) ||