hikey960: Add hifi dsp audio example of increasing PCM Gain

In this example output stream buffer is send to DSP through
HIFI_MISC_IOCTL_PCM_GAIN Ioctl for increasing gain.

Bug: 64395692
Test: Manual

Change-Id: I1e931d985335d6d236c0edf84978170f651feffd
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
diff --git a/audio/audio_hw.c b/audio/audio_hw.c
index 33c569e..87fc4c6 100644
--- a/audio/audio_hw.c
+++ b/audio/audio_hw.c
@@ -40,6 +40,8 @@
 #include <hardware/audio_alsaops.h>
 #include <audio_effects/effect_aec.h>
 
+#include <sys/ioctl.h>
+#include <linux/audio_hifi.h>
 
 #define CARD_OUT 0
 #define PORT_CODEC 0
@@ -69,6 +71,7 @@
     struct alsa_stream_in *active_input;
     struct alsa_stream_out *active_output;
     bool mic_mute;
+    int hifi_dsp_fd;
 };
 
 struct alsa_stream_out {
@@ -249,6 +252,7 @@
     size_t frame_size = audio_stream_out_frame_size(stream);
     size_t out_frames = bytes / frame_size;
     int kernel_frames;
+    struct misc_io_pcm_buf_param pcmbuf;
 
     /* acquiring hw device mutex systematically is useful if a low priority thread is waiting
      * on the output stream mutex - e.g. executing select_mode() while holding the hw device
@@ -267,6 +271,15 @@
 
     pthread_mutex_unlock(&adev->lock);
 
+    if (adev->hifi_dsp_fd >= 0) {
+        pcmbuf.buf = (uint64_t)buffer;
+        pcmbuf.buf_size = bytes;
+        ret = ioctl(adev->hifi_dsp_fd, HIFI_MISC_IOCTL_PCM_GAIN, &pcmbuf);
+        if (ret) {
+            ALOGV("hifi_dsp: Error buffer processing: %d", errno);
+        }
+    }
+
     ret = pcm_mmap_write(out->pcm, buffer, out_frames * frame_size);
     if (ret == 0) {
         out->written += out_frames;
@@ -630,7 +643,11 @@
 
 static int adev_close(hw_device_t *device)
 {
+    struct alsa_audio_device *adev = (struct alsa_audio_device *)device;
+
     ALOGV("adev_close");
+    if (adev->hifi_dsp_fd >= 0)
+        close(adev->hifi_dsp_fd);
     free(device);
     return 0;
 }
@@ -676,6 +693,12 @@
 
     *device = &adev->hw_device.common;
 
+    adev->hifi_dsp_fd = open(HIFI_DSP_MISC_DRIVER, O_WRONLY, 0);
+    if (adev->hifi_dsp_fd < 0) {
+        ALOGW("hifi_dsp: Error opening device %d", errno);
+    } else {
+        ALOGI("hifi_dsp: Open device");
+    }
     return 0;
 }