static int msm_pcm_prepare(struct snd_pcm_substream *substream) { int ret = 0; struct snd_pcm_runtime *runtime = substream->runtime; struct msm_voice *prtd = runtime->private_data; uint16_t session_id = 0; mutex_lock(&prtd->lock); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ret = msm_pcm_playback_prepare(substream); else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) ret = msm_pcm_capture_prepare(substream); if (prtd->playback_start && prtd->capture_start) { if (is_volte(prtd)) session_id = voc_get_session_id(VOLTE_SESSION_NAME); else if (is_sglte(prtd)) session_id = voc_get_session_id(SGLTE_SESSION_NAME); else session_id = voc_get_session_id(VOICE_SESSION_NAME); voc_start_voice_call(session_id); } mutex_unlock(&prtd->lock); return ret; }
static int msm_pcm_close(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct msm_voice *prtd = runtime->private_data; uint16_t session_id = 0; int ret = 0; mutex_lock(&prtd->lock); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ret = msm_pcm_playback_close(substream); else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) ret = msm_pcm_capture_close(substream); prtd->instance--; if (!prtd->playback_start && !prtd->capture_start) { pr_debug("end voice call\n"); if (is_volte(prtd)) session_id = voc_get_session_id(VOLTE_SESSION_NAME); else if (is_voice2(prtd)) session_id = voc_get_session_id(VOICE2_SESSION_NAME); else session_id = voc_get_session_id(VOICE_SESSION_NAME); voc_end_voice_call(session_id); } mutex_unlock(&prtd->lock); return ret; }
static uint32_t get_session_id(struct msm_voice *pvoc) { uint32_t session_id = 0; if (is_volte(pvoc)) session_id = voc_get_session_id(VOLTE_SESSION_NAME); else if (is_voice2(pvoc)) session_id = voc_get_session_id(VOICE2_SESSION_NAME); else session_id = voc_get_session_id(VOICE_SESSION_NAME); return session_id; }
static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { int ret = 0; struct snd_pcm_runtime *runtime = substream->runtime; struct msm_voice *prtd = runtime->private_data; uint16_t session_id = 0; pr_debug("%s: cmd = %d\n", __func__, cmd); if (is_volte(prtd)) session_id = voc_get_session_id(VOLTE_SESSION_NAME); else if (is_voice2(prtd)) session_id = voc_get_session_id(VOICE2_SESSION_NAME); else session_id = voc_get_session_id(VOICE_SESSION_NAME); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_STOP: pr_debug("Start & Stop Voice call not handled in Trigger.\n"); break; case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: pr_debug("%s: resume call session_id = %d\n", __func__, session_id); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ret = msm_pcm_playback_prepare(substream); else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) ret = msm_pcm_capture_prepare(substream); if (prtd->playback_start && prtd->capture_start) voc_resume_voice_call(session_id); break; case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: pr_debug("%s: pause call session_id=%d\n", __func__, session_id); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { if (prtd->playback_start) prtd->playback_start = 0; } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { if (prtd->capture_start) prtd->capture_start = 0; } voc_standby_voice_call(session_id); break; default: ret = -EINVAL; break; } return ret; }