Merge "configs:sdm710: add interface name for headphones-44.1"
diff --git a/configs/msmnile/audio_policy_configuration.xml b/configs/msmnile/audio_policy_configuration.xml
index 45598dc..a8ae093 100644
--- a/configs/msmnile/audio_policy_configuration.xml
+++ b/configs/msmnile/audio_policy_configuration.xml
@@ -370,7 +370,7 @@
<route type="mix" sink="USB Headset Out"
sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx,mmap_no_irq_out,hifi_playback"/>
<route type="mix" sink="Telephony Tx"
- sources="voice_tx"/>
+ sources="voice_tx,incall_music_uplink"/>
<route type="mix" sink="voice_rx"
sources="Telephony Rx"/>
<route type="mix" sink="primary input"
diff --git a/configs/msmnile/mixer_paths_tavil.xml b/configs/msmnile/mixer_paths_tavil.xml
index a3cf0e1..b2c8be2 100644
--- a/configs/msmnile/mixer_paths_tavil.xml
+++ b/configs/msmnile/mixer_paths_tavil.xml
@@ -2992,76 +2992,79 @@
<ctl name="MultiMedia2 Mixer USB_AUDIO_TX" value="1" />
</path>
- <path name="incall-music-uplink">
+ <path name="incall_music_uplink">
<ctl name="Incall_Music Audio Mixer MultiMedia9" value="1" />
</path>
- <path name="incall-music-uplink speaker">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink speaker">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink handset">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink handset">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink handset-hac">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink handset-hac">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink display-port">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink display-port">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink bt-sco">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink bt-sco">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink bt-sco-wb">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink bt-sco-wb">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink speaker-and-display-port">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink speaker-and-display-port">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink afe-proxy">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink afe-proxy">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink usb-headphones">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink usb-headphones">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink usb-headset">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink usb-headset">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink speaker-and-usb-headphones">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink speaker-and-usb-headphones">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink headphones">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink headphones">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink speaker-and-headphones">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink speaker-and-headphones">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink speaker-and-bt-sco">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink speaker-and-bt-sco">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink voice-tty-hco-handset">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink voice-tty-hco-handset">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink speaker-and-bt-a2dp">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink speaker-and-bt-a2dp">
+ <path name="incall_music_uplink" />
</path>
- <path name="incall-music-uplink bt-a2dp">
- <path name="incall-music-uplink" />
+ <path name="incall_music_uplink bt-a2dp">
+ <path name="incall_music_uplink" />
</path>
+ <path name="incall_music_uplink afe-proxy">
+ <path name="incall_music_uplink" />
+ </path>
</mixer>
diff --git a/configs/msmsteppe/audio_platform_info_intcodec.xml b/configs/msmsteppe/audio_platform_info_intcodec.xml
index 27964f4..f838af8 100644
--- a/configs/msmsteppe/audio_platform_info_intcodec.xml
+++ b/configs/msmsteppe/audio_platform_info_intcodec.xml
@@ -102,6 +102,7 @@
</acdb_ids>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_A2DP" backend="bt-a2dp" interface="SLIMBUS_7_RX"/>
diff --git a/configs/msmsteppe/audio_platform_info_qrd.xml b/configs/msmsteppe/audio_platform_info_qrd.xml
index 99759a7..1aac2c5 100644
--- a/configs/msmsteppe/audio_platform_info_qrd.xml
+++ b/configs/msmsteppe/audio_platform_info_qrd.xml
@@ -102,6 +102,7 @@
</acdb_ids>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_A2DP" backend="bt-a2dp" interface="SLIMBUS_7_RX"/>
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index d83002a..a0f37bc 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2912,6 +2912,9 @@
adev->offload_effects_stop_output(out->handle, out->pcm_device_id);
}
+ if (out->usecase == USECASE_INCALL_MUSIC_UPLINK)
+ voice_set_device_mute_flag(adev, false);
+
/* 1. Get and set stream specific mixer controls */
disable_audio_route(adev, uc_info);
@@ -3071,6 +3074,9 @@
select_devices(adev, out->usecase);
}
+ if (out->usecase == USECASE_INCALL_MUSIC_UPLINK)
+ voice_set_device_mute_flag(adev, true);
+
ALOGV("%s: Opening PCM device card_id(%d) device_id(%d) format(%#x)",
__func__, adev->snd_card, out->pcm_device_id, out->config.format);
@@ -4358,6 +4364,8 @@
struct audio_device *adev = out->dev;
ssize_t ret = 0;
int channels = 0;
+ const size_t frame_size = audio_stream_out_frame_size(stream);
+ const size_t frames = (frame_size != 0) ? bytes / frame_size : bytes;
ATRACE_BEGIN("out_write");
lock_output_stream(out);
@@ -4563,8 +4571,35 @@
return ret;
} else {
if (out->pcm) {
+ size_t bytes_to_write = bytes;
if (out->muted)
memset((void *)buffer, 0, bytes);
+ ALOGV("%s: frames=%zu, frame_size=%zu, bytes_to_write=%zu",
+ __func__, frames, frame_size, bytes_to_write);
+
+ if (out->usecase == USECASE_INCALL_MUSIC_UPLINK) {
+ size_t channel_count = audio_channel_count_from_out_mask(out->channel_mask);
+ int16_t *src = (int16_t *)buffer;
+ int16_t *dst = (int16_t *)buffer;
+
+ LOG_ALWAYS_FATAL_IF(out->config.channels != 1 || channel_count != 2 ||
+ out->format != AUDIO_FORMAT_PCM_16_BIT,
+ "out_write called for incall music use case with wrong properties");
+
+ /*
+ * FIXME: this can be removed once audio flinger mixer supports
+ * mono output
+ */
+
+ /*
+ * Code below goes over each frame in the buffer and adds both
+ * L and R samples and then divides by 2 to convert to mono
+ */
+ for (size_t i = 0; i < frames ; i++, dst++, src += 2) {
+ *dst = (int16_t)(((int32_t)src[0] + (int32_t)src[1]) >> 1);
+ }
+ bytes_to_write /= 2;
+ }
ALOGVV("%s: writing buffer (%zu bytes) to pcm device", __func__, bytes);
@@ -4574,12 +4609,11 @@
ns = pcm_bytes_to_frames(out->pcm, bytes)*1000000000LL/
out->config.rate;
+ request_out_focus(out, ns);
bool use_mmap = is_mmap_usecase(out->usecase) || out->realtime;
- request_out_focus(out, ns);
-
if (use_mmap)
- ret = pcm_mmap_write(out->pcm, (void *)buffer, bytes);
+ ret = pcm_mmap_write(out->pcm, (void *)buffer, bytes_to_write);
else if (out->hal_op_format != out->hal_ip_format &&
out->convert_buffer != NULL) {
@@ -4613,7 +4647,7 @@
out_get_sample_rate(&out->stream.common));
ret = 0;
} else
- ret = pcm_write(out->pcm, (void *)buffer, bytes);
+ ret = pcm_write(out->pcm, (void *)buffer, bytes_to_write);
}
release_out_focus(out);
@@ -6119,13 +6153,55 @@
create_offload_callback_thread(out);
} else if (out->flags & AUDIO_OUTPUT_FLAG_INCALL_MUSIC) {
+ switch (config->sample_rate) {
+ case 0:
+ out->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ break;
+ case 8000:
+ case 16000:
+ case 48000:
+ out->sample_rate = config->sample_rate;
+ break;
+ default:
+ ALOGE("%s: Unsupported sampling rate %d for Incall Music", __func__,
+ config->sample_rate);
+ config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ ret = -EINVAL;
+ goto error_open;
+ }
+ //FIXME: add support for MONO stream configuration when audioflinger mixer supports it
+ switch (config->channel_mask) {
+ case AUDIO_CHANNEL_NONE:
+ case AUDIO_CHANNEL_OUT_STEREO:
+ out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
+ break;
+ default:
+ ALOGE("%s: Unsupported channel mask %#x for Incall Music", __func__,
+ config->channel_mask);
+ config->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
+ ret = -EINVAL;
+ goto error_open;
+ }
+ switch (config->format) {
+ case AUDIO_FORMAT_DEFAULT:
+ case AUDIO_FORMAT_PCM_16_BIT:
+ out->format = AUDIO_FORMAT_PCM_16_BIT;
+ break;
+ default:
+ ALOGE("%s: Unsupported format %#x for Incall Music", __func__,
+ config->format);
+ config->format = AUDIO_FORMAT_PCM_16_BIT;
+ ret = -EINVAL;
+ goto error_open;
+ }
+
ret = voice_extn_check_and_set_incall_music_usecase(adev, out);
if (ret != 0) {
ALOGE("%s: Incall music delivery usecase cannot be set error:%d",
- __func__, ret);
+ __func__, ret);
goto error_open;
}
- } else if (out->devices == AUDIO_DEVICE_OUT_TELEPHONY_TX) {
+ } else if (out->devices == AUDIO_DEVICE_OUT_TELEPHONY_TX) {
if (config->sample_rate == 0)
config->sample_rate = AFE_PROXY_SAMPLING_RATE;
if (config->sample_rate != 48000 && config->sample_rate != 16000 &&
diff --git a/hal/voice.c b/hal/voice.c
index f9e3562..fc38ab2 100644
--- a/hal/voice.c
+++ b/hal/voice.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
* Not a contribution.
*
* Copyright (C) 2013 The Android Open Source Project
@@ -228,6 +228,7 @@
uc_info->in_snd_device = SND_DEVICE_NONE;
uc_info->out_snd_device = SND_DEVICE_NONE;
+ adev->voice.use_device_mute = false;
if (audio_is_bluetooth_sco_device(uc_info->devices) && !adev->bt_sco_on) {
ALOGE("start_call: couldn't find BT SCO, SCO is not ready");
@@ -338,10 +339,10 @@
return in_call_rec;
}
- if(in->source == AUDIO_SOURCE_VOICE_DOWNLINK ||
- in->source == AUDIO_SOURCE_VOICE_UPLINK ||
- in->source == AUDIO_SOURCE_VOICE_CALL) {
- in_call_rec = true;
+ if (in->source == AUDIO_SOURCE_VOICE_DOWNLINK ||
+ in->source == AUDIO_SOURCE_VOICE_UPLINK ||
+ in->source == AUDIO_SOURCE_VOICE_CALL) {
+ in_call_rec = true;
}
return in_call_rec;
@@ -476,13 +477,21 @@
int err = 0;
adev->voice.mic_mute = state;
+
if (audio_extn_hfp_is_active(adev)) {
err = hfp_set_mic_mute(adev, state);
} else if (adev->mode == AUDIO_MODE_IN_CALL) {
- err = platform_set_mic_mute(adev->platform, state);
+ /* Use device mute if incall music delivery usecase is in progress */
+ if (adev->voice.use_device_mute)
+ err = platform_set_device_mute(adev->platform, state, "tx");
+ else
+ err = platform_set_mic_mute(adev->platform, state);
+ ALOGV("%s: voice mute status=%d, use_device_mute flag=%d",
+ __func__, state, adev->voice.use_device_mute);
} else if (adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
err = voice_extn_compress_voip_set_mic_mute(adev, state);
}
+
return err;
}
@@ -491,6 +500,27 @@
return adev->voice.mic_mute;
}
+/*
+ * Following function is called when incall music uplink usecase is
+ * created or destroyed while mic is muted. If incall music uplink
+ * usecase is active, apply voice device mute to mute only voice Tx
+ * path and not the mixed voice Tx + inncall-music path. Revert to
+ * voice stream mute once incall music uplink usecase is inactive
+ */
+void voice_set_device_mute_flag(struct audio_device *adev, bool state)
+{
+ if (adev->voice.mic_mute) {
+ if (state) {
+ platform_set_device_mute(adev->platform, true, "tx");
+ platform_set_mic_mute(adev->platform, false);
+ } else {
+ platform_set_mic_mute(adev->platform, true);
+ platform_set_device_mute(adev->platform, false, "tx");
+ }
+ }
+ adev->voice.use_device_mute = state;
+}
+
int voice_set_volume(struct audio_device *adev, float volume)
{
int vol, err = 0;
diff --git a/hal/voice.h b/hal/voice.h
index 3ae42a8..2ef790a 100644
--- a/hal/voice.h
+++ b/hal/voice.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
* Not a contribution.
*
* Copyright (C) 2013 The Android Open Source Project
@@ -61,6 +61,7 @@
struct voice_session session[MAX_VOICE_SESSIONS];
int tty_mode;
bool mic_mute;
+ bool use_device_mute;
float volume;
bool in_call;
};
@@ -101,4 +102,6 @@
snd_device_t out_snd_device,
bool enable);
bool voice_is_call_state_active(struct audio_device *adev);
+void voice_set_device_mute_flag (struct audio_device *adev, bool state);
+
#endif //VOICE_H
diff --git a/hal/voice_extn/voice_extn.c b/hal/voice_extn/voice_extn.c
index 93653ca..ec85259 100644
--- a/hal/voice_extn/voice_extn.c
+++ b/hal/voice_extn/voice_extn.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
* Not a contribution.
*
* Copyright (C) 2013 The Android Open Source Project
@@ -594,27 +594,16 @@
voice_extn_compress_voip_in_get_parameters(in, query, reply);
}
-#ifdef INCALL_MUSIC_ENABLED
int voice_extn_check_and_set_incall_music_usecase(struct audio_device *adev,
struct stream_out *out)
{
- uint32_t session_id = 0;
-
- session_id = get_session_id_with_state(adev, CALL_LOCAL_HOLD);
- if (session_id == VOICE_VSID) {
- out->usecase = USECASE_INCALL_MUSIC_UPLINK;
- } else if (session_id == VOICE2_VSID) {
- out->usecase = USECASE_INCALL_MUSIC_UPLINK2;
- } else {
- ALOGE("%s: Invalid session id %x", __func__, session_id);
- return -EINVAL;
- }
-
+ out->usecase = USECASE_INCALL_MUSIC_UPLINK;
out->config = pcm_config_incall_music;
- out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_MONO;
- out->channel_mask = AUDIO_CHANNEL_OUT_MONO;
+ //FIXME: add support for MONO stream configuration when audioflinger mixer supports it
+ out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_STEREO;
+ out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
+ out->config.rate = out->sample_rate;
+ ALOGV("%s: mode=%d, usecase id=%d", __func__, adev->mode, out->usecase);
return 0;
}
-#endif
-
diff --git a/hal/voice_extn/voice_extn.h b/hal/voice_extn/voice_extn.h
index f35344f..5d1cac3 100644
--- a/hal/voice_extn/voice_extn.h
+++ b/hal/voice_extn/voice_extn.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2014, 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2014, 2016-2018, The Linux Foundation. All rights reserved.
* Not a contribution.
*
* Copyright (C) 2013 The Android Open Source Project
@@ -101,13 +101,8 @@
}
#endif
-#ifdef INCALL_MUSIC_ENABLED
int voice_extn_check_and_set_incall_music_usecase(struct audio_device *adev,
struct stream_out *out);
-#else
-#define voice_extn_check_and_set_incall_music_usecase(adev, out) -ENOSYS
-#endif
-
#ifdef COMPRESS_VOIP_ENABLED
int voice_extn_compress_voip_close_output_stream(struct audio_stream *stream);
int voice_extn_compress_voip_open_output_stream(struct stream_out *out);