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