audio: hal: Latency mode support for transcode loopback

Add property to enable latency mode configuration
for DSP HW transcode loopback usecase.

CRs-Fixed: 2092579
Change-Id: I8d5d1c1b684ebb535c96ac092d6b45b46e2deac6
diff --git a/hal/audio_extn/hw_loopback.c b/hal/audio_extn/hw_loopback.c
index 9938c04..b5c6228 100644
--- a/hal/audio_extn/hw_loopback.c
+++ b/hal/audio_extn/hw_loopback.c
@@ -62,7 +62,8 @@
 #include <system/thread_defs.h>
 #include <cutils/sched_policy.h>
 #include "audio_extn.h"
-#include "sound/compress_params.h"
+#include <sound/compress_params.h>
+#include <sound/compress_offload.h>
 #include <system/audio.h>
 
 /*
@@ -336,6 +337,27 @@
     return 0;
 }
 
+#if defined SNDRV_COMPRESS_LATENCY_MODE
+static void transcode_loopback_util_set_latency_mode(
+                             loopback_patch_t *active_loopback_patch,
+                             uint32_t latency_mode)
+{
+    struct snd_compr_metadata metadata;
+
+    metadata.key = SNDRV_COMPRESS_LATENCY_MODE;
+    metadata.value[0] = latency_mode;
+    ALOGV("%s: Setting latency mode %d",__func__, latency_mode);
+    compress_set_metadata(active_loopback_patch->source_stream,&metadata);
+}
+#else
+static void transcode_loopback_util_set_latency_mode(
+                            loopback_patch_t *active_loopback_patch __unused,
+                            uint32_t latency_mode __unused)
+{
+    ALOGD("%s:: Latency mode configuration not supported", __func__);
+}
+#endif
+
 /* Create a loopback session based on active loopback patch selected */
 int create_loopback_session(loopback_patch_t *active_loopback_patch)
 {
@@ -353,6 +375,7 @@
     struct stream_inout *inout =  &active_loopback_patch->patch_stream;
     struct adsp_hdlr_stream_cfg hdlr_stream_cfg;
     struct stream_in loopback_source_stream;
+    char prop_value[PROPERTY_VALUE_MAX] = {0};
 
     ALOGD("%s: Create loopback session begin", __func__);
 
@@ -465,6 +488,14 @@
     sink_config.fragments = 1;
     sink_config.codec = &codec;
 
+    /* Do not alter the location of sending latency mode property */
+    /* Mode set on any stream but before both streams are open */
+    if(property_get("audio.transcode.latency.mode", prop_value, "")) {
+        uint32_t latency_mode = atoi(prop_value);
+        transcode_loopback_util_set_latency_mode(active_loopback_patch,
+                                                 latency_mode);
+    }
+
     /* Open compress stream in playback path */
     active_loopback_patch->sink_stream = compress_open(adev->snd_card,
                          pcm_dev_asm_rx_id, COMPRESS_IN, &sink_config);