hal: add gapless offload playback control

-Set the property-vendor.audio.offload.gapless.enabled to true to enable
 gapless playback by default.
-Set mixer control to the driver to decide if gapless playback needs
 to be used or not
-If gapless playback is not enabled then partial drain from HAL is
 treated as full drain.

Bug: 157046086
Test: Test with Play Music
Change-Id: If010b7f730cc70dd55c2d4ff77ac272e60f3c4e2
Signed-off-by: Robert Lee <lerobert@google.com>
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 0f868ca..0f9dcf0 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -5002,6 +5002,30 @@
     pthread_mutex_unlock(&in->lock);
 }
 
+static int check_and_set_gapless_mode(struct audio_device *adev)
+{
+    bool gapless_enabled = false;
+    const char *mixer_ctl_name = "Compress Gapless Playback";
+    struct mixer_ctl *ctl;
+
+    ALOGV("%s:", __func__);
+    gapless_enabled = property_get_bool("vendor.audio.offload.gapless.enabled", false);
+
+    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+    if (!ctl) {
+        ALOGE("%s: Could not get ctl for mixer cmd - %s",
+                               __func__, mixer_ctl_name);
+        return -EINVAL;
+    }
+
+    if (mixer_ctl_set_value(ctl, 0, gapless_enabled) < 0) {
+        ALOGE("%s: Could not set gapless mode %d",
+                       __func__, gapless_enabled);
+        return -EINVAL;
+    }
+    return 0;
+}
+
 static int adev_open_output_stream(struct audio_hw_device *dev,
                                    audio_io_handle_t handle,
                                    audio_devices_t devices,
@@ -5170,6 +5194,9 @@
             out->non_blocking = 1;
 
         out->send_new_metadata = 1;
+
+        check_and_set_gapless_mode(adev);
+
         create_offload_callback_thread(out);
         ALOGV("%s: offloaded output offload_info version %04x bit rate %d",
                 __func__, config->offload_info.version,