static int msm_voice_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; uint32_t rx_dev_id; uint32_t tx_dev_id; struct msm_snddev_info *rx_dev_info; struct msm_snddev_info *tx_dev_info; int set = ucontrol->value.integer.value[2]; u32 session_mask; int i = 0, j = 0; struct snddev_icodec_state *icodec; struct adie_codec_hwsetting_entry *rx_entry; struct adie_codec_hwsetting_entry *tx_entry; struct timespec ts; struct rtc_time tm; /* if (!set) return -EPERM; */ pr_aud_info("[ALSA] msm_route_voice: " "tx %d, rx %d, set %d\n", (int) ucontrol->value.integer.value[1], (int) ucontrol->value.integer.value[0], set); if (set) { getnstimeofday(&ts); rtc_time_to_tm(ts.tv_sec, &tm); pr_aud_info1("[ATS][phonecall_start][successful] at %lld (%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n", ktime_to_ns(ktime_get()), tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec); } else { getnstimeofday(&ts); rtc_time_to_tm(ts.tv_sec, &tm); pr_aud_info1("[ATS][phonecall_end][successful] at %lld (%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n", ktime_to_ns(ktime_get()), tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec); } /* Rx Device Routing */ rx_dev_id = ucontrol->value.integer.value[0]; rx_dev_info = audio_dev_ctrl_find_dev(rx_dev_id); if (IS_ERR(rx_dev_info)) { MM_AUD_ERR("pass invalid dev_id\n"); rc = PTR_ERR(rx_dev_info); return rc; } if (!(rx_dev_info->capability & SNDDEV_CAP_RX)) { MM_AUD_ERR("First Dev is supposed to be RX\n"); return -EFAULT; } MM_DBG("route cfg %d STREAM_VOICE_RX type\n", rx_dev_id); /* replace with Rx voice/media setting for adie */ if (rx_dev_info->acdb_id != 10 && (rx_dev_info->acdb_id < 1000)) { icodec = (struct snddev_icodec_state *)rx_dev_info->private_data; rx_entry = icodec->data->profile->settings; j = icodec->data->profile->setting_sz; if (set) { for (i = 0; i < j; i++) if (rx_entry[i].voc_action != NULL) { rx_entry[i].actions = rx_entry[i].voc_action; rx_entry[i].action_sz = rx_entry[i].voc_action_sz; } } else { for (i = 0; i < j; i++) if (rx_entry[i].midi_action != NULL) { rx_entry[i].actions = rx_entry[i].midi_action; rx_entry[i].action_sz = rx_entry[i].midi_action_sz; } } } msm_set_voc_route(rx_dev_info, AUDIO_ROUTE_STREAM_VOICE_RX, rx_dev_id); session_mask = 0x1 << (8 * ((int)AUDDEV_CLNT_VOC-1)); /* Tx Device Routing */ tx_dev_id = ucontrol->value.integer.value[1]; tx_dev_info = audio_dev_ctrl_find_dev(tx_dev_id); if (IS_ERR(tx_dev_info)) { MM_AUD_ERR("pass invalid dev_id\n"); rc = PTR_ERR(tx_dev_info); return rc; } if (!(tx_dev_info->capability & SNDDEV_CAP_TX)) { MM_AUD_ERR("Second Dev is supposed to be Tx\n"); return -EFAULT; } MM_DBG("route cfg %d %d type\n", tx_dev_id, AUDIO_ROUTE_STREAM_VOICE_TX); /* replace with Tx voice/media setting for adie */ if (tx_dev_info->acdb_id != 9 && (tx_dev_info->acdb_id < 1000)) { icodec = (struct snddev_icodec_state *)tx_dev_info->private_data; tx_entry = icodec->data->profile->settings; j = icodec->data->profile->setting_sz; if (set) { for (i = 0; i < j; i++) if (tx_entry[i].voc_action != NULL) { tx_entry[i].actions = tx_entry[i].voc_action; tx_entry[i].action_sz = tx_entry[i].voc_action_sz; } } else { for (i = 0; i < j; i++) if (tx_entry[i].midi_action != NULL) { tx_entry[i].actions = tx_entry[i].midi_action; tx_entry[i].action_sz = tx_entry[i].midi_action_sz; } } } msm_set_voc_route(tx_dev_info, AUDIO_ROUTE_STREAM_VOICE_TX, tx_dev_id); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, tx_dev_id, session_mask); if (set) { if (rx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, rx_dev_id, session_mask); if (tx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, tx_dev_id, session_mask); } return rc; }
static int msm_voice_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; uint32_t rx_dev_id; uint32_t tx_dev_id; struct msm_snddev_info *rx_dev_info; struct msm_snddev_info *tx_dev_info; int set = ucontrol->value.integer.value[2]; u64 session_mask; if (!set) return -EPERM; /* Rx Device Routing */ rx_dev_id = ucontrol->value.integer.value[0]; rx_dev_info = audio_dev_ctrl_find_dev(rx_dev_id); if (IS_ERR(rx_dev_info)) { pr_err("%s:pass invalid dev_id\n", __func__); rc = PTR_ERR(rx_dev_info); return rc; } if (!(rx_dev_info->capability & SNDDEV_CAP_RX)) { pr_err("%s:First Dev is supposed to be RX\n", __func__); return -EFAULT; } pr_debug("%s:route cfg %d STREAM_VOICE_RX type\n", __func__, rx_dev_id); msm_set_voc_route(rx_dev_info, AUDIO_ROUTE_STREAM_VOICE_RX, rx_dev_id); session_mask = ((u64)0x1) << (MAX_BIT_PER_CLIENT * \ ((int)AUDDEV_CLNT_VOC-1)); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, rx_dev_id, session_mask); /* Tx Device Routing */ tx_dev_id = ucontrol->value.integer.value[1]; tx_dev_info = audio_dev_ctrl_find_dev(tx_dev_id); if (IS_ERR(tx_dev_info)) { pr_err("%s:pass invalid dev_id\n", __func__); rc = PTR_ERR(tx_dev_info); return rc; } if (!(tx_dev_info->capability & SNDDEV_CAP_TX)) { pr_err("%s:Second Dev is supposed to be Tx\n", __func__); return -EFAULT; } pr_debug("%s:route cfg %d %d type\n", __func__, tx_dev_id, AUDIO_ROUTE_STREAM_VOICE_TX); msm_set_voc_route(tx_dev_info, AUDIO_ROUTE_STREAM_VOICE_TX, tx_dev_id); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, tx_dev_id, session_mask); if (rx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, rx_dev_id, session_mask); if (tx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, tx_dev_id, session_mask); return rc; }
static int msm_voice_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; uint32_t rx_dev_id; uint32_t tx_dev_id; struct msm_snddev_info *rx_dev_info; struct msm_snddev_info *tx_dev_info; int set = ucontrol->value.integer.value[2]; u64 session_mask; int i = 0, j = 0; struct snddev_icodec_state *icodec; struct adie_codec_hwsetting_entry *rx_entry; struct adie_codec_hwsetting_entry *tx_entry; /* if (!set) return -EPERM; */ pr_aud_info("[ALSA] msm_route_voice: " "tx %d, rx %d, set %d\n", (int) ucontrol->value.integer.value[1], (int) ucontrol->value.integer.value[0], set); /* Rx Device Routing */ rx_dev_id = ucontrol->value.integer.value[0]; rx_dev_info = audio_dev_ctrl_find_dev(rx_dev_id); if (IS_ERR(rx_dev_info)) { MM_AUD_ERR("pass invalid dev_id\n"); rc = PTR_ERR(rx_dev_info); return rc; } if (!(rx_dev_info->capability & SNDDEV_CAP_RX)) { MM_AUD_ERR("First Dev is supposed to be RX\n"); return -EFAULT; } MM_DBG("route cfg %d STREAM_VOICE_RX type\n", rx_dev_id); /* replace with Rx voice/media setting for adie */ /* only for internal codec */ if (rx_dev_info->copp_id == PRIMARY_I2S_RX) { icodec = (struct snddev_icodec_state *)rx_dev_info->private_data; rx_entry = icodec->data->profile->settings; j = icodec->data->profile->setting_sz; if (set) { for (i = 0; i < j; i++) if (rx_entry[i].voc_action != NULL) { rx_entry[i].actions = rx_entry[i].voc_action; rx_entry[i].action_sz = rx_entry[i].voc_action_sz; } } else { for (i = 0; i < j; i++) if (rx_entry[i].midi_action != NULL) { rx_entry[i].actions = rx_entry[i].midi_action; rx_entry[i].action_sz = rx_entry[i].midi_action_sz; } } } msm_set_voc_route(rx_dev_info, AUDIO_ROUTE_STREAM_VOICE_RX, rx_dev_id); session_mask = ((u64)0x1) << (MAX_BIT_PER_CLIENT * \ ((int)AUDDEV_CLNT_VOC-1)); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, rx_dev_id, session_mask); /* Tx Device Routing */ tx_dev_id = ucontrol->value.integer.value[1]; tx_dev_info = audio_dev_ctrl_find_dev(tx_dev_id); if (IS_ERR(tx_dev_info)) { MM_AUD_ERR("pass invalid dev_id\n"); rc = PTR_ERR(tx_dev_info); return rc; } if (!(tx_dev_info->capability & SNDDEV_CAP_TX)) { MM_AUD_ERR("Second Dev is supposed to be Tx\n"); return -EFAULT; } MM_DBG("route cfg %d %d type\n", tx_dev_id, AUDIO_ROUTE_STREAM_VOICE_TX); /* replace with Tx voice/media setting for adie */ /* only for internal codec */ if (tx_dev_info->copp_id == PRIMARY_I2S_TX) { icodec = (struct snddev_icodec_state *)tx_dev_info->private_data; tx_entry = icodec->data->profile->settings; j = icodec->data->profile->setting_sz; if (set) { for (i = 0; i < j; i++) if (tx_entry[i].voc_action != NULL) { tx_entry[i].actions = tx_entry[i].voc_action; tx_entry[i].action_sz = tx_entry[i].voc_action_sz; } } else { for (i = 0; i < j; i++) if (tx_entry[i].midi_action != NULL) { tx_entry[i].actions = tx_entry[i].midi_action; tx_entry[i].action_sz = tx_entry[i].midi_action_sz; } } } msm_set_voc_route(tx_dev_info, AUDIO_ROUTE_STREAM_VOICE_TX, tx_dev_id); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, tx_dev_id, session_mask); if (set) { if (rx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, rx_dev_id, session_mask); if (tx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, tx_dev_id, session_mask); } return rc; }
static int msm_voice_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; uint32_t rx_dev_id; uint32_t tx_dev_id; struct msm_snddev_info *rx_dev_info; struct msm_snddev_info *tx_dev_info; int set = ucontrol->value.integer.value[2]; u32 session_mask; if (!set) return -EPERM; /* Rx Device Routing */ rx_dev_id = ucontrol->value.integer.value[0]; rx_dev_info = audio_dev_ctrl_find_dev(rx_dev_id); if (IS_ERR(rx_dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(rx_dev_info); return rc; } if (!(rx_dev_info->capability & SNDDEV_CAP_RX)) { MM_ERR("First Dev is supposed to be RX\n"); return -EFAULT; } msm_set_voc_route(rx_dev_info, AUDIO_ROUTE_STREAM_VOICE_RX, rx_dev_id); session_mask = 0x1 << (8 * ((int)AUDDEV_CLNT_VOC-1)); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, rx_dev_id, session_mask); /* Tx Device Routing */ tx_dev_id = ucontrol->value.integer.value[1]; if (sound_logging) pr_info("sound_logging: msm_voice_put() tx_dev_id:%Lu rx_dev_id:%Lu \n", (long long unsigned int) tx_dev_id, (long long unsigned int) rx_dev_id); // replace headset mic with speakerphone mic if (headset_mic_switch && tx_dev_id == 3) tx_dev_id = 12; // replace speaker_dual_mic_broadside_tx dev_id:12 with speaker_mono_tx (10) /*if (speakerphone_echo_fix && tx_dev_id == 12) tx_dev_id = 10;*/ // probably not needed in official 2.3 tx_dev_info = audio_dev_ctrl_find_dev(tx_dev_id); if (IS_ERR(tx_dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(tx_dev_info); return rc; } if (!(tx_dev_info->capability & SNDDEV_CAP_TX)) { MM_ERR("Second Dev is supposed to be Tx\n"); return -EFAULT; } msm_set_voc_route(tx_dev_info, AUDIO_ROUTE_STREAM_VOICE_TX, tx_dev_id); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, tx_dev_id, session_mask); if (rx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, rx_dev_id, session_mask); if (tx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, tx_dev_id, session_mask); return rc; }
static int msm_voice_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; uint32_t rx_dev_id; uint32_t tx_dev_id; struct msm_snddev_info *rx_dev_info; struct msm_snddev_info *tx_dev_info; int set = ucontrol->value.integer.value[2]; u32 session_mask; if (!set) return -EPERM; rx_dev_id = ucontrol->value.integer.value[0]; rx_dev_info = audio_dev_ctrl_find_dev(rx_dev_id); if (IS_ERR(rx_dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(rx_dev_info); return rc; } if (!(rx_dev_info->capability & SNDDEV_CAP_RX)) { MM_ERR("First Dev is supposed to be RX\n"); return -EFAULT; } MM_DBG("route cfg %d STREAM_VOICE_RX type\n", rx_dev_id); msm_set_voc_route(rx_dev_info, AUDIO_ROUTE_STREAM_VOICE_RX, rx_dev_id); session_mask = 0x1 << (8 * ((int)AUDDEV_CLNT_VOC-1)); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, rx_dev_id, session_mask); tx_dev_id = ucontrol->value.integer.value[1]; tx_dev_info = audio_dev_ctrl_find_dev(tx_dev_id); if (IS_ERR(tx_dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(tx_dev_info); return rc; } if (!(tx_dev_info->capability & SNDDEV_CAP_TX)) { MM_ERR("Second Dev is supposed to be Tx\n"); return -EFAULT; } MM_DBG("route cfg %d %d type\n", tx_dev_id, AUDIO_ROUTE_STREAM_VOICE_TX); msm_set_voc_route(tx_dev_info, AUDIO_ROUTE_STREAM_VOICE_TX, tx_dev_id); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, tx_dev_id, session_mask); if (rx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, rx_dev_id, session_mask); if (tx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, tx_dev_id, session_mask); return rc; }
static int msm_voice_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; uint32_t rx_dev_id; uint32_t tx_dev_id; struct msm_snddev_info *rx_dev_info; struct msm_snddev_info *tx_dev_info; int set = ucontrol->value.integer.value[2]; u32 session_mask; if (!set) return -EPERM; /* Rx Device Routing */ rx_dev_id = ucontrol->value.integer.value[0]; rx_dev_info = audio_dev_ctrl_find_dev(rx_dev_id); if (IS_ERR(rx_dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(rx_dev_info); return rc; } if (!(rx_dev_info->capability & SNDDEV_CAP_RX)) { MM_ERR("First Dev is supposed to be RX\n"); return -EFAULT; } msm_set_voc_route(rx_dev_info, AUDIO_ROUTE_STREAM_VOICE_RX, rx_dev_id); session_mask = 0x1 << (8 * ((int)AUDDEV_CLNT_VOC-1)); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, rx_dev_id, session_mask); /* Tx Device Routing */ tx_dev_id = ucontrol->value.integer.value[1]; if (tx_dev_id == 3) { // Not sure if this is needed, but it works :) pr_info("ksatta: msm_voice_put() tx_dev_id is 3 (headset mic), changing to 10(speakerphone mic)."); tx_dev_id = 10; } tx_dev_info = audio_dev_ctrl_find_dev(tx_dev_id); if (IS_ERR(tx_dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(tx_dev_info); return rc; } if (!(tx_dev_info->capability & SNDDEV_CAP_TX)) { MM_ERR("Second Dev is supposed to be Tx\n"); return -EFAULT; } //pr_info("ksatta: msm_voice_put() tx_dev_id:%Lu rx_dev_id:%Lu \n", (long long unsigned int) tx_dev_id, (long long unsigned int) rx_dev_id); msm_set_voc_route(tx_dev_info, AUDIO_ROUTE_STREAM_VOICE_TX, tx_dev_id); broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, tx_dev_id, session_mask); if (rx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, rx_dev_id, session_mask); if (tx_dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, tx_dev_id, session_mask); return rc; }