hal: enable low latency support for sample rates other than 48 KHz
Enable low latency playback and record support for 8, 16, 24 and
32 KHz sample rates.
Change-Id: I29114b0ef9ac0d41f455573b92bed777cf9cbe51
Signed-off-by: Kogara Naveen Kumar <quic_nkogara@quicinc.com>
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
old mode 100755
new mode 100644
index 756faf5..9a4a848
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -111,6 +111,11 @@
#define VNDK_FWK_LIB_PATH "/vendor/lib/libqti_vndfwk_detect.so"
#endif
+/* 24 KHz ECNR support */
+#define ECNS_USE_CASE_ACDB_DEV_ID 95
+#define ECNS_UNSUPPORTED_CAPTURE_SAMPLE_RATE_FOR_ADM 24000
+#define ECNS_SUPPORTED_CAPTURE_SAMPLE_RATE_FOR_ADM 48000
+
typedef struct vndkfwk_s {
void *lib_handle;
int (*isVendorEnhancedFwk)(void);
@@ -750,6 +755,12 @@
app_type_cfg->app_type = platform_get_default_app_type_v2(platform, PCM_CAPTURE);
app_type_cfg->sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
app_type_cfg->bit_width = 16;
+ if ((flags & AUDIO_INPUT_FLAG_TIMESTAMP) == 0 &&
+ (flags & AUDIO_INPUT_FLAG_COMPRESS) == 0 &&
+ (flags & AUDIO_INPUT_FLAG_FAST) != 0) {
+ // Support low latency record for different sample rates
+ app_type_cfg->sample_rate = sample_rate;
+ }
}
void audio_extn_utils_update_stream_output_app_type_cfg(void *platform,
@@ -838,6 +849,11 @@
app_type_cfg->app_type = platform_get_default_app_type(platform);
app_type_cfg->sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
app_type_cfg->bit_width = 16;
+ if (compare_device_type(devices, AUDIO_DEVICE_OUT_BUS) && (flags &
+ (audio_output_flags_t)AUDIO_OUTPUT_FLAG_FAST)) {
+ // Support low latency playback for different sample rates
+ app_type_cfg->sample_rate = sample_rate;
+ }
}
static bool audio_is_this_native_usecase(struct audio_usecase *uc)
@@ -1304,6 +1320,7 @@
{
char value[PROPERTY_VALUE_MAX] = {0};
int sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ int acdb_dev_id;
if ((usecase->type == PCM_PLAYBACK) && (usecase->stream.out != NULL)) {
property_get("vendor.audio.playback.mch.downsample",value,"");
@@ -1342,8 +1359,12 @@
usecase->stream.out->sample_rate == OUTPUT_SAMPLING_RATE_44100) ||
(usecase->stream.out->sample_rate < OUTPUT_SAMPLING_RATE_44100)) ||
(compare_device_type(&usecase->stream.out->device_list,AUDIO_DEVICE_OUT_SPEAKER))) {
- /* Reset to default if no native stream is active or default device is speaker*/
- usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ if (!((compare_device_type(&usecase->device_list, AUDIO_DEVICE_OUT_BUS)) && ((usecase->stream.out->flags &
+ (audio_output_flags_t)AUDIO_OUTPUT_FLAG_SYS_NOTIFICATION) || (usecase->stream.out->flags &
+ (audio_output_flags_t)AUDIO_OUTPUT_FLAG_PHONE)))) {
+ /* Reset to default if no native stream is active or default device is speaker*/
+ usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ }
}
audio_extn_btsco_get_sample_rate(snd_device, &usecase->stream.out->app_type_cfg.sample_rate);
sample_rate = usecase->stream.out->app_type_cfg.sample_rate;
@@ -1378,6 +1399,15 @@
else
sample_rate = SAMPLE_RATE_8000;
}
+
+ /* ECNR module in DSP does not support 24 KHz sample rate. As a workaround,
+ run ADM at 48 KHz when ECNR is enabled in ACDB topology (e.g. device id = 95)
+ */
+ acdb_dev_id = platform_get_snd_device_acdb_id(snd_device);
+ if (sample_rate == ECNS_UNSUPPORTED_CAPTURE_SAMPLE_RATE_FOR_ADM && acdb_dev_id == ECNS_USE_CASE_ACDB_DEV_ID) {
+ sample_rate = ECNS_SUPPORTED_CAPTURE_SAMPLE_RATE_FOR_ADM;
+ ALOGD("%s: update sample rate from 24K to 48K to support ECNR in PCM_CAPTURE, sample_rate=%d",__func__,sample_rate);
+ }
} else if (usecase->type == TRANSCODE_LOOPBACK_RX) {
sample_rate = usecase->stream.inout->out_config.sample_rate;
}