hal: Increase ffv process thread priority
Set ffv process thread priority to ANDROID_PRIORITY_AUDIO
and set affinity for ffv reader thread to achieve better performance.
CRs-Fixed: 2405913
Change-Id: I04743f705cc78ed5f9378a6a566ec4c485f5dcb0
diff --git a/hal/Android.mk b/hal/Android.mk
index cfe4a07..245679b 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -453,6 +453,7 @@
LOCAL_SRC_FILES += audio_extn/ffv.c
endif
+LOCAL_CFLAGS += -D_GNU_SOURCE
LOCAL_CFLAGS += -Wall -Werror
LOCAL_COPY_HEADERS_TO := mm-audio
diff --git a/hal/Makefile.am b/hal/Makefile.am
index 995622d..07397aa 100644
--- a/hal/Makefile.am
+++ b/hal/Makefile.am
@@ -228,5 +228,5 @@
audio_primary_default_la_CFLAGS += -DINT_MAX=0x7fffffff
audio_primary_default_la_CFLAGS += -D__unused=__attribute__\(\(__unused__\)\)
audio_primary_default_la_CFLAGS += -DLINUX_ENABLED $(TARGET_CFLAGS) -DAUDIO_EXTN_FORMATS_ENABLED
-audio_primary_default_la_CFLAGS += -DNDEBUG
+audio_primary_default_la_CFLAGS += -DNDEBUG -D_GNU_SOURCE
audio_primary_default_la_LDFLAGS = -module -shared -avoid-version
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 38d0b6f..7945168 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -46,7 +46,7 @@
#include <cutils/properties.h>
#include <cutils/log.h>
#include <unistd.h>
-
+#include <sched.h>
#include "audio_hw.h"
#include "audio_extn.h"
#include "audio_defs.h"
@@ -605,6 +605,25 @@
}
#endif
+/* Affine AHAL thread to CPU core */
+void audio_extn_set_cpu_affinity()
+{
+ cpu_set_t cpuset;
+ struct sched_param sched_param;
+ int policy = SCHED_FIFO, rc = 0;
+
+ ALOGV("%s: Set CPU affinity for read thread", __func__);
+ CPU_ZERO(&cpuset);
+ if (sched_setaffinity(0, sizeof(cpuset), &cpuset) != 0)
+ ALOGE("%s: CPU Affinity allocation failed for Capture thread",
+ __func__);
+
+ sched_param.sched_priority = sched_get_priority_min(policy);
+ rc = sched_setscheduler(0, policy, &sched_param);
+ if (rc != 0)
+ ALOGE("%s: Failed to set realtime priority", __func__);
+}
+
#ifdef HIFI_AUDIO_ENABLED
bool audio_extn_is_hifi_audio_enabled(void)
{
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 1e4b8ba..f0c027b 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -1142,4 +1142,5 @@
void audio_extn_set_custom_mtmx_params(struct audio_device *adev,
struct audio_usecase *usecase,
bool enable);
+void audio_extn_set_cpu_affinity();
#endif /* AUDIO_EXTN_H */
diff --git a/hal/audio_extn/ffv.c b/hal/audio_extn/ffv.c
index fac40c5..f0309c2 100644
--- a/hal/audio_extn/ffv.c
+++ b/hal/audio_extn/ffv.c
@@ -46,6 +46,7 @@
#include <pthread.h>
#include <sys/resource.h>
#include <unistd.h>
+#include <system/thread_defs.h>
#include "audio_hw.h"
#include "audio_extn.h"
@@ -602,6 +603,7 @@
int param_size = 0;
FfvStatusType status_type;
int ret = 0;
+ ffv_quadrx_use_dwnmix_param_t quad_downmix;
ALOGV("%s: entry", __func__);
/* notify library to reset AEC during each start */
@@ -623,6 +625,20 @@
return -ENOMEM;
}
+ if (in_snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD) {
+ quad_downmix.quadrx_dwnmix_enable = true;
+ ALOGD("%s: set param for 4 ch ec, handle %p", __func__, ffvmod.handle);
+ status_type = ffv_set_param_fn(ffvmod.handle,
+ (char *)&quad_downmix,
+ FFV_QUADRX_USE_DWNMIX_PARAM,
+ sizeof(ffv_quadrx_use_dwnmix_param_t));
+ if (status_type) {
+ ALOGE("%s: ERROR. ffv_set_param_fn for quad channel ec ref %d",
+ __func__, status_type);
+ return -EINVAL;
+ }
+ }
+
pthread_mutex_lock(&ffvmod.init_lock);
uc_info_tx->id = USECASE_AUDIO_EC_REF_LOOPBACK;
uc_info_tx->type = PCM_CAPTURE;
@@ -778,6 +794,8 @@
return status;
}
}
+ audio_extn_set_cpu_affinity();
+ setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO);
ffvmod.capture_started = true;
}