Merge "audio-hal: add render latency for LL"
diff --git a/configs/common_au/audio_policy_configuration.xml b/configs/common_au/audio_policy_configuration.xml
index bfb6362..eb16ac9 100644
--- a/configs/common_au/audio_policy_configuration.xml
+++ b/configs/common_au/audio_policy_configuration.xml
@@ -141,7 +141,7 @@
samplingRates="8000,16000,48000"
channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
- <mixPort name="primary input" role="sink">
+ <mixPort name="primary input" role="sink" maxOpenCount="3" maxActiveCount="3">
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
diff --git a/configs/msmnile_au/audio_platform_info.xml b/configs/msmnile_au/audio_platform_info.xml
index 7972f29..89331ad 100644
--- a/configs/msmnile_au/audio_platform_info.xml
+++ b/configs/msmnile_au/audio_platform_info.xml
@@ -140,6 +140,8 @@
<usecase name="USECASE_AUDIO_PLAYBACK_SYNTHESIZER" type="in" id="33" />
<usecase name="USECASE_AUDIO_PLAYBACK_SYNTHESIZER" type="out" id="33" />
<usecase name="USECASE_AUDIO_RECORD_COMPRESS2" type="in" id="31" />
+ <usecase name="USECASE_AUDIO_RECORD2" type="in" id="61" />
+ <usecase name="USECASE_AUDIO_RECORD3" type="in" id="62" />
</pcm_ids>
<config_params>
diff --git a/configs/msmnile_au/audio_policy_configuration.xml b/configs/msmnile_au/audio_policy_configuration.xml
index e4533ac..1aaea2b 100644
--- a/configs/msmnile_au/audio_policy_configuration.xml
+++ b/configs/msmnile_au/audio_policy_configuration.xml
@@ -202,7 +202,7 @@
channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
- <mixPort name="primary input" role="sink" maxOpenCount="2" maxActiveCount="2">
+ <mixPort name="primary input" role="sink" maxOpenCount="3" maxActiveCount="3">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK"/>
diff --git a/configs/msmnile_au/mixer_paths_adp.xml b/configs/msmnile_au/mixer_paths_adp.xml
index fbd1607..cf8b0c7 100755
--- a/configs/msmnile_au/mixer_paths_adp.xml
+++ b/configs/msmnile_au/mixer_paths_adp.xml
@@ -1339,6 +1339,18 @@
<ctl name="TERT_TDM_TX_0 ADM Channels" value="Four" />
</path>
+ <path name="audio-record2">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+ <ctl name="MultiMedia33 Mixer TERT_TDM_TX_0" value="1" />
+ <ctl name="TERT_TDM_TX_0 ADM Channels" value="Four" />
+ </path>
+
+ <path name="audio-record3">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+ <ctl name="MultiMedia34 Mixer TERT_TDM_TX_0" value="1" />
+ <ctl name="TERT_TDM_TX_0 ADM Channels" value="Four" />
+ </path>
+
<path name="front-passenger-record">
<ctl name="QUAT_TDM_TX_0 Channels" value="Eight" />
<ctl name="MultiMedia23 Mixer QUAT_TDM_TX_0" value="1" />
diff --git a/configs/msmnile_au/msmnile_au.mk b/configs/msmnile_au/msmnile_au.mk
index 609195c..69a99b7 100644
--- a/configs/msmnile_au/msmnile_au.mk
+++ b/configs/msmnile_au/msmnile_au.mk
@@ -420,7 +420,8 @@
vendor.audio.feature.snd_mon.enable=false \
vendor.audio.feature.auto_hal.enable=true \
vendor.audio.feature.synth.enable=true \
-vendor.audio.feature.powerpolicy.enable=true
+vendor.audio.feature.powerpolicy.enable=true \
+vendor.audio.feature.concurrent_pcm_record.enable=true
else
# Non-Generic ODM varient related
PRODUCT_ODM_PROPERTIES += \
@@ -468,7 +469,8 @@
vendor.audio.feature.snd_mon.enable=false \
vendor.audio.feature.auto_hal.enable=true \
vendor.audio.feature.synth.enable=true \
-vendor.audio.feature.powerpolicy.enable=true
+vendor.audio.feature.powerpolicy.enable=true \
+vendor.audio.feature.concurrent_pcm_record.enable=true
endif
# for HIDL related packages
diff --git a/configs/msmsteppe_au/audio_platform_info.xml b/configs/msmsteppe_au/audio_platform_info.xml
index b9b8bca..15e865d 100644
--- a/configs/msmsteppe_au/audio_platform_info.xml
+++ b/configs/msmsteppe_au/audio_platform_info.xml
@@ -140,6 +140,8 @@
<usecase name="USECASE_AUDIO_PLAYBACK_SYNTHESIZER" type="in" id="33" />
<usecase name="USECASE_AUDIO_PLAYBACK_SYNTHESIZER" type="out" id="33" />
<usecase name="USECASE_AUDIO_RECORD_COMPRESS2" type="in" id="31" />
+ <usecase name="USECASE_AUDIO_RECORD2" type="in" id="61" />
+ <usecase name="USECASE_AUDIO_RECORD3" type="in" id="62" />
</pcm_ids>
<config_params>
diff --git a/configs/msmsteppe_au/audio_policy_configuration.xml b/configs/msmsteppe_au/audio_policy_configuration.xml
index ea6e0e3..c3259d9 100644
--- a/configs/msmsteppe_au/audio_policy_configuration.xml
+++ b/configs/msmsteppe_au/audio_policy_configuration.xml
@@ -196,7 +196,7 @@
samplingRates="8000,16000,32000,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
- <mixPort name="primary input" role="sink" maxOpenCount="2" maxActiveCount="2">
+ <mixPort name="primary input" role="sink" maxOpenCount="3" maxActiveCount="3">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK"/>
diff --git a/configs/msmsteppe_au/mixer_paths_adp.xml b/configs/msmsteppe_au/mixer_paths_adp.xml
index 0fef0ca..d460866 100644
--- a/configs/msmsteppe_au/mixer_paths_adp.xml
+++ b/configs/msmsteppe_au/mixer_paths_adp.xml
@@ -1181,6 +1181,18 @@
<ctl name="TERT_TDM_TX_0 ADM Channels" value="Four" />
</path>
+ <path name="audio-record2">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+ <ctl name="MultiMedia33 Mixer TERT_TDM_TX_0" value="1" />
+ <ctl name="TERT_TDM_TX_0 ADM Channels" value="Four" />
+ </path>
+
+ <path name="audio-record3">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+ <ctl name="MultiMedia34 Mixer TERT_TDM_TX_0" value="1" />
+ <ctl name="TERT_TDM_TX_0 ADM Channels" value="Four" />
+ </path>
+
<path name="front-passenger-record">
<ctl name="QUAT_TDM_TX_0 Channels" value="Eight" />
<ctl name="MultiMedia23 Mixer QUAT_TDM_TX_0" value="1" />
diff --git a/configs/msmsteppe_au/msmsteppe_au.mk b/configs/msmsteppe_au/msmsteppe_au.mk
old mode 100644
new mode 100755
index bd6950c..d5d316e
--- a/configs/msmsteppe_au/msmsteppe_au.mk
+++ b/configs/msmsteppe_au/msmsteppe_au.mk
@@ -400,7 +400,8 @@
vendor.audio.feature.snd_mon.enable=false \
vendor.audio.feature.auto_hal.enable=true \
vendor.audio.feature.synth.enable=true \
-vendor.audio.feature.powerpolicy.enable=true
+vendor.audio.feature.powerpolicy.enable=true \
+vendor.audio.feature.concurrent_pcm_record.enable=true
else
# Non-Generic ODM varient related
PRODUCT_ODM_PROPERTIES += \
@@ -448,7 +449,8 @@
vendor.audio.feature.snd_mon.enable=false \
vendor.audio.feature.auto_hal.enable=true \
vendor.audio.feature.synth.enable=true \
-vendor.audio.feature.powerpolicy.enable=true
+vendor.audio.feature.powerpolicy.enable=true \
+vendor.audio.feature.concurrent_pcm_record.enable=true
endif
# for HIDL related packages
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index b7f9f0d..2848649 100755
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -202,6 +202,7 @@
static bool audio_extn_maxx_audio_enabled = false;
static bool audio_extn_audiozoom_enabled = false;
static bool audio_extn_hifi_filter_enabled = false;
+static bool audio_extn_concurrent_pcm_record_enabled = false;
#define AUDIO_PARAMETER_KEY_AANC_NOISE_LEVEL "aanc_noise_level"
#define AUDIO_PARAMETER_KEY_ANC "anc_enabled"
@@ -5625,6 +5626,19 @@
}
// END: CONCURRENT_CAPTURE ====================================================
+// START: CONCURRENT_PCM_RECORD ===============================================
+bool audio_extn_is_concurrent_pcm_record_enabled()
+{
+ return audio_extn_concurrent_pcm_record_enabled;
+}
+
+void concurrent_pcm_record_feature_init(bool is_feature_enabled)
+{
+ audio_extn_concurrent_pcm_record_enabled = is_feature_enabled;
+ ALOGD("%s: ---- Feature CONCURRENT_PCM_RECORD is %s----", __func__, is_feature_enabled? "ENABLED": "NOT ENABLED");
+}
+// END: CONCURRENT_PCM_RECORD =================================================
+
// START: COMPRESS_IN ==================================================
void compress_in_feature_init(bool is_feature_enabled)
{
@@ -6698,6 +6712,9 @@
power_policy_feature_init(
property_get_bool("vendor.audio.feature.powerpolicy.enable",
false));
+ concurrent_pcm_record_feature_init(
+ property_get_bool("vendor.audio.feature.concurrent_pcm_record.enable",
+ false));
}
void audio_extn_set_parameters(struct audio_device *adev,
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 85502ad..4344bad 100755
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -1458,4 +1458,5 @@
int channel_count);
void audio_get_vendor_config_path(char* config_file_path, int path_size);
+bool audio_extn_is_concurrent_pcm_record_enabled();
#endif /* AUDIO_EXTN_H */
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 1ef4b3c..2417678 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -360,6 +360,8 @@
[USECASE_AUDIO_PLAYBACK_TTS] = "audio-tts-playback",
[USECASE_AUDIO_RECORD] = "audio-record",
+ [USECASE_AUDIO_RECORD2] = "audio-record2",
+ [USECASE_AUDIO_RECORD3] = "audio-record3",
[USECASE_AUDIO_RECORD_COMPRESS] = "audio-record-compress",
[USECASE_AUDIO_RECORD_COMPRESS2] = "audio-record-compress2",
[USECASE_AUDIO_RECORD_COMPRESS3] = "audio-record-compress3",
@@ -525,6 +527,12 @@
effect_handle_t handle;
};
+static const audio_usecase_t record_usecases[] = {
+ USECASE_AUDIO_RECORD,
+ USECASE_AUDIO_RECORD2,
+ USECASE_AUDIO_RECORD3,
+};
+
static struct audio_device *adev = NULL;
static pthread_mutex_t adev_init_lock = PTHREAD_MUTEX_INITIALIZER;
static unsigned int audio_device_ref_count;
@@ -558,6 +566,52 @@
audio_microphone_direction_t dir);
static int in_set_microphone_field_dimension(const struct audio_stream_in *stream, float zoom);
+static bool is_pcm_record_usecase(audio_usecase_t uc_id)
+{
+ unsigned int record_uc_index;
+ unsigned int num_usecase = sizeof(record_usecases)/sizeof(record_usecases[0]);
+
+ for (record_uc_index = 0; record_uc_index < num_usecase; record_uc_index++) {
+ if (uc_id == record_usecases[record_uc_index])
+ return true;
+ }
+ return false;
+}
+
+static audio_usecase_t get_record_usecase(struct audio_device *adev)
+{
+ audio_usecase_t ret_uc = USECASE_INVALID;
+ unsigned int record_uc_index;
+ unsigned int num_usecase = sizeof(record_usecases)/sizeof(record_usecases[0]);
+
+ ALOGV("%s: num_usecase: %d", __func__, num_usecase);
+ for (record_uc_index = 0; record_uc_index < num_usecase; record_uc_index++) {
+ if (!(adev->pcm_record_uc_state & (0x1 << record_uc_index))) {
+ adev->pcm_record_uc_state |= 0x1 << record_uc_index;
+ ret_uc = record_usecases[record_uc_index];
+ break;
+ }
+ }
+
+ ALOGV("%s: pcm record usecase is %d", __func__, ret_uc);
+ return ret_uc;
+}
+
+static void free_record_usecase(struct audio_device *adev,
+ audio_usecase_t uc_id)
+{
+ unsigned int record_uc_index;
+ unsigned int num_usecase = sizeof(record_usecases)/sizeof(record_usecases[0]);
+
+ for (record_uc_index = 0; record_uc_index < num_usecase; record_uc_index++) {
+ if (record_usecases[record_uc_index] == uc_id) {
+ adev->pcm_record_uc_state &= ~(0x1 << record_uc_index);
+ break;
+ }
+ }
+ ALOGV("%s: free pcm record usecase %d", __func__, uc_id);
+}
+
static bool may_use_noirq_mode(struct audio_device *adev, audio_usecase_t uc_id,
int flags __unused)
{
@@ -9812,6 +9866,9 @@
ALOGV("%s: using USECASE_AUDIO_RECORD",__func__);
adev->pcm_record_uc_state = 1;
pthread_mutex_unlock(&adev->lock);
+ } else if (audio_extn_is_concurrent_pcm_record_enabled()) {
+ in->usecase = get_record_usecase(adev);
+ pthread_mutex_unlock(&adev->lock);
} else {
pthread_mutex_unlock(&adev->lock);
/* Assign compress record use case for second record */
@@ -9878,7 +9935,9 @@
return ret;
err_open:
- if (in->usecase == USECASE_AUDIO_RECORD) {
+ if (audio_extn_is_concurrent_pcm_record_enabled() && is_pcm_record_usecase(in->usecase)) {
+ free_record_usecase(adev, in->usecase);
+ } else if (in->usecase == USECASE_AUDIO_RECORD) {
pthread_mutex_lock(&adev->lock);
adev->pcm_record_uc_state = 0;
pthread_mutex_unlock(&adev->lock);
@@ -9945,7 +10004,9 @@
pthread_mutex_destroy(&in->pre_lock);
pthread_mutex_lock(&adev->lock);
- if (in->usecase == USECASE_AUDIO_RECORD) {
+ if (audio_extn_is_concurrent_pcm_record_enabled() && is_pcm_record_usecase(in->usecase)) {
+ free_record_usecase(adev, in->usecase);
+ } else if (in->usecase == USECASE_AUDIO_RECORD) {
adev->pcm_record_uc_state = 0;
}
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index c424ec1..e7d5ee3 100755
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -196,6 +196,8 @@
/* Capture usecases */
USECASE_AUDIO_RECORD,
+ USECASE_AUDIO_RECORD2,
+ USECASE_AUDIO_RECORD3,
USECASE_AUDIO_RECORD_COMPRESS,
USECASE_AUDIO_RECORD_COMPRESS2,
USECASE_AUDIO_RECORD_COMPRESS3,
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index f5c956b..e25bf18 100755
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -440,6 +440,8 @@
[USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
+ [USECASE_AUDIO_RECORD2] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
+ [USECASE_AUDIO_RECORD3] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
[USECASE_AUDIO_RECORD_COMPRESS] = {COMPRESS_CAPTURE_DEVICE, COMPRESS_CAPTURE_DEVICE},
[USECASE_AUDIO_RECORD_COMPRESS2] = {COMPRESS_CAPTURE_DEVICE,COMPRESS_CAPTURE_DEVICE},
[USECASE_AUDIO_RECORD_COMPRESS3] = {-1, -1},
@@ -1395,6 +1397,8 @@
{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD9)},
{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MMAP)},
{TO_NAME_INDEX(USECASE_AUDIO_RECORD)},
+ {TO_NAME_INDEX(USECASE_AUDIO_RECORD2)},
+ {TO_NAME_INDEX(USECASE_AUDIO_RECORD3)},
{TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS)},
{TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS2)},
{TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS3)},