alsa_default.cpp revision 86c852bd4ef7ab3bce78f27e102ca7c00d457966
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> 254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include "AudioHardwareALSA.h" 264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <media/AudioRecord.h> 279746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevextern "C" { 294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include "csd_client.h" 304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 314113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif 324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#ifndef ALSA_DEFAULT_SAMPLE_RATE 344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define ALSA_DEFAULT_SAMPLE_RATE 44100 // in Hz 354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define BTSCO_RATE_16KHZ 16000 384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define USECASE_TYPE_RX 1 394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define USECASE_TYPE_TX 2 404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevnamespace android_audio_legacy 424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int s_device_open(const hw_module_t*, const char*, hw_device_t**); 454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int s_device_close(hw_device_t*); 464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_init(alsa_device_t *, ALSAHandleList &); 474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_open(alsa_handle_t *); 484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_close(alsa_handle_t *); 494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_standby(alsa_handle_t *); 504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_route(alsa_handle_t *, uint32_t, int); 514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_voice_call(alsa_handle_t *); 524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_voip_call(alsa_handle_t *); 534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_fm(alsa_handle_t *); 544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_voice_volume(int); 554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_voip_volume(int); 564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_mic_mute(int); 574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_voip_mic_mute(int); 584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_voip_config(int, int); 594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_fm_vol(int); 604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_btsco_rate(int); 614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_lpa_vol(int); 624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_enable_wide_voice(bool flag); 634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_enable_fens(bool flag); 644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_flags(uint32_t flags); 654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_compressed_vol(int); 664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_enable_slow_talk(bool flag); 674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_voc_rec_mode(uint8_t mode); 684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_volte_mic_mute(int state); 694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void s_set_volte_volume(int vol); 704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char mic_type[25]; 724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char curRxUCMDevice[50]; 734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char curTxUCMDevice[50]; 744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int fluence_mode; 754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int fmVolume; 764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic uint32_t mDevSettingsFlag = TTY_OFF; 774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int btsco_samplerate = 8000; 784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic bool pflag = false; 794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic ALSAUseCaseList mUseCaseList; 804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic hw_module_methods_t s_module_methods = { 824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev open : s_device_open 834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 854113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchevextern "C" hw_module_t HAL_MODULE_INFO_SYM = { 864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev tag : HARDWARE_MODULE_TAG, 874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev version_major : 1, 884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev version_minor : 0, 894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev id : ALSA_HARDWARE_MODULE_ID, 904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev name : "QCOM ALSA module", 914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev author : "QuIC Inc", 924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev methods : &s_module_methods, 934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dso : 0, 944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev reserved : {0,}, 954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int s_device_open(const hw_module_t* module, const char* name, 984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev hw_device_t** device) 994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 1004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char value[128]; 1014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev alsa_device_t *dev; 1024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev = (alsa_device_t *) malloc(sizeof(*dev)); 1034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!dev) return -ENOMEM; 1044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev memset(dev, 0, sizeof(*dev)); 1064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* initialize the procs */ 1084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->common.tag = HARDWARE_DEVICE_TAG; 1094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->common.version = 0; 1104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->common.module = (hw_module_t *) module; 1114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->common.close = s_device_close; 1124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->init = s_init; 1134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->open = s_open; 1144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->close = s_close; 1154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->route = s_route; 1164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->standby = s_standby; 1174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->startVoiceCall = s_start_voice_call; 1184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->startVoipCall = s_start_voip_call; 1194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->startFm = s_start_fm; 1204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setVoiceVolume = s_set_voice_volume; 1214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setVoipVolume = s_set_voip_volume; 1224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setMicMute = s_set_mic_mute; 1234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setVoipMicMute = s_set_voip_mic_mute; 1244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setVoipConfig = s_set_voip_config; 1254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setFmVolume = s_set_fm_vol; 1264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setBtscoRate = s_set_btsco_rate; 1274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setLpaVolume = s_set_lpa_vol; 1284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->enableWideVoice = s_enable_wide_voice; 1294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->enableFENS = s_enable_fens; 1304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setFlags = s_set_flags; 1314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setCompressedVolume = s_set_compressed_vol; 1324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->enableSlowTalk = s_enable_slow_talk; 1334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setVocRecMode = s_set_voc_rec_mode; 1344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setVoLTEMicMute = s_set_volte_mic_mute; 1354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev dev->setVoLTEVolume = s_set_volte_volume; 1364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *device = &dev->common; 1384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev property_get("persist.audio.handset.mic",value,"0"); 1404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(mic_type, value, sizeof(mic_type)); 1414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev property_get("persist.audio.fluence.mode",value,"0"); 1424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strcmp("broadside", value)) { 1434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev fluence_mode = FLUENCE_MODE_BROADSIDE; 1444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 1454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev fluence_mode = FLUENCE_MODE_ENDFIRE; 1464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 1474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(curRxUCMDevice, "None", sizeof(curRxUCMDevice)); 1484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(curTxUCMDevice, "None", sizeof(curTxUCMDevice)); 14986c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 1504113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("ALSA module opened"); 15186c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 1524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return 0; 1544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 1554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int s_device_close(hw_device_t* device) 1574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 1584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(device); 1594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev device = NULL; 1604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return 0; 1614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 1624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev// ---------------------------------------------------------------------------- 1644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic const int DEFAULT_SAMPLE_RATE = ALSA_DEFAULT_SAMPLE_RATE; 1664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void switchDevice(alsa_handle_t *handle, uint32_t devices, uint32_t mode); 1684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char *getUCMDevice(uint32_t devices, int input, char *rxDevice); 1694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void disableDevice(alsa_handle_t *handle); 1704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint getUseCaseType(const char *useCase); 1714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int callMode = AudioSystem::MODE_NORMAL; 1734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev// ---------------------------------------------------------------------------- 1744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevbool platform_is_Fusion3() 1764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 1774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char platform[128], baseband[128]; 1784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev property_get("ro.board.platform", platform, ""); 1794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev property_get("ro.baseband", baseband, ""); 1804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strcmp("msm8960", platform) && !strcmp("mdm", baseband)) 1814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return true; 1824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev else 1834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return false; 1844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 1854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint deviceName(alsa_handle_t *handle, unsigned flags, char **value) 1874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 1884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int ret = 0; 1894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char ident[70]; 1904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (flags & PCM_IN) { 1924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(ident, "CapturePCM/", sizeof(ident)); 1934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 1944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(ident, "PlaybackPCM/", sizeof(ident)); 1954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 1964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcat(ident, handle->useCase, sizeof(ident)); 1974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ret = snd_use_case_get(handle->ucMgr, ident, (const char **)value); 1984113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("Device value returned is %s", (*value)); 1994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ret; 2004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 2014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatus_t setHardwareParams(alsa_handle_t *handle) 2034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 2044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev struct snd_pcm_hw_params *params; 2054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned long bufferSize, reqBuffSize; 2064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned int periodTime, bufferTime; 2074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned int requestedRate = handle->sampleRate; 2084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int status = 0; 2094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int channels = handle->channels; 2104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_pcm_format_t format = SNDRV_PCM_FORMAT_S16_LE; 2114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params = (snd_pcm_hw_params*) calloc(1, sizeof(struct snd_pcm_hw_params)); 2134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!params) { 2144113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to allocate ALSA hardware parameters!"); 2154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 2164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 2174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev reqBuffSize = handle->bufferSize; 21986c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 2204113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("setHardwareParams: reqBuffSize %d channels %d sampleRate %d", 2214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (int) reqBuffSize, handle->channels, handle->sampleRate); 22286c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 2234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2249746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED 2254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (channels == 6) { 2264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC, strlen(SND_USE_CASE_VERB_HIFI_REC)) 2274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev || !strncmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC, strlen(SND_USE_CASE_MOD_CAPTURE_MUSIC))) { 2284113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("HWParams: Use 4 channels in kernel for 5.1(%s) recording ", handle->useCase); 2294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev channels = 4; 2304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev reqBuffSize = DEFAULT_IN_BUFFER_SIZE; 2314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 2324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 2334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 2344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_init(params); 2364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_set_mask(params, SNDRV_PCM_HW_PARAM_ACCESS, 2374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev SNDRV_PCM_ACCESS_RW_INTERLEAVED); 2384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (handle->format != SNDRV_PCM_FORMAT_S16_LE) { 2399746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani if (handle->format == AudioSystem::AMR_NB 2409746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani || handle->format == AudioSystem::AMR_WB 2419746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_QCHAT_ENABLED 2429746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani || handle->format == AudioSystem::EVRC 2439746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani || handle->format == AudioSystem::EVRCB 2449746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani || handle->format == AudioSystem::EVRCWB 2459746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif 2469746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani ) 2474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev format = SNDRV_PCM_FORMAT_SPECIAL; 2484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 2494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, 2504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev format); 2514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_set_mask(params, SNDRV_PCM_HW_PARAM_SUBFORMAT, 2524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev SNDRV_PCM_SUBFORMAT_STD); 2534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_set_min(params, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, reqBuffSize); 2544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_set_int(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS, 16); 2554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_set_int(params, SNDRV_PCM_HW_PARAM_FRAME_BITS, 2564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev channels * 16); 2574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_set_int(params, SNDRV_PCM_HW_PARAM_CHANNELS, 2584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev channels); 2594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_set_int(params, SNDRV_PCM_HW_PARAM_RATE, handle->sampleRate); 2604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_set_hw_refine(handle->handle, params); 2614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (param_set_hw_params(handle->handle, params)) { 2634113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("cannot set hw params"); 2644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 2654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 2664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev param_dump(params); 2674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->buffer_size = pcm_buffer_size(params); 2694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->period_size = pcm_period_size(params); 2704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->period_cnt = handle->handle->buffer_size/handle->handle->period_size; 27186c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 2724113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("setHardwareParams: buffer_size %d, period_size %d, period_cnt %d", 2734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->buffer_size, handle->handle->period_size, 2744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->period_cnt); 27586c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 2764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->rate = handle->sampleRate; 2774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->channels = handle->channels; 2784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->periodSize = handle->handle->period_size; 2794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC) && 2804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strcmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC) && 2814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (6 != handle->channels)) { 2824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev //Do not update buffersize for 5.1 recording 2834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->bufferSize = handle->handle->period_size; 2844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 2854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_ERROR; 2874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 2884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatus_t setSoftwareParams(alsa_handle_t *handle) 2904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 2914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev struct snd_pcm_sw_params* params; 2924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev struct pcm* pcm = handle->handle; 2934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned long periodSize = pcm->period_size; 2954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int channels = handle->channels; 2964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params = (snd_pcm_sw_params*) calloc(1, sizeof(struct snd_pcm_sw_params)); 2984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!params) { 2994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev LOG_ALWAYS_FATAL("Failed to allocate ALSA software parameters!"); 3004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 3014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3039746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED 3044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (channels == 6) { 3054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC, strlen(SND_USE_CASE_VERB_HIFI_REC)) 3064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev || !strncmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC, strlen(SND_USE_CASE_MOD_CAPTURE_MUSIC))) { 3074113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("SWParams: Use 4 channels in kernel for 5.1(%s) recording ", handle->useCase); 3084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev channels = 4; 3094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 3124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Get the current software parameters 3144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->tstamp_mode = SNDRV_PCM_TSTAMP_NONE; 3154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->period_step = 1; 3164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(((!strcmp(handle->useCase,SND_USE_CASE_MOD_PLAY_VOIP)) || 3174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strcmp(handle->useCase,SND_USE_CASE_VERB_IP_VOICECALL)))){ 3184113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("setparam: start & stop threshold for Voip "); 3194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->avail_min = handle->channels - 1 ? periodSize/4 : periodSize/2; 3204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->start_threshold = periodSize/2; 3214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->stop_threshold = INT_MAX; 3224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 3234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->avail_min = periodSize/2; 3244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->start_threshold = channels * (periodSize/4); 3254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->stop_threshold = INT_MAX; 3264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->silence_threshold = 0; 3284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev params->silence_size = 0; 3294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (param_set_sw_params(handle->handle, params)) { 3314113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("cannot set sw params"); 3324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 3334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_ERROR; 3354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 3364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid switchDevice(alsa_handle_t *handle, uint32_t devices, uint32_t mode) 3384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 3394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev const char **mods_list; 3404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev use_case_t useCaseNode; 3414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned usecase_type = 0; 3424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev bool inCallDevSwitch = false; 3434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char *rxDevice, *txDevice, ident[70], *use_case = NULL; 3444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = 0, index, mods_size; 3454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int rx_dev_id, tx_dev_id; 3464113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("%s: device %d", __FUNCTION__, devices); 3474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((mode == AudioSystem::MODE_IN_CALL) || (mode == AudioSystem::MODE_IN_COMMUNICATION)) { 3494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((devices & AudioSystem::DEVICE_OUT_WIRED_HEADSET) || 3504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_WIRED_HEADSET)) { 3514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev devices = devices | (AudioSystem::DEVICE_OUT_WIRED_HEADSET | 3524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::DEVICE_IN_WIRED_HEADSET); 3534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE) { 3544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev devices = devices | (AudioSystem::DEVICE_OUT_WIRED_HEADPHONE | 3554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::DEVICE_IN_BUILTIN_MIC); 3564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_EARPIECE) || 3574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_BUILTIN_MIC)) { 3584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev devices = devices | (AudioSystem::DEVICE_IN_BUILTIN_MIC | 3594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::DEVICE_OUT_EARPIECE); 3604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_SPEAKER) { 3614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev devices = devices | (AudioSystem::DEVICE_IN_BUILTIN_MIC | 3624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::DEVICE_OUT_SPEAKER); 3634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO) || 3644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET) || 3654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET)) { 3664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev devices = devices | (AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET | 3674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::DEVICE_OUT_BLUETOOTH_SCO); 3689746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED 3694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_ANC_HEADSET) || 3704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_ANC_HEADSET)) { 3714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev devices = devices | (AudioSystem::DEVICE_OUT_ANC_HEADSET | 3724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::DEVICE_IN_ANC_HEADSET); 3734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_ANC_HEADPHONE) { 3744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev devices = devices | (AudioSystem::DEVICE_OUT_ANC_HEADPHONE | 3754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::DEVICE_IN_BUILTIN_MIC); 3764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 3774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_AUX_DIGITAL) { 3784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev devices = devices | (AudioSystem::DEVICE_OUT_AUX_DIGITAL | 3794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::DEVICE_IN_AUX_DIGITAL); 3809746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_PROXY_DEVICE_ENABLED 3814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_PROXY) || 3824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_PROXY)) { 3834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev devices = devices | (AudioSystem::DEVICE_OUT_PROXY | 3844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::DEVICE_IN_PROXY); 3854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 3864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3889746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED 3894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((devices & AudioSystem::DEVICE_IN_BUILTIN_MIC) && ( 6 == handle->channels)) { 3904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC, strlen(SND_USE_CASE_VERB_HIFI_REC)) 3914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev || !strncmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC, strlen(SND_USE_CASE_MOD_CAPTURE_MUSIC))) { 3924113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV(" switchDevice , use ssr devices for channels:%d usecase:%s",handle->channels,handle->useCase); 3934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev s_set_flags(SSRQMIC_FLAG); 3944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 3974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev rxDevice = getUCMDevice(devices & AudioSystem::DEVICE_OUT_ALL, 0, NULL); 3994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev txDevice = getUCMDevice(devices & AudioSystem::DEVICE_IN_ALL, 1, rxDevice); 4004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (rxDevice != NULL) { 4024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((handle->handle) && (((!strncmp(rxDevice, DEVICE_SPEAKER_HEADSET, strlen(DEVICE_SPEAKER_HEADSET))) && 4034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((!strncmp(curRxUCMDevice, DEVICE_HEADPHONES, strlen(DEVICE_HEADPHONES))) || 4044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strncmp(curRxUCMDevice, DEVICE_HEADSET, strlen(DEVICE_HEADSET))))) || 4054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (((!strncmp(curRxUCMDevice, DEVICE_SPEAKER_HEADSET, strlen(DEVICE_SPEAKER_HEADSET))) && 4064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((!strncmp(rxDevice, DEVICE_HEADPHONES, strlen(DEVICE_HEADPHONES))) || 4074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strncmp(rxDevice, DEVICE_HEADSET, strlen(DEVICE_HEADSET))))))) && 4084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI, strlen(SND_USE_CASE_VERB_HIFI))) || 4094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strncmp(handle->useCase, SND_USE_CASE_MOD_PLAY_MUSIC, strlen(SND_USE_CASE_MOD_PLAY_MUSIC))))) { 4104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev pcm_close(handle->handle); 4114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle=NULL; 4124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->rxHandle=NULL; 4134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev pflag = true; 4144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((rxDevice != NULL) && (txDevice != NULL)) { 4184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (((strncmp(rxDevice, curRxUCMDevice, MAX_STR_LEN)) || 4194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (strncmp(txDevice, curTxUCMDevice, MAX_STR_LEN))) && (mode == AudioSystem::MODE_IN_CALL)) 4204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev inCallDevSwitch = true; 4214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_get(handle->ucMgr, "_verb", (const char **)&use_case); 4234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev mods_size = snd_use_case_get_list(handle->ucMgr, "_enamods", &mods_list); 4244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (rxDevice != NULL) { 4254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((strncmp(curRxUCMDevice, "None", 4)) && 4264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((strncmp(rxDevice, curRxUCMDevice, MAX_STR_LEN)) || (inCallDevSwitch == true))) { 4274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((use_case != NULL) && (strncmp(use_case, SND_USE_CASE_VERB_INACTIVE, 4284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_INACTIVE)))) { 4294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev usecase_type = getUseCaseType(use_case); 4304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (usecase_type & USECASE_TYPE_RX) { 4314113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("Deroute use case %s type is %d\n", use_case, usecase_type); 4324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(useCaseNode.useCase, use_case, MAX_STR_LEN); 4334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_verb", SND_USE_CASE_VERB_INACTIVE); 4344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev mUseCaseList.push_front(useCaseNode); 4354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mods_size) { 4384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev for(index = 0; index < mods_size; index++) { 4394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev usecase_type = getUseCaseType(mods_list[index]); 4404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (usecase_type & USECASE_TYPE_RX) { 4414113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("Deroute use case %s type is %d\n", mods_list[index], usecase_type); 4424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(useCaseNode.useCase, mods_list[index], MAX_STR_LEN); 4434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_dismod", mods_list[index]); 4444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev mUseCaseList.push_back(useCaseNode); 4454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_disdev", curRxUCMDevice); 4494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (txDevice != NULL) { 4524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((strncmp(curTxUCMDevice, "None", 4)) && 4534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((strncmp(txDevice, curTxUCMDevice, MAX_STR_LEN)) || (inCallDevSwitch == true))) { 4544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((use_case != NULL) && (strncmp(use_case, SND_USE_CASE_VERB_INACTIVE, 4554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_INACTIVE)))) { 4564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev usecase_type = getUseCaseType(use_case); 4574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((usecase_type & USECASE_TYPE_TX) && (!(usecase_type & USECASE_TYPE_RX))) { 4584113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("Deroute use case %s type is %d\n", use_case, usecase_type); 4594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(useCaseNode.useCase, use_case, MAX_STR_LEN); 4604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_verb", SND_USE_CASE_VERB_INACTIVE); 4614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev mUseCaseList.push_front(useCaseNode); 4624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mods_size) { 4654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev for(index = 0; index < mods_size; index++) { 4664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev usecase_type = getUseCaseType(mods_list[index]); 4674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((usecase_type & USECASE_TYPE_TX) && (!(usecase_type & USECASE_TYPE_RX))) { 4684113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("Deroute use case %s type is %d\n", mods_list[index], usecase_type); 4694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(useCaseNode.useCase, mods_list[index], MAX_STR_LEN); 4704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_dismod", mods_list[index]); 4714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev mUseCaseList.push_back(useCaseNode); 4724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_disdev", curTxUCMDevice); 4764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4784113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("%s,rxDev:%s, txDev:%s, curRxDev:%s, curTxDev:%s\n", __FUNCTION__, rxDevice, txDevice, curRxUCMDevice, curTxUCMDevice); 4799746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 4804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mode == AudioSystem::MODE_IN_CALL && platform_is_Fusion3() && (inCallDevSwitch == true)) { 4814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = csd_client_disable_device(); 4824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err < 0) 4834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 4844113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("csd_client_disable_device, failed, error %d", err); 4854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 4884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (rxDevice != NULL) { 4904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_enadev", rxDevice); 4914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(curRxUCMDevice, rxDevice, sizeof(curRxUCMDevice)); 4929746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_FM_ENABLED 4934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (devices & AudioSystem::DEVICE_OUT_FM) 4944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev s_set_fm_vol(fmVolume); 4954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 4964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (txDevice != NULL) { 4984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_enadev", txDevice); 4994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(curTxUCMDevice, txDevice, sizeof(curTxUCMDevice)); 5004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev for(ALSAUseCaseList::iterator it = mUseCaseList.begin(); it != mUseCaseList.end(); ++it) { 5024113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("Route use case %s\n", it->useCase); 5034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((use_case != NULL) && (strncmp(use_case, SND_USE_CASE_VERB_INACTIVE, 5044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_INACTIVE))) && (!strncmp(use_case, it->useCase, MAX_UC_LEN))) { 5054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_verb", it->useCase); 5064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 5074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_enamod", it->useCase); 5084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!mUseCaseList.empty()) 5114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev mUseCaseList.clear(); 5124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (use_case != NULL) { 5134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(use_case); 5144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev use_case = NULL; 5154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5164113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("switchDevice: curTxUCMDevivce %s curRxDevDevice %s", curTxUCMDevice, curRxUCMDevice); 5174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mode == AudioSystem::MODE_IN_CALL && platform_is_Fusion3() && (inCallDevSwitch == true)) { 5194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* get tx acdb id */ 5204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev memset(&ident,0,sizeof(ident)); 5214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(ident, "ACDBID/", sizeof(ident)); 5224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcat(ident, curTxUCMDevice, sizeof(ident)); 5234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev tx_dev_id = snd_use_case_get(handle->ucMgr, ident, NULL); 5244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* get rx acdb id */ 5264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev memset(&ident,0,sizeof(ident)); 5274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcpy(ident, "ACDBID/", sizeof(ident)); 5284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlcat(ident, curRxUCMDevice, sizeof(ident)); 5294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev rx_dev_id = snd_use_case_get(handle->ucMgr, ident, NULL); 5304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 53191e9fad9dff8746a5cd9d44ee4f1313d3ad7cfdcehgrace.kim if (((rx_dev_id == DEVICE_SPEAKER_MONO_RX_ACDB_ID ) || (rx_dev_id == DEVICE_SPEAKER_STEREO_RX_ACDB_ID )) 53291e9fad9dff8746a5cd9d44ee4f1313d3ad7cfdcehgrace.kim && tx_dev_id == DEVICE_HANDSET_TX_ACDB_ID) { 5334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev tx_dev_id = DEVICE_SPEAKER_TX_ACDB_ID; 5344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5369746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 5374113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("rx_dev_id=%d, tx_dev_id=%d\n", rx_dev_id, tx_dev_id); 5384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = csd_client_enable_device(rx_dev_id, tx_dev_id, mDevSettingsFlag); 5394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err < 0) 5404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 5414113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("csd_client_disable_device failed, error %d", err); 5424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5434113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif 5444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (rxDevice != NULL) { 5474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (pflag && (((!strncmp(rxDevice, DEVICE_SPEAKER_HEADSET, strlen(DEVICE_SPEAKER_HEADSET))) && 5484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((!strncmp(curRxUCMDevice, DEVICE_HEADPHONES, strlen(DEVICE_HEADPHONES))) || 5494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strncmp(curRxUCMDevice, DEVICE_HEADSET, strlen(DEVICE_HEADSET))))) || 5504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (((!strncmp(curRxUCMDevice, DEVICE_SPEAKER_HEADSET, strlen(DEVICE_SPEAKER_HEADSET))) && 5514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((!strncmp(rxDevice, DEVICE_HEADPHONES, strlen(DEVICE_HEADPHONES))) || 5524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strncmp(rxDevice, DEVICE_HEADSET, strlen(DEVICE_HEADSET))))))) && 5534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI, strlen(SND_USE_CASE_VERB_HIFI))) || 5544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strncmp(handle->useCase, SND_USE_CASE_MOD_PLAY_MUSIC, strlen(SND_USE_CASE_MOD_PLAY_MUSIC))))) { 5554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev s_open(handle); 5564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev pflag = false; 5574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (rxDevice != NULL) { 5614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(rxDevice); 5624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev rxDevice = NULL; 5634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (txDevice != NULL) { 5654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(txDevice); 5664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev txDevice = NULL; 5674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 5694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev// ---------------------------------------------------------------------------- 5714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_init(alsa_device_t *module, ALSAHandleList &list) 5734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 57486c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 5754113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_init: Initializing devices for ALSA module"); 57686c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 5774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev list.clear(); 5794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_ERROR; 5814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 5824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_open(alsa_handle_t *handle) 5844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 5854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char *devName; 5864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned flags = 0; 5874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = NO_ERROR; 5884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* No need to call s_close for LPA as pcm device open and close is handled by LPAPlayer in stagefright */ 5904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER)) || (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_LPA)) 5914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ||(!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_TUNNEL)) || (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_TUNNEL))) { 5924113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_open: Opening LPA /Tunnel playback"); 5934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_ERROR; 5944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev s_close(handle); 5974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 59886c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 5994113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_open: handle %p", handle); 60086c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 6014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // ASoC multicomponent requires a valid path (frontend/backend) for 6034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // the device to be opened 6044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // The PCM stream is opened in blocking mode, per ALSA defaults. The 6064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // AudioFlinger seems to assume blocking mode too, so asynchronous mode 6074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // should not be used. 6084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI)) || 6094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_MUSIC))) { 6104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags = PCM_OUT; 6114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 6124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags = PCM_IN; 6134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (handle->channels == 1) { 6154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags |= PCM_MONO; 6164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6179746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED 6184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev else if (handle->channels == 4 ) { 6194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags |= PCM_QUAD; 6204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (handle->channels == 6 ) { 6214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI_REC, strlen(SND_USE_CASE_VERB_HIFI_REC)) 6224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev || !strncmp(handle->useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC, strlen(SND_USE_CASE_MOD_CAPTURE_MUSIC))) { 6234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags |= PCM_QUAD; 6244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 6254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags |= PCM_5POINT1; 6264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 6294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev else { 6304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags |= PCM_STEREO; 6314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (deviceName(handle, flags, &devName) < 0) { 6334113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node: %s", devName); 6344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 6354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (devName != NULL) { 6374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = pcm_open(flags, (char*)devName); 6384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 6394113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 6404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 6414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!handle->handle) { 6444113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_open: Failed to initialize ALSA device '%s'", devName); 6454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 6464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 6474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->flags = flags; 6504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setHardwareParams(handle); 6514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err == NO_ERROR) { 6534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setSoftwareParams(handle); 6544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 6574113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Set HW/SW params failed: Closing the pcm stream"); 6584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev s_standby(handle); 6594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 6624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_ERROR; 6634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 6644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_voip_call(alsa_handle_t *handle) 6664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 6674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char* devName; 6694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char* devName1; 6704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned flags = 0; 6714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = NO_ERROR; 6724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint8_t voc_pkt[VOIP_BUFFER_MAX_SIZE]; 6734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev s_close(handle); 6754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags = PCM_OUT; 6764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags |= PCM_MONO; 6774113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("s_open:s_start_voip_call handle %p", handle); 6784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (deviceName(handle, flags, &devName) < 0) { 6804113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 6814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 6824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (devName != NULL) { 6854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = pcm_open(flags, (char*)devName); 6864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 6874113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 6884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 6894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!handle->handle) { 6924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 6934113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_open: Failed to initialize ALSA device '%s'", devName); 6944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 6954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 6964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 6974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!pcm_ready(handle->handle)) { 6984113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE(" pcm ready failed"); 6994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->flags = flags; 7024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setHardwareParams(handle); 7034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err == NO_ERROR) { 7054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setSoftwareParams(handle); 7064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_prepare(handle->handle); 7094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 7104113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("DEVICE_OUT_DIRECTOUTPUT: pcm_prepare failed"); 7114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* first write required start dsp */ 7144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev memset(&voc_pkt,0,sizeof(voc_pkt)); 7154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev pcm_write(handle->handle,&voc_pkt,handle->handle->period_size); 7164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->rxHandle = handle->handle; 7174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 7184113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("s_open: DEVICE_IN_COMMUNICATION "); 7194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags = PCM_IN; 7204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags |= PCM_MONO; 7214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = 0; 7224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (deviceName(handle, flags, &devName1) < 0) { 7244113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 7254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 7264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (devName != NULL) { 7284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = pcm_open(flags, (char*)devName1); 7294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 7304113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 7314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 7324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!handle->handle) { 7354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 7364113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_open: Failed to initialize ALSA device '%s'", devName); 7374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 7384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!pcm_ready(handle->handle)) { 7414113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE(" pcm ready in failed"); 7424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->flags = flags; 7454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setHardwareParams(handle); 7474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err == NO_ERROR) { 7494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setSoftwareParams(handle); 7504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_prepare(handle->handle); 7544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 7554113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("DEVICE_IN_COMMUNICATION: pcm_prepare failed"); 7564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* first read required start dsp */ 7594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev memset(&voc_pkt,0,sizeof(voc_pkt)); 7604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev pcm_read(handle->handle,&voc_pkt,handle->handle->period_size); 7614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_ERROR; 7624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 7634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_voice_call(alsa_handle_t *handle) 7654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 7664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char* devName; 7674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned flags = 0; 7684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = NO_ERROR; 7694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 77086c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 7714113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_start_voice_call: handle %p", handle); 77286c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 77386c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani 7744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // ASoC multicomponent requires a valid path (frontend/backend) for 7754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // the device to be opened 7764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags = PCM_OUT | PCM_MONO; 7784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (deviceName(handle, flags, &devName) < 0) { 7794113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 7804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 7814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (devName != NULL) { 7834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = pcm_open(flags, (char*)devName); 7844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 7854113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 7864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 7874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!handle->handle) { 7894113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voicecall: could not open PCM device"); 7904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 7914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 7934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->flags = flags; 7944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setHardwareParams(handle); 7954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 7964113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call: setHardwareParams failed"); 7974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 7984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 7994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setSoftwareParams(handle); 8014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 8024113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call: setSoftwareParams failed"); 8034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_prepare(handle->handle); 8074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 8084113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call: pcm_prepare failed"); 8094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (ioctl(handle->handle->fd, SNDRV_PCM_IOCTL_START)) { 8134113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call:SNDRV_PCM_IOCTL_START failed\n"); 8144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Store the PCM playback device pointer in rxHandle 8184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->rxHandle = handle->handle; 8194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 8204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Open PCM capture device 8224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags = PCM_IN | PCM_MONO; 8234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (deviceName(handle, flags, &devName) < 0) { 8244113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 8254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (devName != NULL) { 8284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = pcm_open(flags, (char*)devName); 8294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 8304113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 8314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 8324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!handle->handle) { 8344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 8354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->flags = flags; 8394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setHardwareParams(handle); 8404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 8414113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call: setHardwareParams failed"); 8424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setSoftwareParams(handle); 8464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 8474113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call: setSoftwareParams failed"); 8484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_prepare(handle->handle); 8524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 8534113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call: pcm_prepare failed"); 8544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (ioctl(handle->handle->fd, SNDRV_PCM_IOCTL_START)) { 8584113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call:SNDRV_PCM_IOCTL_START failed\n"); 8594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (platform_is_Fusion3()) { 8639746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 8644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = csd_client_start_voice(); 8654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err < 0) { 8664113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call: csd_client error %d\n", err); 8674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8694113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif 8704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 8734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_ERROR; 8744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8754765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevError: 8764113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_voice_call: Failed to initialize ALSA device '%s'", devName); 8774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 8784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev s_close(handle); 8794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 8804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 8814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start_fm(alsa_handle_t *handle) 8834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 8844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char *devName; 8854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned flags = 0; 8864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = NO_ERROR; 8874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8884113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: handle %p", handle); 8894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // ASoC multicomponent requires a valid path (frontend/backend) for 8914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // the device to be opened 8924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 8934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags = PCM_OUT | PCM_STEREO; 8944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (deviceName(handle, flags, &devName) < 0) { 8954113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 8964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 8974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 8984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (devName != NULL) { 8994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = pcm_open(flags, (char*)devName); 9004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 9014113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 9024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 9034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!handle->handle) { 9054113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: could not open PCM device"); 9064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->flags = flags; 9104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setHardwareParams(handle); 9114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 9124113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: setHardwareParams failed"); 9134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setSoftwareParams(handle); 9174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 9184113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: setSoftwareParams failed"); 9194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_prepare(handle->handle); 9234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 9244113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: setSoftwareParams failed"); 9254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (ioctl(handle->handle->fd, SNDRV_PCM_IOCTL_START)) { 9294113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: SNDRV_PCM_IOCTL_START failed\n"); 9304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Store the PCM playback device pointer in rxHandle 9344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->rxHandle = handle->handle; 9354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 9364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Open PCM capture device 9384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev flags = PCM_IN | PCM_STEREO; 9394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (deviceName(handle, flags, &devName) < 0) { 9404113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 9414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (devName != NULL) { 9444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = pcm_open(flags, (char*)devName); 9454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 9464113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Failed to get pcm device node"); 9474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 9484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!handle->handle) { 9504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle->flags = flags; 9544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setHardwareParams(handle); 9554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 9564113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: setHardwareParams failed"); 9574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = setSoftwareParams(handle); 9614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 9624113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: setSoftwareParams failed"); 9634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_prepare(handle->handle); 9674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 9684113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: pcm_prepare failed"); 9694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (ioctl(handle->handle->fd, SNDRV_PCM_IOCTL_START)) { 9734113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_start_fm: SNDRV_PCM_IOCTL_START failed\n"); 9744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev goto Error; 9754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 9764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev s_set_fm_vol(fmVolume); 9784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 9794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_ERROR; 9804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9814765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevError: 9824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(devName); 9834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev s_close(handle); 9844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NO_INIT; 9854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 9864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_fm_vol(int value) 9884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 9894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t err = NO_ERROR; 9904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 9924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Internal FM RX Volume",value,0); 9934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev fmVolume = value; 9944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return err; 9964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 9974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 9984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_lpa_vol(int value) 9994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 10004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t err = NO_ERROR; 10014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 10034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("LPA RX Volume",value,0); 10044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return err; 10064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 10074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_start(alsa_handle_t *handle) 10094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 10104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t err = NO_ERROR; 10114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(!handle->handle) { 10134113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("No active PCM driver to start"); 10144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return err; 10154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 10164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_prepare(handle->handle); 10184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return err; 10204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 10214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_close(alsa_handle_t *handle) 10234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 10244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int ret; 10254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t err = NO_ERROR; 10264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev struct pcm *h = handle->rxHandle; 10274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->rxHandle = 0; 102986c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 10304113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_close: handle %p h %p", handle, h); 103186c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 10324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (h) { 10334113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("s_close rxHandle\n"); 10344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_close(h); 10354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 10364113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_close: pcm_close failed for rxHandle with err %d", err); 10374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 10384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 10394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev h = handle->handle; 10414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = 0; 10424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (h) { 10444113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("s_close handle h %p\n", h); 10454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_close(h); 10464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 10474113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_close: pcm_close failed for handle with err %d", err); 10484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 10494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if ((!strcmp(handle->useCase, SND_USE_CASE_VERB_VOICECALL) || 10514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_VOICE)) && 10524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev platform_is_Fusion3()) { 10539746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 10544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = csd_client_stop_voice(); 10554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err < 0) { 10564113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_close: csd_client error %d\n", err); 10574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 10584113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif 10594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 10604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev disableDevice(handle); 10624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER)) || 10634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_LPA)) || 10644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_TUNNEL)) || 10654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_TUNNEL))){ 10664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev disableDevice(handle); 10674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 10684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return err; 10704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 10714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* 10734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev this is same as s_close, but don't discard 10744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev the device/mode info. This way we can still 10754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev close the device, hit idle and power-save, reopen the pcm 10764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev for the same device/mode after resuming 10774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev*/ 10784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_standby(alsa_handle_t *handle) 10794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 10804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int ret; 10814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t err = NO_ERROR; 10824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev struct pcm *h = handle->rxHandle; 10834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->rxHandle = 0; 108486c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 10854113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_standby: handle %p h %p", handle, h); 108686c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 10874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (h) { 10884113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_standby rxHandle\n"); 10894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_close(h); 10904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 10914113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_standby: pcm_close failed for rxHandle with err %d", err); 10924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 10934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 10944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev h = handle->handle; 10964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev handle->handle = 0; 10974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 10984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (h) { 109986c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 110086c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani ALOGD("s_standby handle h %p\n", h); 110186c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 11024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = pcm_close(h); 11034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(err != NO_ERROR) { 11044113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_standby: pcm_close failed for handle with err %d", err); 11054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 11064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev disableDevice(handle); 11074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER)) || 11084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_LPA)) || 11094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_TUNNEL)) || 11104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_TUNNEL))) { 11114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev disableDevice(handle); 11124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 11134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 11144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return err; 11154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 11164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 11174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_route(alsa_handle_t *handle, uint32_t devices, int mode) 11184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 11194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t status = NO_ERROR; 11204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 112186c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 11224113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_route: devices 0x%x in mode %d", devices, mode); 112386c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 11244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev callMode = mode; 11254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev switchDevice(handle, devices, mode); 11264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return status; 11274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 11284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 11294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint getUseCaseType(const char *useCase) 11304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 11314113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("use case is %s\n", useCase); 11324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strncmp(useCase, SND_USE_CASE_VERB_HIFI, 11334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_HIFI)) || 11344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER, 11354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_HIFI_LOW_POWER)) || 11364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_VERB_HIFI_TUNNEL, 11374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_HIFI_TUNNEL)) || 11384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_VERB_DIGITAL_RADIO, 11394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_DIGITAL_RADIO)) || 11404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_PLAY_MUSIC, 11414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_PLAY_MUSIC)) || 11424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_PLAY_LPA, 11434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_PLAY_LPA)) || 11444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_PLAY_TUNNEL, 11454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_PLAY_TUNNEL)) || 11464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_PLAY_FM, 11474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_PLAY_FM))) { 11484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return USECASE_TYPE_RX; 11494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (!strncmp(useCase, SND_USE_CASE_VERB_HIFI_REC, 11504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_HIFI_REC)) || 11514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_VERB_FM_REC, 11524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_FM_REC)) || 11534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_VERB_FM_A2DP_REC, 11544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_FM_A2DP_REC)) || 11554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_MUSIC, 11564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_CAPTURE_MUSIC)) || 11574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_FM, 11584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_CAPTURE_FM)) || 11594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_A2DP_FM, 11604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_CAPTURE_A2DP_FM))) { 11614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return USECASE_TYPE_TX; 11624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (!strncmp(useCase, SND_USE_CASE_VERB_VOICECALL, 11634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_VOICECALL)) || 11644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_VERB_IP_VOICECALL, 11654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_IP_VOICECALL)) || 11664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_VERB_DL_REC, 11674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_DL_REC)) || 11684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_VERB_UL_DL_REC, 11694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_UL_DL_REC)) || 11704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_PLAY_VOICE, 11714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_PLAY_VOICE)) || 11724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_PLAY_VOIP, 11734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_PLAY_VOIP)) || 11744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_VOICE_DL, 11754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_CAPTURE_VOICE_DL)) || 11764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_VOICE_UL_DL, 11774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_CAPTURE_VOICE_UL_DL)) || 11784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_CAPTURE_VOICE, 11794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_CAPTURE_VOICE)) || 11804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_VERB_VOLTE, 11814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_VOLTE)) || 11824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(useCase, SND_USE_CASE_MOD_PLAY_VOLTE, 11834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_MOD_PLAY_VOLTE))) { 11844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return (USECASE_TYPE_RX | USECASE_TYPE_TX); 11854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 11864113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("unknown use case %s\n", useCase); 11874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return 0; 11884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 11894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 11904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 11914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void disableDevice(alsa_handle_t *handle) 11924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 11934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned usecase_type = 0; 11944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int i, mods_size; 11954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char *useCase; 11964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev const char **mods_list; 11974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 11984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_get(handle->ucMgr, "_verb", (const char **)&useCase); 11994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (useCase != NULL) { 12004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strncmp(useCase, handle->useCase, MAX_UC_LEN)) { 12014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_verb", SND_USE_CASE_VERB_INACTIVE); 12024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 12034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_dismod", handle->useCase); 12044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 12054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(useCase); 12064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_get(handle->ucMgr, "_verb", (const char **)&useCase); 12074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (strncmp(useCase, SND_USE_CASE_VERB_INACTIVE, 12084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev strlen(SND_USE_CASE_VERB_INACTIVE))) 12094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev usecase_type |= getUseCaseType(useCase); 12104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev mods_size = snd_use_case_get_list(handle->ucMgr, "_enamods", &mods_list); 121186c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 121286c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani ALOGD("Number of modifiers %d\n", mods_size); 121386c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 12144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mods_size) { 12154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev for(i = 0; i < mods_size; i++) { 12164113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("index %d modifier %s\n", i, mods_list[i]); 12174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev usecase_type |= getUseCaseType(mods_list[i]); 12184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 12194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 122086c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 122186c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani ALOGD("usecase_type is %d\n", usecase_type); 122286c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 12234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!(usecase_type & USECASE_TYPE_TX) && (strncmp(curTxUCMDevice, "None", 4))) 12244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_disdev", curTxUCMDevice); 12254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!(usecase_type & USECASE_TYPE_RX) && (strncmp(curRxUCMDevice, "None", 4))) 12264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_set(handle->ucMgr, "_disdev", curRxUCMDevice); 12274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 12284113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("Invalid state, no valid use case found to disable"); 12294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 12304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(useCase); 12314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 12324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 12334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevchar *getUCMDevice(uint32_t devices, int input, char *rxDevice) 12344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 12354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!input) { 12364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!(mDevSettingsFlag & TTY_OFF) && 12374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (callMode == AudioSystem::MODE_IN_CALL) && 12384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((devices & AudioSystem::DEVICE_OUT_WIRED_HEADSET) || 12394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE))) { 12409746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED 12414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev || 12424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_ANC_HEADSET) || 12434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_ANC_HEADPHONE))) { 12444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 12454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mDevSettingsFlag & TTY_VCO) { 12464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_TTY_HEADSET_RX); 12474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (mDevSettingsFlag & TTY_FULL) { 12484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_TTY_FULL_RX); 12494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (mDevSettingsFlag & TTY_HCO) { 12504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_TTY_HANDSET_RX); /* HANDSET RX */ 12514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 12524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev }else if ((devices & AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET) || 12534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_DGTL_DOCK_HEADSET)) { 12544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_PROXY_RX); /* PROXY RX */ 12554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_SPEAKER) && 12564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((devices & AudioSystem::DEVICE_OUT_WIRED_HEADSET) || 12574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE))) { 12584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mDevSettingsFlag & ANC_FLAG) { 12594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_SPEAKER_ANC_HEADSET); /* COMBO SPEAKER+ANC HEADSET RX */ 12604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 12614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_SPEAKER_HEADSET); /* COMBO SPEAKER+HEADSET RX */ 12624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 12639746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED 12644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_SPEAKER) && 12654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((devices & AudioSystem::DEVICE_OUT_ANC_HEADSET) || 12664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_ANC_HEADPHONE))) { 12674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_SPEAKER_ANC_HEADSET); /* COMBO SPEAKER+ANC HEADSET RX */ 12684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_SPEAKER) && 12694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_FM_TX)) { 12704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_SPEAKER_FM_TX); /* COMBO SPEAKER+FM_TX RX */ 12714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 12724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_EARPIECE) { 12734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_EARPIECE); /* HANDSET RX */ 12744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_SPEAKER) { 12754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_SPEAKER); /* SPEAKER RX */ 12764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_WIRED_HEADSET) || 12774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE)) { 12784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mDevSettingsFlag & ANC_FLAG) { 12794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_ANC_HEADSET); /* ANC HEADSET RX */ 12804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 12814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_HEADPHONES); /* HEADSET RX */ 12824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 12839746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED 12844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_ANC_HEADSET) || 12854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_ANC_HEADPHONE)) { 12864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_ANC_HEADSET); /* ANC HEADSET RX */ 12874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 12884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO) || 12894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET) || 12904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT)) { 12914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (btsco_samplerate == BTSCO_RATE_16KHZ) 12924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_BTSCO_WB_RX); /* BTSCO RX*/ 12934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev else 12944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_BTSCO_NB_RX); /* BTSCO RX*/ 12954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP) || 12964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) || 12979746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_VOIP_ENABLED 12989746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani (devices & AudioSystem::DEVICE_OUT_DIRECTOUTPUT) || 12999746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif 13004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER)) { 13014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* Nothing to be done, use current active device */ 13024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (strncmp(curRxUCMDevice, "None", 4)) { 13034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(curRxUCMDevice); 13044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_AUX_DIGITAL) { 13064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_HDMI); /* HDMI RX */ 13079746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_PROXY_DEVICE_ENABLED 13084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_PROXY) { 13094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_PROXY_RX); /* PROXY RX */ 13109746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif 13119746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_FM_TX_ENABLED 13124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_FM_TX) { 13134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_FM_TX); /* FM Tx */ 13144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 13154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_OUT_DEFAULT) { 13164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_SPEAKER); /* SPEAKER RX */ 13174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 13184113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("No valid output device: %u", devices); 13194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 13214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!(mDevSettingsFlag & TTY_OFF) && 13224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (callMode == AudioSystem::MODE_IN_CALL) && 13234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ((devices & AudioSystem::DEVICE_IN_WIRED_HEADSET))) { 13249746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED 13254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ||(devices & AudioSystem::DEVICE_IN_ANC_HEADSET))) { 13264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 13274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mDevSettingsFlag & TTY_HCO) { 13284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_TTY_HEADSET_TX); 13294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (mDevSettingsFlag & TTY_FULL) { 13304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_TTY_FULL_TX); 13314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (mDevSettingsFlag & TTY_VCO) { 13324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strncmp(mic_type, "analog", 6)) { 13339746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani return strdup(SND_USE_CASE_DEV_TTY_HANDSET_ANALOG_TX); 13344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 13354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_TTY_HANDSET_TX); 13364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_IN_BUILTIN_MIC) { 13394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strncmp(mic_type, "analog", 6)) { 13404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_HANDSET); /* HANDSET TX */ 13414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 13424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (mDevSettingsFlag & DMIC_FLAG) { 13434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (((rxDevice != NULL) && 13444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(rxDevice, SND_USE_CASE_DEV_SPEAKER, 13454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (strlen(SND_USE_CASE_DEV_SPEAKER)+1))) || 13464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev !strncmp(curRxUCMDevice, SND_USE_CASE_DEV_SPEAKER, 13474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (strlen(SND_USE_CASE_DEV_SPEAKER)+1))) { 13484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (fluence_mode == FLUENCE_MODE_ENDFIRE) { 13494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_SPEAKER_DUAL_MIC_ENDFIRE); /* DUALMIC EF TX */ 13504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (fluence_mode == FLUENCE_MODE_BROADSIDE) { 13514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_SPEAKER_DUAL_MIC_BROADSIDE); /* DUALMIC BS TX */ 13524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 13544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (fluence_mode == FLUENCE_MODE_ENDFIRE) { 13554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_DUAL_MIC_ENDFIRE); /* DUALMIC EF TX */ 13564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (fluence_mode == FLUENCE_MODE_BROADSIDE) { 13574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_DUAL_MIC_BROADSIDE); /* DUALMIC BS TX */ 13584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (mDevSettingsFlag & QMIC_FLAG){ 13614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_QUAD_MIC); 13624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13639746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED 13644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev else if (mDevSettingsFlag & SSRQMIC_FLAG){ 13654113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("return SSRQMIC_FLAG: 0x%x devices:0x%x",mDevSettingsFlag,devices); 13664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Mapping for quad mic input device. 13674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_SSR_QUAD_MIC); /* SSR Quad MIC */ 13684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 13704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev else { 13714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_LINE); /* BUILTIN-MIC TX */ 13724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_IN_AUX_DIGITAL) { 13754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_HDMI_TX); /* HDMI TX */ 13769746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_ANC_HEADSET_ENABLED 13774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_IN_WIRED_HEADSET) || 13784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_ANC_HEADSET)) { 13794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_HEADSET); /* HEADSET TX */ 13804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 13814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if (devices & AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET) { 13824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (btsco_samplerate == BTSCO_RATE_16KHZ) 13834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_BTSCO_WB_TX); /* BTSCO TX*/ 13844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev else 13854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_BTSCO_NB_TX); /* BTSCO TX*/ 13869746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_USBAUDIO_ENABLED 13874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_IN_ANLG_DOCK_HEADSET) || 13884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_PROXY)) { 13894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_PROXY_TX); /* PROXY TX */ 13904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 13914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_IN_COMMUNICATION) || 13924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_VOICE_CALL)) { 13934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* Nothing to be done, use current active device */ 13944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (strncmp(curTxUCMDevice, "None", 4)) { 13954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(curTxUCMDevice); 13964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 13979746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_FM_ENABLED 13984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_IN_FM_RX) || 13994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_FM_RX_A2DP)) { 14004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* Nothing to be done, use current tx device or set dummy device */ 14014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (strncmp(curTxUCMDevice, "None", 4)) { 14024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(curTxUCMDevice); 14034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 14044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_DUMMY_TX); 14054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 14064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 14074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else if ((devices & AudioSystem::DEVICE_IN_AMBIENT) || 14084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev (devices & AudioSystem::DEVICE_IN_BACK_MIC)) { 14094113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGI("No proper mapping found with UCM device list, setting default"); 14104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (!strncmp(mic_type, "analog", 6)) { 14114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_HANDSET); /* HANDSET TX */ 14124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 14134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return strdup(SND_USE_CASE_DEV_LINE); /* BUILTIN-MIC TX */ 14144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 14154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 14164113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("No valid input device: %u", devices); 14174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 14184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 14194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return NULL; 14204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 14214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 14224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voice_volume(int vol) 14234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 14244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = 0; 142586c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 14264113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_set_voice_volume: volume %d", vol); 142786c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 14284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 14294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Voice Rx Volume", vol, 0); 14304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 14314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (platform_is_Fusion3()) { 14329746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 14334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = csd_client_volume(vol); 14344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err < 0) { 14354113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_set_voice_volume: csd_client error %d", err); 14364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 14374113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif 14384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 14394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 14404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 14414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_volte_volume(int vol) 14424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 144386c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 14444113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_set_volte_volume: volume %d", vol); 144586c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 14464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 14474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("VoLTE Rx Volume", vol, 0); 14484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 14494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 14504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 14514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voip_volume(int vol) 14524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 145386c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 14544113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_set_voip_volume: volume %d", vol); 145586c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 14564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 14574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Voip Rx Volume", vol, 0); 14584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 14594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_mic_mute(int state) 14604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 14614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = 0; 146286c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 14634113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_set_mic_mute: state %d", state); 146486c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 14654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 14664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Voice Tx Mute", state, 0); 14674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 14684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (platform_is_Fusion3()) { 14699746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 14704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = csd_client_mic_mute(state); 14714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err < 0) { 14724113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_set_mic_mute: csd_client error %d", err); 14734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 14744113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif 14754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 14764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 14774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_volte_mic_mute(int state) 14784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 147986c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 14804113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_set_volte_mic_mute: state %d", state); 148186c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 14824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 14834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("VoLTE Tx Mute", state, 0); 14844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 14854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 14864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voip_mic_mute(int state) 14874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 148886c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 14894113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_set_voip_mic_mute: state %d", state); 149086c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 14914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 14924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Voip Tx Mute", state, 0); 14934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 14944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 14954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voip_config(int mode, int rate) 14964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 149786c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 14984113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_set_voip_config: mode %d,rate %d", mode, rate); 149986c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 15004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 15014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char** setValues; 15024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev setValues = (char**)malloc(2*sizeof(char*)); 15034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (setValues == NULL) { 15044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return; 15054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 15064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev setValues[0] = (char*)malloc(4*sizeof(char)); 15074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (setValues[0] == NULL) { 15084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(setValues); 15094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return; 15104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 15114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev setValues[1] = (char*)malloc(8*sizeof(char)); 15134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (setValues[1] == NULL) { 15144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(setValues); 15154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(setValues[0]); 15164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return; 15174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 15184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev sprintf(setValues[0], "%d",mode); 15204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev sprintf(setValues[1], "%d",rate); 15214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.setext("Voip Mode Rate Config", 2, setValues); 15234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(setValues[1]); 15244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(setValues[0]); 15254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev free(setValues); 15264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return; 15274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 15284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_btsco_rate(int rate) 15304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 15314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev btsco_samplerate = rate; 15324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 15334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_enable_wide_voice(bool flag) 15354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 15364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = 0; 15374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 153886c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 15394113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_enable_wide_voice: flag %d", flag); 154086c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 15414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 15424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(flag == true) { 15434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Widevoice Enable", 1, 0); 15444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 15454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Widevoice Enable", 0, 0); 15464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 15474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (platform_is_Fusion3()) { 15499746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 15504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err == csd_client_wide_voice(flag); 15514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err < 0) { 15524113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_enable_wide_voice: csd_client error %d", err); 15534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 15544113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif 15554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 15564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 15574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_voc_rec_mode(uint8_t mode) 15594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 156086c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 15614113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_set_voc_rec_mode: mode %d", mode); 156286c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 15634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 15644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Incall Rec Mode", mode, 0); 15654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 15664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_enable_fens(bool flag) 15684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 15694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = 0; 15704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 157186c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 15724113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_enable_fens: flag %d", flag); 157386c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 15744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 15754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(flag == true) { 15764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("FENS Enable", 1, 0); 15774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 15784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("FENS Enable", 0, 0); 15794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 15804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (platform_is_Fusion3()) { 15829746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 15834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = csd_client_fens(flag); 15844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err < 0) { 15854113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_enable_fens: csd_client error %d", err); 15864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 15874113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif 15884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 15894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 15904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 15914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_enable_slow_talk(bool flag) 15924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 15934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int err = 0; 15944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 159586c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#if LOCAL_LOGD 15964113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGD("s_enable_slow_talk: flag %d", flag); 159786c852bd4ef7ab3bce78f27e102ca7c00d457966Ajay Dudani#endif 15984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 15994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if(flag == true) { 16004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Slowtalk Enable", 1, 0); 16014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } else { 16024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("Slowtalk Enable", 0, 0); 16034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 16044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 16054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (platform_is_Fusion3()) { 16069746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_CSDCLIENT_ENABLED 16074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev err = csd_client_slow_talk(flag); 16084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev if (err < 0) { 16094113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGE("s_enable_slow_talk: csd_client error %d", err); 16104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 16114113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#endif 16124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 16134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 16144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 16154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid s_set_flags(uint32_t flags) 16164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 16174113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev ALOGV("s_set_flags: flags %d", flags); 16184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev mDevSettingsFlag = flags; 16194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 16204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 16214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic status_t s_set_compressed_vol(int value) 16224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 16234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t err = NO_ERROR; 16244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 16254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl control("/dev/snd/controlC0"); 16264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev control.set("COMPRESSED RX Volume",value,0); 16274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 16284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return err; 16294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 16304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 16314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 1632