14765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* alsa_default.cpp
24765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev **
34765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** Copyright 2009 Wind River Systems
44765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
54765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev **
64765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** Licensed under the Apache License, Version 2.0 (the "License");
74765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** you may not use this file except in compliance with the License.
84765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** You may obtain a copy of the License at
94765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev **
104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev **     http://www.apache.org/licenses/LICENSE-2.0
114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev **
124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** Unless required by applicable law or agreed to in writing, software
134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** distributed under the License is distributed on an "AS IS" BASIS,
144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** See the License for the specific language governing permissions and
164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** limitations under the License.
174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */
184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
199746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#define LOG_TAG "ALSAModule"
204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev//#define LOG_NDEBUG 0
219746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#define LOG_NDDEBUG 0
224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <utils/Log.h>
234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <cutils/properties.h>
244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <linux/ioctl.h>
25b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani#include "AudioUtil.h"
264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include "AudioHardwareALSA.h"
274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <media/AudioRecord.h>
285ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#include <dlfcn.h>
299746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED
304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevextern "C" {
315ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic int (*csd_disable_device)();
325ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic int (*csd_enable_device)(int, int, uint32_t);
335ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic int (*csd_volume)(int);
345ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic int (*csd_mic_mute)(int);
355ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic int (*csd_wide_voice)(uint8_t);
365ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic int (*csd_slow_talk)(uint8_t);
375ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic int (*csd_fens)(uint8_t);
385ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic int (*csd_start_voice)();
395ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic int (*csd_stop_voice)();
404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
414113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif
424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#ifndef ALSA_DEFAULT_SAMPLE_RATE
444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define ALSA_DEFAULT_SAMPLE_RATE 44100 // in Hz
454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define BTSCO_RATE_16KHZ 16000
484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define USECASE_TYPE_RX 1
494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define USECASE_TYPE_TX 2
50b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani#define MAX_HDMI_CHANNEL_CNT 6
514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevnamespace android_audio_legacy
534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int      s_device_open(const hw_module_t*, const char*, hw_device_t**);
564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int      s_device_close(hw_device_t*);
574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_init(alsa_device_t *, ALSAHandleList &);
584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_open(alsa_handle_t *);
594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_close(alsa_handle_t *);
604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_standby(alsa_handle_t *);
614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_route(alsa_handle_t *, uint32_t, int);
624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_voice_call(alsa_handle_t *);
634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_voip_call(alsa_handle_t *);
644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_fm(alsa_handle_t *);
654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_voice_volume(int);
664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_voip_volume(int);
674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_mic_mute(int);
684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_voip_mic_mute(int);
694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_voip_config(int, int);
704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_fm_vol(int);
714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_btsco_rate(int);
724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_lpa_vol(int);
734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_enable_wide_voice(bool flag);
744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_enable_fens(bool flag);
754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_flags(uint32_t flags);
764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_compressed_vol(int);
774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_enable_slow_talk(bool flag);
784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_voc_rec_mode(uint8_t mode);
794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_volte_mic_mute(int state);
804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void     s_set_volte_volume(int vol);
811c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.leestatic bool     s_is_tmus();
8274060dee8c9a414ad0345176e2422de18a4ff183ty.lee#ifdef SEPERATED_AUDIO_INPUT
8374060dee8c9a414ad0345176e2422de18a4ff183ty.leestatic void     s_setInput(int);
8474060dee8c9a414ad0345176e2422de18a4ff183ty.lee
8574060dee8c9a414ad0345176e2422de18a4ff183ty.leestatic int input_source;
8674060dee8c9a414ad0345176e2422de18a4ff183ty.lee#endif
871c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.leestatic int mccmnc;
885ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#ifdef QCOM_CSDCLIENT_ENABLED
895ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic void     s_set_csd_handle(void*);
905ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#endif
914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char mic_type[25];
934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char curRxUCMDevice[50];
944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char curTxUCMDevice[50];
954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int fluence_mode;
964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int fmVolume;
97924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee#ifdef USES_FLUENCE_INCALL
98924f79851aaa4eebe593a456203d1c39d3c53d73ty.leestatic uint32_t mDevSettingsFlag = TTY_OFF | DMIC_FLAG;
99924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee#else
1004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic uint32_t mDevSettingsFlag = TTY_OFF;
101924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee#endif
1024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int btsco_samplerate = 8000;
1034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic ALSAUseCaseList mUseCaseList;
1045ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic void *csd_handle;
1054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic hw_module_methods_t s_module_methods = {
1074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    open            : s_device_open
1084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
1094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1105ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Maniextern "C" {
1115ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manihw_module_t HAL_MODULE_INFO_SYM = {
1124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    tag             : HARDWARE_MODULE_TAG,
1134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    version_major   : 1,
1144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    version_minor   : 0,
1154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    id              : ALSA_HARDWARE_MODULE_ID,
1164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    name            : "QCOM ALSA module",
1174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    author          : "QuIC Inc",
1184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    methods         : &s_module_methods,
1194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dso             : 0,
1204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    reserved        : {0,},
1214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
1225ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani}
1234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int s_device_open(const hw_module_t* module, const char* name,
1254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        hw_device_t** device)
1264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char value[128];
1284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    alsa_device_t *dev;
1294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev = (alsa_device_t *) malloc(sizeof(*dev));
1304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!dev) return -ENOMEM;
1314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    memset(dev, 0, sizeof(*dev));
1334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    /* initialize the procs */
1354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->common.tag = HARDWARE_DEVICE_TAG;
1364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->common.version = 0;
1374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->common.module = (hw_module_t *) module;
1384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->common.close = s_device_close;
1394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->init = s_init;
1404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->open = s_open;
1414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->close = s_close;
1424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->route = s_route;
1434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->standby = s_standby;
1444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->startVoiceCall = s_start_voice_call;
1454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->startVoipCall = s_start_voip_call;
1464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->startFm = s_start_fm;
1474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setVoiceVolume = s_set_voice_volume;
1484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setVoipVolume = s_set_voip_volume;
1494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setMicMute = s_set_mic_mute;
1504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setVoipMicMute = s_set_voip_mic_mute;
1514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setVoipConfig = s_set_voip_config;
1524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setFmVolume = s_set_fm_vol;
1534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setBtscoRate = s_set_btsco_rate;
1544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setLpaVolume = s_set_lpa_vol;
1554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->enableWideVoice = s_enable_wide_voice;
1564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->enableFENS = s_enable_fens;
1574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setFlags = s_set_flags;
1584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setCompressedVolume = s_set_compressed_vol;
1594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->enableSlowTalk = s_enable_slow_talk;
1604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setVocRecMode = s_set_voc_rec_mode;
1614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setVoLTEMicMute = s_set_volte_mic_mute;
1624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    dev->setVoLTEVolume = s_set_volte_volume;
16374060dee8c9a414ad0345176e2422de18a4ff183ty.lee#ifdef SEPERATED_AUDIO_INPUT
16474060dee8c9a414ad0345176e2422de18a4ff183ty.lee    dev->setInput = s_setInput;
16574060dee8c9a414ad0345176e2422de18a4ff183ty.lee#endif
1665ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#ifdef QCOM_CSDCLIENT_ENABLED
1675ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    dev->setCsdHandle = s_set_csd_handle;
1685ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#endif
1694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    *device = &dev->common;
1704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    property_get("persist.audio.handset.mic",value,"0");
1724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    strlcpy(mic_type, value, sizeof(mic_type));
1734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    property_get("persist.audio.fluence.mode",value,"0");
1744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!strcmp("broadside", value)) {
1754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        fluence_mode = FLUENCE_MODE_BROADSIDE;
1764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
1774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        fluence_mode = FLUENCE_MODE_ENDFIRE;
1784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
1794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    strlcpy(curRxUCMDevice, "None", sizeof(curRxUCMDevice));
1804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    strlcpy(curTxUCMDevice, "None", sizeof(curTxUCMDevice));
1819efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("ALSA module opened");
1824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
1844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int s_device_close(hw_device_t* device)
1874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(device);
1894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    device = NULL;
1904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
1914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev// ----------------------------------------------------------------------------
1944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic const int DEFAULT_SAMPLE_RATE = ALSA_DEFAULT_SAMPLE_RATE;
1964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void switchDevice(alsa_handle_t *handle, uint32_t devices, uint32_t mode);
1984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char *getUCMDevice(uint32_t devices, int input, char *rxDevice);
1994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void disableDevice(alsa_handle_t *handle);
2004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint getUseCaseType(const char *useCase);
2014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int callMode = AudioSystem::MODE_NORMAL;
2034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev// ----------------------------------------------------------------------------
2044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevbool platform_is_Fusion3()
2064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char platform[128], baseband[128];
2084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    property_get("ro.board.platform", platform, "");
2094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    property_get("ro.baseband", baseband, "");
2104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!strcmp("msm8960", platform) && !strcmp("mdm", baseband))
2114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return true;
2124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    else
2134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return false;
2144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint deviceName(alsa_handle_t *handle, unsigned flags, char **value)
2174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int ret = 0;
2194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char ident[70];
2204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (flags & PCM_IN) {
2224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        strlcpy(ident, "CapturePCM/", sizeof(ident));
2234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
2244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        strlcpy(ident, "PlaybackPCM/", sizeof(ident));
2254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
2264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    strlcat(ident, handle->useCase, sizeof(ident));
2274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ret = snd_use_case_get(handle->ucMgr, ident, (const char **)value);
2284113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGD("Device value returned is %s", (*value));
2294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return ret;
2304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
232b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Manistatus_t setHDMIChannelCount()
233b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani{
234b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    status_t err = NO_ERROR;
235b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    int channel_count = 0;
236b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    const char *channel_cnt_str = NULL;
237b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    EDID_AUDIO_INFO info = { 0 };
238b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
239b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    ALSAControl control("/dev/snd/controlC0");
240b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if (AudioUtil::getHDMIAudioSinkCaps(&info)) {
241b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        for (int i = 0; i < info.nAudioBlocks && i < MAX_EDID_BLOCKS; i++) {
242b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            if (info.AudioBlocksArray[i].nChannels > channel_count &&
243b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                  info.AudioBlocksArray[i].nChannels <= MAX_HDMI_CHANNEL_CNT) {
244b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                channel_count = info.AudioBlocksArray[i].nChannels;
245b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            }
246b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        }
247b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
248b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
249b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    switch (channel_count) {
250b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case 6: channel_cnt_str = "Six"; break;
251b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case 5: channel_cnt_str = "Five"; break;
252b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case 4: channel_cnt_str = "Four"; break;
253b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case 3: channel_cnt_str = "Three"; break;
254b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    default: channel_cnt_str = "Two"; break;
255b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
256b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    ALOGD("HDMI channel count: %s", channel_cnt_str);
257b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    control.set("HDMI_RX Channels", channel_cnt_str);
258b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
259b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    return err;
260b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani}
261b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
2624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatus_t setHardwareParams(alsa_handle_t *handle)
2634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct snd_pcm_hw_params *params;
2654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned long bufferSize, reqBuffSize;
2664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned int periodTime, bufferTime;
2674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned int requestedRate = handle->sampleRate;
2684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int status = 0;
2694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int channels = handle->channels;
2704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    snd_pcm_format_t format = SNDRV_PCM_FORMAT_S16_LE;
2714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    params = (snd_pcm_hw_params*) calloc(1, sizeof(struct snd_pcm_hw_params));
2734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!params) {
2744113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Failed to allocate ALSA hardware parameters!");
2754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_INIT;
2764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
2774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    reqBuffSize = handle->bufferSize;
2794113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGD("setHardwareParams: reqBuffSize %d channels %d sampleRate %d",
2804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         (int) reqBuffSize, handle->channels, handle->sampleRate);
2814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2829746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED
2834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (channels == 6) {
2844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC, strlen(SND_USE_CASE_VERB_HIFI_REC))
2854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            || !strncmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC, strlen(SND_USE_CASE_MOD_CAPTURE_MUSIC))) {
2864113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGV("HWParams: Use 4 channels in kernel for 5.1(%s) recording ", handle->useCase);
2874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            channels = 4;
2884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
2904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
2914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_init(params);
2934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_set_mask(params, SNDRV_PCM_HW_PARAM_ACCESS,
2944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   SNDRV_PCM_ACCESS_RW_INTERLEAVED);
2954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (handle->format != SNDRV_PCM_FORMAT_S16_LE) {
2969746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani        if (handle->format == AudioSystem::AMR_NB
2979746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani            || handle->format == AudioSystem::AMR_WB
2989746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_QCHAT_ENABLED
2999746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani            || handle->format == AudioSystem::EVRC
3009746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani            || handle->format == AudioSystem::EVRCB
3019746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani            || handle->format == AudioSystem::EVRCWB
3029746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif
3039746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani            )
3044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev              format = SNDRV_PCM_FORMAT_SPECIAL;
3054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
3064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   format);
3084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_set_mask(params, SNDRV_PCM_HW_PARAM_SUBFORMAT,
3094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   SNDRV_PCM_SUBFORMAT_STD);
31077780382b45794eb5bc0e8589d9b7c96bb406772SathishKumar Mani    param_set_int(params, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, reqBuffSize);
3114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_set_int(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS, 16);
3124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_set_int(params, SNDRV_PCM_HW_PARAM_FRAME_BITS,
3134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   channels * 16);
3144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_set_int(params, SNDRV_PCM_HW_PARAM_CHANNELS,
3154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                  channels);
3164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_set_int(params, SNDRV_PCM_HW_PARAM_RATE, handle->sampleRate);
3174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_set_hw_refine(handle->handle, params);
3184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (param_set_hw_params(handle->handle, params)) {
3204113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("cannot set hw params");
3214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_INIT;
3224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
3234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    param_dump(params);
3244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->buffer_size = pcm_buffer_size(params);
3264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->period_size = pcm_period_size(params);
3274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->period_cnt = handle->handle->buffer_size/handle->handle->period_size;
3284113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGD("setHardwareParams: buffer_size %d, period_size %d, period_cnt %d",
3294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->handle->buffer_size, handle->handle->period_size,
3304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->handle->period_cnt);
3314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->rate = handle->sampleRate;
3324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->channels = handle->channels;
3334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->periodSize = handle->handle->period_size;
3344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC) &&
3354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        strcmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC) &&
3364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        (6 != handle->channels)) {
3374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        //Do not update buffersize for 5.1 recording
3384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->bufferSize = handle->handle->period_size;
3394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
3404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return NO_ERROR;
3424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatus_t setSoftwareParams(alsa_handle_t *handle)
3454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct snd_pcm_sw_params* params;
3474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct pcm* pcm = handle->handle;
3484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned long periodSize = pcm->period_size;
3504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int channels = handle->channels;
3514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    params = (snd_pcm_sw_params*) calloc(1, sizeof(struct snd_pcm_sw_params));
3534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!params) {
3544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        LOG_ALWAYS_FATAL("Failed to allocate ALSA software parameters!");
3554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_INIT;
3564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
3574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3589746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED
3594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (channels == 6) {
3604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC, strlen(SND_USE_CASE_VERB_HIFI_REC))
3614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            || !strncmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC, strlen(SND_USE_CASE_MOD_CAPTURE_MUSIC))) {
3624113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGV("SWParams: Use 4 channels in kernel for 5.1(%s) recording ", handle->useCase);
3634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            channels = 4;
3644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
3654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
3664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
3674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // Get the current software parameters
3694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    params->tstamp_mode = SNDRV_PCM_TSTAMP_NONE;
3704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    params->period_step = 1;
3714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(((!strcmp(handle->useCase,SND_USE_CASE_MOD_PLAY_VOIP)) ||
3724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        (!strcmp(handle->useCase,SND_USE_CASE_VERB_IP_VOICECALL)))){
3734113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev          ALOGV("setparam:  start & stop threshold for Voip ");
3744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          params->avail_min = handle->channels - 1 ? periodSize/4 : periodSize/2;
3754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          params->start_threshold = periodSize/2;
3764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          params->stop_threshold = INT_MAX;
3774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     } else {
378bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani         params->avail_min = periodSize/(channels * 2);
379bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani         params->start_threshold = periodSize/(channels * 2);
3804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         params->stop_threshold = INT_MAX;
3814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
3824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    params->silence_threshold = 0;
3834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    params->silence_size = 0;
3844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (param_set_sw_params(handle->handle, params)) {
3864113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("cannot set sw params");
3874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_INIT;
3884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
3894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return NO_ERROR;
3904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid switchDevice(alsa_handle_t *handle, uint32_t devices, uint32_t mode)
3934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const char **mods_list;
3954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    use_case_t useCaseNode;
3964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned usecase_type = 0;
3974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    bool inCallDevSwitch = false;
3984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char *rxDevice, *txDevice, ident[70], *use_case = NULL;
3994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = 0, index, mods_size;
4004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int rx_dev_id, tx_dev_id;
4019efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGD("%s: device %d mode:%d", __FUNCTION__, devices, mode);
4024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if ((mode == AudioSystem::MODE_IN_CALL)  || (mode == AudioSystem::MODE_IN_COMMUNICATION)) {
4044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if ((devices & AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
4054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            (devices & AudioSystem::DEVICE_IN_WIRED_HEADSET)) {
4064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            devices = devices | (AudioSystem::DEVICE_OUT_WIRED_HEADSET |
4074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                      AudioSystem::DEVICE_IN_WIRED_HEADSET);
4084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE) {
4094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            devices = devices | (AudioSystem::DEVICE_OUT_WIRED_HEADPHONE |
4104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                      AudioSystem::DEVICE_IN_BUILTIN_MIC);
411c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani        } else if (devices & AudioSystem::DEVICE_IN_BUILTIN_MIC) {
412c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani            if (mode == AudioSystem::MODE_IN_CALL) {
413c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani                devices |= AudioSystem::DEVICE_OUT_EARPIECE;
4145062ccee15e0b9fafb9c1d3edf6ebee3f1b26a96samin.ryu            } else if (mode == AudioSystem::MODE_IN_COMMUNICATION) {
4155062ccee15e0b9fafb9c1d3edf6ebee3f1b26a96samin.ryu                if (!strncmp(curRxUCMDevice, SND_USE_CASE_DEV_SPEAKER, MAX_LEN(curRxUCMDevice, SND_USE_CASE_DEV_SPEAKER))) {
4165062ccee15e0b9fafb9c1d3edf6ebee3f1b26a96samin.ryu                    devices &= ~AudioSystem::DEVICE_IN_BUILTIN_MIC;
4175062ccee15e0b9fafb9c1d3edf6ebee3f1b26a96samin.ryu                    devices |= AudioSystem::DEVICE_IN_BACK_MIC;
4185062ccee15e0b9fafb9c1d3edf6ebee3f1b26a96samin.ryu                }
419c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani            }
420c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani        } else if (devices & AudioSystem::DEVICE_OUT_EARPIECE) {
421c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani            devices = devices | AudioSystem::DEVICE_IN_BUILTIN_MIC;
4224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_SPEAKER) {
42310dfa859150b9ff603e56459041c3314536b7a0dty.lee            devices = devices | (AudioSystem::DEVICE_IN_BACK_MIC |
4244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                       AudioSystem::DEVICE_OUT_SPEAKER);
4254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO) ||
4264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET) ||
4274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET)) {
4284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            devices = devices | (AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET |
4294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                      AudioSystem::DEVICE_OUT_BLUETOOTH_SCO);
4309746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED
4314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_ANC_HEADSET) ||
4324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_IN_ANC_HEADSET)) {
4334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            devices = devices | (AudioSystem::DEVICE_OUT_ANC_HEADSET |
4344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                      AudioSystem::DEVICE_IN_ANC_HEADSET);
4354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_ANC_HEADPHONE) {
4364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            devices = devices | (AudioSystem::DEVICE_OUT_ANC_HEADPHONE |
4374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                      AudioSystem::DEVICE_IN_BUILTIN_MIC);
4384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
4394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_AUX_DIGITAL) {
4406ebf0aa4df1a2484f52a894384286a084ac0a129Sungmin Choi            if (mode == AudioSystem::MODE_IN_CALL)
4416ebf0aa4df1a2484f52a894384286a084ac0a129Sungmin Choi                devices = devices | (AudioSystem::DEVICE_IN_BACK_MIC |
4426ebf0aa4df1a2484f52a894384286a084ac0a129Sungmin Choi                           AudioSystem::DEVICE_OUT_SPEAKER);
4436ebf0aa4df1a2484f52a894384286a084ac0a129Sungmin Choi            else
4446ebf0aa4df1a2484f52a894384286a084ac0a129Sungmin Choi                devices = devices | (AudioSystem::DEVICE_OUT_AUX_DIGITAL |
4456ebf0aa4df1a2484f52a894384286a084ac0a129Sungmin Choi                          AudioSystem::DEVICE_IN_BACK_MIC);
4469746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_PROXY_DEVICE_ENABLED
4474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_PROXY) ||
4484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                  (devices & AudioSystem::DEVICE_IN_PROXY)) {
4494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            devices = devices | (AudioSystem::DEVICE_OUT_PROXY |
4504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                      AudioSystem::DEVICE_IN_PROXY);
4514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
4524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
4534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
4549746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED
4554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if ((devices & AudioSystem::DEVICE_IN_BUILTIN_MIC) && ( 6 == handle->channels)) {
4564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC, strlen(SND_USE_CASE_VERB_HIFI_REC))
4574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            || !strncmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC, strlen(SND_USE_CASE_MOD_CAPTURE_MUSIC))) {
4584113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGV(" switchDevice , use ssr devices for channels:%d usecase:%s",handle->channels,handle->useCase);
4594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            s_set_flags(SSRQMIC_FLAG);
4604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
4614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
4624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
4634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    rxDevice = getUCMDevice(devices & AudioSystem::DEVICE_OUT_ALL, 0, NULL);
4654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    txDevice = getUCMDevice(devices & AudioSystem::DEVICE_IN_ALL, 1, rxDevice);
4664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if ((rxDevice != NULL) && (txDevice != NULL)) {
4684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (((strncmp(rxDevice, curRxUCMDevice, MAX_STR_LEN)) ||
469c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani            (strncmp(txDevice, curTxUCMDevice, MAX_STR_LEN))) &&
470c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani            ((mode == AudioSystem::MODE_IN_CALL)  ||
471c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani            (mode == AudioSystem::MODE_IN_COMMUNICATION)))
4724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            inCallDevSwitch = true;
4734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
47491bf891a50aef64d975870c18658a8be3261d3d6Ajay Dudani
47591bf891a50aef64d975870c18658a8be3261d3d6Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED
476c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani    if (platform_is_Fusion3() && (inCallDevSwitch == true)) {
4775ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        if (csd_disable_device == NULL) {
4785ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            ALOGE("dlsym:Error:%s Loading csd_client_disable_device", dlerror());
4795ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        } else {
4805ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            err = csd_disable_device();
4815ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            if (err < 0)
4825ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            {
4835ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani                ALOGE("csd_client_disable_device, failed, error %d", err);
4845ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            }
48591bf891a50aef64d975870c18658a8be3261d3d6Ajay Dudani        }
48691bf891a50aef64d975870c18658a8be3261d3d6Ajay Dudani    }
48791bf891a50aef64d975870c18658a8be3261d3d6Ajay Dudani#endif
48891bf891a50aef64d975870c18658a8be3261d3d6Ajay Dudani
4894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    snd_use_case_get(handle->ucMgr, "_verb", (const char **)&use_case);
4904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    mods_size = snd_use_case_get_list(handle->ucMgr, "_enamods", &mods_list);
4914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (rxDevice != NULL) {
4924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if ((strncmp(curRxUCMDevice, "None", 4)) &&
4934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            ((strncmp(rxDevice, curRxUCMDevice, MAX_STR_LEN)) || (inCallDevSwitch == true))) {
4944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if ((use_case != NULL) && (strncmp(use_case, SND_USE_CASE_VERB_INACTIVE,
4954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                strlen(SND_USE_CASE_VERB_INACTIVE)))) {
4964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                usecase_type = getUseCaseType(use_case);
4974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                if (usecase_type & USECASE_TYPE_RX) {
4984113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                    ALOGD("Deroute use case %s type is %d\n", use_case, usecase_type);
4994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    strlcpy(useCaseNode.useCase, use_case, MAX_STR_LEN);
5004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    snd_use_case_set(handle->ucMgr, "_verb", SND_USE_CASE_VERB_INACTIVE);
5014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    mUseCaseList.push_front(useCaseNode);
5024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                }
5034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
5044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (mods_size) {
5054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                for(index = 0; index < mods_size; index++) {
5064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    usecase_type = getUseCaseType(mods_list[index]);
5074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    if (usecase_type & USECASE_TYPE_RX) {
5084113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                        ALOGD("Deroute use case %s type is %d\n", mods_list[index], usecase_type);
5094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        strlcpy(useCaseNode.useCase, mods_list[index], MAX_STR_LEN);
5104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        snd_use_case_set(handle->ucMgr, "_dismod", mods_list[index]);
5114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        mUseCaseList.push_back(useCaseNode);
5124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    }
5134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                }
5144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
5154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            snd_use_case_set(handle->ucMgr, "_disdev", curRxUCMDevice);
5164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
5174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
5184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (txDevice != NULL) {
5194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if ((strncmp(curTxUCMDevice, "None", 4)) &&
5204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            ((strncmp(txDevice, curTxUCMDevice, MAX_STR_LEN)) || (inCallDevSwitch == true))) {
5214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if ((use_case != NULL) && (strncmp(use_case, SND_USE_CASE_VERB_INACTIVE,
5224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                strlen(SND_USE_CASE_VERB_INACTIVE)))) {
5234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                usecase_type = getUseCaseType(use_case);
5244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                if ((usecase_type & USECASE_TYPE_TX) && (!(usecase_type & USECASE_TYPE_RX))) {
5254113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                    ALOGD("Deroute use case %s type is %d\n", use_case, usecase_type);
5264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    strlcpy(useCaseNode.useCase, use_case, MAX_STR_LEN);
5274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    snd_use_case_set(handle->ucMgr, "_verb", SND_USE_CASE_VERB_INACTIVE);
5284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    mUseCaseList.push_front(useCaseNode);
5294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                }
5304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
5314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (mods_size) {
5324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                for(index = 0; index < mods_size; index++) {
5334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    usecase_type = getUseCaseType(mods_list[index]);
5344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    if ((usecase_type & USECASE_TYPE_TX) && (!(usecase_type & USECASE_TYPE_RX))) {
5354113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                        ALOGD("Deroute use case %s type is %d\n", mods_list[index], usecase_type);
5364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        strlcpy(useCaseNode.useCase, mods_list[index], MAX_STR_LEN);
5374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        snd_use_case_set(handle->ucMgr, "_dismod", mods_list[index]);
5384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        mUseCaseList.push_back(useCaseNode);
5394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    }
5404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                }
5414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
5424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            snd_use_case_set(handle->ucMgr, "_disdev", curTxUCMDevice);
5434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev       }
5444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
5459efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGD("%s,rxDev:%s, txDev:%s, curRxDev:%s, curTxDev:%s\n", __FUNCTION__, rxDevice, txDevice, curRxUCMDevice, curTxUCMDevice);
5464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (rxDevice != NULL) {
5484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        snd_use_case_set(handle->ucMgr, "_enadev", rxDevice);
5494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        strlcpy(curRxUCMDevice, rxDevice, sizeof(curRxUCMDevice));
5509746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_FM_ENABLED
5514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (devices & AudioSystem::DEVICE_OUT_FM)
5524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            s_set_fm_vol(fmVolume);
5534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
5544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
5554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (txDevice != NULL) {
5564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev       snd_use_case_set(handle->ucMgr, "_enadev", txDevice);
5574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev       strlcpy(curTxUCMDevice, txDevice, sizeof(curTxUCMDevice));
5584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
5594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    for(ALSAUseCaseList::iterator it = mUseCaseList.begin(); it != mUseCaseList.end(); ++it) {
5604113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGD("Route use case %s\n", it->useCase);
5614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if ((use_case != NULL) && (strncmp(use_case, SND_USE_CASE_VERB_INACTIVE,
5624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            strlen(SND_USE_CASE_VERB_INACTIVE))) && (!strncmp(use_case, it->useCase, MAX_UC_LEN))) {
5634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            snd_use_case_set(handle->ucMgr, "_verb", it->useCase);
5644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else {
5654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            snd_use_case_set(handle->ucMgr, "_enamod", it->useCase);
5664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
5674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
5684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!mUseCaseList.empty())
5694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        mUseCaseList.clear();
5704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (use_case != NULL) {
5714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        free(use_case);
5724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        use_case = NULL;
5734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
5744113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGD("switchDevice: curTxUCMDevivce %s curRxDevDevice %s", curTxUCMDevice, curRxUCMDevice);
5754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
576c669c27ef9c5663692c3dd8818bb6e7fcdc39b7aSathishKumar Mani    if (platform_is_Fusion3() && (inCallDevSwitch == true)) {
5774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /* get tx acdb id */
5784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        memset(&ident,0,sizeof(ident));
5794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        strlcpy(ident, "ACDBID/", sizeof(ident));
5804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        strlcat(ident, curTxUCMDevice, sizeof(ident));
5814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        tx_dev_id = snd_use_case_get(handle->ucMgr, ident, NULL);
5824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev       /* get rx acdb id */
5844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        memset(&ident,0,sizeof(ident));
5854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        strlcpy(ident, "ACDBID/", sizeof(ident));
5864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        strlcat(ident, curRxUCMDevice, sizeof(ident));
5874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        rx_dev_id = snd_use_case_get(handle->ucMgr, ident, NULL);
5884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
58991e9fad9dff8746a5cd9d44ee4f1313d3ad7cfdcehgrace.kim        if (((rx_dev_id == DEVICE_SPEAKER_MONO_RX_ACDB_ID ) || (rx_dev_id == DEVICE_SPEAKER_STEREO_RX_ACDB_ID ))
590bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani         && tx_dev_id == DEVICE_HANDSET_TX_ACDB_ID) {
5914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            tx_dev_id = DEVICE_SPEAKER_TX_ACDB_ID;
5924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
5934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5949746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED
5954113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGV("rx_dev_id=%d, tx_dev_id=%d\n", rx_dev_id, tx_dev_id);
5965ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        if (csd_enable_device == NULL) {
5975ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            ALOGE("dlsym:Error:%s Loading csd_client_enable_device", dlerror());
5985ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        } else {
5995ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            err = csd_enable_device(rx_dev_id, tx_dev_id, mDevSettingsFlag);
6005ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            if (err < 0)
6015ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            {
6025ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani                ALOGE("csd_client_disable_device failed, error %d", err);
6035ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            }
6044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
6054113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif
6064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
6074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (rxDevice != NULL) {
6094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        free(rxDevice);
6104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        rxDevice = NULL;
6114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
6124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (txDevice != NULL) {
6134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        free(txDevice);
6144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        txDevice = NULL;
6154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
6164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
6174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev// ----------------------------------------------------------------------------
6194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_init(alsa_device_t *module, ALSAHandleList &list)
6214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
6229efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_init: Initializing devices for ALSA module");
6234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    list.clear();
6254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return NO_ERROR;
6274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
6284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_open(alsa_handle_t *handle)
6304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
6314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char *devName;
6324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned flags = 0;
6334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = NO_ERROR;
6344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
635b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if(handle->devices & AudioSystem::DEVICE_OUT_AUX_DIGITAL) {
636b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        err = setHDMIChannelCount();
637b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        if(err != OK) {
638b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGE("setHDMIChannelCount err = %d", err);
639b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            return err;
640b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        }
641b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
6424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    /* No need to call s_close for LPA as pcm device open and close is handled by LPAPlayer in stagefright */
6434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER)) || (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_LPA))
6444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ||(!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_TUNNEL)) || (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_TUNNEL))) {
6459efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani        ALOGV("s_open: Opening LPA /Tunnel playback");
6464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_ERROR;
6474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
6484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    s_close(handle);
6504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6519efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_open: handle %p", handle);
6524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // ASoC multicomponent requires a valid path (frontend/backend) for
6544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // the device to be opened
6554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // The PCM stream is opened in blocking mode, per ALSA defaults.  The
6574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // AudioFlinger seems to assume blocking mode too, so asynchronous mode
6584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // should not be used.
6598861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani    if ((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER)) ||
6608861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_LPA)) ||
6618861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        (!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_TUNNEL)) ||
6628861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_TUNNEL))) {
6638861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        ALOGV("LPA/tunnel use case");
6648861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        flags |= PCM_MMAP;
6658861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        flags |= DEBUG_ON;
6668861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani    } else if ((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI)) ||
667bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani        (!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI2)) ||
6688861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        (!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_LOWLATENCY_MUSIC)) ||
6698861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_LOWLATENCY_MUSIC)) ||
670bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani        (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_MUSIC2)) ||
6714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_MUSIC))) {
6728861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        ALOGV("Music case");
6734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        flags = PCM_OUT;
6744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
6754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        flags = PCM_IN;
6764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
6774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (handle->channels == 1) {
6784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        flags |= PCM_MONO;
679e42406e02e32dbb398a2fa0c452e52526b763c8dSathishKumar Mani    }
6804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    else if (handle->channels == 4 ) {
6814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        flags |= PCM_QUAD;
6824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else if (handle->channels == 6 ) {
683bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani#ifdef QCOM_SSR_ENABLED
6844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC, strlen(SND_USE_CASE_VERB_HIFI_REC))
6854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            || !strncmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC, strlen(SND_USE_CASE_MOD_CAPTURE_MUSIC))) {
6864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            flags |= PCM_QUAD;
6874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else {
6884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            flags |= PCM_5POINT1;
6894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
690bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani#else
691bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani        flags |= PCM_5POINT1;
6924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
693bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani    }
6944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    else {
6954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        flags |= PCM_STEREO;
6964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
6974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (deviceName(handle, flags, &devName) < 0) {
6984113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Failed to get pcm device node: %s", devName);
6994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_INIT;
7004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
7014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (devName != NULL) {
7024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->handle = pcm_open(flags, (char*)devName);
7034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
7044113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Failed to get pcm device node");
7054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_INIT;
7064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
7074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!handle->handle) {
7094113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_open: Failed to initialize ALSA device '%s'", devName);
7104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        free(devName);
7114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_INIT;
7124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
7134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->flags = flags;
7154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = setHardwareParams(handle);
7164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (err == NO_ERROR) {
7184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = setSoftwareParams(handle);
7194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
7204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
7224113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Set HW/SW params failed: Closing the pcm stream");
7234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        s_standby(handle);
7244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
7254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(devName);
7274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return NO_ERROR;
7284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
7294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_voip_call(alsa_handle_t *handle)
7314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
7324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char* devName;
7344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char* devName1;
7354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned flags = 0;
7364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = NO_ERROR;
7374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    uint8_t voc_pkt[VOIP_BUFFER_MAX_SIZE];
7384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    s_close(handle);
7404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    flags = PCM_OUT;
7414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    flags |= PCM_MONO;
7424113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGV("s_open:s_start_voip_call  handle %p", handle);
7434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (deviceName(handle, flags, &devName) < 0) {
7454113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("Failed to get pcm device node");
7464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         return NO_INIT;
7474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
7484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (devName != NULL) {
7504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->handle = pcm_open(flags, (char*)devName);
7514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
7524113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("Failed to get pcm device node");
7534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         return NO_INIT;
7544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
7554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     if (!handle->handle) {
7574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          free(devName);
7584113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev          ALOGE("s_open: Failed to initialize ALSA device '%s'", devName);
7594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          return NO_INIT;
7604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
7614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     if (!pcm_ready(handle->handle)) {
7634113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE(" pcm ready failed");
7644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
7654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     handle->handle->flags = flags;
7674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     err = setHardwareParams(handle);
7684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     if (err == NO_ERROR) {
7704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         err = setSoftwareParams(handle);
7714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
7724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     err = pcm_prepare(handle->handle);
7744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     if(err != NO_ERROR) {
7754113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("DEVICE_OUT_DIRECTOUTPUT: pcm_prepare failed");
7764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
7774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     /* first write required start dsp */
7794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     memset(&voc_pkt,0,sizeof(voc_pkt));
7804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     pcm_write(handle->handle,&voc_pkt,handle->handle->period_size);
7814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     handle->rxHandle = handle->handle;
7824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     free(devName);
7834113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev     ALOGV("s_open: DEVICE_IN_COMMUNICATION ");
7844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     flags = PCM_IN;
7854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     flags |= PCM_MONO;
7864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     handle->handle = 0;
7874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     if (deviceName(handle, flags, &devName1) < 0) {
7894113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Failed to get pcm device node");
7904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_INIT;
7914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
7924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (devName != NULL) {
7934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->handle = pcm_open(flags, (char*)devName1);
7944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
7954113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("Failed to get pcm device node");
7964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         return NO_INIT;
7974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
7984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
7994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     if (!handle->handle) {
8004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         free(devName);
8014113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("s_open: Failed to initialize ALSA device '%s'", devName);
8024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         return NO_INIT;
8034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
8044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     if (!pcm_ready(handle->handle)) {
8064113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE(" pcm ready in failed");
8074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
8084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     handle->handle->flags = flags;
8104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     err = setHardwareParams(handle);
8124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     if (err == NO_ERROR) {
8144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         err = setSoftwareParams(handle);
8154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
8164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     err = pcm_prepare(handle->handle);
8194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     if(err != NO_ERROR) {
8204113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("DEVICE_IN_COMMUNICATION: pcm_prepare failed");
8214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     }
8224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     /* first read required start dsp */
8244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     memset(&voc_pkt,0,sizeof(voc_pkt));
8254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     pcm_read(handle->handle,&voc_pkt,handle->handle->period_size);
8264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     return NO_ERROR;
8274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
8284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_voice_call(alsa_handle_t *handle)
8304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
8314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char* devName;
8324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned flags = 0;
8334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = NO_ERROR;
8344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8359efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_start_voice_call: handle %p", handle);
83686c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani
8374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // ASoC multicomponent requires a valid path (frontend/backend) for
8384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // the device to be opened
8394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    flags = PCM_OUT | PCM_MONO;
8414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (deviceName(handle, flags, &devName) < 0) {
8424113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Failed to get pcm device node");
8434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return NO_INIT;
8444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
8454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (devName != NULL) {
8464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->handle = pcm_open(flags, (char*)devName);
8474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
8484113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("Failed to get pcm device node");
8494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         return NO_INIT;
8504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
8514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!handle->handle) {
8524113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_voicecall: could not open PCM device");
8534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
8544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
8554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->flags = flags;
8574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = setHardwareParams(handle);
8584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
8594113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_voice_call: setHardwareParams failed");
8604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
8614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
8624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = setSoftwareParams(handle);
8644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
8654113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_voice_call: setSoftwareParams failed");
8664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
8674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
8684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = pcm_prepare(handle->handle);
8704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
8714113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_voice_call: pcm_prepare failed");
8724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
8734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
8744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (ioctl(handle->handle->fd, SNDRV_PCM_IOCTL_START)) {
8764113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_voice_call:SNDRV_PCM_IOCTL_START failed\n");
8774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
8784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
8794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // Store the PCM playback device pointer in rxHandle
8814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->rxHandle = handle->handle;
8824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(devName);
8834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
8844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // Open PCM capture device
8854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    flags = PCM_IN | PCM_MONO;
8864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (deviceName(handle, flags, &devName) < 0) {
8874113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Failed to get pcm device node");
8884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
8894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
8904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (devName != NULL) {
8914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->handle = pcm_open(flags, (char*)devName);
8924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
8934113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("Failed to get pcm device node");
8944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         return NO_INIT;
8954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
8964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!handle->handle) {
8974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        free(devName);
8984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
8994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->flags = flags;
9024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = setHardwareParams(handle);
9034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
9044113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_voice_call: setHardwareParams failed");
9054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = setSoftwareParams(handle);
9094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
9104113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_voice_call: setSoftwareParams failed");
9114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = pcm_prepare(handle->handle);
9154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
9164113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_voice_call: pcm_prepare failed");
9174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (ioctl(handle->handle->fd, SNDRV_PCM_IOCTL_START)) {
9214113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_voice_call:SNDRV_PCM_IOCTL_START failed\n");
9224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (platform_is_Fusion3()) {
9269746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED
9275ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        if (csd_start_voice == NULL) {
9285ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            ALOGE("dlsym:Error:%s Loading csd_client_start_voice", dlerror());
9295ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        } else {
9305ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            err = csd_start_voice();
9315ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            if (err < 0){
9325ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani                ALOGE("s_start_voice_call: csd_client error %d\n", err);
9335ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani                goto Error;
9345ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            }
9354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
9364113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif
9374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(devName);
9404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return NO_ERROR;
9414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9424765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevError:
9434113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGE("s_start_voice_call: Failed to initialize ALSA device '%s'", devName);
9444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(devName);
9454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    s_close(handle);
9464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return NO_INIT;
9474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
9484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_fm(alsa_handle_t *handle)
9504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
9514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char *devName;
9524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned flags = 0;
9534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = NO_ERROR;
9544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9559efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_start_fm: handle %p", handle);
9564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // ASoC multicomponent requires a valid path (frontend/backend) for
9584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // the device to be opened
9594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    flags = PCM_OUT | PCM_STEREO;
9614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (deviceName(handle, flags, &devName) < 0) {
9624113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Failed to get pcm device node");
9634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (devName != NULL) {
9664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->handle = pcm_open(flags, (char*)devName);
9674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
9684113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("Failed to get pcm device node");
9694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         return NO_INIT;
9704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!handle->handle) {
9724113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_fm: could not open PCM device");
9734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->flags = flags;
9774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = setHardwareParams(handle);
9784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
9794113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_fm: setHardwareParams failed");
9804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = setSoftwareParams(handle);
9844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
9854113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_fm: setSoftwareParams failed");
9864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = pcm_prepare(handle->handle);
9904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
9914113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_fm: setSoftwareParams failed");
9924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
9954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (ioctl(handle->handle->fd, SNDRV_PCM_IOCTL_START)) {
9964113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_fm: SNDRV_PCM_IOCTL_START failed\n");
9974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
9984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
9994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // Store the PCM playback device pointer in rxHandle
10014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->rxHandle = handle->handle;
10024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(devName);
10034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    // Open PCM capture device
10054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    flags = PCM_IN | PCM_STEREO;
10064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (deviceName(handle, flags, &devName) < 0) {
10074113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Failed to get pcm device node");
10084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
10094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
10104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (devName != NULL) {
10114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        handle->handle = pcm_open(flags, (char*)devName);
10124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
10134113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev         ALOGE("Failed to get pcm device node");
10144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev         return NO_INIT;
10154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
10164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!handle->handle) {
10174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
10184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
10194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle->flags = flags;
10214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = setHardwareParams(handle);
10224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
10234113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_fm: setHardwareParams failed");
10244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
10254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
10264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = setSoftwareParams(handle);
10284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
10294113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_fm: setSoftwareParams failed");
10304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
10314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
10324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = pcm_prepare(handle->handle);
10344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(err != NO_ERROR) {
10354113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_fm: pcm_prepare failed");
10364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
10374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
10384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (ioctl(handle->handle->fd, SNDRV_PCM_IOCTL_START)) {
10404113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("s_start_fm: SNDRV_PCM_IOCTL_START failed\n");
10414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto Error;
10424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
10434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    s_set_fm_vol(fmVolume);
10454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(devName);
10464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return NO_ERROR;
10474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10484765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevError:
10494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(devName);
10504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    s_close(handle);
10514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return NO_INIT;
10524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
10534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_fm_vol(int value)
10554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
10564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t err = NO_ERROR;
10574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
10594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("Internal FM RX Volume",value,0);
10604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    fmVolume = value;
10614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return err;
10634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
10644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_lpa_vol(int value)
10664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
10674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t err = NO_ERROR;
10684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
10704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("LPA RX Volume",value,0);
10714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return err;
10734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
10744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start(alsa_handle_t *handle)
10764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
10774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t err = NO_ERROR;
10784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(!handle->handle) {
10804113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("No active PCM driver to start");
10814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return err;
10824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
10834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    err = pcm_prepare(handle->handle);
10854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return err;
10874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
10884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_close(alsa_handle_t *handle)
10904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
10914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int ret;
10924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t err = NO_ERROR;
10934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     struct pcm *h = handle->rxHandle;
10944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
10954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->rxHandle = 0;
10969efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_close: handle %p h %p", handle, h);
10974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (h) {
10980f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani        if ((!strcmp(handle->useCase, SND_USE_CASE_VERB_VOICECALL) ||
10990f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani             !strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_VOICE)) &&
11000f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani            platform_is_Fusion3()) {
11010f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani#ifdef QCOM_CSDCLIENT_ENABLED
11020f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani            if (csd_stop_voice == NULL) {
11030f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani                ALOGE("dlsym:Error:%s Loading csd_client_disable_device", dlerror());
11040f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani            } else {
11050f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani                err = csd_stop_voice();
11060f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani                if (err < 0) {
11070f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani                    ALOGE("s_close: csd_client error %d\n", err);
11080f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani                }
11090f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani            }
11100f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani#endif
11110f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani        }
11120f5426b31b9a15743e4621a972cccafc4087aa62SathishKumar Mani
11134113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGV("s_close rxHandle\n");
11144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = pcm_close(h);
11154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if(err != NO_ERROR) {
11164113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGE("s_close: pcm_close failed for rxHandle with err %d", err);
11174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
11184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
11194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    h = handle->handle;
11214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle = 0;
11224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (h) {
11249efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani        ALOGV("s_close handle h %p\n", h);
11254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = pcm_close(h);
11264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if(err != NO_ERROR) {
11274113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGE("s_close: pcm_close failed for handle with err %d", err);
11284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
11294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        disableDevice(handle);
11314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else if((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER)) ||
11324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev              (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_LPA)) ||
11334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev              (!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_TUNNEL)) ||
11344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev              (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_TUNNEL))){
11354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        disableDevice(handle);
11364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
11374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return err;
11394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
11404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/*
11424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    this is same as s_close, but don't discard
11434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    the device/mode info. This way we can still
11444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    close the device, hit idle and power-save, reopen the pcm
11454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    for the same device/mode after resuming
11464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev*/
11474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_standby(alsa_handle_t *handle)
11484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
11494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int ret;
1150e42406e02e32dbb398a2fa0c452e52526b763c8dSathishKumar Mani    status_t err = NO_ERROR;
11514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct pcm *h = handle->rxHandle;
11524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->rxHandle = 0;
11539efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_standby: handle %p h %p", handle, h);
11544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (h) {
11550a019914794cc27f5dacddf4e5dbc019dbe21788SathishKumar Mani        ALOGD("s_standby  rxHandle\n");
11564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = pcm_close(h);
11574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if(err != NO_ERROR) {
11584113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGE("s_standby: pcm_close failed for rxHandle with err %d", err);
11594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
11604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
11614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    h = handle->handle;
11634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    handle->handle = 0;
11644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (h) {
11669efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani          ALOGV("s_standby handle h %p\n", h);
11674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = pcm_close(h);
11684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if(err != NO_ERROR) {
11694113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGE("s_standby: pcm_close failed for handle with err %d", err);
11704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
11714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        disableDevice(handle);
11724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else if((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER)) ||
11734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev              (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_LPA)) ||
11744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev              (!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_TUNNEL)) ||
11754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev              (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_TUNNEL))) {
11764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        disableDevice(handle);
11774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
11784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return err;
11804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
11814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_route(alsa_handle_t *handle, uint32_t devices, int mode)
11834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
11844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t status = NO_ERROR;
11854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11864113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGD("s_route: devices 0x%x in mode %d", devices, mode);
11874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    callMode = mode;
11884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    switchDevice(handle, devices, mode);
11894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return status;
11904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
11914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
11924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint getUseCaseType(const char *useCase)
11934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
11940a019914794cc27f5dacddf4e5dbc019dbe21788SathishKumar Mani    ALOGD("use case is %s\n", useCase);
11954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!strncmp(useCase, SND_USE_CASE_VERB_HIFI,
1196a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_HIFI)) ||
1197bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani        !strncmp(useCase, SND_USE_CASE_VERB_HIFI2,
1198bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani            MAX_LEN(useCase, SND_USE_CASE_VERB_HIFI2)) ||
11998861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        !strncmp(useCase, SND_USE_CASE_VERB_HIFI_LOWLATENCY_MUSIC,
1200a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_HIFI_LOWLATENCY_MUSIC)) ||
12014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER,
1202a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_HIFI_LOW_POWER)) ||
12034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_VERB_HIFI_TUNNEL,
1204a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_HIFI_TUNNEL)) ||
1205a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim        !strncmp(useCase, SND_USE_CASE_VERB_HIFI2,
1206a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_HIFI2)) ||
12074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_VERB_DIGITAL_RADIO,
1208a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_DIGITAL_RADIO)) ||
12094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_MUSIC,
1210a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_PLAY_MUSIC)) ||
1211bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_MUSIC2,
1212bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani            MAX_LEN(useCase, SND_USE_CASE_MOD_PLAY_MUSIC2)) ||
12138861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_LOWLATENCY_MUSIC,
1214a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_PLAY_LOWLATENCY_MUSIC)) ||
1215a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_MUSIC2,
1216a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_PLAY_MUSIC2)) ||
12174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_LPA,
1218a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_PLAY_LPA)) ||
12194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_TUNNEL,
1220a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_PLAY_TUNNEL)) ||
12214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_FM,
1222a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_PLAY_FM))) {
12234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return USECASE_TYPE_RX;
12244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else if (!strncmp(useCase, SND_USE_CASE_VERB_HIFI_REC,
1225a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_HIFI_REC)) ||
12268861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        !strncmp(useCase, SND_USE_CASE_VERB_HIFI_LOWLATENCY_REC,
1227a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_HIFI_LOWLATENCY_REC)) ||
12284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_VERB_FM_REC,
1229a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_FM_REC)) ||
12304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_VERB_FM_A2DP_REC,
1231a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_FM_A2DP_REC)) ||
12324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC,
1233a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_CAPTURE_MUSIC)) ||
12348861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani        !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_LOWLATENCY_MUSIC,
1235a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_CAPTURE_LOWLATENCY_MUSIC)) ||
12364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_FM,
1237a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_CAPTURE_FM)) ||
12384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_A2DP_FM,
1239a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_CAPTURE_A2DP_FM))) {
12404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return USECASE_TYPE_TX;
12414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else if (!strncmp(useCase, SND_USE_CASE_VERB_VOICECALL,
1242a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_VOICECALL)) ||
12434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_VERB_IP_VOICECALL,
1244a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_IP_VOICECALL)) ||
12454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_VERB_DL_REC,
1246a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_DL_REC)) ||
12474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_VERB_UL_DL_REC,
1248a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_UL_DL_REC)) ||
1249a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim        !strncmp(useCase, SND_USE_CASE_VERB_INCALL_REC,
1250a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_INCALL_REC)) ||
12514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_VOICE,
1252a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_PLAY_VOICE)) ||
12534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_VOIP,
1254a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_PLAY_VOIP)) ||
12554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_VOICE_DL,
1256a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_CAPTURE_VOICE_DL)) ||
12574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_VOICE_UL_DL,
1258a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_MOD_CAPTURE_VOICE_UL_DL)) ||
12594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_VOICE,
1260a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase, SND_USE_CASE_MOD_CAPTURE_VOICE)) ||
12614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_VERB_VOLTE,
1262a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase,SND_USE_CASE_VERB_VOLTE)) ||
12634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        !strncmp(useCase, SND_USE_CASE_MOD_PLAY_VOLTE,
1264a8b76531e6eef695eae174fd628396a5b4c95b7fchahee.kim            MAX_LEN(useCase, SND_USE_CASE_MOD_PLAY_VOLTE))) {
12654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return (USECASE_TYPE_RX | USECASE_TYPE_TX);
12664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
12674113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("unknown use case %s\n", useCase);
12684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return 0;
12694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
12704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
12714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
12724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void disableDevice(alsa_handle_t *handle)
12734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
12744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned usecase_type = 0;
12754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int i, mods_size;
12764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char *useCase;
12774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const char **mods_list;
12784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
12794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    snd_use_case_get(handle->ucMgr, "_verb", (const char **)&useCase);
12804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (useCase != NULL) {
12814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!strncmp(useCase, handle->useCase, MAX_UC_LEN)) {
12824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            snd_use_case_set(handle->ucMgr, "_verb", SND_USE_CASE_VERB_INACTIVE);
12834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else {
12844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            snd_use_case_set(handle->ucMgr, "_dismod", handle->useCase);
12854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
12864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        free(useCase);
12874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        snd_use_case_get(handle->ucMgr, "_verb", (const char **)&useCase);
12884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (strncmp(useCase, SND_USE_CASE_VERB_INACTIVE,
12894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev               strlen(SND_USE_CASE_VERB_INACTIVE)))
12904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            usecase_type |= getUseCaseType(useCase);
12914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        mods_size = snd_use_case_get_list(handle->ucMgr, "_enamods", &mods_list);
12929efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani        ALOGV("Number of modifiers %d\n", mods_size);
12934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (mods_size) {
12944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            for(i = 0; i < mods_size; i++) {
12959efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani                ALOGV("index %d modifier %s\n", i, mods_list[i]);
12964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                usecase_type |= getUseCaseType(mods_list[i]);
12974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
12984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
12999efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani        ALOGV("usecase_type is %d\n", usecase_type);
13004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!(usecase_type & USECASE_TYPE_TX) && (strncmp(curTxUCMDevice, "None", 4)))
13014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            snd_use_case_set(handle->ucMgr, "_disdev", curTxUCMDevice);
13024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!(usecase_type & USECASE_TYPE_RX) && (strncmp(curRxUCMDevice, "None", 4)))
13034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            snd_use_case_set(handle->ucMgr, "_disdev", curRxUCMDevice);
13044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
13054113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev        ALOGE("Invalid state, no valid use case found to disable");
13064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
13074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(useCase);
13084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
13094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
13104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevchar *getUCMDevice(uint32_t devices, int input, char *rxDevice)
13114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
13121c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    bool is_tmus = s_is_tmus();
13131c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee
13144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!input) {
13154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!(mDevSettingsFlag & TTY_OFF) &&
13164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            (callMode == AudioSystem::MODE_IN_CALL) &&
13174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            ((devices & AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
1318924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee             (devices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE))) {
13199746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED
13204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             ||
13214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             (devices & AudioSystem::DEVICE_OUT_ANC_HEADSET) ||
13224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             (devices & AudioSystem::DEVICE_OUT_ANC_HEADPHONE))) {
13234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
13244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             if (mDevSettingsFlag & TTY_VCO) {
13254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 return strdup(SND_USE_CASE_DEV_TTY_HEADSET_RX);
13264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             } else if (mDevSettingsFlag & TTY_FULL) {
13274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 return strdup(SND_USE_CASE_DEV_TTY_FULL_RX);
13284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             } else if (mDevSettingsFlag & TTY_HCO) {
13294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 return strdup(SND_USE_CASE_DEV_TTY_HANDSET_RX); /* HANDSET RX */
13304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             }
13314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }else if ((devices & AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET) ||
13324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                  (devices & AudioSystem::DEVICE_OUT_DGTL_DOCK_HEADSET)) {
13334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             return strdup(SND_USE_CASE_DEV_PROXY_RX); /* PROXY RX */
13344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_SPEAKER) &&
13354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            ((devices & AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
13364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            (devices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE))) {
13374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (mDevSettingsFlag & ANC_FLAG) {
13384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(SND_USE_CASE_DEV_SPEAKER_ANC_HEADSET); /* COMBO SPEAKER+ANC HEADSET RX */
13394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            } else {
13404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(SND_USE_CASE_DEV_SPEAKER_HEADSET); /* COMBO SPEAKER+HEADSET RX */
13414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
13429eb1a4fc659f58d196cc8e990da2a3fbf9a1c630SathishKumar Mani        } else if ((devices & AudioSystem::DEVICE_OUT_SPEAKER) &&
13439eb1a4fc659f58d196cc8e990da2a3fbf9a1c630SathishKumar Mani            ((devices & AudioSystem::DEVICE_OUT_AUX_DIGITAL))) {
13449eb1a4fc659f58d196cc8e990da2a3fbf9a1c630SathishKumar Mani            return strdup(SND_USE_CASE_DEV_HDMI_SPEAKER);
13459746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED
13464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_SPEAKER) &&
13474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            ((devices & AudioSystem::DEVICE_OUT_ANC_HEADSET) ||
13484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            (devices & AudioSystem::DEVICE_OUT_ANC_HEADPHONE))) {
13494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return strdup(SND_USE_CASE_DEV_SPEAKER_ANC_HEADSET); /* COMBO SPEAKER+ANC HEADSET RX */
13504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_SPEAKER) &&
13514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 (devices & AudioSystem::DEVICE_OUT_FM_TX)) {
13524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return strdup(SND_USE_CASE_DEV_SPEAKER_FM_TX); /* COMBO SPEAKER+FM_TX RX */
13534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
13544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_EARPIECE) {
1355925596f513542570d660da7902e9d2219c9cfc69ty.lee            if (callMode == AudioSystem::MODE_IN_CALL) {
13561c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee                if(is_tmus)
13571c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee                    return strdup(SND_USE_CASE_DEV_VOC_EARPIECE_TMUS); /* Voice HANDSET RX for TMUS */
13581c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee                else
13591c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee                    return strdup(SND_USE_CASE_DEV_VOC_EARPIECE); /* Voice HANDSET RX */
1360925596f513542570d660da7902e9d2219c9cfc69ty.lee            } else
1361925596f513542570d660da7902e9d2219c9cfc69ty.lee                return strdup(SND_USE_CASE_DEV_EARPIECE); /* HANDSET RX */
13624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_SPEAKER) {
1363925596f513542570d660da7902e9d2219c9cfc69ty.lee            if (callMode == AudioSystem::MODE_IN_CALL) {
1364925596f513542570d660da7902e9d2219c9cfc69ty.lee                return strdup(SND_USE_CASE_DEV_VOC_SPEAKER); /* Voice SPEAKER RX */
1365925596f513542570d660da7902e9d2219c9cfc69ty.lee            } else
1366925596f513542570d660da7902e9d2219c9cfc69ty.lee                return strdup(SND_USE_CASE_DEV_SPEAKER); /* SPEAKER RX */
13674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
13684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE)) {
13694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (mDevSettingsFlag & ANC_FLAG) {
1370925596f513542570d660da7902e9d2219c9cfc69ty.lee                if (callMode == AudioSystem::MODE_IN_CALL) {
1371925596f513542570d660da7902e9d2219c9cfc69ty.lee                    return strdup(SND_USE_CASE_DEV_VOC_ANC_HEADSET); /* Voice ANC HEADSET RX */
1372925596f513542570d660da7902e9d2219c9cfc69ty.lee                } else
1373925596f513542570d660da7902e9d2219c9cfc69ty.lee                    return strdup(SND_USE_CASE_DEV_ANC_HEADSET); /* ANC HEADSET RX */
13744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            } else {
1375925596f513542570d660da7902e9d2219c9cfc69ty.lee                if (callMode == AudioSystem::MODE_IN_CALL) {
1376925596f513542570d660da7902e9d2219c9cfc69ty.lee                    return strdup(SND_USE_CASE_DEV_VOC_HEADPHONE); /* Voice HEADSET RX */
1377925596f513542570d660da7902e9d2219c9cfc69ty.lee                } else
1378925596f513542570d660da7902e9d2219c9cfc69ty.lee                    return strdup(SND_USE_CASE_DEV_HEADPHONES); /* HEADSET RX */
13794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
13809746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED
13814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_ANC_HEADSET) ||
13824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_OUT_ANC_HEADPHONE)) {
1383925596f513542570d660da7902e9d2219c9cfc69ty.lee            if (callMode == AudioSystem::MODE_IN_CALL) {
1384925596f513542570d660da7902e9d2219c9cfc69ty.lee                return strdup(SND_USE_CASE_DEV_VOC_ANC_HEADSET); /* Voice ANC HEADSET RX */
1385925596f513542570d660da7902e9d2219c9cfc69ty.lee            } else
1386925596f513542570d660da7902e9d2219c9cfc69ty.lee                return strdup(SND_USE_CASE_DEV_ANC_HEADSET); /* ANC HEADSET RX */
13874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
13884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO) ||
13894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                  (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET) ||
13904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                  (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT)) {
13914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (btsco_samplerate == BTSCO_RATE_16KHZ)
13924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(SND_USE_CASE_DEV_BTSCO_WB_RX); /* BTSCO RX*/
13934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            else
13944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(SND_USE_CASE_DEV_BTSCO_NB_RX); /* BTSCO RX*/
13954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP) ||
13964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) ||
13979746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_VOIP_ENABLED
13989746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani                   (devices & AudioSystem::DEVICE_OUT_DIRECTOUTPUT) ||
13999746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif
14004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER)) {
14014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            /* Nothing to be done, use current active device */
14024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (strncmp(curRxUCMDevice, "None", 4)) {
14034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(curRxUCMDevice);
14044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
14054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_AUX_DIGITAL) {
14064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return strdup(SND_USE_CASE_DEV_HDMI); /* HDMI RX */
14079746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_PROXY_DEVICE_ENABLED
14084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_PROXY) {
14094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return strdup(SND_USE_CASE_DEV_PROXY_RX); /* PROXY RX */
14109746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif
14119746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_FM_TX_ENABLED
14124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_FM_TX) {
14134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return strdup(SND_USE_CASE_DEV_FM_TX); /* FM Tx */
14144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
14154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_OUT_DEFAULT) {
1416925596f513542570d660da7902e9d2219c9cfc69ty.lee            if (callMode == AudioSystem::MODE_IN_CALL) {
1417925596f513542570d660da7902e9d2219c9cfc69ty.lee                return strdup(SND_USE_CASE_DEV_VOC_SPEAKER); /* Voice SPEAKER RX */
1418925596f513542570d660da7902e9d2219c9cfc69ty.lee            } else
1419925596f513542570d660da7902e9d2219c9cfc69ty.lee                return strdup(SND_USE_CASE_DEV_SPEAKER); /* SPEAKER RX */
14204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else {
14214113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGD("No valid output device: %u", devices);
14224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
14234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
14244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!(mDevSettingsFlag & TTY_OFF) &&
14254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            (callMode == AudioSystem::MODE_IN_CALL) &&
142661f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent            ((devices & AudioSystem::DEVICE_IN_WIRED_HEADSET)
14279746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED
142861f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent              || (devices & AudioSystem::DEVICE_IN_ANC_HEADSET)
14294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
143061f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent            )) {
14314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             if (mDevSettingsFlag & TTY_HCO) {
14324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 return strdup(SND_USE_CASE_DEV_TTY_HEADSET_TX);
14334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             } else if (mDevSettingsFlag & TTY_FULL) {
14344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 return strdup(SND_USE_CASE_DEV_TTY_FULL_TX);
14354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             } else if (mDevSettingsFlag & TTY_VCO) {
14364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 if (!strncmp(mic_type, "analog", 6)) {
14379746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani                     return strdup(SND_USE_CASE_DEV_TTY_HANDSET_ANALOG_TX);
14384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 } else {
14394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                     return strdup(SND_USE_CASE_DEV_TTY_HANDSET_TX);
14404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 }
14414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             }
14424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_IN_BUILTIN_MIC) {
14434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (!strncmp(mic_type, "analog", 6)) {
14444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(SND_USE_CASE_DEV_HANDSET); /* HANDSET TX */
14454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            } else {
14464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                if (mDevSettingsFlag & DMIC_FLAG) {
1447924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                    if(callMode == AudioSystem::MODE_IN_CALL) {
144861f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent#ifdef USES_FLUENCE_INCALL
1449924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                        if (fluence_mode == FLUENCE_MODE_ENDFIRE) {
14501c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee                            if(is_tmus)
14511c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee                                return strdup(SND_USE_CASE_DEV_DUAL_MIC_ENDFIRE_TMUS); /* DUALMIC EF TX */
14521c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee                            else
14531c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee                                return strdup(SND_USE_CASE_DEV_DUAL_MIC_ENDFIRE); /* DUALMIC EF TX */
1454924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                        } else if (fluence_mode == FLUENCE_MODE_BROADSIDE) {
1455924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                            return strdup(SND_USE_CASE_DEV_DUAL_MIC_BROADSIDE); /* DUALMIC BS TX */
1456924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                        } else {
1457924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                            return strdup(SND_USE_CASE_DEV_HANDSET); /* BUILTIN-MIC TX */
1458924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                        }
145961f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent#endif
1460924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                    }
14614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    if (((rxDevice != NULL) &&
14624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        !strncmp(rxDevice, SND_USE_CASE_DEV_SPEAKER,
14634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        (strlen(SND_USE_CASE_DEV_SPEAKER)+1))) ||
14644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        !strncmp(curRxUCMDevice, SND_USE_CASE_DEV_SPEAKER,
14654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        (strlen(SND_USE_CASE_DEV_SPEAKER)+1))) {
14664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        if (fluence_mode == FLUENCE_MODE_ENDFIRE) {
146761f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            if (input_source == AUDIO_SOURCE_VOICE_RECOGNITION) {
146861f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent// TODO: check if different ACDB settings are needed when speaker is enabled
146961f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                                return strdup(SND_USE_CASE_DEV_DUAL_MIC_ENDFIRE_VREC);
147061f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            } else {
147161f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                                return strdup(SND_USE_CASE_DEV_SPEAKER_DUAL_MIC_ENDFIRE);
147261f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            }
14734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        } else if (fluence_mode == FLUENCE_MODE_BROADSIDE) {
147461f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            if (input_source == AUDIO_SOURCE_VOICE_RECOGNITION) {
147561f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                                return strdup(SND_USE_CASE_DEV_DUAL_MIC_BROADSIDE_VREC);
147661f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            } else {
147761f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                                return strdup(SND_USE_CASE_DEV_SPEAKER_DUAL_MIC_BROADSIDE);
147861f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            }
14794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        }
14804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    } else {
14814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        if (fluence_mode == FLUENCE_MODE_ENDFIRE) {
148261f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            if (input_source == AUDIO_SOURCE_VOICE_RECOGNITION) {
148361f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                                return strdup(SND_USE_CASE_DEV_DUAL_MIC_ENDFIRE_VREC);
148461f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            } else {
148561f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                                return strdup(SND_USE_CASE_DEV_DUAL_MIC_ENDFIRE);
148661f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            }
14874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        } else if (fluence_mode == FLUENCE_MODE_BROADSIDE) {
148861f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            if (input_source == AUDIO_SOURCE_VOICE_RECOGNITION) {
148961f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                                return strdup(SND_USE_CASE_DEV_DUAL_MIC_BROADSIDE_VREC);
149061f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            } else {
149161f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                                return strdup(SND_USE_CASE_DEV_DUAL_MIC_BROADSIDE);
149261f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent                            }
14934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        }
14944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    }
14954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                } else if (mDevSettingsFlag & QMIC_FLAG){
14964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    return strdup(SND_USE_CASE_DEV_QUAD_MIC);
1497924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                }
14989746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED
14994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                else if (mDevSettingsFlag & SSRQMIC_FLAG){
15004113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                    ALOGV("return SSRQMIC_FLAG: 0x%x devices:0x%x",mDevSettingsFlag,devices);
15014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    // Mapping for quad mic input device.
15024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    return strdup(SND_USE_CASE_DEV_SSR_QUAD_MIC); /* SSR Quad MIC */
1503924f79851aaa4eebe593a456203d1c39d3c53d73ty.lee                }
15044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
150574060dee8c9a414ad0345176e2422de18a4ff183ty.lee#ifdef SEPERATED_AUDIO_INPUT
150674060dee8c9a414ad0345176e2422de18a4ff183ty.lee                if(input_source == AUDIO_SOURCE_VOICE_RECOGNITION) {
150774060dee8c9a414ad0345176e2422de18a4ff183ty.lee                    return strdup(SND_USE_CASE_DEV_VOICE_RECOGNITION ); /* VOICE RECOGNITION TX */
150874060dee8c9a414ad0345176e2422de18a4ff183ty.lee                }
150974060dee8c9a414ad0345176e2422de18a4ff183ty.lee#endif
15104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                else {
151174060dee8c9a414ad0345176e2422de18a4ff183ty.lee                    return strdup(SND_USE_CASE_DEV_HANDSET); /* BUILTIN-MIC TX */
15124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                }
15134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
15144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_IN_AUX_DIGITAL) {
15154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return strdup(SND_USE_CASE_DEV_HDMI_TX); /* HDMI TX */
15169746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED
1517249f87d48a57a50480e41b397cb4ca31687abb34ehgrace.kim        } else if (devices & AudioSystem::DEVICE_IN_ANC_HEADSET) {
15184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return strdup(SND_USE_CASE_DEV_HEADSET); /* HEADSET TX */
15194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
1520249f87d48a57a50480e41b397cb4ca31687abb34ehgrace.kim        } else if (devices & AudioSystem::DEVICE_IN_WIRED_HEADSET) {
1521925596f513542570d660da7902e9d2219c9cfc69ty.lee            if (callMode == AudioSystem::MODE_IN_CALL) {
1522925596f513542570d660da7902e9d2219c9cfc69ty.lee                return strdup(SND_USE_CASE_DEV_VOC_HEADSET); /* Voice HEADSET TX */
1523925596f513542570d660da7902e9d2219c9cfc69ty.lee            } else
1524925596f513542570d660da7902e9d2219c9cfc69ty.lee                return strdup(SND_USE_CASE_DEV_HEADSET); /* HEADSET TX */
15254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if (devices & AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
15264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             if (btsco_samplerate == BTSCO_RATE_16KHZ)
15274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 return strdup(SND_USE_CASE_DEV_BTSCO_WB_TX); /* BTSCO TX*/
15284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev             else
15294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                 return strdup(SND_USE_CASE_DEV_BTSCO_NB_TX); /* BTSCO TX*/
15309746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_USBAUDIO_ENABLED
15314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_IN_ANLG_DOCK_HEADSET) ||
15324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_IN_PROXY)) {
15334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return strdup(SND_USE_CASE_DEV_PROXY_TX); /* PROXY TX */
15344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
15354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_IN_COMMUNICATION) ||
15364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_IN_VOICE_CALL)) {
15374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            /* Nothing to be done, use current active device */
15384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (strncmp(curTxUCMDevice, "None", 4)) {
15394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(curTxUCMDevice);
15404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
15419746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_FM_ENABLED
15424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_IN_FM_RX) ||
15434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_IN_FM_RX_A2DP)) {
15444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            /* Nothing to be done, use current tx device or set dummy device */
15454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (strncmp(curTxUCMDevice, "None", 4)) {
15464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(curTxUCMDevice);
15474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            } else {
15484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(SND_USE_CASE_DEV_DUMMY_TX);
15494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
15504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
15514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else if ((devices & AudioSystem::DEVICE_IN_AMBIENT) ||
15524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                   (devices & AudioSystem::DEVICE_IN_BACK_MIC)) {
15534113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGI("No proper mapping found with UCM device list, setting default");
15544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (!strncmp(mic_type, "analog", 6)) {
15554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                return strdup(SND_USE_CASE_DEV_HANDSET); /* HANDSET TX */
15564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            } else {
1557925596f513542570d660da7902e9d2219c9cfc69ty.lee                if (callMode == AudioSystem::MODE_IN_CALL) {
1558925596f513542570d660da7902e9d2219c9cfc69ty.lee                    return strdup(SND_USE_CASE_DEV_VOC_LINE); /* Voice BUILTIN-MIC TX */
155987459f0857fe7fab51f45337f330bce03a53c3dcty.lee#ifdef SEPERATED_AUDIO_INPUT
156087459f0857fe7fab51f45337f330bce03a53c3dcty.lee                } else if(input_source == AUDIO_SOURCE_CAMCORDER) {
156187459f0857fe7fab51f45337f330bce03a53c3dcty.lee                    return strdup(SND_USE_CASE_DEV_CAMCORDER_TX ); /* CAMCORDER TX */
156287459f0857fe7fab51f45337f330bce03a53c3dcty.lee#endif
1563925596f513542570d660da7902e9d2219c9cfc69ty.lee                } else
1564925596f513542570d660da7902e9d2219c9cfc69ty.lee                    return strdup(SND_USE_CASE_DEV_LINE); /* BUILTIN-MIC TX */
15654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
15664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        } else {
15674113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev            ALOGD("No valid input device: %u", devices);
15684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
15694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
15704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return NULL;
15714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
15724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
15734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voice_volume(int vol)
15744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
15754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = 0;
15769efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_set_voice_volume: volume %d", vol);
15774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
15784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("Voice Rx Volume", vol, 0);
15794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
15804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (platform_is_Fusion3()) {
15819746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED
15825ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        if (csd_volume == NULL) {
15835ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            ALOGE("dlsym:Error:%s Loading csd_client_volume", dlerror());
15845ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        } else {
15855ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            err = csd_volume(vol);
15865ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            if (err < 0) {
15875ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani                ALOGE("s_set_voice_volume: csd_client error %d", err);
15885ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            }
1589e42406e02e32dbb398a2fa0c452e52526b763c8dSathishKumar Mani        }
15904113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif
15914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
15924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
15934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
15944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_volte_volume(int vol)
15954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
15969efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_set_volte_volume: volume %d", vol);
15974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
15984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("VoLTE Rx Volume", vol, 0);
15994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
16004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voip_volume(int vol)
16034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
16049efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_set_voip_volume: volume %d", vol);
16054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
16064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("Voip Rx Volume", vol, 0);
16074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
16084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_mic_mute(int state)
16094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
16104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = 0;
16119efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_set_mic_mute: state %d", state);
16124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
16134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("Voice Tx Mute", state, 0);
16144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (platform_is_Fusion3()) {
16169746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED
16175ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        if (csd_mic_mute == NULL) {
16185ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            ALOGE("dlsym:Error:%s Loading csd_mic_mute", dlerror());
16195ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        } else {
16205ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            err=csd_mic_mute(state);
16215ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            if (err < 0) {
16225ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani                ALOGE("s_set_mic_mute: csd_client error %d", err);
16235ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            }
16244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
16254113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif
16264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
16274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
16284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_volte_mic_mute(int state)
16294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
16309efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_set_volte_mic_mute: state %d", state);
16314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
16324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("VoLTE Tx Mute", state, 0);
16334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
16344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voip_mic_mute(int state)
16364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
16379efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_set_voip_mic_mute: state %d", state);
16384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
16394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("Voip Tx Mute", state, 0);
16404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
16414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voip_config(int mode, int rate)
16434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
16449efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_set_voip_config: mode %d,rate %d", mode, rate);
16454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
16464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char** setValues;
16474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    setValues = (char**)malloc(2*sizeof(char*));
16484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (setValues == NULL) {
16494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          return;
16504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
16514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    setValues[0] = (char*)malloc(4*sizeof(char));
16524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (setValues[0] == NULL) {
16534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          free(setValues);
16544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          return;
16554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
16564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    setValues[1] = (char*)malloc(8*sizeof(char));
16584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (setValues[1] == NULL) {
16594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          free(setValues);
16604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          free(setValues[0]);
16614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev          return;
16624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
16634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    sprintf(setValues[0], "%d",mode);
16654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    sprintf(setValues[1], "%d",rate);
16664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.setext("Voip Mode Rate Config", 2, setValues);
16684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(setValues[1]);
16694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(setValues[0]);
16704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(setValues);
16714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return;
16724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
16734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_btsco_rate(int rate)
16754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
16764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    btsco_samplerate = rate;
16774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
16784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_enable_wide_voice(bool flag)
16804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
16814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = 0;
16824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16839efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_enable_wide_voice: flag %d", flag);
16844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
16854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(flag == true) {
16864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        control.set("Widevoice Enable", 1, 0);
16874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
16884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        control.set("Widevoice Enable", 0, 0);
16894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
16904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
16914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (platform_is_Fusion3()) {
16929746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED
16935ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        if (csd_wide_voice == NULL) {
16945ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            ALOGE("dlsym:Error:%s Loading csd_wide_voice", dlerror());
16955ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        } else {
16965ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            err = csd_wide_voice(flag);
16975ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            if (err < 0) {
16985ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani                ALOGE("enableWideVoice: csd_client_wide_voice error %d", err);
16995ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            }
17004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
17014113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif
17024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
17034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
17044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voc_rec_mode(uint8_t mode)
17064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
17079efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_set_voc_rec_mode: mode %d", mode);
17084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
17094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("Incall Rec Mode", mode, 0);
17104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
17114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_enable_fens(bool flag)
17134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
17144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = 0;
17154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17169efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_enable_fens: flag %d", flag);
17174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
17184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(flag == true) {
17194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        control.set("FENS Enable", 1, 0);
17204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
17214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        control.set("FENS Enable", 0, 0);
17224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
17234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (platform_is_Fusion3()) {
17259746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED
17265ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        if (csd_fens == NULL) {
17275ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            ALOGE("dlsym:Error:%s Loading csd_fens", dlerror());
17285ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        } else {
17295ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            err = csd_fens(flag);
17305ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            if (err < 0) {
17315ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani                ALOGE("s_enable_fens: csd_client error %d", err);
17325ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            }
17334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
17344113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif
17354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
17364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
17374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_enable_slow_talk(bool flag)
17394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
17404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err = 0;
17414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17429efed76df6b7c75d170e8f900f875f4329587719SathishKumar Mani    ALOGV("s_enable_slow_talk: flag %d", flag);
17434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
17444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if(flag == true) {
17454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        control.set("Slowtalk Enable", 1, 0);
17464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
17474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        control.set("Slowtalk Enable", 0, 0);
17484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
17494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (platform_is_Fusion3()) {
17519746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED
17525ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        if (csd_slow_talk == NULL) {
17535ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            ALOGE("dlsym:Error:%s Loading csd_slow_talk", dlerror());
17545ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani        } else {
17555ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            err = csd_slow_talk(flag);
17565ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            if (err < 0) {
17575ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani                ALOGE("s_enable_slow_talk: csd_client error %d", err);
17585ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani            }
17594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
17604113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif
17614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
17624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
17634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_flags(uint32_t flags)
17654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
17664113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGV("s_set_flags: flags %d", flags);
17674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    mDevSettingsFlag = flags;
17684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
17694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_compressed_vol(int value)
17714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
17724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t err = NO_ERROR;
17734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ALSAControl control("/dev/snd/controlC0");
17754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    control.set("COMPRESSED RX Volume",value,0);
17764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
17774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return err;
17784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
17794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
178074060dee8c9a414ad0345176e2422de18a4ff183ty.lee#ifdef SEPERATED_AUDIO_INPUT
178174060dee8c9a414ad0345176e2422de18a4ff183ty.leevoid s_setInput(int input)
178274060dee8c9a414ad0345176e2422de18a4ff183ty.lee{
178374060dee8c9a414ad0345176e2422de18a4ff183ty.lee    input_source = input;
178474060dee8c9a414ad0345176e2422de18a4ff183ty.lee    ALOGD("s_setInput() : input_source = %d",input_source);
178574060dee8c9a414ad0345176e2422de18a4ff183ty.lee}
178674060dee8c9a414ad0345176e2422de18a4ff183ty.lee#endif
17875ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani
17885ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#ifdef QCOM_CSDCLIENT_ENABLED
17895ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Manistatic void  s_set_csd_handle(void* handle)
17905ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani{
17915ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_handle = static_cast<void*>(handle);
17925ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    ALOGI("%s csd_handle: %p", __func__, csd_handle);
17935ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani
17945ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_disable_device = (int (*)())::dlsym(csd_handle,"csd_client_disable_device");
17955ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_enable_device = (int (*)(int,int,uint32_t))::dlsym(csd_handle,"csd_client_enable_device");
17965ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_start_voice = (int (*)())::dlsym(csd_handle,"csd_client_start_voice");
17975ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_stop_voice = (int (*)())::dlsym(csd_handle,"csd_client_stop_voice");
17985ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_volume = (int (*)(int))::dlsym(csd_handle,"csd_client_volume");
17995ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_mic_mute = (int (*)(int))::dlsym(csd_handle,"csd_client_mic_mute");
18005ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_wide_voice = (int (*)(uint8_t))::dlsym(csd_handle,"csd_client_wide_voice");
18015ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_fens = (int (*)(uint8_t))::dlsym(csd_handle,"csd_client_fens");
18025ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani    csd_slow_talk = (int (*)(uint8_t))::dlsym(csd_handle,"csd_client_slow_talk");
18035ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani}
18045ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#endif
18055ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani
18061c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.leestatic bool s_is_tmus()
18071c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee{
18081c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    char value[128];
18091c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    bool ret = false;
18101c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee
18111c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    if (mccmnc == 0) {
18121c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee        property_get("gsm.sim.operator.numeric",value,"0");
18131c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee        mccmnc = atoi(value);
18141c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    }
18151c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee
18161c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    ALOGD("%s: mnc_mcc :  %d", __FUNCTION__, mccmnc);
18171c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    switch(mccmnc)
18181c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    {
18191c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    //TMUS MCC(310), MNC(490, 260, 026)
18201c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    case 310490:
18211c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    case 310260:
18221c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    case 310026:
18231c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee        ret = true;
18241c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee        break;
18251c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    default:
18261c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee        ret = false;
18271c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee        break;
18281c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    }
18291c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee
18301c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee    return ret;
18311c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee}
18321c9f3b09a8fcdf65be0bdfa6cb832e6d2ec82fd3ty.lee
18334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1834