static int msm_route_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; int enc_freq = 0; int requested_freq = 0; struct msm_audio_route_config route_cfg; struct msm_snddev_info *dev_info; int session_id = ucontrol->value.integer.value[0]; int set = ucontrol->value.integer.value[2]; u64 session_mask = 0; route_cfg.dev_id = ucontrol->value.integer.value[1]; if (ucontrol->id.numid == 2) route_cfg.stream_type = AUDIO_ROUTE_STREAM_PLAYBACK; else route_cfg.stream_type = AUDIO_ROUTE_STREAM_REC; pr_debug("%s:route cfg %d %d type for popp %d\n", __func__, route_cfg.dev_id, route_cfg.stream_type, session_id); dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { pr_err("%s:pass invalid dev_id\n", __func__); rc = PTR_ERR(dev_info); return rc; } if (route_cfg.stream_type == AUDIO_ROUTE_STREAM_PLAYBACK) { rc = msm_snddev_set_dec(session_id, dev_info->copp_id, set, dev_info->sample_rate, dev_info->channel_mode); session_mask = (((u64)0x1) << session_id) << (MAX_BIT_PER_CLIENT * \ ((int)AUDDEV_CLNT_DEC-1)); if (!set) { if (dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, session_mask); dev_info->sessions &= ~(session_mask); } else { dev_info->sessions = dev_info->sessions | session_mask; if (dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, session_mask); } } else { rc = msm_snddev_set_enc(session_id, dev_info->copp_id, set, dev_info->sample_rate, dev_info->channel_mode); session_mask = (((u64)0x1) << session_id) << (MAX_BIT_PER_CLIENT * \ ((int)AUDDEV_CLNT_ENC-1)); if (!set) { if (dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, session_mask); dev_info->sessions &= ~(session_mask); } else { dev_info->sessions = dev_info->sessions | session_mask; enc_freq = msm_snddev_get_enc_freq(session_id); requested_freq = enc_freq; if (enc_freq > 0) { rc = msm_snddev_request_freq(&enc_freq, session_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); pr_debug("%s:sample rate configured %d\ sample rate requested %d \n", __func__, enc_freq, requested_freq); if ((rc <= 0) || (enc_freq != requested_freq)) { pr_debug("%s:msm_snddev_withdraw_freq\n", __func__); rc = msm_snddev_withdraw_freq (session_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); broadcast_event(AUDDEV_EVT_FREQ_CHG, route_cfg.dev_id, SESSION_IGNORE); } } if (dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, session_mask); } } if (rc < 0) { pr_err("%s:device could not be assigned!\n", __func__); return -EFAULT; } return rc; }
static int msm_route_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; int enc_freq = 0; int requested_freq = 0; struct msm_audio_route_config route_cfg; struct msm_snddev_info *dev_info; int session_id = ucontrol->value.integer.value[0]; int set = ucontrol->value.integer.value[2]; u32 session_mask = 0; route_cfg.dev_id = ucontrol->value.integer.value[1]; pr_aud_info("[ALSA] msm_route_stream: session %d, dev %d, enable %d\n", session_id, route_cfg.dev_id, set); if (ucontrol->id.numid == 2) route_cfg.stream_type = AUDIO_ROUTE_STREAM_PLAYBACK; else route_cfg.stream_type = AUDIO_ROUTE_STREAM_REC; MM_DBG("route cfg %d %d type for popp %d\n", route_cfg.dev_id, route_cfg.stream_type, session_id); dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { MM_AUD_ERR("pass invalid dev_id\n"); rc = PTR_ERR(dev_info); return rc; } if (route_cfg.stream_type == AUDIO_ROUTE_STREAM_PLAYBACK) { rc = msm_snddev_set_dec(session_id, dev_info->copp_id, set); session_mask = (0x1 << (session_id) << (8 * ((int)AUDDEV_CLNT_DEC-1))); if (!set) { if (dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, session_mask); dev_info->sessions &= ~(session_mask); } else { dev_info->sessions = dev_info->sessions | session_mask; if (dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, session_mask); } } else { rc = msm_snddev_set_enc(session_id, dev_info->copp_id, set); session_mask = (0x1 << (session_id)) << (8 * ((int)AUDDEV_CLNT_ENC-1)); if (!set) { if (dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, session_mask); dev_info->sessions &= ~(session_mask); } else { dev_info->sessions = dev_info->sessions | session_mask; enc_freq = msm_snddev_get_enc_freq(session_id); requested_freq = enc_freq; if (enc_freq > 0) { rc = msm_snddev_request_freq(&enc_freq, session_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); MM_DBG("sample rate configured %d" "sample rate requested %d \n", enc_freq, requested_freq); if ((rc <= 0) || (enc_freq != requested_freq)) { MM_DBG("msm_snddev_withdraw_freq\n"); rc = msm_snddev_withdraw_freq (session_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); broadcast_event(AUDDEV_EVT_FREQ_CHG, route_cfg.dev_id, SESSION_IGNORE); } } if (dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, session_mask); } } if (rc < 0) { MM_AUD_ERR("device could not be assigned!\n"); return -EFAULT; } return rc; }
static int msm_route_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0; int enc_freq = 0; int requested_freq = 0; struct msm_audio_route_config route_cfg; struct msm_snddev_info *dev_info; int session_id = ucontrol->value.integer.value[0]; int set = ucontrol->value.integer.value[2]; u32 session_mask = 0; route_cfg.dev_id = ucontrol->value.integer.value[1]; if (ucontrol->id.numid == 2) route_cfg.stream_type = AUDIO_ROUTE_STREAM_PLAYBACK; else route_cfg.stream_type = AUDIO_ROUTE_STREAM_REC; dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); if (IS_ERR(dev_info)) { MM_ERR("pass invalid dev_id\n"); rc = PTR_ERR(dev_info); return rc; } if (route_cfg.stream_type == AUDIO_ROUTE_STREAM_PLAYBACK) { rc = msm_snddev_set_dec(session_id, dev_info->copp_id, set); session_mask = (0x1 << (session_id) << (8 * ((int)AUDDEV_CLNT_DEC-1))); if (!set) { if (dev_info->opened) { broadcast_event(AUDDEV_EVT_REL_PENDING, route_cfg.dev_id, session_mask); broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, session_mask); } dev_info->sessions &= ~(session_mask); } else { dev_info->sessions = dev_info->sessions | session_mask; if (dev_info->opened) { broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, session_mask); /* Event to notify client for device info */ broadcast_event(AUDDEV_EVT_DEVICE_INFO, route_cfg.dev_id, session_mask); } } } else { rc = msm_snddev_set_enc(session_id, dev_info->copp_id, set); session_mask = (0x1 << (session_id)) << (8 * ((int)AUDDEV_CLNT_ENC-1)); if (!set) { if (dev_info->opened) broadcast_event(AUDDEV_EVT_DEV_RLS, route_cfg.dev_id, session_mask); dev_info->sessions &= ~(session_mask); } else { dev_info->sessions = dev_info->sessions | session_mask; enc_freq = msm_snddev_get_enc_freq(session_id); requested_freq = enc_freq; if (enc_freq > 0) { rc = msm_snddev_request_freq(&enc_freq, session_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); if ((rc <= 0) || (enc_freq != requested_freq)) { rc = msm_snddev_withdraw_freq (session_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); broadcast_event(AUDDEV_EVT_FREQ_CHG, route_cfg.dev_id, SESSION_IGNORE); } } if (dev_info->opened) { broadcast_event(AUDDEV_EVT_DEV_RDY, route_cfg.dev_id, session_mask); /* Event to notify client for device info */ broadcast_event(AUDDEV_EVT_DEVICE_INFO, route_cfg.dev_id, session_mask); } } } if (rc < 0) { MM_ERR("device could not be assigned!\n"); return -EFAULT; } return rc; }