hal: add line in/out transcode loopback support

Adding hal changes to support line in/out transcode
loopback support.

Change-Id: I196f9180e3ef7543cca288bf1582bb298fbb6313
diff --git a/hal/audio_extn/hw_loopback.c b/hal/audio_extn/hw_loopback.c
index ebf41db..f10c4bf 100644
--- a/hal/audio_extn/hw_loopback.c
+++ b/hal/audio_extn/hw_loopback.c
@@ -66,17 +66,6 @@
 #include <sound/compress_offload.h>
 #include <system/audio.h>
 
-/*
-* Unique patch handle ID = (unique_patch_handle_type << 8 | patch_handle_num)
-* Eg : HDMI_IN_SPKR_OUT handles can be 0x1000, 0x1001 and so on..
-*/
-typedef enum patch_handle_type {
-    AUDIO_PATCH_HDMI_IN_SPKR_OUT=0x10,
-    AUDIO_PATCH_SPDIF_IN_SPKR_OUT,
-    AUDIO_PATCH_MIC_IN_SPKR_OUT,
-    AUDIO_PATCH_MIC_IN_HDMI_OUT
-} patch_handle_type_t;
-
 typedef enum patch_state {
     PATCH_INACTIVE,// Patch is not created yet
     PATCH_CREATED, // Patch created but not in running state yet, probably due
@@ -190,9 +179,12 @@
 
 /* Get patch type based on source and sink ports configuration */
 /* Only ports of type 'DEVICE' are supported */
-patch_handle_type_t get_loopback_patch_type(loopback_patch_t*  loopback_patch)
+audio_patch_handle_t get_loopback_patch_type(loopback_patch_t*  loopback_patch)
 {
-    bool is_source_hdmi=false, is_sink_supported=false;
+    bool is_source_supported = false, is_sink_supported = false;
+    audio_devices_t source_device = loopback_patch->loopback_source.ext.device.type;
+    audio_devices_t sink_device = loopback_patch->loopback_sink.ext.device.type;
+
     if (loopback_patch->patch_handle_id != PATCH_HANDLE_INVALID) {
         ALOGE("%s, Patch handle already exists", __func__);
         return loopback_patch->patch_handle_id;
@@ -201,8 +193,8 @@
     if (loopback_patch->loopback_source.role == AUDIO_PORT_ROLE_SOURCE) {
         switch (loopback_patch->loopback_source.type) {
             case AUDIO_PORT_TYPE_DEVICE :
-                if ((loopback_patch->loopback_source.config_mask &
-                   AUDIO_PORT_CONFIG_FORMAT) && (loopback_patch->loopback_source.ext.device.type & AUDIO_DEVICE_IN_HDMI)) {
+                if ((loopback_patch->loopback_source.config_mask & AUDIO_PORT_CONFIG_FORMAT)) {
+                    if (loopback_patch->loopback_source.ext.device.type & AUDIO_DEVICE_IN_HDMI) {
                        switch (loopback_patch->loopback_source.format) {
                            case AUDIO_FORMAT_PCM:
                            case AUDIO_FORMAT_PCM_16_BIT:
@@ -211,10 +203,13 @@
                            case AUDIO_FORMAT_IEC61937:
                            case AUDIO_FORMAT_AC3:
                            case AUDIO_FORMAT_E_AC3:
-                              is_source_hdmi = true;
+                              is_source_supported = true;
                            break;
+                       }
+                    } else if (loopback_patch->loopback_source.ext.device.type & AUDIO_DEVICE_IN_LINE) {
+                       is_source_supported = true;
+                    }
                 }
-            }
             break;
             default :
             break;
@@ -247,8 +242,8 @@
             //Unsupported as of now, need to extend for other sink types
         }
     }
-    if (is_source_hdmi && is_sink_supported) {
-        return AUDIO_PATCH_HDMI_IN_SPKR_OUT;
+    if (is_source_supported && is_sink_supported) {
+        return source_device | sink_device;
     }
     ALOGE("%s, Unsupported source or sink port config", __func__);
     return loopback_patch->patch_handle_id;
@@ -613,7 +608,7 @@
                                      audio_patch_handle_t *handle)
 {
     int status = 0;
-    patch_handle_type_t loopback_patch_type=0x0;
+    audio_patch_handle_t loopback_patch_id = 0x0;
     loopback_patch_t loopback_patch, *active_loopback_patch = NULL;
 
     ALOGV("%s : Create audio patch begin", __func__);
@@ -656,9 +651,9 @@
     audio_port_config));
 
     /* Get loopback patch type based on source and sink ports configuration */
-    loopback_patch_type = get_loopback_patch_type(active_loopback_patch);
+    loopback_patch_id = get_loopback_patch_type(active_loopback_patch);
 
-    if (loopback_patch_type == PATCH_HANDLE_INVALID) {
+    if (loopback_patch_id == PATCH_HANDLE_INVALID) {
         ALOGE("%s, Unsupported patch type", __func__);
         status = -EINVAL;
         goto exit_create_patch;
@@ -670,8 +665,7 @@
                                 &active_loopback_patch->loopback_sink);
     // Lock patch database, create patch handle and add patch handle to the list
 
-    active_loopback_patch->patch_handle_id = (loopback_patch_type << 8 |
-                                audio_loopback_mod->patch_db.num_patches);
+    active_loopback_patch->patch_handle_id = loopback_patch_id;
 
     /* Is usecase transcode loopback? If yes, invoke loopback driver */
     if ((active_loopback_patch->loopback_source.type == AUDIO_PORT_TYPE_DEVICE)