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