blob: f0a961beb0f27012080405df6141bf8c87561acd [file] [log] [blame]
b.liudd756092024-03-05 16:35:56 +08001/*
2* mbtk_audio_gain.c
3*
4* MBTK audio gain for nvm : /NVM/audio_gain.nvm.
5*
6*/
7/******************************************************************************
8
9 EDIT HISTORY FOR FILE
10
11 WHEN WHO WHAT,WHERE,WHY
12-------- -------- -------------------------------------------------------
132024/3/1 LiuBin Initial version
14
15******************************************************************************/
16#include <stdio.h>
17#include <stdlib.h>
18#include <unistd.h>
19#include <errno.h>
20#include <sys/types.h>
21#include <sys/stat.h>
22#include <fcntl.h>
23#include <cutils/properties.h>
24
25#include "mbtk_log.h"
26#include "mbtk_str.h"
27#include "mbtk_audio_gain.h"
28
29void vcm_config_dspgain(unsigned int type, unsigned int gain);
30
31int mbtk_dsp_gain_set(CONFIG_DSPGAIN_Direction dir, int gain)
32{
33 if((gain < MBTK_AUDIO_GAIN_MIN || gain > MBTK_AUDIO_GAIN_MAX)
34 && gain != CONFIG_DSPGAIN_MUTE_ON && gain != CONFIG_DSPGAIN_MUTE_OFF) {
35 LOGE("DSP gain range: %d - %d or %d or %d", MBTK_AUDIO_GAIN_MIN, MBTK_AUDIO_GAIN_MAX,
36 CONFIG_DSPGAIN_MUTE_ON, CONFIG_DSPGAIN_MUTE_OFF);
37 return -1;
38 }
39
40 int fd = open(MBTK_AUDIO_GAIN_PATH, O_RDWR);
41 if(fd < 0) {
42 LOGE("Open file(%s) fail:%d", MBTK_AUDIO_GAIN_PATH, errno);
43 return -1;
44 }
45
46 if( -1 == lseek(fd, MBTK_AUDIO_GAIN_ADD_START, SEEK_SET)) {
47 LOGE("lseek(%d) fail:%d", MBTK_AUDIO_GAIN_ADD_START, errno);
48 goto fail;
49 }
50
51 ACMCodec_GainT gains[VC_HEAD_NUM];
52 int len;
53 memset(gains, 0x0, sizeof(gains));
54 if((len = read(fd, gains, sizeof(gains))) != sizeof(gains)) {
55 LOGE("read(%d/%d) fail:%d", len, sizeof(gains), errno);
56 goto fail;
57 }
58
59 int i = 0;
60 while(i < VC_HEAD_NUM) {
61 if(dir == CONFIG_DSPGAIN_RX) {
62 gains[i].Rx_DSPGain[AUDIOHAL_SPK_VOL_QTY] = (int16)(gain & 0xFFFF);
63 } else if(dir == CONFIG_DSPGAIN_TX) {
64 gains[i].Tx_DSPGain = (int16)(gain & 0xFFFF);
65 }/* else if(dir == CONFIG_DSPGAIN_SIDETONE) {
66 gains[i].Rx_DSPSideToneGain = gain;
67 }*/ else {
68 LOGE("Unknown direction : %d", dir);
69 goto fail;
70 }
71 i++;
72 }
73
74 if( -1 == lseek(fd, MBTK_AUDIO_GAIN_ADD_START, SEEK_SET)) {
75 LOGE("lseek(%d) fail:%d", MBTK_AUDIO_GAIN_ADD_START, errno);
76 goto fail;
77 }
78
79 if(write(fd, gains, sizeof(gains)) != sizeof(gains)) {
80 LOGE("write(%d) fail:%d", sizeof(gains), errno);
81 goto fail;
82 }
83
84 if(fsync(fd)) {
85 LOGE("fsync(%d) fail:%d", fd, errno);
86 goto fail;
87 }
88
89 close(fd);
90
91 LOGD("DSP gain NVM update success.");
92
93 char buff[10];
94 memset(buff, 0, 10);
95 snprintf(buff, 10, "%d", gain);
96 if(dir == CONFIG_DSPGAIN_RX) {
97 if(property_set("persist.mbtk.dsp_rx_gain", buff) == 0) {
98 // Set gain to DSP.
99 vcm_config_dspgain(dir, gain);
100 }
101 } else if(dir == CONFIG_DSPGAIN_TX) {
102 if(property_set("persist.mbtk.dsp_tx_gain", buff) == 0) {
103 // Set gain to DSP.
104 vcm_config_dspgain(dir, gain);
105 }
106 }else {
107 LOGE("Unknown direction : %d", dir);
108 goto fail;
109 }
110
111 return 0;
112
113fail:
114 close(fd);
115 return -1;
116}
117
118int mbtk_dsp_gain_get(int *rx_gain, int *tx_gain)
119{
120 if(rx_gain == NULL || tx_gain == NULL) {
121 LOGE("gain is NULL.");
122 return -1;
123 }
124
125 int fd = open(MBTK_AUDIO_GAIN_PATH, O_RDONLY);
126 if(fd < 0) {
127 LOGE("Open file(%s) fail:%d", MBTK_AUDIO_GAIN_PATH, errno);
128 return -1;
129 }
130
131 if( -1 == lseek(fd, MBTK_AUDIO_GAIN_ADD_START, SEEK_SET)) {
132 LOGE("lseek(%d) fail:%d", MBTK_AUDIO_GAIN_ADD_START, errno);
133 goto fail;
134 }
135
136 ACMCodec_GainT gains[VC_HEAD_NUM];
137 int len;
138 memset(gains, 0x0, sizeof(gains));
139 if((len = read(fd, gains, sizeof(gains))) != sizeof(gains)) {
140 LOGE("read(%d/%d) fail:%d", len, sizeof(gains), errno);
141 goto fail;
142 }
143
144 close(fd);
145
146 *rx_gain = gains[VC_HANDSFREE].Rx_DSPGain[AUDIOHAL_SPK_VOL_QTY];
147 *tx_gain = gains[VC_HANDSFREE].Tx_DSPGain;
148 return 0;
149fail:
150 close(fd);
151 return -1;
152}
153
154
155
156