audio: kcontrol to set digital mode [2/4]

PD#SWPL-137621

Problem:
there is no audio server, need use mixer control to control digital mode.

Solution:
1) kcontrol named "Audio Digital Mode";
2) test usage: test_audiosetting mode "AML_HAL_XXX"; test_audiosetting mode;

Verify:
S805C1-BG201

Change-Id: I56eeef640baa6977e1f42cde8c375291fac22561
Signed-off-by: haiyang.ren <haiyang.ren@amlogic.com>
diff --git a/include/AML_Audio_Setting.h b/include/AML_Audio_Setting.h
index 7546636..dfec6ad 100644
--- a/include/AML_Audio_Setting.h
+++ b/include/AML_Audio_Setting.h
@@ -32,6 +32,15 @@
   AUDIO_PORT_MAX    = 2,
 };
 
+enum audio_digital_mode {
+  AML_HAL_PCM = 0,
+  AML_HAL_DD = 1,
+  AML_HAL_AUTO = 2,
+  AML_HAL_BYPASS = 3,
+  AML_HAL_DDP = 4,
+};
+
+
 /*
 *@brief     set volume via kcontrol
 *@param     Set volume value,The range of the value is [0,100],value is a int type
@@ -59,6 +68,19 @@
 */
 bool aml_audio_get_mute(int port);
 
+/*
+*@brief     set digital mode via kcontrol
+*@param     mode: audio digital enumeration type
+*@return    Return int type value,0 is setting successful, and <0 is setiing failed
+*/
+int aml_audio_set_digital_mode(enum audio_digital_mode mode);
+
+/*
+*@brief     get digital mode via kcontrol
+*@return    Return audio digital mode
+*/
+int aml_audio_get_digital_mode();
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/AML_Audio_Setting.cpp b/src/AML_Audio_Setting.cpp
index 8d6ed79..444a75b 100644
--- a/src/AML_Audio_Setting.cpp
+++ b/src/AML_Audio_Setting.cpp
@@ -47,6 +47,7 @@
 #define AML_CHIP_ID_S1A 69
 #define HDMI_OUT_MUTE "Audio hdmi-out mute"
 #define DAC_DIGITAL_VOLUME "DAC Digital Playback Volume"
+#define DIGITAL_MODE "Audio Digital Mode"
 #define DAC_DIGITAl_DEFAULT_VOLUME          (251)
 #define HEADPHONE_DAC_CHANNEL_NUM    (2)
 
@@ -790,4 +791,33 @@
     return ret;
 }
 
+    int aml_audio_set_digital_mode(enum audio_digital_mode mode)
+    {
+        int ret = 0;
+        if ((mode != AML_HAL_PCM) && (mode != AML_HAL_DDP) &&
+            (mode != AML_HAL_AUTO) && (mode != AML_HAL_BYPASS) &&
+            (mode != AML_HAL_DD)) {
+            printf("Invalid mode\n");
+            return false;
+        }
+
+        pthread_mutex_lock(&g_volume_lock);
+        ret = aml_audio_mixer_int(DIGITAL_MODE, mode, true);
+        ALOGD("[%s:%d] mode: %d, ret: %d", __func__, __LINE__, mode, ret);
+        pthread_mutex_unlock(&g_volume_lock);
+
+        return ret;
+    }
+
+    int aml_audio_get_digital_mode()
+    {
+        pthread_mutex_lock(&g_volume_lock);
+        int ret = 0;
+        ret = aml_audio_mixer_int(DIGITAL_MODE, 0, false);
+        ALOGD("[%s:%d] mod: %d", __func__, __LINE__, ret);
+        pthread_mutex_unlock(&g_volume_lock);
+
+        return ret;
+    }
+
 }//extern c
diff --git a/src/test_audiosetting.c b/src/test_audiosetting.c
index b5147e8..d70b4e6 100644
--- a/src/test_audiosetting.c
+++ b/src/test_audiosetting.c
@@ -28,6 +28,8 @@
     printf("      get volume          : test_audiosetting volume\n");
     printf("      set mute            : test_audiosetting mute port x (port:hdmi or hp, x is mute:1 or unmute:0)\n");
     printf("      get mute            : test_audiosetting mute port (port:hdmi or hp)\n");
+    printf("      set mode            : test_audiosetting mode \"AML_HAL_xxx\"\n");
+    printf("      get mode            : test_audiosetting mode\n");
 }
 
 int main(int argc, char **argv)
@@ -56,6 +58,20 @@
         else if (!strncmp("hp", argv[2], sizeof("hp")))
             ret = aml_audio_get_mute(AUDIO_PORT_HEADPHONE);
         printf("aml_audio_get_mute(%s): %smute\n", argv[2], ret ? "" : "un");
+    } else if (!strncmp("mode", argv[1], sizeof("mode")) && argv[2] != NULL) {
+        if (!strncmp("AML_HAL_PCM", argv[2], sizeof("AML_HAL_PCM")))
+            ret = aml_audio_set_digital_mode(AML_HAL_PCM);
+        else if (!strncmp("AML_HAL_DD", argv[2], sizeof("AML_HAL_DD")))
+            ret = aml_audio_set_digital_mode(AML_HAL_DD);
+        else if (!strncmp("AML_HAL_AUTO", argv[2], sizeof("AML_HAL_AUTO")))
+            ret = aml_audio_set_digital_mode(AML_HAL_AUTO);
+        else if (!strncmp("AML_HAL_BYPASS", argv[2], sizeof("AML_HAL_BYPASS")))
+            ret = aml_audio_set_digital_mode(AML_HAL_BYPASS);
+        else if (!strncmp("AML_HAL_DDP", argv[2], sizeof("AML_HAL_DDP")))
+            ret = aml_audio_set_digital_mode(AML_HAL_DDP);
+    } else if (!strncmp("mode", argv[1], sizeof("mode"))) {
+        ret = aml_audio_get_digital_mode();
+        printf("aml_audio_get_digital_mode: %d\n", ret);
     }
     return 0;
 }