blob: 8e8bb786e97a2d6af6d0e5044bdd76921175f322
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <string.h> |
4 | #include <getopt.h> |
5 | #include <pthread.h> |
6 | #include <stdarg.h> |
7 | #include <ctype.h> |
8 | #include <math.h> |
9 | #include <errno.h> |
10 | #include <assert.h> |
11 | #include <fcntl.h> |
12 | #include <tinyalsa/asoundlib.h> |
13 | #include "CFbcCommunication.h" |
14 | #include <sys/poll.h> |
15 | #include "tvsetting/audio_cfg.h" |
16 | #include "audio_alsa.h" |
17 | #include <cutils/properties.h> |
18 | #define LOG_TAG "CAudioAlsa" |
19 | #include "CTvLog.h" |
20 | #include "audio_amaudio.h" |
21 | |
22 | static const int DEFAULT_MAIN_DIGIT_LUT[] = { |
23 | // |
24 | 0, 40, 50, 60, 70, 87, 110, 120, 130, 140, // 0~9 |
25 | 150, 152, 155, 158, 161, 164, 167, 170, 173, 174, // 10~19 |
26 | 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, // 20~29 |
27 | 191, 191, 192, 193, 194, 195, 196, 196, 197, 197, // 30~39 |
28 | 198, 198, 198, 199, 199, 200, 200, 201, 201, 201, // 40~49 |
29 | 202, 202, 202, 203, 203, 203, 203, 204, 204, 204, // 50~59 |
30 | 205, 205, 205, 205, 206, 206, 206, 206, 206, 207, // 60~69 |
31 | 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, // 70~79 |
32 | 208, 208, 208, 208, 208, 208, 208, 208, 208, 209, // 80~89 |
33 | 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, // 90~99 |
34 | 209, // 100 |
35 | }; |
36 | |
37 | static const int DEFAULT_SUPPER_BASS_DIGIT_LUT_BUF[] = { |
38 | // |
39 | 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, // 0~9 |
40 | 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, // 10~19 |
41 | 141, 142, 143, 144, 145, 147, 147, 148, 148, 149, // 20~29 |
42 | 149, 150, 150, 151, 151, 152, 152, 153, 153, 154, // 30~39 |
43 | 154, 155, 155, 156, 156, 157, 157, 158, 158, 159, // 40~49 |
44 | 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, // 50~59 |
45 | 162, 163, 163, 163, 163, 164, 164, 164, 165, 165, // 60~69 |
46 | 165, 165, 166, 166, 166, 167, 168, 169, 170, 171, // 70~79 |
47 | 173, 174, 175, 176, 177, 179, 180, 181, 182, 183, // 80~89 |
48 | 185, 186, 187, 188, 189, 191, 192, 193, 194, 195, // 90~99 |
49 | 197 // 100 |
50 | }; |
51 | |
52 | CAudioAlsa::CAudioAlsa() |
53 | { |
54 | int card_id; |
55 | card_id = get_aml_card(); |
56 | LOGD("[%s:%d] card_id:%d\n", __FUNCTION__, __LINE__, card_id); |
57 | mpMixer = mixer_open(card_id); |
58 | |
59 | card_id = get_USB_Audio_card(); |
60 | LOGD("[%s:%d] card_id:%d\n", __FUNCTION__, __LINE__, card_id); |
61 | mpUsbMixer = mixer_open(card_id); |
62 | mMainVolumeGainVal = 0; |
63 | mSupperBassVolumeGainVal = 0; |
64 | ArrayCopy(mMainDigitLutBuf, DEFAULT_MAIN_DIGIT_LUT, CC_VOL_TRANS_LUT_BUF_SIZE); |
65 | ArrayCopy(mSupperBassDigitLutBuf, DEFAULT_SUPPER_BASS_DIGIT_LUT_BUF, CC_VOL_TRANS_LUT_BUF_SIZE); |
66 | } |
67 | |
68 | CAudioAlsa::~CAudioAlsa() |
69 | { |
70 | if (NULL != mpMixer) { |
71 | mixer_close(mpMixer); |
72 | } |
73 | |
74 | if (NULL != mpUsbMixer) { |
75 | mixer_close(mpUsbMixer); |
76 | } |
77 | } |
78 | |
79 | int CAudioAlsa::get_aml_card() |
80 | { |
81 | int card = -1, err = 0; |
82 | int fd = -1; |
83 | char read_buf[512], *pd = NULL; |
84 | static const char *const SOUND_CARDS_PATH = "/proc/asound/cards"; |
85 | fd = open(SOUND_CARDS_PATH, O_RDONLY); |
86 | if (fd < 0) { |
87 | LOGE("ERROR: failed to open config file %s error: %d\n", SOUND_CARDS_PATH, errno); |
88 | close(fd); |
89 | return -EINVAL; |
90 | } |
91 | memset(read_buf, 0x0, 512); |
92 | err = read(fd, read_buf, 512); |
93 | if (fd < 0) { |
94 | LOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno); |
95 | close(fd); |
96 | return -EINVAL; |
97 | } |
98 | pd = strstr(read_buf, "AML"); |
99 | card = *(pd - 3) - '0'; |
100 | close(fd); |
101 | return card; |
102 | } |
103 | |
104 | int CAudioAlsa::AudioControlSetValue(int val_count, int data_buf[], char *match_names) |
105 | { |
106 | struct mixer_ctl *pctl; |
107 | unsigned int expected_val_count; |
108 | unsigned int value_index; |
109 | |
110 | if (NULL == mpMixer) { |
111 | LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__); |
112 | goto err_exit; |
113 | } |
114 | |
115 | pctl = mixer_get_ctl_by_name(mpMixer, match_names); |
116 | if (NULL == pctl) { |
117 | LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names); |
118 | goto err_exit; |
119 | } |
120 | expected_val_count = mixer_ctl_get_num_values(pctl); |
121 | if (expected_val_count != (unsigned int)val_count) { |
122 | LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__); |
123 | goto err_exit; |
124 | } |
125 | for (value_index = 0; value_index < expected_val_count; value_index++) { |
126 | if (mixer_ctl_set_value(pctl, value_index, data_buf[value_index]) != 0) { |
127 | LOGE("[%s:%d] Failed to set value:%d\n", __FUNCTION__, __LINE__, value_index); |
128 | goto err_exit; |
129 | } |
130 | } |
131 | return 0; |
132 | err_exit: |
133 | return -1; |
134 | } |
135 | |
136 | int CAudioAlsa::AudioControlGetValue(int val_count, int ret_buf[], char *match_names) |
137 | { |
138 | struct mixer_ctl *pctl; |
139 | unsigned int expected_val_count; |
140 | unsigned int value_index; |
141 | |
142 | if (NULL == mpMixer) { |
143 | LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__); |
144 | goto err_exit; |
145 | } |
146 | pctl = mixer_get_ctl_by_name(mpMixer, match_names); |
147 | if (NULL == pctl) { |
148 | LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names); |
149 | goto err_exit; |
150 | } |
151 | expected_val_count = mixer_ctl_get_num_values(pctl); |
152 | if (expected_val_count != (unsigned int)val_count) { |
153 | LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__); |
154 | goto err_exit; |
155 | } |
156 | for (value_index = 0; value_index < expected_val_count; value_index++) { |
157 | ret_buf[value_index] = mixer_ctl_get_value(pctl, value_index); |
158 | } |
159 | return 0; |
160 | err_exit: |
161 | return -1; |
162 | } |
163 | |
164 | int CAudioAlsa::get_USB_Audio_card() |
165 | { |
166 | int card = -1, err = 0; |
167 | int fd = -1; |
168 | char read_buf[512], *pd = NULL; |
169 | static const char *const SOUND_CARDS_PATH = "/proc/asound/cards"; |
170 | fd = open(SOUND_CARDS_PATH, O_RDONLY); |
171 | if (fd < 0) { |
172 | LOGE("ERROR: failed to open config file %s error: %d\n", SOUND_CARDS_PATH, errno); |
173 | close(fd); |
174 | return -EINVAL; |
175 | } |
176 | memset(read_buf, 0x0, 512); |
177 | err = read(fd, read_buf, 512); |
178 | if (fd < 0) { |
179 | LOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno); |
180 | close(fd); |
181 | return -EINVAL; |
182 | } |
183 | pd = strstr(read_buf, "Receiver"); |
184 | if (pd == NULL) { |
185 | LOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno); |
186 | close(fd); |
187 | return -EINVAL; |
188 | } |
189 | |
190 | card = *(pd - 3) - '0'; |
191 | close(fd); |
192 | return card; |
193 | } |
194 | |
195 | int CAudioAlsa::HandleUSBAudioControlValue(int val_count, int data_buf[], int match_count, char **match_names) |
196 | { |
197 | |
198 | struct mixer_ctl *pctl; |
199 | unsigned int expected_val_count; |
200 | unsigned int match_index; |
201 | unsigned int value_index; |
202 | char card_id_str[9] = {0}; |
203 | |
204 | if (NULL == mpUsbMixer) { |
205 | LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__); |
206 | goto err_exit; |
207 | } |
208 | |
209 | for (match_index = 0; match_index < match_count; match_index++) { |
210 | pctl = mixer_get_ctl_by_name(mpUsbMixer, match_names[match_index]); |
211 | if (NULL == pctl) { |
212 | LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names[match_index]); |
213 | goto err_exit; |
214 | } |
215 | expected_val_count = mixer_ctl_get_num_values(pctl); |
216 | if (expected_val_count != (unsigned int)val_count) { |
217 | LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__); |
218 | goto err_exit; |
219 | } |
220 | for (value_index = 0; value_index < expected_val_count; value_index++) { |
221 | if (mixer_ctl_set_value(pctl, value_index, data_buf[value_index]) != 0) { |
222 | LOGE("[%s:%d] Failed to set value:%d\n", __FUNCTION__, __LINE__, value_index); |
223 | goto err_exit; |
224 | } |
225 | } |
226 | } |
227 | |
228 | return 0; |
229 | err_exit: |
230 | return -1; |
231 | } |
232 | |
233 | int CAudioAlsa::CheckVolume(int digit_vol, int digit_min, int digit_max, int hd_min, |
234 | int hd_max) |
235 | { |
236 | int tmp_val = digit_vol; |
237 | |
238 | if (digit_vol < hd_min) { |
239 | return hd_min; |
240 | } else if (digit_vol > hd_max) { |
241 | return hd_max; |
242 | } |
243 | |
244 | return digit_vol; |
245 | } |
246 | |
247 | int CAudioAlsa::GetTwoChannelVolume(int vol_buf[], int l_min_vol, int l_max_vol, |
248 | int r_min_vol, int r_max_vol, char *match_names, int hd_min, |
249 | int hd_max) |
250 | { |
251 | vol_buf[0] = 0; |
252 | vol_buf[1] = 0; |
253 | return AudioControlGetValue(2, vol_buf, match_names); |
254 | } |
255 | |
256 | int CAudioAlsa::GetLineInMaxVol() |
257 | { |
258 | |
259 | return 127; |
260 | } |
261 | |
262 | int CAudioAlsa::GetLineOutMaxVol() |
263 | { |
264 | |
265 | return 255; |
266 | } |
267 | |
268 | #define CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME (0) |
269 | #define CC_GET_ALSA_CTL_INTERNAL_DAC_PGA_IN_GAIN (1) |
270 | #define CC_GET_ALSA_CTL_INTERNAL_DAC_ADC_DIGITAL_CAPTURE_VOLUME_NAME (2) |
271 | #define CC_GET_ALSA_CTL_INTERNAL_DAC_DAC_DIGITAL_PLAYBACK_VOLUME_NAME (3) |
272 | #define CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME (4) |
273 | #define CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME (5) |
274 | #define CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME (6) |
275 | #define CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME (7) |
276 | #define CC_GET_ALSA_CTL_I2S_MUTE_NAME (8) |
277 | #define CC_GET_ALSA_CTL_SPDIF_MUTE_NAME (9) |
278 | #define CC_GET_ALSA_CTL_HW_RESAMPLE_NAME (10) |
279 | #define CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME (11) |
280 | #define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME (12) |
281 | #define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME (13) |
282 | #define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME (14) |
283 | #define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME (15) |
284 | #define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME (16) |
285 | #define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME (17) |
286 | #define CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME (18) |
287 | #define CC_GET_ALSA_CTL_PCM_PLAYBACK_VOLUME (19) |
288 | #define CC_GET_ALSA_CTL_PCM_PLAYBACK_SWITCH (20) |
289 | #define CC_GET_ALSA_CTL_SETOUTPUT_SWAP (21) |
290 | #define CC_GET_ALSA_CTL_AUDIO_IN_SWITCH (22) |
291 | |
292 | static char gG9AlsaNames[32][48] = { |
293 | {"Audio In Source"},//0 |
294 | {"PGA IN Gain"},//1 |
295 | {"ADC Digital Capture Volume"},//2 |
296 | {"DAC Digital Playback Volume"},//3 |
297 | {"Linein right switch"},//4 |
298 | {"Linein left switch"}, |
299 | {"ADC Digital Capture Volume"}, |
300 | {"DAC Digital Playback Volume"}, |
301 | {"Audio i2s mute"},//8 |
302 | {"Audio spdif mute"}, |
303 | {"Hardware resample enable"},//10 |
304 | {"AMP Master Volume"}, |
305 | {"AMP Ch1 Volume"},//12 |
306 | {"AMP Ch2 Volume"}, |
307 | {"AMP Ch3 Volume"}, |
308 | {"AMP Ch1 Switch"}, |
309 | {"AMP Ch2 Switch"}, |
310 | {"AMP Ch3 Switch"},//17 |
311 | {"AMP EQ Mode"}, |
312 | {"PCM Playback Volume"}, |
313 | {"PCM Playback Switch"}, |
314 | {"Output Swap"}, |
315 | {"AudioIn Switch"},//22 |
316 | }; |
317 | |
318 | |
319 | char *CAudioAlsa::GetAlsaControlName(int get_type) |
320 | { |
321 | return gG9AlsaNames[get_type]; |
322 | } |
323 | |
324 | |
325 | int CAudioAlsa::SetAudioInSource(int source_type) |
326 | { |
327 | int set_val = 0; |
328 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME); |
329 | set_val = source_type; |
330 | return AudioControlSetValue(1, &set_val, match_names); |
331 | } |
332 | |
333 | int CAudioAlsa::GetAudioInSource(void) |
334 | { |
335 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME); |
336 | int source_type = 0; |
337 | AudioControlGetValue(1, &source_type, match_names); |
338 | return source_type; |
339 | } |
340 | |
341 | int CAudioAlsa::SetAudioInternalDacPGAInGain(int gain_l_val, int gain_r_val) |
342 | { |
343 | int GainBuf[2] = {0, 0}; |
344 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_PGA_IN_GAIN); |
345 | |
346 | GainBuf[0] = gain_l_val; |
347 | GainBuf[1] = gain_r_val; |
348 | if (gain_l_val < 0 || gain_l_val > 31) { |
349 | GainBuf[0] = 16; |
350 | } |
351 | if (gain_r_val < 0 || gain_r_val > 31) { |
352 | GainBuf[1] = 16; |
353 | } |
354 | |
355 | return AudioControlSetValue(2, GainBuf, match_names); |
356 | } |
357 | |
358 | int CAudioAlsa::GetAudioInternalDacPGAInGain(int *gain_l_val, int *gain_r_val) |
359 | { |
360 | int GainBuf[2] = {0, 0}; |
361 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_PGA_IN_GAIN); |
362 | |
363 | AudioControlGetValue(2, GainBuf, match_names); |
364 | |
365 | *gain_l_val = GainBuf[0]; |
366 | *gain_r_val = GainBuf[1]; |
367 | |
368 | return 0; |
369 | } |
370 | |
371 | int CAudioAlsa::SetAudioInternalDacADCDigitalCaptureVolume(int vol_l_val, int vol_r_val) |
372 | { |
373 | int VolumeBuf[2] = {0, 0}; |
374 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_ADC_DIGITAL_CAPTURE_VOLUME_NAME); |
375 | |
376 | VolumeBuf[0] = vol_l_val; |
377 | VolumeBuf[1] = vol_r_val; |
378 | if (vol_l_val < 0 || vol_l_val > 127) { |
379 | VolumeBuf[0] = 82; |
380 | } |
381 | if (vol_r_val < 0 || vol_r_val > 127) { |
382 | VolumeBuf[1] = 82; |
383 | } |
384 | |
385 | return AudioControlSetValue(2, VolumeBuf, match_names); |
386 | } |
387 | |
388 | int CAudioAlsa::GetAudioInternalDacADCDigitalCaptureVolume(int *vol_l_val, int *vol_r_val) |
389 | { |
390 | int VolumeBuf[2] = {0, 0}; |
391 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_ADC_DIGITAL_CAPTURE_VOLUME_NAME); |
392 | |
393 | AudioControlGetValue(2, VolumeBuf, match_names); |
394 | |
395 | *vol_l_val = VolumeBuf[0]; |
396 | *vol_r_val = VolumeBuf[1]; |
397 | |
398 | return 0; |
399 | } |
400 | |
401 | int CAudioAlsa::SetAudioInternalDacDACDigitalPlayBackVolume(int vol_l_val, int vol_r_val) |
402 | { |
403 | int VolumeBuf[2] = {0, 0}; |
404 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_DAC_DIGITAL_PLAYBACK_VOLUME_NAME); |
405 | |
406 | VolumeBuf[0] = vol_l_val; |
407 | VolumeBuf[1] = vol_r_val; |
408 | if (vol_l_val < 0 || vol_l_val > 255) { |
409 | VolumeBuf[0] = 255; |
410 | } |
411 | if (vol_r_val < 0 || vol_r_val > 255) { |
412 | VolumeBuf[1] = 255; |
413 | } |
414 | |
415 | return AudioControlSetValue(2, VolumeBuf, match_names); |
416 | } |
417 | |
418 | int CAudioAlsa::GetAudioInternalDacDACDigitalPlayBackVolume(int *vol_l_val, int *vol_r_val) |
419 | { |
420 | int VolumeBuf[2] = {0, 0}; |
421 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_DAC_DIGITAL_PLAYBACK_VOLUME_NAME); |
422 | |
423 | AudioControlGetValue(2, VolumeBuf, match_names); |
424 | |
425 | *vol_l_val = VolumeBuf[0]; |
426 | *vol_r_val = VolumeBuf[1]; |
427 | |
428 | return 0; |
429 | } |
430 | |
431 | int CAudioAlsa::SetInternalDacLineInSelectChannel(int line_in_number) |
432 | { |
433 | int tmp_ret = 0; |
434 | char *match_names = NULL; |
435 | |
436 | if (line_in_number < 0 || line_in_number > 7) { |
437 | return -1; |
438 | } |
439 | |
440 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME); |
441 | tmp_ret |= AudioControlSetValue(1, &line_in_number, match_names); |
442 | |
443 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME); |
444 | tmp_ret |= AudioControlSetValue(1, &line_in_number, match_names); |
445 | |
446 | return tmp_ret; |
447 | } |
448 | |
449 | int CAudioAlsa::SetInternalDacLineInCaptureVolume(int l_vol, int r_vol) |
450 | { |
451 | int max_val = GetLineInMaxVol(); |
452 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME); |
453 | int VolumeBuf[2]; |
454 | |
455 | VolumeBuf[0] = CheckVolume(l_vol, 0, max_val, 0, max_val); |
456 | VolumeBuf[1] = CheckVolume(r_vol, 0, max_val, 0, max_val); |
457 | |
458 | return AudioControlSetValue(2, VolumeBuf, match_names); |
459 | } |
460 | |
461 | int CAudioAlsa::GetInternalDacLineInCaptureVolume(int vol_buf[]) |
462 | { |
463 | int max_val = GetLineInMaxVol(); |
464 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME); |
465 | |
466 | return GetTwoChannelVolume(vol_buf, 0, max_val, 0, max_val, match_names, 0, max_val); |
467 | } |
468 | |
469 | int CAudioAlsa::SetInternalDacLineOutPlayBackVolume(int l_vol, int r_vol) |
470 | { |
471 | int max_val = GetLineOutMaxVol(); |
472 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME); |
473 | int VolumeBuf[2]; |
474 | |
475 | VolumeBuf[0] = CheckVolume(l_vol, 0, max_val, 0, max_val); |
476 | VolumeBuf[1] = CheckVolume(r_vol, 0, max_val, 0, max_val); |
477 | |
478 | return AudioControlSetValue(2, VolumeBuf, match_names); |
479 | } |
480 | |
481 | int CAudioAlsa::GetInternalDacLineOutPlayBackVolume(int vol_buf[]) |
482 | { |
483 | int max_val = GetLineOutMaxVol(); |
484 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME); |
485 | |
486 | return GetTwoChannelVolume(vol_buf, 0, max_val, 0, max_val, match_names, 0, max_val); |
487 | } |
488 | |
489 | int CAudioAlsa::SetAudioPcmPlaybackVolume(int vol) |
490 | { |
491 | if (get_USB_Audio_card() == -EINVAL) return 0; |
492 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_PCM_PLAYBACK_VOLUME); |
493 | return HandleUSBAudioControlValue(1, &vol, 1, &match_names); |
494 | } |
495 | |
496 | int CAudioAlsa::SetAudioPcmPlaybackSwitch(int vol) |
497 | { |
498 | if (get_USB_Audio_card() == -EINVAL) return 0; |
499 | char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_PCM_PLAYBACK_SWITCH); |
500 | return HandleUSBAudioControlValue(1, &vol, 1, &match_names); |
501 | } |
502 | |
503 | int CAudioAlsa::SetExternalDacChannelSwitch(int chan_ind, int switch_val) |
504 | { |
505 | char *match_names = NULL; |
506 | |
507 | if (chan_ind == 1) { |
508 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME); |
509 | } else if (chan_ind == 2) { |
510 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME); |
511 | } else if (chan_ind == 3) { |
512 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME); |
513 | } else { |
514 | return -1; |
515 | } |
516 | |
517 | return AudioControlSetValue(1, &switch_val, match_names); |
518 | } |
519 | |
520 | int CAudioAlsa::SetExternalDacChannelVolume(int chan_ind, int main_vol) |
521 | { |
522 | int tmp_ret = 0; |
523 | char *match_names = NULL; |
524 | |
525 | if (chan_ind == 0) { |
526 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME); |
527 | } else if (chan_ind == 1) { |
528 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME); |
529 | } else if (chan_ind == 2) { |
530 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME); |
531 | } else if (chan_ind == 3) { |
532 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME); |
533 | } else { |
534 | return -1; |
535 | } |
536 | |
537 | return AudioControlSetValue(1, &main_vol, match_names); |
538 | } |
539 | int CAudioAlsa::SetAudioSwitchIO(int value) |
540 | { |
541 | char *match_names = gG9AlsaNames[CC_GET_ALSA_CTL_AUDIO_IN_SWITCH]; |
542 | |
543 | return AudioControlSetValue(1, &value, match_names); |
544 | } |
545 | int CAudioAlsa::SetOutput_Swap(int value) |
546 | { |
547 | char *match_names = gG9AlsaNames[CC_GET_ALSA_CTL_SETOUTPUT_SWAP]; |
548 | |
549 | return AudioControlSetValue(1, &value, match_names); |
550 | } |
551 | |
552 | int CAudioAlsa::SetExternalDacEQMode(int mode_val) |
553 | { |
554 | char *match_names = NULL; |
555 | |
556 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME); |
557 | return AudioControlSetValue(1, &mode_val, match_names); |
558 | } |
559 | |
560 | int CAudioAlsa::SetI2SMute(int mute_status) |
561 | { |
562 | char *match_names = NULL; |
563 | |
564 | if (mute_status != CC_I2S_MUTE_ON && mute_status != CC_I2S_MUTE_OFF) { |
565 | LOGE("%s, I2S mute value (%d) error!\n", __FUNCTION__, mute_status); |
566 | return -1; |
567 | } |
568 | |
569 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_I2S_MUTE_NAME); |
570 | return AudioControlSetValue(1, &mute_status, match_names); |
571 | } |
572 | |
573 | int CAudioAlsa::SetSPDIFMute(int mute_status) |
574 | { |
575 | int set_val = 0; |
576 | char *match_names = NULL; |
577 | |
578 | if (mute_status == CC_AUDIO_MUTE) { |
579 | set_val = CC_SPDIF_MUTE_ON; |
580 | } else if (mute_status == CC_AUDIO_UNMUTE) { |
581 | set_val = CC_SPDIF_MUTE_OFF; |
582 | } else { |
583 | return -1; |
584 | } |
585 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_SPDIF_MUTE_NAME); |
586 | return AudioControlSetValue(1, &mute_status, match_names); |
587 | } |
588 | |
589 | #define CC_SAMPLE_BUF_SIZE (32) |
590 | |
591 | enum CC_HW_RESAMPLE_TYPE { |
592 | CC_HW_RESAMPLE_DISABLE, |
593 | CC_HW_RESAMPLE_48K, |
594 | CC_HW_RESAMPLE_44K, |
595 | CC_HW_RESAMPLE_32K, |
596 | }; |
597 | |
598 | int CAudioAlsa::SetHardwareResample(int sr) |
599 | { |
600 | int i = 0, set_val = 0, tmp_val = 0; |
601 | int diff_val = 0x7FFFFFFF, diff_ind = -1; |
602 | char *match_names = NULL; |
603 | int sample_buf[CC_SAMPLE_BUF_SIZE] = {48000, 44100, 32000, -1}; |
604 | |
605 | if (sr < 0) { |
606 | set_val = 0; |
607 | } else { |
608 | for (i = 0; i < CC_SAMPLE_BUF_SIZE; i++) { |
609 | if (sample_buf[i] < 0) { |
610 | break; |
611 | } |
612 | |
613 | if (sample_buf[i] >= sr) { |
614 | tmp_val = sample_buf[i] - sr; |
615 | } else { |
616 | tmp_val = sr - sample_buf[i]; |
617 | } |
618 | |
619 | if (tmp_val <= diff_val) { |
620 | diff_val = tmp_val; |
621 | diff_ind = i; |
622 | } |
623 | } |
624 | |
625 | if (diff_ind < 0) { |
626 | set_val = 0; |
627 | } else { |
628 | set_val = diff_ind + 1; |
629 | } |
630 | } |
631 | |
632 | LOGD("%s, set_val = %d.\n", __FUNCTION__, set_val); |
633 | match_names = GetAlsaControlName(CC_GET_ALSA_CTL_HW_RESAMPLE_NAME); |
634 | return AudioControlSetValue(1, &set_val, match_names); |
635 | } |
636 | |
637 | int CAudioAlsa::SetMixerBypassSwitch(int switch_val) |
638 | { |
639 | char match_names[48] = "Output Mixer Bypass Switch" ; |
640 | int ctl_buf[2]; |
641 | |
642 | if (switch_val != 0 && switch_val != 1) { |
643 | return -1; |
644 | } |
645 | |
646 | ctl_buf[0] = switch_val; |
647 | ctl_buf[1] = switch_val; |
648 | |
649 | return AudioControlSetValue(2, ctl_buf, match_names); |
650 | } |
651 | |
652 | int CAudioAlsa::GetMixerBypassSwitch(void) |
653 | { |
654 | char match_names[48] = "Output Mixer Bypass Switch" ; |
655 | int ctl_buf[2]; |
656 | |
657 | AudioControlSetValue(2, ctl_buf, match_names); |
658 | |
659 | return ctl_buf[0]; |
660 | } |
661 | |
662 | int CAudioAlsa::SetMixerDacSwitch(int switch_val) |
663 | { |
664 | char match_names[48] = "Output Mixer DAC Switch" ; |
665 | int ctl_buf[2]; |
666 | |
667 | if (switch_val != 0 && switch_val != 1) { |
668 | return -1; |
669 | } |
670 | |
671 | ctl_buf[0] = switch_val; |
672 | ctl_buf[1] = switch_val; |
673 | |
674 | return AudioControlSetValue(2, ctl_buf, match_names); |
675 | } |
676 | |
677 | int CAudioAlsa::GetMixerDacSwitch(void) |
678 | { |
679 | char *match_names = "Output Mixer DAC Switch" ; |
680 | int ctl_buf[2]; |
681 | |
682 | AudioControlGetValue(2, ctl_buf, match_names); |
683 | |
684 | return ctl_buf[0]; |
685 | } |
686 | |
687 | int CAudioAlsa::TransVolumeBarVolToDigitalVol(int digit_lut_buf[], int digit_vol) |
688 | { |
689 | |
690 | return digit_lut_buf[digit_vol]; |
691 | } |
692 | |
693 | int CAudioAlsa::TransDigitalVolToVolumeBarVol(int digit_lut_buf[], int hd_vol, int hd_min, |
694 | int hd_max, int digit_min, int digit_max) |
695 | { |
696 | int i; |
697 | |
698 | |
699 | for (i = 0; i < CC_VOL_TRANS_LUT_BUF_SIZE - 1; i++) { |
700 | if (digit_lut_buf[i] >= hd_vol && digit_lut_buf[i + 1] < hd_vol) |
701 | break; |
702 | } |
703 | |
704 | if (i < CC_VOL_TRANS_LUT_BUF_SIZE - 1) |
705 | return i; |
706 | |
707 | return digit_max; |
708 | } |
709 | |
710 | void CAudioAlsa::SetMainVolDigitLutBuf(int digit_lut_buf[]) |
711 | { |
712 | memcpy((void *) mMainDigitLutBuf, digit_lut_buf, |
713 | CC_VOL_TRANS_LUT_BUF_SIZE * sizeof(int)); |
714 | } |
715 | |
716 | int *CAudioAlsa::GetMainVolDigitLutBuf() |
717 | { |
718 | return mMainDigitLutBuf; |
719 | } |
720 | void CAudioAlsa::SetSupperBassVolDigitLutBuf(int digit_lut_buf[]) |
721 | { |
722 | memcpy((void *) mSupperBassDigitLutBuf, digit_lut_buf, |
723 | CC_VOL_TRANS_LUT_BUF_SIZE * sizeof(int)); |
724 | } |
725 | |
726 | |
727 | int CAudioAlsa::SetMainVolumeGain(int gain_val) |
728 | { |
729 | mMainVolumeGainVal = gain_val; |
730 | return mMainVolumeGainVal; |
731 | } |
732 | |
733 | int CAudioAlsa::GetMainVolumeGain() |
734 | { |
735 | return mMainVolumeGainVal; |
736 | } |
737 | |
738 | int CAudioAlsa::SetSupperBassVolumeGain(int gain_val) |
739 | { |
740 | int tmp_val = 0; |
741 | tmp_val = mSupperBassVolumeGainVal; |
742 | mSupperBassVolumeGainVal = gain_val; |
743 | return tmp_val; |
744 | } |
745 | |
746 | int CAudioAlsa::GetSupperBassVolumeGain() |
747 | { |
748 | int tmp_val = 0; |
749 | tmp_val = mSupperBassVolumeGainVal; |
750 | return tmp_val; |
751 | } |
752 | |
753 | |
754 | int CAudioAlsa::CalculateBalanceVol(int max_vol, int balance_val, int vol_buf[]) |
755 | { |
756 | int bal_mid_vol = 0, bal_cal_len = 0; |
757 | int tmp_val = 0; |
758 | |
759 | |
760 | vol_buf[0] = max_vol; |
761 | vol_buf[1] = max_vol; |
762 | |
763 | bal_mid_vol = (CC_MIN_SOUND_BALANCE_VAL + CC_MAX_SOUND_BALANCE_VAL) / 2; |
764 | bal_cal_len = (CC_MAX_SOUND_BALANCE_VAL - CC_MIN_SOUND_BALANCE_VAL) / 2; |
765 | |
766 | if (balance_val == bal_mid_vol) { |
767 | LOGD( |
768 | "%s, balance value = %d, bal_mid_vol = %d, vol_buf[0] = %d, vol_buf[1] = %d.\n", |
769 | __FUNCTION__, balance_val, bal_mid_vol, vol_buf[0], vol_buf[1]); |
770 | return 0; |
771 | } else if (balance_val < bal_mid_vol) { |
772 | vol_buf[1] = (bal_cal_len - (bal_mid_vol - balance_val)) * max_vol / bal_cal_len; |
773 | } else if (balance_val > bal_mid_vol) { |
774 | vol_buf[0] = (bal_cal_len - (balance_val - bal_mid_vol)) * max_vol / bal_cal_len; |
775 | } |
776 | |
777 | if (GetAudioAmplifierBalanceExchangeCFG() != 0) { |
778 | tmp_val = vol_buf[0]; |
779 | vol_buf[0] = vol_buf[1]; |
780 | vol_buf[1] = tmp_val; |
781 | } |
782 | |
783 | LOGD( |
784 | "%s, balance value = %d, bal_mid_vol = %d, vol_buf[0] = %d, vol_buf[1] = %d.\n", |
785 | __FUNCTION__, balance_val, bal_mid_vol, vol_buf[0], vol_buf[1]); |
786 | return 0; |
787 | } |
788 | |
789 | |
790 | int CAudioAlsa::SetInternalDacMute(int mute_state) |
791 | { |
792 | int ret = 0; |
793 | if (mute_state == CC_AUDIO_MUTE) |
794 | ret = SetAudioInternalDacDACDigitalPlayBackVolume(0, 0); |
795 | else |
796 | ret = SetAudioInternalDacDACDigitalPlayBackVolume(255, 255); |
797 | return ret; |
798 | } |
799 | |
800 | int CAudioAlsa::setAudioPcmPlaybackMute(int mute_state) |
801 | { |
802 | char prop[256]; |
803 | property_get("audio.output.double_output", prop, "null"); |
804 | if ( Get2d4gHeadsetEnable() == 1 && (strcmp(prop, "0") == 0 || strcmp(prop, "null") == 0)) { |
805 | SetAudioPcmPlaybackSwitch(mute_state); |
806 | } |
807 | return 0; |
808 | } |
809 | |
810 | |
811 | int CAudioAlsa::SetInternalDacMainVolume(int main_vol) |
812 | { |
813 | int tmp_ret = 0, digit_vol = 0; |
814 | digit_vol = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, main_vol); |
815 | |
816 | return SetInternalDacLineOutPlayBackVolume(digit_vol, digit_vol); |
817 | } |
818 | |
819 | |
820 | static int gDigitalMuteStatus = CC_AUDIO_UNMUTE; |
821 | static int gDigitalLeftVol = 0; |
822 | static int gDigitalRightVol = 0; |
823 | |
824 | int CAudioAlsa::SetDigitalVolume(int l_val, int r_val) |
825 | { |
826 | amAudioSetLeftGain(l_val); |
827 | amAudioSetRightGain(r_val); |
828 | LOGD("%s, l_val = %d, r_val = %d.\n", __FUNCTION__, l_val, r_val); |
829 | return 0; |
830 | } |
831 | |
832 | int CAudioAlsa::SetDigitalMainVolume(int l_vol, int r_vol) |
833 | { |
834 | int tmp_ret = 0, l_val = 0, r_val = 0; |
835 | |
836 | //handle l&r channel volume for balance |
837 | l_val = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, l_vol); |
838 | r_val = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, r_vol); |
839 | |
840 | gDigitalLeftVol = l_val; |
841 | gDigitalRightVol = r_val; |
842 | if (gDigitalMuteStatus == CC_AUDIO_UNMUTE) { |
843 | SetDigitalVolume(l_val, r_val); |
844 | } |
845 | |
846 | return tmp_ret; |
847 | } |
848 | |
849 | int CAudioAlsa::SetDigitalMute(int mute_status) |
850 | { |
851 | gDigitalMuteStatus = mute_status; |
852 | if (mute_status == CC_AUDIO_MUTE) { |
853 | SetDigitalVolume(0, 0); |
854 | } else if (mute_status == CC_AUDIO_UNMUTE) { |
855 | SetDigitalVolume(gDigitalLeftVol, gDigitalRightVol); |
856 | } |
857 | |
858 | return 0; |
859 | } |
860 | |
861 |