Merge "hal: Fix incorrect channel setting for Mmap record path"
diff --git a/configs/msmsteppe/audio_output_policy.conf b/configs/msmsteppe/audio_io_policy.conf
similarity index 86%
rename from configs/msmsteppe/audio_output_policy.conf
rename to configs/msmsteppe/audio_io_policy.conf
index 877b6a5..3fc62eb 100644
--- a/configs/msmsteppe/audio_output_policy.conf
+++ b/configs/msmsteppe/audio_io_policy.conf
@@ -82,3 +82,24 @@
app_type 69940
}
}
+
+inputs {
+ record_16bit {
+ formats AUDIO_FORMAT_PCM_16_BIT
+ sampling_rates 8000|16000|32000|44100|48000|88200|96000|176400|192000
+ bit_width 16
+ app_type 69938
+ }
+ record_24bit {
+ formats AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_24_BIT
+ sampling_rates 44100|48000|88200|96000|176400|192000
+ bit_width 24
+ app_type 69948
+ }
+ record_32bit {
+ formats AUDIO_FORMAT_PCM_32_BIT|AUDIO_FORMAT_PCM_FLOAT
+ sampling_rates 44100|48000|88200|96000|176400|192000
+ bit_width 32
+ app_type 69949
+ }
+}
diff --git a/configs/msmsteppe/audio_platform_info.xml b/configs/msmsteppe/audio_platform_info.xml
index 15c9119..fb181f5 100644
--- a/configs/msmsteppe/audio_platform_info.xml
+++ b/configs/msmsteppe/audio_platform_info.xml
@@ -42,6 +42,10 @@
<device name="SND_DEVICE_IN_UNPROCESSED_THREE_MIC" acdb_id="145"/>
<device name="SND_DEVICE_IN_UNPROCESSED_QUAD_MIC" acdb_id="146"/>
<device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" acdb_id="147"/>
+ <device name="SND_DEVICE_IN_USB_HEADSET_HEX_MIC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_USB_HEADSET_HEX_MIC_AEC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_HEX_MIC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_VOCE_RECOG_USB_HEADSET_HEX_MIC" acdb_id="162"/>
</acdb_ids>
<module_ids>
diff --git a/configs/msmsteppe/audio_platform_info_intcodec.xml b/configs/msmsteppe/audio_platform_info_intcodec.xml
index 14f9421..2e98afc 100644
--- a/configs/msmsteppe/audio_platform_info_intcodec.xml
+++ b/configs/msmsteppe/audio_platform_info_intcodec.xml
@@ -100,6 +100,10 @@
<device name="SND_DEVICE_IN_UNPROCESSED_THREE_MIC" acdb_id="145"/>
<device name="SND_DEVICE_IN_UNPROCESSED_QUAD_MIC" acdb_id="146"/>
<device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" acdb_id="147"/>
+ <device name="SND_DEVICE_IN_USB_HEADSET_HEX_MIC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_USB_HEADSET_HEX_MIC_AEC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_HEX_MIC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_VOCE_RECOG_USB_HEADSET_HEX_MIC" acdb_id="162"/>
<device name="SND_DEVICE_IN_HANDSET_GENERIC_QMIC" acdb_id="157"/>
</acdb_ids>
<backend_names>
diff --git a/configs/msmsteppe/audio_policy_configuration.xml b/configs/msmsteppe/audio_policy_configuration.xml
index 2131c39..4a0ff8a 100644
--- a/configs/msmsteppe/audio_policy_configuration.xml
+++ b/configs/msmsteppe/audio_policy_configuration.xml
@@ -187,6 +187,17 @@
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,AUDIO_CHANNEL_INDEX_MASK_4,AUDIO_CHANNEL_IN_5POINT1,AUDIO_CHANNEL_INDEX_MASK_6"/>
</mixPort>
+ <mixPort name="usb_surround_sound" role="sink">
+ <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,88200,96000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3,AUDIO_CHANNEL_INDEX_MASK_4,AUDIO_CHANNEL_IN_5POINT1,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,88200,96000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_5POINT1,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ <profile name="" format="AUDIO_FORMAT_PCM_FLOAT"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,88200,96000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_5POINT1,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ </mixPort>
<mixPort name="record_24" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,96000,192000"
@@ -312,15 +323,26 @@
</devicePort>
<devicePort tagName="USB Device In" type="AUDIO_DEVICE_IN_USB_DEVICE" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ <!-- edit as needed -->
+ <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
</devicePort>
<devicePort tagName="USB Headset In" type="AUDIO_DEVICE_IN_USB_HEADSET" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ <!-- edit as needed -->
+ <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
</devicePort>
</devicePorts>
@@ -360,6 +382,8 @@
sources="Wired Headset Mic,BT SCO Headset Mic,FM Tuner,USB Device In,USB Headset In,Telephony Rx"/>
<route type="mix" sink="surround_sound"
sources="Built-In Mic,Built-In Back Mic"/>
+ <route type="mix" sink="usb_surround_sound"
+ sources="USB Device In,USB Headset In"/>
<route type="mix" sink="record_24"
sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic"/>
<route type="mix" sink="mmap_no_irq_in"
diff --git a/configs/msmsteppe/msmsteppe.mk b/configs/msmsteppe/msmsteppe.mk
index a275dee..e7158fa 100644
--- a/configs/msmsteppe/msmsteppe.mk
+++ b/configs/msmsteppe/msmsteppe.mk
@@ -74,7 +74,7 @@
DEVICE_PACKAGE_OVERLAYS += hardware/qcom/audio/configs/common/overlay
PRODUCT_COPY_FILES += \
- hardware/qcom/audio/configs/msmsteppe/audio_output_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_output_policy.conf \
+ hardware/qcom/audio/configs/msmsteppe/audio_io_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_io_policy.conf \
hardware/qcom/audio/configs/msmsteppe/audio_effects.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.conf \
hardware/qcom/audio/configs/msmsteppe/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \
hardware/qcom/audio/configs/msmsteppe/audio_tuning_mixer_tavil.txt:$(TARGET_COPY_OUT_VENDOR)/etc/audio_tuning_mixer_tavil.txt \
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index 17ba960..634e0b4 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -84,6 +84,7 @@
#define MIXER_ENC_FMT_SBC "SBC"
#define MIXER_ENC_FMT_AAC "AAC"
#define MIXER_ENC_FMT_APTX "APTX"
+#define MIXER_FMT_TWS_CHANNEL_MODE "TWS Channel Mode"
#define MIXER_ENC_FMT_APTXHD "APTXHD"
#define MIXER_ENC_FMT_NONE "NONE"
#define ENCODER_LATENCY_SBC 10
@@ -173,6 +174,7 @@
typedef int (*audio_check_a2dp_ready_t)(void);
typedef uint16_t (*audio_get_a2dp_sink_latency_t)(void);
typedef int (*audio_is_scrambling_enabled_t)(void);
+typedef bool (*audio_is_tws_mono_mode_enable_t)(void);
enum A2DP_STATE {
A2DP_STATE_CONNECTED,
@@ -235,6 +237,7 @@
audio_check_a2dp_ready_t audio_check_a2dp_ready;
audio_get_a2dp_sink_latency_t audio_get_a2dp_sink_latency;
audio_is_scrambling_enabled_t audio_is_scrambling_enabled;
+ audio_is_tws_mono_mode_enable_t audio_is_tws_mono_mode_enable;
enum A2DP_STATE bt_state;
enc_codec_t bt_encoder_format;
uint32_t enc_sampling_rate;
@@ -245,6 +248,8 @@
bool is_a2dp_offload_supported;
bool is_handoff_in_progress;
bool is_aptx_dual_mono_supported;
+ /* Mono Mode support for TWS+ */
+ bool is_tws_mono_mode_on;
bool is_aptx_adaptive;
/* Adaptive bitrate config for A2DP codecs */
struct a2dp_abr_config abr_config;
@@ -758,6 +763,8 @@
dlsym(a2dp.bt_lib_handle,"audio_get_a2dp_sink_latency");
a2dp.audio_is_scrambling_enabled = (audio_is_scrambling_enabled_t)
dlsym(a2dp.bt_lib_handle,"audio_is_scrambling_enabled");
+ a2dp.audio_is_tws_mono_mode_enable = (audio_is_tws_mono_mode_enable_t)
+ dlsym(a2dp.bt_lib_handle,"isTwsMonomodeEnable");
}
}
@@ -1206,6 +1213,26 @@
return ret;
}
+
+static void audio_a2dp_update_tws_channel_mode()
+{
+ char* channel_mode;
+ struct mixer_ctl *ctl_channel_mode;
+ if (a2dp.is_tws_mono_mode_on)
+ channel_mode = "One";
+ else
+ channel_mode = "Two";
+ ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_TWS_CHANNEL_MODE);
+ if (!ctl_channel_mode) {
+ ALOGE("failed to get tws mixer ctl");
+ return;
+ }
+ if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
+ ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
+ return;
+ }
+}
+
static int update_aptx_dsp_config_v2(struct aptx_enc_cfg_t *aptx_dsp_cfg,
audio_aptx_encoder_config *aptx_bt_cfg)
{
@@ -1235,8 +1262,15 @@
break;
case 2:
default:
- aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
- aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
+ if (!a2dp.is_tws_mono_mode_on) {
+ aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
+ aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
+ }
+ else {
+ a2dp.is_tws_mono_mode_on = true;
+ ALOGD("Update tws for mono_mode_on: %d",a2dp.is_tws_mono_mode_on);
+ audio_a2dp_update_tws_channel_mode();
+ }
break;
}
a2dp.enc_channels = aptx_dsp_cfg->custom_cfg.num_channels;
@@ -1665,6 +1699,8 @@
case ENC_CODEC_TYPE_APTX_DUAL_MONO:
ALOGD(" Received APTX dual mono encoder supported BT device");
a2dp.is_aptx_dual_mono_supported = true;
+ if (a2dp.audio_is_tws_mono_mode_enable != NULL)
+ a2dp.is_tws_mono_mode_on = a2dp.audio_is_tws_mono_mode_enable();
aptx_encoder_cfg.dual_mono_cfg = (audio_aptx_dual_mono_config *)codec_info;
is_configured =
configure_aptx_enc_format(&aptx_encoder_cfg);
@@ -1765,8 +1801,9 @@
{
int ret =0;
- struct mixer_ctl *ctl_enc_config, *ctrl_bit_format;
+ struct mixer_ctl *ctl_enc_config, *ctrl_bit_format, *ctl_channel_mode;
struct sbc_enc_cfg_t dummy_reset_config;
+ char* channel_mode;
memset(&dummy_reset_config, 0x0, sizeof(struct sbc_enc_cfg_t));
ctl_enc_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
@@ -1788,6 +1825,17 @@
ALOGE("%s: Failed to set bit format to encoder", __func__);
}
}
+ ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_TWS_CHANNEL_MODE);
+
+ if (!ctl_channel_mode) {
+ ALOGE("failed to get tws mixer ctl");
+ } else {
+ channel_mode = "Two";
+ if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
+ ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
+ }
+ a2dp.is_tws_mono_mode_on = false;
+ }
}
static int reset_a2dp_dec_config_params()
@@ -1892,6 +1940,17 @@
goto param_handled;
}
+ ret = str_parms_get_str(parms, "TwsChannelConfig", value, sizeof(value));
+ if (ret>=0) {
+ ALOGD("Setting tws channel mode to %s",value);
+ if(!(strncmp(value,"mono",strlen(value))))
+ a2dp.is_tws_mono_mode_on = true;
+ else if(!(strncmp(value,"dual-mono",strlen(value))))
+ a2dp.is_tws_mono_mode_on = false;
+ audio_a2dp_update_tws_channel_mode();
+ goto param_handled;
+ }
+
ret = str_parms_get_str(parms, "A2dpSuspended", value, sizeof(value));
if (ret >= 0) {
if (a2dp.bt_lib_handle) {
@@ -2023,6 +2082,7 @@
a2dp.abr_config.abr_started = false;
a2dp.abr_config.imc_instance = 0;
a2dp.abr_config.abr_tx_handle = NULL;
+ a2dp.is_tws_mono_mode_on = false;
reset_a2dp_enc_config_params();
reset_a2dp_dec_config_params();
update_offload_codec_capabilities();
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index b586ca1..e49782f 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -3424,12 +3424,47 @@
"%s: stream can not declare supporting its sample rate %x", __func__, sample_rate);
}
+static inline uint32_t lcm(uint32_t num1, uint32_t num2)
+{
+ uint32_t high = num1, low = num2, temp = 0;
+
+ if (!num1 || !num2)
+ return 0;
+
+ if (num1 < num2) {
+ high = num2;
+ low = num1;
+ }
+
+ while (low != 0) {
+ temp = low;
+ low = high % low;
+ high = temp;
+ }
+ return (num1 * num2)/high;
+}
+
+static inline uint32_t nearest_multiple(uint32_t num, uint32_t multiplier)
+{
+ uint32_t remainder = 0;
+
+ if (!multiplier)
+ return num;
+
+ remainder = num % multiplier;
+ if (remainder)
+ num += (multiplier - remainder);
+
+ return num;
+}
+
static size_t get_input_buffer_size(uint32_t sample_rate,
audio_format_t format,
int channel_count,
bool is_low_latency)
{
size_t size = 0;
+ uint32_t bytes_per_period_sample = 0;
if (check_input_parameters(sample_rate, format, channel_count) != 0)
return 0;
@@ -3438,15 +3473,16 @@
if (is_low_latency)
size = configured_low_latency_capture_period_size;
- size *= audio_bytes_per_sample(format) * channel_count;
+ bytes_per_period_sample = audio_bytes_per_sample(format) * channel_count;
+ size *= bytes_per_period_sample;
/* make sure the size is multiple of 32 bytes
* At 48 kHz mono 16-bit PCM:
* 5.000 ms = 240 frames = 15*16*1*2 = 480, a whole multiple of 32 (15)
* 3.333 ms = 160 frames = 10*16*1*2 = 320, a whole multiple of 32 (10)
+ * Also, make sure the size is multiple of bytes per period sample
*/
- size += 0x1f;
- size &= ~0x1f;
+ size = nearest_multiple(size, lcm(32, bytes_per_period_sample));
return size;
}
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 2539ed1..8df3770 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -2381,8 +2381,6 @@
ALOGD("ACDB initialization failed");
}
}
- /* init keep-alive for compress passthru */
- audio_extn_keep_alive_init(adev);
#ifdef DYNAMIC_LOG_ENABLED
log_utils_init();
#endif