summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorSurendar karka <sukark@codeaurora.org>2016-05-02 20:46:21 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2016-07-08 14:19:04 -0700
commite99fd10322e24444e94b19b642acf48f354238cc (patch)
treed0fc3b5cd53313e4b156b44d5fcdff5189a96b3f /sound
parent1f1574bb1837ce7ee0bf24c40a178cdcbf2932da (diff)
ASoC: msm: Implementing Tx mute in ASM loopback
Adding TX Mute functionality in ASM Loopback. ASM loopback in the TX session uses Multimedia6, applying mute/ummute asm commands on Multimedia6. CRs-Fixed: 995988 Change-Id: I4caa5964f4fc774e33d9666f89b896f15e160943 Signed-off-by: Surendar karka <sukark@codeaurora.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c
index 30cdda80019c..3c75e30fb419 100644
--- a/sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c
@@ -109,6 +109,47 @@ static void msm_pcm_loopback_event_handler(uint32_t opcode, uint32_t token,
}
}
+static int msm_loopback_session_mute_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ int ret = 0, n = 0;
+ int mute = ucontrol->value.integer.value[0];
+ struct msm_pcm_loopback *pcm = NULL;
+
+ if ((mute < 0) || (mute > 1)) {
+ pr_err(" %s Invalid arguments", __func__);
+ ret = -EINVAL;
+ goto done;
+ }
+
+ pr_debug("%s: mute=%d\n", __func__, mute);
+
+ for (n = 0; n < LOOPBACK_SESSION_MAX; n++) {
+ if (!strcmp(session_map[n].stream_name, "MultiMedia6"))
+ pcm = session_map[n].loopback_priv;
+ }
+ if (pcm && pcm->audio_client) {
+ ret = q6asm_set_mute(pcm->audio_client, mute);
+ if (ret < 0)
+ pr_err("%s: Send mute command failed rc=%d\n",
+ __func__, ret);
+ }
+done:
+ return ret;
+}
+
+static struct snd_kcontrol_new msm_loopback_controls[] = {
+ SOC_SINGLE_EXT("HFP TX Mute", SND_SOC_NOPM, 0, 1, 0,
+ NULL, msm_loopback_session_mute_put),
+};
+
+static int msm_pcm_loopback_probe(struct snd_soc_platform *platform)
+{
+ snd_soc_add_platform_controls(platform, msm_loopback_controls,
+ ARRAY_SIZE(msm_loopback_controls));
+
+ return 0;
+}
static int pcm_loopback_set_volume(struct msm_pcm_loopback *prtd, int volume)
{
int rc = -EINVAL;
@@ -462,6 +503,7 @@ static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd)
static struct snd_soc_platform_driver msm_soc_platform = {
.ops = &msm_pcm_ops,
.pcm_new = msm_asoc_pcm_new,
+ .probe = msm_pcm_loopback_probe,
};
static int msm_pcm_probe(struct platform_device *pdev)