Loading hal/Android.mk +4 −0 Original line number Diff line number Diff line Loading @@ -146,6 +146,10 @@ ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DEV_ARBI)),true) LOCAL_SRC_FILES += audio_extn/dev_arbi.c endif ifeq ($(strip $(AUDIO_FEATURE_ENABLED_RECORD_PLAY_CONCURRENCY)),true) LOCAL_CFLAGS += -DRECORD_PLAY_CONCURRENCY endif LOCAL_SHARED_LIBRARIES := \ liblog \ libcutils \ Loading hal/msm8916/platform.c +79 −11 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ char cal_name_info[WCD9XXX_MAX_CAL][MAX_CAL_NAME] = { [WCD9XXX_MAD_CAL] = "mad_cal", }; #define AUDIO_PARAMETER_KEY_REC_PLAY_CONC "rec_play_conc_on" enum { VOICE_FEATURE_SET_DEFAULT, Loading Loading @@ -147,7 +148,9 @@ struct platform_data { acdb_send_voice_cal_t acdb_send_voice_cal; acdb_reload_vocvoltable_t acdb_reload_vocvoltable; acdb_get_default_app_type_t acdb_get_default_app_type; #ifdef RECORD_PLAY_CONCURRENCY bool rec_play_conc_set; #endif void *hw_info; struct csd_data *csd; }; Loading Loading @@ -226,6 +229,11 @@ static const char * const device_table[SND_DEVICE_MAX] = { [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones", [SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset", [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected", #ifdef RECORD_PLAY_CONCURRENCY [SND_DEVICE_OUT_VOIP_HANDSET] = "voip-handset", [SND_DEVICE_OUT_VOIP_SPEAKER] = "voip-speaker", [SND_DEVICE_OUT_VOIP_HEADPHONES] = "voip-headphones", #endif /* Capture sound devices */ [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic", Loading Loading @@ -307,6 +315,11 @@ static int acdb_device_table[SND_DEVICE_MAX] = { [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26, [SND_DEVICE_OUT_ANC_HANDSET] = 103, [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 101, #ifdef RECORD_PLAY_CONCURRENCY [SND_DEVICE_OUT_VOIP_HANDSET] = 133, [SND_DEVICE_OUT_VOIP_SPEAKER] = 132, [SND_DEVICE_OUT_VOIP_HEADPHONES] = 134, #endif [SND_DEVICE_IN_HANDSET_MIC] = 4, [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106, Loading Loading @@ -393,6 +406,11 @@ struct snd_device_index snd_device_name_index[SND_DEVICE_MAX] = { {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET)}, {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)}, {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)}, #ifdef RECORD_PLAY_CONCURRENCY {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HANDSET)}, {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_SPEAKER)}, {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HEADPHONES)}, #endif {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)}, {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)}, {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_NS)}, Loading Loading @@ -1402,6 +1420,18 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi struct audio_device *adev = my_data->adev; audio_mode_t mode = adev->mode; snd_device_t snd_device = SND_DEVICE_NONE; #ifdef RECORD_PLAY_CONCURRENCY bool use_voip_out_devices = false; bool prop_rec_play_enabled = false; char recConcPropValue[PROPERTY_VALUE_MAX]; if (property_get("rec.playback.conc.disabled", recConcPropValue, NULL)) { prop_rec_play_enabled = atoi(recConcPropValue) || !strncmp("true", recConcPropValue, 4); } use_voip_out_devices = prop_rec_play_enabled && (my_data->rec_play_conc_set || adev->mode == AUDIO_MODE_IN_COMMUNICATION); ALOGV("platform_get_output_snd_device use_voip_out_devices : %d",use_voip_out_devices); #endif audio_channel_mask_t channel_mask = (adev->active_input == NULL) ? AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask; Loading Loading @@ -1498,18 +1528,38 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) { if (devices & AUDIO_DEVICE_OUT_WIRED_HEADSET && audio_extn_get_anc_enabled()) { #ifdef RECORD_PLAY_CONCURRENCY if (use_voip_out_devices) { // ANC should be disabled for voip concurrency snd_device = SND_DEVICE_OUT_VOIP_HEADPHONES; } else #endif { if (audio_extn_should_use_fb_anc()) snd_device = SND_DEVICE_OUT_ANC_FB_HEADSET; else snd_device = SND_DEVICE_OUT_ANC_HEADSET; } } else { #ifdef RECORD_PLAY_CONCURRENCY if (use_voip_out_devices) snd_device = SND_DEVICE_OUT_VOIP_HEADPHONES; else #endif snd_device = SND_DEVICE_OUT_HEADPHONES; } } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) { #ifdef RECORD_PLAY_CONCURRENCY if (use_voip_out_devices) { snd_device = SND_DEVICE_OUT_VOIP_SPEAKER; } else #endif { if (adev->speaker_lr_swap) snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE; else snd_device = SND_DEVICE_OUT_SPEAKER; } } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) { if (adev->bt_wb_speech_enabled) snd_device = SND_DEVICE_OUT_BT_SCO_WB; Loading @@ -1525,6 +1575,11 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi } else if (devices & AUDIO_DEVICE_OUT_FM_TX) { snd_device = SND_DEVICE_OUT_TRANSMISSION_FM; } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) { #ifdef RECORD_PLAY_CONCURRENCY if (use_voip_out_devices) snd_device = SND_DEVICE_OUT_VOIP_HANDSET; else #endif snd_device = SND_DEVICE_OUT_HANDSET; } else if (devices & AUDIO_DEVICE_OUT_PROXY) { channel_count = audio_extn_get_afe_proxy_channel_count(); Loading Loading @@ -2027,6 +2082,19 @@ int platform_set_parameters(void *platform, struct str_parms *parms) } } #ifdef RECORD_PLAY_CONCURRENCY err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC, value, sizeof(value)); if (err >= 0) { if (!strncmp("true", value, sizeof("true"))) { ALOGD("setting record playback concurrency to true"); my_data->rec_play_conc_set = true; } else { ALOGD("setting record playback concurrency to false"); my_data->rec_play_conc_set = false; } str_parms_del(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC); } #endif ALOGV("%s: exit with code(%d)", __func__, ret); return ret; } Loading hal/msm8916/platform.h +5 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,11 @@ enum { SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET, SND_DEVICE_OUT_ANC_HANDSET, SND_DEVICE_OUT_SPEAKER_PROTECTED, #ifdef RECORD_PLAY_CONCURRENCY SND_DEVICE_OUT_VOIP_HANDSET, SND_DEVICE_OUT_VOIP_SPEAKER, SND_DEVICE_OUT_VOIP_HEADPHONES, #endif SND_DEVICE_OUT_END, /* Loading Loading
hal/Android.mk +4 −0 Original line number Diff line number Diff line Loading @@ -146,6 +146,10 @@ ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DEV_ARBI)),true) LOCAL_SRC_FILES += audio_extn/dev_arbi.c endif ifeq ($(strip $(AUDIO_FEATURE_ENABLED_RECORD_PLAY_CONCURRENCY)),true) LOCAL_CFLAGS += -DRECORD_PLAY_CONCURRENCY endif LOCAL_SHARED_LIBRARIES := \ liblog \ libcutils \ Loading
hal/msm8916/platform.c +79 −11 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ char cal_name_info[WCD9XXX_MAX_CAL][MAX_CAL_NAME] = { [WCD9XXX_MAD_CAL] = "mad_cal", }; #define AUDIO_PARAMETER_KEY_REC_PLAY_CONC "rec_play_conc_on" enum { VOICE_FEATURE_SET_DEFAULT, Loading Loading @@ -147,7 +148,9 @@ struct platform_data { acdb_send_voice_cal_t acdb_send_voice_cal; acdb_reload_vocvoltable_t acdb_reload_vocvoltable; acdb_get_default_app_type_t acdb_get_default_app_type; #ifdef RECORD_PLAY_CONCURRENCY bool rec_play_conc_set; #endif void *hw_info; struct csd_data *csd; }; Loading Loading @@ -226,6 +229,11 @@ static const char * const device_table[SND_DEVICE_MAX] = { [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones", [SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset", [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected", #ifdef RECORD_PLAY_CONCURRENCY [SND_DEVICE_OUT_VOIP_HANDSET] = "voip-handset", [SND_DEVICE_OUT_VOIP_SPEAKER] = "voip-speaker", [SND_DEVICE_OUT_VOIP_HEADPHONES] = "voip-headphones", #endif /* Capture sound devices */ [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic", Loading Loading @@ -307,6 +315,11 @@ static int acdb_device_table[SND_DEVICE_MAX] = { [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26, [SND_DEVICE_OUT_ANC_HANDSET] = 103, [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 101, #ifdef RECORD_PLAY_CONCURRENCY [SND_DEVICE_OUT_VOIP_HANDSET] = 133, [SND_DEVICE_OUT_VOIP_SPEAKER] = 132, [SND_DEVICE_OUT_VOIP_HEADPHONES] = 134, #endif [SND_DEVICE_IN_HANDSET_MIC] = 4, [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106, Loading Loading @@ -393,6 +406,11 @@ struct snd_device_index snd_device_name_index[SND_DEVICE_MAX] = { {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET)}, {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)}, {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)}, #ifdef RECORD_PLAY_CONCURRENCY {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HANDSET)}, {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_SPEAKER)}, {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HEADPHONES)}, #endif {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)}, {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)}, {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_NS)}, Loading Loading @@ -1402,6 +1420,18 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi struct audio_device *adev = my_data->adev; audio_mode_t mode = adev->mode; snd_device_t snd_device = SND_DEVICE_NONE; #ifdef RECORD_PLAY_CONCURRENCY bool use_voip_out_devices = false; bool prop_rec_play_enabled = false; char recConcPropValue[PROPERTY_VALUE_MAX]; if (property_get("rec.playback.conc.disabled", recConcPropValue, NULL)) { prop_rec_play_enabled = atoi(recConcPropValue) || !strncmp("true", recConcPropValue, 4); } use_voip_out_devices = prop_rec_play_enabled && (my_data->rec_play_conc_set || adev->mode == AUDIO_MODE_IN_COMMUNICATION); ALOGV("platform_get_output_snd_device use_voip_out_devices : %d",use_voip_out_devices); #endif audio_channel_mask_t channel_mask = (adev->active_input == NULL) ? AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask; Loading Loading @@ -1498,18 +1528,38 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) { if (devices & AUDIO_DEVICE_OUT_WIRED_HEADSET && audio_extn_get_anc_enabled()) { #ifdef RECORD_PLAY_CONCURRENCY if (use_voip_out_devices) { // ANC should be disabled for voip concurrency snd_device = SND_DEVICE_OUT_VOIP_HEADPHONES; } else #endif { if (audio_extn_should_use_fb_anc()) snd_device = SND_DEVICE_OUT_ANC_FB_HEADSET; else snd_device = SND_DEVICE_OUT_ANC_HEADSET; } } else { #ifdef RECORD_PLAY_CONCURRENCY if (use_voip_out_devices) snd_device = SND_DEVICE_OUT_VOIP_HEADPHONES; else #endif snd_device = SND_DEVICE_OUT_HEADPHONES; } } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) { #ifdef RECORD_PLAY_CONCURRENCY if (use_voip_out_devices) { snd_device = SND_DEVICE_OUT_VOIP_SPEAKER; } else #endif { if (adev->speaker_lr_swap) snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE; else snd_device = SND_DEVICE_OUT_SPEAKER; } } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) { if (adev->bt_wb_speech_enabled) snd_device = SND_DEVICE_OUT_BT_SCO_WB; Loading @@ -1525,6 +1575,11 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi } else if (devices & AUDIO_DEVICE_OUT_FM_TX) { snd_device = SND_DEVICE_OUT_TRANSMISSION_FM; } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) { #ifdef RECORD_PLAY_CONCURRENCY if (use_voip_out_devices) snd_device = SND_DEVICE_OUT_VOIP_HANDSET; else #endif snd_device = SND_DEVICE_OUT_HANDSET; } else if (devices & AUDIO_DEVICE_OUT_PROXY) { channel_count = audio_extn_get_afe_proxy_channel_count(); Loading Loading @@ -2027,6 +2082,19 @@ int platform_set_parameters(void *platform, struct str_parms *parms) } } #ifdef RECORD_PLAY_CONCURRENCY err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC, value, sizeof(value)); if (err >= 0) { if (!strncmp("true", value, sizeof("true"))) { ALOGD("setting record playback concurrency to true"); my_data->rec_play_conc_set = true; } else { ALOGD("setting record playback concurrency to false"); my_data->rec_play_conc_set = false; } str_parms_del(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC); } #endif ALOGV("%s: exit with code(%d)", __func__, ret); return ret; } Loading
hal/msm8916/platform.h +5 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,11 @@ enum { SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET, SND_DEVICE_OUT_ANC_HANDSET, SND_DEVICE_OUT_SPEAKER_PROTECTED, #ifdef RECORD_PLAY_CONCURRENCY SND_DEVICE_OUT_VOIP_HANDSET, SND_DEVICE_OUT_VOIP_SPEAKER, SND_DEVICE_OUT_VOIP_HEADPHONES, #endif SND_DEVICE_OUT_END, /* Loading