hal: Add USB 6ch recording support
Add USB 6 channel MIC device support to enable audio
recording over 6 channels from USB device.
Change-Id: Ice68b6901991266e331cbf7735e187a7d3ed38b3
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 2753ff8..08b8e5b 100755
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -512,6 +512,10 @@
[SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = "usb-headset-mic",
[SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC] = "usb-headset-mic",
[SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC] = "usb-headset-mic",
+ [SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC] = "usb-headset-mic",
+ [SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MULTI_CHANNEL_MIC] = "usb-headset-mic",
+ [SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC_AEC] = "usb-headset-mic",
+ [SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MULTI_CHANNEL_MIC] = "usb-headset-mic",
[SND_DEVICE_IN_CAPTURE_FM] = "capture-fm",
[SND_DEVICE_IN_AANC_HANDSET_MIC] = "aanc-handset-mic",
[SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = "aanc-handset-mic",
@@ -688,6 +692,10 @@
[SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC] = 44,
[SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC] = 44,
[SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = 44,
+ [SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC] = 162,
+ [SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MULTI_CHANNEL_MIC] = 162,
+ [SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC_AEC] = 162,
+ [SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MULTI_CHANNEL_MIC] = 162,
[SND_DEVICE_IN_CAPTURE_FM] = 0,
[SND_DEVICE_IN_AANC_HANDSET_MIC] = 104,
[SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = 105,
@@ -840,6 +848,10 @@
{TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MIC_AEC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MULTI_CHANNEL_MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MULTI_CHANNEL_MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC_AEC)},
{TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_FM)},
{TO_NAME_INDEX(SND_DEVICE_IN_AANC_HANDSET_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC)},
@@ -1091,6 +1103,26 @@
return ret;
}
+static snd_device_t fixup_usb_headset_mic_snd_device(void *platform,
+ snd_device_t base,
+ snd_device_t other)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+ struct audio_device *adev = my_data->adev;
+ if (adev->active_input == NULL) {
+ return base;
+ }
+ unsigned int sr = adev->active_input->sample_rate;
+ unsigned int ch = popcount(adev->active_input->channel_mask);
+ unsigned int bit_width = adev->active_input->bit_width;
+ if (audio_extn_usb_is_config_supported(&bit_width, &sr, &ch, false)
+ && ((ch == 6) || (ch == 8))) {
+ return other;
+ } else {
+ return base;
+ }
+}
+
static const char *platform_get_mixer_control(struct mixer_ctl *);
bool platform_send_gain_dep_cal(void *platform, int level) {
@@ -1430,6 +1462,10 @@
backend_tag_table[SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC] = strdup("usb-headset-mic");
backend_tag_table[SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC] = strdup("usb-headset-mic");
backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = strdup("usb-headset-mic");
+ backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC] = strdup("usb-headset-mic");
+ backend_tag_table[SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MULTI_CHANNEL_MIC] = strdup("usb-headset-mic");
+ backend_tag_table[SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MULTI_CHANNEL_MIC] = strdup("usb-headset-mic");
+ backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC_AEC] = strdup("usb-headset-mic");
backend_tag_table[SND_DEVICE_IN_CAPTURE_FM] = strdup("capture-fm");
backend_tag_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("transmission-fm");
backend_tag_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("headphones-dsd");
@@ -1552,6 +1588,7 @@
hw_interface_table[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_RX] = strdup("RT_PROXY_DAI_002_TX");
hw_interface_table[SND_DEVICE_IN_USB_HEADSET_MIC] = strdup("USB_AUDIO_TX");
+ hw_interface_table[SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC] = strdup("USB_AUDIO_TX");
hw_interface_table[SND_DEVICE_IN_CAPTURE_FM] = strdup("SLIMBUS_8_TX");
hw_interface_table[SND_DEVICE_IN_AANC_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_QUAD_MIC] = strdup("SLIMBUS_0_TX");
@@ -4386,7 +4423,7 @@
(AUDIO_DEVICE_OUT_USB_DEVICE |
AUDIO_DEVICE_OUT_USB_HEADSET)) {
if (audio_extn_usb_is_capture_supported()) {
- snd_device = SND_DEVICE_IN_VOICE_USB_HEADSET_MIC;
+ snd_device = SND_DEVICE_IN_VOICE_USB_HEADSET_MIC;
}
}
} else if (my_data->use_generic_handset == true && // system prop is enabled
@@ -4464,7 +4501,9 @@
snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
}
} else if (audio_is_usb_in_device(in_device | AUDIO_DEVICE_BIT_IN)) {
- snd_device = SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC;
+ snd_device = fixup_usb_headset_mic_snd_device(platform,
+ SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC,
+ SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MULTI_CHANNEL_MIC);
}
} else if (source == AUDIO_SOURCE_UNPROCESSED) {
if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
@@ -4484,7 +4523,9 @@
} else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
snd_device = SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC;
} else if (audio_is_usb_in_device(in_device | AUDIO_DEVICE_BIT_IN)) {
- snd_device = SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC;
+ snd_device = fixup_usb_headset_mic_snd_device(platform,
+ SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC,
+ SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MULTI_CHANNEL_MIC);
}
} else if ((source == AUDIO_SOURCE_VOICE_COMMUNICATION) ||
(mode == AUDIO_MODE_IN_COMMUNICATION)) {
@@ -4572,7 +4613,9 @@
} else if (in_device & AUDIO_DEVICE_IN_FM_TUNER) {
snd_device = SND_DEVICE_IN_CAPTURE_FM;
} else if (audio_extn_usb_connected(NULL) && audio_is_usb_in_device(in_device | AUDIO_DEVICE_BIT_IN)) {
- snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
+ snd_device = fixup_usb_headset_mic_snd_device(platform,
+ SND_DEVICE_IN_USB_HEADSET_MIC,
+ SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC);
} else {
ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
ALOGW("%s: Using default handset-mic", __func__);
@@ -4620,9 +4663,9 @@
(AUDIO_DEVICE_OUT_USB_DEVICE |
AUDIO_DEVICE_OUT_USB_HEADSET)) {
if (audio_extn_usb_is_capture_supported() && audio_extn_usb_connected(NULL))
- snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
- else
- snd_device = SND_DEVICE_IN_HANDSET_MIC;
+ snd_device = fixup_usb_headset_mic_snd_device(platform,
+ SND_DEVICE_IN_USB_HEADSET_MIC,
+ SND_DEVICE_IN_USB_HEADSET_MULTI_CHANNEL_MIC);
} else {
ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
ALOGW("%s: Using default handset-mic", __func__);