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;
}