Merge 27d5ebe71fbc0c6414de98909c298d71c4dcfb37 on remote branch
Change-Id: Ifd0322e2c9ad14df614a990e725141c88fbd6e3e
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 22c2306..6b0d2df 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -221,6 +221,7 @@
#define audio_extn_sound_trigger_set_parameters(adev, parms) (0)
#define audio_extn_sound_trigger_check_and_get_session(in) (0)
#define audio_extn_sound_trigger_stop_lab(in) (0)
+#define audio_extn_sound_trigger_read(in, buffer, bytes) (0)
#else
enum st_event_type {
@@ -241,6 +242,8 @@
struct str_parms *parms);
void audio_extn_sound_trigger_check_and_get_session(struct stream_in *in);
void audio_extn_sound_trigger_stop_lab(struct stream_in *in);
+int audio_extn_sound_trigger_read(struct stream_in *in, void *buffer,
+ size_t bytes);
#endif
#ifndef AUXPCM_BT_ENABLED
diff --git a/hal/audio_extn/soundtrigger.c b/hal/audio_extn/soundtrigger.c
index 9051334..3c16c88 100644
--- a/hal/audio_extn/soundtrigger.c
+++ b/hal/audio_extn/soundtrigger.c
@@ -30,6 +30,7 @@
/* #define LOG_NDEBUG 0 */
#define LOG_NDDEBUG 0
+#include <errno.h>
#include <stdbool.h>
#include <stdlib.h>
#include <dlfcn.h>
@@ -64,7 +65,7 @@
{
struct sound_trigger_info *st_ses_info = NULL;
struct listnode *node;
- ALOGD("%s: list %d capture_handle %d", __func__,
+ ALOGV("%s: list empty %d capture_handle %d", __func__,
list_empty(&st_dev->st_ses_list), capture_handle);
list_for_each(node, &st_dev->st_ses_list) {
st_ses_info = node_to_item(node, struct sound_trigger_info , list);
@@ -128,6 +129,45 @@
return status;
}
+int audio_extn_sound_trigger_read(struct stream_in *in, void *buffer,
+ size_t bytes)
+{
+ int ret = -1;
+ struct sound_trigger_info *st_info = NULL;
+ audio_event_info_t event;
+
+ if (!st_dev)
+ return ret;
+
+ if (!in->is_st_session_active) {
+ ALOGE(" %s: Sound trigger is not active", __func__);
+ goto exit;
+ }
+ if(in->standby)
+ in->standby = false;
+
+ pthread_mutex_lock(&st_dev->lock);
+ st_info = get_sound_trigger_info(in->capture_handle);
+ pthread_mutex_unlock(&st_dev->lock);
+ if (st_info) {
+ event.u.aud_info.ses_info = &st_info->st_ses;
+ event.u.aud_info.buf = buffer;
+ event.u.aud_info.num_bytes = bytes;
+ ret = st_dev->st_callback(AUDIO_EVENT_READ_SAMPLES, &event);
+ }
+
+exit:
+ if (ret) {
+ if (-ENETRESET == ret)
+ in->is_st_session_active = false;
+ memset(buffer, 0, bytes);
+ ALOGV("%s: read failed status %d - sleep", __func__, ret);
+ usleep((bytes * 1000000) / (audio_stream_in_frame_size((struct audio_stream_in *)in) *
+ in->config.rate));
+ }
+ return ret;
+}
+
void audio_extn_sound_trigger_stop_lab(struct stream_in *in)
{
int status = 0;
diff --git a/hal/audio_extn/spkr_protection.c b/hal/audio_extn/spkr_protection.c
index e5201cc..391a501 100644
--- a/hal/audio_extn/spkr_protection.c
+++ b/hal/audio_extn/spkr_protection.c
@@ -214,7 +214,7 @@
snprintf(name, MAX_PATH, TZ_TYPE, tzn);
ALOGD("Opening %s\n", name);
read_line_from_file(name, buf, sizeof(buf));
- buf[strlen(sensor_name)] = '\0';
+ buf[strlen(buf)] = '\0';
if (!strcmp(buf, sensor_name)) {
found = 1;
break;
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index d0d4dac..409533c 100755
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -870,7 +870,6 @@
usecase->stream.out);
if (usecase->stream.out == adev->primary_output &&
adev->active_input &&
- adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION &&
out_snd_device != usecase->out_snd_device) {
select_devices(adev, adev->active_input->usecase);
}
@@ -2610,31 +2609,29 @@
pthread_mutex_lock(&in->lock);
- if (in->pcm) {
- if(SND_CARD_STATE_OFFLINE == snd_scard_state) {
- ALOGD(" %s: sound card is not active/SSR state", __func__);
- ret= -EIO;;
- goto exit;
- } else {
- if (in->is_st_session && !in->is_st_session_active) {
- ALOGD(" %s: Sound trigger is not active/SSR", __func__);
- ret= -EIO;;
- goto exit;
- }
- }
+ if (in->is_st_session) {
+ ALOGVV(" %s: reading on st session bytes=%zu", __func__, bytes);
+ /* Read from sound trigger HAL */
+ audio_extn_sound_trigger_read(in, buffer, bytes);
+ pthread_mutex_unlock(&in->lock);
+ return bytes;
+ }
+
+ if (in->pcm && (SND_CARD_STATE_OFFLINE == snd_scard_state)) {
+ ALOGD(" %s: sound card is not active/SSR state", __func__);
+ ret= -EIO;;
+ goto exit;
}
if (in->standby) {
- if (!in->is_st_session) {
- pthread_mutex_lock(&adev->lock);
- if (in->usecase == USECASE_COMPRESS_VOIP_CALL)
- ret = voice_extn_compress_voip_start_input_stream(in);
- else
- ret = start_input_stream(in);
- pthread_mutex_unlock(&adev->lock);
- if (ret != 0) {
- goto exit;
- }
+ pthread_mutex_lock(&adev->lock);
+ if (in->usecase == USECASE_COMPRESS_VOIP_CALL)
+ ret = voice_extn_compress_voip_start_input_stream(in);
+ else
+ ret = start_input_stream(in);
+ pthread_mutex_unlock(&adev->lock);
+ if (ret != 0) {
+ goto exit;
}
in->standby = 0;
}
@@ -2664,17 +2661,9 @@
exit:
/* ToDo: There may be a corner case when SSR happens back to back during
start/stop. Need to post different error to handle that. */
- if (-ENETRESET == ret) {
- /* CPE SSR results in kernel returning ENETRESET for sound trigger
- session reading on LAB data. In this case do not set sound card state
- offline, instead mark this sound trigger session inactive to avoid
- further reading of LAB data from CPE driver. Marking the session
- inactive handles both CPE and ADSP SSR for sound trigger session */
- if (!in->is_st_session)
- set_snd_card_state(adev,SND_CARD_STATE_OFFLINE);
- else
- in->is_st_session_active = false;
- }
+ if (-ENETRESET == ret)
+ set_snd_card_state(adev,SND_CARD_STATE_OFFLINE);
+
pthread_mutex_unlock(&in->lock);
if (ret != 0) {
@@ -3393,7 +3382,7 @@
}
static int adev_open_input_stream(struct audio_hw_device *dev,
- audio_io_handle_t handle __unused,
+ audio_io_handle_t handle,
audio_devices_t devices,
struct audio_config *config,
struct audio_stream_in **stream_in,
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index bb71405..72f4685 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -38,7 +38,7 @@
#include "sound/msmcal-hwdep.h"
#include <dirent.h>
#define SOUND_TRIGGER_DEVICE_HANDSET_MONO_LOW_POWER_ACDB_ID (100)
-
+#define MAX_MIXER_XML_PATH 100
#define MIXER_XML_PATH "/system/etc/mixer_paths.xml"
#define MIXER_XML_PATH_MTP "/system/etc/mixer_paths_mtp.xml"
#define MIXER_XML_PATH_SBC "/system/etc/mixer_paths_sbc.xml"
@@ -58,6 +58,7 @@
#define MIXER_XML_PATH_WCD9306 "/system/etc/mixer_paths_wcd9306.xml"
#define MIXER_XML_PATH_WCD9330 "/system/etc/mixer_paths_wcd9330.xml"
#define MIXER_XML_PATH_WCD9335 "/system/etc/mixer_paths_wcd9335.xml"
+#define MIXER_XML_PATH_WCD9326 "/system/etc/mixer_paths_wcd9326.xml"
#define MIXER_XML_PATH_SKUN "/system/etc/mixer_paths_qrd_skun.xml"
#define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml"
#define PLATFORM_INFO_XML_PATH_EXTCODEC "/system/etc/audio_platform_info_extcodec.xml"
@@ -745,6 +746,8 @@
sizeof("msm8952-tomtom-snd-card")) ||
!strncmp(snd_card_name, "msm8976-tasha-snd-card",
sizeof("msm8976-tasha-snd-card")) ||
+ !strncmp(snd_card_name, "msm8976-tashalite-snd-card",
+ sizeof("msm8976-tashalite-snd-card")) ||
!strncmp(snd_card_name, "msm8976-tasha-skun-snd-card",
sizeof("msm8976-tasha-skun-snd-card")))
{
@@ -850,6 +853,14 @@
msm_be_id_array_len =
sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
+ } else if (!strncmp(snd_card_name, "msm8976-tashalite-snd-card",
+ sizeof("msm8976-tashalite-snd-card"))) {
+ strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9326,
+ MAX_MIXER_XML_PATH);
+ msm_device_to_be_id = msm_device_to_be_id_external_codec;
+ msm_be_id_array_len =
+ sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
+
} else if (!strncmp(snd_card_name, "msm8976-tasha-skun-snd-card",
sizeof("msm8976-tasha-skun-snd-card"))) {
strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUN,
@@ -1283,7 +1294,7 @@
struct platform_data *my_data = NULL;
int retry_num = 0, snd_card_num = 0, key = 0;
const char *snd_card_name;
- char mixer_xml_path[100],ffspEnable[PROPERTY_VALUE_MAX];
+ char mixer_xml_path[MAX_MIXER_XML_PATH],ffspEnable[PROPERTY_VALUE_MAX];
char *cvd_version = NULL;
const char *mixer_ctl_name = "Set HPX ActiveBe";
struct mixer_ctl *ctl = NULL;
@@ -1799,7 +1810,7 @@
{
if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
- return DEFAULT_OUTPUT_SAMPLING_RATE;
+ return CODEC_BACKEND_DEFAULT_BIT_WIDTH;
}
return backend_bit_width_table[snd_device];
}
@@ -3566,6 +3577,8 @@
sizeof("msm8952-tomtom-snd-card")) ||
!strncmp(snd_card_name, "msm8976-tasha-snd-card",
sizeof("msm8976-tasha-snd-card")) ||
+ !strncmp(snd_card_name, "msm8976-tashalite-snd-card",
+ sizeof("msm8976-tashalite-snd-card")) ||
!strncmp(snd_card_name, "msm8976-tasha-skun-snd-card",
sizeof("msm8976-tasha-skun-snd-card")))
{
@@ -3770,6 +3783,16 @@
sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
}
}
+
+ /*
+ * Sample rate greater than 48K is only supported by external codecs on
+ * specific devices e.g. Headphones, reset the sample rate to
+ * default value if not external codec.
+ */
+ if (!is_external_codec)
+ sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+
+
ALOGI("%s Codec selected backend: %d updated bit width: %d and sample rate: %d",
__func__, backend_idx, bit_width, sample_rate);
// Force routing if the expected bitwdith or samplerate
diff --git a/post_proc/EffectsHwAcc.cpp b/post_proc/EffectsHwAcc.cpp
index 0e4c55a..e11cfc7 100644
--- a/post_proc/EffectsHwAcc.cpp
+++ b/post_proc/EffectsHwAcc.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-15, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -72,7 +72,7 @@
size_t reqOutputFrameCount = pBuffer->frameCount;
int ret = 0;
- if (mTrackBufferProvider != NULL) {
+ if (mTrackInputBufferProvider != NULL) {
while (1) {
reqInputFrameCount = ((reqOutputFrameCount *
mEffectsConfig.inputCfg.samplingRate)/
@@ -89,7 +89,7 @@
popcount(mEffectsConfig.inputCfg.channels);
while (frameCount) {
pBuffer->frameCount = frameCount;
- ret = mTrackBufferProvider->getNextBuffer(pBuffer, pts);
+ ret = mTrackInputBufferProvider->getNextBuffer(pBuffer, pts);
if (ret == OK) {
int bytesInBuffer = pBuffer->frameCount *
FRAME_SIZE(mEffectsConfig.inputCfg.format) *
@@ -98,7 +98,7 @@
frameCount -= pBuffer->frameCount;
mInputBufferFrameCountOffset += pBuffer->frameCount;
offset += bytesInBuffer;
- mTrackBufferProvider->releaseBuffer(pBuffer);
+ mTrackInputBufferProvider->releaseBuffer(pBuffer);
} else
break;
}
@@ -133,7 +133,7 @@
AudioBufferProvider::Buffer *pBuffer)
{
ALOGV("EffBufferProvider::releaseBuffer()");
- if (this->mTrackBufferProvider != NULL) {
+ if (this->mTrackInputBufferProvider != NULL) {
pBuffer->frameCount = 0;
pBuffer->raw = NULL;
} else {
@@ -189,7 +189,8 @@
mEnabled = false;
}
-status_t EffectsHwAcc::prepareEffects(AudioBufferProvider **bufferProvider,
+status_t EffectsHwAcc::prepareEffects(AudioBufferProvider **inputBufferProvider,
+ AudioBufferProvider **bufferProvider,
int sessionId,
audio_channel_mask_t channelMask,
int frameCount)
@@ -316,10 +317,11 @@
goto noEffectsForActiveTrack;
}
// initialization successful:
- // - keep track of the real buffer provider in case it was set before
+ // - keep backup of track's buffer provider
pHwAccbp->mTrackBufferProvider = *bufferProvider;
- // - we'll use the hw acc effect integrated inside this
- // track's buffer provider, and we'll use it as the track's buffer provider
+ pHwAccbp->mTrackInputBufferProvider = *inputBufferProvider;
+ // - we'll use the hw acc effect integrated inside this track's buffer provider,
+ // and we'll use it as the track's buffer provider
mBufferProvider = pHwAccbp;
*bufferProvider = pHwAccbp;
@@ -332,14 +334,14 @@
return NO_INIT;
}
-void EffectsHwAcc::setBufferProvider(AudioBufferProvider **bufferProvider,
+void EffectsHwAcc::setBufferProvider(AudioBufferProvider **trackInputBufferProvider,
AudioBufferProvider **trackBufferProvider)
{
ALOGV("setBufferProvider");
if (mBufferProvider &&
- (mBufferProvider->mTrackBufferProvider != *bufferProvider)) {
+ (mBufferProvider->mTrackInputBufferProvider != *trackInputBufferProvider)) {
*trackBufferProvider = mBufferProvider;
- mBufferProvider->mTrackBufferProvider = *bufferProvider;
+ mBufferProvider->mTrackInputBufferProvider = *trackInputBufferProvider;
}
}
diff --git a/post_proc/EffectsHwAcc.h b/post_proc/EffectsHwAcc.h
index 6420a9b..0452f57 100644
--- a/post_proc/EffectsHwAcc.h
+++ b/post_proc/EffectsHwAcc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-15, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -43,10 +43,11 @@
virtual void setSampleRate(uint32_t inpSR, uint32_t outSR);
virtual void unprepareEffects(AudioBufferProvider **trackBufferProvider);
- virtual status_t prepareEffects(AudioBufferProvider **trackBufferProvider,
+ virtual status_t prepareEffects(AudioBufferProvider **trackInputBufferProvider,
+ AudioBufferProvider **trackBufferProvider,
int sessionId, audio_channel_mask_t channelMask,
int frameCount);
- virtual void setBufferProvider(AudioBufferProvider **bufferProvider,
+ virtual void setBufferProvider(AudioBufferProvider **trackInputbufferProvider,
AudioBufferProvider **trackBufferProvider);
#ifdef HW_ACC_HPX
virtual void updateHPXState(uint32_t state);
@@ -62,6 +63,7 @@
virtual status_t getNextBuffer(Buffer* buffer, int64_t pts);
virtual void releaseBuffer(Buffer* buffer);
+ AudioBufferProvider* mTrackInputBufferProvider;
AudioBufferProvider* mTrackBufferProvider;
effect_handle_t mEffectsHandle;
effect_config_t mEffectsConfig;
diff --git a/post_proc/reverb.c b/post_proc/reverb.c
index b256e53..450ce81 100644
--- a/post_proc/reverb.c
+++ b/post_proc/reverb.c
@@ -281,17 +281,19 @@
context->next_preset = preset;
offload_reverb_set_preset(&(context->offload_reverb), preset);
- enable = (preset == REVERB_PRESET_NONE) ? false: true;
- offload_reverb_set_enable_flag(&(context->offload_reverb), enable);
+ if (context->enabled_by_client) {
+ enable = (preset == REVERB_PRESET_NONE) ? false: true;
+ offload_reverb_set_enable_flag(&(context->offload_reverb), enable);
- if (context->ctl)
- offload_reverb_send_params(context->ctl, &context->offload_reverb,
+ if (context->ctl)
+ offload_reverb_send_params(context->ctl, &context->offload_reverb,
OFFLOAD_SEND_REVERB_ENABLE_FLAG |
OFFLOAD_SEND_REVERB_PRESET);
- if (context->hw_acc_fd > 0)
- hw_acc_reverb_send_params(context->hw_acc_fd, &context->offload_reverb,
+ if (context->hw_acc_fd > 0)
+ hw_acc_reverb_send_params(context->hw_acc_fd, &context->offload_reverb,
OFFLOAD_SEND_REVERB_ENABLE_FLAG |
OFFLOAD_SEND_REVERB_PRESET);
+ }
}
void reverb_set_all_properties(reverb_context_t *context,
@@ -600,6 +602,7 @@
set_config(context, &context->config);
reverb_ctxt->hw_acc_fd = -1;
+ reverb_ctxt->enabled_by_client = false;
memset(&(reverb_ctxt->reverb_settings), 0, sizeof(reverb_settings_t));
memset(&(reverb_ctxt->offload_reverb), 0, sizeof(struct reverb_params));
@@ -615,6 +618,16 @@
reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
ALOGV("%s: ctxt %p", __func__, reverb_ctxt);
+ reverb_ctxt->enabled_by_client = true;
+
+ /* REVERB_PRESET_NONE is equivalent to disabled state,
+ * But support for this state is not provided in DSP.
+ * Hence, do not set enable flag, if in peset mode with preset "NONE".
+ * Effect would be enabled when valid preset is set.
+ */
+ if ((reverb_ctxt->preset == true) &&
+ (reverb_ctxt->next_preset == REVERB_PRESET_NONE))
+ return 0;
if (!offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb)))
offload_reverb_set_enable_flag(&(reverb_ctxt->offload_reverb), true);
@@ -626,6 +639,7 @@
reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
ALOGV("%s: ctxt %p", __func__, reverb_ctxt);
+ reverb_ctxt->enabled_by_client = false;
if (offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb))) {
offload_reverb_set_enable_flag(&(reverb_ctxt->offload_reverb), false);
if (reverb_ctxt->ctl)
diff --git a/post_proc/reverb.h b/post_proc/reverb.h
index 991151e..1a5ca0d 100644
--- a/post_proc/reverb.h
+++ b/post_proc/reverb.h
@@ -48,6 +48,7 @@
// Offload vars
struct mixer_ctl *ctl;
int hw_acc_fd;
+ bool enabled_by_client;
bool auxiliary;
bool preset;
uint16_t cur_preset;
diff --git a/post_proc/virtualizer.c b/post_proc/virtualizer.c
index 2748568..3874f0b 100644
--- a/post_proc/virtualizer.c
+++ b/post_proc/virtualizer.c
@@ -56,6 +56,15 @@
ALOGV("%s: ctxt %p, strength: %d", __func__, context, strength);
context->strength = strength;
+ /*
+ * Zero strength is not equivalent to disable state as down mix
+ * is still happening for multichannel inputs.
+ * For better user experience, explicitly disable virtualizer module
+ * when strength is 0.
+ */
+ offload_virtualizer_set_enable_flag(&(context->offload_virt),
+ ((strength > 0) && !(context->temp_disabled)) ?
+ true : false);
offload_virtualizer_set_strength(&(context->offload_virt), strength);
if (context->ctl)
offload_virtualizer_send_params(context->ctl, &context->offload_virt,