[Feature][T106]ZXW P56U09 code

Only Configure: Yes
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: No
Doc Update: No

Change-Id: I3cbd8b420271eb20c2b40ebe5c78f83059cd42f3
diff --git a/ap/lib/libtinyalsa/vol_test.c b/ap/lib/libtinyalsa/vol_test.c
new file mode 100644
index 0000000..ad0453c
--- /dev/null
+++ b/ap/lib/libtinyalsa/vol_test.c
@@ -0,0 +1,515 @@
+/*
+ *  Copyright (C) 2017 Sanechips Technology Co., Ltd.
+*
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+
+
+/****************************************************************************
+* 	                                           Include files
+****************************************************************************/
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <math.h>
+/****************************************************************************
+* 	                                           Local Macros
+****************************************************************************/
+#define DB_COFF_ARRAY_SIZE 15
+#define DRV_SUCCESS 0
+#define DRV_ERROR -1
+
+typedef signed char SINT8;
+typedef unsigned char UINT8;
+typedef short SINT16;
+typedef unsigned short UINT16;
+typedef long SINT32;
+typedef void VOID;
+/****************************************************************************
+* 	                                          Global Constants
+****************************************************************************/
+
+
+/****************************************************************************
+* 	                                          Global Variables
+****************************************************************************/
+
+
+typedef enum {
+    VOL_PATH_RX = 0,
+    VOL_PATH_TX = 1,
+    MAX_VOL_PATH = VOL_PATH_TX
+} T_Vol_Path;
+
+typedef struct {
+
+	float gain;
+	float coff;
+
+} T_Db_Coff;
+
+typedef struct {
+
+	int  rx_vol;	//0~5
+	float  rx_coff;
+	int  rx_upflag;	//rx vol update flag , 1 update, else not
+
+	int  tx_vol;	//0~5
+	float  tx_coff;
+	int  tx_upflag;	//tx vol update flag , 1 update, else not
+
+} T_Vol_Inst;
+
+typedef struct {
+	int vol_on;// 0 off, 1 on
+	float vol[6];
+} T_Wrtc_Vol_Para;
+
+T_Wrtc_Vol_Para vol_para = {
+	1,
+	// tx_vol vol[6];
+	{
+		-6,//vol0
+		-3,//vol1
+		0,//vol2
+		3,//vol3
+		6,//vol4
+		9,//vol5
+	},
+};
+
+#if 1
+T_Db_Coff coff_table[] = {
+{-96.000000,0.000016},
+{-15.000000,0.177828},
+{-14.000000,0.199526},
+{-13.000000,0.223872},
+{-12.000000,0.251189},
+{-11.000000,0.281838},
+{-10.000000,0.316228},
+{-9.000000,0.354813},
+{-8.000000,0.398107},
+{-7.000000,0.446684},
+{-6.000000,0.501187},
+{-5.000000,0.562341},
+{-4.000000,0.630957},
+{-3.000000,0.707946},
+{-2.000000,0.794328},
+{-1.000000,0.891251},
+{0.000000,1.000000},
+{1.000000,1.122018},
+{2.000000,1.258925},
+{3.000000,1.412538},
+{4.000000,1.584893},
+{5.000000,1.778279},
+{6.000000,1.995262},
+{7.000000,2.238721},
+{8.000000,2.511886},
+{9.000000,2.818383},
+{10.000000,3.162278},
+{11.000000,3.548134},
+{12.000000,3.981072},
+{13.000000,4.466835},
+{14.000000,5.011872},
+{15.000000,5.623413},
+{16.000000,6.309574},
+{17.000000,7.079458},
+{18.000000,7.943282},
+{19.000000,8.912509},
+{20.000000,10.000000},
+{21.000000,11.220183},
+{22.000000,12.589254},
+{23.000000,14.125375},
+{24.000000,15.848933},
+
+};
+#else
+T_Db_Coff coff_table[] = {
+	{ -96, 0.000016},
+	{ -15, 0.177828},
+	{ -14, 0.199526},
+	{ -13, 0.223872},
+	{ -12, 0.251189},
+	{ -11, 0.281838},
+	{ -10, 0.316228},
+	{ -9, 0.354813},
+	{ -8, 0.398107},
+	{ -7, 0.446684},
+	{ -6, 0.501187},
+	{ -5, 0.562341},
+	{ -4, 0.630957},
+	{ -3, 0.707946},
+	{ -2, 0.794328},
+	{ -1, 0.891251},
+	{0, 1.000000},
+	{1, 1.122018},
+	{2, 1.258925},
+	{3, 1.412538},
+	{4, 1.584893},
+	{5, 1.778279},
+	{6, 1.995262},
+	{7, 2.238721},
+	{8, 2.511886},
+	{9, 2.818383},
+	{10, 0},
+	{11, 0},
+	{12, 3.981072},
+	{13, 0},
+	{14, 0},
+	{15, 5.623413},
+	{16, 0},
+	{17, 0},
+	{18, 7.943282},
+	{19, 0},
+	{20, 0},
+	{21, 0},
+	{22, 0},
+	{23, 0},
+	{24, 0},
+};
+#endif
+
+T_Vol_Inst vol_inst = {
+
+
+	3,//int  rx_vol;
+	0,//int  rx_coff;
+	1,//int  rx_upflag;	//rx vol update flag
+
+	3,//int  tx_vol;
+	0,//int  tx_coff;
+	1,//int  tx_upflag;	//tx vol update flag
+};
+
+int mute_flag = 0;
+
+/****************************************************************************
+* 	                                          Global Function Prototypes
+****************************************************************************/
+
+
+
+
+/****************************************************************************
+* 	                                          Function Definitions
+****************************************************************************/
+
+float Cal_DbCoff(float  db)
+{
+
+	float coff = 0.0f;
+
+	float tmp = (float)(db / 20);
+	coff = (float) pow(10, tmp);
+	printf("Cal_DbCoff db=%f,tmp=%f,coff=%f!\r\n", db , tmp , coff );
+
+	return coff;
+
+}
+
+
+
+
+VOID Cal_ArrayDbCoff(VOID)
+{
+	int  i = 0;
+	int size = sizeof(coff_table) / sizeof(coff_table[0]);
+	printf("update array, Db covert into Coff size=%d!\r\n", size);
+
+	for (i = 0; i < size; i++) {
+		coff_table[i].coff = Cal_DbCoff(coff_table[i].gain);
+		printf("update array, Db covert into Coff, db=%f,coff=%f!\r\n", coff_table[i].gain , coff_table[i].coff);
+
+	}
+
+}
+
+float Get_ArrayDbCoff(float  db)
+{
+	int i = 0;
+	float coff = 0;
+	int size = sizeof(coff_table) / sizeof(coff_table[0]);
+	for (i = 0; i < size; i++) {
+		if (coff_table[i].gain == db) {
+			coff = coff_table[i].coff;
+			printf("Get_ArrayDbCoff, find db=%d,coff=%d!\r\n", db * 1000,  coff * 1000);
+
+			return coff;
+		}
+	}
+	if (i >= DB_COFF_ARRAY_SIZE) {
+		coff = Cal_DbCoff(db);
+
+	}
+
+	printf("Get_ArrayDbCoff, db=%d,size=%d,i=%d,coff=%d!\r\n", db * 1000, DB_COFF_ARRAY_SIZE, i, coff * 1000);
+
+	return coff;
+
+}
+
+
+float Get_VolCoff(T_Vol_Path  volpath)
+{
+	float  coff = 0.0f;
+	float  gain = 0.0f;
+
+
+	T_Wrtc_Vol_Para *volpara;
+
+	if (volpath == VOL_PATH_TX) {
+
+		if (vol_inst.tx_upflag == 0) {
+			return vol_inst.tx_coff;
+		}
+		volpara = & vol_para;
+		gain = volpara->vol[vol_inst.tx_vol];
+		coff = Get_ArrayDbCoff(gain);
+		vol_inst.tx_coff = coff;
+		vol_inst.tx_upflag = 0;
+	} else {
+
+		if (vol_inst.rx_upflag == 0) {
+			return vol_inst.rx_coff;
+		}
+
+		volpara = & vol_para;
+		gain = volpara->vol[vol_inst.rx_vol];
+		coff = Get_ArrayDbCoff(gain);
+		vol_inst.rx_coff = coff;
+		vol_inst.rx_upflag = 0;
+
+	}
+
+
+
+	return coff;
+
+}
+
+
+
+SINT32 Adjust_DataGain(UINT8 *pinBuffer, UINT8 *poutBuffer, UINT16 sampleNums, int mute, float gain)
+{
+
+	SINT32 ret = DRV_SUCCESS;
+
+	//float coff_f = 0;
+	float coff = 0;
+	int i = 0;
+	short tmp = 0;
+
+	short *sinBuffer;
+	short *soutBuffer;
+
+	coff = Get_ArrayDbCoff(gain);
+	//coff = (int)coff_f;
+
+
+	sinBuffer = (short  *)(pinBuffer);
+	soutBuffer = (short  *)(poutBuffer);
+
+	if (mute_flag == 0) {
+		for (i = 0; i < sampleNums; i++) {
+			tmp = (short)coff * sinBuffer[i];
+			if ((tmp > -32768) && (tmp < 32768)) {
+				soutBuffer[i] = tmp;
+			} else if (tmp > 32767) {
+				soutBuffer[i] = 32767;
+			} else if (tmp < -32768) {
+				soutBuffer[i] = -32767;
+			}
+		}
+	} else if (mute_flag == 1) {
+		for (i = 0; i < sampleNums; i++) {
+
+			soutBuffer[i] = 0;
+		}
+	} else {
+		printf("Adjust_DataGain mute val=%d invalid!\r\n", mute);
+
+	}
+
+	return ret;
+}
+
+
+SINT32 Adjust_TxDataVol(UINT8 *pinBuffer, UINT8 *poutBuffer, UINT16 sampleNums)
+{
+
+	SINT32 ret = DRV_SUCCESS;
+
+	//float coff_f = 0;
+	float coff = 0.0f;
+	int i = 0;
+	short tmp = 0;
+
+	short *sinBuffer;
+	short *soutBuffer;
+#if 0
+	float gain;
+	T_Webrtc_Para *para = &webrtcPara;
+	//T_Webrtc_TxProcPara *procpara =&tx_procpara;
+	T_Wrtc_Vol_Para *volpara = & tx_procpara.tx_vol;
+	gain = volpara->vol[para->txvol];
+
+	coff = Get_ArrayDbCoff(gain);
+	//coff = (int)coff_f;
+#else
+	coff = Get_VolCoff(VOL_PATH_TX);
+
+#endif
+
+	sinBuffer = (short  *)(pinBuffer);
+	soutBuffer = (short  *)(poutBuffer);
+
+	if (mute_flag == 0) {
+		for (i = 0; i < sampleNums; i++) {
+			tmp = (short)coff * sinBuffer[i];
+			if ((tmp > -32768) && (tmp < 32768)) {
+				soutBuffer[i] = tmp;
+			} else if (tmp > 32767) {
+				soutBuffer[i] = 32767;
+			} else if (tmp < -32768) {
+				soutBuffer[i] = -32767;
+			}
+		}
+	} else if (mute_flag == 1) {
+		for (i = 0; i < sampleNums; i++) {
+
+			soutBuffer[i] = 0;
+		}
+	} else {
+		printf("Adjust_DataGain mute val=%d invalid!\r\n", mute_flag);
+
+	}
+
+	return ret;
+}
+
+SINT32 Adjust_RxDataVol(UINT8 *pinBuffer, UINT8 *poutBuffer, UINT16 sampleNums)
+{
+
+	SINT32 ret = DRV_SUCCESS;
+
+	float coff = 0.0;
+	int i = 0;
+	short tmp = 0;
+
+	short *sinBuffer;
+	short *soutBuffer;
+#if 0
+	float gain;
+
+	T_Webrtc_Para *para = &webrtcPara;
+	//T_Webrtc_RxProcPara *procpara = &rx_procpara;
+	T_Wrtc_Vol_Para *volpara = & rx_procpara.rx_vol;
+	gain = volpara->vol[para->rxvol];
+
+
+	coff = Get_ArrayDbCoff(gain);
+#else
+	coff = Get_VolCoff(VOL_PATH_RX);
+#endif
+	sinBuffer = (short  *)(pinBuffer);
+	soutBuffer = (short  *)(poutBuffer);
+
+
+	for (i = 0; i < sampleNums; i++) {
+		tmp = (short)coff * sinBuffer[i];
+		if ((tmp > -32768) && (tmp < 32768)) {
+			soutBuffer[i] = tmp;
+		} else if (tmp > 32767) {
+			soutBuffer[i] = 32767;
+		} else if (tmp < -32768) {
+			soutBuffer[i] = -32767;
+		}
+	}
+
+	return ret;
+}
+
+
+SINT32 Vol_SetPara(int volpath, int  vol, int upflag)
+{
+	SINT32 ret = DRV_SUCCESS;
+	if (volpath == VOL_PATH_TX) {
+		vol_inst.tx_vol = vol;
+		vol_inst.tx_upflag = upflag;
+		printf(" Vol_SetPara tx volpath=%d,upflag=%d.\n", volpath, upflag);
+
+	} else if (volpath == VOL_PATH_RX) {
+		vol_inst.rx_vol = vol;
+		vol_inst.rx_upflag = upflag;
+		printf(" Vol_SetPara rx volpath=%d,upflag=%d.\n", volpath, upflag);
+
+	} else {
+		printf(" Vol_SetPara err volpath=%d.\n", volpath);
+		return DRV_ERROR;
+	}
+
+
+
+	return ret;
+}
+
+SINT32 vol_SetRxVol(int vol)
+{
+	SINT32 ret = DRV_SUCCESS;
+	float  coff = 0.0f;
+	vol_inst.rx_vol = vol;
+	ret = Vol_SetPara(0,   vol, 1);
+	printf(" vol_SetRxVol vol=%d,ret=%d.\n", vol, ret);
+	coff = Get_VolCoff(0);
+	printf(" vol_SetRxVol Get_VolCoff coff=%f.\n", coff);
+
+
+	return ret;
+}
+
+int main(int argc, char **argv)
+{
+
+	printf("voltest start!\n");
+
+	int vol = 0;
+	int ret = 0;
+
+
+	if (strcmp(argv[1], "caldb") == 0) {
+
+		Cal_ArrayDbCoff();
+
+	} else if (strcmp(argv[1], "setvol") == 0) {
+
+
+
+		vol = atoi(argv[2]);
+		ret = vol_SetRxVol(vol);
+
+	} else {
+		return 0;
+	}
+
+
+
+
+
+
+
+
+	return 0;
+}
+