From 785814c493c819a9f94a083a69ad42a63f221386 Mon Sep 17 00:00:00 2001 From: Jinkun Jang Date: Wed, 13 Mar 2013 01:48:53 +0900 Subject: Tizen 2.1 base --- avsys-audio-path.c | 1144 +++++++++++++++++++++++----------------------------- 1 file changed, 494 insertions(+), 650 deletions(-) (limited to 'avsys-audio-path.c') diff --git a/avsys-audio-path.c b/avsys-audio-path.c index 7967842..7b37ae2 100644 --- a/avsys-audio-path.c +++ b/avsys-audio-path.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include "avsys-audio-shm.h" #include "avsys-audio-sync.h" @@ -46,28 +48,26 @@ return AVSYS_STATE_ERR_IO_CONTROL; \ } } -#define OPEN_AIF_BEFORE_SCENARIO_SET - static int g_playback_path_select_data[AVSYS_AUDIO_PLAYBACK_GAIN_MAX][AVSYS_AUDIO_PATH_EX_OUTMAX] = { { /* AVSYS_AUDIO_PLAYBACK_GAIN_AP */ - /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */ - 0, 1, 0, 1, 0, 0, 0, 0 + /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI DOCK USBAUDIO */ + 0, 1, 0, 1, 0, 0, 0, 1, 1, 0 }, { /* AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO */ /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */ - 1, 1, 0, 1, 0, 0, 0, 0 + 1, 1, 0, 1, 0, 1, 0, 0, 0, 0 }, { /* AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL */ /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */ - 1, 1, 1, 1, 1, 0, 0, 0 + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }, { /* AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL */ /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */ - 1, 1, 1, 1, 1, 0, 0, 0 + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }, { /* AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT */ /* NONE SPK RECV HEADSET BTHEADSET A2DP HANDSFREE HDMI */ - 0, 1, 1, 1, 1, 0, 0, 0 + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 } }; @@ -161,32 +161,22 @@ static int __avsys_audio_path_set_ascn_voicecall(avsys_audio_path_ex_info_t *con static int __avsys_audio_path_set_ascn_videocall(avsys_audio_path_ex_info_t *control); static int __avsys_audio_path_set_ascn_fmradio(avsys_audio_path_ex_info_t *control); static int __avsys_audio_path_set_ascn_ap_capture(avsys_audio_path_ex_info_t *control); - - -typedef int (*_internal_gain_func)(avsys_audio_path_ex_info_t *control); -static _internal_gain_func playback_gain_func_table[AVSYS_AUDIO_PLAYBACK_GAIN_MAX] = -{ - __avsys_audio_path_set_ascn_ap_playback, - __avsys_audio_path_set_ascn_fmradio, - __avsys_audio_path_set_ascn_voicecall, - __avsys_audio_path_set_ascn_videocall, - __avsys_audio_path_set_ascn_ap_playback, -}; - -static _internal_gain_func capture_gain_func_table[AVSYS_AUDIO_CAPTURE_GAIN_MAX] = -{ - __avsys_audio_path_set_ascn_ap_capture, - __avsys_audio_path_set_ascn_fmradio, - __avsys_audio_path_set_ascn_voicecall, - __avsys_audio_path_set_ascn_videocall, -}; - static int __avsys_audio_path_set_hw_controls(avsys_audio_path_ex_info_t *control); static int __avsys_audio_path_get_earjack_type(void); #define AUDIOSYSTEM_CONF "/opt/etc/audio_system.conf" #define CONF_ITEM_COUNT 2 #define INPUT_DEV_MAX 20 + +#define EARJACK_EVENT_PATH "/dev/input/event" + +#define AVSYS_AUDIO_INI_DEFAULT_PATH "/usr/etc/mmfw_avsystem.ini" +#define AVSYS_AUDIO_DEFAULT_CONTROL_AIF_BEFORE_PATH_SET 0 +#define AVSYS_AUDIO_DEFAULT_GAIN_DEBUG_MODE 0 + +#define CP_STATUS "/sys/class/audio/caps/cp_caps" +#define CP_WB_STRING "wb" + static char *conf_string[] = { "headset_detection", "headset_node", @@ -195,10 +185,14 @@ static char *conf_string[] = { typedef struct { char headset_detection; char headset_node_number; -} AudioSystemConf; + bool control_aif_before_path_set; + bool gain_debug_mode; +} avsys_audio_conf; -static int __load_conf(AudioSystemConf *data) +static int __load_conf(avsys_audio_conf *data) { + dictionary *dict = NULL; + #if defined(_MMFW_I386_ALL_SIMULATOR) if (data == NULL) return AVSYS_STATE_ERR_NULL_POINTER; @@ -279,9 +273,46 @@ static int __load_conf(AudioSystemConf *data) data->headset_detection = conf_data[0]; data->headset_node_number = conf_data[1]; #endif + + /* first, try to load existing ini file */ + dict = iniparser_load(AVSYS_AUDIO_INI_DEFAULT_PATH); + if (dict) { /* if dict is available */ + data->control_aif_before_path_set = iniparser_getboolean(dict, "aif:control aif before path set", AVSYS_AUDIO_DEFAULT_CONTROL_AIF_BEFORE_PATH_SET); + data->gain_debug_mode = iniparser_getboolean(dict, "debug:gain debug mode", AVSYS_AUDIO_DEFAULT_GAIN_DEBUG_MODE); + + /* free dict as we got our own structure */ + iniparser_freedict (dict); + } else { /* if no file exists. create one with set of default values */ + data->control_aif_before_path_set = AVSYS_AUDIO_DEFAULT_CONTROL_AIF_BEFORE_PATH_SET; + data->gain_debug_mode = AVSYS_AUDIO_DEFAULT_GAIN_DEBUG_MODE; + } + return AVSYS_STATE_SUCCESS; } +static bool __is_cp_wb () +{ + bool ret = false; + char str[10] = { 0, }; + FILE* fp = NULL; + + avsys_info(AVAUDIO, "Checking [%s] for WB capability...\n", CP_STATUS); + fp = fopen (CP_STATUS, "r"); + if (fp) { + if (fgets (str, sizeof(str)-1, fp)) { + if (strstr (str, CP_WB_STRING)) { + ret = true; + } + } + fclose(fp); + } else { + avsys_warning (AVAUDIO, "failed to open [%s]...errno=[%d]\n", CP_STATUS, errno); + } + + avsys_info(AVAUDIO, "Result [%d] : [%s] capability!!!\n", ret, (ret)? "WB" : "NB"); + return ret; +} + EXPORT_API int avsys_audio_path_ex_init(void) { @@ -289,12 +320,10 @@ int avsys_audio_path_ex_init(void) avsys_audio_path_ex_info_t **temp = NULL; gain_info_t default_gain = { AVSYS_AUDIO_PLAYBACK_GAIN_AP, AVSYS_AUDIO_CAPTURE_GAIN_AP }; path_info_t default_path = { AVSYS_AUDIO_PATH_EX_SPK, AVSYS_AUDIO_PATH_EX_MIC }; - gain_status_t clean_gain_status = { GS_GAIN_NONE, GS_GAIN_NONE }; - path_status_t clean_path_status = { PS_PATH_NONE, PS_PATH_NONE }; - option_info_t default_option = { AVSYS_AUDIO_PATH_OPTION_JACK_AUTO, AVSYS_AUDIO_PATH_OPTION_JACK_AUTO }; + option_info_t default_option = { AVSYS_AUDIO_PATH_OPTION_NONE, AVSYS_AUDIO_PATH_OPTION_NONE }; int index = 0; int err = AVSYS_STATE_SUCCESS; - AudioSystemConf conf = { 1, 4 }; + avsys_audio_conf conf = { 0, }; /* Check root user */ err = avsys_check_root_privilege(); @@ -304,7 +333,6 @@ int avsys_audio_path_ex_init(void) temp = &control; avsys_assert(AVSYS_SUCCESS(avsys_audio_create_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))); - avsys_assert(AVSYS_SUCCESS(avsys_audio_create_sync(AVSYS_AUDIO_SYNC_IDEN_SOUNDPATH))); /* for audio route policy */ avsys_assert(AVSYS_SUCCESS(avsys_audio_create_shm(AVSYS_AUDIO_SHM_IDEN_PATH))); avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))); @@ -319,14 +347,10 @@ int avsys_audio_path_ex_init(void) control->backup_gain = default_gain; control->backup_path = default_path; control->option = default_option; - control->gain_status = clean_gain_status; - control->path_status = clean_path_status; - control->p_gain_status = clean_gain_status; - control->p_path_status = clean_path_status; control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; control->inserted = AVSYS_AUDIO_INSERTED_NONE; - control->route_policy = AVSYS_AUDIO_ROUTE_POLICY_DEFAULT; + if (AVSYS_FAIL(__load_conf(&conf))) avsys_error_r(AVAUDIO, "Can not load audio system configuration file\n"); @@ -344,29 +368,10 @@ int avsys_audio_path_ex_init(void) avsys_error_r(AVAUDIO, "Earjack init value is %d\n", control->inserted); - { - /* Gain tunning Debug mode */ - FILE *gainTunningFp = NULL; - if (NULL != (gainTunningFp = fopen("/opt/etc/gain_tuner.ini", "r"))) { - char buffer[32] = ""; - avsys_warning(AVAUDIO, "GAIN TUNNING DEBUG MODE...This degrade sound path performance\n"); - memset(buffer, '\0', sizeof(buffer)); - if (NULL == fgets(buffer, sizeof(buffer) - 1, gainTunningFp)) { - fclose(gainTunningFp); - control->gain_debug_mode = 0; - } else { - fclose(gainTunningFp); - if (0 == strncmp("debug=1", buffer, 7)) { - control->gain_debug_mode = 1; - } else { - control->gain_debug_mode = 0; - } - } - } else { - control->gain_debug_mode = 0; - } - } - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; + control->control_aif_before_path_set = conf.control_aif_before_path_set; + control->wb_enabled = __is_cp_wb(); + control->gain_debug_mode = conf.gain_debug_mode; + control->mute = AVSYS_AUDIO_UNMUTE; control->path_fixed = PATH_FIXED_NONE; @@ -414,13 +419,11 @@ int avsys_audio_path_ex_reset(int forced) avsys_audio_path_ex_info_t **temp = NULL; gain_info_t default_gain = { AVSYS_AUDIO_PLAYBACK_GAIN_AP, AVSYS_AUDIO_CAPTURE_GAIN_AP }; path_info_t default_path = { AVSYS_AUDIO_PATH_EX_SPK, AVSYS_AUDIO_PATH_EX_MIC }; - gain_status_t clean_gain_status = { GS_GAIN_NONE, GS_GAIN_NONE }; - path_status_t clean_path_status = { PS_PATH_NONE, PS_PATH_NONE }; - option_info_t default_option = { AVSYS_AUDIO_PATH_OPTION_JACK_AUTO, AVSYS_AUDIO_PATH_OPTION_JACK_AUTO }; + option_info_t default_option = { AVSYS_AUDIO_PATH_OPTION_NONE, AVSYS_AUDIO_PATH_OPTION_NONE }; int index = 0; int err = AVSYS_STATE_SUCCESS; int backup_debug = 0; - AudioSystemConf conf = { 1, 4 }; + avsys_audio_conf conf = { 0, }; /* Check root user */ err = avsys_check_root_privilege(); @@ -449,14 +452,10 @@ int avsys_audio_path_ex_reset(int forced) control->backup_gain = default_gain; control->backup_path = default_path; control->option = default_option; - control->gain_status = clean_gain_status; - control->path_status = clean_path_status; - control->p_gain_status = clean_gain_status; - control->p_path_status = clean_path_status; control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; control->inserted = AVSYS_AUDIO_INSERTED_NONE; - control->route_policy = AVSYS_AUDIO_ROUTE_POLICY_DEFAULT; + if (AVSYS_FAIL(__load_conf(&conf))) avsys_error_r(AVAUDIO, "Can not load audio system configuration file\n"); @@ -464,8 +463,13 @@ int avsys_audio_path_ex_reset(int forced) control->inserted = __avsys_audio_path_get_earjack_type(); if (control->inserted == AVSYS_AUDIO_INSERTED_NONE) control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - else + else { control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET; + control->path.playback = AVSYS_AUDIO_PATH_EX_HEADSET; + + if (control->inserted == AVSYS_AUDIO_INSERTED_4) + control->path.capture = AVSYS_AUDIO_PATH_EX_HEADSETMIC; + } } else { avsys_warning(AVAUDIO, "Ignore headset detection. Use speaker device\n"); control->inserted = AVSYS_AUDIO_INSERTED_NONE; @@ -474,29 +478,9 @@ int avsys_audio_path_ex_reset(int forced) avsys_error_r(AVAUDIO, "Earjack init value is %d\n", control->inserted); - { - /* Gain tunning Debug mode */ - FILE *gainTunningFp = NULL; - if (NULL != (gainTunningFp = fopen("/opt/etc/gain_tuner.ini", "r"))) { - char buffer[32] = ""; - avsys_warning(AVAUDIO, "GAIN TUNNING DEBUG MODE...This degrade sound path performance\n"); - memset(buffer, '\0', sizeof(buffer)); - if (NULL == fgets(buffer, sizeof(buffer) - 1, gainTunningFp)) { - fclose(gainTunningFp); - control->gain_debug_mode = 0; - } else { - fclose(gainTunningFp); - if (0 == strncmp("debug=1", buffer, 7)) { - control->gain_debug_mode = 1; - } else { - control->gain_debug_mode = 0; - } - } - } else { - control->gain_debug_mode = 0; - } - } - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; + control->control_aif_before_path_set = conf.control_aif_before_path_set; + control->gain_debug_mode = conf.gain_debug_mode; + control->mute = AVSYS_AUDIO_UNMUTE; control->path_fixed = PATH_FIXED_NONE; @@ -545,7 +529,7 @@ int avsys_audio_path_ex_dump(void) const static char *str_yn[] = { "NO", "YES" }; const static char *str_ear[] = { "MANUAL", "AUTO_MUTE", "AUTO_NOMUTE" }; const static char *str_out[AVSYS_AUDIO_PATH_EX_OUTMAX] = { - "NONE", "SPK", "RECV", "HEADSET", "BTHEADSET", "A2DP", "HANSFREE" + "NONE", "SPK", "RECV", "HEADSET", "BTHEADSET", "A2DP", "HANSFREE", "HDMI", "DOCK", "USBAUDIO" }; const static char *str_in[AVSYS_AUDIO_PATH_EX_INMAX] = { "NONE", "MIC", "HEADMIC", "BTMIC", "FMINPUT", "HANSFREEMIC" @@ -589,10 +573,7 @@ int avsys_audio_path_ex_dump(void) str_playback_gain[control->gain.playback], str_capture_gain[control->gain.capture]); fprintf(stdout, " Current Out / In : %-s / %-s\n", str_out[control->path.playback], str_in[control->path.capture] ); fprintf(stdout, " Gain debug mode : 0x%-x\n", control->gain_debug_mode); - fprintf(stdout, " Gain status : 0x%x 0x%x\n", control->gain_status.playback, control->gain_status.capture); - fprintf(stdout, " Path status : 0x%x 0x%x\n", control->path_status.playback, control->path_status.capture); fprintf(stdout, " Auto EarJack Control : %-s\n", str_ear[control->ear_auto]); - fprintf(stdout, " Audio Route Policy : %-s\n", str_route[control->route_policy]); fprintf(stdout, " Physical Earjack? [type] : %-s [%-s]\n", str_yn[control->inserted != AVSYS_AUDIO_INSERTED_NONE], str_earType[control->inserted]); fprintf(stdout, " Path Fixed State : 0x%-x\n", control->path_fixed); fprintf(stdout, " Mute status : %d\n", control->mute); @@ -607,9 +588,6 @@ int avsys_audio_path_ex_dump(void) fprintf(stdout, " Path sync lock required PIDs : %d\n", control->pathlock_pid[index]); index++; } while (index < AVSYS_AUDIO_LOCK_SLOT_MAX); - fprintf(stdout, " Option Lagacy : %-s\n", str_yn[(control->option.playback & AVSYS_AUDIO_PATH_OPTION_LEGACY_MODE) ? 1 : 0]); - fprintf(stdout, " Option Jack Playback : %-s\n", str_yn[(control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) ? 1 : 0]); - fprintf(stdout, " Option Jack Capture : %-s\n", str_yn[(control->option.capture & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) ? 1 : 0]); fprintf(stdout, " Option Dual out : %-s\n", str_yn[(control->option.playback & AVSYS_AUDIO_PATH_OPTION_DUAL_OUT) ? 1 : 0]); fprintf(stdout, " Option Forced : %-s\n", str_yn[(control->option.playback & AVSYS_AUDIO_PATH_OPTION_FORCED) ? 1 : 0]); @@ -668,7 +646,7 @@ int avsys_audio_path_earjack_init(int *init_type, int *outfd) #if !defined(_MMFW_I386_ALL_SIMULATOR) char eventnode_filename[32] = { 0, }; int fd = 0; - AudioSystemConf conf = { 1, 4 }; + avsys_audio_conf conf = { 0, }; if (outfd == NULL || init_type == NULL) { avsys_error(AVAUDIO, "input parameter is null\n"); @@ -681,10 +659,10 @@ int avsys_audio_path_earjack_init(int *init_type, int *outfd) if (!conf.headset_detection) { avsys_error(AVAUDIO, "Earjack control daemon will be closed by user option...\n"); - return AVSYS_STATE_SUCCESS; + return AVSYS_STATE_ERR_DEVICE_NOT_SUPPORT; } - snprintf(eventnode_filename, sizeof(eventnode_filename), "/dev/event%01d", conf.headset_node_number); + snprintf(eventnode_filename, sizeof(eventnode_filename), "%s%01d", EARJACK_EVENT_PATH, conf.headset_node_number); fd = open(eventnode_filename, O_RDONLY); if (fd == -1) { @@ -699,14 +677,17 @@ int avsys_audio_path_earjack_init(int *init_type, int *outfd) if(AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, &vol_data))) { avsys_error(AVAUDIO,"attach logical volume shared memory failed\n"); + close(fd); return AVSYS_STATE_ERR_ALLOCATION; } if(AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_HANDLE, &handle_data))) { avsys_error(AVAUDIO,"attach handle shared memory failed\n"); + close(fd); return AVSYS_STATE_ERR_ALLOCATION; } if(AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void**)temp))) { avsys_error_r(AVAUDIO,"avsys_audio_get_shm() failed in %s\n", __func__); + close(fd); return AVSYS_STATE_ERR_INTERNAL; } @@ -725,9 +706,8 @@ int avsys_audio_path_earjack_wait(int fd, int *current_type, int *new_type, int fd_set set; int readtemp; int select_ret = 0; - struct avsys_audio_jack_event jevent; + struct input_event jevent; int res = AVSYS_STATE_SUCCESS; - int set_flag = 0; int cur_type = -1; if (new_type == NULL || is_auto_mute == NULL) @@ -774,8 +754,6 @@ int avsys_audio_path_earjack_wait(int fd, int *current_type, int *new_type, int } else { readtemp = 0; } - - set_flag = 1; /* need change earphone status */ break; default: readtemp = cur_type; /* same value */ @@ -802,17 +780,10 @@ int avsys_audio_path_earjack_wait(int fd, int *current_type, int *new_type, int *current_type = control->inserted; *is_auto_mute = 0; res = AVSYS_STATE_SUCCESS; - } else if (control->ear_auto == AVSYS_AUDIO_EAR_SWITCH_MANUAL) { - *is_auto_mute = 0; - /* return warning */ - if (set_flag) { - control->inserted = *new_type; - set_flag = 0; - } - res = AVSYS_STATE_WAR_INTERNAL; } return res; + #else return AVSYS_STATE_ERR_DEVICE_NOT_SUPPORT; #endif @@ -834,27 +805,6 @@ int avsys_audio_path_earjack_process(int new_type) control->inserted = new_type; - if (control->ear_auto == AVSYS_AUDIO_EAR_SWITCH_MANUAL) { - return AVSYS_STATE_SUCCESS; - } - - /* Capture/Playback Gain Control */ - avsys_warning(AVAUDIO, "Gain C(%d), P(%d)\n", control->gain.capture, control->gain.playback); - err = capture_gain_func_table[control->gain.capture] (control); - if (AVSYS_FAIL(err)) { - avsys_error_r(AVAUDIO, "earjack change failed for %d gain : error 0x%x\n", control->gain.capture, err); - } - - err = playback_gain_func_table[control->gain.playback] (control); - if (AVSYS_SUCCESS(err)) { - /* H/W Control */ - err = __avsys_audio_path_set_hw_controls(control); - if (AVSYS_FAIL(err)) { - avsys_error_r(AVAUDIO, "__avsys_audio_path_set_hw_controls() failed in %s\n", __func__); - } - } else - avsys_error_r(AVAUDIO, "earjack change failed for %d gain : error 0x%x\n", control->gain.playback, err); - return err; #else return AVSYS_STATE_ERR_DEVICE_NOT_SUPPORT; @@ -889,58 +839,119 @@ int avsys_audio_path_earjack_unlock() enum { CMD_DEVICE_NONE = 0, CMD_DEVICE_OPEN, - CMD_DEVICE_CLOSE, + CMD_DEVICE_CLOSE, /* Not used */ CMD_DEVICE_MAX }; -avsys_audio_alsa_aif_handle_t *g_hAIF[AIF_DEVICE_MAX] = { NULL, NULL, NULL, NULL }; -char *strAIF[AIF_DEVICE_MAX] = { "AIF2 Capture", "AIF2 Playback", "AIF3 Capture", "AIF3 Playback" }; +avsys_audio_alsa_aif_handle_t *g_hAIF[AIF_DEVICE_MAX] = { NULL, NULL, NULL, NULL, NULL }; +char *strAIF[AIF_DEVICE_MAX] = { "AIF CP Capture", "AIF CP Playback", "AIF BT Capture", "AIF BT Playback", "AIF RADIO Playback" }; -#define SET_AIF(index) \ -do { \ - if(g_hAIF[index]) { \ - avsys_warning(AVAUDIO,#index" device already opened\n"); \ - AIF_control[index] = CMD_DEVICE_NONE; \ - } else { \ - AIF_control[index] = CMD_DEVICE_OPEN; \ - } \ -} while (0) +#define SET_AIF(index) do { AIF_control[index] = CMD_DEVICE_OPEN; } while (0) + +static int __is_cp_aif (int type) +{ + return ((type == AIF_CP_PLAYBACK || type == AIF_CP_CAPTURE)); +} -static int __avsys_open_aif(char AIF_control[]) +static int __avsys_open_aif(char AIF_control[], bool wb_enabled) { int iAIF = 0; int err = AVSYS_STATE_SUCCESS; + bool bt_enabled = 0; + aif_rate_t rate = 0; + /* Check If BT is enabled */ + for (iAIF = 0; iAIF < AIF_DEVICE_MAX; iAIF++) { + if (AIF_control[iAIF] == CMD_DEVICE_OPEN && (iAIF == AIF_BT_PLAYBACK || iAIF== AIF_BT_CAPTURE)) { + bt_enabled = true; + break; + } + } + + /* Iterate control command */ + avsys_info(AVAUDIO, "================== Close if reopen is needed (bt[%d] wb[%d]) ================== \n", bt_enabled, wb_enabled); for (iAIF = 0; iAIF < AIF_DEVICE_MAX; iAIF++) { /* check command */ if (AIF_control[iAIF] != CMD_DEVICE_OPEN) continue; - /* check handle allocation */ + avsys_info(AVAUDIO, "%d. [%s]\n", iAIF, strAIF[iAIF]); + + /* check handle exists */ if (g_hAIF[iAIF]) { - avsys_warning(AVAUDIO, "Oops! Free %s device handle first", strAIF[iAIF]); - free(g_hAIF[iAIF]); - g_hAIF[iAIF] = NULL; + /* Handle is already opened. + * Check if WB is supported and CP handle case */ + if (wb_enabled && __is_cp_aif(g_hAIF[iAIF]->type)) { + /* CP Handle is already opened with WB enabled . + * Determine whether re-open is needed */ + if ((bt_enabled && g_hAIF[iAIF]->rate != AIF_NB_RATE) || + (!bt_enabled && g_hAIF[iAIF]->rate == AIF_NB_RATE)) { + /* CP handle exists and BT enabled with not NB opened => close for reopen + CP handle exists and BT disabled with NB opened => close for reopen */ + avsys_info(AVAUDIO, "=> Close device for reopen :: %s\n", strAIF[iAIF]); + if (AVSYS_FAIL(avsys_audio_alsa_close_AIF_device(g_hAIF[iAIF]))) { + avsys_error_r(AVAUDIO, "close %s device failed\n", strAIF[iAIF]); + } + free(g_hAIF[iAIF]); + g_hAIF[iAIF] = NULL; + } else { + /* CP handle exists and BT enabled with NB opened || + CP handle exists and BT disabled with not NB opened */ + avsys_info(AVAUDIO, "=> Skip device :: %s\n", strAIF[iAIF]); + continue; + } + + } else { + /* Not CP case or WB is disabled. No need to reopen */ + avsys_info(AVAUDIO, "=> Skip device :: %s\n", strAIF[iAIF]); + continue; + } + } + } + + avsys_info(AVAUDIO, "================== Open & Set Param ================== \n"); + /* Iterate control command */ + for (iAIF = 0; iAIF < AIF_DEVICE_MAX; iAIF++) { + /* check command */ + if (AIF_control[iAIF] != CMD_DEVICE_OPEN) + continue; + + avsys_info(AVAUDIO, "%d. [%s]\n", iAIF, strAIF[iAIF]); + + /* check handle exists */ + if (g_hAIF[iAIF]) { + /* Not CP case or WB is disabled. No need to reopen */ + avsys_info(AVAUDIO, "=> Skip device Already opened!!! :: %s\n", strAIF[iAIF]); + continue; } + /* memory allocation for handle */ - avsys_warning(AVAUDIO, "%s handle alloc", strAIF[iAIF]); + avsys_warning(AVAUDIO, "=> [%s] handle alloc", strAIF[iAIF]); g_hAIF[iAIF] = calloc(sizeof(avsys_audio_handle_t), 1); if (!g_hAIF[iAIF]) { - avsys_error_r(AVAUDIO, "Can not alloc memory for %s device handle", strAIF[iAIF]); + avsys_error_r(AVAUDIO, "=> Can not alloc memory for [%s] device handle", strAIF[iAIF]); err = AVSYS_STATE_ERR_ALLOCATION; continue; } if (AVSYS_FAIL(avsys_audio_alsa_open_AIF_device(iAIF, g_hAIF[iAIF]))) { - avsys_error_r(AVAUDIO, "open %s device failed\n", strAIF[iAIF]); + avsys_error_r(AVAUDIO, "=> open [%s] device failed\n", strAIF[iAIF]); err = AVSYS_STATE_ERR_INVALID_HANDLE; } else { - avsys_warning(AVAUDIO, "open %s device success\n", strAIF[iAIF]); - if (AVSYS_FAIL(avsys_audio_alsa_set_AIF_params(g_hAIF[iAIF]))) { - avsys_error_r(AVAUDIO, "%s device set parameter failed\n", strAIF[iAIF]); + avsys_warning(AVAUDIO, "=> open [%s] device success\n", strAIF[iAIF]); + + /* Select RATE */ + if (__is_cp_aif(g_hAIF[iAIF]->type)) { + rate = (wb_enabled && !bt_enabled)? AIF_WB_RATE : AIF_NB_RATE; + } else { + rate = AIF_CONF_RATE; + } + + if (AVSYS_FAIL(avsys_audio_alsa_set_AIF_params(g_hAIF[iAIF],rate))) { + avsys_error_r(AVAUDIO, "=> [%s] device set parameter failed\n", strAIF[iAIF]); err = AVSYS_STATE_ERR_INVALID_PARAMETER; } else { - avsys_warning(AVAUDIO, "%s device set parameter success\n", strAIF[iAIF]); + avsys_warning(AVAUDIO, "=> [%s] device set parameter success\n", strAIF[iAIF]); } } } @@ -970,6 +981,7 @@ static int __avsys_audio_release_path (gain_info_t local_gain, avsys_audio_path_ { int err = AVSYS_STATE_SUCCESS; int iAIF = 0; + bool close_aif_later = false; avsys_warning(AVAUDIO, "Release path for %d %d\n", local_gain.playback, local_gain.capture); @@ -977,14 +989,15 @@ static int __avsys_audio_release_path (gain_info_t local_gain, avsys_audio_path_ case AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL: case AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL: if (getpid() == control->path_fixed_pid[PATH_FIXED_TYPE_CALL]) { -#ifndef OPEN_AIF_BEFORE_SCENARIO_SET /* FIXME : disable here, close after scenario set */ - __avsys_close_aif(); -#endif + if (!control->control_aif_before_path_set) { + __avsys_close_aif(); + } else { + close_aif_later = true; + } if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_CODEC_DISABLE_ON_SUSPEND))) { avsys_error_r(AVAUDIO, "[%s] failed to set codec_disable_on_suspend\n", __func__); } - control->p_path_status.playback |= PS_CODEC_DISABLE_ON_SUSPEND; } else { if (control->path_fixed_pid[PATH_FIXED_TYPE_CALL] < 0) { avsys_warning(AVAUDIO, "Sound path for call released already\n"); @@ -1007,20 +1020,11 @@ static int __avsys_audio_release_path (gain_info_t local_gain, avsys_audio_path_ if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_CODEC_DISABLE_ON_SUSPEND))) { avsys_error_r(AVAUDIO, "[%s] failed to set codec_disable_on_suspend\n", __func__); } - control->p_path_status.playback |= PS_CODEC_DISABLE_ON_SUSPEND; - if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET))) { + if (AVSYS_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET_CAPTURE))) { avsys_error_r(AVAUDIO, "[%s] failed to set reset\n", __func__); - } else { - control->p_path_status.playback = PS_PATH_NONE; } - /* TODO: Path fixed clear (path_fixed, path_fixed_pid) */ - if ((control->path_fixed & PATH_FIXED_WITH_FMRADIO) == 0) { - avsys_error(AVAUDIO, "FM-Radio path release without radio path request\n"); - } - control->path_fixed &= ~PATH_FIXED_WITH_FMRADIO; - control->path_fixed_pid[PATH_FIXED_TYPE_FMRADIO] = -1; break; default: @@ -1037,31 +1041,12 @@ static int __avsys_audio_release_path (gain_info_t local_gain, avsys_audio_path_ control->gain.capture = AVSYS_AUDIO_CAPTURE_GAIN_AP; control->path.playback = AVSYS_AUDIO_PATH_EX_SPK; control->path.capture = AVSYS_AUDIO_PATH_EX_MIC; - - switch(control->route_policy) - { - case AVSYS_AUDIO_ROUTE_POLICY_DEFAULT: - case AVSYS_AUDIO_ROUTE_POLICY_IGNORE_A2DP: - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE; - control->option.playback = AVSYS_AUDIO_PATH_OPTION_JACK_AUTO; - control->option.capture = AVSYS_AUDIO_PATH_OPTION_JACK_AUTO; - break; - - case AVSYS_AUDIO_ROUTE_POLICY_HANDSET_ONLY: - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE; - control->option.playback = AVSYS_AUDIO_PATH_OPTION_NONE; - control->option.capture = AVSYS_AUDIO_PATH_OPTION_NONE; - break; - - default: - break; + if (control->inserted != AVSYS_AUDIO_INSERTED_NONE) { + control->path.playback = AVSYS_AUDIO_PATH_EX_HEADSET; + if (control->inserted == AVSYS_AUDIO_INSERTED_4) + control->path.capture = AVSYS_AUDIO_PATH_EX_HEADSETMIC; } - control->p_path_status.playback = PS_PATH_NONE; - control->p_path_status.capture = PS_PATH_NONE; - control->p_gain_status.playback = GS_GAIN_NONE; - control->p_gain_status.capture = GS_GAIN_NONE; - /* Playback */ err = __avsys_audio_path_set_ascn_ap_playback(control); if (AVSYS_SUCCESS(err)) { @@ -1080,17 +1065,43 @@ static int __avsys_audio_release_path (gain_info_t local_gain, avsys_audio_path_ } } - /* FIXME : Close AIF, this will be moved before scneario set */ -#ifdef OPEN_AIF_BEFORE_SCENARIO_SET - if ((local_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL || local_gain.playback == AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL) && - getpid() == control->path_fixed_pid[PATH_FIXED_TYPE_CALL]) { - __avsys_close_aif(); + if (close_aif_later == true) { + __avsys_close_aif(); } -#endif return err; } +int avsys_audio_path_earjack_get_type() +{ + avsys_audio_path_ex_info_t *control = NULL; + avsys_audio_path_ex_info_t **temp = NULL; + int err = AVSYS_STATE_SUCCESS; + int ret = 0; + + temp = &control; + if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))) { + avsys_error_r(AVAUDIO, "avsys_audio_get_shm() failed in %s\n", __func__); + return AVSYS_STATE_ERR_INTERNAL; + } + if (control == NULL) + return AVSYS_STATE_ERR_NULL_POINTER; + + if (AVSYS_FAIL(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) { + avsys_error_r(AVAUDIO, "avsys_audio_lock_sync() failed in %s\n", __func__); + return AVSYS_STATE_ERR_INTERNAL; + } + + ret = control->inserted; + + if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))) { + avsys_error_r(AVAUDIO, "avsys_audio_unlock_sync() failed in %s\n", __func__); + return AVSYS_STATE_ERR_INTERNAL; + } + + return ret; +} + int avsys_audio_path_ex_set_path(int gain, int out, int in, int option) { avsys_audio_path_ex_info_t *control = NULL; @@ -1100,7 +1111,7 @@ int avsys_audio_path_ex_set_path(int gain, int out, int in, int option) pid_t current_pid; int err = AVSYS_STATE_SUCCESS; char req_release_path = 0; - char AIF_control[AIF_DEVICE_MAX] = { CMD_DEVICE_NONE, CMD_DEVICE_NONE, CMD_DEVICE_NONE, CMD_DEVICE_NONE }; + char AIF_control[AIF_DEVICE_MAX] = { CMD_DEVICE_NONE, CMD_DEVICE_NONE, CMD_DEVICE_NONE, CMD_DEVICE_NONE, CMD_DEVICE_NONE }; int iAIF = 0; avsys_warning(AVAUDIO, "=================== [Input Param] gain %d, out %d, in %d, opt 0x%x ====================\n", gain, out, in, option); @@ -1114,6 +1125,7 @@ int avsys_audio_path_ex_set_path(int gain, int out, int in, int option) case AVSYS_AUDIO_GAIN_EX_CAMERA: case AVSYS_AUDIO_GAIN_EX_GAME: req_gain.playback = AVSYS_AUDIO_PLAYBACK_GAIN_AP; + req_gain.capture = AVSYS_AUDIO_CAPTURE_GAIN_AP; break; case AVSYS_AUDIO_GAIN_EX_RINGTONE: @@ -1179,11 +1191,6 @@ int avsys_audio_path_ex_set_path(int gain, int out, int in, int option) control->path_fixed &= ~PATH_FIXED_WITH_CALL; } } - if (control->path_fixed & PATH_FIXED_WITH_FMRADIO) { - if (AVSYS_FAIL(avsys_check_process(control->path_fixed_pid[PATH_FIXED_TYPE_FMRADIO]))) { - control->path_fixed &= ~PATH_FIXED_WITH_FMRADIO; - } - } if (control->path_fixed == PATH_FIXED_NONE) { /* forced gain setting when path fixed by dead process */ if (req_gain.playback != local_gain.playback) { @@ -1246,26 +1253,30 @@ int avsys_audio_path_ex_set_path(int gain, int out, int in, int option) control->backup_path.playback = out; switch (local_gain.playback) { - case AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL: - control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = current_pid; case AVSYS_AUDIO_PLAYBACK_GAIN_CALLALERT: if (control->path.playback == AVSYS_AUDIO_PATH_EX_BTHEADSET) { - SET_AIF(AIF3_PLAYBACK); - SET_AIF(AIF3_CAPTURE); + SET_AIF(AIF_BT_PLAYBACK); + SET_AIF(AIF_BT_CAPTURE); } break; case AVSYS_AUDIO_PLAYBACK_GAIN_VOICECALL: - control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = current_pid; - SET_AIF(AIF2_PLAYBACK); + case AVSYS_AUDIO_PLAYBACK_GAIN_VIDEOCALL: + /* Set CP only for voicecall */ + if (local_gain.capture == AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL) { + SET_AIF(AIF_CP_PLAYBACK); + } + /* Voicecall / Videocall Common setting */ + control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = current_pid; if (control->path.playback == AVSYS_AUDIO_PATH_EX_BTHEADSET) { - SET_AIF(AIF3_PLAYBACK); + SET_AIF(AIF_BT_PLAYBACK); } break; case AVSYS_AUDIO_PLAYBACK_GAIN_FMRADIO: control->path_fixed_pid[PATH_FIXED_TYPE_FMRADIO] = current_pid; + SET_AIF(AIF_RADIO_PLAYBACK); break; } } @@ -1285,19 +1296,17 @@ int avsys_audio_path_ex_set_path(int gain, int out, int in, int option) control->backup_path.capture = in; switch (local_gain.capture) { + case AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL: case AVSYS_AUDIO_CAPTURE_GAIN_VIDEOCALL: - control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = current_pid; - if (control->path.capture == AVSYS_AUDIO_PATH_EX_BTMIC) { - SET_AIF(AIF3_CAPTURE); + /* Set CP only for voicecall */ + if (local_gain.capture == AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL) { + SET_AIF(AIF_CP_CAPTURE); } - break; - case AVSYS_AUDIO_CAPTURE_GAIN_VOICECALL: + /* Voicecall / Videocall Common setting */ control->path_fixed_pid[PATH_FIXED_TYPE_CALL] = current_pid; - SET_AIF(AIF2_CAPTURE); - if (control->path.capture == AVSYS_AUDIO_PATH_EX_BTMIC) { - SET_AIF(AIF3_CAPTURE); + SET_AIF(AIF_BT_CAPTURE); } break; @@ -1309,10 +1318,9 @@ int avsys_audio_path_ex_set_path(int gain, int out, int in, int option) } /* Open AIFs */ - /* FIXME: this will be moved to after alsa scenraio set */ -#ifdef OPEN_AIF_BEFORE_SCENARIO_SET - err = __avsys_open_aif(AIF_control); -#endif + if (control->control_aif_before_path_set) { + err = __avsys_open_aif(AIF_control, control->wb_enabled); + } /* Do ALSA scenario control based on gain */ /* Playback */ @@ -1346,9 +1354,10 @@ int avsys_audio_path_ex_set_path(int gain, int out, int in, int option) avsys_warning(AVAUDIO, "capture gain : ap\n"); err = __avsys_audio_path_set_ascn_ap_capture(control); } -#ifndef OPEN_AIF_BEFORE_SCENARIO_SET - err = __avsys_open_aif(AIF_control); -#endif + + if (!control->control_aif_before_path_set) { + err = __avsys_open_aif(AIF_control, control->wb_enabled); + } FINISHED: /* UnLOCK */ @@ -1566,129 +1575,61 @@ static int __avsys_audio_path_set_ascn_ap_playback(avsys_audio_path_ex_info_t *c switch (control->path.playback) { case AVSYS_AUDIO_PATH_EX_SPK: - if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_LEGACY_MODE) { - avsys_warning(AVAUDIO, "Does not support legacy mode anymore\n"); - } - if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_DUAL_OUT) { if (callalert_mode) { - control->gain_status.playback = GS_AP_TO_SPK_CALLALERT; cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_CALLALERT; + cmd_gain[1] = INPUT_AP | OUTPUT_HEADSET | GAIN_CALLALERT; } else { - control->gain_status.playback = GS_AP_TO_SPK; cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE; + cmd_gain[1] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; } - if (control->inserted == AVSYS_AUDIO_INSERTED_NONE) { - control->path_status.playback = PS_AP_TO_SPK; - cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK; - } else { - control->path_status.playback = PS_AP_TO_SPK | PS_AP_TO_HEADSET; - cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK; - cmd_path[1] = INPUT_AP | OUTPUT_HEADSET; - } + cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK; + cmd_path[1] = INPUT_AP | OUTPUT_HEADSET; + control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; } else { - if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE; - if (control->inserted == AVSYS_AUDIO_INSERTED_NONE) { - if (callalert_mode) { - control->gain_status.playback = GS_AP_TO_SPK_CALLALERT; - cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_CALLALERT; - } else { - control->gain_status.playback = GS_AP_TO_SPK; - cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE; - } - control->path_status.playback = PS_AP_TO_SPK; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK; - } else { - if (callalert_mode) { - control->gain_status.playback = GS_AP_TO_HEADSET_CALLALERT; - cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_CALLALERT; - } else { - control->gain_status.playback = GS_AP_TO_HEADSET; - cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; - } - control->path_status.playback = PS_AP_TO_HEADSET; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET; - cmd_path[0] = INPUT_AP | OUTPUT_HEADSET; - } + if (callalert_mode) { + cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_CALLALERT; } else { - if (callalert_mode) { - control->gain_status.playback = GS_AP_TO_SPK_CALLALERT; - cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_CALLALERT; - } else { - control->gain_status.playback = GS_AP_TO_SPK; - cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE; - } - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE; - control->path_status.playback = PS_AP_TO_SPK; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - - cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK; + cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE; } + control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE; + control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; + + cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK; } break; case AVSYS_AUDIO_PATH_EX_RECV: - if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_LEGACY_MODE) { - avsys_warning(AVAUDIO, "Does not support legacy mode anymore\n"); - } - - if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE; - if (control->inserted == AVSYS_AUDIO_INSERTED_NONE) { - control->gain_status.playback = GS_AP_TO_RECV; - control->path_status.playback = PS_AP_TO_RECV; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - cmd_gain[0] = INPUT_AP | OUTPUT_RECV | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_RECV; - } else { - if (callalert_mode) { - control->gain_status.playback = GS_AP_TO_HEADSET_CALLALERT; - cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_CALLALERT; - } else { - control->gain_status.playback = GS_AP_TO_HEADSET; - cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; - } - control->path_status.playback = PS_AP_TO_HEADSET; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET; - cmd_path[0] = INPUT_AP | OUTPUT_HEADSET; - } - } else { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - control->gain_status.playback = GS_AP_TO_RECV; - control->path_status.playback = PS_AP_TO_RECV; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - cmd_gain[0] = INPUT_AP | OUTPUT_RECV | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_RECV; - } + control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; + cmd_gain[0] = INPUT_AP | OUTPUT_RECV | GAIN_MODE; + cmd_path[0] = INPUT_AP | OUTPUT_RECV; break; case AVSYS_AUDIO_PATH_EX_HEADSET: - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; if (callalert_mode) { - control->gain_status.playback = GS_AP_TO_HEADSET_CALLALERT; cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_CALLALERT; } else { - control->gain_status.playback = GS_AP_TO_HEADSET; cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; } - control->path_status.playback = PS_AP_TO_HEADSET; control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET; cmd_path[0] = INPUT_AP | OUTPUT_HEADSET; break; case AVSYS_AUDIO_PATH_EX_HDMI: - avsys_warning(AVAUDIO, "Does not support dedicated HDMI sound path\n"); control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; + cmd_gain[0] = INPUT_AP | OUTPUT_HDMI | GAIN_MODE; + cmd_path[0] = INPUT_AP | OUTPUT_HDMI; + break; + + case AVSYS_AUDIO_PATH_EX_DOCK: + control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; + cmd_gain[0] = INPUT_AP | OUTPUT_DOCK | GAIN_MODE; + cmd_path[0] = INPUT_AP | OUTPUT_DOCK; break; case AVSYS_AUDIO_PATH_EX_BTHEADSET: - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - control->gain_status.playback = GS_AP_TO_BT; - control->path_status.playback = PS_AP_TO_BT; control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET; cmd_gain[0] = INPUT_AP | OUTPUT_BT_HEADSET | GAIN_MODE; cmd_path[0] = INPUT_AP | OUTPUT_BT_HEADSET; @@ -1699,14 +1640,9 @@ static int __avsys_audio_path_set_ascn_ap_playback(avsys_audio_path_ex_info_t *c break; } - //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); - if ((control->p_path_status.playback != control->path_status.playback) || control->gain_debug_mode == 1) { - avsys_warning(AVAUDIO, "Run Alsa Scenario Script\n"); - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 1, ASCN_RESET_PLAYBACK)) - control->p_gain_status.playback = control->gain_status.playback; - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 2, ASCN_RESET_NONE)) - control->p_path_status.playback = control->path_status.playback; - } + avsys_warning(AVAUDIO, "Run Alsa Scenario Script\n"); + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 2, ASCN_RESET_PLAYBACK)) + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 2, ASCN_RESET_NONE)) avsys_info(AVAUDIO, ">> leave"); return AVSYS_STATE_SUCCESS; @@ -1714,6 +1650,139 @@ static int __avsys_audio_path_set_ascn_ap_playback(avsys_audio_path_ex_info_t *c static int __avsys_audio_path_set_ascn_voicecall(avsys_audio_path_ex_info_t *control) { + int cmd_gain[6] = { 0, 0, 0, 0, 0, 0 }; + int cmd_path[6] = { 0, 0, 0, 0, 0, 0 }; + int gain_idx = 0; + int path_idx = 0; + control->path_fixed = PATH_FIXED_WITH_CALL; + + avsys_info(AVAUDIO, "<< path.playback = %d, option = %x, gain.playback = %d, inserted = %d\n", + control->path.playback, control->option.playback, control->gain.playback, control->inserted); + + /* PLAYBACK */ + switch (control->path.playback) { + case AVSYS_AUDIO_PATH_EX_NONE: + avsys_warning(AVAUDIO, "[SZ] playback AVSYS_AUDIO_PATH_EX_NONE\n"); + break; + + case AVSYS_AUDIO_PATH_EX_SPK: + if (control->reqgain.playback == control->gain.playback) { + cmd_gain[gain_idx++] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK; + cmd_gain[gain_idx++] = INPUT_CP | OUTPUT_STEREO_SPK | GAIN_VOICE_CALL; + cmd_path[path_idx++] = INPUT_CP | OUTPUT_STEREO_SPK; + } else { + avsys_warning(AVAUDIO, "Ignore another path setting request during voicecall\n"); + } + break; + + case AVSYS_AUDIO_PATH_EX_RECV: + if (control->gain.playback == control->reqgain.playback) { + cmd_gain[gain_idx++] = INPUT_AP | OUTPUT_RECV | GAIN_MODE; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_RECV; + cmd_gain[gain_idx++] = INPUT_CP | OUTPUT_RECV | GAIN_VOICE_CALL; + cmd_path[path_idx++] = INPUT_CP | OUTPUT_RECV; + } else { + avsys_warning(AVAUDIO, "Ignore another path setting request during voicecall\n"); + } + break; + + case AVSYS_AUDIO_PATH_EX_HEADSET: + if (control->reqgain.playback == control->gain.playback) { + cmd_gain[gain_idx++] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET; + cmd_gain[gain_idx++] = INPUT_CP | OUTPUT_HEADSET | GAIN_VOICE_CALL; + cmd_path[path_idx++] = INPUT_CP | OUTPUT_HEADSET; + } else { + avsys_warning(AVAUDIO, "Ignore another path setting request during voicecall\n"); + } + break; + + case AVSYS_AUDIO_PATH_EX_BTHEADSET: + + if (control->reqgain.playback == control->gain.playback) { + control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE; + cmd_gain[gain_idx++] = INPUT_CP | OUTPUT_BT_HEADSET | GAIN_MODE; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_BT_HEADSET; + cmd_path[path_idx++] = INPUT_CP | OUTPUT_BT_HEADSET; + } else { + avsys_warning(AVAUDIO, "Ignore another path setting request during voicecall\n"); + } + break; + + case AVSYS_AUDIO_PATH_EX_HANDSFREE: + default: + if (control->reqgain.playback == control->gain.playback) { + control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; + } + break; + } + + + /* Add sound path CP to AP (Rx recording) */ + if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC) { + avsys_warning(AVAUDIO, "[SZ] capture AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC\n"); + //cmd_path[path_idx++] = INPUT_CP | OUTPUT_AP; + } + + + /* CAPTURE */ + switch (control->path.capture) { + case AVSYS_AUDIO_PATH_EX_NONE: + avsys_warning(AVAUDIO, "[SZ] capture AVSYS_AUDIO_PATH_EX_NONE\n"); + break; + + case AVSYS_AUDIO_PATH_EX_MIC: + if (control->reqgain.capture == control->gain.capture) { + if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) { + cmd_gain[gain_idx++] = INPUT_SUB_MIC | OUTPUT_CP | GAIN_MODE; + cmd_path[path_idx++] = INPUT_SUB_MIC | OUTPUT_CP; + if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC) { + avsys_warning(AVAUDIO, "[SZ] capture AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC\n"); + //cmd_path[path_idx++] = INPUT_SUB_MIC | OUTPUT_AP; + } + } else { + cmd_gain[gain_idx++] = INPUT_MAIN_MIC | OUTPUT_CP | GAIN_MODE; + cmd_path[path_idx++] = INPUT_MAIN_MIC | OUTPUT_CP; + if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC) { + avsys_warning(AVAUDIO, "[SZ] capture AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC\n"); + //cmd_path[path_idx++] = INPUT_MAIN_MIC | OUTPUT_AP; + } + } + } + break; + + case AVSYS_AUDIO_PATH_EX_HEADSETMIC: + if (control->reqgain.capture == control->gain.capture) { + cmd_gain[gain_idx++] = INPUT_EAR_MIC | OUTPUT_CP | GAIN_MODE; + cmd_path[path_idx++] = INPUT_EAR_MIC | OUTPUT_CP; + if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC) { + avsys_warning(AVAUDIO, "[SZ] capture AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC\n"); + //cmd_path[path_idx++] = INPUT_EAR_MIC | OUTPUT_AP; + } + } + break; + + case AVSYS_AUDIO_PATH_EX_BTMIC: + if (control->reqgain.capture == control->gain.capture) { + cmd_gain[gain_idx++] = INPUT_BT_MIC | OUTPUT_CP | GAIN_MODE; + cmd_path[path_idx++] = INPUT_BT_MIC | OUTPUT_CP; + if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC) { + avsys_warning(AVAUDIO, "[SZ] capture AVSYS_AUDIO_PATH_OPTION_VOICECALL_REC\n"); + //avsys_error(AVAUDIO, "BT Call recording is not supported"); + } + } + break; + case AVSYS_AUDIO_PATH_EX_HANDSFREE: + default: + break; + } + + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET)); + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 6, ASCN_RESET_NONE)); + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 6, ASCN_RESET_NONE)); + + avsys_info(AVAUDIO, ">> leave"); return AVSYS_STATE_SUCCESS; } @@ -1721,90 +1790,39 @@ static int __avsys_audio_path_set_ascn_videocall(avsys_audio_path_ex_info_t *con { int cmd_gain[2] = { 0, 0 }; int cmd_path[3] = { 0, 0, 0 }; - int skip_clear = 0; + int gain_idx = 0; + int path_idx = 0; + control->path_fixed = PATH_FIXED_WITH_CALL; switch (control->path.playback) { case AVSYS_AUDIO_PATH_EX_NONE: - if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_LEGACY_MODE) { - /* Legacy mode does not effect here... */ - avsys_warning(AVAUDIO, "legacy mode option %s\n", __func__); - } - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - if (control->reqgain.playback == control->gain.playback) { - avsys_warning(AVAUDIO, "Output block on videocall"); - } else { - avsys_warning(AVAUDIO, "Ignore another path setting request during voicecall"); - } - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; + avsys_warning(AVAUDIO, "[SZ] playback AVSYS_AUDIO_PATH_EX_NONE\n"); break; case AVSYS_AUDIO_PATH_EX_SPK: if (control->reqgain.playback == control->gain.playback) { - if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE; - if (control->inserted != AVSYS_AUDIO_INSERTED_NONE) { - control->gain_status.playback = GS_AP_TO_HEADSET; - control->path_status.playback = PS_AP_TO_HEADSET; - cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_HEADSET; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET; - } else { - control->gain_status.playback = GS_AP_TO_SPK; - control->path_status.playback = PS_AP_TO_SPK; - cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - } - } else { /* ear jack manual */ - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - control->gain_status.playback = GS_AP_TO_SPK; - control->path_status.playback = PS_AP_TO_SPK; - cmd_gain[0] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_STEREO_SPK; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - } - } else { /* changed by priority */ + cmd_gain[gain_idx++] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK; + control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; + } else { avsys_warning(AVAUDIO, "Sound Path request during VT call ignored."); } break; case AVSYS_AUDIO_PATH_EX_RECV: if (control->gain.playback == control->reqgain.playback) { - if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE; - if (control->inserted != AVSYS_AUDIO_INSERTED_NONE) { - control->gain_status.playback = GS_AP_TO_HEADSET; - control->path_status.playback = PS_AP_TO_HEADSET; - cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_HEADSET; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET; - } else { - control->gain_status.playback = GS_AP_TO_RECV; - control->path_status.playback = PS_AP_TO_RECV; - cmd_gain[0] = INPUT_AP | OUTPUT_RECV | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_RECV; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - } - } else { /* ear jack manual */ - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - control->gain_status.playback = GS_AP_TO_RECV; - control->path_status.playback = PS_AP_TO_RECV; - cmd_gain[0] = INPUT_AP | OUTPUT_RECV | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_RECV; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - } - } else { /* changed by priority */ + cmd_gain[gain_idx++] = INPUT_AP | OUTPUT_RECV | GAIN_MODE; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_RECV; + control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; + } else { avsys_warning(AVAUDIO, "Sound Path request during VT call ignored."); - } /* reqgain, gain */ + } break; case AVSYS_AUDIO_PATH_EX_HEADSET: if (control->reqgain.playback == control->gain.playback) { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - control->gain_status.playback = GS_AP_TO_HEADSET; - control->path_status.playback = PS_AP_TO_HEADSET; - cmd_gain[0] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_HEADSET; + cmd_gain[gain_idx++] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET; control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET; } else { avsys_warning(AVAUDIO, "Sound Path request during VT call ignored."); @@ -1813,11 +1831,8 @@ static int __avsys_audio_path_set_ascn_videocall(avsys_audio_path_ex_info_t *con case AVSYS_AUDIO_PATH_EX_BTHEADSET: if (control->reqgain.playback == control->gain.playback) { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - control->gain_status.playback = GS_AP_TO_BT; - control->path_status.playback = PS_AP_TO_BT; - cmd_gain[0] = INPUT_AP | OUTPUT_BT_HEADSET | GAIN_MODE; - cmd_path[0] = INPUT_AP | OUTPUT_BT_HEADSET; + cmd_gain[gain_idx++] = INPUT_AP | OUTPUT_BT_HEADSET | GAIN_MODE; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_BT_HEADSET; control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET; } else { avsys_warning(AVAUDIO, "Sound Path request during VT call ignored."); @@ -1834,61 +1849,27 @@ static int __avsys_audio_path_set_ascn_videocall(avsys_audio_path_ex_info_t *con switch (control->path.capture) { case AVSYS_AUDIO_PATH_EX_NONE: - if (control->reqgain.capture == control->gain.capture) { - /* Clear modem input */ - control->path_status.capture &= ~(PS_MAINMIC_TO_AP | PS_SUBMIC_TO_AP | PS_EARMIC_TO_AP | PS_BTMIC_TO_AP); - } else { - avsys_warning(AVAUDIO, "Ignore another path setting request during VT call (input)\n"); - } + avsys_warning(AVAUDIO, "[SZ] capture AVSYS_AUDIO_PATH_EX_NONE\n"); break; case AVSYS_AUDIO_PATH_EX_MIC: - if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) { - if ((control->inserted == AVSYS_AUDIO_INSERTED_4) && (control->path_status.playback & PS_AP_TO_HEADSET)) { - control->gain_status.capture |= GS_EARMIC_TO_AP; - control->path_status.capture |= PS_EARMIC_TO_AP; - cmd_gain[1] = INPUT_EAR_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[1] = INPUT_EAR_MIC | OUTPUT_AP; - } else { - if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) { - control->gain_status.capture |= GS_SUBMIC_TO_AP; - control->path_status.capture |= PS_SUBMIC_TO_AP; - cmd_gain[1] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[1] = INPUT_SUB_MIC | OUTPUT_AP; - } else { - control->gain_status.capture |= GS_MAINMIC_TO_AP; - control->path_status.capture |= PS_MAINMIC_TO_AP; - cmd_gain[1] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[1] = INPUT_MAIN_MIC | OUTPUT_AP; - } - } + if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) { + cmd_gain[gain_idx++] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE; + cmd_path[path_idx++] = INPUT_SUB_MIC | OUTPUT_AP; } else { - if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) { - control->gain_status.capture |= GS_SUBMIC_TO_AP; - control->path_status.capture |= PS_SUBMIC_TO_AP; - cmd_gain[1] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[1] = INPUT_SUB_MIC | OUTPUT_AP; - } else { - control->gain_status.capture |= GS_MAINMIC_TO_AP; - control->path_status.capture |= PS_MAINMIC_TO_AP; - cmd_gain[1] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[1] = INPUT_MAIN_MIC | OUTPUT_AP; - } + cmd_gain[gain_idx++] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE; + cmd_path[path_idx++] = INPUT_MAIN_MIC | OUTPUT_AP; } break; case AVSYS_AUDIO_PATH_EX_HEADSETMIC: - control->gain_status.capture |= GS_EARMIC_TO_AP; - control->path_status.capture |= PS_EARMIC_TO_AP; - cmd_gain[1] = INPUT_EAR_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[1] = INPUT_EAR_MIC | OUTPUT_AP; + cmd_gain[gain_idx++] = INPUT_EAR_MIC | OUTPUT_AP | GAIN_MODE; + cmd_path[path_idx++] = INPUT_EAR_MIC | OUTPUT_AP; break; case AVSYS_AUDIO_PATH_EX_BTMIC: - control->gain_status.capture |= GS_BTMIC_TO_AP; - control->path_status.capture |= PS_BTMIC_TO_AP; - cmd_gain[1] = INPUT_BT_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[1] = INPUT_BT_MIC | OUTPUT_AP; + cmd_gain[gain_idx++] = INPUT_BT_MIC | OUTPUT_AP | GAIN_MODE; + cmd_path[path_idx++] = INPUT_BT_MIC | OUTPUT_AP; break; case AVSYS_AUDIO_PATH_EX_HANDSFREE: @@ -1896,16 +1877,9 @@ static int __avsys_audio_path_set_ascn_videocall(avsys_audio_path_ex_info_t *con break; } - if((control->p_path_status.playback != control->path_status.playback) - || ((control->p_path_status.capture != control->path_status.capture)) || control->gain_debug_mode == 1) { - if(!skip_clear) { - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET)) - } - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 2, ASCN_RESET_NONE)) - control->p_gain_status = control->gain_status; /* both playback and capture */ - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 2, ASCN_RESET_NONE)) - control->p_path_status = control->path_status; /* both playback and capture */ - } + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET)); + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 2, ASCN_RESET_NONE)); + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 2, ASCN_RESET_NONE)); return AVSYS_STATE_SUCCESS; } @@ -1919,82 +1893,56 @@ static int __avsys_audio_path_set_ascn_fmradio(avsys_audio_path_ex_info_t *contr int skip_clear_record = 0; int gain_idx = 0; int path_idx = 0; - control->path_fixed = PATH_FIXED_WITH_FMRADIO; + + avsys_warning(AVAUDIO, "req gain playback [%x], control gain playback [%x]\n", + control->reqgain.playback, control->gain.playback); + avsys_warning(AVAUDIO, "req gain capture [%x], control gain capture [%x]\n", + control->reqgain.capture, control->gain.capture); + switch (control->path.playback) { case AVSYS_AUDIO_PATH_EX_NONE: - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - control->gain_status.playback = GS_FMRADIO_TO_SPK; - control->path_status.playback = PS_PATH_NONE; - cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK | GAIN_MODE; + avsys_warning(AVAUDIO, "[SZ] playback AVSYS_AUDIO_PATH_EX_NONE\n"); break; case AVSYS_AUDIO_PATH_EX_SPK: - if (control->option.playback & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE; - if (control->reqgain.playback == control->gain.playback) { - if (control->inserted != AVSYS_AUDIO_INSERTED_NONE) { - control->gain_status.playback = GS_FMRADIO_TO_HEADSET; - control->path_status.playback = PS_FMRADIO_TO_HEADSET; - cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_HEADSET | GAIN_MODE; - cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_HEADSET; - cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET; - } else { - control->gain_status.playback = GS_FMRADIO_TO_SPK; - control->path_status.playback = PS_FMRADIO_TO_SPK; - cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK | GAIN_MODE; - cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK; - cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK; - } - } else { - /* append ap playback sound path */ - control->path_status.playback = control->p_path_status.playback; - if (control->inserted != AVSYS_AUDIO_INSERTED_NONE) { - control->path_status.playback |= PS_AP_TO_HEADSET; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET; - cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET; - } else { - control->path_status.playback |= PS_AP_TO_SPK; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK; - } - skip_clear = 1; - } - } else { /* ear jack manual */ - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - if (control->reqgain.playback == control->gain.playback) { - control->gain_status.playback = GS_FMRADIO_TO_SPK; - control->path_status.playback = PS_FMRADIO_TO_SPK; - cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK | GAIN_MODE; - cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_STEREO_SPK; - cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK; - } else { - /* append ap playback sound path */ - control->path_status.playback = control->p_path_status.playback; - control->path_status.playback |= PS_AP_TO_SPK; - control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK; - skip_clear = 1; - } + if (control->reqgain.playback == control->gain.playback) { + avsys_warning(AVAUDIO, "req gain playback == control gain playback\n"); + cmd_gain[gain_idx++] = INPUT_AP | OUTPUT_STEREO_SPK | GAIN_MODE; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK; + } else { + avsys_warning(AVAUDIO, "req gain playback != control gain playback\n"); + /* append ap playback sound path */ + control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; + cmd_path[path_idx++] = INPUT_AP | OUTPUT_STEREO_SPK; + skip_clear = 1; } break; case AVSYS_AUDIO_PATH_EX_HEADSET: - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; if (control->reqgain.playback == control->gain.playback) { - control->gain_status.playback = GS_FMRADIO_TO_HEADSET; - control->path_status.playback = PS_FMRADIO_TO_HEADSET; - cmd_gain[gain_idx++] = INPUT_FMRADIO | OUTPUT_HEADSET | GAIN_MODE; - cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_HEADSET; + avsys_warning(AVAUDIO, "req gain playback == control gain playback\n"); + cmd_gain[gain_idx++] = INPUT_AP | OUTPUT_HEADSET | GAIN_MODE; cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET; } else { - /* append ap playback */ - control->path_status.playback = control->p_path_status.playback; - control->path_status.playback |= PS_AP_TO_HEADSET; + //append ap playback + avsys_warning(AVAUDIO, "req gain playback != control gain playback\n"); control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET; cmd_path[path_idx++] = INPUT_AP | OUTPUT_HEADSET; skip_clear = 1; } break; + + case AVSYS_AUDIO_PATH_EX_A2DP: + if (control->reqgain.playback == control->gain.playback) { + avsys_warning(AVAUDIO, "req gain playback == control gain playback\n"); + //control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; + } else { + avsys_warning(AVAUDIO, "req gain playback != control gain playback\n"); + control->lvol_dev_type = AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET; + skip_clear = 1; + } + break; + default: break; } @@ -2002,9 +1950,11 @@ static int __avsys_audio_path_set_ascn_fmradio(avsys_audio_path_ex_info_t *contr switch (control->path.capture) { case AVSYS_AUDIO_PATH_EX_FMINPUT: if (control->reqgain.capture == control->gain.capture) { - control->path_status.capture |= PS_FMRADIO_TO_AP; + avsys_warning(AVAUDIO, "req gain capture == control gain capture\n"); + cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_AP | GAIN_MODE; cmd_path[path_idx++] = INPUT_FMRADIO | OUTPUT_AP; if (control->reqgain.capture == control->pregain.capture) { + avsys_warning(AVAUDIO, "req gain capture == control pregain capture\n"); skip_clear_record = 1; } } @@ -2013,18 +1963,13 @@ static int __avsys_audio_path_set_ascn_fmradio(avsys_audio_path_ex_info_t *contr break; } - if((control->p_path_status.playback != control->path_status.playback) - || (control->p_path_status.capture != control->path_status.capture) || control->gain_debug_mode == 1) { - if (skip_clear_record) { - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET_PLAYBACK)) - } else if (!skip_clear) { - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET)) - } - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, gain_idx, ASCN_RESET_NONE)) - control->p_gain_status = control->gain_status; /* both playback & capture */ - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, path_idx, ASCN_RESET_NONE)) - control->p_path_status = control->path_status; /* both playback & capture */ + if (skip_clear_record) { + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET_PLAYBACK)) + } else if (!skip_clear) { + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_single_set(ASCN_STR_RESET)) } + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, gain_idx, ASCN_RESET_NONE)) + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, path_idx, ASCN_RESET_NONE)) return AVSYS_STATE_SUCCESS; } @@ -2038,56 +1983,20 @@ static int __avsys_audio_path_set_ascn_ap_capture(avsys_audio_path_ex_info_t *co control->path.capture, control->option.capture, control->gain.capture, control->inserted); switch(control->path.capture) { case AVSYS_AUDIO_PATH_EX_MIC: - if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_JACK_AUTO) { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITH_MUTE; - if (control->inserted == AVSYS_AUDIO_INSERTED_4) { - control->gain_status.capture = GS_EARMIC_TO_AP; - control->path_status.capture = PS_EARMIC_TO_AP; - cmd_gain[0] = INPUT_EAR_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[0] = INPUT_EAR_MIC | OUTPUT_AP; - } else { - if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) { - control->gain_status.capture = GS_SUBMIC_TO_AP; - control->path_status.capture = PS_SUBMIC_TO_AP; - cmd_gain[0] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[0] = INPUT_SUB_MIC | OUTPUT_AP; - } else if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_STEREOMIC) { - control->gain_status.capture = GS_STEREOMIC_TO_AP; - control->path_status.capture = PS_STEREOMIC_TO_AP; - cmd_gain[0] = INPUT_STEREO_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[0] = INPUT_STEREO_MIC | OUTPUT_AP; - } else { - control->gain_status.capture = GS_MAINMIC_TO_AP; - control->path_status.capture = PS_MAINMIC_TO_AP; - cmd_gain[0] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[0] = INPUT_MAIN_MIC | OUTPUT_AP; - } - } + control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE; + if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) { + cmd_gain[0] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE; + cmd_path[0] = INPUT_SUB_MIC | OUTPUT_AP; + } else if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_STEREOMIC) { + cmd_gain[0] = INPUT_STEREO_MIC | OUTPUT_AP | GAIN_MODE; + cmd_path[0] = INPUT_STEREO_MIC | OUTPUT_AP; } else { - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_AUTO_WITHOUT_MUTE; - if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_SUBMIC) { - control->gain_status.capture = GS_SUBMIC_TO_AP; - control->path_status.capture = PS_SUBMIC_TO_AP; - cmd_gain[0] = INPUT_SUB_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[0] = INPUT_SUB_MIC | OUTPUT_AP; - } else if (control->option.capture & AVSYS_AUDIO_PATH_OPTION_USE_STEREOMIC) { - control->gain_status.capture = GS_STEREOMIC_TO_AP; - control->path_status.capture = PS_STEREOMIC_TO_AP; - cmd_gain[0] = INPUT_STEREO_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[0] = INPUT_STEREO_MIC | OUTPUT_AP; - } else { - control->gain_status.capture = GS_MAINMIC_TO_AP; - control->path_status.capture = PS_MAINMIC_TO_AP; - cmd_gain[0] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE; - cmd_path[0] = INPUT_MAIN_MIC | OUTPUT_AP; - } + cmd_gain[0] = INPUT_MAIN_MIC | OUTPUT_AP | GAIN_MODE; + cmd_path[0] = INPUT_MAIN_MIC | OUTPUT_AP; } break; case AVSYS_AUDIO_PATH_EX_HEADSETMIC: - control->ear_auto = AVSYS_AUDIO_EAR_SWITCH_MANUAL; - control->gain_status.capture = GS_EARMIC_TO_AP; - control->path_status.capture = PS_EARMIC_TO_AP; cmd_gain[0] = INPUT_EAR_MIC | OUTPUT_AP | GAIN_MODE; cmd_path[0] = INPUT_EAR_MIC | OUTPUT_AP; break; @@ -2096,12 +2005,8 @@ static int __avsys_audio_path_set_ascn_ap_capture(avsys_audio_path_ex_info_t *co break; } - if ((control->p_path_status.capture != control->path_status.capture) || control->gain_debug_mode == 1) { - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 2, ASCN_RESET_CAPTURE)) - control->p_gain_status.capture = control->gain_status.capture; - RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 2, ASCN_RESET_NONE)) - control->p_path_status.capture = control->path_status.capture; - } + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_gain, 2, ASCN_RESET_CAPTURE)) + RET_IO_CTL_ERR_IF_FAIL(avsys_audio_ascn_bulk_set(cmd_path, 2, ASCN_RESET_NONE)) avsys_info (AVAUDIO, ">> leave"); @@ -2149,11 +2054,6 @@ static int __avsys_audio_path_set_hw_controls(avsys_audio_path_ex_info_t *contro } ptr->path_off = 0; out_device = control->lvol_dev_type; - if (control->path_status.playback == PS_PATH_NONE) { - ptr->path_off = 1; - avsys_warning(AVAUDIO, "Path off status...set logical volume device type to speaker\n"); - out_device = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - } avsys_audio_logical_volume_update_table(out_device, &ptr->gain_setting); avsys_audio_logical_volume_convert(&ptr->setting_vol, &ptr->working_vol, &ptr->gain_setting); } @@ -2182,7 +2082,7 @@ int avsys_audio_path_set_volume(int handle) avsys_audio_path_ex_info_t **temp = NULL; avsys_audio_handle_t *ptr = NULL; int err; - int gain_type; + int vol_conf, vol_conf_type; int out_device = AVSYS_AUDIO_DEVICE_TYPE_SPK; err = avsys_audio_handle_get_ptr(handle, &ptr, HANDLE_PTR_MODE_NORMAL); @@ -2202,82 +2102,26 @@ int avsys_audio_path_set_volume(int handle) else ptr->during_cp_audio = 0; - gain_type = ptr->gain_setting.vol_type; + vol_conf = ptr->gain_setting.volume_config; + vol_conf_type = AVSYS_AUDIO_VOLUME_CONFIG_TYPE(vol_conf); out_device = control->lvol_dev_type; - if (control->path_status.playback == PS_PATH_NONE) { - ptr->path_off = 1; - avsys_warning(AVAUDIO, "Path off status...set logical volume device type to speaker\n"); - out_device = AVSYS_AUDIO_LVOL_DEV_TYPE_SPK; - } avsys_assert(AVSYS_SUCCESS(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))); - avsys_warning(AVAUDIO, "set path volume : gain(%d), out_dev(%d)\n", gain_type, out_device); - err = avsys_audio_logical_volume_set_table(gain_type, out_device, &ptr->gain_setting); + avsys_warning(AVAUDIO, "set path volume : gain(%d), out_dev(%d)\n", vol_conf_type, out_device); + err = avsys_audio_logical_volume_set_table(vol_conf, out_device, &ptr->gain_setting); avsys_audio_handle_release_ptr(handle, HANDLE_PTR_MODE_NORMAL); return err; } int avsys_audio_path_set_route_policy(avsys_audio_route_policy_t route) { - avsys_audio_path_ex_info_t *control = NULL; - avsys_audio_path_ex_info_t **temp = NULL; - int err = AVSYS_STATE_SUCCESS; - - temp = &control; - avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))); - avsys_assert(control != NULL); - avsys_assert(AVSYS_SUCCESS(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))); - - control->route_policy = route; - - avsys_assert(AVSYS_SUCCESS(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))); - return err; + /* Deprecated */ + return 0; } int avsys_audio_path_get_route_policy(avsys_audio_route_policy_t *route) { - avsys_audio_path_ex_info_t *control = NULL; - avsys_audio_path_ex_info_t **temp = NULL; - int err = AVSYS_STATE_SUCCESS; - - if (!route) - return AVSYS_STATE_ERR_INVALID_PARAMETER; - - temp = &control; - avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))); - avsys_assert(control != NULL); - avsys_assert(AVSYS_SUCCESS(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))); - - *route = control->route_policy; - - avsys_assert(AVSYS_SUCCESS(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))); - return err; -} - -int avsys_audio_path_check_loud(bool *loud) -{ - avsys_audio_path_ex_info_t *control = NULL; - avsys_audio_path_ex_info_t **temp = NULL; - int err = AVSYS_STATE_SUCCESS; - - if (!loud) - return AVSYS_STATE_ERR_INVALID_PARAMETER; - - temp = &control; - avsys_assert(AVSYS_SUCCESS(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_PATH, (void **)temp))); - avsys_assert(control != NULL); - avsys_assert(AVSYS_SUCCESS(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))); - - if ((control->path_status.playback & PS_AP_TO_SPK) || - (control->path_status.playback & PS_AP_TO_RECV) || - (control->path_status.playback & PS_FMRADIO_TO_SPK)) { - *loud = true; - } else { - avsys_info(AVAUDIO, "playback path status 0x%x\n", control->path_status.playback); - *loud = false; - } - - avsys_assert(AVSYS_SUCCESS(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_PATH))); - return err; + /* Deprecated */ + return 0; } int avsys_audio_path_check_cp_audio(bool *cpaudio, bool *btpath) -- cgit v1.2.3