hal: Add support for audio effects in DSP for tunnel mode playback
Add support to enable or disable audio post processing effects
in DSP for tunnel mode playback.
Change-Id: I4e0b01ab4ae29d4b1c7986f2a6146e18e8bce2c1
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index c1ba5d3..12faa88 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1042,9 +1042,12 @@
return -EINVAL;
}
- if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD &&
- adev->visualizer_stop_output != NULL)
- adev->visualizer_stop_output(out->handle);
+ if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
+ if (adev->visualizer_stop_output != NULL)
+ adev->visualizer_stop_output(out->handle, out->pcm_device_id);
+ if (adev->offload_effects_stop_output != NULL)
+ adev->offload_effects_stop_output(out->handle, out->pcm_device_id);
+ }
/* 1. Get and set stream specific mixer controls */
disable_audio_route(adev, uc_info, true);
@@ -1122,7 +1125,9 @@
compress_nonblock(out->compr, out->non_blocking);
if (adev->visualizer_start_output != NULL)
- adev->visualizer_start_output(out->handle);
+ adev->visualizer_start_output(out->handle, out->pcm_device_id);
+ if (adev->offload_effects_start_output != NULL)
+ adev->offload_effects_start_output(out->handle, out->pcm_device_id);
}
ALOGV("%s: exit", __func__);
return 0;
@@ -1468,10 +1473,14 @@
out->muted = (left == 0.0f);
return 0;
} else if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
- const char *mixer_ctl_name = "Compress Playback Volume";
+ char mixer_ctl_name[128];
struct audio_device *adev = out->dev;
struct mixer_ctl *ctl;
+ int pcm_device_id = platform_get_pcm_device_id(out->usecase,
+ PCM_PLAYBACK);
+ snprintf(mixer_ctl_name, sizeof(mixer_ctl_name),
+ "Compress Playback %d Volume", pcm_device_id);
ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
if (!ctl) {
ALOGE("%s: Could not get ctl for mixer cmd - %s",
@@ -2574,15 +2583,32 @@
} else {
ALOGV("%s: DLOPEN successful for %s", __func__, VISUALIZER_LIBRARY_PATH);
adev->visualizer_start_output =
- (int (*)(audio_io_handle_t))dlsym(adev->visualizer_lib,
+ (int (*)(audio_io_handle_t, int))dlsym(adev->visualizer_lib,
"visualizer_hal_start_output");
adev->visualizer_stop_output =
- (int (*)(audio_io_handle_t))dlsym(adev->visualizer_lib,
+ (int (*)(audio_io_handle_t, int))dlsym(adev->visualizer_lib,
"visualizer_hal_stop_output");
}
}
audio_extn_listen_init(adev, SOUND_CARD);
+ if (access(OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH, R_OK) == 0) {
+ adev->offload_effects_lib = dlopen(OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH, RTLD_NOW);
+ if (adev->offload_effects_lib == NULL) {
+ ALOGE("%s: DLOPEN failed for %s", __func__,
+ OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH);
+ } else {
+ ALOGV("%s: DLOPEN successful for %s", __func__,
+ OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH);
+ adev->offload_effects_start_output =
+ (int (*)(audio_io_handle_t, int))dlsym(adev->offload_effects_lib,
+ "offload_effects_bundle_hal_start_output");
+ adev->offload_effects_stop_output =
+ (int (*)(audio_io_handle_t, int))dlsym(adev->offload_effects_lib,
+ "offload_effects_bundle_hal_stop_output");
+ }
+ }
+
*device = &adev->device.common;
audio_device_ref_count++;
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 6ff6f40..2555e26 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -29,6 +29,7 @@
#include "voice.h"
#define VISUALIZER_LIBRARY_PATH "/system/lib/soundfx/libqcomvisualizer.so"
+#define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/system/lib/soundfx/libqcompostprocbundle.so"
/* Flags used to initialize acdb_settings variable that goes to ACDB library */
#define DMIC_FLAG 0x00000002
@@ -218,8 +219,11 @@
void *platform;
void *visualizer_lib;
- int (*visualizer_start_output)(audio_io_handle_t);
- int (*visualizer_stop_output)(audio_io_handle_t);
+ int (*visualizer_start_output)(audio_io_handle_t, int);
+ int (*visualizer_stop_output)(audio_io_handle_t, int);
+ void *offload_effects_lib;
+ int (*offload_effects_start_output)(audio_io_handle_t, int);
+ int (*offload_effects_stop_output)(audio_io_handle_t, int);
};
int select_devices(struct audio_device *adev,