1b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* 2a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta * Copyright (C) 2013-2016 The Android Open Source Project 3b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 4b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * you may not use this file except in compliance with the License. 6b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * You may obtain a copy of the License at 7b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 8b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 10b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * Unless required by applicable law or agreed to in writing, software 11b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * See the License for the specific language governing permissions and 14b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * limitations under the License. 15b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent */ 16b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define LOG_TAG "msm8974_platform" 17b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/*#define LOG_NDEBUG 0*/ 18b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define LOG_NDDEBUG 0 19b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 20b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <stdlib.h> 21b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <dlfcn.h> 22b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <cutils/log.h> 239f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda#include <cutils/str_parms.h> 24b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <cutils/properties.h> 25b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <audio_hw.h> 26b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <platform_api.h> 27b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include "platform.h" 2863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda#include "audio_extn.h" 291a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta#include <linux/msm_audio.h> 30b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 3160ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta#define MIXER_XML_DEFAULT_PATH "/system/etc/mixer_paths.xml" 3260ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta#define MIXER_XML_BASE_STRING "/system/etc/mixer_paths" 3360ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta#define TOMTOM_8226_SND_CARD_NAME "msm8226-tomtom-snd-card" 3460ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta#define TOMTOM_MIXER_FILE_SUFFIX "wcd9330" 3560ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta 36b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define LIB_ACDB_LOADER "libacdbloader.so" 3747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George#define AUDIO_DATA_BLOCK_MIXER_CTL "HDMI EDID" 385c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda#define CVD_VERSION_MIXER_CTL "CVD Version" 39b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 40f9583c366559860ec5f287816908216c50cb917eEric Laurent#define min(a, b) ((a) < (b) ? (a) : (b)) 41b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 42b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* 43b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * This file will have a maximum of 38 bytes: 44b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 45b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 4 bytes: number of audio blocks 46b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 4 bytes: total length of Short Audio Descriptor (SAD) blocks 47b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * Maximum 10 * 3 bytes: SAD blocks 48b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent */ 49b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define MAX_SAD_BLOCKS 10 50b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define SAD_BLOCK_SIZE 3 51b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 525c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda#define MAX_CVD_VERSION_STRING_SIZE 100 535c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda 54b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* EDID format ID for LPCM audio */ 55b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define EDID_FORMAT_LPCM 1 56b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 571b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo/* Retry for delay in FW loading*/ 581b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo#define RETRY_NUMBER 10 591b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo#define RETRY_US 500000 604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava#define MAX_SND_CARD 8 6153b2cf0c72aa18a5848919e2309731af652e84f9sangwoo 62c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda#define MAX_SND_CARD_NAME_LEN 31 63c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 641a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta#define DEFAULT_APP_TYPE_RX_PATH 0x11130 651a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 66c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park#define TOSTRING_(x) #x 67c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park#define TOSTRING(x) TOSTRING_(x) 68c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park 69b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstruct audio_block_header 70b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 71b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int reserved; 72b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int length; 73b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}; 74b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 751a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehtaenum { 761a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta CAL_MODE_SEND = 0x1, 771a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta CAL_MODE_PERSIST = 0x2, 781a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta CAL_MODE_RTAC = 0x4 791a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta}; 801a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 812f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park#define PLATFORM_CONFIG_KEY_OPERATOR_INFO "operator_info" 822f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 832f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstruct operator_info { 842f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct listnode list; 852f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char *name; 862f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char *mccmnc; 872f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}; 882f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 892f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstruct operator_specific_device { 902f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct listnode list; 912f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char *operator; 922f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char *mixer_path; 932f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park int acdb_id; 942f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}; 952f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 962f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic struct listnode operator_info_list; 972f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic struct listnode *operator_specific_device_table[SND_DEVICE_MAX]; 982f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 9983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda/* Audio calibration related functions */ 100b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef void (*acdb_deallocate_t)(); 101c698f1313378541ec781a986fc68615ec35536c3vivek mehtatypedef int (*acdb_init_v2_cvd_t)(char *, char *, int); 1025c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandatypedef int (*acdb_init_v2_t)(char *); 103b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef int (*acdb_init_t)(); 104b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef void (*acdb_send_audio_cal_t)(int, int); 105b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef void (*acdb_send_voice_cal_t)(int, int); 10683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandatypedef int (*acdb_reload_vocvoltable_t)(int); 1071a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehtatypedef int (*acdb_send_gain_dep_cal_t)(int, int, int, int, int); 108b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 109b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Audio calibration related functions */ 110b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstruct platform_data { 111b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct audio_device *adev; 112b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent bool fluence_in_spkr_mode; 113b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent bool fluence_in_voice_call; 1143ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda bool fluence_in_voice_comm; 115b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent bool fluence_in_voice_rec; 116c92c59683257878fb8dc08d827313b4a865898daPrashant Malani /* 0 = no fluence, 1 = fluence, 2 = fluence pro */ 117c92c59683257878fb8dc08d827313b4a865898daPrashant Malani int fluence_type; 118c92c59683257878fb8dc08d827313b4a865898daPrashant Malani int source_mic_type; 1191f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda bool speaker_lr_swap; 1201f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda 121b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent void *acdb_handle; 1223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda acdb_deallocate_t acdb_deallocate; 1233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda acdb_send_audio_cal_t acdb_send_audio_cal; 1243ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda acdb_send_voice_cal_t acdb_send_voice_cal; 12583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda acdb_reload_vocvoltable_t acdb_reload_vocvoltable; 1261a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta acdb_send_gain_dep_cal_t acdb_send_gain_dep_cal; 12783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda struct csd_data *csd; 128f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda char ec_ref_mixer_path[64]; 129c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 130c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda char *snd_card_name; 131c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park int max_vol_index; 132c92c59683257878fb8dc08d827313b4a865898daPrashant Malani int max_mic_count; 133de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 134de4849cee04a23ae84da96487e344f75f93e5585vivek mehta void *hw_info; 135b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}; 136b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 13798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic int pcm_device_table[AUDIO_USECASE_MAX][2] = { 13883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE, 13983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda DEEP_BUFFER_PCM_DEVICE}, 14083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE, 14183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda LOWLATENCY_PCM_DEVICE}, 14283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE, 14383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda MULTIMEDIA2_PCM_DEVICE}, 14483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda [USECASE_AUDIO_PLAYBACK_OFFLOAD] = {PLAYBACK_OFFLOAD_DEVICE, 14583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda PLAYBACK_OFFLOAD_DEVICE}, 1462bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda [USECASE_AUDIO_PLAYBACK_TTS] = {MULTIMEDIA2_PCM_DEVICE, 1472bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda MULTIMEDIA2_PCM_DEVICE}, 1482bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda [USECASE_AUDIO_PLAYBACK_ULL] = {MULTIMEDIA3_PCM_DEVICE, 1492bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda MULTIMEDIA3_PCM_DEVICE}, 1502bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda 15183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, 15283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda AUDIO_RECORD_PCM_DEVICE}, 15383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE, 15483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda LOWLATENCY_PCM_DEVICE}, 1552bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda 15683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE, 15783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda VOICE_CALL_PCM_DEVICE}, 1584b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava [USECASE_VOICE2_CALL] = {VOICE2_CALL_PCM_DEVICE, VOICE2_CALL_PCM_DEVICE}, 1594b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava [USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE}, 1604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava [USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE}, 1614b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava [USECASE_VOWLAN_CALL] = {VOWLAN_CALL_PCM_DEVICE, VOWLAN_CALL_PCM_DEVICE}, 162a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta [USECASE_VOICEMMODE1_CALL] = {VOICEMMODE1_CALL_PCM_DEVICE, 163a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta VOICEMMODE1_CALL_PCM_DEVICE}, 164a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta [USECASE_VOICEMMODE2_CALL] = {VOICEMMODE2_CALL_PCM_DEVICE, 165a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta VOICEMMODE2_CALL_PCM_DEVICE}, 166a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta 1674b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava [USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE, 1684b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava AUDIO_RECORD_PCM_DEVICE}, 1694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava [USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE, 1704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava AUDIO_RECORD_PCM_DEVICE}, 1714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE, 1724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava AUDIO_RECORD_PCM_DEVICE}, 1738e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX}, 17499c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda 17563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda [USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1}, 17663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda [USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE}, 17763863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda 17899c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda [USECASE_AUDIO_PLAYBACK_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE, 17999c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda AFE_PROXY_RECORD_PCM_DEVICE}, 18099c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda [USECASE_AUDIO_RECORD_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE, 18199c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda AFE_PROXY_RECORD_PCM_DEVICE}, 1824211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin [USECASE_AUDIO_DSM_FEEDBACK] = {QUAT_MI2S_PCM_DEVICE, QUAT_MI2S_PCM_DEVICE}, 18399c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda 184b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}; 185b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 186b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Array to store sound devices */ 187b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic const char * const device_table[SND_DEVICE_MAX] = { 188b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_NONE] = "none", 189b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent /* Playback sound devices */ 190b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_HANDSET] = "handset", 191b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_SPEAKER] = "speaker", 192b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse", 1931b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent [SND_DEVICE_OUT_SPEAKER_SAFE] = "speaker-safe", 194b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_HEADPHONES] = "headphones", 19509f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent [SND_DEVICE_OUT_LINE] = "line", 196b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones", 1973b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda [SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES] = "speaker-safe-and-headphones", 198744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent [SND_DEVICE_OUT_SPEAKER_AND_LINE] = "speaker-and-line", 1993b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda [SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE] = "speaker-safe-and-line", 200b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset", 2019d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent [SND_DEVICE_OUT_VOICE_HAC_HANDSET] = "voice-hac-handset", 202b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker", 203b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones", 20409f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent [SND_DEVICE_OUT_VOICE_LINE] = "voice-line", 205b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_HDMI] = "hdmi", 206b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi", 207b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset", 2089f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb", 209b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = "voice-handset-tmus", 210b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones", 211b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones", 212b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset", 21399c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda [SND_DEVICE_OUT_VOICE_TX] = "voice-tx", 21463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected", 21563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected", 2167629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti [SND_DEVICE_OUT_VOICE_SPEAKER_HFP] = "voice-speaker-hfp", 217b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 218b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent /* Capture sound devices */ 219b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic", 2203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic", 2213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_MIC_NS] = "handset-mic", 2223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = "handset-mic", 2233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC] = "dmic-endfire", 2243ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC_AEC] = "dmic-endfire", 2253ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC_NS] = "dmic-endfire", 2263ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = "dmic-endfire", 2273ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC_STEREO] = "dmic-endfire", 2283ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 229b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic", 2303ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic", 2313ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_MIC_NS] = "speaker-mic", 2323ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = "speaker-mic", 2333ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC] = "speaker-dmic-endfire", 2343ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = "speaker-dmic-endfire", 2353ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC_NS] = "speaker-dmic-endfire", 2363ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = "speaker-dmic-endfire", 2373ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC_STEREO] = "speaker-dmic-endfire", 2383ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 239b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic", 240cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent [SND_DEVICE_IN_HEADSET_MIC_AEC] = "headset-mic", 2413ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 242b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic", 243b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic", 244e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda [SND_DEVICE_IN_BT_SCO_MIC_NREC] = "bt-sco-mic", 2459f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb", 246e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = "bt-sco-mic-wb", 247b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic", 2483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 2493ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_DMIC] = "voice-dmic-ef", 2503ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_DMIC_TMUS] = "voice-dmic-ef-tmus", 2513ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic", 2523ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = "voice-speaker-dmic-ef", 2537629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = "voice-speaker-mic-hfp", 2543ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic", 255b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic", 256b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic", 257b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic", 2583ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 259b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic", 2603ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic", 261733c1df5828d63f547553b4a441668905306a4e2vivek mehta [SND_DEVICE_IN_VOICE_REC_MIC_AEC] = "voice-rec-mic", 2623ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef", 2633ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence", 2648c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = "headset-mic", 26599c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda 2669034bc45854d86d45f44e23ac705aeff9a6e6e51Ricardo Garcia [SND_DEVICE_IN_UNPROCESSED_MIC] = "unprocessed-mic", 2670125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = "unprocessed-stereo-mic", 2680125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = "unprocessed-three-mic", 2690125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = "unprocessed-quad-mic", 2700125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = "unprocessed-headset-mic", 27190fb96106e9e2db75e214722c797d013e10e5328rago 27299c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda [SND_DEVICE_IN_VOICE_RX] = "voice-rx", 27363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda 274c92c59683257878fb8dc08d827313b4a865898daPrashant Malani [SND_DEVICE_IN_THREE_MIC] = "three-mic", 275c92c59683257878fb8dc08d827313b4a865898daPrashant Malani [SND_DEVICE_IN_QUAD_MIC] = "quad-mic", 27663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback", 277c92c59683257878fb8dc08d827313b4a865898daPrashant Malani [SND_DEVICE_IN_HANDSET_TMIC] = "three-mic", 278c92c59683257878fb8dc08d827313b4a865898daPrashant Malani [SND_DEVICE_IN_HANDSET_QMIC] = "quad-mic", 279733c1df5828d63f547553b4a441668905306a4e2vivek mehta [SND_DEVICE_IN_HANDSET_TMIC_AEC] = "three-mic", 280733c1df5828d63f547553b4a441668905306a4e2vivek mehta [SND_DEVICE_IN_HANDSET_QMIC_AEC] = "quad-mic", 281b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}; 282b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 283b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* ACDB IDs (audio DSP path configuration IDs) for each sound device */ 2845bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgestatic int acdb_device_table[SND_DEVICE_MAX] = { 285b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_NONE] = -1, 286b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_HANDSET] = 7, 287b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_SPEAKER] = 15, 288b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_SPEAKER_REVERSE] = 15, 2891b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent [SND_DEVICE_OUT_SPEAKER_SAFE] = 15, 290b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_HEADPHONES] = 10, 291744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent [SND_DEVICE_OUT_LINE] = 77, 292b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10, 2933b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda [SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES] = 10, 294744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent [SND_DEVICE_OUT_SPEAKER_AND_LINE] = 77, 2953b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda [SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE] = 77, 296235c34827f7b3b8977fe76dea1fb8d818fd74312Ravi Kumar Alamanda [SND_DEVICE_OUT_VOICE_HANDSET] = ACDB_ID_VOICE_HANDSET, 297235c34827f7b3b8977fe76dea1fb8d818fd74312Ravi Kumar Alamanda [SND_DEVICE_OUT_VOICE_SPEAKER] = ACDB_ID_VOICE_SPEAKER, 2989d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent [SND_DEVICE_OUT_VOICE_HAC_HANDSET] = 53, 299b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10, 300744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent [SND_DEVICE_OUT_VOICE_LINE] = 77, 301b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_HDMI] = 18, 302b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 15, 303b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_BT_SCO] = 22, 3049f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda [SND_DEVICE_OUT_BT_SCO_WB] = 39, 30583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = ACDB_ID_VOICE_HANDSET_TMUS, 306b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17, 307b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17, 308b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37, 30999c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda [SND_DEVICE_OUT_VOICE_TX] = 45, 31063863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124, 31163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101, 312e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti [SND_DEVICE_OUT_VOICE_SPEAKER_HFP] = ACDB_ID_VOICE_SPEAKER, 313b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 314b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_HANDSET_MIC] = 4, 3153ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106, 3163ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_MIC_NS] = 107, 3173ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = 108, 3183ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC] = 41, 3193ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC_AEC] = 109, 3203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC_NS] = 110, 3213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = 111, 3223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_HANDSET_DMIC_STEREO] = 34, 3233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 3243ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_MIC] = 11, 3253ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 112, 3263ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_MIC_NS] = 113, 3273ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = 114, 3283ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC] = 43, 3293ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = 115, 3303ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC_NS] = 116, 3313ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117, 3323ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_SPEAKER_DMIC_STEREO] = 35, 3333ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 33490fb96106e9e2db75e214722c797d013e10e5328rago [SND_DEVICE_IN_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC, 335cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent [SND_DEVICE_IN_HEADSET_MIC_AEC] = ACDB_ID_HEADSET_MIC_AEC, 3363ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 337b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_HDMI_MIC] = 4, 338b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_BT_SCO_MIC] = 21, 339e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda [SND_DEVICE_IN_BT_SCO_MIC_NREC] = 21, 3409f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38, 341e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = 38, 342b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_CAMCORDER_MIC] = 61, 3433ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 3443ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_DMIC] = 41, 3453ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_DMIC_TMUS] = ACDB_ID_VOICE_DMIC_EF_TMUS, 3463ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11, 347e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = 11, 3483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43, 34990fb96106e9e2db75e214722c797d013e10e5328rago [SND_DEVICE_IN_VOICE_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC, 350b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16, 351b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36, 352b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16, 3533ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 35490fb96106e9e2db75e214722c797d013e10e5328rago [SND_DEVICE_IN_VOICE_REC_MIC] = ACDB_ID_VOICE_REC_MIC, 3553ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_REC_MIC_NS] = 113, 356733c1df5828d63f547553b4a441668905306a4e2vivek mehta [SND_DEVICE_IN_VOICE_REC_MIC_AEC] = 112, 3573ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 35, 3583ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 43, 35990fb96106e9e2db75e214722c797d013e10e5328rago [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC, 36090fb96106e9e2db75e214722c797d013e10e5328rago 36190fb96106e9e2db75e214722c797d013e10e5328rago [SND_DEVICE_IN_UNPROCESSED_MIC] = ACDB_ID_VOICE_REC_MIC, 36290fb96106e9e2db75e214722c797d013e10e5328rago [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC, 3634ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = 35, 3644ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = 125, 3654ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = 125, 36699c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda 36799c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda [SND_DEVICE_IN_VOICE_RX] = 44, 36863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda 369c92c59683257878fb8dc08d827313b4a865898daPrashant Malani [SND_DEVICE_IN_THREE_MIC] = 46, 370c92c59683257878fb8dc08d827313b4a865898daPrashant Malani [SND_DEVICE_IN_QUAD_MIC] = 46, 37163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102, 372c92c59683257878fb8dc08d827313b4a865898daPrashant Malani [SND_DEVICE_IN_HANDSET_TMIC] = 125, 373c92c59683257878fb8dc08d827313b4a865898daPrashant Malani [SND_DEVICE_IN_HANDSET_QMIC] = 125, 374733c1df5828d63f547553b4a441668905306a4e2vivek mehta [SND_DEVICE_IN_HANDSET_TMIC_AEC] = 125, /* override this for new target to 140 */ 375733c1df5828d63f547553b4a441668905306a4e2vivek mehta [SND_DEVICE_IN_HANDSET_QMIC_AEC] = 125, /* override this for new target to 140 */ 376b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}; 377b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 37898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestruct name_to_index { 3795bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George char name[100]; 3805bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George unsigned int index; 3815bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George}; 3825bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 3835bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#define TO_NAME_INDEX(X) #X, X 3845bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 38598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George/* Used to get index from parsed string */ 38698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic const struct name_to_index snd_device_name_index[SND_DEVICE_MAX] = { 38798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George /* out */ 3885bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_HANDSET)}, 3895bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER)}, 3905bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_REVERSE)}, 3911b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE)}, 3925bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES)}, 39309f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent {TO_NAME_INDEX(SND_DEVICE_OUT_LINE)}, 3945bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES)}, 3953b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES)}, 396744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_LINE)}, 3973b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE)}, 3985bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET)}, 3995bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)}, 400e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_HFP)}, 4015bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)}, 40209f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)}, 4035bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)}, 4045bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HDMI)}, 4055bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO)}, 4065bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)}, 40798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET_TMUS)}, 4089d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HAC_HANDSET)}, 4095bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)}, 4105bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)}, 4115bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)}, 41298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 41398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George /* in */ 41463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)}, 41563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)}, 4165bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)}, 41798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)}, 4183ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_NS)}, 4193ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)}, 4203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC)}, 4213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC)}, 4223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_NS)}, 4233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)}, 4243ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_STEREO)}, 4253ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 4263ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC)}, 42798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC)}, 4283ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_NS)}, 4293ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)}, 4303ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC)}, 4313ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC)}, 4323ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS)}, 4333ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)}, 4343ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_STEREO)}, 4353ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 4363ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC)}, 437b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC_AEC)}, 4383ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 4395bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)}, 4405bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC)}, 441e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_NREC)}, 4425bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB)}, 443e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB_NREC)}, 4445bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_CAMCORDER_MIC)}, 4453ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 4463ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC)}, 4473ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC_TMUS)}, 4483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)}, 449e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP)}, 4503ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC)}, 4513ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)}, 4525bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC)}, 4535bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC)}, 4545bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC)}, 4553ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 4565bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC)}, 4573ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_NS)}, 458733c1df5828d63f547553b4a441668905306a4e2vivek mehta {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_AEC)}, 4593ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_STEREO)}, 4603ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)}, 4618c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_HEADSET_MIC)}, 46263863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda 46390fb96106e9e2db75e214722c797d013e10e5328rago {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_MIC)}, 46490fb96106e9e2db75e214722c797d013e10e5328rago {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC)}, 4654ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_STEREO_MIC)}, 4664ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_THREE_MIC)}, 4674ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_QUAD_MIC)}, 46890fb96106e9e2db75e214722c797d013e10e5328rago 469c92c59683257878fb8dc08d827313b4a865898daPrashant Malani {TO_NAME_INDEX(SND_DEVICE_IN_THREE_MIC)}, 470c92c59683257878fb8dc08d827313b4a865898daPrashant Malani {TO_NAME_INDEX(SND_DEVICE_IN_QUAD_MIC)}, 47163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)}, 472c92c59683257878fb8dc08d827313b4a865898daPrashant Malani {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC)}, 473c92c59683257878fb8dc08d827313b4a865898daPrashant Malani {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC)}, 474733c1df5828d63f547553b4a441668905306a4e2vivek mehta {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC_AEC)}, 475733c1df5828d63f547553b4a441668905306a4e2vivek mehta {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC_AEC)}, 47698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}; 47798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 478b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandastatic char * backend_tag_table[SND_DEVICE_MAX] = {0}; 479b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandastatic char * hw_interface_table[SND_DEVICE_MAX] = {0}; 48098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 48198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic const struct name_to_index usecase_name_index[AUDIO_USECASE_MAX] = { 48298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_DEEP_BUFFER)}, 48398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_LOW_LATENCY)}, 48498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MULTI_CH)}, 48598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD)}, 4862bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_TTS)}, 4872bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_ULL)}, 48898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_AUDIO_RECORD)}, 48998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_AUDIO_RECORD_LOW_LATENCY)}, 49098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_VOICE_CALL)}, 49198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_VOICE2_CALL)}, 49298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_VOLTE_CALL)}, 49398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_QCHAT_CALL)}, 49498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_VOWLAN_CALL)}, 49598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK)}, 49698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_INCALL_REC_DOWNLINK)}, 49798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK_AND_DOWNLINK)}, 49898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO)}, 4995bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George}; 5005bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 5017ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL) 5027ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL) 5037ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George 504b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic pthread_once_t check_op_once_ctl = PTHREAD_ONCE_INIT; 505b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic bool is_tmus = false; 506b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 507b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic void check_operator() 508b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 509b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent char value[PROPERTY_VALUE_MAX]; 510b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int mccmnc; 511b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent property_get("gsm.sim.operator.numeric",value,"0"); 512b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent mccmnc = atoi(value); 5132bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent ALOGD("%s: tmus mccmnc %d", __func__, mccmnc); 514b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent switch(mccmnc) { 515b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent /* TMUS MCC(310), MNC(490, 260, 026) */ 516b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case 310490: 517b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case 310260: 518b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case 310026: 519b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon /* Add new TMUS MNC(800, 660, 580, 310, 270, 250, 240, 230, 220, 210, 200, 160) */ 520b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310800: 521b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310660: 522b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310580: 523b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310310: 524b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310270: 525b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310250: 526b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310240: 527b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310230: 528b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310220: 529b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310210: 530b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310200: 531b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon case 310160: 532b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent is_tmus = true; 533b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent break; 534b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 535b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 536b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 537b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentbool is_operator_tmus() 538b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 539b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent pthread_once(&check_op_once_ctl, check_operator); 540b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return is_tmus; 541b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 542b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 5432f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic char *get_current_operator() 5442f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{ 5452f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct listnode *node; 5462f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct operator_info *info_item; 5472f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char mccmnc[PROPERTY_VALUE_MAX]; 5482f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char *ret = NULL; 5492f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5502f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park property_get("gsm.sim.operator.numeric",mccmnc,"0"); 5512f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5522f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park list_for_each(node, &operator_info_list) { 5532f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park info_item = node_to_item(node, struct operator_info, list); 5542f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (strstr(info_item->mccmnc, mccmnc) != NULL) { 5552f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park ret = info_item->name; 5562f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 5572f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 5582f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5592f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park return ret; 5602f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park} 5612f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5622f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic struct operator_specific_device *get_operator_specific_device(snd_device_t snd_device) 5632f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{ 5642f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct listnode *node; 5652f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct operator_specific_device *ret = NULL; 5662f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct operator_specific_device *device_item; 5672f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char *operator_name; 5682f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5692f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park operator_name = get_current_operator(); 5702f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (operator_name == NULL) 5712f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park return ret; 5722f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5732f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park list_for_each(node, operator_specific_device_table[snd_device]) { 5742f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park device_item = node_to_item(node, struct operator_specific_device, list); 5752f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (strcmp(operator_name, device_item->operator) == 0) { 5762f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park ret = device_item; 5772f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 5782f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 5792f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5802f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park return ret; 5812f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park} 5822f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5832f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5842f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic int get_operator_specific_device_acdb_id(snd_device_t snd_device) 5852f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{ 5862f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct operator_specific_device *device; 5872f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park int ret = acdb_device_table[snd_device]; 5882f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5892f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park device = get_operator_specific_device(snd_device); 5902f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (device != NULL) 5912f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park ret = device->acdb_id; 5922f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5932f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park return ret; 5942f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park} 5952f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 5962f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic const char *get_operator_specific_device_mixer_path(snd_device_t snd_device) 5972f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{ 5982f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct operator_specific_device *device; 5992f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park const char *ret = device_table[snd_device]; 6002f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 6012f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park device = get_operator_specific_device(snd_device); 6022f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (device != NULL) 6032f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park ret = device->mixer_path; 6042f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 6052f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park return ret; 6062f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park} 6072f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 6081a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehtabool platform_send_gain_dep_cal(void *platform, int level) 6091a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta{ 6101a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta bool ret_val = false; 6111a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta struct platform_data *my_data = (struct platform_data *)platform; 6121a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta struct audio_device *adev = my_data->adev; 6131a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta int acdb_dev_id, app_type; 6141a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta int acdb_dev_type = MSM_SNDDEV_CAP_RX; 6151a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta int mode = CAL_MODE_RTAC; 6161a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta struct listnode *node; 6171a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta struct audio_usecase *usecase; 6181a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 6191a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta if (my_data->acdb_send_gain_dep_cal == NULL) { 6201a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta ALOGE("%s: dlsym error for acdb_send_gain_dep_cal", __func__); 6211a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta return ret_val; 6221a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta } 6231a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 6241a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta if (!voice_is_in_call(adev)) { 6251a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta ALOGV("%s: Not Voice call usecase, apply new cal for level %d", 6261a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta __func__, level); 6271a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta app_type = DEFAULT_APP_TYPE_RX_PATH; 6281a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 6291a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta // find the current active sound device 6301a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta list_for_each(node, &adev->usecase_list) { 6311a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta usecase = node_to_item(node, struct audio_usecase, list); 6321a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 6331a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta if (usecase != NULL && 6341a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta usecase->type == PCM_PLAYBACK && 6351a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta (usecase->stream.out->devices == AUDIO_DEVICE_OUT_SPEAKER)) { 6361a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 6371a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta ALOGV("%s: out device is %d", __func__, usecase->out_snd_device); 6384cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta if (audio_extn_spkr_prot_is_enabled()) { 6394cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta acdb_dev_id = audio_extn_spkr_prot_get_acdb_id(usecase->out_snd_device); 6404cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta } else { 6414cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta acdb_dev_id = acdb_device_table[usecase->out_snd_device]; 6424cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta } 6434cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta 6441a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type, 6451a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta acdb_dev_type, mode, level)) { 6461a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta // set ret_val true if at least one calibration is set successfully 6471a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta ret_val = true; 6481a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta } else { 6491a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta ALOGE("%s: my_data->acdb_send_gain_dep_cal failed ", __func__); 6501a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta } 6511a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta } else { 6521a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta ALOGW("%s: Usecase list is empty", __func__); 6531a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta } 6541a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta } 6551a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta } else { 6561a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta ALOGW("%s: Voice call in progress .. ignore setting new cal", 6571a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta __func__); 6581a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta } 6591a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta return ret_val; 6601a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta} 6611a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 662cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurentvoid platform_set_echo_reference(struct audio_device *adev, bool enable, audio_devices_t out_device) 663b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 664f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda struct platform_data *my_data = (struct platform_data *)adev->platform; 665cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent snd_device_t snd_device = SND_DEVICE_NONE; 666cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent 667f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda if (strcmp(my_data->ec_ref_mixer_path, "")) { 668f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda ALOGV("%s: diabling %s", __func__, my_data->ec_ref_mixer_path); 669f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda audio_route_reset_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path); 670cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent } 671cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent 672f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda if (enable) { 673f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda strcpy(my_data->ec_ref_mixer_path, "echo-reference"); 674f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda if (out_device != AUDIO_DEVICE_NONE) { 675f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda snd_device = platform_get_output_snd_device(adev->platform, out_device); 676f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda platform_add_backend_name(adev->platform, my_data->ec_ref_mixer_path, snd_device); 677f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda } 678b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 679188b6223c8baaba6a44c779783a878b4459a0642Joe Onorato ALOGV("%s: enabling %s", __func__, my_data->ec_ref_mixer_path); 680f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path); 681f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda } 682b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 683b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 68483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandastatic struct csd_data *open_csd_client(bool i2s_ext_modem) 68583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{ 68683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda struct csd_data *csd = calloc(1, sizeof(struct csd_data)); 68783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 68883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW); 68983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->csd_client == NULL) { 69083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT); 69183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 69283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } else { 69383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT); 69483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 69583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->deinit = (deinit_t)dlsym(csd->csd_client, 69683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_deinit"); 69783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->deinit == NULL) { 69883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_deinit", __func__, 69983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda dlerror()); 70083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 70183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 70283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->disable_device = (disable_device_t)dlsym(csd->csd_client, 70383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_disable_device"); 70483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->disable_device == NULL) { 70583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_disable_device", 70683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 70783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 70883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 70983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->enable_device_config = (enable_device_config_t)dlsym(csd->csd_client, 71083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_enable_device_config"); 71183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->enable_device_config == NULL) { 71283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_enable_device_config", 71383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 71483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 71583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 71683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->enable_device = (enable_device_t)dlsym(csd->csd_client, 71783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_enable_device"); 71883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->enable_device == NULL) { 71983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_enable_device", 72083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 72183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 72283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 72383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->start_voice = (start_voice_t)dlsym(csd->csd_client, 72483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_start_voice"); 72583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->start_voice == NULL) { 72683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_start_voice", 72783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 72883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 72983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 73083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client, 73183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_stop_voice"); 73283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->stop_voice == NULL) { 73383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_stop_voice", 73483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 73583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 73683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 73783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->volume = (volume_t)dlsym(csd->csd_client, 73883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_volume"); 73983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->volume == NULL) { 74083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_volume", 74183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 74283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 74383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 74483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client, 74583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_mic_mute"); 74683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->mic_mute == NULL) { 74783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_mic_mute", 74883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 74983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 75083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 75183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client, 75283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_slow_talk"); 75383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->slow_talk == NULL) { 75483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_slow_talk", 75583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 75683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 75783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 75883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->start_playback = (start_playback_t)dlsym(csd->csd_client, 75983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_start_playback"); 76083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->start_playback == NULL) { 76183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_start_playback", 76283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 76383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 76483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 76583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client, 76683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_stop_playback"); 76783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->stop_playback == NULL) { 76883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_stop_playback", 76983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 77083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 77183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 77283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->start_record = (start_record_t)dlsym(csd->csd_client, 77383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_start_record"); 77483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->start_record == NULL) { 77583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_start_record", 77683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 77783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 77883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 77983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->stop_record = (stop_record_t)dlsym(csd->csd_client, 78083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_stop_record"); 78183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->stop_record == NULL) { 78283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_stop_record", 78383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 78483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 78583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 78683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 78783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->get_sample_rate = (get_sample_rate_t)dlsym(csd->csd_client, 78883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "csd_client_get_sample_rate"); 78983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->get_sample_rate == NULL) { 79083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_get_sample_rate", 79183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 79283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 79383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 79483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 79583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 79683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init"); 79783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 79883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd->init == NULL) { 79983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for csd_client_init", 80083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, dlerror()); 80183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda goto error; 80283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } else { 80383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->init(i2s_ext_modem); 80483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 80583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 80683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return csd; 80783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 80883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaerror: 80983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda free(csd); 81083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd = NULL; 81183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return csd; 81283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda} 81383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 81483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandavoid close_csd_client(struct csd_data *csd) 81583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{ 81683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (csd != NULL) { 81783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd->deinit(); 81883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda dlclose(csd->csd_client); 81983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda free(csd); 82083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda csd = NULL; 82183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 82283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda} 82383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 82483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandastatic void platform_csd_init(struct platform_data *my_data) 82583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{ 82683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#ifdef PLATFORM_MSM8084 827ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev int32_t modems, (*count_modems)(void); 828ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev const char *name = "libdetectmodem.so"; 829ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev const char *func = "count_modems"; 830ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev const char *error; 831ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev 832ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev my_data->csd = NULL; 833ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev 834ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev void *lib = dlopen(name, RTLD_NOW); 835ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev error = dlerror(); 836ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev if (!lib) { 837ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev ALOGE("%s: could not find %s: %s", __func__, name, error); 838ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev return; 839ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev } 840ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev 841ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev count_modems = NULL; 842ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev *(void **)(&count_modems) = dlsym(lib, func); 843ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev error = dlerror(); 844ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev if (!count_modems) { 845ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev ALOGE("%s: could not find symbol %s in %s: %s", 846ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev __func__, func, name, error); 847ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev goto done; 84883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 84983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 850ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev modems = count_modems(); 851ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev if (modems < 0) { 852ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev ALOGE("%s: count_modems failed\n", __func__); 853ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev goto done; 854ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev } 855ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev 8562bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent ALOGD("%s: num_modems %d\n", __func__, modems); 857ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev if (modems > 0) 85883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda my_data->csd = open_csd_client(false /*is_i2s_ext_modem*/); 859ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev 860ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchevdone: 861ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev dlclose(lib); 86283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#else 86383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda my_data->csd = NULL; 86483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif 86583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda} 86683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 867c633338c83da3760c4965d29af2afd80d3cce840Eric Laurentstatic void set_platform_defaults(struct platform_data * my_data) 86898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{ 86998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George int32_t dev; 87098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George for (dev = 0; dev < SND_DEVICE_MAX; dev++) { 871b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[dev] = NULL; 872b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[dev] = NULL; 8732f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park operator_specific_device_table[dev] = NULL; 87498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 87598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 876b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda // To overwrite these go to the audio_platform_info.xml file. 877b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("bt-sco"); 878e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("bt-sco"); 879b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_OUT_BT_SCO] = strdup("bt-sco"); 880b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_OUT_HDMI] = strdup("hdmi"); 881b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("speaker-and-hdmi"); 882b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("bt-sco-wb"); 883b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("bt-sco-wb"); 884e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("bt-sco-wb"); 885b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_OUT_VOICE_TX] = strdup("afe-proxy"); 886b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[SND_DEVICE_IN_VOICE_RX] = strdup("afe-proxy"); 88798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 888b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX"); 889b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX"); 890b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_SPEAKER_REVERSE] = strdup("SLIMBUS_0_RX"); 891b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE] = strdup("SLIMBUS_0_RX"); 892b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_HEADPHONES] = strdup("SLIMBUS_0_RX"); 893b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_LINE] = strdup("SLIMBUS_0_RX"); 894b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = strdup("SLIMBUS_0_RX"); 8953b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES] = strdup("SLIMBUS_0_RX"); 896b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX"); 8973b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE] = strdup("SLIMBUS_0_RX"); 898b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET] = strdup("SLIMBUS_0_RX"); 899b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_HAC_HANDSET] = strdup("SLIMBUS_0_RX"); 900b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER] = strdup("SLIMBUS_0_RX"); 901b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX"); 902b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_LINE] = strdup("SLIMBUS_0_RX"); 903b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_HDMI] = strdup("HDMI_RX"); 904b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("SLIMBUS_0_RX-and-HDMI_RX"); 905b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_BT_SCO] = strdup("SEC_AUX_PCM_RX"); 906b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("SEC_AUX_PCM_RX"); 907b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = strdup("SLIMBUS_0_RX"); 908b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = strdup("SLIMBUS_0_RX"); 909b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = strdup("SLIMBUS_0_RX"); 910b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = strdup("SLIMBUS_0_RX"); 911b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_TX] = strdup("AFE_PCM_RX"); 912b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX"); 913b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX"); 914c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent 915c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent my_data->max_mic_count = PLATFORM_DEFAULT_MIC_COUNT; 91698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George} 91798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 9185c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandavoid get_cvd_version(char *cvd_version, struct audio_device *adev) 9195c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda{ 9205c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda struct mixer_ctl *ctl; 9215c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda int count; 9225c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda int ret = 0; 9235c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda 9245c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda ctl = mixer_get_ctl_by_name(adev->mixer, CVD_VERSION_MIXER_CTL); 9255c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda if (!ctl) { 9265c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda ALOGE("%s: Could not get ctl for mixer cmd - %s", __func__, CVD_VERSION_MIXER_CTL); 9275c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda goto done; 9285c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda } 9295c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda mixer_ctl_update(ctl); 9305c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda 9315c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda count = mixer_ctl_get_num_values(ctl); 9325c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda if (count > MAX_CVD_VERSION_STRING_SIZE) 9335c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda count = MAX_CVD_VERSION_STRING_SIZE - 1; 9345c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda 9355c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda ret = mixer_ctl_get_array(ctl, cvd_version, count); 9365c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda if (ret != 0) { 9375c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda ALOGE("%s: ERROR! mixer_ctl_get_array() failed to get CVD Version", __func__); 9385c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda goto done; 9395c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda } 9405c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda 9415c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandadone: 9425c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda return; 9435c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda} 9445c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda 945b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentvoid *platform_init(struct audio_device *adev) 946b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 947b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent char value[PROPERTY_VALUE_MAX]; 94860ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta struct platform_data *my_data = NULL; 94960ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta int retry_num = 0, snd_card_num = 0, key = 0, ret = 0; 95060ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta bool dual_mic_config = false, use_default_mixer_path = true; 95183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda const char *snd_card_name; 9525c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda char *cvd_version = NULL; 95360ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta char *snd_internal_name = NULL; 95460ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta char *tmp = NULL; 95560ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta char mixer_xml_file[MIXER_PATH_MAX_LENGTH]= {0}; 956de4849cee04a23ae84da96487e344f75f93e5585vivek mehta char platform_info_file[MIXER_PATH_MAX_LENGTH]= {0}; 957de4849cee04a23ae84da96487e344f75f93e5585vivek mehta struct snd_card_split *snd_split_handle = NULL; 958c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda my_data = calloc(1, sizeof(struct platform_data)); 959c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 960c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda my_data->adev = adev; 961c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 9622f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park list_init(&operator_info_list); 9632f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 964c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda set_platform_defaults(my_data); 965c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 9664b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava while (snd_card_num < MAX_SND_CARD) { 9674b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava adev->mixer = mixer_open(snd_card_num); 9681b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo 9694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava while (!adev->mixer && retry_num < RETRY_NUMBER) { 9704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava usleep(RETRY_US); 9714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava adev->mixer = mixer_open(snd_card_num); 9724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava retry_num++; 9734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 97483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 9754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (!adev->mixer) { 9764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: Unable to open the mixer card: %d", __func__, 9774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava snd_card_num); 9784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava retry_num = 0; 9794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava snd_card_num++; 9804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava continue; 9814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 982cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George 9834b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava snd_card_name = mixer_get_name(adev->mixer); 984de4849cee04a23ae84da96487e344f75f93e5585vivek mehta my_data->hw_info = hw_info_init(snd_card_name); 985c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 986de4849cee04a23ae84da96487e344f75f93e5585vivek mehta audio_extn_set_snd_card_split(snd_card_name); 987de4849cee04a23ae84da96487e344f75f93e5585vivek mehta snd_split_handle = audio_extn_get_snd_card_split(); 988de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 989de4849cee04a23ae84da96487e344f75f93e5585vivek mehta /* Get the codec internal name from the sound card and/or form factor 990de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * name and form the mixer paths and platfor info file name dynamically. 991de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * This is generic way of picking any codec and forma factor name based 992de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * mixer and platform info files in future with no code change. 993c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 994de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * current code extends and looks for any of the exteneded mixer path and 995de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * platform info file present based on codec and form factor. 996de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 997de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * order of picking appropriate file is 998de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * <i> mixer_paths_<codec_name>_<form_factor>.xml, if file not present 999de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * <ii> mixer_paths_<codec_name>.xml, if file not present 1000de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * <iii> mixer_paths.xml 1001de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1002de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * same order is followed for audio_platform_info.xml as well 1003de4849cee04a23ae84da96487e344f75f93e5585vivek mehta */ 1004de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1005de4849cee04a23ae84da96487e344f75f93e5585vivek mehta // need to carryforward old file name 1006de4849cee04a23ae84da96487e344f75f93e5585vivek mehta if (!strncmp(snd_card_name, TOMTOM_8226_SND_CARD_NAME, 1007f9583c366559860ec5f287816908216c50cb917eEric Laurent min(strlen(TOMTOM_8226_SND_CARD_NAME), strlen(snd_card_name)))) { 1008de4849cee04a23ae84da96487e344f75f93e5585vivek mehta snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml", 100960ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta MIXER_XML_BASE_STRING, TOMTOM_MIXER_FILE_SUFFIX ); 1010de4849cee04a23ae84da96487e344f75f93e5585vivek mehta } else { 1011de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1012de4849cee04a23ae84da96487e344f75f93e5585vivek mehta snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s_%s.xml", 1013de4849cee04a23ae84da96487e344f75f93e5585vivek mehta MIXER_XML_BASE_STRING, snd_split_handle->snd_card, 1014de4849cee04a23ae84da96487e344f75f93e5585vivek mehta snd_split_handle->form_factor); 1015de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1016de4849cee04a23ae84da96487e344f75f93e5585vivek mehta if (F_OK != access(mixer_xml_file, 0)) { 1017de4849cee04a23ae84da96487e344f75f93e5585vivek mehta memset(mixer_xml_file, 0, sizeof(mixer_xml_file)); 1018de4849cee04a23ae84da96487e344f75f93e5585vivek mehta snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml", 1019de4849cee04a23ae84da96487e344f75f93e5585vivek mehta MIXER_XML_BASE_STRING, snd_split_handle->snd_card); 1020de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1021de4849cee04a23ae84da96487e344f75f93e5585vivek mehta if (F_OK != access(mixer_xml_file, 0)) { 1022de4849cee04a23ae84da96487e344f75f93e5585vivek mehta memset(mixer_xml_file, 0, sizeof(mixer_xml_file)); 1023de4849cee04a23ae84da96487e344f75f93e5585vivek mehta strlcpy(mixer_xml_file, MIXER_XML_DEFAULT_PATH, MIXER_PATH_MAX_LENGTH); 102460ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta } 1025de4849cee04a23ae84da96487e344f75f93e5585vivek mehta } 1026de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1027de4849cee04a23ae84da96487e344f75f93e5585vivek mehta snprintf(platform_info_file, sizeof(platform_info_file), "%s_%s_%s.xml", 1028de4849cee04a23ae84da96487e344f75f93e5585vivek mehta PLATFORM_INFO_XML_BASE_STRING, snd_split_handle->snd_card, 1029de4849cee04a23ae84da96487e344f75f93e5585vivek mehta snd_split_handle->form_factor); 1030a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent 1031de4849cee04a23ae84da96487e344f75f93e5585vivek mehta if (F_OK != access(platform_info_file, 0)) { 1032de4849cee04a23ae84da96487e344f75f93e5585vivek mehta memset(platform_info_file, 0, sizeof(platform_info_file)); 1033de4849cee04a23ae84da96487e344f75f93e5585vivek mehta snprintf(platform_info_file, sizeof(platform_info_file), "%s_%s.xml", 1034de4849cee04a23ae84da96487e344f75f93e5585vivek mehta PLATFORM_INFO_XML_BASE_STRING, snd_split_handle->snd_card); 1035de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1036de4849cee04a23ae84da96487e344f75f93e5585vivek mehta if (F_OK != access(platform_info_file, 0)) { 1037de4849cee04a23ae84da96487e344f75f93e5585vivek mehta memset(platform_info_file, 0, sizeof(platform_info_file)); 1038de4849cee04a23ae84da96487e344f75f93e5585vivek mehta strlcpy(platform_info_file, PLATFORM_INFO_XML_PATH, MIXER_PATH_MAX_LENGTH); 103960ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta } 104060ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta } 104160ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta } 104260ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta 1043de4849cee04a23ae84da96487e344f75f93e5585vivek mehta /* Initialize platform specific ids and/or backends*/ 1044de4849cee04a23ae84da96487e344f75f93e5585vivek mehta platform_info_init(platform_info_file, my_data); 1045de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1046de4849cee04a23ae84da96487e344f75f93e5585vivek mehta /* validate the sound card name 1047de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * my_data->snd_card_name can contain 1048de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * <a> complete sound card name, i.e. <device>-<codec>-<form_factor>-snd-card 1049de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * example: msm8994-tomtom-mtp-snd-card 1050de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * <b> or sub string of the card name, i.e. <device>-<codec> 1051de4849cee04a23ae84da96487e344f75f93e5585vivek mehta * example: msm8994-tomtom 1052f9583c366559860ec5f287816908216c50cb917eEric Laurent * snd_card_name is truncated to 32 charaters as per mixer_get_name() implementation 1053f9583c366559860ec5f287816908216c50cb917eEric Laurent * so use min of my_data->snd_card_name and snd_card_name length for comparison 1054de4849cee04a23ae84da96487e344f75f93e5585vivek mehta */ 1055de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1056de4849cee04a23ae84da96487e344f75f93e5585vivek mehta if (my_data->snd_card_name != NULL && 1057f9583c366559860ec5f287816908216c50cb917eEric Laurent strncmp(snd_card_name, my_data->snd_card_name, 1058f9583c366559860ec5f287816908216c50cb917eEric Laurent min(strlen(snd_card_name), strlen(my_data->snd_card_name))) != 0) { 1059de4849cee04a23ae84da96487e344f75f93e5585vivek mehta ALOGI("%s: found valid sound card %s, but not primary sound card %s", 1060de4849cee04a23ae84da96487e344f75f93e5585vivek mehta __func__, snd_card_name, my_data->snd_card_name); 1061de4849cee04a23ae84da96487e344f75f93e5585vivek mehta retry_num = 0; 1062de4849cee04a23ae84da96487e344f75f93e5585vivek mehta snd_card_num++; 1063de4849cee04a23ae84da96487e344f75f93e5585vivek mehta hw_info_deinit(my_data->hw_info); 1064de4849cee04a23ae84da96487e344f75f93e5585vivek mehta my_data->hw_info = NULL; 1065de4849cee04a23ae84da96487e344f75f93e5585vivek mehta continue; 106670b5c14093fda468f42591ef4a8bff33f5788563Ed Tam } 1067de4849cee04a23ae84da96487e344f75f93e5585vivek mehta ALOGI("%s: found sound card %s, primary sound card expeted is %s", 1068de4849cee04a23ae84da96487e344f75f93e5585vivek mehta __func__, snd_card_name, my_data->snd_card_name); 106911dd22384f2ae13ec4a7563ce5f0a113cf30a53cUday Kishore Pasupuleti 107060ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta ALOGD("%s: Loading mixer file: %s", __func__, mixer_xml_file); 107160ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta adev->audio_route = audio_route_init(snd_card_num, mixer_xml_file); 107260ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta 10734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (!adev->audio_route) { 10744b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: Failed to init audio route controls, aborting.", __func__); 1075c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda goto init_failed; 10764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 10774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava adev->snd_card = snd_card_num; 10782bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent ALOGD("%s: Opened sound card:%d", __func__, snd_card_num); 10794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava break; 10804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 10814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 10824b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (snd_card_num >= MAX_SND_CARD) { 10834b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: Unable to find correct sound card, aborting.", __func__); 1084c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda goto init_failed; 10851b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo } 1086b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1087c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park //set max volume step for voice call 1088c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park property_get("ro.config.vc_call_vol_steps", value, TOSTRING(MAX_VOL_INDEX)); 1089c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park my_data->max_vol_index = atoi(value); 1090c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park 109165ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta property_get("persist.audio.dualmic.config",value,""); 109265ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta if (!strcmp("endfire", value)) { 109365ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta dual_mic_config = true; 109465ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta } 109565ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta 1096c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->source_mic_type = SOURCE_DUAL_MIC; 1097c92c59683257878fb8dc08d827313b4a865898daPrashant Malani 1098b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->fluence_in_spkr_mode = false; 1099b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->fluence_in_voice_call = false; 11003ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda my_data->fluence_in_voice_comm = false; 1101b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->fluence_in_voice_rec = false; 1102b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 110365ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta property_get("ro.qc.sdk.audio.fluencetype", value, "none"); 1104c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if (!strcmp("fluencepro", value)) { 1105c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->fluence_type = FLUENCE_PRO_ENABLE; 110665ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta } else if (!strcmp("fluence", value) || (dual_mic_config)) { 1107c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->fluence_type = FLUENCE_ENABLE; 1108c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if (!strcmp("none", value)) { 1109c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->fluence_type = FLUENCE_DISABLE; 1110b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1111b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1112c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if (my_data->fluence_type != FLUENCE_DISABLE) { 1113b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent property_get("persist.audio.fluence.voicecall",value,""); 1114b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (!strcmp("true", value)) { 1115b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->fluence_in_voice_call = true; 1116b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1117b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 11183ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda property_get("persist.audio.fluence.voicecomm",value,""); 11193ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (!strcmp("true", value)) { 11203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda my_data->fluence_in_voice_comm = true; 11213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda } 11223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda 1123b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent property_get("persist.audio.fluence.voicerec",value,""); 1124b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (!strcmp("true", value)) { 1125b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->fluence_in_voice_rec = true; 1126b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1127b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1128b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent property_get("persist.audio.fluence.speaker",value,""); 1129b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (!strcmp("true", value)) { 1130b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->fluence_in_spkr_mode = true; 1131b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1132b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1133b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1134c92c59683257878fb8dc08d827313b4a865898daPrashant Malani // support max to mono, example if max count is 3, usecase supports Three, dual and mono mic 1135c92c59683257878fb8dc08d827313b4a865898daPrashant Malani switch (my_data->max_mic_count) { 1136c92c59683257878fb8dc08d827313b4a865898daPrashant Malani case 4: 1137c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->source_mic_type |= SOURCE_QUAD_MIC; 1138c92c59683257878fb8dc08d827313b4a865898daPrashant Malani case 3: 1139c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->source_mic_type |= SOURCE_THREE_MIC; 1140c92c59683257878fb8dc08d827313b4a865898daPrashant Malani case 2: 1141c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->source_mic_type |= SOURCE_DUAL_MIC; 1142c92c59683257878fb8dc08d827313b4a865898daPrashant Malani case 1: 1143c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->source_mic_type |= SOURCE_MONO_MIC; 1144c92c59683257878fb8dc08d827313b4a865898daPrashant Malani break; 1145c92c59683257878fb8dc08d827313b4a865898daPrashant Malani default: 1146c92c59683257878fb8dc08d827313b4a865898daPrashant Malani ALOGE("%s: max_mic_count (%d), is not supported, setting to default", 1147c92c59683257878fb8dc08d827313b4a865898daPrashant Malani __func__, my_data->max_mic_count); 1148c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->source_mic_type = SOURCE_MONO_MIC|SOURCE_DUAL_MIC; 1149c92c59683257878fb8dc08d827313b4a865898daPrashant Malani break; 1150c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 1151c92c59683257878fb8dc08d827313b4a865898daPrashant Malani 1152c92c59683257878fb8dc08d827313b4a865898daPrashant Malani ALOGV("%s: Fluence_Type(%d) max_mic_count(%d) mic_type(0x%x) fluence_in_voice_call(%d)" 1153c92c59683257878fb8dc08d827313b4a865898daPrashant Malani " fluence_in_voice_comm(%d) fluence_in_voice_rec(%d) fluence_in_spkr_mode(%d) ", 1154c92c59683257878fb8dc08d827313b4a865898daPrashant Malani __func__, my_data->fluence_type, my_data->max_mic_count, my_data->source_mic_type, 1155c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->fluence_in_voice_call, my_data->fluence_in_voice_comm, 1156c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->fluence_in_voice_rec, my_data->fluence_in_spkr_mode); 1157c92c59683257878fb8dc08d827313b4a865898daPrashant Malani 1158b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW); 1159b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (my_data->acdb_handle == NULL) { 1160b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER); 1161b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else { 1162b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER); 1163b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle, 1164b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent "acdb_loader_deallocate_ACDB"); 116583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (!my_data->acdb_deallocate) 116683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: Could not find the symbol acdb_loader_deallocate_ACDB from %s", 116783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, LIB_ACDB_LOADER); 116883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 1169b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(my_data->acdb_handle, 1170b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent "acdb_loader_send_audio_cal"); 1171b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (!my_data->acdb_send_audio_cal) 117283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: Could not find the symbol acdb_send_audio_cal from %s", 1173b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent __func__, LIB_ACDB_LOADER); 117483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 1175b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle, 1176b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent "acdb_loader_send_voice_cal"); 117783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (!my_data->acdb_send_voice_cal) 117883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: Could not find the symbol acdb_loader_send_voice_cal from %s", 117983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, LIB_ACDB_LOADER); 118083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 118183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda my_data->acdb_reload_vocvoltable = (acdb_reload_vocvoltable_t)dlsym(my_data->acdb_handle, 118283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda "acdb_loader_reload_vocvoltable"); 118383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (!my_data->acdb_reload_vocvoltable) 118483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: Could not find the symbol acdb_loader_reload_vocvoltable from %s", 118583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, LIB_ACDB_LOADER); 11861a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 11871a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta my_data->acdb_send_gain_dep_cal = (acdb_send_gain_dep_cal_t)dlsym(my_data->acdb_handle, 11881a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta "acdb_loader_send_gain_dep_cal"); 11891a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta if (!my_data->acdb_send_gain_dep_cal) 11901a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s", 11911a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta __func__, LIB_ACDB_LOADER); 11921a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta 1193c698f1313378541ec781a986fc68615ec35536c3vivek mehta#if defined (PLATFORM_MSM8994) || (PLATFORM_MSM8996) 11945c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda acdb_init_v2_cvd_t acdb_init; 11955c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda acdb_init = (acdb_init_v2_cvd_t)dlsym(my_data->acdb_handle, 11965c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda "acdb_loader_init_v2"); 11975c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda if (acdb_init == NULL) { 119883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror()); 11995c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda goto acdb_init_fail; 12005c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda } 12015c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda 12025c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE); 12035c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda get_cvd_version(cvd_version, adev); 12045c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda if (!cvd_version) 12055c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda ALOGE("failed to allocate cvd_version"); 120683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda else 1207c698f1313378541ec781a986fc68615ec35536c3vivek mehta acdb_init((char *)snd_card_name, cvd_version, 0); 12085c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda free(cvd_version); 12095c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda#elif defined (PLATFORM_MSM8084) 12105c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda acdb_init_v2_t acdb_init; 12115c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda acdb_init = (acdb_init_v2_t)dlsym(my_data->acdb_handle, 12125c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda "acdb_loader_init_v2"); 12135c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda if (acdb_init == NULL) { 12145c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror()); 12155c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda goto acdb_init_fail; 12165c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda } 12175c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda acdb_init((char *)snd_card_name); 121883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#else 12195c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda acdb_init_t acdb_init; 12205c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle, 1221b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent "acdb_loader_init_ACDB"); 12225c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda if (acdb_init == NULL) 1223b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: dlsym error %s for acdb_loader_init_ACDB", __func__, dlerror()); 1224b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent else 12255c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda acdb_init(); 122683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif 1227b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1228b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 12295c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandaacdb_init_fail: 12305c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda 123163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda audio_extn_spkr_prot_init(adev); 123298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 12337631557cda5515b07b06dd0def53e5813f2442f3Ravi Kumar Alamanda audio_extn_hwdep_cal_send(adev->snd_card, my_data->acdb_handle); 12347631557cda5515b07b06dd0def53e5813f2442f3Ravi Kumar Alamanda 123583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda /* load csd client */ 123683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda platform_csd_init(my_data); 123783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 1238b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return my_data; 1239c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 1240c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamandainit_failed: 1241c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda if (my_data) 1242c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda free(my_data); 1243c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda return NULL; 1244b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1245b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1246b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentvoid platform_deinit(void *platform) 1247b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 1248c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda int32_t dev; 12492f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct operator_info *info_item; 12502f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct operator_specific_device *device_item; 12512f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct listnode *node; 1252c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 12534b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct platform_data *my_data = (struct platform_data *)platform; 12544b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava close_csd_client(my_data->csd); 1255c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 1256de4849cee04a23ae84da96487e344f75f93e5585vivek mehta hw_info_deinit(my_data->hw_info); 1257de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1258c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda for (dev = 0; dev < SND_DEVICE_MAX; dev++) { 1259c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda if (backend_tag_table[dev]) 1260c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda free(backend_tag_table[dev]); 1261c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda if (hw_interface_table[dev]) 1262c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda free(hw_interface_table[dev]); 12632f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (operator_specific_device_table[dev]) { 12642f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park while (!list_empty(operator_specific_device_table[dev])) { 12652f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park node = list_head(operator_specific_device_table[dev]); 12662f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park list_remove(node); 12672f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park device_item = node_to_item(node, struct operator_specific_device, list); 12682f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park free(device_item->operator); 12692f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park free(device_item->mixer_path); 12702f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park free(device_item); 12712f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 12722f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park free(operator_specific_device_table[dev]); 12732f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 1274c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda } 1275c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 1276c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda if (my_data->snd_card_name) 1277c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda free(my_data->snd_card_name); 1278c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 12792f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park while (!list_empty(&operator_info_list)) { 12802f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park node = list_head(&operator_info_list); 12812f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park list_remove(node); 12822f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park info_item = node_to_item(node, struct operator_info, list); 12832f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park free(info_item->name); 12842f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park free(info_item->mccmnc); 12852f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park free(info_item); 12862f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 12872f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 1288b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent free(platform); 1289b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1290b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1291b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentconst char *platform_get_snd_device_name(snd_device_t snd_device) 1292b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 12932f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) { 12942f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (operator_specific_device_table[snd_device] != NULL) { 12952f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park return get_operator_specific_device_mixer_path(snd_device); 12962f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 1297b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return device_table[snd_device]; 12982f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } else 12996402646dbd962f62c37abbb1d435907d54da77ddRavi Kumar Alamanda return "none"; 1300b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1301b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1302de4849cee04a23ae84da96487e344f75f93e5585vivek mehtaint platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device, 1303de4849cee04a23ae84da96487e344f75f93e5585vivek mehta char *device_name) 1304de4849cee04a23ae84da96487e344f75f93e5585vivek mehta{ 1305de4849cee04a23ae84da96487e344f75f93e5585vivek mehta struct platform_data *my_data = (struct platform_data *)platform; 1306de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1307de4849cee04a23ae84da96487e344f75f93e5585vivek mehta if (platform == NULL || device_name == NULL) { 1308de4849cee04a23ae84da96487e344f75f93e5585vivek mehta ALOGW("%s: something wrong, use legacy get_snd_device name", __func__); 1309de4849cee04a23ae84da96487e344f75f93e5585vivek mehta device_name = platform_get_snd_device_name(snd_device); 1310de4849cee04a23ae84da96487e344f75f93e5585vivek mehta } else if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) { 1311de4849cee04a23ae84da96487e344f75f93e5585vivek mehta if (operator_specific_device_table[snd_device] != NULL) { 1312de4849cee04a23ae84da96487e344f75f93e5585vivek mehta strlcpy(device_name, get_operator_specific_device_mixer_path(snd_device), 1313de4849cee04a23ae84da96487e344f75f93e5585vivek mehta DEVICE_NAME_MAX_SIZE); 1314de4849cee04a23ae84da96487e344f75f93e5585vivek mehta } else { 1315de4849cee04a23ae84da96487e344f75f93e5585vivek mehta strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE); 1316de4849cee04a23ae84da96487e344f75f93e5585vivek mehta } 1317de4849cee04a23ae84da96487e344f75f93e5585vivek mehta hw_info_append_hw_type(my_data->hw_info, snd_device, device_name); 1318de4849cee04a23ae84da96487e344f75f93e5585vivek mehta } else { 1319de4849cee04a23ae84da96487e344f75f93e5585vivek mehta strlcpy(device_name, "none", DEVICE_NAME_MAX_SIZE); 1320de4849cee04a23ae84da96487e344f75f93e5585vivek mehta } 1321de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1322de4849cee04a23ae84da96487e344f75f93e5585vivek mehta return 0; 1323de4849cee04a23ae84da96487e344f75f93e5585vivek mehta} 1324de4849cee04a23ae84da96487e344f75f93e5585vivek mehta 1325299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamandavoid platform_add_backend_name(void *platform, char *mixer_path, 1326299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda snd_device_t snd_device) 1327b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 1328299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda struct platform_data *my_data = (struct platform_data *)platform; 1329299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda 133098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) { 133198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: Invalid snd_device = %d", __func__, snd_device); 133298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George return; 13331de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda } 133498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 1335b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda const char * suffix = backend_tag_table[snd_device]; 133698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 133798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (suffix != NULL) { 133898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George strcat(mixer_path, " "); 133998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George strcat(mixer_path, suffix); 1340299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda } 1341b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1342b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1343b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandabool platform_check_backends_match(snd_device_t snd_device1, snd_device_t snd_device2) 1344b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda{ 1345b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda bool result = true; 1346b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda 1347b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda ALOGV("%s: snd_device1 = %s, snd_device2 = %s", __func__, 1348b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda platform_get_snd_device_name(snd_device1), 1349b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda platform_get_snd_device_name(snd_device2)); 1350b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda 1351b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda if ((snd_device1 < SND_DEVICE_MIN) || (snd_device1 >= SND_DEVICE_MAX)) { 1352b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda ALOGE("%s: Invalid snd_device = %s", __func__, 1353b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda platform_get_snd_device_name(snd_device1)); 1354b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda return false; 1355b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda } 1356b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda if ((snd_device2 < SND_DEVICE_MIN) || (snd_device2 >= SND_DEVICE_MAX)) { 1357b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda ALOGE("%s: Invalid snd_device = %s", __func__, 1358b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda platform_get_snd_device_name(snd_device2)); 1359b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda return false; 1360b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda } 1361b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda const char * be_itf1 = hw_interface_table[snd_device1]; 1362b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda const char * be_itf2 = hw_interface_table[snd_device2]; 1363b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda 1364b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda if (NULL != be_itf1 && NULL != be_itf2) { 1365e63e61d40e171b60b8345f2a47022d066aa589f2Eric Laurent if ((NULL == strstr(be_itf2, be_itf1)) && (NULL == strstr(be_itf1, be_itf2))) 1366b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda result = false; 1367b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda } 1368b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda 1369b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda ALOGV("%s: be_itf1 = %s, be_itf2 = %s, match %d", __func__, be_itf1, be_itf2, result); 1370b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda return result; 1371b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda} 1372b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda 1373b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_get_pcm_device_id(audio_usecase_t usecase, int device_type) 1374b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 1375b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int device_id; 1376b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (device_type == PCM_PLAYBACK) 1377b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent device_id = pcm_device_table[usecase][0]; 1378b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent else 1379b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent device_id = pcm_device_table[usecase][1]; 1380b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return device_id; 1381b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1382b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 138398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic int find_index(const struct name_to_index * table, int32_t len, 138498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George const char * name) 13855bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{ 13865bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George int ret = 0; 138798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George int32_t i; 13885bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 138998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (table == NULL) { 139098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: table is NULL", __func__); 13915bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ret = -ENODEV; 13925bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto done; 13935bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 13945bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 139598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (name == NULL) { 139698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("null key"); 139798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ret = -ENODEV; 139898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 139998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 140098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 140198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George for (i=0; i < len; i++) { 140298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if (!strcmp(table[i].name, name)) { 140398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ret = table[i].index; 14045bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto done; 14055bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 14065bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 140798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: Could not find index for name = %s", 140898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George __func__, name); 14095bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ret = -ENODEV; 14105bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgedone: 14115bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George return ret; 14125bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George} 14135bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 141498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgeint platform_get_snd_device_index(char *device_name) 141598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{ 141698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George return find_index(snd_device_name_index, SND_DEVICE_MAX, device_name); 141798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George} 141898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 141998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgeint platform_get_usecase_index(const char *usecase_name) 142098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{ 142198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George return find_index(usecase_name_index, AUDIO_USECASE_MAX, usecase_name); 142298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George} 142398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 14242f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkvoid platform_add_operator_specific_device(snd_device_t snd_device, 14252f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park const char *operator, 14262f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park const char *mixer_path, 14272f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park unsigned int acdb_id) 14282f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{ 14292f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct operator_specific_device *device; 14302f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 14312f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (operator_specific_device_table[snd_device] == NULL) { 14322f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park operator_specific_device_table[snd_device] = 14332f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park (struct listnode *)calloc(1, sizeof(struct listnode)); 14342f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park list_init(operator_specific_device_table[snd_device]); 14352f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 14362f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 14372f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park device = (struct operator_specific_device *)calloc(1, sizeof(struct operator_specific_device)); 14382f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 14392f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park device->operator = strdup(operator); 14402f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park device->mixer_path = strdup(mixer_path); 14412f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park device->acdb_id = acdb_id; 14422f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 14432f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park list_add_tail(operator_specific_device_table[snd_device], &device->list); 14442f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 14452bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent ALOGD("%s: device[%s] -> operator[%s] mixer_path[%s] acdb_id[%d]", __func__, 14462f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park platform_get_snd_device_name(snd_device), operator, mixer_path, acdb_id); 14472f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 14482f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park} 14492f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 14505bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgeint platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id) 14515bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{ 14525bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George int ret = 0; 14535bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 14545bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) { 14555bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ALOGE("%s: Invalid snd_device = %d", 14565bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George __func__, snd_device); 14575bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George ret = -EINVAL; 14585bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George goto done; 14595bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George } 14605bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 1461b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda ALOGV("%s: acdb_device_table[%s]: old = %d new = %d", __func__, 1462b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda platform_get_snd_device_name(snd_device), acdb_device_table[snd_device], acdb_id); 14635bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George acdb_device_table[snd_device] = acdb_id; 14645bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgedone: 14655bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George return ret; 14665bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George} 14675bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George 146863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamandaint platform_get_snd_device_acdb_id(snd_device_t snd_device) 146963863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda{ 147063863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) { 147163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda ALOGE("%s: Invalid snd_device = %d", __func__, snd_device); 147263863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda return -EINVAL; 147363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda } 14742f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 14752f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (operator_specific_device_table[snd_device] != NULL) 14762f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park return get_operator_specific_device_acdb_id(snd_device); 14772f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park else 14782f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park return acdb_device_table[snd_device]; 147963863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda} 148063863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda 1481b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_send_audio_calibration(void *platform, snd_device_t snd_device) 1482b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 1483b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct platform_data *my_data = (struct platform_data *)platform; 1484b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int acdb_dev_id, acdb_dev_type; 1485b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1486adf0f3b3b518e98fc1056e2788dd936e87331fb1Ravi Kumar Alamanda acdb_dev_id = acdb_device_table[audio_extn_get_spkr_prot_snd_device(snd_device)]; 1487b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (acdb_dev_id < 0) { 1488b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: Could not find acdb id for device(%d)", 1489b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent __func__, snd_device); 1490b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return -EINVAL; 1491b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1492b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (my_data->acdb_send_audio_cal) { 1493188b6223c8baaba6a44c779783a878b4459a0642Joe Onorato ALOGV("%s: sending audio calibration for snd_device(%d) acdb_id(%d)", 1494b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent __func__, snd_device, acdb_dev_id); 1495b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (snd_device >= SND_DEVICE_OUT_BEGIN && 1496b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device < SND_DEVICE_OUT_END) 1497b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent acdb_dev_type = ACDB_DEV_TYPE_OUT; 1498b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent else 1499b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent acdb_dev_type = ACDB_DEV_TYPE_IN; 1500b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type); 1501b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1502b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return 0; 1503b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1504b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1505b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_switch_voice_call_device_pre(void *platform) 1506b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 150783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda struct platform_data *my_data = (struct platform_data *)platform; 150883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda int ret = 0; 150983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 151083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (my_data->csd != NULL && 1511b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda voice_is_in_call(my_data->adev)) { 151283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda /* This must be called before disabling mixer controls on APQ side */ 151383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ret = my_data->csd->disable_device(); 151483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (ret < 0) { 151583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: csd_client_disable_device, failed, error %d", 151683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, ret); 151783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 151883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 151983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return ret; 152083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda} 152183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 152283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaint platform_switch_voice_call_enable_device_config(void *platform, 152383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda snd_device_t out_snd_device, 152483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda snd_device_t in_snd_device) 152583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{ 152683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda struct platform_data *my_data = (struct platform_data *)platform; 152783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda int acdb_rx_id, acdb_tx_id; 152883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda int ret = 0; 152983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 153083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (my_data->csd == NULL) 153183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return ret; 153283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 153363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER && 153463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda audio_extn_spkr_prot_is_enabled()) 15352f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park acdb_rx_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED); 153663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda else 15372f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park acdb_rx_id = platform_get_snd_device_acdb_id(out_snd_device); 153883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 15392f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park acdb_tx_id = platform_get_snd_device_acdb_id(in_snd_device); 154083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 154183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (acdb_rx_id > 0 && acdb_tx_id > 0) { 154283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ret = my_data->csd->enable_device_config(acdb_rx_id, acdb_tx_id); 154383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (ret < 0) { 154483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: csd_enable_device_config, failed, error %d", 154583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda __func__, ret); 154683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 154783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } else { 154883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__, 154983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda acdb_rx_id, acdb_tx_id); 155083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 155183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 155283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return ret; 1553b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1554b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1555b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_switch_voice_call_device_post(void *platform, 1556b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device_t out_snd_device, 1557b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device_t in_snd_device) 1558b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 1559b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct platform_data *my_data = (struct platform_data *)platform; 1560b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int acdb_rx_id, acdb_tx_id; 1561b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1562b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (my_data->acdb_send_voice_cal == NULL) { 1563b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: dlsym error for acdb_send_voice_call", __func__); 1564b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else { 156563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER && 156663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda audio_extn_spkr_prot_is_enabled()) 156763863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED; 156863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda 15692f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park acdb_rx_id = platform_get_snd_device_acdb_id(out_snd_device); 15702f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park acdb_tx_id = platform_get_snd_device_acdb_id(in_snd_device); 1571b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1572b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (acdb_rx_id > 0 && acdb_tx_id > 0) 1573b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id); 1574b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent else 1575b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__, 1576b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent acdb_rx_id, acdb_tx_id); 1577b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1578b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1579b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return 0; 1580b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1581b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 158283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaint platform_switch_voice_call_usecase_route_post(void *platform, 158383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda snd_device_t out_snd_device, 158483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda snd_device_t in_snd_device) 158583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{ 158683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda struct platform_data *my_data = (struct platform_data *)platform; 158783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda int acdb_rx_id, acdb_tx_id; 158883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda int ret = 0; 158983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 159083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (my_data->csd == NULL) 159183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return ret; 159283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 159363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER && 159463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda audio_extn_spkr_prot_is_enabled()) 15952f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park acdb_rx_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED); 159663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda else 15972f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park acdb_rx_id = platform_get_snd_device_acdb_id(out_snd_device); 159883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 15992f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park acdb_tx_id = platform_get_snd_device_acdb_id(in_snd_device); 160083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 160183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (acdb_rx_id > 0 && acdb_tx_id > 0) { 160283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id, 160383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda my_data->adev->acdb_settings); 160483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (ret < 0) { 160583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: csd_enable_device, failed, error %d", __func__, ret); 160683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 160783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } else { 160883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__, 160983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda acdb_rx_id, acdb_tx_id); 161083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 161183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 161283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return ret; 161383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda} 161483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 16154b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_start_voice_call(void *platform, uint32_t vsid) 1616b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 161783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda struct platform_data *my_data = (struct platform_data *)platform; 161883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda int ret = 0; 161983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 162083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (my_data->csd != NULL) { 16214b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = my_data->csd->start_voice(vsid); 162283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (ret < 0) { 162383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: csd_start_voice error %d\n", __func__, ret); 162483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 162583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 162683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return ret; 1627b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1628b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 16294b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_stop_voice_call(void *platform, uint32_t vsid) 1630b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 163183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda struct platform_data *my_data = (struct platform_data *)platform; 163283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda int ret = 0; 163383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda 163483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (my_data->csd != NULL) { 16354b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = my_data->csd->stop_voice(vsid); 163683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (ret < 0) { 163783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: csd_stop_voice error %d\n", __func__, ret); 163883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 163983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 164083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return ret; 1641b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1642b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 16434b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_get_sample_rate(void *platform, uint32_t *rate) 16444b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{ 16454b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct platform_data *my_data = (struct platform_data *)platform; 16464b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava int ret = 0; 16474b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 16484b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (my_data->csd != NULL) { 16494b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = my_data->csd->get_sample_rate(rate); 16504b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (ret < 0) { 16514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: csd_get_sample_rate error %d\n", __func__, ret); 16524b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 16534b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 16544b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return ret; 16554b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava} 16564b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 1657b65064161c19b4c688f8a436ed002264d9f49055vivek mehtavoid platform_set_speaker_gain_in_combo(struct audio_device *adev, 1658b65064161c19b4c688f8a436ed002264d9f49055vivek mehta snd_device_t snd_device, 1659b65064161c19b4c688f8a436ed002264d9f49055vivek mehta bool enable) 1660b65064161c19b4c688f8a436ed002264d9f49055vivek mehta{ 1661b65064161c19b4c688f8a436ed002264d9f49055vivek mehta const char* name; 1662b65064161c19b4c688f8a436ed002264d9f49055vivek mehta switch (snd_device) { 1663b65064161c19b4c688f8a436ed002264d9f49055vivek mehta case SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES: 1664b65064161c19b4c688f8a436ed002264d9f49055vivek mehta if (enable) 1665b65064161c19b4c688f8a436ed002264d9f49055vivek mehta name = "spkr-gain-in-headphone-combo"; 1666b65064161c19b4c688f8a436ed002264d9f49055vivek mehta else 1667b65064161c19b4c688f8a436ed002264d9f49055vivek mehta name = "speaker-gain-default"; 1668b65064161c19b4c688f8a436ed002264d9f49055vivek mehta break; 1669b65064161c19b4c688f8a436ed002264d9f49055vivek mehta case SND_DEVICE_OUT_SPEAKER_AND_LINE: 1670b65064161c19b4c688f8a436ed002264d9f49055vivek mehta if (enable) 1671b65064161c19b4c688f8a436ed002264d9f49055vivek mehta name = "spkr-gain-in-line-combo"; 1672b65064161c19b4c688f8a436ed002264d9f49055vivek mehta else 1673b65064161c19b4c688f8a436ed002264d9f49055vivek mehta name = "speaker-gain-default"; 1674b65064161c19b4c688f8a436ed002264d9f49055vivek mehta break; 1675b65064161c19b4c688f8a436ed002264d9f49055vivek mehta case SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES: 1676b65064161c19b4c688f8a436ed002264d9f49055vivek mehta if (enable) 1677b65064161c19b4c688f8a436ed002264d9f49055vivek mehta name = "spkr-safe-gain-in-headphone-combo"; 1678b65064161c19b4c688f8a436ed002264d9f49055vivek mehta else 1679b65064161c19b4c688f8a436ed002264d9f49055vivek mehta name = "speaker-safe-gain-default"; 1680b65064161c19b4c688f8a436ed002264d9f49055vivek mehta break; 1681b65064161c19b4c688f8a436ed002264d9f49055vivek mehta case SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE: 1682b65064161c19b4c688f8a436ed002264d9f49055vivek mehta if (enable) 1683b65064161c19b4c688f8a436ed002264d9f49055vivek mehta name = "spkr-safe-gain-in-line-combo"; 1684b65064161c19b4c688f8a436ed002264d9f49055vivek mehta else 1685b65064161c19b4c688f8a436ed002264d9f49055vivek mehta name = "speaker-safe-gain-default"; 1686b65064161c19b4c688f8a436ed002264d9f49055vivek mehta break; 1687b65064161c19b4c688f8a436ed002264d9f49055vivek mehta default: 1688b65064161c19b4c688f8a436ed002264d9f49055vivek mehta return; 1689b65064161c19b4c688f8a436ed002264d9f49055vivek mehta } 1690b65064161c19b4c688f8a436ed002264d9f49055vivek mehta 1691b65064161c19b4c688f8a436ed002264d9f49055vivek mehta audio_route_apply_and_update_path(adev->audio_route, name); 1692b65064161c19b4c688f8a436ed002264d9f49055vivek mehta} 1693b65064161c19b4c688f8a436ed002264d9f49055vivek mehta 1694b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_voice_volume(void *platform, int volume) 1695b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 1696b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct platform_data *my_data = (struct platform_data *)platform; 1697b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct audio_device *adev = my_data->adev; 1698b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct mixer_ctl *ctl; 169953b2cf0c72aa18a5848919e2309731af652e84f9sangwoo const char *mixer_ctl_name = "Voice Rx Gain"; 17004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava int vol_index = 0, ret = 0; 17014b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava uint32_t set_values[ ] = {0, 17024b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALL_SESSION_VSID, 17034b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava DEFAULT_VOLUME_RAMP_DURATION_MS}; 1704b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1705b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent // Voice volume levels are mapped to adsp volume levels as follows. 1706b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1 0 -> 0 1707b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent // But this values don't changed in kernel. So, below change is need. 1708c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park vol_index = (int)percent_to_index(volume, MIN_VOL_INDEX, my_data->max_vol_index); 17094b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava set_values[0] = vol_index; 1710b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1711b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); 1712b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (!ctl) { 1713b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: Could not get ctl for mixer cmd - %s", 1714b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent __func__, mixer_ctl_name); 1715b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return -EINVAL; 1716b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 17174b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGV("Setting voice volume index: %d", set_values[0]); 17184b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values)); 17194b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 172083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (my_data->csd != NULL) { 172183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ret = my_data->csd->volume(ALL_SESSION_VSID, volume, 172283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda DEFAULT_VOLUME_RAMP_DURATION_MS); 172383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda if (ret < 0) { 172483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda ALOGE("%s: csd_volume error %d", __func__, ret); 172583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 172683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda } 172783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda return ret; 1728b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1729b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1730b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_mic_mute(void *platform, bool state) 1731b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 1732b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct platform_data *my_data = (struct platform_data *)platform; 1733b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct audio_device *adev = my_data->adev; 1734b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct mixer_ctl *ctl; 1735b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent const char *mixer_ctl_name = "Voice Tx Mute"; 173653b2cf0c72aa18a5848919e2309731af652e84f9sangwoo int ret = 0; 17374b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava uint32_t set_values[ ] = {0, 17384b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALL_SESSION_VSID, 17394b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava DEFAULT_MUTE_RAMP_DURATION_MS}; 1740cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George 1741a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti if (adev->mode != AUDIO_MODE_IN_CALL && 1742a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti adev->mode != AUDIO_MODE_IN_COMMUNICATION) 17434b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return 0; 17444b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 1745a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti if (adev->enable_hfp) 1746a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti mixer_ctl_name = "HFP Tx Mute"; 1747a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti 17484b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava set_values[0] = state; 17494b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); 17504b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (!ctl) { 17514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: Could not get ctl for mixer cmd - %s", 17524b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava __func__, mixer_ctl_name); 17534b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return -EINVAL; 17544b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 17554b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGV("Setting voice mute state: %d", state); 17564b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values)); 17574b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 17584b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (my_data->csd != NULL) { 17594b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = my_data->csd->mic_mute(ALL_SESSION_VSID, state, 17604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava DEFAULT_MUTE_RAMP_DURATION_MS); 1761a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent if (ret < 0) { 17624b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: csd_mic_mute error %d", __func__, ret); 176353b2cf0c72aa18a5848919e2309731af652e84f9sangwoo } 1764cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George } 17654b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return ret; 17664b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava} 1767cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George 17684b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_set_device_mute(void *platform, bool state, char *dir) 17694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{ 17704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct platform_data *my_data = (struct platform_data *)platform; 17714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct audio_device *adev = my_data->adev; 17724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct mixer_ctl *ctl; 17734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava char *mixer_ctl_name = NULL; 17744b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava int ret = 0; 17754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava uint32_t set_values[ ] = {0, 17764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALL_SESSION_VSID, 17774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 0}; 17784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if(dir == NULL) { 17794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: Invalid direction:%s", __func__, dir); 17804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return -EINVAL; 17814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 17824b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 17834b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (!strncmp("rx", dir, sizeof("rx"))) { 17844b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava mixer_ctl_name = "Voice Rx Device Mute"; 17854b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } else if (!strncmp("tx", dir, sizeof("tx"))) { 17864b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava mixer_ctl_name = "Voice Tx Device Mute"; 17874b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } else { 17884b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return -EINVAL; 17894b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 17904b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 17914b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava set_values[0] = state; 17924b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); 17934b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (!ctl) { 17944b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: Could not get ctl for mixer cmd - %s", 17954b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava __func__, mixer_ctl_name); 17964b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return -EINVAL; 17974b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 17984b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 17994b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGV("%s: Setting device mute state: %d, mixer ctrl:%s", 18004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava __func__,state, mixer_ctl_name); 18014b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values)); 18024b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 18034b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return ret; 1804b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1805b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1806b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandabool platform_can_split_snd_device(snd_device_t snd_device, 1807b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda int *num_devices, 1808b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda snd_device_t *new_snd_devices) 1809b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda{ 1810b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda bool status = false; 1811b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda 1812b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda if (NULL == num_devices || NULL == new_snd_devices) { 1813b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda ALOGE("%s: NULL pointer ..", __func__); 1814b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda return false; 1815b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda } 1816b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda 1817b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda /* 1818b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda * If wired headset/headphones/line devices share the same backend 1819b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda * with speaker/earpiece this routine returns false. 1820b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda */ 1821b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES && 1822b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HEADPHONES)) { 1823b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda *num_devices = 2; 1824b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER; 1825b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES; 1826b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda status = true; 1827b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_LINE && 1828b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_LINE)) { 1829b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda *num_devices = 2; 1830b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER; 1831b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda new_snd_devices[1] = SND_DEVICE_OUT_LINE; 1832b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda status = true; 18333b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda } else if (snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES && 18343b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER_SAFE, SND_DEVICE_OUT_HEADPHONES)) { 18353b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda *num_devices = 2; 18363b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_SAFE; 18373b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES; 18383b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda status = true; 18393b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda } else if (snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE && 18403b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER_SAFE, SND_DEVICE_OUT_LINE)) { 18413b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda *num_devices = 2; 18423b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_SAFE; 18433b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda new_snd_devices[1] = SND_DEVICE_OUT_LINE; 18443b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda status = true; 1845b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda } 1846b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda return status; 1847b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda} 1848b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda 1849b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentsnd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devices) 1850b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 1851b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct platform_data *my_data = (struct platform_data *)platform; 1852b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct audio_device *adev = my_data->adev; 1853b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent audio_mode_t mode = adev->mode; 1854b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device_t snd_device = SND_DEVICE_NONE; 1855b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1856b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGV("%s: enter: output devices(%#x)", __func__, devices); 1857b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (devices == AUDIO_DEVICE_NONE || 1858b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent devices & AUDIO_DEVICE_BIT_IN) { 1859b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGV("%s: Invalid output devices (%#x)", __func__, devices); 1860b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent goto exit; 1861b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1862b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 18631b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent if (popcount(devices) == 2) { 18641b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 18651b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent AUDIO_DEVICE_OUT_SPEAKER) || 18661b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET | 18671b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent AUDIO_DEVICE_OUT_SPEAKER)) { 18681b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES; 18691b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent } else if (devices == (AUDIO_DEVICE_OUT_LINE | 18701b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent AUDIO_DEVICE_OUT_SPEAKER)) { 18711b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent snd_device = SND_DEVICE_OUT_SPEAKER_AND_LINE; 18721b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 18731b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent AUDIO_DEVICE_OUT_SPEAKER_SAFE) || 18741b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET | 18751b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent AUDIO_DEVICE_OUT_SPEAKER_SAFE)) { 18761b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent snd_device = SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES; 18771b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent } else if (devices == (AUDIO_DEVICE_OUT_LINE | 18781b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent AUDIO_DEVICE_OUT_SPEAKER_SAFE)) { 18791b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent snd_device = SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE; 18801b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL | 18811b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent AUDIO_DEVICE_OUT_SPEAKER)) { 18821b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI; 18831b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent } else { 18841b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent ALOGE("%s: Invalid combo device(%#x)", __func__, devices); 18851b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent goto exit; 18861b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent } 18871b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent if (snd_device != SND_DEVICE_NONE) { 18881b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent goto exit; 18891b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent } 18901b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent } 18911b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent 18921b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent if (popcount(devices) != 1) { 18931b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent ALOGE("%s: Invalid output devices(%#x)", __func__, devices); 18941b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent goto exit; 18951b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent } 18961b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent 1897b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda if (voice_is_in_call(adev) || adev->enable_voicerx) { 1898b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 189909f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent devices & AUDIO_DEVICE_OUT_WIRED_HEADSET || 190009f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent devices & AUDIO_DEVICE_OUT_LINE) { 1901b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda if (voice_is_in_call(adev) && 1902cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent (adev->voice.tty_mode == TTY_MODE_FULL)) 1903b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES; 1904b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda else if (voice_is_in_call(adev) && 1905cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent (adev->voice.tty_mode == TTY_MODE_VCO)) 1906b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES; 1907b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda else if (voice_is_in_call(adev) && 1908cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent (adev->voice.tty_mode == TTY_MODE_HCO)) 1909b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET; 191009f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent else { 191109f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent if (devices & AUDIO_DEVICE_OUT_LINE) 191209f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent snd_device = SND_DEVICE_OUT_VOICE_LINE; 191309f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent else 191409f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES; 191509f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent } 1916b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) { 19179f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda if (adev->bt_wb_speech_enabled) { 19189f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda snd_device = SND_DEVICE_OUT_BT_SCO_WB; 19199f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } else { 19209f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda snd_device = SND_DEVICE_OUT_BT_SCO; 19219f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } 19221b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent } else if (devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) { 19237629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti if (!adev->enable_hfp) { 19247629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti snd_device = SND_DEVICE_OUT_VOICE_SPEAKER; 19257629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti } else { 19267629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_HFP; 19277629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti } 1928b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) { 19299d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent if(adev->voice.hac) 19309d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent snd_device = SND_DEVICE_OUT_VOICE_HAC_HANDSET; 19319d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent else if (is_operator_tmus()) 1932b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_OUT_VOICE_HANDSET_TMUS; 1933b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent else 1934b4d368e0fe6006657ebc4e1f9ba01a072c4ca2c7Eric Laurent snd_device = SND_DEVICE_OUT_VOICE_HANDSET; 193599c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda } else if (devices & AUDIO_DEVICE_OUT_TELEPHONY_TX) 193699c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda snd_device = SND_DEVICE_OUT_VOICE_TX; 193799c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda 1938b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (snd_device != SND_DEVICE_NONE) { 1939b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent goto exit; 1940b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1941b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1942b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1943b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 1944b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 1945b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_OUT_HEADPHONES; 194609f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent } else if (devices & AUDIO_DEVICE_OUT_LINE) { 194709f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent snd_device = SND_DEVICE_OUT_LINE; 19481b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent } else if (devices & AUDIO_DEVICE_OUT_SPEAKER_SAFE) { 19491b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent snd_device = SND_DEVICE_OUT_SPEAKER_SAFE; 1950b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) { 19511f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda if (my_data->speaker_lr_swap) 1952b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE; 1953b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent else 1954b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_OUT_SPEAKER; 1955b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) { 19569f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda if (adev->bt_wb_speech_enabled) { 19579f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda snd_device = SND_DEVICE_OUT_BT_SCO_WB; 19589f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } else { 19599f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda snd_device = SND_DEVICE_OUT_BT_SCO; 19609f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } 1961b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) { 1962b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_OUT_HDMI ; 1963b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) { 19649d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent /*HAC support for voice-ish audio (eg visual voicemail)*/ 19659d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent if(adev->voice.hac) 19669d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent snd_device = SND_DEVICE_OUT_VOICE_HAC_HANDSET; 19679d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent else 19689d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent snd_device = SND_DEVICE_OUT_HANDSET; 1969b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else { 1970b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: Unknown device(s) %#x", __func__, devices); 1971b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 1972b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentexit: 1973b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]); 1974b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return snd_device; 1975b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 1976b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1977b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentsnd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device) 1978b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 1979b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct platform_data *my_data = (struct platform_data *)platform; 1980b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct audio_device *adev = my_data->adev; 1981b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent audio_source_t source = (adev->active_input == NULL) ? 1982b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent AUDIO_SOURCE_DEFAULT : adev->active_input->source; 1983b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1984b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent audio_mode_t mode = adev->mode; 1985b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent audio_devices_t in_device = ((adev->active_input == NULL) ? 1986b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent AUDIO_DEVICE_NONE : adev->active_input->device) 1987b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent & ~AUDIO_DEVICE_BIT_IN; 1988b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent audio_channel_mask_t channel_mask = (adev->active_input == NULL) ? 1989b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask; 1990b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device_t snd_device = SND_DEVICE_NONE; 19913ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda int channel_count = popcount(channel_mask); 1992b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 1993c92c59683257878fb8dc08d827313b4a865898daPrashant Malani ALOGV("%s: enter: out_device(%#x) in_device(%#x) channel_count (%d) channel_mask (0x%x)", 1994c92c59683257878fb8dc08d827313b4a865898daPrashant Malani __func__, out_device, in_device, channel_count, channel_mask); 1995b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda if ((out_device != AUDIO_DEVICE_NONE) && voice_is_in_call(adev)) { 19964b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (adev->voice.tty_mode != TTY_MODE_OFF) { 1997b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 199809f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET || 199909f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent out_device & AUDIO_DEVICE_OUT_LINE) { 20004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava switch (adev->voice.tty_mode) { 2001b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case TTY_MODE_FULL: 2002b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC; 2003b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent break; 2004b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case TTY_MODE_VCO: 2005b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC; 2006b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent break; 2007b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case TTY_MODE_HCO: 2008b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC; 2009b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent break; 2010b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent default: 20114b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->voice.tty_mode); 2012b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2013b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent goto exit; 2014b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2015b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2016b991fb007d870cbd682273e5fc7413b9d238a6d9Eric Laurent if (out_device & AUDIO_DEVICE_OUT_EARPIECE) { 2017b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (my_data->fluence_in_voice_call == false) { 2018b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_HANDSET_MIC; 2019b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else { 20203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (is_operator_tmus()) 20213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_VOICE_DMIC_TMUS; 2022b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent else 20233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_VOICE_DMIC; 2024b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2025b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 2026b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC; 2027b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) { 20289f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda if (adev->bt_wb_speech_enabled) { 2029e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda if (adev->bluetooth_nrec) 2030e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC; 2031e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda else 2032e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB; 20339f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } else { 2034e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda if (adev->bluetooth_nrec) 2035e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC; 2036e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda else 2037e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC; 20389f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } 2039b991fb007d870cbd682273e5fc7413b9d238a6d9Eric Laurent } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER || 2040c92c59683257878fb8dc08d827313b4a865898daPrashant Malani out_device & AUDIO_DEVICE_OUT_SPEAKER_SAFE || 2041c92c59683257878fb8dc08d827313b4a865898daPrashant Malani out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 2042c92c59683257878fb8dc08d827313b4a865898daPrashant Malani out_device & AUDIO_DEVICE_OUT_LINE) { 2043c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if (my_data->fluence_in_voice_call && my_data->fluence_in_spkr_mode) { 2044c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if (my_data->source_mic_type & SOURCE_DUAL_MIC) { 2045c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC; 2046c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 2047c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC; 2048c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2049b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2050fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta 2051fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta //select default 2052fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta if (snd_device == SND_DEVICE_NONE) { 20537629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti if (!adev->enable_hfp) { 20547629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC; 20557629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti } else { 20567629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP; 20577629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti platform_set_echo_reference(adev, true, out_device); 20587629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti } 2059fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta } 2060c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if (out_device & AUDIO_DEVICE_OUT_TELEPHONY_TX) { 206199c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_VOICE_RX; 2062c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2063b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (source == AUDIO_SOURCE_CAMCORDER) { 2064b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC || 2065b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent in_device & AUDIO_DEVICE_IN_BACK_MIC) { 2066b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_CAMCORDER_MIC; 2067b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2068b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) { 2069b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 2070c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if (my_data->fluence_in_voice_rec && channel_count == 1) { 2071c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if ((my_data->fluence_type == FLUENCE_PRO_ENABLE) && 2072c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_QUAD_MIC)) { 2073733c1df5828d63f547553b4a441668905306a4e2vivek mehta if (adev->active_input->enable_aec) 2074733c1df5828d63f547553b4a441668905306a4e2vivek mehta snd_device = SND_DEVICE_IN_HANDSET_QMIC_AEC; 2075733c1df5828d63f547553b4a441668905306a4e2vivek mehta else 2076733c1df5828d63f547553b4a441668905306a4e2vivek mehta snd_device = SND_DEVICE_IN_HANDSET_QMIC; 2077c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if ((my_data->fluence_type == FLUENCE_PRO_ENABLE) && 2078c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_THREE_MIC)) { 2079733c1df5828d63f547553b4a441668905306a4e2vivek mehta if (adev->active_input->enable_aec) 2080733c1df5828d63f547553b4a441668905306a4e2vivek mehta snd_device = SND_DEVICE_IN_HANDSET_TMIC_AEC; 2081733c1df5828d63f547553b4a441668905306a4e2vivek mehta else 2082733c1df5828d63f547553b4a441668905306a4e2vivek mehta snd_device = SND_DEVICE_IN_HANDSET_TMIC; 2083c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if (((my_data->fluence_type == FLUENCE_PRO_ENABLE) || 2084c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->fluence_type == FLUENCE_ENABLE)) && 2085c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_DUAL_MIC)) { 2086733c1df5828d63f547553b4a441668905306a4e2vivek mehta if (adev->active_input->enable_aec) 2087733c1df5828d63f547553b4a441668905306a4e2vivek mehta snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC; 2088733c1df5828d63f547553b4a441668905306a4e2vivek mehta else 2089733c1df5828d63f547553b4a441668905306a4e2vivek mehta snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE; 2090c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2091c92c59683257878fb8dc08d827313b4a865898daPrashant Malani platform_set_echo_reference(adev, true, out_device); 2092c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if ((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) && 2093c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_DUAL_MIC)) { 2094c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_STEREO; 2095c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if (((int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_3) && 2096c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_THREE_MIC)) { 2097c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_THREE_MIC; 2098c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if (((int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_4) && 2099c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_QUAD_MIC)) { 2100c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_QUAD_MIC; 2101b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2102b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (snd_device == SND_DEVICE_NONE) { 21033ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (adev->active_input->enable_ns) 21043ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS; 2105733c1df5828d63f547553b4a441668905306a4e2vivek mehta else if (adev->active_input->enable_aec) { 2106733c1df5828d63f547553b4a441668905306a4e2vivek mehta snd_device = SND_DEVICE_IN_VOICE_REC_MIC_AEC; 2107733c1df5828d63f547553b4a441668905306a4e2vivek mehta platform_set_echo_reference(adev, true, out_device); 2108733c1df5828d63f547553b4a441668905306a4e2vivek mehta } else 21093ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_VOICE_REC_MIC; 2110b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 21118c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 21128c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi snd_device = SND_DEVICE_IN_VOICE_REC_HEADSET_MIC; 2113b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 211490fb96106e9e2db75e214722c797d013e10e5328rago } else if (source == AUDIO_SOURCE_UNPROCESSED) { 211590fb96106e9e2db75e214722c797d013e10e5328rago if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 21164ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) || 21174ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta (channel_mask == AUDIO_CHANNEL_IN_STEREO)) && 21184ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta (my_data->source_mic_type & SOURCE_DUAL_MIC)) { 21194ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta snd_device = SND_DEVICE_IN_UNPROCESSED_STEREO_MIC; 21204ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta } else if (((int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_3) && 21214ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta (my_data->source_mic_type & SOURCE_THREE_MIC)) { 21224ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta snd_device = SND_DEVICE_IN_UNPROCESSED_THREE_MIC; 21234ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta } else if (((int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_4) && 21244ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta (my_data->source_mic_type & SOURCE_QUAD_MIC)) { 21254ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta snd_device = SND_DEVICE_IN_UNPROCESSED_QUAD_MIC; 21264ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta } else { 21274ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta snd_device = SND_DEVICE_IN_UNPROCESSED_MIC; 21284ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta } 212990fb96106e9e2db75e214722c797d013e10e5328rago } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 213090fb96106e9e2db75e214722c797d013e10e5328rago snd_device = SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC; 213190fb96106e9e2db75e214722c797d013e10e5328rago } 213250a38ed90672924763c4cb18773fca64588faeccEric Laurent } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION || 213390fb96106e9e2db75e214722c797d013e10e5328rago mode == AUDIO_MODE_IN_COMMUNICATION) { 21341b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent if (out_device & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) 2135b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent in_device = AUDIO_DEVICE_IN_BACK_MIC; 2136b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (adev->active_input) { 21373ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (adev->active_input->enable_aec && 21383ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda adev->active_input->enable_ns) { 21393ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (in_device & AUDIO_DEVICE_IN_BACK_MIC) { 21403ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (my_data->fluence_in_spkr_mode && 21413ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda my_data->fluence_in_voice_comm && 2142c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_DUAL_MIC)) { 21433ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS; 2144c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 21453ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS; 2146c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 21473ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 21483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (my_data->fluence_in_voice_comm && 2149c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_DUAL_MIC)) { 21503ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS; 2151c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 21523ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS; 2153c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2154cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 2155cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC; 21563ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda } 2157cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent platform_set_echo_reference(adev, true, out_device); 21583ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda } else if (adev->active_input->enable_aec) { 2159b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (in_device & AUDIO_DEVICE_IN_BACK_MIC) { 21603ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (my_data->fluence_in_spkr_mode && 21613ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda my_data->fluence_in_voice_comm && 2162c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_DUAL_MIC)) { 21633ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC; 2164c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 21653ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC; 2166c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2167b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 21683ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (my_data->fluence_in_voice_comm && 2169c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_DUAL_MIC)) { 21703ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC; 2171c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 21723ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC; 2173c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2174cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 2175cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC; 2176cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent } 2177f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda platform_set_echo_reference(adev, true, out_device); 21783ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda } else if (adev->active_input->enable_ns) { 21793ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (in_device & AUDIO_DEVICE_IN_BACK_MIC) { 21803ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (my_data->fluence_in_spkr_mode && 21813ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda my_data->fluence_in_voice_comm && 2182c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_DUAL_MIC)) { 21833ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS; 2184c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 21853ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS; 2186c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 21873ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 21883ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda if (my_data->fluence_in_voice_comm && 2189c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (my_data->source_mic_type & SOURCE_DUAL_MIC)) { 21903ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_HANDSET_DMIC_NS; 2191c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 21923ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_HANDSET_MIC_NS; 2193c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 21943ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda } 2195cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent } 2196b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2197b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (source == AUDIO_SOURCE_DEFAULT) { 2198b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent goto exit; 2199b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2200b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2201b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2202b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (snd_device != SND_DEVICE_NONE) { 2203b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent goto exit; 2204b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2205b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2206b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (in_device != AUDIO_DEVICE_NONE && 2207b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) && 2208b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) { 2209b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 2210c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if ((my_data->source_mic_type & SOURCE_QUAD_MIC) && 2211c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_4) { 2212c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_QUAD_MIC; 2213c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if ((my_data->source_mic_type & SOURCE_THREE_MIC) && 2214c92c59683257878fb8dc08d827313b4a865898daPrashant Malani (int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_3) { 2215c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_THREE_MIC; 2216c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if ((my_data->source_mic_type & SOURCE_DUAL_MIC) && 2217c92c59683257878fb8dc08d827313b4a865898daPrashant Malani channel_count == 2) { 22183ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_HANDSET_DMIC_STEREO; 2219c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) && 2220c92c59683257878fb8dc08d827313b4a865898daPrashant Malani channel_count == 1) { 2221dae4471837fcdbd9356e3745b66f23f921fb531bvivek mehta snd_device = SND_DEVICE_IN_HANDSET_MIC; 2222c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 2223c92c59683257878fb8dc08d827313b4a865898daPrashant Malani ALOGE("%s: something wrong (1): source type (%d) channel_count (%d) .." 2224c92c59683257878fb8dc08d827313b4a865898daPrashant Malani " channel mask (0x%x) no combination found .. setting to mono", __func__, 2225c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->source_mic_type, channel_count, channel_mask); 2226c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_HANDSET_MIC; 2227c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2228b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) { 2229c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if ((my_data->source_mic_type & SOURCE_DUAL_MIC) && 2230c92c59683257878fb8dc08d827313b4a865898daPrashant Malani channel_count == 2) { 22313ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_DMIC_STEREO; 2232c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) && 2233c92c59683257878fb8dc08d827313b4a865898daPrashant Malani channel_count == 1) { 2234c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_SPEAKER_MIC; 2235c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 2236c92c59683257878fb8dc08d827313b4a865898daPrashant Malani ALOGE("%s: something wrong (2): source type (%d) channel_count (%d) .." 2237c92c59683257878fb8dc08d827313b4a865898daPrashant Malani " no combination found .. setting to mono", __func__, 2238c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->source_mic_type, channel_count); 22393ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_MIC; 2240c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2241b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 2242b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_HEADSET_MIC; 2243b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) { 22449f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda if (adev->bt_wb_speech_enabled) { 2245e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda if (adev->bluetooth_nrec) 2246e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC; 2247e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda else 2248e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB; 22499f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } else { 2250e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda if (adev->bluetooth_nrec) 2251e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC; 2252e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda else 2253e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC; 22549f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } 2255b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) { 2256b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_HDMI_MIC; 2257b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else { 2258b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: Unknown input device(s) %#x", __func__, in_device); 2259b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGW("%s: Using default handset-mic", __func__); 2260b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_HANDSET_MIC; 2261b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2262b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else { 2263b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (out_device & AUDIO_DEVICE_OUT_EARPIECE) { 2264b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_HANDSET_MIC; 2265b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 2266b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_HEADSET_MIC; 22673ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER || 22681b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent out_device & AUDIO_DEVICE_OUT_SPEAKER_SAFE || 22693ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 227009f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent out_device & AUDIO_DEVICE_OUT_LINE) { 2271c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if ((my_data->source_mic_type & SOURCE_DUAL_MIC) && 2272c92c59683257878fb8dc08d827313b4a865898daPrashant Malani channel_count == 2) { 22733ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_DMIC_STEREO; 2274c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) && 2275c92c59683257878fb8dc08d827313b4a865898daPrashant Malani channel_count == 1) { 2276c92c59683257878fb8dc08d827313b4a865898daPrashant Malani snd_device = SND_DEVICE_IN_SPEAKER_MIC; 2277c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } else { 2278c92c59683257878fb8dc08d827313b4a865898daPrashant Malani ALOGE("%s: something wrong (3): source type (%d) channel_count (%d) .." 2279c92c59683257878fb8dc08d827313b4a865898daPrashant Malani " no combination found .. setting to mono", __func__, 2280c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->source_mic_type, channel_count); 22813ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda snd_device = SND_DEVICE_IN_SPEAKER_MIC; 2282c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2283b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) { 22849f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda if (adev->bt_wb_speech_enabled) { 2285e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda if (adev->bluetooth_nrec) 2286e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC; 2287e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda else 2288e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB; 22899f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } else { 2290e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda if (adev->bluetooth_nrec) 2291e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC; 2292e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda else 2293e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda snd_device = SND_DEVICE_IN_BT_SCO_MIC; 22949f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda } 2295b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) { 2296b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_HDMI_MIC; 2297b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } else { 2298b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: Unknown output device(s) %#x", __func__, out_device); 2299b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGW("%s: Using default handset-mic", __func__); 2300b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent snd_device = SND_DEVICE_IN_HANDSET_MIC; 2301b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2302b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2303b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentexit: 2304b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]); 2305b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return snd_device; 2306b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 2307b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2308b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_hdmi_channels(void *platform, int channel_count) 2309b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 2310b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct platform_data *my_data = (struct platform_data *)platform; 2311b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct audio_device *adev = my_data->adev; 2312b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent struct mixer_ctl *ctl; 2313b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent const char *channel_cnt_str = NULL; 2314b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent const char *mixer_ctl_name = "HDMI_RX Channels"; 2315b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent switch (channel_count) { 2316b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case 8: 2317b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent channel_cnt_str = "Eight"; break; 2318b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case 7: 2319b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent channel_cnt_str = "Seven"; break; 2320b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case 6: 2321b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent channel_cnt_str = "Six"; break; 2322b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case 5: 2323b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent channel_cnt_str = "Five"; break; 2324b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case 4: 2325b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent channel_cnt_str = "Four"; break; 2326b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent case 3: 2327b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent channel_cnt_str = "Three"; break; 2328b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent default: 2329b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent channel_cnt_str = "Two"; break; 2330b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2331b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); 2332b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (!ctl) { 2333b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGE("%s: Could not get ctl for mixer cmd - %s", 2334b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent __func__, mixer_ctl_name); 2335b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return -EINVAL; 2336b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2337b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent ALOGV("HDMI channel count: %s", channel_cnt_str); 2338b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent mixer_ctl_set_enum_by_string(ctl, channel_cnt_str); 2339b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return 0; 2340b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 2341b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 234247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew Georgeint platform_edid_get_max_channels(void *platform) 2343b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{ 234447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George struct platform_data *my_data = (struct platform_data *)platform; 234547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George struct audio_device *adev = my_data->adev; 2346b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE]; 2347b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent char *sad = block; 2348b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int num_audio_blocks; 2349b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int channel_count; 2350b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int max_channels = 0; 235147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George int i, ret, count; 2352b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 235347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George struct mixer_ctl *ctl; 235447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George 235547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George ctl = mixer_get_ctl_by_name(adev->mixer, AUDIO_DATA_BLOCK_MIXER_CTL); 235647cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George if (!ctl) { 235747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George ALOGE("%s: Could not get ctl for mixer cmd - %s", 235847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George __func__, AUDIO_DATA_BLOCK_MIXER_CTL); 2359b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return 0; 2360b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2361b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 236247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George mixer_ctl_update(ctl); 236347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George 236447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George count = mixer_ctl_get_num_values(ctl); 2365b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2366b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent /* Read SAD blocks, clamping the maximum size for safety */ 236747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George if (count > (int)sizeof(block)) 236847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George count = (int)sizeof(block); 2369b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 237047cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George ret = mixer_ctl_get_array(ctl, block, count); 237147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George if (ret != 0) { 237247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__); 237347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George return 0; 237447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George } 2375b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2376b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent /* Calculate the number of SAD blocks */ 237747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George num_audio_blocks = count / SAD_BLOCK_SIZE; 2378b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2379b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent for (i = 0; i < num_audio_blocks; i++) { 2380b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent /* Only consider LPCM blocks */ 238147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George if ((sad[0] >> 3) != EDID_FORMAT_LPCM) { 238247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George sad += 3; 2383b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent continue; 238447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George } 2385b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2386b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent channel_count = (sad[0] & 0x7) + 1; 2387b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent if (channel_count > max_channels) 2388b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent max_channels = channel_count; 2389b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2390b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent /* Advance to next block */ 2391b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent sad += 3; 2392b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent } 2393b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 2394b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent return max_channels; 2395b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent} 23967ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George 23974b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_set_incall_recording_session_id(void *platform, 23984b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava uint32_t session_id, int rec_mode) 23994b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{ 24004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava int ret = 0; 24014b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct platform_data *my_data = (struct platform_data *)platform; 24024b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct audio_device *adev = my_data->adev; 24034b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct mixer_ctl *ctl; 24044b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava const char *mixer_ctl_name = "Voc VSID"; 24054b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava int num_ctl_values; 24064b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava int i; 24074b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24084b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); 24094b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (!ctl) { 24104b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: Could not get ctl for mixer cmd - %s", 24114b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava __func__, mixer_ctl_name); 24124b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = -EINVAL; 24134b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } else { 24144b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava num_ctl_values = mixer_ctl_get_num_values(ctl); 24154b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava for (i = 0; i < num_ctl_values; i++) { 24164b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (mixer_ctl_set_value(ctl, i, session_id)) { 24174b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGV("Error: invalid session_id: %x", session_id); 24184b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = -EINVAL; 24194b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava break; 24204b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24214b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24224b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24234b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24244b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (my_data->csd != NULL) { 24254b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode); 24264b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (ret < 0) { 24274b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: csd_client_start_record failed, error %d", 24284b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava __func__, ret); 24294b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24304b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24314b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24324b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return ret; 24334b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava} 24344b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24354b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_stop_incall_recording_usecase(void *platform) 24364b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{ 24374b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava int ret = 0; 24384b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct platform_data *my_data = (struct platform_data *)platform; 24394b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24404b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (my_data->csd != NULL) { 24414b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = my_data->csd->stop_record(ALL_SESSION_VSID); 24424b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (ret < 0) { 24434b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: csd_client_stop_record failed, error %d", 24444b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava __func__, ret); 24454b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24464b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24474b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24484b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return ret; 24494b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava} 24504b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_start_incall_music_usecase(void *platform) 24524b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{ 24534b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava int ret = 0; 24544b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct platform_data *my_data = (struct platform_data *)platform; 24554b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24564b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (my_data->csd != NULL) { 24574b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = my_data->csd->start_playback(ALL_SESSION_VSID); 24584b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (ret < 0) { 24594b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: csd_client_start_playback failed, error %d", 24604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava __func__, ret); 24614b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24624b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24634b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24644b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return ret; 24654b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava} 24664b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24674b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_stop_incall_music_usecase(void *platform) 24684b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{ 24694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava int ret = 0; 24704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava struct platform_data *my_data = (struct platform_data *)platform; 24714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (my_data->csd != NULL) { 24734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ret = my_data->csd->stop_playback(ALL_SESSION_VSID); 24744b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava if (ret < 0) { 24754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava ALOGE("%s: csd_client_stop_playback failed, error %d", 24764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava __func__, ret); 24774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava } 24794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 24804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava return ret; 24814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava} 24824b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava 2483c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamandaint platform_set_parameters(void *platform, struct str_parms *parms) 2484c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda{ 2485c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda struct platform_data *my_data = (struct platform_data *)platform; 24862f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char value[128]; 2487c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda char *kv_pairs = str_parms_to_str(parms); 2488c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda int ret = 0, err; 2489c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 2490c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda if (kv_pairs == NULL) { 2491c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda ret = -EINVAL; 2492c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda ALOGE("%s: key-value pair is NULL",__func__); 2493c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda goto done; 2494c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda } 2495c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 2496c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda ALOGV("%s: enter: %s", __func__, kv_pairs); 2497c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 2498c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda err = str_parms_get_str(parms, PLATFORM_CONFIG_KEY_SOUNDCARD_NAME, 2499c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda value, sizeof(value)); 2500c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda if (err >= 0) { 2501c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda str_parms_del(parms, PLATFORM_CONFIG_KEY_SOUNDCARD_NAME); 2502c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda my_data->snd_card_name = strdup(value); 2503c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda ALOGV("%s: sound card name %s", __func__, my_data->snd_card_name); 2504c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda } 2505c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 25062f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park err = str_parms_get_str(parms, PLATFORM_CONFIG_KEY_OPERATOR_INFO, 25072f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park value, sizeof(value)); 25082f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park if (err >= 0) { 25092f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park struct operator_info *info; 25102f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char *str = value; 25112f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park char *name; 25122f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 25132f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park str_parms_del(parms, PLATFORM_CONFIG_KEY_OPERATOR_INFO); 25142f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park info = (struct operator_info *)calloc(1, sizeof(struct operator_info)); 25152f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park name = strtok(str, ";"); 25162f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park info->name = strdup(name); 25172f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park info->mccmnc = strdup(str + strlen(name) + 1); 25182f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park 25192f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park list_add_tail(&operator_info_list, &info->list); 2520188b6223c8baaba6a44c779783a878b4459a0642Joe Onorato ALOGV("%s: add operator[%s] mccmnc[%s]", __func__, info->name, info->mccmnc); 25212f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park } 2522c92c59683257878fb8dc08d827313b4a865898daPrashant Malani 2523c92c59683257878fb8dc08d827313b4a865898daPrashant Malani memset(value, 0, sizeof(value)); 2524c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent err = str_parms_get_str(parms, PLATFORM_CONFIG_KEY_MAX_MIC_COUNT, 2525c92c59683257878fb8dc08d827313b4a865898daPrashant Malani value, sizeof(value)); 2526c92c59683257878fb8dc08d827313b4a865898daPrashant Malani if (err >= 0) { 2527c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent str_parms_del(parms, PLATFORM_CONFIG_KEY_MAX_MIC_COUNT); 2528c92c59683257878fb8dc08d827313b4a865898daPrashant Malani my_data->max_mic_count = atoi(value); 2529c92c59683257878fb8dc08d827313b4a865898daPrashant Malani ALOGV("%s: max_mic_count %s/%d", __func__, value, my_data->max_mic_count); 2530c92c59683257878fb8dc08d827313b4a865898daPrashant Malani } 2531c92c59683257878fb8dc08d827313b4a865898daPrashant Malani 2532c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamandadone: 2533c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda ALOGV("%s: exit with code(%d)", __func__, ret); 2534c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda if (kv_pairs != NULL) 2535c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda free(kv_pairs); 2536c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 2537c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda return ret; 2538c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda} 2539c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda 25407ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George/* Delay in Us */ 25417ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew Georgeint64_t platform_render_latency(audio_usecase_t usecase) 25427ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George{ 25437ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George switch (usecase) { 25447ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER: 25457ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George return DEEP_BUFFER_PLATFORM_DELAY; 25467ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George case USECASE_AUDIO_PLAYBACK_LOW_LATENCY: 25477ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George return LOW_LATENCY_PLATFORM_DELAY; 25487ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George default: 25497ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George return 0; 25507ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George } 25517ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George} 255298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 25534ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehtabool platform_check_and_set_capture_backend_cfg(struct audio_device* adev, 25544ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta struct audio_usecase *usecase, snd_device_t snd_device) 25554ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta{ 25564ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta enum pcm_format in_pcm_format = PCM_FORMAT_S16_LE; 25574ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta 25584ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta if (adev && adev->active_input) 25594ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta in_pcm_format = adev->active_input->config.format; 25604ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta 25614ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta // allow 24 bit recording only if voice call is not active 25624ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta if (!voice_is_in_call(adev) && 25634ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta adev->mode != AUDIO_MODE_IN_COMMUNICATION && 25644ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta in_pcm_format == PCM_FORMAT_S24_LE) { 25654ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta audio_route_apply_and_update_path(adev->audio_route, "set-capture-format-24le"); 25664ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta } else { 25674ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta audio_route_apply_and_update_path(adev->audio_route, "set-capture-format-default"); 25684ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta } 25694ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta 25704ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta return true; 25714ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta} 25724ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta 2573b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandaint platform_set_snd_device_backend(snd_device_t device, const char *backend_tag, 2574b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda const char * hw_interface) 257598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{ 257698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George int ret = 0; 257798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 257898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) { 257998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: Invalid snd_device = %d", 258098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George __func__, device); 258198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ret = -EINVAL; 258298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 258398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 258498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 2585b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda ALOGV("%s: backend_tag_table[%s]: old = %s new = %s", __func__, 2586b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda platform_get_snd_device_name(device), 2587b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[device] != NULL ? backend_tag_table[device]: "null", backend_tag); 2588b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda if (backend_tag_table[device]) { 2589b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda free(backend_tag_table[device]); 2590b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda } 2591b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda backend_tag_table[device] = strdup(backend_tag); 2592b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda 2593b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda if (hw_interface != NULL) { 2594b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda if (hw_interface_table[device]) 2595b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda free(hw_interface_table[device]); 2596b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda ALOGV("%s: hw_interface_table[%d] = %s", __func__, device, hw_interface); 2597b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda hw_interface_table[device] = strdup(hw_interface); 259898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 259998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgedone: 260098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George return ret; 260198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George} 260298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 260398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgeint platform_set_usecase_pcm_id(audio_usecase_t usecase, int32_t type, int32_t pcm_id) 260498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{ 260598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George int ret = 0; 260698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if ((usecase <= USECASE_INVALID) || (usecase >= AUDIO_USECASE_MAX)) { 260798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: invalid usecase case idx %d", __func__, usecase); 260898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ret = -EINVAL; 260998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George goto done; 261098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 261198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George 261298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George if ((type != 0) && (type != 1)) { 261398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ALOGE("%s: invalid usecase type", __func__); 261498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George ret = -EINVAL; 261598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George } 2616b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda ALOGV("%s: pcm_device_table[%d][%d] = %d", __func__, usecase, type, pcm_id); 261798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George pcm_device_table[usecase][type] = pcm_id; 261898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgedone: 261998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George return ret; 262098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George} 26211f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda 262288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi#define DEFAULT_NOMINAL_SPEAKER_GAIN 20 262388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Triviint ramp_speaker_gain(struct audio_device *adev, bool ramp_up, int target_ramp_up_gain) { 262488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi // backup_gain: gain to try to set in case of an error during ramp 262588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi int start_gain, end_gain, step, backup_gain, i; 262688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi bool error = false; 262788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi const struct mixer_ctl *ctl; 262888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi const char *mixer_ctl_name_gain_left = "Left Speaker Gain"; 262988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi const char *mixer_ctl_name_gain_right = "Right Speaker Gain"; 263088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi struct mixer_ctl *ctl_left = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_left); 263188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi struct mixer_ctl *ctl_right = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_right); 263288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi if (!ctl_left || !ctl_right) { 263388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi ALOGE("%s: Could not get ctl for mixer cmd - %s or %s, not applying speaker gain ramp", 263488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right); 263588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi return -EINVAL; 263688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } else if ((mixer_ctl_get_num_values(ctl_left) != 1) 263788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi || (mixer_ctl_get_num_values(ctl_right) != 1)) { 263888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi ALOGE("%s: Unexpected num values for mixer cmd - %s or %s, not applying speaker gain ramp", 263988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right); 264088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi return -EINVAL; 264188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } 264288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi if (ramp_up) { 264388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi start_gain = 0; 264488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi end_gain = target_ramp_up_gain > 0 ? target_ramp_up_gain : DEFAULT_NOMINAL_SPEAKER_GAIN; 264588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi step = +1; 264688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi backup_gain = end_gain; 264788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } else { 264888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi // using same gain on left and right 264988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi const int left_gain = mixer_ctl_get_value(ctl_left, 0); 265088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi start_gain = left_gain > 0 ? left_gain : DEFAULT_NOMINAL_SPEAKER_GAIN; 265188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi end_gain = 0; 265288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi step = -1; 265388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi backup_gain = start_gain; 265488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } 265588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi for (i = start_gain ; i != (end_gain + step) ; i += step) { 265688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi //ALOGV("setting speaker gain to %d", i); 265788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi if (mixer_ctl_set_value(ctl_left, 0, i)) { 265888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi ALOGE("%s: error setting %s to %d during gain ramp", 265988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi __func__, mixer_ctl_name_gain_left, i); 266088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi error = true; 266188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi break; 266288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } 266388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi if (mixer_ctl_set_value(ctl_right, 0, i)) { 266488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi ALOGE("%s: error setting %s to %d during gain ramp", 266588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi __func__, mixer_ctl_name_gain_right, i); 266688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi error = true; 266788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi break; 266888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } 266988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi usleep(1000); 267088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } 267188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi if (error) { 267288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi // an error occured during the ramp, let's still try to go back to a safe volume 267388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi if (mixer_ctl_set_value(ctl_left, 0, backup_gain)) { 267488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi ALOGE("%s: error restoring left gain to %d", __func__, backup_gain); 267588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } 267688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi if (mixer_ctl_set_value(ctl_right, 0, backup_gain)) { 267788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi ALOGE("%s: error restoring right gain to %d", __func__, backup_gain); 267888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } 267988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } 268088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi return start_gain; 268188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi} 268288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi 26831f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamandaint platform_swap_lr_channels(struct audio_device *adev, bool swap_channels) 26841f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda{ 26851f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda // only update if there is active pcm playback on speaker 26861f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda struct audio_usecase *usecase; 26871f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda struct listnode *node; 26881f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda struct platform_data *my_data = (struct platform_data *)adev->platform; 26891f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda 26901f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda if (my_data->speaker_lr_swap != swap_channels) { 26911f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda my_data->speaker_lr_swap = swap_channels; 26921f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda 26931f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda list_for_each(node, &adev->usecase_list) { 26941f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda usecase = node_to_item(node, struct audio_usecase, list); 26951f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda if (usecase->type == PCM_PLAYBACK && 2696425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) { 2697425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda /* 2698425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda * If acdb tuning is different for SPEAKER_REVERSE, it is must 2699425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda * to perform device switch to disable the current backend to 2700425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda * enable it with new acdb data. 2701425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda */ 2702425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda if (acdb_device_table[SND_DEVICE_OUT_SPEAKER] != 2703425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE]) { 270488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi const int initial_skpr_gain = ramp_speaker_gain(adev, false /*ramp_up*/, -1); 2705425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda select_devices(adev, usecase->id); 270688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi if (initial_skpr_gain != -EINVAL) { 270788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi ramp_speaker_gain(adev, true /*ramp_up*/, initial_skpr_gain); 270888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi } 27091f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda } else { 2710425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda const char *mixer_path; 2711425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda if (swap_channels) { 2712425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER_REVERSE); 2713425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda audio_route_apply_and_update_path(adev->audio_route, mixer_path); 2714425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda } else { 2715425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER); 2716425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda audio_route_apply_and_update_path(adev->audio_route, mixer_path); 2717425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda } 27181f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda } 27191f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda break; 27201f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda } 27211f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda } 27221f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda } 27231f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda return 0; 27241f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda} 2725