From 533bb72620933eddd232d41e171ab70ea0807e34 Mon Sep 17 00:00:00 2001 From: Ravi Kumar Alamanda Date: Wed, 23 Sep 2015 13:47:03 -0700 Subject: hal: Add support for perf lock management Acquire perf lock before starting an input or output stream to optimize the cold start latency. Bug: 22537514 Cherry-pick of CAF commit: 390bcf3edac3e0e38cf8163d1297f1b669117fe0 Change-Id: Iacedde8ff8531f8857e516e2671acd62197556a0 --- hal/Android.mk | 3 ++ hal/audio_extn/audio_extn.c | 102 ++++++++++++++++++++++++++++++++++++++++++++ hal/audio_extn/audio_extn.h | 9 ++++ hal/audio_hw.c | 13 ++++++ 4 files changed, 127 insertions(+) create mode 100644 hal/audio_extn/audio_extn.c diff --git a/hal/Android.mk b/hal/Android.mk index 0bb29b59..45b2cd96 100644 --- a/hal/Android.mk +++ b/hal/Android.mk @@ -21,10 +21,12 @@ endif ifneq ($(filter msm8992,$(TARGET_BOARD_PLATFORM)),) LOCAL_CFLAGS := -DPLATFORM_MSM8994 LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4" + LOCAL_CFLAGS += -DKPI_OPTIMIZE_ENABLED endif ifneq ($(filter msm8994,$(TARGET_BOARD_PLATFORM)),) LOCAL_CFLAGS := -DPLATFORM_MSM8994 LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4" + LOCAL_CFLAGS += -DKPI_OPTIMIZE_ENABLED endif endif @@ -33,6 +35,7 @@ LOCAL_SRC_FILES := \ voice.c \ platform_info.c \ audio_extn/ext_speaker.c \ + audio_extn/audio_extn.c \ $(AUDIO_PLATFORM)/platform.c LOCAL_SHARED_LIBRARIES := \ diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c new file mode 100644 index 00000000..dcc9baf6 --- /dev/null +++ b/hal/audio_extn/audio_extn.c @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "audio_hw_extn" +/*#define LOG_NDEBUG 0*/ +#define LOG_NDDEBUG 0 + +#include +#include +#include +#include +#include + +#include "audio_hw.h" +#include "audio_extn.h" +#include "platform.h" +#include "platform_api.h" + + + +#ifdef KPI_OPTIMIZE_ENABLED +typedef int (*perf_lock_acquire_t)(int, int, int*, int); +typedef int (*perf_lock_release_t)(int); + +static void *qcopt_handle; +static perf_lock_acquire_t perf_lock_acq; +static perf_lock_release_t perf_lock_rel; + +static int perf_lock_handle; +char opt_lib_path[PROPERTY_VALUE_MAX] = {0}; + +int perf_lock_opts[] = {0x101, 0x20E, 0x30E}; + +int audio_extn_perf_lock_init(void) +{ + int ret = 0; + if (qcopt_handle == NULL) { + if (property_get("ro.vendor.extension_library", + opt_lib_path, NULL) <= 0) { + ALOGE("%s: Failed getting perf property", __func__); + ret = -EINVAL; + goto err; + } + if ((qcopt_handle = dlopen(opt_lib_path, RTLD_NOW)) == NULL) { + ALOGE("%s: Failed to open perf handle", __func__); + ret = -EINVAL; + goto err; + } else { + perf_lock_acq = (perf_lock_acquire_t)dlsym(qcopt_handle, + "perf_lock_acq"); + if (perf_lock_acq == NULL) { + ALOGE("%s: Perf lock Acquire NULL", __func__); + ret = -EINVAL; + goto err; + } + perf_lock_rel = (perf_lock_release_t)dlsym(qcopt_handle, + "perf_lock_rel"); + if (perf_lock_rel == NULL) { + ALOGE("%s: Perf lock Release NULL", __func__); + ret = -EINVAL; + goto err; + } + ALOGD("%s: Perf lock handles Success", __func__); + } + } +err: + return ret; +} + +void audio_extn_perf_lock_acquire(void) +{ + if (perf_lock_acq) { + perf_lock_handle = perf_lock_acq(perf_lock_handle, 0, perf_lock_opts, 3); + ALOGV("%s: Perf lock acquired", __func__); + } else { + ALOGE("%s: Perf lock acquire error", __func__); + } +} + +void audio_extn_perf_lock_release(void) +{ + if (perf_lock_rel && perf_lock_handle) { + perf_lock_rel(perf_lock_handle); + ALOGV("%s: Perf lock released", __func__); + } else { + ALOGE("%s: Perf lock release error", __func__); + } +} +#endif /* KPI_OPTIMIZE_ENABLED */ diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h index b99378e8..c518faa7 100644 --- a/hal/audio_extn/audio_extn.h +++ b/hal/audio_extn/audio_extn.h @@ -101,4 +101,13 @@ void audio_extn_dsm_feedback_enable(struct audio_device *adev, void audio_extn_hwdep_cal_send(int snd_card, void *acdb_handle); #endif +#ifndef KPI_OPTIMIZE_ENABLED +#define audio_extn_perf_lock_init() (0) +#define audio_extn_perf_lock_acquire() (0) +#define audio_extn_perf_lock_release() (0) +#else +int audio_extn_perf_lock_init(void); +void audio_extn_perf_lock_acquire(void); +void audio_extn_perf_lock_release(void); +#endif /* KPI_OPTIMIZE_ENABLED */ #endif /* AUDIO_EXTN_H */ diff --git a/hal/audio_hw.c b/hal/audio_hw.c index ca86d75b..3b8d6e08 100644 --- a/hal/audio_hw.c +++ b/hal/audio_hw.c @@ -801,6 +801,9 @@ int start_input_stream(struct stream_in *in) uc_info->out_snd_device = SND_DEVICE_NONE; list_add_tail(&adev->usecase_list, &uc_info->list); + + audio_extn_perf_lock_acquire(); + select_devices(adev, in->usecase); ALOGV("%s: Opening PCM device card_id(%d) device_id(%d), channels %d", @@ -835,12 +838,16 @@ int start_input_stream(struct stream_in *in) ALOGV("%s: pcm_prepare start", __func__); pcm_prepare(in->pcm); + + audio_extn_perf_lock_release(); + ALOGV("%s: exit", __func__); return ret; error_open: stop_input_stream(in); + audio_extn_perf_lock_release(); error_config: adev->active_input = NULL; @@ -1153,6 +1160,8 @@ int start_output_stream(struct stream_out *out) list_add_tail(&adev->usecase_list, &uc_info->list); + audio_extn_perf_lock_acquire(); + select_devices(adev, out->usecase); audio_extn_extspk_update(adev->extspk); @@ -1209,9 +1218,11 @@ int start_output_stream(struct stream_out *out) if (adev->offload_effects_start_output != NULL) adev->offload_effects_start_output(out->handle, out->pcm_device_id); } + audio_extn_perf_lock_release(); ALOGV("%s: exit", __func__); return 0; error_open: + audio_extn_perf_lock_release(); stop_output_stream(out); error_config: return ret; @@ -2977,6 +2988,8 @@ static int adev_open(const hw_module_t *module, const char *name, if (adev->adm_init) adev->adm_data = adev->adm_init(); + audio_extn_perf_lock_init(); + ALOGV("%s: exit", __func__); return 0; } -- cgit v1.2.3