Merge "hal: Fix alignement of of buffer sent to DSP"
diff --git a/hal/Android.mk b/hal/Android.mk
index 9d78ddc..54ac70f 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -52,7 +52,7 @@
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
-ifneq ($(filter msm8994 msm8992,$(TARGET_BOARD_PLATFORM)),)
+ifneq ($(filter msm8994 msm8992 thulium,$(TARGET_BOARD_PLATFORM)),)
LOCAL_SRC_FILES += edid.c
endif
@@ -160,6 +160,10 @@
LOCAL_CFLAGS += -DQTI_FLAC_DECODER
endif
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_PCM_OFFLOAD_24)),true)
+ LOCAL_CFLAGS += -DPCM_OFFLOAD_ENABLED_24
+endif
+
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DEV_ARBI)),true)
LOCAL_CFLAGS += -DDEV_ARBI_ENABLED
LOCAL_SRC_FILES += audio_extn/dev_arbi.c
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 7bfa607..643c593 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -75,9 +75,12 @@
#define AUDIO_OFFLOAD_CODEC_FLAC_MAX_BLK_SIZE "music_offload_flac_max_blk_size"
#define AUDIO_OFFLOAD_CODEC_FLAC_MIN_FRAME_SIZE "music_offload_flac_min_frame_size"
#define AUDIO_OFFLOAD_CODEC_FLAC_MAX_FRAME_SIZE "music_offload_flac_max_frame_size"
-#define PCM_OUTPUT_BIT_WIDTH (CODEC_BACKEND_DEFAULT_BIT_WIDTH)
-#else
+#endif
+
+#ifdef PCM_OFFLOAD_ENABLED_24
#define PCM_OUTPUT_BIT_WIDTH (config->offload_info.bit_width)
+#else
+#define PCM_OUTPUT_BIT_WIDTH (CODEC_BACKEND_DEFAULT_BIT_WIDTH)
#endif
#define MAX_LENGTH_MIXER_CONTROL_IN_INT (128)
diff --git a/hal/audio_extn/dev_arbi.c b/hal/audio_extn/dev_arbi.c
index d3c01c5..d7ab5ff 100644
--- a/hal/audio_extn/dev_arbi.c
+++ b/hal/audio_extn/dev_arbi.c
@@ -128,7 +128,13 @@
{
static snd_aud_dev_mapping_t snd_aud_dev_map[] = {
{SND_DEVICE_OUT_HANDSET, AUDIO_DEVICE_OUT_EARPIECE},
- {SND_DEVICE_OUT_VOICE_HANDSET, AUDIO_DEVICE_OUT_EARPIECE}
+ {SND_DEVICE_OUT_VOICE_HANDSET, AUDIO_DEVICE_OUT_EARPIECE},
+ {SND_DEVICE_OUT_SPEAKER, AUDIO_DEVICE_OUT_SPEAKER},
+ {SND_DEVICE_OUT_VOICE_SPEAKER, AUDIO_DEVICE_OUT_SPEAKER},
+ {SND_DEVICE_OUT_HEADPHONES, AUDIO_DEVICE_OUT_WIRED_HEADPHONE},
+ {SND_DEVICE_OUT_VOICE_HEADPHONES, AUDIO_DEVICE_OUT_WIRED_HEADPHONE},
+ {SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES,
+ AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_WIRED_HEADPHONE}
};
audio_devices_t aud_device = AUDIO_DEVICE_NONE;
diff --git a/hal/audio_extn/dts_eagle.c b/hal/audio_extn/dts_eagle.c
index b4bbb9f..7fa2c9b 100644
--- a/hal/audio_extn/dts_eagle.c
+++ b/hal/audio_extn/dts_eagle.c
@@ -136,7 +136,19 @@
}
static void fade_node(bool need_data) {
- int fd = creat(FADE_NOTIFY_FILE, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH), n = 0;
+ char prop[PROPERTY_VALUE_MAX];
+ property_get("use.dts_eagle", prop, "0");
+ if (strncmp("true", prop, sizeof("true")))
+ return;
+ int fd, n = 0;
+ if ((fd = open(FADE_NOTIFY_FILE, O_RDONLY)) < 0)
+ ALOGV("No fade node");
+ else {
+ ALOGV("fade node exists, remove it before creating it");
+ close(fd);
+ remove(FADE_NOTIFY_FILE);
+ }
+ fd = creat(FADE_NOTIFY_FILE, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
char *str = need_data ? "need" : "have";
if (fd < 0) {
ALOGE("DTS_EAGLE_HAL (%s): opening fade notifier node failed", __func__);
@@ -301,7 +313,6 @@
if (fade_in > 0 && fade_in_data && fade_out_data)
fade_node(false);
}
-
ALOGV("DTS_EAGLE_HAL (%s): exit", __func__);
}
@@ -427,10 +438,9 @@
chmod(path, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH);
ALOGV("DTS_EAGLE_NODE_STREAM (%s): opening state notifier node successful", __func__);
close(fd);
+ if (!fade_in_data || !fade_out_data)
+ fade_node(true);
}
-
- if (!fade_in_data || !fade_out_data)
- fade_node(true);
}
void audio_extn_dts_notify_playback_state(int stream_out, int has_video, int sample_rate,
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 038c8e7..7bd410f 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -75,7 +75,7 @@
#define COMPRESS_OFFLOAD_NUM_FRAGMENTS 4
/* ToDo: Check and update a proper value in msec */
-#define COMPRESS_OFFLOAD_PLAYBACK_LATENCY 96
+#define COMPRESS_OFFLOAD_PLAYBACK_LATENCY 50
#define COMPRESS_PLAYBACK_VOLUME_MAX 0x2000
#define PROXY_OPEN_RETRY_COUNT 100
@@ -465,8 +465,10 @@
adev->snd_dev_ref_cnt[snd_device]--;
return -EINVAL;
}
+ audio_extn_dev_arbi_acquire(snd_device);
if (audio_extn_spkr_prot_start_processing(snd_device)) {
ALOGE("%s: spkr_start_processing failed", __func__);
+ audio_extn_dev_arbi_release(snd_device);
return -EINVAL;
}
} else {
@@ -532,9 +534,9 @@
audio_extn_spkr_prot_stop_processing(snd_device);
} else {
audio_route_reset_and_update_path(adev->audio_route, device_name);
- audio_extn_dev_arbi_release(snd_device);
}
+ audio_extn_dev_arbi_release(snd_device);
audio_extn_sound_trigger_update_device_status(snd_device,
ST_EVENT_SND_DEVICE_FREE);
audio_extn_listen_update_device_status(snd_device,
@@ -1546,6 +1548,14 @@
if (out->offload_callback)
compress_nonblock(out->compr, out->non_blocking);
+ /* Since small bufs uses blocking writes, a write will be blocked
+ for the default max poll time (20s) in the event of an SSR.
+ Reduce the poll time to observe and deal with SSR faster.
+ */
+ if (out->use_small_bufs) {
+ compress_set_max_poll_wait(out->compr, 1000);
+ }
+
audio_extn_dts_create_state_notifier_node(out->usecase);
audio_extn_dts_notify_playback_state(out->usecase, 0, out->sample_rate,
popcount(out->channel_mask),
@@ -1995,13 +2005,7 @@
uint32_t latency = 0;
if (is_offload_usecase(out->usecase)) {
- if (out->use_small_bufs == true)
- latency = ((out->compr_config.fragments *
- out->compr_config.fragment_size * 1000) /
- (out->sample_rate * out->compr_config.codec->ch_in *
- audio_bytes_per_sample(out->format)));
- else
- latency = COMPRESS_OFFLOAD_PLAYBACK_LATENCY;
+ latency = COMPRESS_OFFLOAD_PLAYBACK_LATENCY;
} else {
latency = (out->config.period_count * out->config.period_size * 1000) /
(out->config.rate);
@@ -2093,7 +2097,7 @@
}
if (is_offload_usecase(out->usecase)) {
- ALOGD("copl(%p): writing buffer (%zu bytes) to compress device", out, bytes);
+ ALOGVV("copl(%p): writing buffer (%zu bytes) to compress device", out, bytes);
if (out->send_new_metadata) {
ALOGD("copl(%p):send new gapless metadata", out);
compress_set_gapless_metadata(out->compr, &out->gapless_mdata);
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 00626f8..d04513d 100755
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -204,6 +204,10 @@
INCALL_MUSIC_UPLINK2_PCM_DEVICE},
[USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1},
[USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE},
+ [USECASE_AUDIO_PLAYBACK_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
+ AFE_PROXY_RECORD_PCM_DEVICE},
+ [USECASE_AUDIO_RECORD_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
+ AFE_PROXY_RECORD_PCM_DEVICE},
};
/* Array to store sound devices */
@@ -225,6 +229,7 @@
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
+ [SND_DEVICE_OUT_VOICE_TX] = "voice-tx",
[SND_DEVICE_OUT_AFE_PROXY] = "afe-proxy",
[SND_DEVICE_OUT_USB_HEADSET] = "usb-headphones",
[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = "speaker-and-usb-headphones",
@@ -279,6 +284,7 @@
[SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
[SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
+ [SND_DEVICE_IN_VOICE_RX] = "voice-rx",
[SND_DEVICE_IN_USB_HEADSET_MIC] = "usb-headset-mic",
[SND_DEVICE_IN_CAPTURE_FM] = "capture-fm",
[SND_DEVICE_IN_AANC_HANDSET_MIC] = "aanc-handset-mic",
@@ -316,6 +322,7 @@
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
+ [SND_DEVICE_OUT_VOICE_TX] = 45,
[SND_DEVICE_OUT_AFE_PROXY] = 0,
[SND_DEVICE_OUT_USB_HEADSET] = 45,
[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 14,
@@ -369,6 +376,7 @@
[SND_DEVICE_IN_VOICE_REC_MIC_NS] = 107,
[SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 34,
[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 41,
+ [SND_DEVICE_IN_VOICE_RX] = 44,
[SND_DEVICE_IN_USB_HEADSET_MIC] = 44,
[SND_DEVICE_IN_CAPTURE_FM] = 0,
[SND_DEVICE_IN_AANC_HANDSET_MIC] = 104,
@@ -412,6 +420,7 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TX)},
{TO_NAME_INDEX(SND_DEVICE_OUT_AFE_PROXY)},
{TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET)},
@@ -464,6 +473,7 @@
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_NS)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_STEREO)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_RX)},
{TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_FM)},
{TO_NAME_INDEX(SND_DEVICE_IN_AANC_HANDSET_MIC)},
@@ -687,7 +697,6 @@
ALOGV("EC reference is already disabled : %d", my_data->ec_ref_enabled);
}
}
-
ALOGV("Setting EC Reference: %d", enable);
}
@@ -1207,6 +1216,10 @@
strlcat(mixer_path, " hdmi", MIXER_PATH_MAX_LENGTH);
else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI)
strlcat(mixer_path, " speaker-and-hdmi", MIXER_PATH_MAX_LENGTH);
+ else if (snd_device == SND_DEVICE_OUT_VOICE_TX)
+ strlcat(mixer_path, " afe-proxy", MIXER_PATH_MAX_LENGTH);
+ else if (snd_device == SND_DEVICE_IN_VOICE_RX)
+ strlcat(mixer_path, " afe-proxy", MIXER_PATH_MAX_LENGTH);
else if (snd_device == SND_DEVICE_OUT_AFE_PROXY)
strlcat(mixer_path, " afe-proxy", MIXER_PATH_MAX_LENGTH);
else if (snd_device == SND_DEVICE_OUT_USB_HEADSET)
@@ -1732,7 +1745,9 @@
snd_device = SND_DEVICE_OUT_ANC_HANDSET;
else
snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
- }
+ } else if (devices & AUDIO_DEVICE_OUT_TELEPHONY_TX)
+ snd_device = SND_DEVICE_OUT_VOICE_TX;
+
if (snd_device != SND_DEVICE_NONE) {
goto exit;
}
@@ -1904,7 +1919,8 @@
if (audio_extn_hfp_is_active(adev))
platform_set_echo_reference(adev->platform, true);
}
- }
+ } else if (out_device & AUDIO_DEVICE_OUT_TELEPHONY_TX)
+ snd_device = SND_DEVICE_IN_VOICE_RX;
} else if (source == AUDIO_SOURCE_CAMCORDER) {
if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
in_device & AUDIO_DEVICE_IN_BACK_MIC) {
diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h
index 6c81b95..1cdb013 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -68,6 +68,7 @@
SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES,
SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES,
SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET,
+ SND_DEVICE_OUT_VOICE_TX,
SND_DEVICE_OUT_AFE_PROXY,
SND_DEVICE_OUT_USB_HEADSET,
SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET,
@@ -128,6 +129,7 @@
SND_DEVICE_IN_VOICE_REC_MIC_NS,
SND_DEVICE_IN_VOICE_REC_DMIC_STEREO,
SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE,
+ SND_DEVICE_IN_VOICE_RX,
SND_DEVICE_IN_USB_HEADSET_MIC,
SND_DEVICE_IN_CAPTURE_FM,
SND_DEVICE_IN_AANC_HANDSET_MIC,
@@ -220,6 +222,9 @@
#define QCHAT_CALL_PCM_DEVICE 14
#define VOWLAN_CALL_PCM_DEVICE 16
+#define AFE_PROXY_PLAYBACK_PCM_DEVICE 7
+#define AFE_PROXY_RECORD_PCM_DEVICE 8
+
#define LIB_CSD_CLIENT "libcsd-client.so"
/* CSD-CLIENT related functions */
typedef int (*init_t)();
diff --git a/hal/voice_extn/compress_voip.c b/hal/voice_extn/compress_voip.c
index 26636db..e8ba1f9 100644
--- a/hal/voice_extn/compress_voip.c
+++ b/hal/voice_extn/compress_voip.c
@@ -328,6 +328,7 @@
int i, ret = 0;
struct audio_usecase *uc_info;
int pcm_dev_rx_id, pcm_dev_tx_id;
+ unsigned int flags = PCM_OUT | PCM_MONOTONIC;
ALOGD("%s: enter", __func__);
@@ -368,7 +369,7 @@
__func__, adev->snd_card, pcm_dev_rx_id);
voip_data.pcm_rx = pcm_open(adev->snd_card,
pcm_dev_rx_id,
- PCM_OUT, voip_config);
+ flags, voip_config);
if (voip_data.pcm_rx && !pcm_is_ready(voip_data.pcm_rx)) {
ALOGE("%s: %s", __func__, pcm_get_error(voip_data.pcm_rx));
pcm_close(voip_data.pcm_rx);
diff --git a/visualizer/Android.mk b/visualizer/Android.mk
index 393eec3..87d4987 100644
--- a/visualizer/Android.mk
+++ b/visualizer/Android.mk
@@ -24,6 +24,7 @@
LOCAL_SHARED_LIBRARIES := \
libcutils \
liblog \
+ libdl \
libtinyalsa
LOCAL_MODULE_RELATIVE_PATH := soundfx
diff --git a/visualizer/offload_visualizer.c b/visualizer/offload_visualizer.c
index 94c44a5..d363b77 100644
--- a/visualizer/offload_visualizer.c
+++ b/visualizer/offload_visualizer.c
@@ -22,6 +22,7 @@
#include <string.h>
#include <time.h>
#include <sys/prctl.h>
+#include <dlfcn.h>
#include <cutils/list.h>
#include <cutils/log.h>
@@ -29,6 +30,15 @@
#include <tinyalsa/asoundlib.h>
#include <audio_effects/effect_visualizer.h>
+#define LIB_ACDB_LOADER "libacdbloader.so"
+#define ACDB_DEV_TYPE_OUT 1
+#define AFE_PROXY_ACDB_ID 45
+
+static void* acdb_handle;
+
+typedef void (*acdb_send_audio_cal_t)(int, int);
+
+acdb_send_audio_cal_t acdb_send_audio_cal;
enum {
EFFECT_STATE_UNINITIALIZED,
@@ -294,6 +304,9 @@
const char *proxy_ctl_name = "AFE_PCM_RX Audio Mixer MultiMedia4";
struct mixer_ctl *ctl;
+ if (value && acdb_send_audio_cal)
+ acdb_send_audio_cal(AFE_PROXY_ACDB_ID, ACDB_DEV_TYPE_OUT);
+
ctl = mixer_get_ctl_by_name(mixer, proxy_ctl_name);
if (ctl == NULL) {
ALOGW("%s: could not get %s ctl", __func__, proxy_ctl_name);
@@ -614,6 +627,19 @@
set_config(context, &context->config);
+ if (acdb_handle == NULL) {
+ acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
+ if (acdb_handle == NULL) {
+ ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
+ } else {
+ acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(acdb_handle,
+ "acdb_loader_send_audio_cal");
+ if (!acdb_send_audio_cal)
+ ALOGE("%s: Could not find the symbol acdb_send_audio_cal from %s",
+ __func__, LIB_ACDB_LOADER);
+ }
+ }
+
return 0;
}