audio: add separate audio Input path feature

- Separate audio input path can be set using input source of audio parameter
    1. Voice Recognition
    2. Camcording
    3. etc.

Change-Id: I7ab3b529a8d39af412d10d2d7ab4ce111db967bb
diff --git a/alsa_sound/ALSAStreamOps.cpp b/alsa_sound/ALSAStreamOps.cpp
index 88d2db4..4c4a062 100644
--- a/alsa_sound/ALSAStreamOps.cpp
+++ b/alsa_sound/ALSAStreamOps.cpp
@@ -192,6 +192,18 @@
     AudioParameter param = AudioParameter(keyValuePairs);
     String8 key = String8(AudioParameter::keyRouting);
     int device;
+
+#ifdef SEPERATED_AUDIO_INPUT
+    String8 key_input = String8(AudioParameter::keyInputSource);
+    int source;
+
+    if (param.getInt(key_input, source) == NO_ERROR) {
+        ALOGD("setParameters(), input_source = %d", source);
+        mParent->mALSADevice->setInput(source);
+        param.remove(key_input);
+    }
+#endif
+
     if (param.getInt(key, device) == NO_ERROR) {
         // Ignore routing if device is 0.
         ALOGD("setParameters(): keyRouting with device %d", device);
diff --git a/alsa_sound/Android.mk b/alsa_sound/Android.mk
index dcf51c9..7cd63e6 100644
--- a/alsa_sound/Android.mk
+++ b/alsa_sound/Android.mk
@@ -17,6 +17,10 @@
 LOCAL_CFLAGS += -DUSES_FLUENCE_INCALL
 endif
 
+ifeq ($(strip $(BOARD_USES_SEPERATED_AUDIO_INPUT)),true)
+LOCAL_CFLAGS += -DSEPERATED_AUDIO_INPUT
+endif
+
 LOCAL_SRC_FILES := \
   AudioHardwareALSA.cpp 	\
   AudioStreamOutALSA.cpp 	\
@@ -116,6 +120,10 @@
 LOCAL_CFLAGS += -DUSES_FLUENCE_INCALL
 endif
 
+ifeq ($(strip $(BOARD_USES_SEPERATED_AUDIO_INPUT)),true)
+LOCAL_CFLAGS += -DSEPERATED_AUDIO_INPUT
+endif
+
 ifneq ($(ALSA_DEFAULT_SAMPLE_RATE),)
     LOCAL_CFLAGS += -DALSA_DEFAULT_SAMPLE_RATE=$(ALSA_DEFAULT_SAMPLE_RATE)
 endif
diff --git a/alsa_sound/AudioHardwareALSA.h b/alsa_sound/AudioHardwareALSA.h
index 0dcc672..04eea77 100644
--- a/alsa_sound/AudioHardwareALSA.h
+++ b/alsa_sound/AudioHardwareALSA.h
@@ -203,6 +203,9 @@
     void     (*setVocRecMode)(uint8_t);
     void     (*setVoLTEMicMute)(int);
     void     (*setVoLTEVolume)(int);
+#ifdef SEPERATED_AUDIO_INPUT
+    void     (*setInput)(int);
+#endif
 };
 
 // ----------------------------------------------------------------------------
diff --git a/alsa_sound/alsa_default.cpp b/alsa_sound/alsa_default.cpp
index 6c329e8..d589f5c 100644
--- a/alsa_sound/alsa_default.cpp
+++ b/alsa_sound/alsa_default.cpp
@@ -67,6 +67,11 @@
 static void     s_set_voc_rec_mode(uint8_t mode);
 static void     s_set_volte_mic_mute(int state);
 static void     s_set_volte_volume(int vol);
+#ifdef SEPERATED_AUDIO_INPUT
+static void     s_setInput(int);
+
+static int input_source;
+#endif
 
 static char mic_type[25];
 static char curRxUCMDevice[50];
@@ -137,6 +142,9 @@
     dev->setVocRecMode = s_set_voc_rec_mode;
     dev->setVoLTEMicMute = s_set_volte_mic_mute;
     dev->setVoLTEVolume = s_set_volte_volume;
+#ifdef SEPERATED_AUDIO_INPUT
+    dev->setInput = s_setInput;
+#endif
 
     *device = &dev->common;
 
@@ -1383,8 +1391,17 @@
                     return strdup(SND_USE_CASE_DEV_SSR_QUAD_MIC); /* SSR Quad MIC */
                 }
 #endif
