audiopolicy: Fixed build error
am: 7c378a5525
* commit '7c378a5525a36bd5820a16f9dc12ff4b38aeeb6b':
audiopolicy: Fixed build error
diff --git a/Android.mk b/Android.mk
index 450d9a3..f856e9e 100644
--- a/Android.mk
+++ b/Android.mk
@@ -1,20 +1,22 @@
-ifneq ($(filter msm8960 msm8226 msm8x26 msm8974 msm8x74 msm8x84 msm8084 msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),)
+# TODO: Find a better way to separate build configs for ADP vs non-ADP devices
+ifneq ($(TARGET_BOARD_AUTO),true)
+ ifneq ($(filter msm8960 msm8226 msm8x26 msm8974 msm8x74 msm8x84 msm8084 msm8992 msm8994 msm8996,$(TARGET_BOARD_PLATFORM)),)
-MY_LOCAL_PATH := $(call my-dir)
+ MY_LOCAL_PATH := $(call my-dir)
-ifeq ($(BOARD_USES_LEGACY_ALSA_AUDIO),true)
-include $(MY_LOCAL_PATH)/legacy/Android.mk
-else
-include $(MY_LOCAL_PATH)/hal/Android.mk
-include $(MY_LOCAL_PATH)/voice_processing/Android.mk
-include $(MY_LOCAL_PATH)/visualizer/Android.mk
-include $(MY_LOCAL_PATH)/post_proc/Android.mk
-endif
+ ifeq ($(BOARD_USES_LEGACY_ALSA_AUDIO),true)
+ include $(MY_LOCAL_PATH)/legacy/Android.mk
+ else
+ include $(MY_LOCAL_PATH)/hal/Android.mk
+ include $(MY_LOCAL_PATH)/voice_processing/Android.mk
+ include $(MY_LOCAL_PATH)/visualizer/Android.mk
+ include $(MY_LOCAL_PATH)/post_proc/Android.mk
+ endif
+ else
+ ifneq ($(filter msm8909 ,$(TARGET_BOARD_PLATFORM)),)
+ #For msm8909 target
+ include $(call all-named-subdir-makefiles,msm8909)
+ endif
-else
-ifneq ($(filter msm8909 ,$(TARGET_BOARD_PLATFORM)),)
-#For msm8909 target
-include $(call all-named-subdir-makefiles,msm8909)
-
-endif
+ endif
endif
diff --git a/hal/Android.mk b/hal/Android.mk
index 35dcbb9..d55e37a 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -10,10 +10,11 @@
ifneq ($(filter msm8960,$(TARGET_BOARD_PLATFORM)),)
LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="2"
endif
-ifneq ($(filter msm8974 msm8226 msm8084 msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),)
+ifneq ($(filter msm8974 msm8226 msm8084 msm8992 msm8994 msm8996,$(TARGET_BOARD_PLATFORM)),)
# B-family platform uses msm8974 code base
AUDIO_PLATFORM = msm8974
ifneq ($(filter msm8974,$(TARGET_BOARD_PLATFORM)),)
+ LOCAL_CFLAGS := -DPLATFORM_MSM8974
LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="2"
endif
ifneq ($(filter msm8226,$(TARGET_BOARD_PLATFORM)),)
@@ -34,6 +35,12 @@
LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4"
LOCAL_CFLAGS += -DKPI_OPTIMIZE_ENABLED
endif
+ifneq ($(filter msm8996,$(TARGET_BOARD_PLATFORM)),)
+ LOCAL_CFLAGS := -DPLATFORM_MSM8996
+ LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4"
+ LOCAL_CFLAGS += -DKPI_OPTIMIZE_ENABLED
+endif
+
endif
LOCAL_SRC_FILES := \
@@ -98,7 +105,7 @@
LOCAL_SRC_FILES += audio_extn/dsm_feedback.c
endif
-ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),)
+ifneq ($(filter msm8992 msm8994 msm8996,$(TARGET_BOARD_PLATFORM)),)
# push codec/mad calibration to HW dep node
# applicable to msm8992/8994 or newer platforms
LOCAL_CFLAGS += -DHWDEP_CAL_ENABLED
diff --git a/hal/audio_extn/ext_speaker.c b/hal/audio_extn/ext_speaker.c
index 55cbb4c..cb8cfc1 100644
--- a/hal/audio_extn/ext_speaker.c
+++ b/hal/audio_extn/ext_speaker.c
@@ -22,11 +22,7 @@
#include <audio_hw.h>
#include <dlfcn.h>
-#ifdef __LP64__
- #define LIB_SPEAKER_BUNDLE "/system/lib64/soundfx/libspeakerbundle.so"
-#else
- #define LIB_SPEAKER_BUNDLE "/system/lib/soundfx/libspeakerbundle.so"
-#endif
+#define LIB_SPEAKER_BUNDLE "soundfx/libspeakerbundle.so"
typedef void (*set_mode_t)(int);
typedef void (*set_speaker_on_t)(bool);
diff --git a/hal/audio_extn/soundtrigger.c b/hal/audio_extn/soundtrigger.c
index b5475a1..9909d50 100644
--- a/hal/audio_extn/soundtrigger.c
+++ b/hal/audio_extn/soundtrigger.c
@@ -31,6 +31,8 @@
#define XSTR(x) STR(x)
#define STR(x) #x
+#define SOUND_TRIGGER_LIBRARY_PATH "hw/sound_trigger.primary.%s.so"
+
struct sound_trigger_info {
struct sound_trigger_session_info st_ses;
bool lab_stopped;
@@ -193,7 +195,7 @@
in->channel_mask = audio_channel_in_mask_from_count(in->config.channels);
in->is_st_session = true;
in->is_st_session_active = true;
- ALOGD("%s: capture_handle %d is sound trigger", __func__, in->capture_handle);
+ ALOGV("%s: capture_handle %d is sound trigger", __func__, in->capture_handle);
break;
}
}
@@ -222,7 +224,7 @@
return;
}
- ALOGI("%s: device 0x%x of type %d for Event %d",
+ ALOGV("%s: device 0x%x of type %d for Event %d",
__func__, snd_device, device_type, event);
if (device_type == PCM_CAPTURE) {
switch(event) {
@@ -293,7 +295,7 @@
char sound_trigger_lib[100];
void *lib_handle;
- ALOGI("%s: Enter", __func__);
+ ALOGV("%s: Enter", __func__);
st_dev = (struct sound_trigger_audio_device*)
calloc(1, sizeof(struct sound_trigger_audio_device));
@@ -303,7 +305,7 @@
}
snprintf(sound_trigger_lib, sizeof(sound_trigger_lib),
- "/system/vendor/lib/hw/sound_trigger.primary.%s.so",
+ SOUND_TRIGGER_LIBRARY_PATH,
XSTR(SOUND_TRIGGER_PLATFORM_NAME));
st_dev->lib_handle = dlopen(sound_trigger_lib, RTLD_NOW);
@@ -314,7 +316,7 @@
status = -EINVAL;
goto cleanup;
}
- ALOGI("%s: DLOPEN successful for %s", __func__, sound_trigger_lib);
+ ALOGV("%s: DLOPEN successful for %s", __func__, sound_trigger_lib);
st_dev->st_callback = (sound_trigger_hw_call_back_t)
dlsym(st_dev->lib_handle, "sound_trigger_hw_call_back");
@@ -341,7 +343,7 @@
void audio_extn_sound_trigger_deinit(struct audio_device *adev)
{
- ALOGI("%s: Enter", __func__);
+ ALOGV("%s: Enter", __func__);
if (st_dev && (st_dev->adev == adev) && st_dev->lib_handle) {
dlclose(st_dev->lib_handle);
free(st_dev);
diff --git a/hal/audio_extn/spkr_protection.c b/hal/audio_extn/spkr_protection.c
index 4d8b233..8afb0dc 100644
--- a/hal/audio_extn/spkr_protection.c
+++ b/hal/audio_extn/spkr_protection.c
@@ -33,6 +33,8 @@
#include "audio_extn.h"
#include <linux/msm_audio_calibration.h>
+#define THERMAL_CLIENT_LIBRARY_PATH "libthermalclient.so"
+
#ifdef SPKR_PROT_ENABLED
/*Range of spkr temparatures -30C to 80C*/
@@ -710,7 +712,7 @@
pthread_mutex_init(&handle.mutex_spkr_prot, NULL);
pthread_mutex_init(&handle.spkr_calib_cancelack_mutex, NULL);
pthread_mutex_init(&handle.spkr_prot_thermalsync_mutex, NULL);
- handle.thermal_handle = dlopen("/vendor/lib/libthermalclient.so",
+ handle.thermal_handle = dlopen(THERMAL_CLIENT_LIBRARY_PATH,
RTLD_NOW);
if (!handle.thermal_handle) {
ALOGE("%s: DLOPEN for thermal client failed", __func__);
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 6747b05..a4ea34c 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2014 The Android Open Source Project
+ * Copyright (C) 2013-2016 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.
@@ -172,6 +172,8 @@
[USECASE_VOLTE_CALL] = "volte-call",
[USECASE_QCHAT_CALL] = "qchat-call",
[USECASE_VOWLAN_CALL] = "vowlan-call",
+ [USECASE_VOICEMMODE1_CALL] = "voicemmode1-call",
+ [USECASE_VOICEMMODE2_CALL] = "voicemmode2-call",
[USECASE_AUDIO_SPKR_CALIB_RX] = "spkr-rx-calib",
[USECASE_AUDIO_SPKR_CALIB_TX] = "spkr-vi-record",
@@ -270,7 +272,7 @@
strcpy(mixer_path, use_case_table[usecase->id]);
platform_add_backend_name(adev->platform, mixer_path, snd_device);
- ALOGD("%s: apply and update mixer path: %s", __func__, mixer_path);
+ ALOGV("%s: apply and update mixer path: %s", __func__, mixer_path);
audio_route_apply_and_update_path(adev->audio_route, mixer_path);
ALOGV("%s: exit", __func__);
@@ -293,7 +295,7 @@
snd_device = usecase->out_snd_device;
strcpy(mixer_path, use_case_table[usecase->id]);
platform_add_backend_name(adev->platform, mixer_path, snd_device);
- ALOGD("%s: reset and update mixer path: %s", __func__, mixer_path);
+ ALOGV("%s: reset and update mixer path: %s", __func__, mixer_path);
audio_route_reset_and_update_path(adev->audio_route, mixer_path);
ALOGV("%s: exit", __func__);
@@ -349,7 +351,7 @@
platform_set_speaker_gain_in_combo(adev, snd_device, true);
} else {
const char * dev_path = platform_get_snd_device_name(snd_device);
- ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, dev_path);
+ ALOGV("%s: snd_device(%d: %s)", __func__, snd_device, dev_path);
audio_route_apply_and_update_path(adev->audio_route, dev_path);
}
@@ -374,7 +376,7 @@
adev->snd_dev_ref_cnt[snd_device]--;
if (adev->snd_dev_ref_cnt[snd_device] == 0) {
const char * dev_path = platform_get_snd_device_name(snd_device);
- ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, dev_path);
+ ALOGV("%s: snd_device(%d: %s)", __func__, snd_device, dev_path);
audio_extn_dsm_feedback_enable(adev, snd_device, false);
if ((snd_device == SND_DEVICE_OUT_SPEAKER ||
@@ -674,7 +676,7 @@
return 0;
}
- ALOGD("%s: out_snd_device(%d: %s) in_snd_device(%d: %s)", __func__,
+ ALOGV("%s: out_snd_device(%d: %s) in_snd_device(%d: %s)", __func__,
out_snd_device, platform_get_snd_device_name(out_snd_device),
in_snd_device, platform_get_snd_device_name(in_snd_device));
@@ -817,7 +819,7 @@
ALOGV("%s: Opening PCM device card_id(%d) device_id(%d), channels %d",
__func__, adev->snd_card, in->pcm_device_id, in->config.channels);
- unsigned int flags = PCM_IN;
+ unsigned int flags = PCM_IN | PCM_MONOTONIC;
unsigned int pcm_open_retry_count = 0;
if (in->usecase == USECASE_AUDIO_RECORD_AFE_PROXY) {
@@ -844,8 +846,14 @@
break;
}
- ALOGV("%s: pcm_prepare start", __func__);
- pcm_prepare(in->pcm);
+ ALOGV("%s: pcm_prepare", __func__);
+ ret = pcm_prepare(in->pcm);
+ if (ret < 0) {
+ ALOGE("%s: pcm_prepare returned %d", __func__, ret);
+ pcm_close(in->pcm);
+ in->pcm = NULL;
+ goto error_open;
+ }
audio_extn_perf_lock_release();
@@ -859,7 +867,7 @@
error_config:
adev->active_input = NULL;
- ALOGD("%s: exit: status(%d)", __func__, ret);
+ ALOGV("%s: exit: status(%d)", __func__, ret);
return ret;
}
@@ -1036,12 +1044,12 @@
* max channels of remaining use cases.
*/
if (usecase->id == USECASE_VOICE_CALL) {
- ALOGD("%s: voice call is active, no change in HDMI channels",
+ ALOGV("%s: voice call is active, no change in HDMI channels",
__func__);
ret = false;
break;
} else if (usecase->id == USECASE_AUDIO_PLAYBACK_MULTI_CH) {
- ALOGD("%s: multi channel playback is active, "
+ ALOGV("%s: multi channel playback is active, "
"no change in HDMI channels", __func__);
ret = false;
break;
@@ -1062,7 +1070,7 @@
return 0;
if (channels == adev->cur_hdmi_channels) {
- ALOGD("%s: Requested channels are same as current", __func__);
+ ALOGV("%s: Requested channels are same as current", __func__);
return 0;
}
@@ -1203,10 +1211,16 @@
}
break;
}
- ALOGV("%s: pcm_prepare start", __func__);
- if (pcm_is_ready(out->pcm))
- pcm_prepare(out->pcm);
-
+ ALOGV("%s: pcm_prepare", __func__);
+ if (pcm_is_ready(out->pcm)) {
+ ret = pcm_prepare(out->pcm);
+ if (ret < 0) {
+ ALOGE("%s: pcm_prepare returned %d", __func__, ret);
+ pcm_close(out->pcm);
+ out->pcm = NULL;
+ goto error_open;
+ }
+ }
} else {
out->pcm = NULL;
out->compr = compress_open(adev->snd_card, out->pcm_device_id,
@@ -1431,7 +1445,7 @@
bool select_new_device = false;
int status = 0;
- ALOGD("%s: enter: usecase(%d: %s) kvpairs: %s",
+ ALOGV("%s: enter: usecase(%d: %s) kvpairs: %s",
__func__, out->usecase, use_case_table[out->usecase], kvpairs);
parms = str_parms_create_str(kvpairs);
ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
@@ -1638,13 +1652,28 @@
compress_set_gapless_metadata(out->compr, &out->gapless_mdata);
out->send_new_metadata = 0;
}
+ unsigned int avail;
+ struct timespec tstamp;
+ ret = compress_get_hpointer(out->compr, &avail, &tstamp);
+ /* Do not limit write size if the available frames count is unknown */
+ if (ret != 0) {
+ avail = bytes;
+ }
+ if (avail == 0) {
+ ret = 0;
+ } else {
+ if (avail > bytes) {
+ avail = bytes;
+ }
+ ret = compress_write(out->compr, buffer, avail);
+ ALOGVV("%s: writing buffer (%d bytes) to compress device returned %zd",
+ __func__, avail, ret);
+ }
- ret = compress_write(out->compr, buffer, bytes);
- ALOGVV("%s: writing buffer (%d bytes) to compress device returned %d", __func__, bytes, ret);
if (ret >= 0 && ret < (ssize_t)bytes) {
send_offload_cmd_l(out, OFFLOAD_CMD_WAIT_FOR_BUFFER);
}
- if (!out->playback_started) {
+ if (ret > 0 && !out->playback_started) {
compress_start(out->compr);
out->playback_started = 1;
out->offload_state = OFFLOAD_STATE_PLAYING;
@@ -1695,8 +1724,10 @@
if ((out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) && (dsp_frames != NULL)) {
lock_output_stream(out);
if (out->compr != NULL) {
- compress_get_tstamp(out->compr, (unsigned long *)dsp_frames,
- &out->sample_rate);
+ unsigned long frames = 0;
+ // TODO: check return value
+ compress_get_tstamp(out->compr, &frames, &out->sample_rate);
+ *dsp_frames = (uint32_t)frames;
ALOGVV("%s rendered frames %d sample_rate %d",
__func__, *dsp_frames, out->sample_rate);
}
@@ -1728,13 +1759,14 @@
uint64_t *frames, struct timespec *timestamp)
{
struct stream_out *out = (struct stream_out *)stream;
- int ret = -1;
+ int ret = -EINVAL;
unsigned long dsp_frames;
lock_output_stream(out);
if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
if (out->compr != NULL) {
+ // TODO: check return value
compress_get_tstamp(out->compr, &dsp_frames,
&out->sample_rate);
ALOGVV("%s rendered frames %ld sample_rate %d",
@@ -1892,7 +1924,7 @@
lock_input_stream(in);
if (!in->standby && in->is_st_session) {
- ALOGD("%s: sound trigger pcm stop lab", __func__);
+ ALOGV("%s: sound trigger pcm stop lab", __func__);
audio_extn_sound_trigger_stop_lab(in);
in->standby = true;
}
@@ -2037,6 +2069,10 @@
ALOGV("%s: read failed - sleeping for buffer duration", __func__);
usleep(bytes * 1000000 / audio_stream_in_frame_size(stream) /
in_get_sample_rate(&in->stream.common));
+ memset(buffer, 0, bytes); // clear return data
+ }
+ if (bytes > 0) {
+ in->frames_read += bytes / audio_stream_in_frame_size(stream);
}
return bytes;
}
@@ -2046,6 +2082,29 @@
return 0;
}
+static int in_get_capture_position(const struct audio_stream_in *stream,
+ int64_t *frames, int64_t *time)
+{
+ if (stream == NULL || frames == NULL || time == NULL) {
+ return -EINVAL;
+ }
+ struct stream_in *in = (struct stream_in *)stream;
+ int ret = -ENOSYS;
+
+ lock_input_stream(in);
+ if (in->pcm) {
+ struct timespec timestamp;
+ unsigned int avail;
+ if (pcm_get_htimestamp(in->pcm, &avail, ×tamp) == 0) {
+ *frames = in->frames_read + avail;
+ *time = timestamp.tv_sec * 1000000000LL + timestamp.tv_nsec;
+ ret = 0;
+ }
+ }
+ pthread_mutex_unlock(&in->lock);
+ return ret;
+}
+
static int add_remove_audio_effect(const struct audio_stream *stream,
effect_handle_t effect,
bool enable)
@@ -2150,9 +2209,12 @@
config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
if (config->channel_mask == 0)
config->channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
+ if (config->format == AUDIO_FORMAT_DEFAULT)
+ config->format = AUDIO_FORMAT_PCM_16_BIT;
out->channel_mask = config->channel_mask;
out->sample_rate = config->sample_rate;
+ out->format = config->format;
out->usecase = USECASE_AUDIO_PLAYBACK_MULTI_CH;
out->config = pcm_config_hdmi_multi;
out->config.rate = config->sample_rate;
@@ -2325,7 +2387,7 @@
error_open:
free(out);
*stream_out = NULL;
- ALOGD("%s: exit: ret %d", __func__, ret);
+ ALOGV("%s: exit: ret %d", __func__, ret);
return ret;
}
@@ -2363,7 +2425,7 @@
int ret;
int status = 0;
- ALOGD("%s: enter: %s", __func__, kvpairs);
+ ALOGV("%s: enter: %s", __func__, kvpairs);
pthread_mutex_lock(&adev->lock);
@@ -2492,7 +2554,7 @@
pthread_mutex_lock(&adev->lock);
if (adev->mode != mode) {
- ALOGD("%s: mode %d\n", __func__, mode);
+ ALOGV("%s: mode %d\n", __func__, mode);
adev->mode = mode;
if ((mode == AUDIO_MODE_NORMAL || mode == AUDIO_MODE_IN_COMMUNICATION) &&
voice_is_in_call(adev)) {
@@ -2512,7 +2574,7 @@
int ret;
struct audio_device *adev = (struct audio_device *)dev;
- ALOGD("%s: state %d\n", __func__, state);
+ ALOGV("%s: state %d\n", __func__, state);
pthread_mutex_lock(&adev->lock);
ret = voice_set_mic_mute(adev, state);
adev->mic_muted = state;
@@ -2576,6 +2638,7 @@
in->stream.set_gain = in_set_gain;
in->stream.read = in_read;
in->stream.get_input_frames_lost = in_get_input_frames_lost;
+ in->stream.get_capture_position = in_get_capture_position;
in->device = devices;
in->source = source;
@@ -2584,6 +2647,7 @@
in->channel_mask = config->channel_mask;
in->capture_handle = handle;
in->flags = flags;
+ // in->frames_read = 0;
/* Update config params with the requested sample rate and channels */
if (in->device == AUDIO_DEVICE_IN_TELEPHONY_RX) {
@@ -2770,7 +2834,6 @@
ALOGV("%s: (%s) card %d device %d", __func__,
dir ? "input" : "output", card_id, device_id);
pcm_params_to_string(*pparams, info, ARRAY_SIZE(info));
- ALOGV(info); /* print parameters */
} else {
ALOGV("%s: cannot locate card %d device %d", __func__, card_id, device_id);
}
@@ -2845,7 +2908,7 @@
{
int i, ret;
- ALOGD("%s: enter", __func__);
+ ALOGV("%s: enter", __func__);
if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) return -EINVAL;
pthread_mutex_lock(&adev_init_lock);
if (audio_device_ref_count != 0) {
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 8c07b6d..0fc26ff 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2014 The Android Open Source Project
+ * Copyright (C) 2013-2016 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.
@@ -27,9 +27,9 @@
#include <audio_route/audio_route.h>
#include "voice.h"
-#define VISUALIZER_LIBRARY_PATH "/system/lib/soundfx/libqcomvisualizer.so"
-#define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/system/lib/soundfx/libqcompostprocbundle.so"
-#define ADM_LIBRARY_PATH "/system/vendor/lib/libadm.so"
+#define VISUALIZER_LIBRARY_PATH "soundfx/libqcomvisualizer.so"
+#define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "soundfx/libqcompostprocbundle.so"
+#define ADM_LIBRARY_PATH "libadm.so"
/* Flags used to initialize acdb_settings variable that goes to ACDB library */
#define DMIC_FLAG 0x00000002
@@ -69,13 +69,29 @@
USECASE_AUDIO_RECORD,
USECASE_AUDIO_RECORD_LOW_LATENCY,
- USECASE_VOICE_CALL,
+ /* Voice extension usecases
+ *
+ * Following usecase are specific to voice session names created by
+ * MODEM and APPS on 8992/8994/8084/8974 platforms.
+ */
+ USECASE_VOICE_CALL, /* Usecase setup for voice session on first subscription for DSDS/DSDA */
+ USECASE_VOICE2_CALL, /* Usecase setup for voice session on second subscription for DSDS/DSDA */
+ USECASE_VOLTE_CALL, /* Usecase setup for VoLTE session on first subscription */
+ USECASE_QCHAT_CALL, /* Usecase setup for QCHAT session */
+ USECASE_VOWLAN_CALL, /* Usecase setup for VoWLAN session */
- /* Voice extension usecases */
- USECASE_VOICE2_CALL,
- USECASE_VOLTE_CALL,
- USECASE_QCHAT_CALL,
- USECASE_VOWLAN_CALL,
+ /*
+ * Following usecase are specific to voice session names created by
+ * MODEM and APPS on 8996 platforms.
+ */
+
+ USECASE_VOICEMMODE1_CALL, /* Usecase setup for Voice/VoLTE/VoWLAN sessions on first
+ * subscription for DSDS/DSDA
+ */
+ USECASE_VOICEMMODE2_CALL, /* Usecase setup for voice/VoLTE/VoWLAN sessions on second
+ * subscription for DSDS/DSDA
+ */
+
USECASE_INCALL_REC_UPLINK,
USECASE_INCALL_REC_DOWNLINK,
USECASE_INCALL_REC_UPLINK_AND_DOWNLINK,
@@ -175,6 +191,7 @@
audio_usecase_t usecase;
bool enable_aec;
bool enable_ns;
+ int64_t frames_read; /* total frames read, not cleared when entering standby */
audio_io_handle_t capture_handle;
audio_input_flags_t flags;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index ab836bd..49e6801 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2014 The Android Open Source Project
+ * Copyright (C) 2013-2016 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.
@@ -28,8 +28,11 @@
#include "audio_extn.h"
#include <linux/msm_audio.h>
-#define MIXER_XML_PATH "/system/etc/mixer_paths.xml"
-#define MIXER_XML_PATH_WCD9330 "/system/etc/mixer_paths_wcd9330.xml"
+#define MIXER_XML_DEFAULT_PATH "/system/etc/mixer_paths.xml"
+#define MIXER_XML_BASE_STRING "/system/etc/mixer_paths"
+#define TOMTOM_8226_SND_CARD_NAME "msm8226-tomtom-snd-card"
+#define TOMTOM_MIXER_FILE_SUFFIX "wcd9330"
+
#define LIB_ACDB_LOADER "libacdbloader.so"
#define AUDIO_DATA_BLOCK_MIXER_CTL "HDMI EDID"
#define CVD_VERSION_MIXER_CTL "CVD Version"
@@ -94,7 +97,7 @@
/* Audio calibration related functions */
typedef void (*acdb_deallocate_t)();
-typedef int (*acdb_init_v2_cvd_t)(char *, char *);
+typedef int (*acdb_init_v2_cvd_t)(char *, char *, int);
typedef int (*acdb_init_v2_t)(char *);
typedef int (*acdb_init_t)();
typedef void (*acdb_send_audio_cal_t)(int, int);
@@ -153,6 +156,11 @@
[USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE},
[USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE},
[USECASE_VOWLAN_CALL] = {VOWLAN_CALL_PCM_DEVICE, VOWLAN_CALL_PCM_DEVICE},
+ [USECASE_VOICEMMODE1_CALL] = {VOICEMMODE1_CALL_PCM_DEVICE,
+ VOICEMMODE1_CALL_PCM_DEVICE},
+ [USECASE_VOICEMMODE2_CALL] = {VOICEMMODE2_CALL_PCM_DEVICE,
+ VOICEMMODE2_CALL_PCM_DEVICE},
+
[USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE,
AUDIO_RECORD_PCM_DEVICE},
[USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
@@ -251,6 +259,9 @@
[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
[SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = "headset-mic",
+ [SND_DEVICE_IN_UNPROCESSED_MIC] = "voice-rec-mic",
+ [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = "headset-mic",
+
[SND_DEVICE_IN_VOICE_RX] = "voice-rx",
[SND_DEVICE_IN_THREE_MIC] = "three-mic",
@@ -311,7 +322,7 @@
[SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117,
[SND_DEVICE_IN_SPEAKER_DMIC_STEREO] = 35,
- [SND_DEVICE_IN_HEADSET_MIC] = 8,
+ [SND_DEVICE_IN_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
[SND_DEVICE_IN_HEADSET_MIC_AEC] = ACDB_ID_HEADSET_MIC_AEC,
[SND_DEVICE_IN_HDMI_MIC] = 4,
@@ -326,16 +337,19 @@
[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = 11,
[SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43,
- [SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
+ [SND_DEVICE_IN_VOICE_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
[SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
[SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
[SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
- [SND_DEVICE_IN_VOICE_REC_MIC] = 62,
+ [SND_DEVICE_IN_VOICE_REC_MIC] = ACDB_ID_VOICE_REC_MIC,
[SND_DEVICE_IN_VOICE_REC_MIC_NS] = 113,
[SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 35,
[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 43,
- [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = 8,
+ [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
+
+ [SND_DEVICE_IN_UNPROCESSED_MIC] = ACDB_ID_VOICE_REC_MIC,
+ [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
[SND_DEVICE_IN_VOICE_RX] = 44,
@@ -430,6 +444,9 @@
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_HEADSET_MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC)},
+
{TO_NAME_INDEX(SND_DEVICE_IN_THREE_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_QUAD_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
@@ -472,7 +489,7 @@
int mccmnc;
property_get("gsm.sim.operator.numeric",value,"0");
mccmnc = atoi(value);
- ALOGD("%s: tmus mccmnc %d", __func__, mccmnc);
+ ALOGV("%s: tmus mccmnc %d", __func__, mccmnc);
switch(mccmnc) {
/* TMUS MCC(310), MNC(490, 260, 026) */
case 310490:
@@ -638,7 +655,7 @@
platform_add_backend_name(adev->platform, my_data->ec_ref_mixer_path, snd_device);
}
- ALOGD("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
+ ALOGV("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
}
}
@@ -815,7 +832,7 @@
goto done;
}
- ALOGD("%s: num_modems %d\n", __func__, modems);
+ ALOGV("%s: num_modems %d\n", __func__, modems);
if (modems > 0)
my_data->csd = open_csd_client(false /*is_i2s_ext_modem*/);
@@ -907,11 +924,14 @@
void *platform_init(struct audio_device *adev)
{
char value[PROPERTY_VALUE_MAX];
- struct platform_data *my_data;
- int retry_num = 0, snd_card_num = 0;
- bool dual_mic_config = false;
+ struct platform_data *my_data = NULL;
+ int retry_num = 0, snd_card_num = 0, key = 0, ret = 0;
+ bool dual_mic_config = false, use_default_mixer_path = true;
const char *snd_card_name;
char *cvd_version = NULL;
+ char *snd_internal_name = NULL;
+ char *tmp = NULL;
+ char mixer_xml_file[MIXER_PATH_MAX_LENGTH]= {0};
my_data = calloc(1, sizeof(struct platform_data));
@@ -953,23 +973,51 @@
continue;
}
- ALOGD("%s: snd_card_name: %s", __func__, snd_card_name);
+ if ((snd_internal_name = strtok_r(snd_card_name, "-", &tmp)) != NULL) {
+ /* Get the codec internal name from the sound card name
+ * and form the mixer paths file name dynamically. This
+ * is generic way of picking any codec name based mixer
+ * files in future with no code change. This code
+ * assumes mixer files are formed with format as
+ * mixer_paths_internalcodecname.xml
- if (!strncmp(snd_card_name, "msm8226-tomtom-snd-card",
- sizeof("msm8226-tomtom-snd-card"))) {
- ALOGD("%s: Call MIXER_XML_PATH_WCD9330", __func__);
- adev->audio_route = audio_route_init(snd_card_num,
- MIXER_XML_PATH_WCD9330);
- } else {
- adev->audio_route = audio_route_init(snd_card_num, MIXER_XML_PATH);
+ * If this dynamically read mixer files fails to open then it
+ * falls back to default mixer file i.e mixer_paths.xml. This is
+ * done to preserve backward compatibility but not mandatory as
+ * long as the mixer files are named as per above assumption.
+ */
+
+ if ((snd_internal_name = strtok_r(NULL, "-", &tmp)) != NULL) {
+ // need to carryforward old file name
+ if (!strncmp(snd_card_name, TOMTOM_8226_SND_CARD_NAME,
+ sizeof(TOMTOM_8226_SND_CARD_NAME))) {
+ snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
+ MIXER_XML_BASE_STRING, TOMTOM_MIXER_FILE_SUFFIX );
+ } else {
+ snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
+ MIXER_XML_BASE_STRING, snd_internal_name);
+ }
+
+ if (F_OK == access(mixer_xml_file, 0)) {
+ use_default_mixer_path = false;
+ }
+ }
}
+ if (use_default_mixer_path) {
+ memset(mixer_xml_file, 0, sizeof(mixer_xml_file));
+ strlcpy(mixer_xml_file, MIXER_XML_DEFAULT_PATH, MIXER_PATH_MAX_LENGTH);
+ }
+
+ ALOGD("%s: Loading mixer file: %s", __func__, mixer_xml_file);
+ adev->audio_route = audio_route_init(snd_card_num, mixer_xml_file);
+
if (!adev->audio_route) {
ALOGE("%s: Failed to init audio route controls, aborting.", __func__);
goto init_failed;
}
adev->snd_card = snd_card_num;
- ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
+ ALOGV("%s: Opened sound card:%d", __func__, snd_card_num);
break;
}
@@ -1084,7 +1132,7 @@
ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s",
__func__, LIB_ACDB_LOADER);
-#if defined (PLATFORM_MSM8994)
+#if defined (PLATFORM_MSM8994) || (PLATFORM_MSM8996)
acdb_init_v2_cvd_t acdb_init;
acdb_init = (acdb_init_v2_cvd_t)dlsym(my_data->acdb_handle,
"acdb_loader_init_v2");
@@ -1098,7 +1146,7 @@
if (!cvd_version)
ALOGE("failed to allocate cvd_version");
else
- acdb_init((char *)snd_card_name, cvd_version);
+ acdb_init((char *)snd_card_name, cvd_version, 0);
free(cvd_version);
#elif defined (PLATFORM_MSM8084)
acdb_init_v2_t acdb_init;
@@ -1311,7 +1359,7 @@
list_add_tail(operator_specific_device_table[snd_device], &device->list);
- ALOGD("%s : deivce[%s] -> operator[%s] mixer_path[%s] acdb_id [%d]", __func__,
+ ALOGV("%s : deivce[%s] -> operator[%s] mixer_path[%s] acdb_id [%d]", __func__,
platform_get_snd_device_name(snd_device), operator, mixer_path, acdb_id);
}
@@ -1359,7 +1407,7 @@
return -EINVAL;
}
if (my_data->acdb_send_audio_cal) {
- ALOGD("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
+ ALOGV("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
__func__, snd_device, acdb_dev_id);
if (snd_device >= SND_DEVICE_OUT_BEGIN &&
snd_device < SND_DEVICE_OUT_END)
@@ -1968,8 +2016,14 @@
} else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
snd_device = SND_DEVICE_IN_VOICE_REC_HEADSET_MIC;
}
+ } else if (source == AUDIO_SOURCE_UNPROCESSED) {
+ if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
+ snd_device = SND_DEVICE_IN_UNPROCESSED_MIC;
+ } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
+ snd_device = SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC;
+ }
} else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
- mode == AUDIO_MODE_IN_COMMUNICATION) {
+ mode == AUDIO_MODE_IN_COMMUNICATION) {
if (out_device & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE))
in_device = AUDIO_DEVICE_IN_BACK_MIC;
if (adev->active_input) {
@@ -2356,7 +2410,7 @@
info->mccmnc = strdup(str + strlen(name) + 1);
list_add_tail(&operator_info_list, &info->list);
- ALOGD("%s: add operator[%s] mccmnc[%s]", __func__, info->name, info->mccmnc);
+ ALOGV("%s: add operator[%s] mccmnc[%s]", __func__, info->name, info->mccmnc);
}
memset(value, 0, sizeof(value));
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index dcd763a..d6c9e8e 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2014 The Android Open Source Project
+ * Copyright (C) 2013-2016 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.
@@ -132,6 +132,9 @@
SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE,
SND_DEVICE_IN_VOICE_REC_HEADSET_MIC,
+ SND_DEVICE_IN_UNPROCESSED_MIC,
+ SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC,
+
SND_DEVICE_IN_VOICE_RX,
SND_DEVICE_IN_THREE_MIC,
@@ -158,6 +161,7 @@
#define ACDB_ID_VOICE_HANDSET_TMUS 88
#define ACDB_ID_VOICE_DMIC_EF_TMUS 89
#define ACDB_ID_HEADSET_MIC_AEC 8
+#define ACDB_ID_VOICE_REC_MIC 62
#define MAX_VOL_INDEX 5
#define MIN_VOL_INDEX 0
@@ -218,6 +222,12 @@
#define VOLTE_CALL_PCM_DEVICE 21
#define QCHAT_CALL_PCM_DEVICE 33
#define VOWLAN_CALL_PCM_DEVICE -1
+#elif PLATFORM_MSM8996
+#define VOICE_CALL_PCM_DEVICE 40
+#define VOICE2_CALL_PCM_DEVICE 41
+#define VOLTE_CALL_PCM_DEVICE 14
+#define QCHAT_CALL_PCM_DEVICE 20
+#define VOWLAN_CALL_PCM_DEVICE 33
#else
#define VOICE_CALL_PCM_DEVICE 2
#define VOICE2_CALL_PCM_DEVICE 22
@@ -226,6 +236,14 @@
#define VOWLAN_CALL_PCM_DEVICE 36
#endif
+#ifdef PLATFORM_MSM8996
+#define VOICEMMODE1_CALL_PCM_DEVICE 2
+#define VOICEMMODE2_CALL_PCM_DEVICE 22
+#else
+#define VOICEMMODE1_CALL_PCM_DEVICE 44
+#define VOICEMMODE2_CALL_PCM_DEVICE 45
+#endif
+
#define AFE_PROXY_PLAYBACK_PCM_DEVICE 7
#define AFE_PROXY_RECORD_PCM_DEVICE 8
diff --git a/hal/voice.h b/hal/voice.h
index 23b9ee3..469a3b5 100644
--- a/hal/voice.h
+++ b/hal/voice.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2014-2016 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.
@@ -21,7 +21,7 @@
#define VOICE_SESS_IDX (BASE_SESS_IDX)
#ifdef MULTI_VOICE_SESSION_ENABLED
-#define MAX_VOICE_SESSIONS 5
+#define MAX_VOICE_SESSIONS 7
#else
#define MAX_VOICE_SESSIONS 1
#endif
diff --git a/hal/voice_extn/voice_extn.c b/hal/voice_extn/voice_extn.c
index 6e92da8..edf5523 100644
--- a/hal/voice_extn/voice_extn.c
+++ b/hal/voice_extn/voice_extn.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2014-2016 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.
@@ -41,17 +41,21 @@
#define VOICE_EXTN_PARAMETER_VALUE_MAX_LEN 256
-#define VOICE2_VSID 0x10DC1000
-#define VOLTE_VSID 0x10C02000
-#define QCHAT_VSID 0x10803000
-#define VOWLAN_VSID 0x10002000
-#define ALL_VSID 0xFFFFFFFF
+#define VOICE2_VSID 0x10DC1000
+#define VOLTE_VSID 0x10C02000
+#define QCHAT_VSID 0x10803000
+#define VOWLAN_VSID 0x10002000
+#define VOICEMMODE1_VSID 0x11C05000
+#define VOICEMMODE2_VSID 0x11DC5000
+#define ALL_VSID 0xFFFFFFFF
/* Voice Session Indices */
#define VOICE2_SESS_IDX (VOICE_SESS_IDX + 1)
#define VOLTE_SESS_IDX (VOICE_SESS_IDX + 2)
#define QCHAT_SESS_IDX (VOICE_SESS_IDX + 3)
#define VOWLAN_SESS_IDX (VOICE_SESS_IDX + 4)
+#define MMODE1_SESS_IDX (VOICE_SESS_IDX + 5)
+#define MMODE2_SESS_IDX (VOICE_SESS_IDX + 6)
/* Call States */
#define CALL_HOLD (BASE_CALL_STATE + 2)
@@ -84,6 +88,8 @@
vsid == VOICE2_VSID ||
vsid == VOLTE_VSID ||
vsid == QCHAT_VSID ||
+ vsid == VOICEMMODE1_VSID ||
+ vsid == VOICEMMODE2_VSID ||
vsid == VOWLAN_VSID)
return true;
else
@@ -115,6 +121,14 @@
usecase_id = USECASE_VOWLAN_CALL;
break;
+ case MMODE1_SESS_IDX:
+ usecase_id = USECASE_VOICEMMODE1_CALL;
+ break;
+
+ case MMODE2_SESS_IDX:
+ usecase_id = USECASE_VOICEMMODE2_CALL;
+ break;
+
default:
ALOGE("%s: Invalid voice session index\n", __func__);
}
@@ -356,6 +370,8 @@
adev->voice.session[VOLTE_SESS_IDX].vsid = VOLTE_VSID;
adev->voice.session[QCHAT_SESS_IDX].vsid = QCHAT_VSID;
adev->voice.session[VOWLAN_SESS_IDX].vsid = VOWLAN_VSID;
+ adev->voice.session[MMODE1_SESS_IDX].vsid = VOICEMMODE1_VSID;
+ adev->voice.session[MMODE2_SESS_IDX].vsid = VOICEMMODE2_VSID;
}
int voice_extn_get_session_from_use_case(struct audio_device *adev,
@@ -385,6 +401,14 @@
*session = &adev->voice.session[VOWLAN_SESS_IDX];
break;
+ case USECASE_VOICEMMODE1_CALL:
+ *session = &adev->voice.session[MMODE1_SESS_IDX];
+ break;
+
+ case USECASE_VOICEMMODE2_CALL:
+ *session = &adev->voice.session[MMODE2_SESS_IDX];
+ break;
+
default:
ALOGE("%s: Invalid usecase_id:%d\n", __func__, usecase_id);
*session = NULL;
diff --git a/post_proc/Android.mk b/post_proc/Android.mk
index b8aa9fc..1a8550c 100644
--- a/post_proc/Android.mk
+++ b/post_proc/Android.mk
@@ -1,4 +1,4 @@
-ifneq ($(filter msm8974 msm8226 msm8084 msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),)
+ifneq ($(filter msm8974 msm8226 msm8084 msm8992 msm8994 msm8996,$(TARGET_BOARD_PLATFORM)),)
LOCAL_PATH:= $(call my-dir)
@@ -33,7 +33,7 @@
################################################################################
-ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),)
+ifneq ($(filter msm8992 msm8994 msm8996,$(TARGET_BOARD_PLATFORM)),)
include $(CLEAR_VARS)
diff --git a/post_proc/volume_listener.c b/post_proc/volume_listener.c
index ef63299..107a475 100644
--- a/post_proc/volume_listener.c
+++ b/post_proc/volume_listener.c
@@ -346,9 +346,6 @@
memcpy(out_buffer->raw, in_buffer->raw, out_buffer->frameCount * 2 * sizeof(int16_t));
}
- } else {
- ALOGW("%s: something wrong, didn't handle in_buffer and out_buffer same address case",
- __func__);
}
exit: