4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jonghyuk Choi <jhchoi.choi@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
24 #include <sys/types.h>
31 #include "avsys-audio-shm.h"
32 #include "avsys-audio-sync.h"
33 #include "avsys-audio-path.h"
34 #include "avsys-audio-shm.h"
35 #include "avsys-debug.h"
36 #include "avsys-common.h"
37 #include "avsys-audio-handle.h"
38 #include "avsys-audio-logical-volume.h"
39 #include "avsys-audio-alsa.h"
40 #include "avsys-audio-ascenario.h"
42 #define EXPORT_API __attribute__((__visibility__("default")))
44 #define RET_IO_CTL_ERR_IF_FAIL(SECTION) { if(AVSYS_FAIL(SECTION)) { \
45 avsys_error_r(AVAUDIO,"%s %d\n",__func__,__LINE__); \
46 return AVSYS_STATE_ERR_IO_CONTROL; \
49 #define OPEN_AIF_BEFORE_SCENARIO_SET
51 static int g_playback_path_select_data[AVSYS_AUDIO_PLAYBACK_GAIN_MAX][AVSYS_AUDIO_PATH_EX_OUTMAX] = {
52 { /* AVSYS_AUDIO_PLAYBACK_GAIN_AP */
53 /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */
54 0, 1, 0, 1, 0, 0, 0, 0
56 { /* AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO */
57 /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */
58 1, 1, 0, 1, 0, 0, 0, 0
60 { /* AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL */
61 /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */
62 1, 1, 1, 1, 1, 0, 0, 0
64 { /* AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL */
65 /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */
66 1, 1, 1, 1, 1, 0, 0, 0
68 { /* AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT */
69 /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */
70 0, 1, 1, 1, 1, 0, 0, 0
74 static int g_capture_path_select_data[AVSYS_AUDIO_CAPTURE_GAIN_MAX][AVSYS_AUDIO_PATH_EX_INMAX] = {
75 { /* AVSYS_AUDIO_CAPTURE_GAIN_AP */
76 /* NONE MIC HMIC BMIC FMIN HFREE */
79 { /* AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO */
80 /* NONE MIC HMIC BMIC FMIN HFREE */
83 { /* AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL */
84 /* NONE MIC HMIC BMIC FMIN HFREE */
87 { /* AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL */
88 /* NONE MIC HMIC BMIC FMIN HFREE */
93 static int g_playback_gain_select_data[AVSYS_AUDIO_PLAYBACK_GAIN_MAX][AVSYS_AUDIO_PLAYBACK_GAIN_MAX] = {
94 { /* AVSYS_AUDIO_PLAYBACK_GAIN_AP */
95 AVSYS_AUDIO_PLAYBACK_GAIN_AP, /* AVSYS_AUDIO_PLAYBACK_GAIN_AP */
96 AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO, /* AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO */
97 AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL */
98 AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL */
99 AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT, /* AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT */
101 { /* AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO */
102 AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO, /* AVSYS_AUDIO_PLAYBACK_GAIN_AP */
103 AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO, /* AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO */
104 AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL */
105 AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL */
106 AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO, /* AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT */
108 { /* AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL */
109 AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_AP */
110 AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO */
111 AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL */
112 AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL */
113 AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT, /* AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT */
115 { /* AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL */
116 AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_AP */
117 AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO */
118 AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL */
119 AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL */
120 AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT, /* AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT */
122 { /* AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT */
123 AVSYS_AUDIO_PLAYBACK_GAIN_AP, /* AVSYS_AUDIO_PLAYBACK_GAIN_AP */
124 AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO, /* AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO */
125 AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL */
126 AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL, /* AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL */
127 AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT, /* AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT */
131 static int g_capture_gain_select_data[AVSYS_AUDIO_CAPTURE_GAIN_MAX][AVSYS_AUDIO_CAPTURE_GAIN_MAX] = {
132 { /* AVSYS_AUDIO_CAPTURE_GAIN_AP */
133 AVSYS_AUDIO_CAPTURE_GAIN_AP, /* AVSYS_AUDIO_CAPTURE_GAIN_AP */
134 AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO, /* AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO */
135 AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL, /* AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL */
136 AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL, /* AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL */
138 { /* AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO */
139 AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO, /* AVSYS_AUDIO_CAPTURE_GAIN_AP */
140 AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO, /* AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO */
141 AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL, /* AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL */
142 AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL, /* AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL */
144 { /* AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL */
145 AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL, /* AVSYS_AUDIO_CAPTURE_GAIN_AP */
146 AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL, /* AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO */
147 AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL, /* AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL */
148 AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL, /* AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL */
150 { /* AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL */
151 AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL, /* AVSYS_AUDIO_CAPTURE_GAIN_AP */
152 AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL, /* AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO */
153 AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL, /* AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL */
154 AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL, /* AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL */
159 static int __avsys_audio_path_set_ascn_ap_playback(avsys_audio_path_ex_info_t *control);
160 static int __avsys_audio_path_set_ascn_voicecall(avsys_audio_path_ex_info_t *control);
161 static int __avsys_audio_path_set_ascn_videocall(avsys_audio_path_ex_info_t *control);
162 static int __avsys_audio_path_set_ascn_fmradio(avsys_audio_path_ex_info_t *control);
163 static int __avsys_audio_path_set_ascn_ap_capture(avsys_audio_path_ex_info_t *control);
166 typedef int (*_internal_gain_func)(avsys_audio_path_ex_info_t *control);
167 static _internal_gain_func playback_gain_func_table[AVSYS_AUDIO_PLAYBACK_GAIN_MAX] =
169 __avsys_audio_path_set_ascn_ap_playback,
170 __avsys_audio_path_set_ascn_fmradio,
171 __avsys_audio_path_set_ascn_voicecall,
172 __avsys_audio_path_set_ascn_videocall,
173 __avsys_audio_path_set_ascn_ap_playback,
176 static _internal_gain_func capture_gain_func_table[AVSYS_AUDIO_CAPTURE_GAIN_MAX] =
178 __avsys_audio_path_set_ascn_ap_capture,
179 __avsys_audio_path_set_ascn_fmradio,
180 __avsys_audio_path_set_ascn_voicecall,
181 __avsys_audio_path_set_ascn_videocall,
184 static int __avsys_audio_path_set_hw_controls(avsys_audio_path_ex_info_t *control);
185 static int __avsys_audio_path_get_earjack_type(void);
187 #define AUDIOSYSTEM_CONF "/opt/etc/audio_system.conf"
188 #define CONF_ITEM_COUNT 2
189 #define INPUT_DEV_MAX 20
190 static char *conf_string[] = {
196 char headset_detection;
197 char headset_node_number;
200 static int __load_conf(AudioSystemConf *data)
202 #if defined(_MMFW_I386_ALL_SIMULATOR)
204 return AVSYS_STATE_ERR_NULL_POINTER;
206 data->headset_detection = 1;
207 data->headset_node_number = 4;
211 char buffer[64] = { 0, };
212 char conf_data[CONF_ITEM_COUNT] = { 1, 0 };
215 return AVSYS_STATE_ERR_NULL_POINTER;
217 fp = fopen(AUDIOSYSTEM_CONF, "r");
219 char filename[128] = { 0, };
220 char readBuffer[32] = { 0, };
221 char headset_find = 0;
222 int num = 0, headset_num = -1;
224 for (num = 0; num < INPUT_DEV_MAX; num++) {
226 memset(filename, '\0', sizeof(filename));
227 snprintf(filename, sizeof(filename), "/sys/class/input/input%01d/name", num);
228 if (NULL == (sfp = fopen(filename, "r")))
230 memset(readBuffer, '\0', sizeof(readBuffer));
231 if (NULL == fgets(readBuffer, sizeof(readBuffer) - 1, sfp)) {
235 if (strstr(readBuffer, "Headset")) {
241 if (headset_num != -1) {
245 if (headset_num == -1)
246 return AVSYS_STATE_ERR_INTERNAL;
248 if (NULL == (fp = fopen(AUDIOSYSTEM_CONF, "w"))) {
249 return AVSYS_STATE_ERR_INTERNAL;
252 fprintf(fp, "%s:1\n", conf_string[0]);
253 fprintf(fp, "%s:%d\n", conf_string[1], headset_num);
258 data->headset_detection = 1;
259 data->headset_node_number = headset_num;
260 return AVSYS_STATE_SUCCESS;
263 while (fgets(buffer, sizeof(buffer) - 1, fp) != NULL) {
264 if ((strlen(buffer) < 3) || (buffer[0] == '#') || (buffer[0] == '!'))
266 if (buffer[strlen(buffer) - 1] == '\n')
267 buffer[strlen(buffer) - 1] = '\0';
268 for (i = 0; i < CONF_ITEM_COUNT; i++) {
269 if (0 == strncmp(buffer, conf_string[i], strlen(conf_string[i]))) {
271 if (NULL == (ptr = strstr(buffer, ":")))
273 conf_data[i] = atoi(ptr + 1);
274 avsys_warning(AVAUDIO, "%s[%d]\n", buffer, conf_data[i]);
279 data->headset_detection = conf_data[0];
280 data->headset_node_number = conf_data[1];
282 return AVSYS_STATE_SUCCESS;
286 int avsys_audio_path_ex_init(void)
288 avsys_audio_path_ex_info_t *control = NULL;
289 avsys_audio_path_ex_info_t **temp = NULL;
290 gain_info_t default_gain = { AVSYS_AUDIO_PLAYBACK_GAIN_AP, AVSYS_AUDIO_CAPTURE_GAIN_AP };
291 path_info_t default_path = { AVSYS_AUDIO_PATH_EX_SPK, AVSYS_AUDIO_PATH_EX_MIC };
292 gain_status_t clean_gain_status = { GS_GAIN_NONE, GS_GAIN_NONE };
293 path_status_t clean_path_status = { PS_PATH_NONE, PS_PATH_NONE };
294 option_info_t default_option = { AVSYS_AUDIO_PATH_OPTION_JACK_AUTO, AVSYS_AUDIO_PATH_OPTION_JACK_AUTO };
296 int err = AVSYS_STATE_SUCCESS;
297 AudioSystemConf conf = { 1, 4 };
299 /* Check root user */
300 err = avsys_check_root_privilege();
301 if (AVSYS_FAIL(err)) {
306 avsys_assert(AVSYS_SUCCESS(avsys_audio_create_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
307 avsys_assert(AVSYS_SUCCESS(avsys_audio_create_sync(AVSYS_AUDIO_SYNC_IDEN_SOUNDPATH))); /* for audio route policy */
308 avsys_assert(AVSYS_SUCCESS(avsys_audio_create_shm(AVSYS_AUDIO_SHM_IDEN_PATH)));
310 avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp)));
312 return AVSYS_STATE_ERR_NULL_POINTER;
315 control->pregain = default_gain;
316 control->gain = default_gain;
317 control->reqgain = default_gain;
318 control->path = default_path;
319 control->backup_gain = default_gain;
320 control->backup_path = default_path;
321 control->option = default_option;
322 control->gain_status = clean_gain_status;
323 control->path_status = clean_path_status;
324 control->p_gain_status = clean_gain_status;
325 control->p_path_status = clean_path_status;
327 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
328 control->inserted = AVSYS_AUDIO_INSERTED_NONE;
329 control->route_policy = AVSYS_AUDIO_ROUTE_POLICY_DEFAULT;
330 if (AVSYS_FAIL(__load_conf(&conf)))
331 avsys_error_r(AVAUDIO, "Can not load audio system configuration file\n");
333 if (conf.headset_detection) {
334 control->inserted = __avsys_audio_path_get_earjack_type();
335 if (control->inserted == AVSYS_AUDIO_INSERTED_NONE)
336 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
338 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
340 avsys_warning(AVAUDIO, "Ignore headset detection. Use speaker device\n");
341 control->inserted = AVSYS_AUDIO_INSERTED_NONE;
342 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
345 avsys_error_r(AVAUDIO, "Earjack init value is %d\n", control->inserted);
348 /* Gain tunning Debug mode */
349 FILE *gainTunningFp = NULL;
350 if (NULL != (gainTunningFp = fopen("/opt/etc/gain_tuner.ini", "r"))) {
351 char buffer[32] = "";
352 avsys_warning(AVAUDIO, "GAIN TUNNING DEBUG MODE...This degrade sound path performance\n");
353 memset(buffer, '\0', sizeof(buffer));
354 if (NULL == fgets(buffer, sizeof(buffer) - 1, gainTunningFp)) {
355 fclose(gainTunningFp);
356 control->gain_debug_mode = 0;
358 fclose(gainTunningFp);
359 if (0 == strncmp("debug=1", buffer, 7)) {
360 control->gain_debug_mode = 1;
362 control->gain_debug_mode = 0;
366 control->gain_debug_mode = 0;
369 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
370 control->mute = AVSYS_AUDIO_UNMUTE;
371 control->path_fixed = PATH_FIXED_NONE;
375 control->pathlock_pid[index] = -1;
377 } while (index < AVSYS_AUDIO_LOCK_SLOT_MAX);
381 control->path_fixed_pid[index] = -1;
383 } while (index < PATH_FIXED_TYPE_MAX);
385 /* call path control */
386 err = __avsys_audio_path_set_ascn_ap_playback(control);
387 if (AVSYS_SUCCESS(err))
388 err = __avsys_audio_path_set_hw_controls(control);
390 if (AVSYS_SUCCESS(err))
391 err = __avsys_audio_path_set_ascn_ap_capture(control);
397 int avsys_audio_path_ex_fini(void)
399 if (AVSYS_FAIL(avsys_audio_remove_shm(AVSYS_AUDIO_SHM_IDEN_PATH))) {
400 avsys_error_r(AVAUDIO, "avsys_audio_remove_shm() failed in %s\n", __func__);
401 return AVSYS_STATE_ERR_INTERNAL;
403 if (AVSYS_FAIL(avsys_audio_remove_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
404 avsys_error_r(AVAUDIO, "avsys_audio_remove_sync() failed in %s\n", __func__);
405 return AVSYS_STATE_ERR_INTERNAL;
407 return AVSYS_STATE_SUCCESS;
411 int avsys_audio_path_ex_reset(int forced)
413 avsys_audio_path_ex_info_t *control = NULL;
414 avsys_audio_path_ex_info_t **temp = NULL;
415 gain_info_t default_gain = { AVSYS_AUDIO_PLAYBACK_GAIN_AP, AVSYS_AUDIO_CAPTURE_GAIN_AP };
416 path_info_t default_path = { AVSYS_AUDIO_PATH_EX_SPK, AVSYS_AUDIO_PATH_EX_MIC };
417 gain_status_t clean_gain_status = { GS_GAIN_NONE, GS_GAIN_NONE };
418 path_status_t clean_path_status = { PS_PATH_NONE, PS_PATH_NONE };
419 option_info_t default_option = { AVSYS_AUDIO_PATH_OPTION_JACK_AUTO, AVSYS_AUDIO_PATH_OPTION_JACK_AUTO };
421 int err = AVSYS_STATE_SUCCESS;
422 int backup_debug = 0;
423 AudioSystemConf conf = { 1, 4 };
425 /* Check root user */
426 err = avsys_check_root_privilege();
427 if (AVSYS_FAIL(err)) {
432 if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))) {
433 avsys_error_r(AVAUDIO, "avsys_audio_get_shm() failed in %s\n", __func__);
434 return AVSYS_STATE_ERR_INTERNAL;
437 return AVSYS_STATE_ERR_NULL_POINTER;
439 if (AVSYS_FAIL(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
440 avsys_error_r(AVAUDIO, "avsys_audio_lock_sync() failed in %s\n", __func__);
441 return AVSYS_STATE_ERR_INTERNAL;
445 control->pregain = default_gain;
446 control->gain = default_gain;
447 control->reqgain = default_gain;
448 control->path = default_path;
449 control->backup_gain = default_gain;
450 control->backup_path = default_path;
451 control->option = default_option;
452 control->gain_status = clean_gain_status;
453 control->path_status = clean_path_status;
454 control->p_gain_status = clean_gain_status;
455 control->p_path_status = clean_path_status;
457 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
458 control->inserted = AVSYS_AUDIO_INSERTED_NONE;
459 control->route_policy = AVSYS_AUDIO_ROUTE_POLICY_DEFAULT;
460 if (AVSYS_FAIL(__load_conf(&conf)))
461 avsys_error_r(AVAUDIO, "Can not load audio system configuration file\n");
463 if (conf.headset_detection) {
464 control->inserted = __avsys_audio_path_get_earjack_type();
465 if (control->inserted == AVSYS_AUDIO_INSERTED_NONE)
466 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
468 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
470 avsys_warning(AVAUDIO, "Ignore headset detection. Use speaker device\n");
471 control->inserted = AVSYS_AUDIO_INSERTED_NONE;
472 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
475 avsys_error_r(AVAUDIO, "Earjack init value is %d\n", control->inserted);
478 /* Gain tunning Debug mode */
479 FILE *gainTunningFp = NULL;
480 if (NULL != (gainTunningFp = fopen("/opt/etc/gain_tuner.ini", "r"))) {
481 char buffer[32] = "";
482 avsys_warning(AVAUDIO, "GAIN TUNNING DEBUG MODE...This degrade sound path performance\n");
483 memset(buffer, '\0', sizeof(buffer));
484 if (NULL == fgets(buffer, sizeof(buffer) - 1, gainTunningFp)) {
485 fclose(gainTunningFp);
486 control->gain_debug_mode = 0;
488 fclose(gainTunningFp);
489 if (0 == strncmp("debug=1", buffer, 7)) {
490 control->gain_debug_mode = 1;
492 control->gain_debug_mode = 0;
496 control->gain_debug_mode = 0;
499 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
500 control->mute = AVSYS_AUDIO_UNMUTE;
501 control->path_fixed = PATH_FIXED_NONE;
505 control->pathlock_pid[index] = -1;
507 } while (index < AVSYS_AUDIO_LOCK_SLOT_MAX);
511 control->path_fixed_pid[index] = -1;
513 } while (index < PATH_FIXED_TYPE_MAX);
516 backup_debug = control->gain_debug_mode;
517 control->gain_debug_mode = 1;
519 /* call path control */
520 err = __avsys_audio_path_set_ascn_ap_playback(control);
521 if (AVSYS_SUCCESS(err))
522 err = __avsys_audio_path_set_hw_controls(control);
524 if (AVSYS_SUCCESS(err))
525 err = __avsys_audio_path_set_ascn_ap_capture(control);
528 control->gain_debug_mode = backup_debug;
531 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
532 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() failed in %s\n", __func__);
533 return AVSYS_STATE_ERR_INTERNAL;
540 int avsys_audio_path_ex_dump(void)
542 avsys_audio_path_ex_info_t *control = NULL;
543 avsys_audio_path_ex_info_t **temp = NULL;
544 const static char *str_earType[] = { "None", "EarOnly", "EarMic", "TVout" };
545 const static char *str_yn[] = { "NO", "YES" };
546 const static char *str_ear[] = { "MANUAL", "AUTO_MUTE", "AUTO_NOMUTE" };
547 const static char *str_out[AVSYS_AUDIO_PATH_EX_OUTMAX] = {
548 "NONE", "SPK", "RECV", "HEADSET", "BTHEADSET", "A2DP", "HANSFREE"
550 const static char *str_in[AVSYS_AUDIO_PATH_EX_INMAX] = {
551 "NONE", "MIC", "HEADMIC", "BTMIC", "FMINPUT", "HANSFREEMIC"
553 const static char *str_route[AVSYS_AUDIO_ROUTE_POLICY_MAX] = {
554 "DEFAULT", "IGN_A2DP", "HANDSET"
557 const static char *str_gain[AVSYS_AUDIO_GAIN_EX_MAX] = {
558 "KEYTONE", "RINGTONE", "ALARMTONE", "CALLTONE", "AUDIOPLAYER", "VIDEOPLAYER",
559 "VOICECALL", "VIDEOCALL", "FMRADIO", "VOICEREC", "CAMCORDER", "CAMERA", "GAME"};
561 const static char *str_playback_gain[AVSYS_AUDIO_PLAYBACK_GAIN_MAX] = {
562 "AP", "FMRADIO", "VOICECALL", "VIDEOCALL", "CALLALERT",
564 const static char *str_capture_gain[AVSYS_AUDIO_CAPTURE_GAIN_MAX] = {
565 "AP", "FMRADIO", "VOICECALL", "VIDEOCALL",
572 if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))) {
573 avsys_error_r(AVAUDIO, "avsys_audio_get_shm() failed in %s\n", __func__);
574 return AVSYS_STATE_ERR_INTERNAL;
577 return AVSYS_STATE_ERR_NULL_POINTER;
579 fprintf(stdout, "======================================================================\n");
580 fprintf(stdout, " Avsystem Audio Path Control Information \n");
581 fprintf(stdout, "======================================================================\n");
582 #if defined(_MMFW_I386_ALL_SIMULATOR)
583 fprintf(stdout, " In simulator, follow informations don`t have means.\n");
586 fprintf(stdout, " GAIN : P (%-s / %-s) - R (%-s / %-s) - C (%-s / %-s)\n",
587 str_playback_gain[control->pregain.playback], str_capture_gain[control->pregain.capture],
588 str_playback_gain[control->reqgain.playback], str_capture_gain[control->reqgain.capture],
589 str_playback_gain[control->gain.playback], str_capture_gain[control->gain.capture]);
590 fprintf(stdout, " Current Out / In : %-s / %-s\n", str_out[control->path.playback], str_in[control->path.capture] );
591 fprintf(stdout, " Gain debug mode : 0x%-x\n", control->gain_debug_mode);
592 fprintf(stdout, " Gain status : 0x%x 0x%x\n", control->gain_status.playback, control->gain_status.capture);
593 fprintf(stdout, " Path status : 0x%x 0x%x\n", control->path_status.playback, control->path_status.capture);
594 fprintf(stdout, " Auto EarJack Control : %-s\n", str_ear[control->ear_auto]);
595 fprintf(stdout, " Audio Route Policy : %-s\n", str_route[control->route_policy]);
596 fprintf(stdout, " Physical Earjack? [type] : %-s [%-s]\n", str_yn[control->inserted != AVSYS_AUDIO_INSERTED_NONE], str_earType[control->inserted]);
597 fprintf(stdout, " Path Fixed State : 0x%-x\n", control->path_fixed);
598 fprintf(stdout, " Mute status : %d\n", control->mute);
599 if (control->path_fixed_pid[PATH_FIXED_TYPE_FMRADIO] != -1)
600 fprintf(stdout, " FM Radio path pid : %d\n", control->path_fixed_pid[PATH_FIXED_TYPE_FMRADIO]);
601 if (control->path_fixed_pid[PATH_FIXED_TYPE_CALL] != -1)
602 fprintf(stdout, " Call path pid : %d\n", control->path_fixed_pid[PATH_FIXED_TYPE_CALL]);
606 if (control->pathlock_pid[index] != -1)
607 fprintf(stdout, " Path sync lock required PIDs : %d\n", control->pathlock_pid[index]);
609 } while (index < AVSYS_AUDIO_LOCK_SLOT_MAX);
610 fprintf(stdout, " Option Lagacy : %-s\n", str_yn[(control->option.playback & AVSYS_AUDIO_PATH_OPTION_LEGACY_MODE) ? 1 : 0]);
611 fprintf(stdout, " Option Jack Playback : %-s\n", str_yn[(control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) ? 1 : 0]);
612 fprintf(stdout, " Option Jack Capture : %-s\n", str_yn[(control->option.capture & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) ? 1 : 0]);
613 fprintf(stdout, " Option Dual out : %-s\n", str_yn[(control->option.playback & AVSYS_AUDIO_PATH_OPTION_DUAL_OUT) ? 1 : 0]);
614 fprintf(stdout, " Option Forced : %-s\n", str_yn[(control->option.playback & AVSYS_AUDIO_PATH_OPTION_FORCED) ? 1 : 0]);
616 return AVSYS_STATE_SUCCESS;
619 static int __avsys_audio_path_get_earjack_type (void)
622 char readval = AVSYS_AUDIO_INSERTED_NONE;
623 fd = open("/sys/devices/platform/jack/earjack_online", O_RDONLY);
626 avsys_error_r(AVAUDIO, "Can not get initial jack type\n");
627 return AVSYS_AUDIO_INSERTED_NONE;
629 read(fd, &readval, sizeof(readval));
632 readval = AVSYS_AUDIO_INSERTED_NONE;
635 readval = AVSYS_AUDIO_INSERTED_3;
638 readval = AVSYS_AUDIO_INSERTED_4;
641 readval = AVSYS_AUDIO_INSERTED_AV;
644 if (1 == read(fd, &readval, sizeof(readval))) {
645 if (readval == '0') {
646 readval = AVSYS_AUDIO_INSERTED_AV;
648 avsys_error(AVAUDIO, "Unknown jack type value...2%d\n", readval);
649 readval = AVSYS_AUDIO_INSERTED_NONE;
652 avsys_error(AVAUDIO, "jack type read error...\n");
653 readval = AVSYS_AUDIO_INSERTED_NONE;
657 avsys_error(AVAUDIO, "jack type unknown value...%c\n", readval);
658 readval = AVSYS_AUDIO_INSERTED_NONE;
666 int avsys_audio_path_earjack_init(int *init_type, int *outfd)
668 #if !defined(_MMFW_I386_ALL_SIMULATOR)
669 char eventnode_filename[32] = { 0, };
671 AudioSystemConf conf = { 1, 4 };
673 if (outfd == NULL || init_type == NULL) {
674 avsys_error(AVAUDIO, "input parameter is null\n");
675 return AVSYS_STATE_ERR_NULL_POINTER;
678 if (AVSYS_FAIL(__load_conf(&conf))) {
679 avsys_error_r(AVAUDIO, "Can not load audio system configuration file\n");
682 if (!conf.headset_detection) {
683 avsys_error(AVAUDIO, "Earjack control daemon will be closed by user option...\n");
684 return AVSYS_STATE_SUCCESS;
687 snprintf(eventnode_filename, sizeof(eventnode_filename), "/dev/event%01d", conf.headset_node_number);
689 fd = open(eventnode_filename, O_RDONLY);
691 avsys_error_r(AVAUDIO, "Device file open error\n");
692 return AVSYS_STATE_ERR_INTERNAL;
694 avsys_audio_path_ex_info_t *control = NULL;
695 avsys_audio_path_ex_info_t **temp = NULL;
696 void *vol_data = NULL;
697 void *handle_data = NULL;
700 if(AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, &vol_data))) {
701 avsys_error(AVAUDIO,"attach logical volume shared memory failed\n");
702 return AVSYS_STATE_ERR_ALLOCATION;
704 if(AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_HANDLE, &handle_data))) {
705 avsys_error(AVAUDIO,"attach handle shared memory failed\n");
706 return AVSYS_STATE_ERR_ALLOCATION;
708 if(AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void**)temp))) {
709 avsys_error_r(AVAUDIO,"avsys_audio_get_shm() failed in %s\n", __func__);
710 return AVSYS_STATE_ERR_INTERNAL;
713 *init_type = control->inserted;
715 return AVSYS_STATE_SUCCESS;
718 return AVSYS_STATE_ERR_DEVICE_NOT_SUPPORT;
722 int avsys_audio_path_earjack_wait(int fd, int *current_type, int *new_type, int *is_auto_mute)
724 #if !defined(_MMFW_I386_ALL_SIMULATOR)
728 struct avsys_audio_jack_event jevent;
729 int res = AVSYS_STATE_SUCCESS;
733 if (new_type == NULL || is_auto_mute == NULL)
734 return AVSYS_STATE_ERR_NULL_POINTER;
739 cur_type = *current_type;
741 select_ret = select(fd + 1, &set, NULL, NULL, NULL);
742 avsys_info(AVAUDIO, "SELECT returns......\n");
744 if (select_ret != 1) {
745 if (select_ret == 0) {
746 avsys_error_r(AVAUDIO, "Earjack timeout in autocontrol\n");
747 } else if (select_ret == -1) {
748 avsys_error_r(AVAUDIO, "Earjack detect unknown error: %d\n", errno);
750 return AVSYS_STATE_WAR_INVALID_VALUE;
752 #ifdef EARJACK_LOCK /* currently this is disabled to avoid semapore value increase */
753 if (AVSYS_FAIL(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
754 avsys_error_r(AVAUDIO, "avsys_audio_lock_sync() failed in %s\n", __func__);
755 return AVSYS_STATE_ERR_INTERNAL;
758 if (read(fd, &jevent, sizeof(jevent)) < 0) {
759 avsys_error(AVAUDIO, "read fd failed with 0x%x\n", errno);
760 return AVSYS_STATE_WAR_INVALID_MODE;
762 avsys_info(AVAUDIO, "*** JEVENT : code=%d, value=%d\n", jevent.code, jevent.value);
763 if (jevent.type != TYPE_EVENT_SWITCH) {
764 avsys_info(AVAUDIO, "Not a switch event\n");
765 return AVSYS_STATE_WAR_INVALID_MODE;
768 switch (jevent.code) {
769 case CODE_HEADPHONE_INSERT:
770 case CODE_LINEOUT_INSERT:
771 case CODE_JACK_PHYSICAL_INSERT:
772 if (jevent.value == 1) {
773 readtemp = __avsys_audio_path_get_earjack_type();
778 set_flag = 1; /* need change earphone status */
781 readtemp = cur_type; /* same value */
785 *new_type = readtemp;
787 avsys_audio_path_ex_info_t *control = NULL;
788 avsys_audio_path_ex_info_t **temp = NULL;
791 if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))) {
792 avsys_error_r(AVAUDIO, "avsys_audio_get_shm() failed in %s\n", __func__);
793 return AVSYS_STATE_ERR_INTERNAL;
796 avsys_info(AVAUDIO, "control->ear_auto = %d\n", control->ear_auto);
797 if (control->ear_auto == AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE) {
798 *current_type = control->inserted;
800 res = AVSYS_STATE_SUCCESS;
801 } else if (control->ear_auto == AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE) {
802 *current_type = control->inserted;
804 res = AVSYS_STATE_SUCCESS;
805 } else if (control->ear_auto == AVSYS_AUDIO_EAR_SWITCH_MANUAL) {
809 control->inserted = *new_type;
812 res = AVSYS_STATE_WAR_INTERNAL;
817 return AVSYS_STATE_ERR_DEVICE_NOT_SUPPORT;
821 int avsys_audio_path_earjack_process(int new_type)
823 #if !defined(_MMFW_I386_ALL_SIMULATOR)
824 avsys_audio_path_ex_info_t *control = NULL;
825 avsys_audio_path_ex_info_t **temp = NULL;
826 int err = AVSYS_STATE_SUCCESS;
829 avsys_info(AVAUDIO, "new_type = %d\n", new_type);
830 if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))) {
831 avsys_error_r(AVAUDIO, "avsys_audio_get_shm() failed in %s\n", __func__);
832 return AVSYS_STATE_ERR_INTERNAL;
835 control->inserted = new_type;
837 if (control->ear_auto == AVSYS_AUDIO_EAR_SWITCH_MANUAL) {
838 return AVSYS_STATE_SUCCESS;
841 /* Capture/Playback Gain Control */
842 avsys_warning(AVAUDIO, "Gain C(%d), P(%d)\n", control->gain.capture, control->gain.playback);
843 err = capture_gain_func_table[control->gain.capture] (control);
844 if (AVSYS_FAIL(err)) {
845 avsys_error_r(AVAUDIO, "earjack change failed for %d gain : error 0x%x\n", control->gain.capture, err);
848 err = playback_gain_func_table[control->gain.playback] (control);
849 if (AVSYS_SUCCESS(err)) {
851 err = __avsys_audio_path_set_hw_controls(control);
852 if (AVSYS_FAIL(err)) {
853 avsys_error_r(AVAUDIO, "__avsys_audio_path_set_hw_controls() failed in %s\n", __func__);
856 avsys_error_r(AVAUDIO, "earjack change failed for %d gain : error 0x%x\n", control->gain.playback, err);
860 return AVSYS_STATE_ERR_DEVICE_NOT_SUPPORT;
864 int avsys_audio_path_earjack_deinit(int fd)
866 #if !defined(_MMFW_I386_ALL_SIMULATOR)
868 return AVSYS_STATE_SUCCESS;
870 return AVSYS_STATE_ERR_DEVICE_NOT_SUPPORT;
874 int avsys_audio_path_earjack_unlock()
876 #ifdef EARJACK_LOCK /* currently this is disabled to avoid semapore value increase */
877 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
878 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() failed in %s\n", __func__);
879 return AVSYS_STATE_ERR_INTERNAL;
882 return AVSYS_STATE_SUCCESS;
885 #define DO_IF_VALID(c, p) { if(c > -1) p; }
886 #define DO_IF_INVALID(c, p) { if(c == -1) p; }
887 #define CHECK_VALID(c) (c>-1 ? 1 : 0)
896 avsys_audio_alsa_aif_handle_t *g_hAIF[AIF_DEVICE_MAX] = { NULL, NULL, NULL, NULL };
897 char *strAIF[AIF_DEVICE_MAX] = { "AIF2 Capture", "AIF2 Playback", "AIF3 Capture", "AIF3 Playback" };
899 #define SET_AIF(index) \
901 if(g_hAIF[index]) { \
902 avsys_warning(AVAUDIO,#index" device already opened\n"); \
903 AIF_control[index] = CMD_DEVICE_NONE; \
905 AIF_control[index] = CMD_DEVICE_OPEN; \
909 static int __avsys_open_aif(char AIF_control[])
912 int err = AVSYS_STATE_SUCCESS;
914 for (iAIF = 0; iAIF < AIF_DEVICE_MAX; iAIF++) {
916 if (AIF_control[iAIF] != CMD_DEVICE_OPEN)
919 /* check handle allocation */
921 avsys_warning(AVAUDIO, "Oops! Free %s device handle first", strAIF[iAIF]);
925 /* memory allocation for handle */
926 avsys_warning(AVAUDIO, "%s handle alloc", strAIF[iAIF]);
927 g_hAIF[iAIF] = calloc(sizeof(avsys_audio_handle_t), 1);
929 avsys_error_r(AVAUDIO, "Can not alloc memory for %s device handle", strAIF[iAIF]);
930 err = AVSYS_STATE_ERR_ALLOCATION;
934 if (AVSYS_FAIL(avsys_audio_alsa_open_AIF_device(iAIF, g_hAIF[iAIF]))) {
935 avsys_error_r(AVAUDIO, "open %s device failed\n", strAIF[iAIF]);
936 err = AVSYS_STATE_ERR_INVALID_HANDLE;
938 avsys_warning(AVAUDIO, "open %s device success\n", strAIF[iAIF]);
939 if (AVSYS_FAIL(avsys_audio_alsa_set_AIF_params(g_hAIF[iAIF]))) {
940 avsys_error_r(AVAUDIO, "%s device set parameter failed\n", strAIF[iAIF]);
941 err = AVSYS_STATE_ERR_INVALID_PARAMETER;
943 avsys_warning(AVAUDIO, "%s device set parameter success\n", strAIF[iAIF]);
950 static void __avsys_close_aif ()
954 for (iAIF = 0; iAIF < AIF_DEVICE_MAX; iAIF++) {
956 avsys_info(AVAUDIO, "close device :: %s\n", strAIF[iAIF]);
957 if (AVSYS_FAIL(avsys_audio_alsa_close_AIF_device(g_hAIF[iAIF]))) {
958 avsys_error_r(AVAUDIO, "close %s device failed\n", strAIF[iAIF]);
962 avsys_warning(AVAUDIO, "%s device handle free\n", strAIF[iAIF]);
964 avsys_info(AVAUDIO, "skip closing device :: %s\n", strAIF[iAIF]);
969 static int __avsys_audio_release_path (gain_info_t local_gain, avsys_audio_path_ex_info_t *control)
971 int err = AVSYS_STATE_SUCCESS;
974 avsys_warning(AVAUDIO, "Release path for %d %d\n", local_gain.playback, local_gain.capture);
976 switch (local_gain.playback) {
977 case AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL:
978 case AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL:
979 if (getpid() == control->path_fixed_pid[PATH_FIXED_TYPE_CALL]) {
980 #ifndef OPEN_AIF_BEFORE_SCENARIO_SET /* FIXME : disable here, close after scenario set */
984 if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_CODEC_DISABLE_ON_SUSPEND))) {
985 avsys_error_r(AVAUDIO, "[%s] failed to set codec_disable_on_suspend\n", __func__);
987 control->p_path_status.playback |= PS_CODEC_DISABLE_ON_SUSPEND;
989 if (control->path_fixed_pid[PATH_FIXED_TYPE_CALL] < 0) {
990 avsys_warning(AVAUDIO, "Sound path for call released already\n");
992 avsys_warning(AVAUDIO, "Try to close call path from other process.. original pid[%d]\n", control->path_fixed_pid[PATH_FIXED_TYPE_CALL]);
993 avsys_warning(AVAUDIO, "Just mark handle as off\n");
997 if ((control->path_fixed & PATH_FIXED_WITH_CALL) == 0) {
998 avsys_error(AVAUDIO, "Call path release without call path request\n");
1000 control->path_fixed &= ~PATH_FIXED_WITH_CALL;
1001 control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = -1;
1005 case AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO:
1006 /* TODO: Reset & Codec disable on suspend script */
1007 if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_CODEC_DISABLE_ON_SUSPEND))) {
1008 avsys_error_r(AVAUDIO, "[%s] failed to set codec_disable_on_suspend\n", __func__);
1010 control->p_path_status.playback |= PS_CODEC_DISABLE_ON_SUSPEND;
1012 if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET))) {
1013 avsys_error_r(AVAUDIO, "[%s] failed to set reset\n", __func__);
1015 control->p_path_status.playback = PS_PATH_NONE;
1018 /* TODO: Path fixed clear (path_fixed, path_fixed_pid) */
1019 if ((control->path_fixed & PATH_FIXED_WITH_FMRADIO) == 0) {
1020 avsys_error(AVAUDIO, "FM-Radio path release without radio path request\n");
1022 control->path_fixed &= ~PATH_FIXED_WITH_FMRADIO;
1023 control->path_fixed_pid[PATH_FIXED_TYPE_FMRADIO] = -1;
1027 avsys_warning(AVAUDIO, "unexpected path release\n");
1031 if (control->path_fixed != PATH_FIXED_NONE) {
1032 avsys_error(AVAUDIO, "Still remain another path_fixed request : 0x%08X\n", control->path_fixed);
1033 avsys_error(AVAUDIO, "This is not expected condition\n");
1035 avsys_warning(AVAUDIO, "Path Release to default condition....\n");
1036 control->gain.playback = AVSYS_AUDIO_PLAYBACK_GAIN_AP;
1037 control->gain.capture = AVSYS_AUDIO_CAPTURE_GAIN_AP;
1038 control->path.playback = AVSYS_AUDIO_PATH_EX_SPK;
1039 control->path.capture = AVSYS_AUDIO_PATH_EX_MIC;
1041 switch(control->route_policy)
1043 case AVSYS_AUDIO_ROUTE_POLICY_DEFAULT:
1044 case AVSYS_AUDIO_ROUTE_POLICY_IGNORE_A2DP:
1045 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE;
1046 control->option.playback = AVSYS_AUDIO_PATH_OPTION_JACK_AUTO;
1047 control->option.capture = AVSYS_AUDIO_PATH_OPTION_JACK_AUTO;
1050 case AVSYS_AUDIO_ROUTE_POLICY_HANDSET_ONLY:
1051 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE;
1052 control->option.playback = AVSYS_AUDIO_PATH_OPTION_NONE;
1053 control->option.capture = AVSYS_AUDIO_PATH_OPTION_NONE;
1060 control->p_path_status.playback = PS_PATH_NONE;
1061 control->p_path_status.capture = PS_PATH_NONE;
1062 control->p_gain_status.playback = GS_GAIN_NONE;
1063 control->p_gain_status.capture = GS_GAIN_NONE;
1066 err = __avsys_audio_path_set_ascn_ap_playback(control);
1067 if (AVSYS_SUCCESS(err)) {
1068 err = __avsys_audio_path_set_hw_controls(control);
1069 if (AVSYS_FAIL(err)) {
1070 avsys_error(AVAUDIO, "Update logical volume failure\n");
1073 avsys_error(AVAUDIO, "Set ap playback failure\n");
1077 err = __avsys_audio_path_set_ascn_ap_capture(control);
1078 if (AVSYS_FAIL(err)) {
1079 avsys_error(AVAUDIO, "Set ap capture failure\n");
1083 /* FIXME : Close AIF, this will be moved before scneario set */
1084 #ifdef OPEN_AIF_BEFORE_SCENARIO_SET
1085 if ((local_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL || local_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL) &&
1086 getpid() == control->path_fixed_pid[PATH_FIXED_TYPE_CALL]) {
1087 __avsys_close_aif();
1094 int avsys_audio_path_ex_set_path(int gain, int out, int in, int option)
1096 avsys_audio_path_ex_info_t *control = NULL;
1097 avsys_audio_path_ex_info_t **temp = NULL;
1098 gain_info_t local_gain = { -1, -1 };
1099 gain_info_t req_gain = { -1, -1 };
1101 int err = AVSYS_STATE_SUCCESS;
1102 char req_release_path = 0;
1103 char AIF_control[AIF_DEVICE_MAX] = { CMD_DEVICE_NONE, CMD_DEVICE_NONE, CMD_DEVICE_NONE, CMD_DEVICE_NONE };
1106 avsys_warning(AVAUDIO, "=================== [Input Param] gain %d, out %d, in %d, opt 0x%x ====================\n", gain, out, in, option);
1108 /* Determine REQUESTs */
1110 case AVSYS_AUDIO_GAIN_EX_KEYTONE:
1111 case AVSYS_AUDIO_GAIN_EX_ALARMTONE:
1112 case AVSYS_AUDIO_GAIN_EX_AUDIOPLAYER:
1113 case AVSYS_AUDIO_GAIN_EX_VIDEOPLAYER:
1114 case AVSYS_AUDIO_GAIN_EX_CAMERA:
1115 case AVSYS_AUDIO_GAIN_EX_GAME:
1116 req_gain.playback = AVSYS_AUDIO_PLAYBACK_GAIN_AP;
1119 case AVSYS_AUDIO_GAIN_EX_RINGTONE:
1120 case AVSYS_AUDIO_GAIN_EX_CALLTONE:
1121 req_gain.playback = AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT;
1124 case AVSYS_AUDIO_GAIN_EX_VOICEREC:
1125 case AVSYS_AUDIO_GAIN_EX_CAMCORDER:
1126 req_gain.capture = AVSYS_AUDIO_CAPTURE_GAIN_AP;
1129 case AVSYS_AUDIO_GAIN_EX_VOICECALL:
1130 req_gain.playback = AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL;
1131 req_gain.capture = AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL;
1132 if (out == AVSYS_AUDIO_PATH_EX_NONE && in == AVSYS_AUDIO_PATH_EX_NONE)
1133 req_release_path = 1;
1136 case AVSYS_AUDIO_GAIN_EX_VIDEOCALL:
1137 req_gain.playback = AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL;
1138 req_gain.capture = AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL;
1139 if (out == AVSYS_AUDIO_PATH_EX_NONE && in == AVSYS_AUDIO_PATH_EX_NONE)
1140 req_release_path = 1;
1143 case AVSYS_AUDIO_GAIN_EX_FMRADIO:
1144 req_gain.playback = AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO;
1145 req_gain.capture = AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO;
1146 if (out == AVSYS_AUDIO_PATH_EX_NONE && in == AVSYS_AUDIO_PATH_EX_NONE)
1147 req_release_path = 1;
1151 /* Get avsys shared memeory */
1153 if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))) {
1154 avsys_error_r(AVAUDIO, "avsys_audio_get_shm() failed in %s\n", __func__);
1155 return AVSYS_STATE_ERR_INTERNAL;
1158 if (AVSYS_FAIL(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1159 avsys_error_r(AVAUDIO, "avsys_audio_lock_sync() failed in %s\n", __func__);
1160 return AVSYS_STATE_ERR_INTERNAL;
1163 current_pid = getpid(); /* moved from below */
1165 /* Check FORCED option */
1166 if (option & AVSYS_AUDIO_PATH_OPTION_FORCED) {
1167 DO_IF_VALID(req_gain.playback, local_gain.playback = req_gain.playback)
1168 DO_IF_VALID(req_gain.capture, local_gain.capture = req_gain.capture)
1170 DO_IF_VALID(req_gain.playback, local_gain.playback = g_playback_gain_select_data[control->gain.playback][req_gain.playback])
1171 DO_IF_VALID(req_gain.capture, local_gain.capture = g_capture_gain_select_data[control->gain.capture][req_gain.capture])
1174 avsys_info(AVAUDIO, "Gain : req(%d,%d) local(%d,%d)\n", req_gain.playback, req_gain.capture, local_gain.playback, local_gain.capture);
1176 /* Check path fixed process alive. */
1177 if (control->path_fixed & PATH_FIXED_WITH_CALL) {
1178 if (AVSYS_FAIL(avsys_check_process(control->path_fixed_pid[PATH_FIXED_TYPE_CALL]))) {
1179 control->path_fixed &= ~PATH_FIXED_WITH_CALL;
1182 if (control->path_fixed & PATH_FIXED_WITH_FMRADIO) {
1183 if (AVSYS_FAIL(avsys_check_process(control->path_fixed_pid[PATH_FIXED_TYPE_FMRADIO]))) {
1184 control->path_fixed &= ~PATH_FIXED_WITH_FMRADIO;
1187 if (control->path_fixed == PATH_FIXED_NONE) {
1188 /* forced gain setting when path fixed by dead process */
1189 if (req_gain.playback != local_gain.playback) {
1190 local_gain.playback = req_gain.playback;
1192 if (req_gain.capture != local_gain.capture) {
1193 local_gain.capture = req_gain.capture;
1197 if (CHECK_VALID(local_gain.playback)) {
1198 if (g_playback_path_select_data[local_gain.playback][out] == 0) {
1199 avsys_error(AVAUDIO, "[PLAYBACK] Does not support request sound path : conv gain %d, out path %d\n", local_gain.playback, out);
1200 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1201 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() failed in %s\n", __func__);
1202 return AVSYS_STATE_ERR_INTERNAL;
1204 return AVSYS_STATE_ERR_INVALID_STATE;
1207 if (CHECK_VALID(local_gain.capture)) {
1208 if (g_capture_path_select_data[local_gain.capture][in] == 0) {
1209 avsys_error(AVAUDIO, "[CAPTURE] Does not support request sound path : conv gain %d, in path %d\n", local_gain.capture, in);
1210 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1211 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() failed in %s\n", __func__);
1212 return AVSYS_STATE_ERR_INTERNAL;
1214 return AVSYS_STATE_ERR_INVALID_STATE;
1217 /* overwrite local_gain with current gain if it is simplex sound path */
1218 DO_IF_INVALID(local_gain.playback, local_gain.playback = control->gain.playback)
1219 DO_IF_INVALID(local_gain.capture, local_gain.capture = control->gain.capture)
1220 control->pregain = control->gain;
1221 control->gain = local_gain;
1223 DO_IF_VALID(req_gain.playback, control->reqgain.playback = req_gain.playback)
1224 DO_IF_VALID(req_gain.capture, control->reqgain.capture = req_gain.capture)
1225 DO_IF_VALID(local_gain.playback, control->option.playback = option)
1226 DO_IF_VALID(local_gain.capture, control->option.capture = option)
1228 /* Check for Release PATH */
1229 if (req_release_path && (req_gain.playback == local_gain.playback) && (req_gain.capture == local_gain.capture)) {
1230 avsys_warning(AVAUDIO,"Release path for %d %d\n", local_gain.playback, local_gain.capture);
1232 err = __avsys_audio_release_path(local_gain, control);
1235 if (CHECK_VALID(req_gain.playback)) {
1236 if(req_gain.playback != local_gain.playback) {
1237 avsys_warning(AVAUDIO, "Sound Path is protected. use current configuration (playback_gain %d, out %d, opt 0x%x)\n",
1238 local_gain.playback, control->path.playback, control->option.playback);
1239 if (req_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_AP) {
1240 control->backup_gain.playback = control->reqgain.playback;
1241 control->backup_path.playback = out;
1244 control->path.playback = out;
1245 control->backup_gain.playback = local_gain.playback;
1246 control->backup_path.playback = out;
1248 switch (local_gain.playback) {
1249 case AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL:
1250 control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = current_pid;
1251 case AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT:
1252 if (control->path.playback == AVSYS_AUDIO_PATH_EX_BTHEADSET) {
1253 SET_AIF(AIF3_PLAYBACK);
1254 SET_AIF(AIF3_CAPTURE);
1258 case AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL:
1259 control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = current_pid;
1260 SET_AIF(AIF2_PLAYBACK);
1262 if (control->path.playback == AVSYS_AUDIO_PATH_EX_BTHEADSET) {
1263 SET_AIF(AIF3_PLAYBACK);
1267 case AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO:
1268 control->path_fixed_pid[PATH_FIXED_TYPE_FMRADIO] = current_pid;
1274 if (CHECK_VALID(req_gain.capture)) {
1275 if (req_gain.capture != local_gain.capture) {
1276 avsys_warning(AVAUDIO, "Sound Path is protected. use current configuration (capture_gain %d, in %d, opt 0x%x)\n",
1277 local_gain.capture, control->path.capture, control->option.capture);
1278 if (req_gain.capture == AVSYS_AUDIO_CAPTURE_GAIN_AP) {
1279 control->backup_gain.capture = control->reqgain.capture;
1280 control->backup_path.capture = in;
1283 control->path.capture = in;
1284 control->backup_gain.capture = local_gain.capture;
1285 control->backup_path.capture = in;
1287 switch (local_gain.capture) {
1288 case AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL:
1289 control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = current_pid;
1290 if (control->path.capture == AVSYS_AUDIO_PATH_EX_BTMIC) {
1291 SET_AIF(AIF3_CAPTURE);
1295 case AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL:
1296 control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = current_pid;
1297 SET_AIF(AIF2_CAPTURE);
1299 if (control->path.capture == AVSYS_AUDIO_PATH_EX_BTMIC) {
1300 SET_AIF(AIF3_CAPTURE);
1304 case AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO:
1305 control->path_fixed_pid[PATH_FIXED_TYPE_FMRADIO] = current_pid;
1312 /* FIXME: this will be moved to after alsa scenraio set */
1313 #ifdef OPEN_AIF_BEFORE_SCENARIO_SET
1314 err = __avsys_open_aif(AIF_control);
1317 /* Do ALSA scenario control based on gain */
1319 if (local_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_AP) {
1320 avsys_warning(AVAUDIO, "playback gain : ap\n");
1321 err = __avsys_audio_path_set_ascn_ap_playback(control);
1322 if (AVSYS_SUCCESS(err)) {
1323 err = __avsys_audio_path_set_hw_controls(control);
1325 } else if(local_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT) {
1326 avsys_warning(AVAUDIO,"playback gain : callalert\n");
1327 err = __avsys_audio_path_set_ascn_ap_playback(control);
1328 if (AVSYS_SUCCESS(err)) {
1329 err = __avsys_audio_path_set_hw_controls(control);
1331 } else if (local_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO &&
1332 local_gain.capture == AVSYS_AUDIO_CAPTURE_GAIN_FMRADIO) {
1333 avsys_warning(AVAUDIO, "fmradio gain\n");
1334 err = __avsys_audio_path_set_ascn_fmradio(control);
1335 } else if (local_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL &&
1336 local_gain.capture == AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL) {
1337 avsys_warning(AVAUDIO, "voicecall gain\n");
1338 err = __avsys_audio_path_set_ascn_voicecall(control);
1339 } else if (local_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL &&
1340 local_gain.capture == AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL) {
1341 avsys_warning(AVAUDIO, "videocall gain\n");
1342 err = __avsys_audio_path_set_ascn_videocall(control);
1345 if (local_gain.capture == AVSYS_AUDIO_CAPTURE_GAIN_AP) {
1346 avsys_warning(AVAUDIO, "capture gain : ap\n");
1347 err = __avsys_audio_path_set_ascn_ap_capture(control);
1349 #ifndef OPEN_AIF_BEFORE_SCENARIO_SET
1350 err = __avsys_open_aif(AIF_control);
1355 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1356 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() failed in %s\n", __func__);
1357 return AVSYS_STATE_ERR_INTERNAL;
1359 avsys_info(AVAUDIO, "------------------------------------------------\n");
1363 int avsys_audio_path_ex_get_path(int *gain, int *out, int *in, int *option)
1365 avsys_audio_path_ex_info_t *control = NULL;
1366 avsys_audio_path_ex_info_t ** temp = NULL;
1368 if(gain == NULL || out == NULL || in == NULL || option == NULL) {
1369 avsys_error(AVAUDIO,"Invalid parameter\n");
1370 return AVSYS_STATE_ERR_NULL_POINTER;
1375 if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))) {
1376 avsys_error_r(AVAUDIO, "avsys_audio_get_shm() failed in %s\n", __func__);
1377 return AVSYS_STATE_ERR_INTERNAL;
1379 if (AVSYS_FAIL(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1380 avsys_error_r(AVAUDIO, "avsys_audio_lock_sync() failed in %s\n", __func__);
1381 return AVSYS_STATE_ERR_INTERNAL;
1384 switch (control->gain.playback) {
1385 case AVSYS_AUDIO_PLAYBACK_GAIN_AP:
1386 *gain = AVSYS_AUDIO_GAIN_EX_KEYTONE;
1387 *out = control->path.playback;
1388 *in = AVSYS_AUDIO_PATH_EX_NONE;
1389 *option = control->option.playback;
1391 case AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT:
1392 *gain = AVSYS_AUDIO_GAIN_EX_RINGTONE;
1393 *out = control->path.playback;
1394 *in = AVSYS_AUDIO_PATH_EX_NONE;
1395 *option = control->option.playback;
1397 case AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL:
1398 *gain = AVSYS_AUDIO_GAIN_EX_VOICECALL;
1399 *out = control->path.playback;
1400 *in = control->path.capture;
1401 *option = control->option.playback;
1403 case AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL:
1404 *gain = AVSYS_AUDIO_GAIN_EX_VIDEOCALL;
1405 *out = control->path.playback;
1406 *in = control->path.capture;
1407 *option = control->option.playback;
1409 case AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO:
1410 *gain = AVSYS_AUDIO_GAIN_EX_FMRADIO;
1411 *out = control->path.playback;
1412 *in = control->path.capture;
1413 *option = control->option.playback;
1417 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1418 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() failed in %s\n", __func__);
1419 return AVSYS_STATE_ERR_INTERNAL;
1422 return AVSYS_STATE_SUCCESS;
1425 int avsys_audio_path_ex_set_amp(const int onoff)
1427 //not yet implemented.
1428 return AVSYS_STATE_SUCCESS;
1431 int avsys_audio_path_ex_set_mute(const int mute)
1433 avsys_audio_path_ex_info_t *control = NULL;
1434 avsys_audio_path_ex_info_t **temp = NULL;
1438 if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))) {
1439 avsys_error_r(AVAUDIO, "avsys_audio_get_shm() failed in %s\n", __func__);
1440 return AVSYS_STATE_ERR_INTERNAL;
1443 if (control == NULL) {
1444 return AVSYS_STATE_ERR_NULL_POINTER;
1447 if (mute == AVSYS_AUDIO_UNMUTE || mute == AVSYS_AUDIO_MUTE) {
1448 if (AVSYS_FAIL(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1449 avsys_error_r(AVAUDIO, "avsys_audio_lock_sync() failed in %s\n", __func__);
1450 return AVSYS_STATE_ERR_INTERNAL;
1453 if (control->mute == mute) {
1454 avsys_info(AVAUDIO, "[Path Mute] skip mute ctrl op: %d\n", mute);
1455 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1456 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() 2 failed in %s\n", __func__);
1457 return AVSYS_STATE_ERR_INTERNAL;
1459 return AVSYS_STATE_SUCCESS;
1461 control->mute = mute;
1462 avsys_warning(AVAUDIO, "[Path Mute] run mute ctrl op: %d\n", mute);
1465 if (control->mute) {
1466 if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_STR_PLAYBACK_MUTE))) {
1467 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1468 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() 1 failed in %s\n", __func__);
1469 return AVSYS_STATE_ERR_INTERNAL;
1471 avsys_error(AVAUDIO, "Mute fail %s\n", __func__);
1472 return AVSYS_STATE_ERR_IO_CONTROL;
1475 if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_STR_PLAYBACK_UNMUTE))) {
1476 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1477 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() 1 failed in %s\n", __func__);
1478 return AVSYS_STATE_ERR_INTERNAL;
1480 avsys_error(AVAUDIO, "Unmute fail %s\n", __func__);
1481 return AVSYS_STATE_ERR_IO_CONTROL;
1485 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1486 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() 2 failed in %s\n", __func__);
1487 return AVSYS_STATE_ERR_INTERNAL;
1491 if (mute == AVSYS_AUDIO_UNMUTE_NOLOCK) /* set nomalize */
1492 mute_nolock = AVSYS_AUDIO_UNMUTE;
1494 mute_nolock = AVSYS_AUDIO_MUTE;
1496 if (control->mute == mute_nolock) {
1497 avsys_info(AVAUDIO, "[Path Mute] skip mute ctrl op: %d\n", mute);
1498 return AVSYS_STATE_SUCCESS;
1500 control->mute = mute_nolock;
1501 avsys_warning(AVAUDIO, "[Path Mute] run mute ctrl op: %d\n", mute);
1504 if (control->mute) {
1505 if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_STR_PLAYBACK_MUTE))) {
1506 avsys_error(AVAUDIO, "Mute fail %s\n", __func__);
1507 return AVSYS_STATE_ERR_IO_CONTROL;
1510 if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_STR_PLAYBACK_UNMUTE))) {
1511 avsys_error(AVAUDIO, "Unmute fail %s\n", __func__);
1512 return AVSYS_STATE_ERR_IO_CONTROL;
1517 if (mute == AVSYS_AUDIO_UNMUTE || mute == AVSYS_AUDIO_UNMUTE_NOLOCK)
1518 avsys_info_r(AVAUDIO, "Global Mute Disabled\n");
1519 else if (mute == AVSYS_AUDIO_MUTE || mute == AVSYS_AUDIO_MUTE_NOLOCK)
1520 avsys_info_r(AVAUDIO, "Global Mute Enabled\n");
1521 return AVSYS_STATE_SUCCESS;
1524 int avsys_audio_path_ex_get_mute(int *mute)
1526 avsys_audio_path_ex_info_t *control = NULL;
1527 avsys_audio_path_ex_info_t **temp = NULL;
1531 if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))) {
1532 avsys_error_r(AVAUDIO, "avsys_audio_get_shm() failed in %s\n", __func__);
1533 return AVSYS_STATE_ERR_INTERNAL;
1536 if (control == NULL) {
1537 return AVSYS_STATE_ERR_NULL_POINTER;
1540 if (AVSYS_FAIL(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1541 avsys_error_r(AVAUDIO, "avsys_audio_lock_sync() failed in %s\n", __func__);
1542 return AVSYS_STATE_ERR_INTERNAL;
1545 *mute = control->mute;
1547 if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) {
1548 avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() failed in %s\n", __func__);
1549 return AVSYS_STATE_ERR_INTERNAL;
1552 return AVSYS_STATE_SUCCESS;
1555 static int __avsys_audio_path_set_ascn_ap_playback(avsys_audio_path_ex_info_t *control)
1557 int cmd_gain[2] = { 0, 0 };
1558 int cmd_path[3] = { 0, 0, 0 };
1559 char callalert_mode = 0;
1561 avsys_info(AVAUDIO, "<< path.playback = %d, option = %x, gain.playback = %d, inserted = %d\n",
1562 control->path.playback, control->option.playback, control->gain.playback, control->inserted);
1564 callalert_mode = (control->gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT) ? 1 : 0;
1565 control->path_fixed = PATH_FIXED_NONE;
1567 switch (control->path.playback) {
1568 case AVSYS_AUDIO_PATH_EX_SPK:
1569 if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_LEGACY_MODE) {
1570 avsys_warning(AVAUDIO, "Does not support legacy mode anymore\n");
1573 if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_DUAL_OUT) {
1574 if (callalert_mode) {
1575 control->gain_status.playback = GS_AP_TO_SPK_CALLALERT;
1576 cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_CALLALERT;
1578 control->gain_status.playback = GS_AP_TO_SPK;
1579 cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE;
1582 if (control->inserted == AVSYS_AUDIO_INSERTED_NONE) {
1583 control->path_status.playback = PS_AP_TO_SPK;
1584 cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK;
1586 control->path_status.playback = PS_AP_TO_SPK | PS_AP_TO_HEADSET;
1587 cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK;
1588 cmd_path[1] = INPUT_AP | OUTPUT_HEADSET;
1590 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1592 if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) {
1593 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE;
1594 if (control->inserted == AVSYS_AUDIO_INSERTED_NONE) {
1595 if (callalert_mode) {
1596 control->gain_status.playback = GS_AP_TO_SPK_CALLALERT;
1597 cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_CALLALERT;
1599 control->gain_status.playback = GS_AP_TO_SPK;
1600 cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE;
1602 control->path_status.playback = PS_AP_TO_SPK;
1603 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1604 cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK;
1606 if (callalert_mode) {
1607 control->gain_status.playback = GS_AP_TO_HEADSET_CALLALERT;
1608 cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_CALLALERT;
1610 control->gain_status.playback = GS_AP_TO_HEADSET;
1611 cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE;
1613 control->path_status.playback = PS_AP_TO_HEADSET;
1614 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
1615 cmd_path[0] = INPUT_AP | OUTPUT_HEADSET;
1618 if (callalert_mode) {
1619 control->gain_status.playback = GS_AP_TO_SPK_CALLALERT;
1620 cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_CALLALERT;
1622 control->gain_status.playback = GS_AP_TO_SPK;
1623 cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE;
1625 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE;
1626 control->path_status.playback = PS_AP_TO_SPK;
1627 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1629 cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK;
1634 case AVSYS_AUDIO_PATH_EX_RECV:
1635 if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_LEGACY_MODE) {
1636 avsys_warning(AVAUDIO, "Does not support legacy mode anymore\n");
1639 if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) {
1640 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE;
1641 if (control->inserted == AVSYS_AUDIO_INSERTED_NONE) {
1642 control->gain_status.playback = GS_AP_TO_RECV;
1643 control->path_status.playback = PS_AP_TO_RECV;
1644 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1645 cmd_gain[0] = INPUT_AP | OUTPUT_RECV | GAIN_MODE;
1646 cmd_path[0] = INPUT_AP | OUTPUT_RECV;
1648 if (callalert_mode) {
1649 control->gain_status.playback = GS_AP_TO_HEADSET_CALLALERT;
1650 cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_CALLALERT;
1652 control->gain_status.playback = GS_AP_TO_HEADSET;
1653 cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE;
1655 control->path_status.playback = PS_AP_TO_HEADSET;
1656 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
1657 cmd_path[0] = INPUT_AP | OUTPUT_HEADSET;
1660 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1661 control->gain_status.playback = GS_AP_TO_RECV;
1662 control->path_status.playback = PS_AP_TO_RECV;
1663 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1664 cmd_gain[0] = INPUT_AP | OUTPUT_RECV | GAIN_MODE;
1665 cmd_path[0] = INPUT_AP | OUTPUT_RECV;
1669 case AVSYS_AUDIO_PATH_EX_HEADSET:
1670 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1671 if (callalert_mode) {
1672 control->gain_status.playback = GS_AP_TO_HEADSET_CALLALERT;
1673 cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_CALLALERT;
1675 control->gain_status.playback = GS_AP_TO_HEADSET;
1676 cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE;
1678 control->path_status.playback = PS_AP_TO_HEADSET;
1679 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
1680 cmd_path[0] = INPUT_AP | OUTPUT_HEADSET;
1683 case AVSYS_AUDIO_PATH_EX_HDMI:
1684 avsys_warning(AVAUDIO, "Does not support dedicated HDMI sound path\n");
1685 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1688 case AVSYS_AUDIO_PATH_EX_BTHEADSET:
1689 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1690 control->gain_status.playback = GS_AP_TO_BT;
1691 control->path_status.playback = PS_AP_TO_BT;
1692 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET;
1693 cmd_gain[0] = INPUT_AP | OUTPUT_BT_HEADSET | GAIN_MODE;
1694 cmd_path[0] = INPUT_AP | OUTPUT_BT_HEADSET;
1696 case AVSYS_AUDIO_PATH_EX_HANDSFREE:
1697 default: /* DEFAULT PATH CONTROL TO NONE */
1698 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1702 //avsys_warning(AVAUDIO,"pg(0x%X), g(0x%X), pp(0x%X), p(0x%X)\n", control->p_gain_status, control->gain_status, control->p_path_status, control->path_status);
1703 if ((control->p_path_status.playback != control->path_status.playback) || control->gain_debug_mode == 1) {
1704 avsys_warning(AVAUDIO, "Run Alsa Scenario Script\n");
1705 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 1, ASCN_RESET_PLAYBACK))
1706 control->p_gain_status.playback = control->gain_status.playback;
1707 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 2, ASCN_RESET_NONE))
1708 control->p_path_status.playback = control->path_status.playback;
1711 avsys_info(AVAUDIO, ">> leave");
1712 return AVSYS_STATE_SUCCESS;
1715 static int __avsys_audio_path_set_ascn_voicecall(avsys_audio_path_ex_info_t *control)
1717 return AVSYS_STATE_SUCCESS;
1720 static int __avsys_audio_path_set_ascn_videocall(avsys_audio_path_ex_info_t *control)
1722 int cmd_gain[2] = { 0, 0 };
1723 int cmd_path[3] = { 0, 0, 0 };
1725 control->path_fixed = PATH_FIXED_WITH_CALL;
1726 switch (control->path.playback) {
1727 case AVSYS_AUDIO_PATH_EX_NONE:
1728 if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_LEGACY_MODE) {
1729 /* Legacy mode does not effect here... */
1730 avsys_warning(AVAUDIO, "legacy mode option %s\n", __func__);
1732 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1733 if (control->reqgain.playback == control->gain.playback) {
1734 avsys_warning(AVAUDIO, "Output block on videocall");
1736 avsys_warning(AVAUDIO, "Ignore another path setting request during voicecall");
1738 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1741 case AVSYS_AUDIO_PATH_EX_SPK:
1742 if (control->reqgain.playback == control->gain.playback) {
1743 if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) {
1744 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE;
1745 if (control->inserted != AVSYS_AUDIO_INSERTED_NONE) {
1746 control->gain_status.playback = GS_AP_TO_HEADSET;
1747 control->path_status.playback = PS_AP_TO_HEADSET;
1748 cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE;
1749 cmd_path[0] = INPUT_AP | OUTPUT_HEADSET;
1750 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
1752 control->gain_status.playback = GS_AP_TO_SPK;
1753 control->path_status.playback = PS_AP_TO_SPK;
1754 cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE;
1755 cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK;
1756 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1758 } else { /* ear jack manual */
1759 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1760 control->gain_status.playback = GS_AP_TO_SPK;
1761 control->path_status.playback = PS_AP_TO_SPK;
1762 cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE;
1763 cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK;
1764 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1766 } else { /* changed by priority */
1767 avsys_warning(AVAUDIO, "Sound Path request during VT call ignored.");
1771 case AVSYS_AUDIO_PATH_EX_RECV:
1772 if (control->gain.playback == control->reqgain.playback) {
1773 if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) {
1774 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE;
1775 if (control->inserted != AVSYS_AUDIO_INSERTED_NONE) {
1776 control->gain_status.playback = GS_AP_TO_HEADSET;
1777 control->path_status.playback = PS_AP_TO_HEADSET;
1778 cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE;
1779 cmd_path[0] = INPUT_AP | OUTPUT_HEADSET;
1780 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
1782 control->gain_status.playback = GS_AP_TO_RECV;
1783 control->path_status.playback = PS_AP_TO_RECV;
1784 cmd_gain[0] = INPUT_AP | OUTPUT_RECV | GAIN_MODE;
1785 cmd_path[0] = INPUT_AP | OUTPUT_RECV;
1786 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1788 } else { /* ear jack manual */
1789 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1790 control->gain_status.playback = GS_AP_TO_RECV;
1791 control->path_status.playback = PS_AP_TO_RECV;
1792 cmd_gain[0] = INPUT_AP | OUTPUT_RECV | GAIN_MODE;
1793 cmd_path[0] = INPUT_AP | OUTPUT_RECV;
1794 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1796 } else { /* changed by priority */
1797 avsys_warning(AVAUDIO, "Sound Path request during VT call ignored.");
1798 } /* reqgain, gain */
1801 case AVSYS_AUDIO_PATH_EX_HEADSET:
1802 if (control->reqgain.playback == control->gain.playback) {
1803 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1804 control->gain_status.playback = GS_AP_TO_HEADSET;
1805 control->path_status.playback = PS_AP_TO_HEADSET;
1806 cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE;
1807 cmd_path[0] = INPUT_AP | OUTPUT_HEADSET;
1808 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
1810 avsys_warning(AVAUDIO, "Sound Path request during VT call ignored.");
1814 case AVSYS_AUDIO_PATH_EX_BTHEADSET:
1815 if (control->reqgain.playback == control->gain.playback) {
1816 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1817 control->gain_status.playback = GS_AP_TO_BT;
1818 control->path_status.playback = PS_AP_TO_BT;
1819 cmd_gain[0] = INPUT_AP | OUTPUT_BT_HEADSET | GAIN_MODE;
1820 cmd_path[0] = INPUT_AP | OUTPUT_BT_HEADSET;
1821 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET;
1823 avsys_warning(AVAUDIO, "Sound Path request during VT call ignored.");
1827 case AVSYS_AUDIO_PATH_EX_HANDSFREE:
1829 if (control->reqgain.playback == control->gain.playback) {
1830 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1835 switch (control->path.capture) {
1836 case AVSYS_AUDIO_PATH_EX_NONE:
1837 if (control->reqgain.capture == control->gain.capture) {
1838 /* Clear modem input */
1839 control->path_status.capture &= ~(PS_MAINMIC_TO_AP | PS_SUBMIC_TO_AP | PS_EARMIC_TO_AP | PS_BTMIC_TO_AP);
1841 avsys_warning(AVAUDIO, "Ignore another path setting request during VT call (input)\n");
1845 case AVSYS_AUDIO_PATH_EX_MIC:
1846 if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) {
1847 if ((control->inserted == AVSYS_AUDIO_INSERTED_4) && (control->path_status.playback & PS_AP_TO_HEADSET)) {
1848 control->gain_status.capture |= GS_EARMIC_TO_AP;
1849 control->path_status.capture |= PS_EARMIC_TO_AP;
1850 cmd_gain[1] = INPUT_EAR_MIC | OUTPUT_AP | GAIN_MODE;
1851 cmd_path[1] = INPUT_EAR_MIC | OUTPUT_AP;
1853 if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) {
1854 control->gain_status.capture |= GS_SUBMIC_TO_AP;
1855 control->path_status.capture |= PS_SUBMIC_TO_AP;
1856 cmd_gain[1] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE;
1857 cmd_path[1] = INPUT_SUB_MIC | OUTPUT_AP;
1859 control->gain_status.capture |= GS_MAINMIC_TO_AP;
1860 control->path_status.capture |= PS_MAINMIC_TO_AP;
1861 cmd_gain[1] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE;
1862 cmd_path[1] = INPUT_MAIN_MIC | OUTPUT_AP;
1866 if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) {
1867 control->gain_status.capture |= GS_SUBMIC_TO_AP;
1868 control->path_status.capture |= PS_SUBMIC_TO_AP;
1869 cmd_gain[1] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE;
1870 cmd_path[1] = INPUT_SUB_MIC | OUTPUT_AP;
1872 control->gain_status.capture |= GS_MAINMIC_TO_AP;
1873 control->path_status.capture |= PS_MAINMIC_TO_AP;
1874 cmd_gain[1] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE;
1875 cmd_path[1] = INPUT_MAIN_MIC | OUTPUT_AP;
1880 case AVSYS_AUDIO_PATH_EX_HEADSETMIC:
1881 control->gain_status.capture |= GS_EARMIC_TO_AP;
1882 control->path_status.capture |= PS_EARMIC_TO_AP;
1883 cmd_gain[1] = INPUT_EAR_MIC | OUTPUT_AP | GAIN_MODE;
1884 cmd_path[1] = INPUT_EAR_MIC | OUTPUT_AP;
1887 case AVSYS_AUDIO_PATH_EX_BTMIC:
1888 control->gain_status.capture |= GS_BTMIC_TO_AP;
1889 control->path_status.capture |= PS_BTMIC_TO_AP;
1890 cmd_gain[1] = INPUT_BT_MIC | OUTPUT_AP | GAIN_MODE;
1891 cmd_path[1] = INPUT_BT_MIC | OUTPUT_AP;
1894 case AVSYS_AUDIO_PATH_EX_HANDSFREE:
1899 if((control->p_path_status.playback != control->path_status.playback)
1900 || ((control->p_path_status.capture != control->path_status.capture)) || control->gain_debug_mode == 1) {
1902 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET))
1904 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 2, ASCN_RESET_NONE))
1905 control->p_gain_status = control->gain_status; /* both playback and capture */
1906 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 2, ASCN_RESET_NONE))
1907 control->p_path_status = control->path_status; /* both playback and capture */
1910 return AVSYS_STATE_SUCCESS;
1914 static int __avsys_audio_path_set_ascn_fmradio(avsys_audio_path_ex_info_t *control)
1916 int cmd_gain[2] = { 0, 0 };
1917 int cmd_path[3] = { 0, 0, 0 };
1919 int skip_clear_record = 0;
1922 control->path_fixed = PATH_FIXED_WITH_FMRADIO;
1923 switch (control->path.playback) {
1924 case AVSYS_AUDIO_PATH_EX_NONE:
1925 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1926 control->gain_status.playback = GS_FMRADIO_TO_SPK;
1927 control->path_status.playback = PS_PATH_NONE;
1928 cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK | GAIN_MODE;
1931 case AVSYS_AUDIO_PATH_EX_SPK:
1932 if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) {
1933 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE;
1934 if (control->reqgain.playback == control->gain.playback) {
1935 if (control->inserted != AVSYS_AUDIO_INSERTED_NONE) {
1936 control->gain_status.playback = GS_FMRADIO_TO_HEADSET;
1937 control->path_status.playback = PS_FMRADIO_TO_HEADSET;
1938 cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_HEADSET | GAIN_MODE;
1939 cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_HEADSET;
1940 cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET;
1942 control->gain_status.playback = GS_FMRADIO_TO_SPK;
1943 control->path_status.playback = PS_FMRADIO_TO_SPK;
1944 cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK | GAIN_MODE;
1945 cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK;
1946 cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK;
1949 /* append ap playback sound path */
1950 control->path_status.playback = control->p_path_status.playback;
1951 if (control->inserted != AVSYS_AUDIO_INSERTED_NONE) {
1952 control->path_status.playback |= PS_AP_TO_HEADSET;
1953 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
1954 cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET;
1956 control->path_status.playback |= PS_AP_TO_SPK;
1957 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1958 cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK;
1962 } else { /* ear jack manual */
1963 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1964 if (control->reqgain.playback == control->gain.playback) {
1965 control->gain_status.playback = GS_FMRADIO_TO_SPK;
1966 control->path_status.playback = PS_FMRADIO_TO_SPK;
1967 cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK | GAIN_MODE;
1968 cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK;
1969 cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK;
1971 /* append ap playback sound path */
1972 control->path_status.playback = control->p_path_status.playback;
1973 control->path_status.playback |= PS_AP_TO_SPK;
1974 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
1975 cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK;
1981 case AVSYS_AUDIO_PATH_EX_HEADSET:
1982 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
1983 if (control->reqgain.playback == control->gain.playback) {
1984 control->gain_status.playback = GS_FMRADIO_TO_HEADSET;
1985 control->path_status.playback = PS_FMRADIO_TO_HEADSET;
1986 cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_HEADSET | GAIN_MODE;
1987 cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_HEADSET;
1988 cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET;
1990 /* append ap playback */
1991 control->path_status.playback = control->p_path_status.playback;
1992 control->path_status.playback |= PS_AP_TO_HEADSET;
1993 control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET;
1994 cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET;
2002 switch (control->path.capture) {
2003 case AVSYS_AUDIO_PATH_EX_FMINPUT:
2004 if (control->reqgain.capture == control->gain.capture) {
2005 control->path_status.capture |= PS_FMRADIO_TO_AP;
2006 cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_AP;
2007 if (control->reqgain.capture == control->pregain.capture) {
2008 skip_clear_record = 1;
2016 if((control->p_path_status.playback != control->path_status.playback)
2017 || (control->p_path_status.capture != control->path_status.capture) || control->gain_debug_mode == 1) {
2018 if (skip_clear_record) {
2019 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET_PLAYBACK))
2020 } else if (!skip_clear) {
2021 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET))
2023 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, gain_idx, ASCN_RESET_NONE))
2024 control->p_gain_status = control->gain_status; /* both playback & capture */
2025 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, path_idx, ASCN_RESET_NONE))
2026 control->p_path_status = control->path_status; /* both playback & capture */
2029 return AVSYS_STATE_SUCCESS;
2032 static int __avsys_audio_path_set_ascn_ap_capture(avsys_audio_path_ex_info_t *control)
2034 int cmd_gain[2] = { 0, 0 };
2035 int cmd_path[3] = { 0, 0, 0 };
2037 avsys_info(AVAUDIO, "<< path.capture = %d, option = %x, gain.capture = %d, inserted = %d\n",
2038 control->path.capture, control->option.capture, control->gain.capture, control->inserted);
2039 switch(control->path.capture) {
2040 case AVSYS_AUDIO_PATH_EX_MIC:
2041 if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) {
2042 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE;
2043 if (control->inserted == AVSYS_AUDIO_INSERTED_4) {
2044 control->gain_status.capture = GS_EARMIC_TO_AP;
2045 control->path_status.capture = PS_EARMIC_TO_AP;
2046 cmd_gain[0] = INPUT_EAR_MIC | OUTPUT_AP | GAIN_MODE;
2047 cmd_path[0] = INPUT_EAR_MIC | OUTPUT_AP;
2049 if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) {
2050 control->gain_status.capture = GS_SUBMIC_TO_AP;
2051 control->path_status.capture = PS_SUBMIC_TO_AP;
2052 cmd_gain[0] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE;
2053 cmd_path[0] = INPUT_SUB_MIC | OUTPUT_AP;
2054 } else if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_STEREOMIC) {
2055 control->gain_status.capture = GS_STEREOMIC_TO_AP;
2056 control->path_status.capture = PS_STEREOMIC_TO_AP;
2057 cmd_gain[0] = INPUT_STEREO_MIC | OUTPUT_AP | GAIN_MODE;
2058 cmd_path[0] = INPUT_STEREO_MIC | OUTPUT_AP;
2060 control->gain_status.capture = GS_MAINMIC_TO_AP;
2061 control->path_status.capture = PS_MAINMIC_TO_AP;
2062 cmd_gain[0] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE;
2063 cmd_path[0] = INPUT_MAIN_MIC | OUTPUT_AP;
2067 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE;
2068 if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) {
2069 control->gain_status.capture = GS_SUBMIC_TO_AP;
2070 control->path_status.capture = PS_SUBMIC_TO_AP;
2071 cmd_gain[0] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE;
2072 cmd_path[0] = INPUT_SUB_MIC | OUTPUT_AP;
2073 } else if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_STEREOMIC) {
2074 control->gain_status.capture = GS_STEREOMIC_TO_AP;
2075 control->path_status.capture = PS_STEREOMIC_TO_AP;
2076 cmd_gain[0] = INPUT_STEREO_MIC | OUTPUT_AP | GAIN_MODE;
2077 cmd_path[0] = INPUT_STEREO_MIC | OUTPUT_AP;
2079 control->gain_status.capture = GS_MAINMIC_TO_AP;
2080 control->path_status.capture = PS_MAINMIC_TO_AP;
2081 cmd_gain[0] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE;
2082 cmd_path[0] = INPUT_MAIN_MIC | OUTPUT_AP;
2087 case AVSYS_AUDIO_PATH_EX_HEADSETMIC:
2088 control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL;
2089 control->gain_status.capture = GS_EARMIC_TO_AP;
2090 control->path_status.capture = PS_EARMIC_TO_AP;
2091 cmd_gain[0] = INPUT_EAR_MIC | OUTPUT_AP | GAIN_MODE;
2092 cmd_path[0] = INPUT_EAR_MIC | OUTPUT_AP;
2099 if ((control->p_path_status.capture != control->path_status.capture) || control->gain_debug_mode == 1) {
2100 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 2, ASCN_RESET_CAPTURE))
2101 control->p_gain_status.capture = control->gain_status.capture;
2102 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 2, ASCN_RESET_NONE))
2103 control->p_path_status.capture = control->path_status.capture;
2106 avsys_info (AVAUDIO, ">> leave");
2108 return AVSYS_STATE_SUCCESS;
2112 static int __avsys_audio_path_set_hw_controls(avsys_audio_path_ex_info_t *control)
2114 avsys_audio_handle_info_t *handle_control = NULL;
2115 avsys_audio_handle_info_t **temp = NULL;
2116 int ret = AVSYS_STATE_SUCCESS;
2117 avsys_info(AVAUDIO, "global mute %d\n", control->mute);
2118 avsys_info(AVAUDIO, "path_fixed mute %d\n", control->path_fixed);
2120 /* update logical volume table - about output device - information for open handles */
2121 avsys_info(AVAUDIO, "Control handle informations\n");
2123 avsys_audio_handle_t *ptr = NULL;
2125 int out_device = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
2127 temp = &handle_control;
2128 if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_HANDLE, (void**)temp))) {
2129 avsys_error(AVAUDIO, "avsys_audio_get_shm() failed in %s\n",__func__);
2130 return AVSYS_STATE_ERR_INTERNAL;
2133 if (AVSYS_FAIL(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_HANDLE))) {
2134 avsys_error(AVAUDIO, "avsys_audio_lock_sync() failed in %s\n",__func__);
2135 return AVSYS_STATE_ERR_INTERNAL;
2138 while (++handle < AVSYS_AUDIO_HANDLE_MAX) {
2139 long long int flag = 0x01;
2142 if (handle_control->allocated & flag)
2144 ptr = &(handle_control->handles[handle]);
2146 if (ptr->mode != AVSYS_AUDIO_MODE_OUTPUT && ptr->mode != AVSYS_AUDIO_MODE_OUTPUT_CLOCK
2147 && ptr->mode != AVSYS_AUDIO_MODE_OUTPUT_LOW_LATENCY && ptr->mode != AVSYS_AUDIO_MODE_OUTPUT_AP_CALL) {
2151 out_device = control->lvol_dev_type;
2152 if (control->path_status.playback == PS_PATH_NONE) {
2154 avsys_warning(AVAUDIO, "Path off status...set logical volume device type to speaker\n");
2155 out_device = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
2157 avsys_audio_logical_volume_update_table(out_device, &ptr->gain_setting);
2158 avsys_audio_logical_volume_convert(&ptr->setting_vol, &ptr->working_vol, &ptr->gain_setting);
2162 if(AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_HANDLE))) {
2163 avsys_error(AVAUDIO,"avsys_audio_unlock_sync() failed in %s\n",__func__);
2164 return AVSYS_STATE_ERR_INTERNAL;
2167 return AVSYS_STATE_SUCCESS;
2170 static bool __avsys_audio_path_check_cp_audio(int gain)
2172 /*If video call uses CP audio, add AVSYS_AUDIO_GAIN_EX_VIDEOCALL to following code. */
2173 if (gain == AVSYS_AUDIO_GAIN_EX_VOICECALL)
2179 int avsys_audio_path_set_volume(int handle)
2181 avsys_audio_path_ex_info_t *control = NULL;
2182 avsys_audio_path_ex_info_t **temp = NULL;
2183 avsys_audio_handle_t *ptr = NULL;
2186 int out_device = AVSYS_AUDIO_DEVICE_TYPE_SPK;
2188 err = avsys_audio_handle_get_ptr(handle, &ptr, HANDLE_PTR_MODE_NORMAL);
2189 if (AVSYS_FAIL(err)) {
2190 avsys_error(AVAUDIO, "Handle is not allocated\n");
2191 avsys_audio_handle_release_ptr(handle, HANDLE_PTR_MODE_NORMAL);
2192 return AVSYS_STATE_ERR_INVALID_PARAMETER;
2196 avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp)));
2197 avsys_assert(control != NULL);
2198 avsys_assert(AVSYS_SUCCESS(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2200 if (__avsys_audio_path_check_cp_audio(control->gain.playback))
2201 ptr->during_cp_audio = 1;
2203 ptr->during_cp_audio = 0;
2205 gain_type = ptr->gain_setting.vol_type;
2206 out_device = control->lvol_dev_type;
2207 if (control->path_status.playback == PS_PATH_NONE) {
2209 avsys_warning(AVAUDIO, "Path off status...set logical volume device type to speaker\n");
2210 out_device = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK;
2212 avsys_assert(AVSYS_SUCCESS(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2213 avsys_warning(AVAUDIO, "set path volume : gain(%d), out_dev(%d)\n", gain_type, out_device);
2214 err = avsys_audio_logical_volume_set_table(gain_type, out_device, &ptr->gain_setting);
2215 avsys_audio_handle_release_ptr(handle, HANDLE_PTR_MODE_NORMAL);
2219 int avsys_audio_path_set_route_policy(avsys_audio_route_policy_t route)
2221 avsys_audio_path_ex_info_t *control = NULL;
2222 avsys_audio_path_ex_info_t **temp = NULL;
2223 int err = AVSYS_STATE_SUCCESS;
2226 avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp)));
2227 avsys_assert(control != NULL);
2228 avsys_assert(AVSYS_SUCCESS(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2230 control->route_policy = route;
2232 avsys_assert(AVSYS_SUCCESS(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2236 int avsys_audio_path_get_route_policy(avsys_audio_route_policy_t *route)
2238 avsys_audio_path_ex_info_t *control = NULL;
2239 avsys_audio_path_ex_info_t **temp = NULL;
2240 int err = AVSYS_STATE_SUCCESS;
2243 return AVSYS_STATE_ERR_INVALID_PARAMETER;
2246 avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp)));
2247 avsys_assert(control != NULL);
2248 avsys_assert(AVSYS_SUCCESS(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2250 *route = control->route_policy;
2252 avsys_assert(AVSYS_SUCCESS(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2256 int avsys_audio_path_check_loud(bool *loud)
2258 avsys_audio_path_ex_info_t *control = NULL;
2259 avsys_audio_path_ex_info_t **temp = NULL;
2260 int err = AVSYS_STATE_SUCCESS;
2263 return AVSYS_STATE_ERR_INVALID_PARAMETER;
2266 avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp)));
2267 avsys_assert(control != NULL);
2268 avsys_assert(AVSYS_SUCCESS(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2270 if ((control->path_status.playback & PS_AP_TO_SPK) ||
2271 (control->path_status.playback & PS_AP_TO_RECV) ||
2272 (control->path_status.playback & PS_FMRADIO_TO_SPK)) {
2275 avsys_info(AVAUDIO, "playback path status 0x%x\n", control->path_status.playback);
2279 avsys_assert(AVSYS_SUCCESS(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2283 int avsys_audio_path_check_cp_audio(bool *cpaudio, bool *btpath)
2285 avsys_audio_path_ex_info_t *control = NULL;
2286 avsys_audio_path_ex_info_t **temp = NULL;
2288 if (!cpaudio || !btpath)
2289 return AVSYS_STATE_ERR_INVALID_PARAMETER;
2292 avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp)));
2293 avsys_assert(control != NULL);
2294 avsys_assert(AVSYS_SUCCESS(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2296 if (__avsys_audio_path_check_cp_audio(control->gain.playback))
2301 if (control->path.playback == AVSYS_AUDIO_PATH_EX_BTHEADSET)
2306 avsys_assert(AVSYS_SUCCESS(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH)));
2307 return AVSYS_STATE_SUCCESS;
2310 int avsys_audio_path_set_single_ascn(char *str)
2313 return AVSYS_STATE_ERR_INVALID_PARAMETER;
2315 RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(str))
2317 return AVSYS_STATE_SUCCESS;