+#ifdef SEPERATED_AUDIO_INPUT
+                if(input_source == AUDIO_SOURCE_VOICE_RECOGNITION) {
+                    ALOGV("getUCMdevice returned the VOICE_RECOGNITION UCM by  input source = %d", input_source);
+                    return strdup(SND_USE_CASE_DEV_VOICE_RECOGNITION ); /* VOICE RECOGNITION TX */
+                } else if(input_source == AUDIO_SOURCE_CAMCORDER) {
+                    ALOGV("getUCMdevice returned the Camcorder Tx UCM by  input source = %d", input_source);
+                    return strdup(SND_USE_CASE_DEV_CAMCORDER_TX ); /* CAMCORDER TX */
+                }
+#endif
                 else {
-                    return strdup(SND_USE_CASE_DEV_LINE); /* BUILTIN-MIC TX */
+                    return strdup(SND_USE_CASE_DEV_HANDSET); /* BUILTIN-MIC TX */
                 }
             }
         } else if (devices & AudioSystem::DEVICE_IN_AUX_DIGITAL) {
@@ -1644,4 +1661,11 @@
     return err;
 }
 
+#ifdef SEPERATED_AUDIO_INPUT
+void s_setInput(int input)
+{
+    input_source = input;
+    ALOGD("s_setInput() : input_source = %d",input_source);
+}
+#endif
 }
diff --git a/libalsa-intf/msm8960_use_cases.h b/libalsa-intf/msm8960_use_cases.h
index 7e61232..44d6533 100644
--- a/libalsa-intf/msm8960_use_cases.h
+++ b/libalsa-intf/msm8960_use_cases.h
@@ -61,11 +61,11 @@
 #define DEVICE_BT_SCO_TX_WB_ACDB_ID                     38// BT_SCO_WB_MIC
 #define DEVICE_SPEAKER_HEADSET_RX_ACDB_ID               DEVICE_HEADSET_RX_ACDB_ID // Use headset calibration
 #define DEVICE_HDMI_STEREO_RX_ACDB_ID                   18// HDMI_SPKR
-#define DEVICE_ANC_HEADSET_STEREO_RX_ACDB_ID            26//ANC RX, same as regular headset
+#define DEVICE_ANC_HEADSET_STEREO_RX_ACDB_ID            26// ANC RX, same as regular headset
 #define DEVICE_QUADMIC_ACDB_ID                          19// QUADMIC_SKPR
-#define DEVICE_PROXY_RX_ACDB_ID   	               DEVICE_HDMI_STEREO_RX_ACDB_ID
-#define DEVICE_TTY_VCO_HANDSET_TX_ACDB_ID		36 //TTY_VCO_HANDSET_MIC
-#define DEVICE_TTY_HCO_HANDSET_RX_ACDB_ID               37 //TTY_HCO_HANDSET_SPRK
+#define DEVICE_PROXY_RX_ACDB_ID                         DEVICE_HDMI_STEREO_RX_ACDB_ID
+#define DEVICE_TTY_VCO_HANDSET_TX_ACDB_ID               36// TTY_VCO_HANDSET_MIC
+#define DEVICE_TTY_HCO_HANDSET_RX_ACDB_ID               37// TTY_HCO_HANDSET_SPRK
 #define DEVICE_HANDSET_TX_FV5_ACDB_ID                   40
 #define DEVICE_DUALMIC_HANDSET_TX_ENDFIRE_FV5_ACDB_ID   41
 #define DEVICE_SPEAKER_TX_FV5_ACDB_ID                   42
@@ -73,6 +73,8 @@
 #define DEVICE_INCALL_VOICE_RECORD_STEREO_ACDB_ID       45
 #define DEVICE_INCALL_MUSIC_DELIVERY_MONO_ACDB_ID       46
 #define DEVICE_INCALL_VOICE_RECORD_MONO_ACDB_ID         47
+#define DEVICE_CAMCORDER_TX_ACDB_ID                     61// CAMCORDER_TX
+#define DEVICE_VOICE_RECOGNITION_ACDB_ID                62// VOICE_RECOGNITION
 
 /* mixer control type */
 #define TYPE_INT            0
@@ -244,6 +246,8 @@
 #define SND_USE_CASE_DEV_PROXY_RX_ANC_HEADSET     "PROXY Rx ANC Headset"
 #define SND_USE_CASE_DEV_PROXY_RX_SPEAKER_HEADSET "PROXY Rx Speaker Headset"
 #define SND_USE_CASE_DEV_PROXY_RX_SPEAKER_ANC_HEADSET "PROXY Rx Speaker ANC Headset"
+#define SND_USE_CASE_DEV_CAMCORDER_TX        "Camcorder Tx"
+#define SND_USE_CASE_DEV_VOICE_RECOGNITION   "Voice Recognition"
 
 #define SND_USE_CASE_MOD_PLAY_FM         "Play FM"
 #define SND_USE_CASE_MOD_CAPTURE_FM      "Capture FM"