blob: 07663110cc1da002bb91751355e10a43da1756f9 [file] [log] [blame]
Eric Laurentb23d5282013-05-14 15:27:20 -07001/*
Aalique Grahame5f596f32018-01-09 12:56:35 -08002 * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003 * Not a Contribution.
4 *
Shiv Maliyappanahalli8911f282014-01-10 15:56:19 -08005 * Copyright (C) 2013 The Android Open Source Project
Eric Laurentb23d5282013-05-14 15:27:20 -07006 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20#define LOG_TAG "msm8974_platform"
Ashish Jain3e37a702016-11-25 12:27:15 +053021//#define LOG_NDEBUG 0
Eric Laurentb23d5282013-05-14 15:27:20 -070022#define LOG_NDDEBUG 0
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -070023/*#define VERY_VERY_VERBOSE_LOGGING*/
24#ifdef VERY_VERY_VERBOSE_LOGGING
25#define ALOGVV ALOGV
26#else
27#define ALOGVV(a...) do { } while(0)
28#endif
Eric Laurentb23d5282013-05-14 15:27:20 -070029
30#include <stdlib.h>
31#include <dlfcn.h>
Anish Kumar55e6df22014-08-26 17:38:05 -070032#include <fcntl.h>
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -070033#include <sys/ioctl.h>
Eric Laurentb23d5282013-05-14 15:27:20 -070034#include <cutils/log.h>
35#include <cutils/properties.h>
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -070036#include <cutils/str_parms.h>
Eric Laurentb23d5282013-05-14 15:27:20 -070037#include <audio_hw.h>
38#include <platform_api.h>
39#include "platform.h"
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -070040#include "audio_extn.h"
Vignesh Kulothungan55396882017-04-20 14:37:02 -070041#include "acdb.h"
Narsinga Rao Chella05573b72013-11-15 15:21:40 -080042#include "voice_extn.h"
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -070043#include "edid.h"
ApurupaPattapuc6a3a9e2014-01-10 14:46:02 -080044#include "sound/compress_params.h"
Anish Kumar55e6df22014-08-26 17:38:05 -070045#include "sound/msmcal-hwdep.h"
Eric Laurentb23d5282013-05-14 15:27:20 -070046
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +053047#ifdef DYNAMIC_LOG_ENABLED
48#include <log_xml_parser.h>
49#define LOG_MASK HAL_MOD_FILE_PLATFORM
50#include <log_utils.h>
51#endif
52
Anish Kumar55e6df22014-08-26 17:38:05 -070053#define SOUND_TRIGGER_DEVICE_HANDSET_MONO_LOW_POWER_ACDB_ID (100)
Apoorv Raghuvanshia433fb52015-03-16 15:22:30 -070054#define MIXER_FILE_DELIMITER "_"
55#define MIXER_FILE_EXT ".xml"
56
Kuirong Wang0b73b3f2016-12-04 12:59:43 -080057#ifdef LINUX_ENABLED
58#define MIXER_XML_BASE_STRING "/etc/mixer_paths"
59#define MIXER_XML_DEFAULT_PATH "/etc/mixer_paths.xml"
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +053060#define PLATFORM_INFO_XML_PATH_INTCODEC "/etc/audio_platform_info_intcodec.xml"
61#define PLATFORM_INFO_XML_PATH_SKUSH "/etc/audio_platform_info_skush.xml"
Walter Yang319c6fe2017-09-21 17:09:39 +080062#define PLATFORM_INFO_XML_PATH_SKUW "/etc/audio_platform_info_skuw.xml"
Kuirong Wang0b73b3f2016-12-04 12:59:43 -080063#define PLATFORM_INFO_XML_PATH "/etc/audio_platform_info.xml"
64#define MIXER_XML_PATH_AUXPCM "/etc/mixer_paths_auxpcm.xml"
65#define MIXER_XML_PATH_I2S "/etc/mixer_paths_i2s.xml"
Josh Kirschf6932f72017-12-12 11:31:01 -080066#define PLATFORM_INFO_XML_PATH_I2S "/etc/audio_platform_info_extcodec.xml"
Ramu Gottipati54ed9482018-08-21 16:00:22 +053067#define PLATFORM_INFO_XML_PATH_WSA "/etc/audio_platform_info_wsa.xml"
Dhananjay Kumarb34c5c12018-09-25 16:04:26 +053068#define PLATFORM_INFO_XML_PATH_TDM "/etc/audio_platform_info_tdm.xml"
Kuirong Wang0b73b3f2016-12-04 12:59:43 -080069#else
Naresh Tanniru10758b62017-06-05 21:05:53 +053070#define MIXER_XML_BASE_STRING "/vendor/etc/mixer_paths"
71#define MIXER_XML_DEFAULT_PATH "/vendor/etc/mixer_paths.xml"
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +053072#define PLATFORM_INFO_XML_PATH_INTCODEC "/vendor/etc/audio_platform_info_intcodec.xml"
73#define PLATFORM_INFO_XML_PATH_SKUSH "/vendor/etc/audio_platform_info_skush.xml"
Walter Yang319c6fe2017-09-21 17:09:39 +080074#define PLATFORM_INFO_XML_PATH_SKUW "/vendor/etc/audio_platform_info_skuw.xml"
Naresh Tanniru10758b62017-06-05 21:05:53 +053075#define PLATFORM_INFO_XML_PATH "/vendor/etc/audio_platform_info.xml"
76#define MIXER_XML_PATH_AUXPCM "/vendor/etc/mixer_paths_auxpcm.xml"
77#define MIXER_XML_PATH_I2S "/vendor/etc/mixer_paths_i2s.xml"
78#define PLATFORM_INFO_XML_PATH_I2S "/vendor/etc/audio_platform_info_i2s.xml"
Ramu Gottipati54ed9482018-08-21 16:00:22 +053079#define PLATFORM_INFO_XML_PATH_WSA "/vendor/etc/audio_platform_info_wsa.xml"
Dhananjay Kumarb34c5c12018-09-25 16:04:26 +053080#define PLATFORM_INFO_XML_PATH_TDM "/vendor/etc/audio_platform_info_tdm.xml"
Kuirong Wang0b73b3f2016-12-04 12:59:43 -080081#endif
Helen Zeng6a16ad72014-02-23 22:04:44 -080082
vivek mehtaa76401a2015-04-24 14:12:15 -070083#include <linux/msm_audio.h>
Dhananjay Kumar75c9a0c2018-06-07 15:59:00 +053084#if defined (PLATFORM_MSM8998) || (PLATFORM_SDM845) || (PLATFORM_SDM670) || defined (PLATFORM_QCS605) || defined (PLATFORM_MSMNILE) || defined (PLATFORM_QCS405)
Haynes Mathew Georgeef514882017-05-01 17:46:23 -070085#include <sound/devdep_params.h>
86#endif
Helen Zeng6a16ad72014-02-23 22:04:44 -080087
Eric Laurentb23d5282013-05-14 15:27:20 -070088#define LIB_ACDB_LOADER "libacdbloader.so"
Walter Yang6f800052014-07-14 16:15:38 -070089#define CVD_VERSION_MIXER_CTL "CVD Version"
Eric Laurentb23d5282013-05-14 15:27:20 -070090
Preetam Singh Ranawatf5fbdd62016-09-29 18:38:31 +053091#define FLAC_COMPRESS_OFFLOAD_FRAGMENT_SIZE (256 * 1024)
92#define MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE (2 * 1024 * 1024)
ApurupaPattapuc6a3a9e2014-01-10 14:46:02 -080093#define MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE (2 * 1024)
94#define COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING (2 * 1024)
95#define COMPRESS_OFFLOAD_FRAGMENT_SIZE (32 * 1024)
96
Vikram Panduranga7e784962016-10-27 12:32:30 -070097
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -070098/*
Eric Laurentb23d5282013-05-14 15:27:20 -070099 * This file will have a maximum of 38 bytes:
100 *
101 * 4 bytes: number of audio blocks
102 * 4 bytes: total length of Short Audio Descriptor (SAD) blocks
103 * Maximum 10 * 3 bytes: SAD blocks
104 */
105#define MAX_SAD_BLOCKS 10
106#define SAD_BLOCK_SIZE 3
107
Walter Yang6f800052014-07-14 16:15:38 -0700108#define MAX_CVD_VERSION_STRING_SIZE 100
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +0530109#define MAX_SND_CARD_STRING_SIZE 100
Walter Yang6f800052014-07-14 16:15:38 -0700110
Eric Laurentb23d5282013-05-14 15:27:20 -0700111/* EDID format ID for LPCM audio */
112#define EDID_FORMAT_LPCM 1
113
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700114/* fallback app type if the default app type from acdb loader fails */
Srikanth Uyyalaa1e32352015-10-09 14:48:04 +0530115#define DEFAULT_APP_TYPE_RX_PATH 0x11130
116#define DEFAULT_APP_TYPE_TX_PATH 0x11132
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700117
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700118#define SAMPLE_RATE_8KHZ 8000
119#define SAMPLE_RATE_16KHZ 16000
120
Ben Rombergera04fabc2014-11-14 12:16:03 -0800121#define MAX_SET_CAL_BYTE_SIZE 65536
122
Vikram Panduranga6e761cd2016-10-12 16:50:52 -0700123/* Mixer path names */
124#define AFE_SIDETONE_MIXER_PATH "afe-sidetone"
125
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700126#define AUDIO_PARAMETER_KEY_FLUENCE_TYPE "fluence"
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700127#define AUDIO_PARAMETER_KEY_SLOWTALK "st_enable"
Avinash Vaishd5fa4572014-09-15 14:41:14 +0530128#define AUDIO_PARAMETER_KEY_HD_VOICE "hd_voice"
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800129#define AUDIO_PARAMETER_KEY_VOLUME_BOOST "volume_boost"
Ben Rombergera04fabc2014-11-14 12:16:03 -0800130#define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data"
131#define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
132
Rohit kumarf4120402016-08-05 19:19:48 +0530133#define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
134
Sudheer Papothifa9d2282015-09-17 01:53:25 +0530135#define AUDIO_PARAMETER_KEY_PERF_LOCK_OPTS "perf_lock_opts"
Ben Rombergera04fabc2014-11-14 12:16:03 -0800136
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +0530137/* Reload ACDB files from specified path */
138#define AUDIO_PARAMETER_KEY_RELOAD_ACDB "reload_acdb"
139
Tanya Finkel00130052014-07-14 04:26:56 -0700140/* Query external audio device connection status */
141#define AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE "ext_audio_device"
142
Aalique Grahame37659862017-12-03 22:34:26 -0800143/* Query whether it is ok to select display-port as output
144 * device for voice usecase
145 */
146#define AUDIO_PARAMETER_KEY_DP_FOR_VOICE_USECASE "dp_for_voice"
Surendar Karka45850ae2018-07-02 17:45:27 +0530147#define AUDIO_PARAMETER_KEY_SPKR_DEVICE_CHMAP "spkr_device_chmap"
Aalique Grahame37659862017-12-03 22:34:26 -0800148
Tanya Finkel00130052014-07-14 04:26:56 -0700149#define EVENT_EXTERNAL_SPK_1 "qc_ext_spk_1"
150#define EVENT_EXTERNAL_SPK_2 "qc_ext_spk_2"
151#define EVENT_EXTERNAL_MIC "qc_ext_mic"
Anish Kumar55e6df22014-08-26 17:38:05 -0700152#define MAX_CAL_NAME 20
Naresh Tanniru34a303c2016-01-27 17:26:41 +0530153#define MAX_MIME_TYPE_LENGTH 30
Anish Kumar55e6df22014-08-26 17:38:05 -0700154
Vikram Pandurangadf59cae2017-08-03 18:04:55 -0700155#define GET_IN_DEVICE_INDEX(SND_DEVICE) ((SND_DEVICE) - (SND_DEVICE_IN_BEGIN))
156
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +0530157#ifdef DYNAMIC_LOG_ENABLED
158extern void log_utils_init(void);
159extern void log_utils_deinit(void);
160#endif
161
Anish Kumar55e6df22014-08-26 17:38:05 -0700162char cal_name_info[WCD9XXX_MAX_CAL][MAX_CAL_NAME] = {
163 [WCD9XXX_ANC_CAL] = "anc_cal",
164 [WCD9XXX_MBHC_CAL] = "mbhc_cal",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700165 [WCD9XXX_VBAT_CAL] = "vbat_cal",
Anish Kumar55e6df22014-08-26 17:38:05 -0700166};
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +0530167static char *default_rx_backend = NULL;
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800168
Sidipotu Ashok42483b62015-09-08 10:21:44 +0530169#define AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED "is_hw_dec_session_allowed"
170
Naresh Tanniru34a303c2016-01-27 17:26:41 +0530171char dsp_only_decoders_mime[][MAX_MIME_TYPE_LENGTH] = {
Sidipotu Ashok42483b62015-09-08 10:21:44 +0530172 "audio/x-ms-wma" /* wma*/ ,
173 "audio/x-ms-wma-lossless" /* wma lossless */ ,
174 "audio/x-ms-wma-pro" /* wma prop */ ,
175 "audio/amr-wb-plus" /* amr wb plus */ ,
176 "audio/alac" /*alac */ ,
177 "audio/x-ape" /*ape */,
178};
179
180
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800181enum {
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +0530182 VOICE_FEATURE_SET_DEFAULT,
183 VOICE_FEATURE_SET_VOLUME_BOOST
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800184};
sangwoo53b2cf02013-07-25 19:18:44 -0700185
Eric Laurentb23d5282013-05-14 15:27:20 -0700186struct audio_block_header
187{
188 int reserved;
189 int length;
190};
191
vivek mehtaa76401a2015-04-24 14:12:15 -0700192enum {
193 CAL_MODE_SEND = 0x1,
194 CAL_MODE_PERSIST = 0x2,
195 CAL_MODE_RTAC = 0x4
196};
197
Anish Kumar55e6df22014-08-26 17:38:05 -0700198acdb_loader_get_calibration_t acdb_loader_get_calibration;
Eric Laurentb23d5282013-05-14 15:27:20 -0700199
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800200typedef struct codec_backend_cfg {
201 uint32_t sample_rate;
202 uint32_t bit_width;
Ashish Jaind84fd6a2016-07-27 12:33:25 +0530203 uint32_t channels;
Siddartha Shaik44dd7702017-06-14 12:13:25 +0530204 uint32_t format;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -0800205 char *bitwidth_mixer_ctl;
206 char *samplerate_mixer_ctl;
Ashish Jaind84fd6a2016-07-27 12:33:25 +0530207 char *channels_mixer_ctl;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -0800208} codec_backend_cfg_t;
209
Ashish Jain4826f6c2017-02-06 13:33:20 +0530210static native_audio_prop na_props = {0, 0, NATIVE_AUDIO_MODE_INVALID};
Ashish Jainf1eaa582016-05-23 20:54:24 +0530211static bool supports_true_32_bit = false;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530212
Siena Richard7c2db772016-12-21 11:32:34 -0800213static int max_be_dai_names = 0;
214static const struct be_dai_name_struct *be_dai_name_table;
215
Eric Laurentb23d5282013-05-14 15:27:20 -0700216struct platform_data {
217 struct audio_device *adev;
218 bool fluence_in_spkr_mode;
219 bool fluence_in_voice_call;
220 bool fluence_in_voice_rec;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800221 bool fluence_in_audio_rec;
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +0530222 bool fluence_in_hfp_call;
Tanya Finkel00130052014-07-14 04:26:56 -0700223 bool external_spk_1;
224 bool external_spk_2;
225 bool external_mic;
Vignesh Kulothungan3b5fae52017-09-25 12:16:30 -0700226 bool speaker_lr_swap;
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700227 int fluence_type;
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -0800228 int fluence_mode;
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +0530229 char fluence_cap[PROPERTY_VALUE_MAX];
Sachin Mohan Gadagbe2054d2018-01-29 16:05:05 +0530230 bool ambisonic_capture;
231 bool ambisonic_profile;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700232 bool slowtalk;
Avinash Vaishd5fa4572014-09-15 14:41:14 +0530233 bool hd_voice;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +0530234 bool ec_ref_enabled;
Helen Zeng6a16ad72014-02-23 22:04:44 -0800235 bool is_i2s_ext_modem;
Ramjee Singh203473b2015-06-09 15:18:42 +0530236 bool is_acdb_initialized;
Banajit Goswami20cdd212015-09-11 01:11:30 -0700237 /* Vbat monitor related flags */
238 bool is_vbat_speaker;
239 bool gsm_mode_enabled;
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +0530240 bool is_slimbus_interface;
241 bool is_internal_codec;
Rohit kumarf4120402016-08-05 19:19:48 +0530242 int mono_speaker;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700243 /* Audio calibration related functions */
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800244 void *acdb_handle;
245 int voice_feature_set;
246 acdb_init_t acdb_init;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530247 acdb_init_v3_t acdb_init_v3;
Aditya Bavanari20fd7812017-10-03 20:10:35 +0530248 acdb_init_v4_t acdb_init_v4;
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800249 acdb_deallocate_t acdb_deallocate;
250 acdb_send_audio_cal_t acdb_send_audio_cal;
Siena Richard7c2db772016-12-21 11:32:34 -0800251 acdb_send_audio_cal_v3_t acdb_send_audio_cal_v3;
Ben Rombergera04fabc2014-11-14 12:16:03 -0800252 acdb_set_audio_cal_t acdb_set_audio_cal;
253 acdb_get_audio_cal_t acdb_get_audio_cal;
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800254 acdb_send_voice_cal_t acdb_send_voice_cal;
255 acdb_reload_vocvoltable_t acdb_reload_vocvoltable;
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700256 acdb_get_default_app_type_t acdb_get_default_app_type;
Ben Rombergerfeca4b82015-07-07 20:40:44 -0700257 acdb_send_common_top_t acdb_send_common_top;
Banajit Goswami20cdd212015-09-11 01:11:30 -0700258 acdb_set_codec_data_t acdb_set_codec_data;
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +0530259 acdb_reload_t acdb_reload;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530260 acdb_reload_v2_t acdb_reload_v2;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700261 void *hw_info;
vivek mehtaa76401a2015-04-24 14:12:15 -0700262 acdb_send_gain_dep_cal_t acdb_send_gain_dep_cal;
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800263 struct csd_data *csd;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700264 void *edid_info;
265 bool edid_valid;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700266 int ext_disp_type;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -0700267 char ec_ref_mixer_path[64];
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -0800268 codec_backend_cfg_t current_backend_cfg[MAX_CODEC_BACKENDS];
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +0530269 char codec_version[CODEC_VERSION_MAX_LENGTH];
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +0530270 int hw_dep_fd;
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +0530271 char cvd_version[MAX_CVD_VERSION_STRING_SIZE];
272 char snd_card_name[MAX_SND_CARD_STRING_SIZE];
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530273 int source_mic_type;
274 int max_mic_count;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +0530275 bool is_dsd_supported;
Preetam Singh Ranawatb0c0dd72016-08-18 00:32:06 +0530276 bool is_asrc_supported;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530277 struct listnode acdb_meta_key_list;
Aditya Bavanari20fd7812017-10-03 20:10:35 +0530278 struct acdb_init_data_v4 acdb_init_data;
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +0530279 bool use_generic_handset;
Surendar Karka45850ae2018-07-02 17:45:27 +0530280 struct spkr_device_chmap *spkr_ch_map;
Dieter Luecking5d57def2018-09-07 14:23:37 +0200281 bool use_sprk_default_sample_rate;
Surendar Karka45850ae2018-07-02 17:45:27 +0530282};
283
284struct spkr_device_chmap {
285 int num_ch;
286 char chmap[AUDIO_CHANNEL_COUNT_MAX];
Eric Laurentb23d5282013-05-14 15:27:20 -0700287};
288
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700289static int pcm_device_table[AUDIO_USECASE_MAX][2] = {
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700290 [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE,
291 DEEP_BUFFER_PCM_DEVICE},
292 [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700293 LOWLATENCY_PCM_DEVICE},
Ravi Kumar Alamanda474de5a2015-06-25 20:08:01 -0700294 [USECASE_AUDIO_PLAYBACK_ULL] = {MULTIMEDIA3_PCM_DEVICE,
295 MULTIMEDIA3_PCM_DEVICE},
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700296 [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE,
Ravi Kumar Alamanda474de5a2015-06-25 20:08:01 -0700297 MULTIMEDIA2_PCM_DEVICE},
Haynes Mathew George484e8d22017-07-31 18:55:17 -0700298 [USECASE_AUDIO_PLAYBACK_HIFI] = {MULTIMEDIA2_PCM_DEVICE,
299 MULTIMEDIA2_PCM_DEVICE},
Krishnankutty Kolathappillya43f96e2013-11-01 12:17:53 -0700300 [USECASE_AUDIO_PLAYBACK_OFFLOAD] =
301 {PLAYBACK_OFFLOAD_DEVICE, PLAYBACK_OFFLOAD_DEVICE},
Subhash Chandra Bose Naripeddy16ff4f82014-04-01 21:03:10 -0700302 [USECASE_AUDIO_PLAYBACK_OFFLOAD2] =
303 {PLAYBACK_OFFLOAD_DEVICE2, PLAYBACK_OFFLOAD_DEVICE2},
304 [USECASE_AUDIO_PLAYBACK_OFFLOAD3] =
305 {PLAYBACK_OFFLOAD_DEVICE3, PLAYBACK_OFFLOAD_DEVICE3},
306 [USECASE_AUDIO_PLAYBACK_OFFLOAD4] =
307 {PLAYBACK_OFFLOAD_DEVICE4, PLAYBACK_OFFLOAD_DEVICE4},
308 [USECASE_AUDIO_PLAYBACK_OFFLOAD5] =
309 {PLAYBACK_OFFLOAD_DEVICE5, PLAYBACK_OFFLOAD_DEVICE5},
310 [USECASE_AUDIO_PLAYBACK_OFFLOAD6] =
311 {PLAYBACK_OFFLOAD_DEVICE6, PLAYBACK_OFFLOAD_DEVICE6},
312 [USECASE_AUDIO_PLAYBACK_OFFLOAD7] =
313 {PLAYBACK_OFFLOAD_DEVICE7, PLAYBACK_OFFLOAD_DEVICE7},
314 [USECASE_AUDIO_PLAYBACK_OFFLOAD8] =
315 {PLAYBACK_OFFLOAD_DEVICE8, PLAYBACK_OFFLOAD_DEVICE8},
316 [USECASE_AUDIO_PLAYBACK_OFFLOAD9] =
317 {PLAYBACK_OFFLOAD_DEVICE9, PLAYBACK_OFFLOAD_DEVICE9},
vivek mehta0ea887a2015-08-26 14:01:20 -0700318
vivek mehta0ea887a2015-08-26 14:01:20 -0700319
Shiv Maliyappanahallida107642013-10-17 11:16:13 -0700320 [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
Mingming Yine62d7842013-10-25 16:26:03 -0700321 [USECASE_AUDIO_RECORD_COMPRESS] = {COMPRESS_CAPTURE_DEVICE, COMPRESS_CAPTURE_DEVICE},
Dhananjay Kumaree4d2002016-10-25 18:02:58 +0530322 [USECASE_AUDIO_RECORD_COMPRESS2] = {-1, -1},
323 [USECASE_AUDIO_RECORD_COMPRESS3] = {-1, -1},
324 [USECASE_AUDIO_RECORD_COMPRESS4] = {-1, -1},
Dhananjay Kumar376e38b2017-09-28 22:26:23 +0530325 [USECASE_AUDIO_RECORD_COMPRESS5] = {-1, -1},
326 [USECASE_AUDIO_RECORD_COMPRESS6] = {-1, -1},
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700327 [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
328 LOWLATENCY_PCM_DEVICE},
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700329 [USECASE_AUDIO_RECORD_FM_VIRTUAL] = {MULTIMEDIA2_PCM_DEVICE,
330 MULTIMEDIA2_PCM_DEVICE},
Haynes Mathew George484e8d22017-07-31 18:55:17 -0700331 [USECASE_AUDIO_RECORD_HIFI] = {MULTIMEDIA2_PCM_DEVICE,
332 MULTIMEDIA2_PCM_DEVICE},
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700333 [USECASE_AUDIO_PLAYBACK_FM] = {FM_PLAYBACK_PCM_DEVICE, FM_CAPTURE_PCM_DEVICE},
Vimal Puthanveed5b4d3f12013-11-05 15:57:39 -0800334 [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
Vimal Puthanveed47e64852013-12-20 13:23:39 -0800335 [USECASE_AUDIO_HFP_SCO_WB] = {HFP_PCM_RX, HFP_SCO_RX},
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700336 [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE, VOICE_CALL_PCM_DEVICE},
Haynes Mathew George16081042017-05-31 17:16:49 -0700337 [USECASE_AUDIO_PLAYBACK_MMAP] = {MMAP_PLAYBACK_PCM_DEVICE,
338 MMAP_PLAYBACK_PCM_DEVICE},
339 [USECASE_AUDIO_RECORD_MMAP] = {MMAP_RECORD_PCM_DEVICE,
340 MMAP_RECORD_PCM_DEVICE},
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700341 [USECASE_VOICE2_CALL] = {VOICE2_CALL_PCM_DEVICE, VOICE2_CALL_PCM_DEVICE},
342 [USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE},
343 [USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE},
Vicky Sehrawat7e4fc152014-02-12 17:58:59 -0800344 [USECASE_VOWLAN_CALL] = {VOWLAN_CALL_PCM_DEVICE, VOWLAN_CALL_PCM_DEVICE},
Vidyakumar Athota0e109352015-02-12 17:38:22 -0800345 [USECASE_VOICEMMODE1_CALL] = {VOICEMMODE1_CALL_PCM_DEVICE,
346 VOICEMMODE1_CALL_PCM_DEVICE},
347 [USECASE_VOICEMMODE2_CALL] = {VOICEMMODE2_CALL_PCM_DEVICE,
348 VOICEMMODE2_CALL_PCM_DEVICE},
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800349 [USECASE_COMPRESS_VOIP_CALL] = {COMPRESS_VOIP_CALL_PCM_DEVICE, COMPRESS_VOIP_CALL_PCM_DEVICE},
Shiv Maliyappanahallida107642013-10-17 11:16:13 -0700350 [USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE,
351 AUDIO_RECORD_PCM_DEVICE},
352 [USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
353 AUDIO_RECORD_PCM_DEVICE},
354 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
355 AUDIO_RECORD_PCM_DEVICE},
Helen Zenge56b4852013-12-03 16:54:40 -0800356 [USECASE_INCALL_REC_UPLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
357 COMPRESS_CAPTURE_DEVICE},
358 [USECASE_INCALL_REC_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
359 COMPRESS_CAPTURE_DEVICE},
360 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
361 COMPRESS_CAPTURE_DEVICE},
Shiv Maliyappanahallif3b9a422013-10-22 16:38:08 -0700362 [USECASE_INCALL_MUSIC_UPLINK] = {INCALL_MUSIC_UPLINK_PCM_DEVICE,
363 INCALL_MUSIC_UPLINK_PCM_DEVICE},
364 [USECASE_INCALL_MUSIC_UPLINK2] = {INCALL_MUSIC_UPLINK2_PCM_DEVICE,
365 INCALL_MUSIC_UPLINK2_PCM_DEVICE},
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700366 [USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1},
367 [USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE},
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700368
369 [USECASE_AUDIO_PLAYBACK_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
370 AFE_PROXY_RECORD_PCM_DEVICE},
371 [USECASE_AUDIO_RECORD_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
372 AFE_PROXY_RECORD_PCM_DEVICE},
Md Mansoor Ahmeddb1b4f92018-01-25 18:56:31 +0530373 [USECASE_AUDIO_PLAYBACK_SILENCE] = {MULTIMEDIA9_PCM_DEVICE, -1},
Surendar Karka93cd25a2018-08-28 14:21:37 +0530374 [USECASE_AUDIO_TRANSCODE_LOOPBACK_RX] = {TRANSCODE_LOOPBACK_RX_DEV_ID, -1},
375 [USECASE_AUDIO_TRANSCODE_LOOPBACK_TX] = {-1, TRANSCODE_LOOPBACK_TX_DEV_ID},
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700376
Vikram Panduranga93f080e2017-06-07 18:16:14 -0700377 [USECASE_AUDIO_PLAYBACK_VOIP] = {AUDIO_PLAYBACK_VOIP_PCM_DEVICE, AUDIO_PLAYBACK_VOIP_PCM_DEVICE},
378 [USECASE_AUDIO_RECORD_VOIP] = {AUDIO_RECORD_VOIP_PCM_DEVICE, AUDIO_RECORD_VOIP_PCM_DEVICE},
Varun Balaraje49253e2017-07-06 19:48:56 +0530379 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM1] =
380 {PLAYBACK_INTERACTIVE_STRM_DEVICE1, PLAYBACK_INTERACTIVE_STRM_DEVICE1},
381 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM2] =
382 {PLAYBACK_INTERACTIVE_STRM_DEVICE2, PLAYBACK_INTERACTIVE_STRM_DEVICE2},
383 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM3] =
384 {PLAYBACK_INTERACTIVE_STRM_DEVICE3, PLAYBACK_INTERACTIVE_STRM_DEVICE3},
385 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM4] =
386 {PLAYBACK_INTERACTIVE_STRM_DEVICE4, PLAYBACK_INTERACTIVE_STRM_DEVICE4},
387 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM5] =
388 {PLAYBACK_INTERACTIVE_STRM_DEVICE5, PLAYBACK_INTERACTIVE_STRM_DEVICE5},
389 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM6] =
390 {PLAYBACK_INTERACTIVE_STRM_DEVICE6, PLAYBACK_INTERACTIVE_STRM_DEVICE6},
391 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM7] =
392 {PLAYBACK_INTERACTIVE_STRM_DEVICE7, PLAYBACK_INTERACTIVE_STRM_DEVICE7},
393 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM8] =
394 {PLAYBACK_INTERACTIVE_STRM_DEVICE8, PLAYBACK_INTERACTIVE_STRM_DEVICE8},
Vikram Panduranga93f080e2017-06-07 18:16:14 -0700395
Eric Laurentb23d5282013-05-14 15:27:20 -0700396};
397
398/* Array to store sound devices */
399static const char * const device_table[SND_DEVICE_MAX] = {
400 [SND_DEVICE_NONE] = "none",
401 /* Playback sound devices */
402 [SND_DEVICE_OUT_HANDSET] = "handset",
403 [SND_DEVICE_OUT_SPEAKER] = "speaker",
Tanya Finkel00130052014-07-14 04:26:56 -0700404 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_1] = "speaker-ext-1",
405 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_2] = "speaker-ext-2",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700406 [SND_DEVICE_OUT_SPEAKER_VBAT] = "speaker-vbat",
Eric Laurentb23d5282013-05-14 15:27:20 -0700407 [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse",
408 [SND_DEVICE_OUT_HEADPHONES] = "headphones",
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +0530409 [SND_DEVICE_OUT_HEADPHONES_DSD] = "headphones-dsd",
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800410 [SND_DEVICE_OUT_HEADPHONES_44_1] = "headphones-44.1",
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700411 [SND_DEVICE_OUT_LINE] = "line",
Eric Laurentb23d5282013-05-14 15:27:20 -0700412 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700413 [SND_DEVICE_OUT_SPEAKER_AND_LINE] = "speaker-and-line",
Tanya Finkel00130052014-07-14 04:26:56 -0700414 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = "speaker-and-headphones-ext-1",
415 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = "speaker-and-headphones-ext-2",
Eric Laurentb23d5282013-05-14 15:27:20 -0700416 [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
417 [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700418 [SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "voice-speaker-vbat",
Rohit kumarf4120402016-08-05 19:19:48 +0530419 [SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
420 [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = "voice-speaker-2-vbat",
Eric Laurentb23d5282013-05-14 15:27:20 -0700421 [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700422 [SND_DEVICE_OUT_VOICE_LINE] = "voice-line",
Eric Laurentb23d5282013-05-14 15:27:20 -0700423 [SND_DEVICE_OUT_HDMI] = "hdmi",
424 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700425 [SND_DEVICE_OUT_DISPLAY_PORT] = "display-port",
426 [SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = "speaker-and-display-port",
Eric Laurentb23d5282013-05-14 15:27:20 -0700427 [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700428 [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530429 [SND_DEVICE_OUT_BT_A2DP] = "bt-a2dp",
430 [SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = "speaker-and-bt-a2dp",
Eric Laurentb23d5282013-05-14 15:27:20 -0700431 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
432 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
433 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700434 [SND_DEVICE_OUT_VOICE_TTY_FULL_USB] = "voice-tty-full-usb",
435 [SND_DEVICE_OUT_VOICE_TTY_VCO_USB] = "voice-tty-vco-usb",
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700436 [SND_DEVICE_OUT_VOICE_TX] = "voice-tx",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700437 [SND_DEVICE_OUT_AFE_PROXY] = "afe-proxy",
Ashish Jain3e37a702016-11-25 12:27:15 +0530438 [SND_DEVICE_OUT_USB_HEADSET] = "usb-headset",
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700439 [SND_DEVICE_OUT_VOICE_USB_HEADSET] = "usb-headset",
Ashish Jain3e37a702016-11-25 12:27:15 +0530440 [SND_DEVICE_OUT_USB_HEADPHONES] = "usb-headphones",
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700441 [SND_DEVICE_OUT_VOICE_USB_HEADPHONES] = "usb-headphones",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700442 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = "speaker-and-usb-headphones",
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700443 [SND_DEVICE_OUT_TRANSMISSION_FM] = "transmission-fm",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700444 [SND_DEVICE_OUT_ANC_HEADSET] = "anc-headphones",
445 [SND_DEVICE_OUT_ANC_FB_HEADSET] = "anc-fb-headphones",
446 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = "voice-anc-headphones",
447 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = "voice-anc-fb-headphones",
Preetam Singh Ranawat91132162017-03-13 20:32:03 +0530448 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = "voice-speaker-and-voice-headphones",
449 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = "voice-speaker-and-voice-anc-headphones",
450 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = "voice-speaker-and-voice-anc-fb-headphones",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700451 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
Meng Wang841d6c02017-01-24 12:34:36 +0800452 [SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET] = "speaker-and-anc-fb-headphones",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700453 [SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700454 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
Anish Kumar46c7b872014-09-09 01:49:44 -0700455 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
Rohit kumarf4120402016-08-05 19:19:48 +0530456 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700457 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
458 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
Rohit kumarf4120402016-08-05 19:19:48 +0530459 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = "voice-speaker-2-protected-vbat",
Srinivas Julakanti1ca769a2017-01-04 23:18:08 -0800460 [SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = "speaker-protected",
461 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = "speaker-protected-vbat",
kunleizbe6a8442017-08-08 17:11:35 +0800462 [SND_DEVICE_OUT_SPEAKER_AND_BT_SCO] = "speaker-and-bt-sco",
463 [SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB] = "speaker-and-bt-sco-wb",
Eric Laurentb23d5282013-05-14 15:27:20 -0700464
465 /* Capture sound devices */
466 [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
Tanya Finkel00130052014-07-14 04:26:56 -0700467 [SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = "handset-mic-ext",
Eric Laurentb23d5282013-05-14 15:27:20 -0700468 [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800469 [SND_DEVICE_IN_HANDSET_MIC_NS] = "handset-mic",
470 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = "handset-mic",
471 [SND_DEVICE_IN_HANDSET_DMIC] = "dmic-endfire",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800472 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = "dmic-endfire",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800473 [SND_DEVICE_IN_HANDSET_DMIC_NS] = "dmic-endfire",
474 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = "dmic-endfire",
475 [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800476 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800477 [SND_DEVICE_IN_SPEAKER_MIC_NS] = "speaker-mic",
478 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = "speaker-mic",
479 [SND_DEVICE_IN_SPEAKER_DMIC] = "speaker-dmic-endfire",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800480 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = "speaker-dmic-endfire",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800481 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = "speaker-dmic-endfire",
482 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = "speaker-dmic-endfire",
483 [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic",
484 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = "headset-mic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700485 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
486 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
Ralf Herzafb164f2018-07-03 07:08:07 +0200487 [SND_DEVICE_IN_SPDIF] = "spdif-in",
488 [SND_DEVICE_IN_HDMI_MIC] = "hdmi-in",
489 [SND_DEVICE_IN_HDMI_ARC] = "hdmi-arc-in",
Eric Laurentb23d5282013-05-14 15:27:20 -0700490 [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700491 [SND_DEVICE_IN_BT_SCO_MIC_NREC] = "bt-sco-mic",
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700492 [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700493 [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = "bt-sco-mic-wb",
Eric Laurentb23d5282013-05-14 15:27:20 -0700494 [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700495 [SND_DEVICE_IN_VOICE_DMIC] = "voice-dmic-ef",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700496 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = "voice-speaker-dmic-ef",
Vidyakumar Athotaadfe4e32013-12-13 14:51:26 -0800497 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = "voice-speaker-qmic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700498 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
499 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
500 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700501 [SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC] = "voice-tty-full-usb-mic",
502 [SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC] = "voice-tty-hco-usb-mic",
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700503 [SND_DEVICE_IN_VOICE_RX] = "voice-rx",
504
Eric Laurentb23d5282013-05-14 15:27:20 -0700505 [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800506 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800507 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700508 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700509 [SND_DEVICE_IN_USB_HEADSET_MIC] = "usb-headset-mic",
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700510 [SND_DEVICE_IN_VOICE_USB_HEADSET_MIC] ="usb-headset-mic",
511 [SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = "usb-headset-mic",
512 [SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC] = "usb-headset-mic",
513 [SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC] = "usb-headset-mic",
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700514 [SND_DEVICE_IN_CAPTURE_FM] = "capture-fm",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700515 [SND_DEVICE_IN_AANC_HANDSET_MIC] = "aanc-handset-mic",
Shiv Maliyappanahallidd287262016-01-08 15:57:07 -0800516 [SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = "aanc-handset-mic",
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700517 [SND_DEVICE_IN_QUAD_MIC] = "quad-mic",
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -0700518 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
519 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700520 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
Rohit kumarf4120402016-08-05 19:19:48 +0530521 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = "vi-feedback-mono-1",
522 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = "vi-feedback-mono-2",
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -0800523 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = "voice-speaker-dmic-broadside",
524 [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = "speaker-dmic-broadside",
525 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = "speaker-dmic-broadside",
526 [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = "speaker-dmic-broadside",
527 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = "speaker-dmic-broadside",
Narsinga Rao Chella975572e2014-10-21 11:49:00 -0700528 [SND_DEVICE_IN_HANDSET_QMIC] = "quad-mic",
529 [SND_DEVICE_IN_SPEAKER_QMIC_AEC] = "quad-mic",
530 [SND_DEVICE_IN_SPEAKER_QMIC_NS] = "quad-mic",
531 [SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS] = "quad-mic",
Ben Romberger182c8252016-07-18 16:54:54 -0700532 [SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE] = "quad-mic",
Shiv Maliyappanahalli5a10aea2015-07-02 10:36:23 -0700533 [SND_DEVICE_IN_THREE_MIC] = "three-mic",
Aditya Bavanari4051c8d2017-12-13 13:31:26 +0530534 [SND_DEVICE_IN_HANDSET_TMIC_FLUENCE_PRO] = "three-mic",
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530535 [SND_DEVICE_IN_HANDSET_TMIC] = "three-mic",
Aditya Bavanari4051c8d2017-12-13 13:31:26 +0530536 [SND_DEVICE_IN_HANDSET_TMIC_AEC] = "three-mic",
537 [SND_DEVICE_IN_HANDSET_TMIC_NS] = "three-mic",
538 [SND_DEVICE_IN_HANDSET_TMIC_AEC_NS] = "three-mic",
Ben Rombergera4d76db2016-10-13 15:26:02 -0700539 [SND_DEVICE_IN_VOICE_REC_TMIC] = "three-mic",
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +0530540 [SND_DEVICE_IN_UNPROCESSED_MIC] = "unprocessed-mic",
Aalique Grahame97748be2017-10-10 14:32:29 -0700541 [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = "unprocessed-stereo-mic",
542 [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = "unprocessed-three-mic",
543 [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = "unprocessed-quad-mic",
544 [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = "unprocessed-headset-mic",
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +0530545 [SND_DEVICE_IN_HANDSET_GENERIC_QMIC] = "quad-mic",
Divya Narayanan Poojary356e01e2018-02-06 14:25:16 +0530546 [SND_DEVICE_IN_INCALL_REC_RX] = "incall-rec-rx",
547 [SND_DEVICE_IN_INCALL_REC_TX] = "incall-rec-tx",
548 [SND_DEVICE_IN_INCALL_REC_RX_TX] = "incall-rec-rx-tx",
Ramu Gottipati813ae982018-07-25 14:14:48 +0530549 [SND_DEVICE_IN_LINE] = "line-in",
Eric Laurentb23d5282013-05-14 15:27:20 -0700550};
551
Amit Shekhar5a39c912014-10-14 15:39:30 -0700552// Platform specific backend bit width table
553static int backend_bit_width_table[SND_DEVICE_MAX] = {0};
554
Vikram Pandurangadf59cae2017-08-03 18:04:55 -0700555static struct audio_effect_config effect_config_table[GET_IN_DEVICE_INDEX(SND_DEVICE_MAX)][EFFECT_MAX] = {
556 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FLUENCE_PROV2, 0x0, 0x10EAF, 0x01},
557 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FLUENCE_PROV2, 0x0, 0x10EAF, 0x02},
558 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE)][EFFECT_AEC] = {TX_VOICE_DM_FV5_BROADSIDE, 0x0,
559 0x10EAF, 0x01},
560 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE)][EFFECT_NS] = {TX_VOICE_DM_FV5_BROADSIDE, 0x0,
561 0x10EAF, 0x02},
562 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FV5ECNS_DM, 0x0, 0x10EAF, 0x01},
563 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FV5ECNS_DM, 0x0, 0x10EAF, 0x02},
564 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FV5ECNS_SM, 0x0, 0x10EAF, 0x01},
565 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FV5ECNS_SM, 0x0, 0x10EAF, 0x02},
566 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FV5ECNS_DM, 0x0, 0x10EAF, 0x01},
567 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FV5ECNS_DM, 0x0, 0x10EAF, 0x02},
568 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FV5ECNS_SM, 0x0, 0x10EAF, 0x01},
569 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FV5ECNS_SM, 0x0, 0x10EAF, 0x02},
570};
571
Eric Laurentb23d5282013-05-14 15:27:20 -0700572/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
Ben Romberger55886882014-01-10 13:49:02 -0800573static int acdb_device_table[SND_DEVICE_MAX] = {
Eric Laurentb23d5282013-05-14 15:27:20 -0700574 [SND_DEVICE_NONE] = -1,
575 [SND_DEVICE_OUT_HANDSET] = 7,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800576 [SND_DEVICE_OUT_SPEAKER] = 14,
Tanya Finkel87af1a52015-03-27 14:54:23 -0700577 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_1] = 130,
578 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_2] = 130,
Banajit Goswami20cdd212015-09-11 01:11:30 -0700579 [SND_DEVICE_OUT_SPEAKER_VBAT] = 14,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800580 [SND_DEVICE_OUT_SPEAKER_REVERSE] = 14,
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700581 [SND_DEVICE_OUT_LINE] = 10,
Eric Laurentb23d5282013-05-14 15:27:20 -0700582 [SND_DEVICE_OUT_HEADPHONES] = 10,
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +0530583 [SND_DEVICE_OUT_HEADPHONES_DSD] = 10,
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800584 [SND_DEVICE_OUT_HEADPHONES_44_1] = 10,
Eric Laurentb23d5282013-05-14 15:27:20 -0700585 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10,
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700586 [SND_DEVICE_OUT_SPEAKER_AND_LINE] = 10,
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -0800587 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = 130,
588 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = 130,
Eric Laurentb23d5282013-05-14 15:27:20 -0700589 [SND_DEVICE_OUT_VOICE_HANDSET] = 7,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800590 [SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
Banajit Goswami20cdd212015-09-11 01:11:30 -0700591 [SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = 14,
Rohit kumarf4120402016-08-05 19:19:48 +0530592 [SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
593 [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700594 [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700595 [SND_DEVICE_OUT_VOICE_LINE] = 10,
Preetam Singh Ranawat91132162017-03-13 20:32:03 +0530596 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = 10,
597 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = 10,
598 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = 10,
Eric Laurentb23d5282013-05-14 15:27:20 -0700599 [SND_DEVICE_OUT_HDMI] = 18,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800600 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700601 [SND_DEVICE_OUT_DISPLAY_PORT] = 18,
602 [SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700603 [SND_DEVICE_OUT_BT_SCO] = 22,
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700604 [SND_DEVICE_OUT_BT_SCO_WB] = 39,
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530605 [SND_DEVICE_OUT_BT_A2DP] = 20,
606 [SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700607 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
608 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
609 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700610 [SND_DEVICE_OUT_VOICE_TTY_FULL_USB] = 17,
611 [SND_DEVICE_OUT_VOICE_TTY_VCO_USB] = 17,
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700612 [SND_DEVICE_OUT_VOICE_TX] = 45,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700613 [SND_DEVICE_OUT_AFE_PROXY] = 0,
Vidyakumar Athotab9522202014-01-14 20:08:27 -0800614 [SND_DEVICE_OUT_USB_HEADSET] = 45,
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700615 [SND_DEVICE_OUT_VOICE_USB_HEADSET] = 45,
Ashish Jain3e37a702016-11-25 12:27:15 +0530616 [SND_DEVICE_OUT_USB_HEADPHONES] = 45,
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700617 [SND_DEVICE_OUT_VOICE_USB_HEADPHONES] = 45,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700618 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 14,
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700619 [SND_DEVICE_OUT_TRANSMISSION_FM] = 0,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700620 [SND_DEVICE_OUT_ANC_HEADSET] = 26,
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700621 [SND_DEVICE_OUT_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700622 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = 26,
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700623 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700624 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26,
Meng Wang841d6c02017-01-24 12:34:36 +0800625 [SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700626 [SND_DEVICE_OUT_ANC_HANDSET] = 103,
Anish Kumar46c7b872014-09-09 01:49:44 -0700627 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124,
628 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101,
Rohit kumarf4120402016-08-05 19:19:48 +0530629 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = 101,
Banajit Goswami20cdd212015-09-11 01:11:30 -0700630 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
631 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
Rohit kumarf4120402016-08-05 19:19:48 +0530632 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
Srinivas Julakanti1ca769a2017-01-04 23:18:08 -0800633 [SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = 134,
634 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = 134,
Eric Laurentb23d5282013-05-14 15:27:20 -0700635 [SND_DEVICE_IN_HANDSET_MIC] = 4,
Tanya Finkel00130052014-07-14 04:26:56 -0700636 [SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = 4,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800637 [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106,
638 [SND_DEVICE_IN_HANDSET_MIC_NS] = 107,
639 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = 108,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800640 [SND_DEVICE_IN_HANDSET_DMIC] = 41,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800641 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = 109,
642 [SND_DEVICE_IN_HANDSET_DMIC_NS] = 110,
643 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = 111,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800644 [SND_DEVICE_IN_SPEAKER_MIC] = 11,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800645 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 112,
646 [SND_DEVICE_IN_SPEAKER_MIC_NS] = 113,
647 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = 114,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800648 [SND_DEVICE_IN_SPEAKER_DMIC] = 43,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800649 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = 115,
650 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = 116,
651 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117,
Eric Laurentb23d5282013-05-14 15:27:20 -0700652 [SND_DEVICE_IN_HEADSET_MIC] = 8,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800653 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = 47,
Eric Laurentb23d5282013-05-14 15:27:20 -0700654 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
655 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
Ralf Herz76b455c2018-09-10 13:58:04 +0200656 [SND_DEVICE_IN_SPDIF] = 143,
657 [SND_DEVICE_IN_HDMI_MIC] = 143,
658 [SND_DEVICE_IN_HDMI_ARC] = 143,
Eric Laurentb23d5282013-05-14 15:27:20 -0700659 [SND_DEVICE_IN_BT_SCO_MIC] = 21,
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700660 [SND_DEVICE_IN_BT_SCO_MIC_NREC] = 122,
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700661 [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700662 [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = 123,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800663 [SND_DEVICE_IN_CAMCORDER_MIC] = 4,
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700664 [SND_DEVICE_IN_VOICE_DMIC] = 41,
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700665 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43,
Vidyakumar Athotaadfe4e32013-12-13 14:51:26 -0800666 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = 19,
Eric Laurentb23d5282013-05-14 15:27:20 -0700667 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
668 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
669 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700670 [SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC] = 16,
671 [SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC] = 16,
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700672 [SND_DEVICE_IN_VOICE_RX] = 44,
673
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800674 [SND_DEVICE_IN_VOICE_REC_MIC] = 4,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800675 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = 107,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800676 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 34,
677 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 41,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700678 [SND_DEVICE_IN_USB_HEADSET_MIC] = 44,
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700679 [SND_DEVICE_IN_VOICE_USB_HEADSET_MIC] = 44,
680 [SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC] = 44,
681 [SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC] = 44,
682 [SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = 44,
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700683 [SND_DEVICE_IN_CAPTURE_FM] = 0,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700684 [SND_DEVICE_IN_AANC_HANDSET_MIC] = 104,
Shiv Maliyappanahallidd287262016-01-08 15:57:07 -0800685 [SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = 105,
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700686 [SND_DEVICE_IN_QUAD_MIC] = 46,
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -0700687 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
688 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700689 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
Rohit kumarf4120402016-08-05 19:19:48 +0530690 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = 102,
691 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = 102,
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -0800692 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = 12,
693 [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = 12,
694 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = 119,
695 [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = 121,
696 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = 120,
Narsinga Rao Chella975572e2014-10-21 11:49:00 -0700697 [SND_DEVICE_IN_HANDSET_QMIC] = 125,
698 [SND_DEVICE_IN_SPEAKER_QMIC_AEC] = 126,
699 [SND_DEVICE_IN_SPEAKER_QMIC_NS] = 127,
700 [SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS] = 129,
Ben Romberger182c8252016-07-18 16:54:54 -0700701 [SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE] = 125,
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530702 [SND_DEVICE_IN_THREE_MIC] = 46, /* for APSS Surround Sound Recording */
Aditya Bavanari4051c8d2017-12-13 13:31:26 +0530703 [SND_DEVICE_IN_HANDSET_TMIC_FLUENCE_PRO] = 125,
704 [SND_DEVICE_IN_HANDSET_TMIC] = 153,
705 [SND_DEVICE_IN_HANDSET_TMIC_AEC] = 154,
706 [SND_DEVICE_IN_HANDSET_TMIC_NS] = 155,
707 [SND_DEVICE_IN_HANDSET_TMIC_AEC_NS] = 156,
Ben Rombergera4d76db2016-10-13 15:26:02 -0700708 [SND_DEVICE_IN_VOICE_REC_TMIC] = 125,
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +0530709 [SND_DEVICE_IN_UNPROCESSED_MIC] = 143,
710 [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = 144,
711 [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = 145,
712 [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = 146,
713 [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = 147,
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +0530714 [SND_DEVICE_IN_HANDSET_GENERIC_QMIC] = 150,
Ramu Gottipati813ae982018-07-25 14:14:48 +0530715 [SND_DEVICE_IN_LINE] = 4,
Eric Laurentb23d5282013-05-14 15:27:20 -0700716};
717
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700718struct name_to_index {
Ben Romberger61764e32014-01-10 13:49:02 -0800719 char name[100];
720 unsigned int index;
721};
722
723#define TO_NAME_INDEX(X) #X, X
724
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800725/* Used to get index from parsed string */
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700726static struct name_to_index snd_device_name_index[SND_DEVICE_MAX] = {
Ben Romberger61764e32014-01-10 13:49:02 -0800727 {TO_NAME_INDEX(SND_DEVICE_OUT_HANDSET)},
728 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER)},
Tanya Finkel00130052014-07-14 04:26:56 -0700729 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_EXTERNAL_1)},
730 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_EXTERNAL_2)},
Banajit Goswami20cdd212015-09-11 01:11:30 -0700731 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_VBAT)},
Ben Romberger61764e32014-01-10 13:49:02 -0800732 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_REVERSE)},
733 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES)},
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +0530734 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES_DSD)},
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800735 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES_44_1)},
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700736 {TO_NAME_INDEX(SND_DEVICE_OUT_LINE)},
Ben Romberger61764e32014-01-10 13:49:02 -0800737 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES)},
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700738 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_LINE)},
Tanya Finkel00130052014-07-14 04:26:56 -0700739 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1)},
740 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2)},
Ben Romberger61764e32014-01-10 13:49:02 -0800741 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET)},
742 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
Banajit Goswami20cdd212015-09-11 01:11:30 -0700743 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)},
Rohit kumarf4120402016-08-05 19:19:48 +0530744 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2)},
745 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)},
Ben Romberger61764e32014-01-10 13:49:02 -0800746 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700747 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)},
Ben Romberger61764e32014-01-10 13:49:02 -0800748 {TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
749 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HDMI)},
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700750 {TO_NAME_INDEX(SND_DEVICE_OUT_DISPLAY_PORT)},
751 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT)},
Ben Romberger61764e32014-01-10 13:49:02 -0800752 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO)},
753 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)},
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530754 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_A2DP)},
755 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP)},
Ben Romberger61764e32014-01-10 13:49:02 -0800756 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
757 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)},
758 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)},
kunleizbe6a8442017-08-08 17:11:35 +0800759 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_SCO)},
760 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB)},
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700761 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_USB)},
762 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_USB)},
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +0530763 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TX)},
Ben Romberger61764e32014-01-10 13:49:02 -0800764 {TO_NAME_INDEX(SND_DEVICE_OUT_AFE_PROXY)},
765 {TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADSET)},
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700766 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_USB_HEADSET)},
Ashish Jain3e37a702016-11-25 12:27:15 +0530767 {TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADPHONES)},
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700768 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_USB_HEADPHONES)},
Ben Romberger61764e32014-01-10 13:49:02 -0800769 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET)},
770 {TO_NAME_INDEX(SND_DEVICE_OUT_TRANSMISSION_FM)},
771 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HEADSET)},
772 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_FB_HEADSET)},
773 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_ANC_HEADSET)},
774 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET)},
775 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET)},
Meng Wang841d6c02017-01-24 12:34:36 +0800776 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET)},
Ben Romberger61764e32014-01-10 13:49:02 -0800777 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)},
778 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
Anish Kumar46c7b872014-09-09 01:49:44 -0700779 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
Rohit kumarf4120402016-08-05 19:19:48 +0530780 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
Banajit Goswami20cdd212015-09-11 01:11:30 -0700781 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
782 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
Rohit kumarf4120402016-08-05 19:19:48 +0530783 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
Srinivas Julakanti1ca769a2017-01-04 23:18:08 -0800784 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS)},
785 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS)},
Ben Romberger61764e32014-01-10 13:49:02 -0800786 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
Tanya Finkel00130052014-07-14 04:26:56 -0700787 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_EXTERNAL)},
Ben Romberger61764e32014-01-10 13:49:02 -0800788 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)},
789 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_NS)},
790 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)},
791 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC)},
792 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC)},
793 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_NS)},
794 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)},
795 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC)},
796 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC)},
797 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_NS)},
798 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)},
799 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC)},
800 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC)},
801 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS)},
802 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)},
803 {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC)},
804 {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC_FLUENCE)},
805 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
806 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
Ralf Herzafb164f2018-07-03 07:08:07 +0200807 {TO_NAME_INDEX(SND_DEVICE_IN_SPDIF)},
Ben Romberger61764e32014-01-10 13:49:02 -0800808 {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
Ralf Herzafb164f2018-07-03 07:08:07 +0200809 {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_ARC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800810 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC)},
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700811 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_NREC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800812 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB)},
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700813 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB_NREC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800814 {TO_NAME_INDEX(SND_DEVICE_IN_CAMCORDER_MIC)},
815 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC)},
816 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC)},
817 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_QMIC)},
818 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC)},
819 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC)},
820 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC)},
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700821 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC)},
822 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800823 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC)},
824 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_NS)},
825 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_STEREO)},
826 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)},
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +0530827 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_RX)},
Ben Romberger61764e32014-01-10 13:49:02 -0800828 {TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MIC)},
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700829 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_USB_HEADSET_MIC)},
830 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC)},
831 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC)},
832 {TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MIC_AEC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800833 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_FM)},
834 {TO_NAME_INDEX(SND_DEVICE_IN_AANC_HANDSET_MIC)},
Shiv Maliyappanahallidd287262016-01-08 15:57:07 -0800835 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800836 {TO_NAME_INDEX(SND_DEVICE_IN_QUAD_MIC)},
837 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_STEREO_DMIC)},
838 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_STEREO_DMIC)},
839 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
Rohit kumarf4120402016-08-05 19:19:48 +0530840 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1)},
841 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2)},
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -0800842 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE)},
843 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE)},
844 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE)},
845 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE)},
846 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE)},
Narsinga Rao Chella975572e2014-10-21 11:49:00 -0700847 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC)},
848 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC)},
849 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_NS)},
850 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS)},
Ben Romberger182c8252016-07-18 16:54:54 -0700851 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE)},
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530852 {TO_NAME_INDEX(SND_DEVICE_IN_THREE_MIC)},
Aditya Bavanari4051c8d2017-12-13 13:31:26 +0530853 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC_FLUENCE_PRO)},
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530854 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC)},
Aditya Bavanari4051c8d2017-12-13 13:31:26 +0530855 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC_AEC)},
856 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC_NS)},
857 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC_AEC_NS)},
Ben Rombergera4d76db2016-10-13 15:26:02 -0700858 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_TMIC)},
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +0530859 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_MIC)},
860 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_STEREO_MIC)},
861 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_THREE_MIC)},
862 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_QUAD_MIC)},
863 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC)},
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +0530864 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_GENERIC_QMIC)},
Divya Narayanan Poojary356e01e2018-02-06 14:25:16 +0530865 {TO_NAME_INDEX(SND_DEVICE_IN_INCALL_REC_RX)},
866 {TO_NAME_INDEX(SND_DEVICE_IN_INCALL_REC_TX)},
867 {TO_NAME_INDEX(SND_DEVICE_IN_INCALL_REC_RX_TX)},
Ramu Gottipati813ae982018-07-25 14:14:48 +0530868 {TO_NAME_INDEX(SND_DEVICE_IN_LINE)},
Ben Romberger61764e32014-01-10 13:49:02 -0800869};
870
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +0530871static char * backend_tag_table[SND_DEVICE_MAX] = {0};
872static char * hw_interface_table[SND_DEVICE_MAX] = {0};
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700873
874static struct name_to_index usecase_name_index[AUDIO_USECASE_MAX] = {
875 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_DEEP_BUFFER)},
876 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_LOW_LATENCY)},
Ravi Kumar Alamanda474de5a2015-06-25 20:08:01 -0700877 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_ULL)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700878 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MULTI_CH)},
879 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD)},
Alexy Joseph2f89cfa2014-10-06 12:15:01 -0700880 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD2)},
881 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD3)},
882 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD4)},
883 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD5)},
884 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD6)},
885 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD7)},
886 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD8)},
887 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD9)},
Haynes Mathew George16081042017-05-31 17:16:49 -0700888 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MMAP)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700889 {TO_NAME_INDEX(USECASE_AUDIO_RECORD)},
Dhananjay Kumaree4d2002016-10-25 18:02:58 +0530890 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS)},
891 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS2)},
892 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS3)},
893 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS4)},
Dhananjay Kumar376e38b2017-09-28 22:26:23 +0530894 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS5)},
895 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS6)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700896 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_LOW_LATENCY)},
Haynes Mathew George16081042017-05-31 17:16:49 -0700897 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_MMAP)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700898 {TO_NAME_INDEX(USECASE_VOICE_CALL)},
899 {TO_NAME_INDEX(USECASE_VOICE2_CALL)},
900 {TO_NAME_INDEX(USECASE_VOLTE_CALL)},
901 {TO_NAME_INDEX(USECASE_QCHAT_CALL)},
902 {TO_NAME_INDEX(USECASE_VOWLAN_CALL)},
Shiv Maliyappanahallif2d2a492016-05-11 22:03:47 -0700903 {TO_NAME_INDEX(USECASE_VOICEMMODE1_CALL)},
904 {TO_NAME_INDEX(USECASE_VOICEMMODE2_CALL)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700905 {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK)},
906 {TO_NAME_INDEX(USECASE_INCALL_REC_DOWNLINK)},
907 {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK_AND_DOWNLINK)},
908 {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO)},
Satya Krishna Pindiprolic6b0a742017-02-03 14:37:18 +0530909 {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO_WB)},
Shiv Maliyappanahallie236ff02016-05-26 11:47:48 -0700910 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_FM)},
911 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_FM_VIRTUAL)},
Stephen Oglesbyf8a7bf92016-05-11 14:23:16 -0700912 {TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_RX)},
913 {TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_TX)},
Garmond Leunge1e8c762016-06-27 16:35:15 -0700914 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_AFE_PROXY)},
915 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_AFE_PROXY)},
Md Mansoor Ahmeddb1b4f92018-01-25 18:56:31 +0530916 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_SILENCE)},
Surendar Karka93cd25a2018-08-28 14:21:37 +0530917 {TO_NAME_INDEX(USECASE_AUDIO_TRANSCODE_LOOPBACK_RX)},
918 {TO_NAME_INDEX(USECASE_AUDIO_TRANSCODE_LOOPBACK_TX)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700919};
920
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700921#define NO_COLS 2
922#ifdef PLATFORM_APQ8084
923static int msm_device_to_be_id [][NO_COLS] = {
924 {AUDIO_DEVICE_OUT_EARPIECE , 2},
925 {AUDIO_DEVICE_OUT_SPEAKER , 2},
926 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 2},
927 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 2},
928 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
929 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
930 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
931 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
932 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
933 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
934 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
935 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
936 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
937 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
938 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +0530939 {AUDIO_DEVICE_OUT_USB_HEADSET , -1},
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700940 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
941 {AUDIO_DEVICE_OUT_PROXY , 9},
942 {AUDIO_DEVICE_OUT_FM , 7},
943 {AUDIO_DEVICE_OUT_FM_TX , 8},
944 {AUDIO_DEVICE_OUT_ALL , -1},
945 {AUDIO_DEVICE_NONE , -1},
946 {AUDIO_DEVICE_OUT_DEFAULT , -1},
947};
948#elif PLATFORM_MSM8994
949static int msm_device_to_be_id [][NO_COLS] = {
950 {AUDIO_DEVICE_OUT_EARPIECE , 2},
951 {AUDIO_DEVICE_OUT_SPEAKER , 2},
952 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 2},
953 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 2},
954 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 38},
955 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 38},
956 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 38},
957 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
958 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
959 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
960 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
961 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
962 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
963 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
964 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +0530965 {AUDIO_DEVICE_OUT_USB_HEADSET , -1},
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700966 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
967 {AUDIO_DEVICE_OUT_PROXY , 9},
968/* Add the correct be ids */
969 {AUDIO_DEVICE_OUT_FM , 7},
970 {AUDIO_DEVICE_OUT_FM_TX , 8},
971 {AUDIO_DEVICE_OUT_ALL , -1},
972 {AUDIO_DEVICE_NONE , -1},
973 {AUDIO_DEVICE_OUT_DEFAULT , -1},
974};
Pradnya Chaphekarf0b1cfe2015-04-15 16:52:49 -0700975#elif PLATFORM_MSM8996
976static int msm_device_to_be_id [][NO_COLS] = {
977 {AUDIO_DEVICE_OUT_EARPIECE , 2},
978 {AUDIO_DEVICE_OUT_SPEAKER , 2},
Sharad Sangle1f705a72016-10-05 20:01:39 +0530979 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 41},
980 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 41},
Pradnya Chaphekarf0b1cfe2015-04-15 16:52:49 -0700981 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
982 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
983 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
984 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
985 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
986 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
987 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
988 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
989 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
990 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
991 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +0530992 {AUDIO_DEVICE_OUT_USB_HEADSET , -1},
Pradnya Chaphekarf0b1cfe2015-04-15 16:52:49 -0700993 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
994 {AUDIO_DEVICE_OUT_PROXY , 9},
995/* Add the correct be ids */
996 {AUDIO_DEVICE_OUT_FM , 7},
997 {AUDIO_DEVICE_OUT_FM_TX , 8},
998 {AUDIO_DEVICE_OUT_ALL , -1},
999 {AUDIO_DEVICE_NONE , -1},
1000 {AUDIO_DEVICE_OUT_DEFAULT , -1},
1001};
Weiyin Jiang6f4c8062016-11-23 15:30:29 +08001002#elif PLATFORM_MSM8998
1003static int msm_device_to_be_id [][NO_COLS] = {
1004 {AUDIO_DEVICE_OUT_EARPIECE , 2},
1005 {AUDIO_DEVICE_OUT_SPEAKER , 2},
1006 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 41},
1007 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 41},
1008 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
1009 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
1010 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
1011 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
1012 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
1013 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
1014 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
1015 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
1016 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
1017 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
1018 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +05301019 {AUDIO_DEVICE_OUT_USB_HEADSET , -1},
Weiyin Jiang6f4c8062016-11-23 15:30:29 +08001020 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
1021 {AUDIO_DEVICE_OUT_PROXY , 9},
1022/* Add the correct be ids */
1023 {AUDIO_DEVICE_OUT_FM , 7},
1024 {AUDIO_DEVICE_OUT_FM_TX , 8},
1025 {AUDIO_DEVICE_OUT_ALL , -1},
1026 {AUDIO_DEVICE_NONE , -1},
1027 {AUDIO_DEVICE_OUT_DEFAULT , -1},
1028};
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001029#else
1030static int msm_device_to_be_id [][NO_COLS] = {
1031 {AUDIO_DEVICE_NONE, -1},
1032};
1033#endif
1034static int msm_be_id_array_len =
1035 sizeof(msm_device_to_be_id) / sizeof(msm_device_to_be_id[0]);
1036
Haynes Mathew George7ff216f2013-09-11 19:51:41 -07001037#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL)
Ashish Jain5106d362016-05-11 19:23:33 +05301038#define PCM_OFFLOAD_PLATFORM_DELAY (30*1000LL)
Haynes Mathew George7ff216f2013-09-11 19:51:41 -07001039#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
Haynes Mathew George5beddd42016-06-27 18:33:40 -07001040#define ULL_PLATFORM_DELAY (6*1000LL)
Haynes Mathew George16081042017-05-31 17:16:49 -07001041#define MMAP_PLATFORM_DELAY (3*1000LL)
Haynes Mathew George7ff216f2013-09-11 19:51:41 -07001042
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05301043static void update_codec_type_and_interface(struct platform_data * my_data, const char *snd_card_name) {
1044
Walter Yang319c6fe2017-09-21 17:09:39 +08001045 if (!strncmp(snd_card_name, "sdm670-skuw-snd-card",
1046 sizeof("sdm670-skuw-snd-card")) ||
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05301047 !strncmp(snd_card_name, "sdm660-snd-card-skush",
Walter Yang319c6fe2017-09-21 17:09:39 +08001048 sizeof("sdm660-snd-card-skush")) ||
Walter Yang725a57f2017-11-03 14:32:49 +08001049 !strncmp(snd_card_name, "sdm670-360cam-snd-card",
1050 sizeof("sdm670-360cam-snd-card")) ||
Walter Yang319c6fe2017-09-21 17:09:39 +08001051 !strncmp(snd_card_name, "sdm660-snd-card-mtp",
1052 sizeof("sdm660-snd-card-mtp")) ||
Sharad Sangle999cf722017-10-18 18:25:47 +05301053 !strncmp(snd_card_name, "sdm670-mtp-snd-card",
Sachin Mohan Gadageffd7562018-02-13 17:10:09 +05301054 sizeof("sdm670-mtp-snd-card")) ||
1055 !strncmp(snd_card_name, "qcs605-lc-snd-card",
1056 sizeof("qcs605-lc-snd-card"))) {
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05301057 ALOGI("%s: snd_card_name: %s",__func__,snd_card_name);
1058 my_data->is_internal_codec = true;
1059 my_data->is_slimbus_interface = false;
1060 }
1061}
1062
Preetam Singh Ranawatbfec31e2017-05-04 11:51:50 +05301063static bool can_enable_mbdrc_on_device(snd_device_t snd_device)
1064{
1065 bool ret = false;
1066
1067 if (snd_device == SND_DEVICE_OUT_SPEAKER ||
1068 snd_device == SND_DEVICE_OUT_SPEAKER_WSA ||
1069 snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
1070 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
1071 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
1072 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
1073 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
1074 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
1075 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
1076 ret = true;
1077 }
1078 return ret;
1079}
1080
`Deeraj Soman676c2702017-09-18 19:25:53 +05301081static const char *platform_get_mixer_control(struct mixer_ctl *);
1082
vivek mehtaa76401a2015-04-24 14:12:15 -07001083bool platform_send_gain_dep_cal(void *platform, int level) {
1084 bool ret_val = false;
1085 struct platform_data *my_data = (struct platform_data *)platform;
1086 struct audio_device *adev = my_data->adev;
1087 int acdb_dev_id, app_type;
1088 int acdb_dev_type = MSM_SNDDEV_CAP_RX;
1089 int mode = CAL_MODE_RTAC;
1090 struct listnode *node;
1091 struct audio_usecase *usecase;
1092
1093 if (my_data->acdb_send_gain_dep_cal == NULL) {
1094 ALOGE("%s: dlsym error for acdb_send_gain_dep_cal", __func__);
1095 return ret_val;
1096 }
1097
1098 if (!voice_is_in_call(adev)) {
1099 ALOGV("%s: Not Voice call usecase, apply new cal for level %d",
1100 __func__, level);
1101
1102 // find the current active sound device
1103 list_for_each(node, &adev->usecase_list) {
1104 usecase = node_to_item(node, struct audio_usecase, list);
1105
Vikram Panduranga93f080e2017-06-07 18:16:14 -07001106 if (usecase != NULL && usecase->type == PCM_PLAYBACK) {
Preetam Singh Ranawatbfec31e2017-05-04 11:51:50 +05301107 int new_snd_device[2] = {0};
1108 int i, num_devices = 1;
vivek mehtaa76401a2015-04-24 14:12:15 -07001109
1110 ALOGV("%s: out device is %d", __func__, usecase->out_snd_device);
1111 app_type = usecase->stream.out->app_type_cfg.app_type;
Preetam Singh Ranawatafe17c72017-05-16 13:12:34 +05301112 acdb_dev_id = acdb_device_table[usecase->out_snd_device];
vivek mehta0b8ea6f2015-07-23 17:27:26 -07001113
Preetam Singh Ranawatbfec31e2017-05-04 11:51:50 +05301114 if (platform_split_snd_device(my_data, usecase->out_snd_device,
1115 &num_devices, new_snd_device) < 0)
1116 new_snd_device[0] = usecase->out_snd_device;
1117
1118 for (i = 0; i < num_devices; i++)
1119 if (can_enable_mbdrc_on_device(new_snd_device[i])) {
1120 if (audio_extn_spkr_prot_is_enabled())
1121 acdb_dev_id = platform_get_spkr_prot_acdb_id(new_snd_device[i]);
1122 else
1123 acdb_dev_id = acdb_device_table[new_snd_device[i]];
1124 }
vivek mehta0b8ea6f2015-07-23 17:27:26 -07001125
vivek mehtaa76401a2015-04-24 14:12:15 -07001126 if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type,
1127 acdb_dev_type, mode, level)) {
1128 // set ret_val true if at least one calibration is set successfully
1129 ret_val = true;
1130 } else {
1131 ALOGE("%s: my_data->acdb_send_gain_dep_cal failed ", __func__);
1132 }
1133 } else {
1134 ALOGW("%s: Usecase list is empty", __func__);
1135 }
1136 }
1137 } else {
1138 ALOGW("%s: Voice call in progress .. ignore setting new cal",
1139 __func__);
1140 }
1141 return ret_val;
1142}
1143
Banajit Goswami20cdd212015-09-11 01:11:30 -07001144void platform_set_gsm_mode(void *platform, bool enable)
1145{
1146 struct platform_data *my_data = (struct platform_data *)platform;
1147 struct audio_device *adev = my_data->adev;
1148
1149 if (my_data->gsm_mode_enabled) {
1150 my_data->gsm_mode_enabled = false;
1151 ALOGV("%s: disabling gsm mode", __func__);
1152 audio_route_reset_and_update_path(adev->audio_route, "gsm-mode");
1153 }
1154
1155 if (enable) {
1156 my_data->gsm_mode_enabled = true;
1157 ALOGD("%s: enabling gsm mode", __func__);
1158 audio_route_apply_and_update_path(adev->audio_route, "gsm-mode");
1159 }
1160}
1161
1162void platform_set_echo_reference(struct audio_device *adev, bool enable,
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05301163 audio_devices_t out_device __unused)
Eric Laurentb23d5282013-05-14 15:27:20 -07001164{
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001165 struct platform_data *my_data = (struct platform_data *)adev->platform;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001166
1167 if (strcmp(my_data->ec_ref_mixer_path, "")) {
1168 ALOGV("%s: disabling %s", __func__, my_data->ec_ref_mixer_path);
Banajit Goswami20cdd212015-09-11 01:11:30 -07001169 audio_route_reset_and_update_path(adev->audio_route,
1170 my_data->ec_ref_mixer_path);
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05301171 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001172
Ravi Kumar Alamandad1c85bb2014-11-17 18:36:24 -08001173 if (enable) {
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001174 /*
1175 * If native audio device reference count > 0, then apply codec EC otherwise
Banajit Goswami20cdd212015-09-11 01:11:30 -07001176 * fallback to Speakers with VBat if enabled or default
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001177 */
1178 if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_HEADPHONES_44_1] > 0)
Banajit Goswami20cdd212015-09-11 01:11:30 -07001179 strlcpy(my_data->ec_ref_mixer_path, "echo-reference headphones-44.1",
1180 sizeof(my_data->ec_ref_mixer_path));
Leena Winterrowdd7a04cd2016-01-07 11:50:02 -08001181 else if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_SPEAKER_VBAT] > 0)
Banajit Goswami20cdd212015-09-11 01:11:30 -07001182 strlcpy(my_data->ec_ref_mixer_path, "echo-reference speaker-vbat",
1183 sizeof(my_data->ec_ref_mixer_path));
Aalique Grahame37659862017-12-03 22:34:26 -08001184 else if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_DISPLAY_PORT] > 0)
1185 strlcpy(my_data->ec_ref_mixer_path, "echo-reference display-port",
1186 sizeof(my_data->ec_ref_mixer_path));
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001187 else
Banajit Goswami20cdd212015-09-11 01:11:30 -07001188 strlcpy(my_data->ec_ref_mixer_path, "echo-reference",
1189 sizeof(my_data->ec_ref_mixer_path));
Ravi Kumar Alamandad1c85bb2014-11-17 18:36:24 -08001190
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001191 ALOGD("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
1192 audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
1193 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001194}
1195
Helen Zeng6a16ad72014-02-23 22:04:44 -08001196static struct csd_data *open_csd_client(bool i2s_ext_modem)
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001197{
1198 struct csd_data *csd = calloc(1, sizeof(struct csd_data));
1199
Haynes Mathew Georgeb51ceb12014-06-30 13:56:18 -07001200 if (!csd) {
1201 ALOGE("failed to allocate csd_data mem");
1202 return NULL;
1203 }
1204
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001205 csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW);
1206 if (csd->csd_client == NULL) {
1207 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT);
1208 goto error;
1209 } else {
1210 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT);
1211
1212 csd->deinit = (deinit_t)dlsym(csd->csd_client,
1213 "csd_client_deinit");
1214 if (csd->deinit == NULL) {
1215 ALOGE("%s: dlsym error %s for csd_client_deinit", __func__,
1216 dlerror());
1217 goto error;
1218 }
1219 csd->disable_device = (disable_device_t)dlsym(csd->csd_client,
1220 "csd_client_disable_device");
1221 if (csd->disable_device == NULL) {
1222 ALOGE("%s: dlsym error %s for csd_client_disable_device",
1223 __func__, dlerror());
1224 goto error;
1225 }
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08001226 csd->enable_device_config = (enable_device_config_t)dlsym(csd->csd_client,
1227 "csd_client_enable_device_config");
1228 if (csd->enable_device_config == NULL) {
1229 ALOGE("%s: dlsym error %s for csd_client_enable_device_config",
1230 __func__, dlerror());
1231 goto error;
1232 }
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001233 csd->enable_device = (enable_device_t)dlsym(csd->csd_client,
1234 "csd_client_enable_device");
1235 if (csd->enable_device == NULL) {
1236 ALOGE("%s: dlsym error %s for csd_client_enable_device",
1237 __func__, dlerror());
1238 goto error;
1239 }
1240 csd->start_voice = (start_voice_t)dlsym(csd->csd_client,
1241 "csd_client_start_voice");
1242 if (csd->start_voice == NULL) {
1243 ALOGE("%s: dlsym error %s for csd_client_start_voice",
1244 __func__, dlerror());
1245 goto error;
1246 }
1247 csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client,
1248 "csd_client_stop_voice");
1249 if (csd->stop_voice == NULL) {
1250 ALOGE("%s: dlsym error %s for csd_client_stop_voice",
1251 __func__, dlerror());
1252 goto error;
1253 }
1254 csd->volume = (volume_t)dlsym(csd->csd_client,
1255 "csd_client_volume");
1256 if (csd->volume == NULL) {
1257 ALOGE("%s: dlsym error %s for csd_client_volume",
1258 __func__, dlerror());
1259 goto error;
1260 }
1261 csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client,
1262 "csd_client_mic_mute");
1263 if (csd->mic_mute == NULL) {
1264 ALOGE("%s: dlsym error %s for csd_client_mic_mute",
1265 __func__, dlerror());
1266 goto error;
1267 }
1268 csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client,
1269 "csd_client_slow_talk");
1270 if (csd->slow_talk == NULL) {
1271 ALOGE("%s: dlsym error %s for csd_client_slow_talk",
1272 __func__, dlerror());
1273 goto error;
1274 }
1275 csd->start_playback = (start_playback_t)dlsym(csd->csd_client,
1276 "csd_client_start_playback");
1277 if (csd->start_playback == NULL) {
1278 ALOGE("%s: dlsym error %s for csd_client_start_playback",
1279 __func__, dlerror());
1280 goto error;
1281 }
1282 csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client,
1283 "csd_client_stop_playback");
1284 if (csd->stop_playback == NULL) {
1285 ALOGE("%s: dlsym error %s for csd_client_stop_playback",
1286 __func__, dlerror());
1287 goto error;
1288 }
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -07001289 csd->set_lch = (set_lch_t)dlsym(csd->csd_client, "csd_client_set_lch");
1290 if (csd->set_lch == NULL) {
1291 ALOGE("%s: dlsym error %s for csd_client_set_lch",
1292 __func__, dlerror());
1293 /* Ignore the error as this is not mandatory function for
1294 * basic voice call to work.
1295 */
1296 }
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001297 csd->start_record = (start_record_t)dlsym(csd->csd_client,
1298 "csd_client_start_record");
1299 if (csd->start_record == NULL) {
1300 ALOGE("%s: dlsym error %s for csd_client_start_record",
1301 __func__, dlerror());
1302 goto error;
1303 }
1304 csd->stop_record = (stop_record_t)dlsym(csd->csd_client,
1305 "csd_client_stop_record");
1306 if (csd->stop_record == NULL) {
1307 ALOGE("%s: dlsym error %s for csd_client_stop_record",
1308 __func__, dlerror());
1309 goto error;
1310 }
Helen Zeng6a16ad72014-02-23 22:04:44 -08001311
1312 csd->get_sample_rate = (get_sample_rate_t)dlsym(csd->csd_client,
1313 "csd_client_get_sample_rate");
1314 if (csd->get_sample_rate == NULL) {
1315 ALOGE("%s: dlsym error %s for csd_client_get_sample_rate",
1316 __func__, dlerror());
1317
1318 goto error;
1319 }
1320
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001321 csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init");
1322
1323 if (csd->init == NULL) {
1324 ALOGE("%s: dlsym error %s for csd_client_init",
1325 __func__, dlerror());
1326 goto error;
1327 } else {
Helen Zeng6a16ad72014-02-23 22:04:44 -08001328 csd->init(i2s_ext_modem);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001329 }
1330 }
1331 return csd;
1332
1333error:
1334 free(csd);
1335 csd = NULL;
1336 return csd;
1337}
1338
1339void close_csd_client(struct csd_data *csd)
1340{
1341 if (csd != NULL) {
1342 csd->deinit();
1343 dlclose(csd->csd_client);
1344 free(csd);
1345 csd = NULL;
1346 }
1347}
1348
Helen Zeng6a16ad72014-02-23 22:04:44 -08001349static bool platform_is_i2s_ext_modem(const char *snd_card_name,
1350 struct platform_data *plat_data)
1351{
1352 plat_data->is_i2s_ext_modem = false;
1353
1354 if (!strncmp(snd_card_name, "apq8084-taiko-i2s-mtp-snd-card",
1355 sizeof("apq8084-taiko-i2s-mtp-snd-card")) ||
1356 !strncmp(snd_card_name, "apq8084-taiko-i2s-cdp-snd-card",
Josh Kirschc3894372016-03-28 15:59:48 -07001357 sizeof("apq8084-taiko-i2s-cdp-snd-card")) ||
1358 !strncmp(snd_card_name, "apq8096-tasha-i2c-snd-card",
Xiaoyu Yec494c752017-11-02 18:52:48 -07001359 sizeof("apq8096-tasha-i2c-snd-card")) ||
1360 !strncmp(snd_card_name, "sdx-tavil-i2s-snd-card",
Josh Kirschf20adbf2018-03-06 16:26:22 -08001361 sizeof("sdx-tavil-i2s-snd-card")) ||
1362 !strncmp(snd_card_name, "sda845-tavil-i2s-snd-card",
1363 sizeof("sda845-tavil-i2s-snd-card"))) {
Helen Zeng6a16ad72014-02-23 22:04:44 -08001364 plat_data->is_i2s_ext_modem = true;
1365 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301366 ALOGV("%s, is_i2s_ext_modem:%d soundcard name is %s",__func__,
1367 plat_data->is_i2s_ext_modem, snd_card_name);
Helen Zeng6a16ad72014-02-23 22:04:44 -08001368
1369 return plat_data->is_i2s_ext_modem;
Helen Zeng008aebd2014-02-23 19:13:12 -08001370}
1371
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05301372static void set_platform_defaults(struct platform_data * my_data)
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001373{
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05301374 int32_t dev;
1375 unsigned int count = 0;
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301376 const char *MEDIA_MIMETYPE_AUDIO_ALAC = "audio/alac";
1377 const char *MEDIA_MIMETYPE_AUDIO_APE = "audio/x-ape";
1378
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001379 for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301380 backend_tag_table[dev] = NULL;
1381 hw_interface_table[dev] = NULL;
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001382 }
Amit Shekhar5a39c912014-10-14 15:39:30 -07001383 for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08001384 backend_bit_width_table[dev] = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Amit Shekhar5a39c912014-10-14 15:39:30 -07001385 }
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001386
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301387 // To overwrite these go to the audio_platform_info.xml file.
1388 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("bt-sco");
1389 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("bt-sco-wb");
1390 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("bt-sco");
1391 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("bt-sco-wb");
Ralf Herzafb164f2018-07-03 07:08:07 +02001392 backend_tag_table[SND_DEVICE_IN_SPDIF] = strdup("spdif-in");
1393 backend_tag_table[SND_DEVICE_IN_HDMI_MIC] = strdup("hdmi-in");
1394 backend_tag_table[SND_DEVICE_IN_HDMI_ARC] = strdup("hdmi-arc-in");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301395 backend_tag_table[SND_DEVICE_OUT_BT_SCO] = strdup("bt-sco");
1396 backend_tag_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("bt-sco-wb");
1397 backend_tag_table[SND_DEVICE_OUT_HDMI] = strdup("hdmi");
1398 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("speaker-and-hdmi");
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07001399 backend_tag_table[SND_DEVICE_OUT_DISPLAY_PORT] = strdup("display-port");
1400 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = strdup("speaker-and-display-port");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301401 backend_tag_table[SND_DEVICE_OUT_VOICE_TX] = strdup("afe-proxy");
1402 backend_tag_table[SND_DEVICE_IN_VOICE_RX] = strdup("afe-proxy");
1403 backend_tag_table[SND_DEVICE_OUT_AFE_PROXY] = strdup("afe-proxy");
Ashish Jain3e37a702016-11-25 12:27:15 +05301404 backend_tag_table[SND_DEVICE_OUT_USB_HEADSET] = strdup("usb-headset");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001405 backend_tag_table[SND_DEVICE_OUT_VOICE_USB_HEADSET] = strdup("usb-headset");
Ashish Jain3e37a702016-11-25 12:27:15 +05301406 backend_tag_table[SND_DEVICE_OUT_USB_HEADPHONES] = strdup("usb-headphones");
Aniket Kumar Latab26135f2017-06-16 12:20:04 -07001407 backend_tag_table[SND_DEVICE_OUT_VOICE_TTY_FULL_USB] = strdup("usb-headset");
1408 backend_tag_table[SND_DEVICE_OUT_VOICE_TTY_VCO_USB] = strdup("usb-headphones");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001409 backend_tag_table[SND_DEVICE_OUT_VOICE_USB_HEADPHONES] = strdup("usb-headphones");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301410 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] =
Sidipotu Ashokeaec6392016-04-19 09:37:57 +05301411 strdup("speaker-and-usb-headphones");
Aniket Kumar Lata6bbd3bb2017-07-21 11:09:21 -07001412 backend_tag_table[SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC] = strdup("usb-headset-mic");
1413 backend_tag_table[SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC] = strdup("usb-headset-mic");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301414 backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MIC] = strdup("usb-headset-mic");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001415 backend_tag_table[SND_DEVICE_IN_VOICE_USB_HEADSET_MIC] = strdup("usb-headset-mic");
1416 backend_tag_table[SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC] = strdup("usb-headset-mic");
1417 backend_tag_table[SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC] = strdup("usb-headset-mic");
1418 backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = strdup("usb-headset-mic");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301419 backend_tag_table[SND_DEVICE_IN_CAPTURE_FM] = strdup("capture-fm");
1420 backend_tag_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("transmission-fm");
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05301421 backend_tag_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("headphones-dsd");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301422 backend_tag_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
1423 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("voice-speaker-vbat");
Rohit kumarf4120402016-08-05 19:19:48 +05301424 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("voice-speaker-2-vbat");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301425 backend_tag_table[SND_DEVICE_OUT_BT_A2DP] = strdup("bt-a2dp");
1426 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05301427 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
1428 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
1429 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = strdup("speaker-and-headphones");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301430
Siena Richard7c2db772016-12-21 11:32:34 -08001431 hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
1432 hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
1433 hw_interface_table[SND_DEVICE_OUT_SPEAKER_EXTERNAL_1] = strdup("SLIMBUS_0_RX");
1434 hw_interface_table[SND_DEVICE_OUT_SPEAKER_EXTERNAL_2] = strdup("SLIMBUS_0_RX");
1435 hw_interface_table[SND_DEVICE_OUT_SPEAKER_REVERSE] = strdup("SLIMBUS_0_RX");
1436 hw_interface_table[SND_DEVICE_OUT_SPEAKER_VBAT] = strdup("SLIMBUS_0_RX");
1437 hw_interface_table[SND_DEVICE_OUT_LINE] = strdup("SLIMBUS_6_RX");
1438 hw_interface_table[SND_DEVICE_OUT_HEADPHONES] = strdup("SLIMBUS_6_RX");
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05301439 hw_interface_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("SLIMBUS_2_RX");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301440 hw_interface_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("SLIMBUS_5_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001441 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05301442 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1443 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1444 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001445 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1446 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1447 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1448 hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET] = strdup("SLIMBUS_0_RX");
1449 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER] = strdup("SLIMBUS_0_RX");
1450 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("SLIMBUS_0_RX");
1451 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2] = strdup("SLIMBUS_0_RX");
1452 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("SLIMBUS_0_RX");
1453 hw_interface_table[SND_DEVICE_OUT_VOICE_HEADPHONES] = strdup("SLIMBUS_6_RX");
1454 hw_interface_table[SND_DEVICE_OUT_VOICE_LINE] = strdup("SLIMBUS_6_RX");
1455 hw_interface_table[SND_DEVICE_OUT_HDMI] = strdup("HDMI");
1456 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("SLIMBUS_0_RX-and-HDMI");
1457 hw_interface_table[SND_DEVICE_OUT_DISPLAY_PORT] = strdup("DISPLAY_PORT");
1458 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = strdup("SLIMBUS_0_RX-and-DISPLAY_PORT");
1459 hw_interface_table[SND_DEVICE_OUT_BT_SCO] = strdup("SLIMBUS_7_RX");
1460 hw_interface_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("SLIMBUS_7_RX");
1461 hw_interface_table[SND_DEVICE_OUT_BT_A2DP] = strdup("SLIMBUS_7_RX");
1462 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("SLIMBUS_0_RX-and-SLIMBUS_7_RX");
1463 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = strdup("SLIMBUS_6_RX");
1464 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = strdup("SLIMBUS_6_RX");
1465 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = strdup("SLIMBUS_0_RX");
Aniket Kumar Latab26135f2017-06-16 12:20:04 -07001466 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_FULL_USB] = strdup("USB_AUDIO_RX");
1467 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_VCO_USB] = strdup("USB_AUDIO_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001468 hw_interface_table[SND_DEVICE_OUT_VOICE_TX] = strdup("RT_PROXY_DAI_001_RX");
1469 hw_interface_table[SND_DEVICE_OUT_AFE_PROXY] = strdup("RT_PROXY_DAI_001_RX");
Ashish Jainb26edfb2016-08-25 00:10:11 +05301470 hw_interface_table[SND_DEVICE_OUT_USB_HEADSET] = strdup("USB_AUDIO_RX");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001471 hw_interface_table[SND_DEVICE_OUT_VOICE_USB_HEADSET] = strdup("USB_AUDIO_RX");
Ashish Jain3e37a702016-11-25 12:27:15 +05301472 hw_interface_table[SND_DEVICE_OUT_USB_HEADPHONES] = strdup("USB_AUDIO_RX");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001473 hw_interface_table[SND_DEVICE_OUT_VOICE_USB_HEADPHONES] = strdup("USB_AUDIO_RX");
Ashish Jainb26edfb2016-08-25 00:10:11 +05301474 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = strdup("SLIMBUS_0_RX-and-USB_AUDIO_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001475 hw_interface_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("SLIMBUS_8_TX");
1476 hw_interface_table[SND_DEVICE_OUT_ANC_HEADSET] = strdup("SLIMBUS_6_RX");
1477 hw_interface_table[SND_DEVICE_OUT_ANC_FB_HEADSET] = strdup("SLIMBUS_6_RX");
1478 hw_interface_table[SND_DEVICE_OUT_VOICE_ANC_HEADSET] = strdup("SLIMBUS_6_RX");
1479 hw_interface_table[SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = strdup("SLIMBUS_6_RX");
1480 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1481 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1482 hw_interface_table[SND_DEVICE_OUT_ANC_HANDSET] = strdup("SLIMBUS_0_RX");
Aditya Bavanari701a6992017-03-30 19:17:16 +05301483 hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
1484 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
1485 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = strdup("SLIMBUS_0_RX");
1486 hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
1487 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
1488 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001489 hw_interface_table[SND_DEVICE_OUT_SPEAKER_WSA] = strdup("SLIMBUS_0_RX");
1490 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = strdup("SLIMBUS_0_RX");
1491 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = strdup("SLIMBUS_0_RX");
1492 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
1493 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = strdup("SLIMBUS_0_TX");
1494 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_AEC] = strdup("SLIMBUS_0_TX");
1495 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_NS] = strdup("SLIMBUS_0_TX");
1496 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1497 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC] = strdup("SLIMBUS_0_TX");
1498 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC_AEC] = strdup("SLIMBUS_0_TX");
1499 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC_NS] = strdup("SLIMBUS_0_TX");
1500 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1501 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC] = strdup("SLIMBUS_0_TX");
1502 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_AEC] = strdup("SLIMBUS_0_TX");
1503 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_NS] = strdup("SLIMBUS_0_TX");
1504 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1505 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
1506 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC] = strdup("SLIMBUS_0_TX");
1507 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_NS] = strdup("SLIMBUS_0_TX");
1508 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1509 hw_interface_table[SND_DEVICE_IN_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1510 hw_interface_table[SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = strdup("SLIMBUS_0_TX");
1511 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = strdup("SLIMBUS_0_TX");
1512 hw_interface_table[SND_DEVICE_IN_VOICE_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
Ralf Herzafb164f2018-07-03 07:08:07 +02001513 hw_interface_table[SND_DEVICE_IN_SPDIF] = strdup("PRI_SPDIF_TX");
1514 hw_interface_table[SND_DEVICE_IN_HDMI_MIC] = strdup("SEC_MI2S_TX");
1515 hw_interface_table[SND_DEVICE_IN_HDMI_ARC] = strdup("SEC_SPDIF_TX");
Siena Richard7c2db772016-12-21 11:32:34 -08001516 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("SLIMBUS_7_TX");
1517 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("SLIMBUS_7_TX");
1518 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("SLIMBUS_7_TX");
1519 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("SLIMBUS_7_TX");
1520 hw_interface_table[SND_DEVICE_IN_CAMCORDER_MIC] = strdup("SLIMBUS_0_TX");
1521 hw_interface_table[SND_DEVICE_IN_VOICE_DMIC] = strdup("SLIMBUS_0_TX");
1522 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
1523 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = strdup("SLIMBUS_0_TX");
1524 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1525 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
1526 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
Aniket Kumar Latab26135f2017-06-16 12:20:04 -07001527 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC] = strdup("USB_AUDIO_TX");
1528 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC] = strdup("USB_AUDIO_TX");
Siena Richard7c2db772016-12-21 11:32:34 -08001529 hw_interface_table[SND_DEVICE_IN_VOICE_REC_MIC] = strdup("SLIMBUS_0_TX");
1530 hw_interface_table[SND_DEVICE_IN_VOICE_REC_MIC_NS] = strdup("SLIMBUS_0_TX");
1531 hw_interface_table[SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = strdup("SLIMBUS_0_TX");
1532 hw_interface_table[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = strdup("SLIMBUS_0_TX");
1533 hw_interface_table[SND_DEVICE_IN_VOICE_RX] = strdup("RT_PROXY_DAI_002_TX");
1534 hw_interface_table[SND_DEVICE_IN_USB_HEADSET_MIC] = strdup("USB_AUDIO_TX");
1535 hw_interface_table[SND_DEVICE_IN_CAPTURE_FM] = strdup("SLIMBUS_8_TX");
1536 hw_interface_table[SND_DEVICE_IN_AANC_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
1537 hw_interface_table[SND_DEVICE_IN_QUAD_MIC] = strdup("SLIMBUS_0_TX");
1538 hw_interface_table[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = strdup("SLIMBUS_0_TX");
1539 hw_interface_table[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = strdup("SLIMBUS_0_TX");
1540 hw_interface_table[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = strdup("SLIMBUS_4_TX");
1541 hw_interface_table[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = strdup("SLIMBUS_4_TX");
1542 hw_interface_table[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = strdup("SLIMBUS_4_TX");
1543 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = strdup("SLIMBUS_0_TX");
1544 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = strdup("SLIMBUS_0_TX");
1545 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = strdup("SLIMBUS_0_TX");
1546 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = strdup("SLIMBUS_0_TX");
1547 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = strdup("SLIMBUS_0_TX");
1548 hw_interface_table[SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = strdup("SLIMBUS_0_TX");
1549 hw_interface_table[SND_DEVICE_IN_HANDSET_QMIC] = strdup("SLIMBUS_0_TX");
1550 hw_interface_table[SND_DEVICE_IN_SPEAKER_QMIC_AEC] = strdup("SLIMBUS_0_TX");
1551 hw_interface_table[SND_DEVICE_IN_SPEAKER_QMIC_NS] = strdup("SLIMBUS_0_TX");
1552 hw_interface_table[SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1553 hw_interface_table[SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE] = strdup("SLIMBUS_0_TX");
1554 hw_interface_table[SND_DEVICE_IN_THREE_MIC] = strdup("SLIMBUS_0_TX");
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05301555 hw_interface_table[SND_DEVICE_IN_HANDSET_TMIC_FLUENCE_PRO] = strdup("SLIMBUS_0_TX");
Siena Richard7c2db772016-12-21 11:32:34 -08001556 hw_interface_table[SND_DEVICE_IN_HANDSET_TMIC] = strdup("SLIMBUS_0_TX");
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05301557 hw_interface_table[SND_DEVICE_IN_HANDSET_TMIC_AEC] = strdup("SLIMBUS_0_TX");
1558 hw_interface_table[SND_DEVICE_IN_HANDSET_TMIC_NS] = strdup("SLIMBUS_0_TX");
1559 hw_interface_table[SND_DEVICE_IN_HANDSET_TMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
Siena Richard7c2db772016-12-21 11:32:34 -08001560 hw_interface_table[SND_DEVICE_IN_VOICE_REC_TMIC] = strdup("SLIMBUS_0_TX");
1561 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_MIC] = strdup("SLIMBUS_0_TX");
1562 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = strdup("SLIMBUS_0_TX");
1563 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = strdup("SLIMBUS_0_TX");
1564 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = strdup("SLIMBUS_0_TX");
1565 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +05301566 hw_interface_table[SND_DEVICE_IN_HANDSET_GENERIC_QMIC] = strdup("SLIMBUS_0_TX");
Divya Narayanan Poojary356e01e2018-02-06 14:25:16 +05301567 hw_interface_table[SND_DEVICE_IN_INCALL_REC_RX] = strdup("INCALL_RECORD_RX");
1568 hw_interface_table[SND_DEVICE_IN_INCALL_REC_TX] = strdup("INCALL_RECORD_TX");
Ramu Gottipati813ae982018-07-25 14:14:48 +05301569 hw_interface_table[SND_DEVICE_IN_LINE] = strdup("SLIMBUS_0_TX");
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301570
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05301571 my_data->max_mic_count = PLATFORM_DEFAULT_MIC_COUNT;
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301572
1573 /*remove ALAC & APE from DSP decoder list based on software decoder availability*/
Alexy Josephb1379942016-01-29 15:49:38 -08001574 for (count = 0; count < (int32_t)(sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]));
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301575 count++) {
1576
1577 if (!strncmp(MEDIA_MIMETYPE_AUDIO_ALAC, dsp_only_decoders_mime[count],
1578 strlen(dsp_only_decoders_mime[count]))) {
1579
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07001580 if(property_get_bool("vendor.audio.use.sw.alac.decoder", false)) {
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301581 ALOGD("Alac software decoder is available...removing alac from DSP decoder list");
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301582 strlcpy(dsp_only_decoders_mime[count],"none",5);
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301583 }
1584 } else if (!strncmp(MEDIA_MIMETYPE_AUDIO_APE, dsp_only_decoders_mime[count],
1585 strlen(dsp_only_decoders_mime[count]))) {
1586
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07001587 if(property_get_bool("vendor.audio.use.sw.ape.decoder", false)) {
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301588 ALOGD("APE software decoder is available...removing ape from DSP decoder list");
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301589 strlcpy(dsp_only_decoders_mime[count],"none",5);
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301590 }
1591 }
1592 }
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001593}
1594
Walter Yang6f800052014-07-14 16:15:38 -07001595void get_cvd_version(char *cvd_version, struct audio_device *adev)
1596{
1597 struct mixer_ctl *ctl;
1598 int count;
1599 int ret = 0;
1600
1601 ctl = mixer_get_ctl_by_name(adev->mixer, CVD_VERSION_MIXER_CTL);
1602 if (!ctl) {
1603 ALOGE("%s: Could not get ctl for mixer cmd - %s", __func__, CVD_VERSION_MIXER_CTL);
1604 goto done;
1605 }
1606 mixer_ctl_update(ctl);
1607
1608 count = mixer_ctl_get_num_values(ctl);
1609 if (count > MAX_CVD_VERSION_STRING_SIZE)
1610 count = MAX_CVD_VERSION_STRING_SIZE;
1611
1612 ret = mixer_ctl_get_array(ctl, cvd_version, count);
1613 if (ret != 0) {
1614 ALOGE("%s: ERROR! mixer_ctl_get_array() failed to get CVD Version", __func__);
1615 goto done;
1616 }
1617
1618done:
1619 return;
1620}
1621
Anish Kumar55e6df22014-08-26 17:38:05 -07001622static int hw_util_open(int card_no)
1623{
1624 int fd = -1;
1625 char dev_name[256];
1626
1627 snprintf(dev_name, sizeof(dev_name), "/dev/snd/hwC%uD%u",
1628 card_no, WCD9XXX_CODEC_HWDEP_NODE);
1629 ALOGD("%s Opening device %s\n", __func__, dev_name);
1630 fd = open(dev_name, O_WRONLY);
1631 if (fd < 0) {
1632 ALOGE("%s: cannot open device '%s'\n", __func__, dev_name);
1633 return fd;
1634 }
1635 ALOGD("%s success", __func__);
1636 return fd;
1637}
1638
1639struct param_data {
1640 int use_case;
1641 int acdb_id;
1642 int get_size;
1643 int buff_size;
1644 int data_size;
1645 void *buff;
1646};
1647
Banajit Goswami20cdd212015-09-11 01:11:30 -07001648static int send_vbat_adc_data_to_acdb(struct platform_data *plat_data, char *cal_type)
1649{
1650 int ret = 0;
1651 struct mixer_ctl *ctl;
1652 uint16_t vbat_adc_data[2];
1653 struct platform_data *my_data = plat_data;
1654 struct audio_device *adev = my_data->adev;
1655
1656 const char *mixer_ctl_name = "Vbat ADC data";
1657
1658 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1659 if (!ctl) {
1660 ALOGE("%s: Could not get ctl for mixer ctl name - %s",
1661 __func__, mixer_ctl_name);
1662 ret = -EINVAL;
1663 goto done;
1664 }
1665
1666 vbat_adc_data[0] = mixer_ctl_get_value(ctl, 0);
1667 vbat_adc_data[1] = mixer_ctl_get_value(ctl, 1);
1668
1669 ALOGD("%s: Vbat ADC output values: Dcp1: %d , Dcp2: %d",
1670 __func__, vbat_adc_data[0], vbat_adc_data[1]);
1671
1672 ret = my_data->acdb_set_codec_data(&vbat_adc_data[0], cal_type);
1673
1674done:
1675 return ret;
1676}
1677
1678static void send_codec_cal(acdb_loader_get_calibration_t acdb_loader_get_calibration,
1679 struct platform_data *plat_data, int fd)
Anish Kumar55e6df22014-08-26 17:38:05 -07001680{
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001681 int type;
Anish Kumar55e6df22014-08-26 17:38:05 -07001682
1683 for (type = WCD9XXX_ANC_CAL; type < WCD9XXX_MAX_CAL; type++) {
1684 struct wcdcal_ioctl_buffer codec_buffer;
1685 struct param_data calib;
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001686 int ret;
Anish Kumar55e6df22014-08-26 17:38:05 -07001687
Bharath Ramachandramurthy63a47ef2015-08-31 17:41:46 -07001688 /* MAD calibration is handled by sound trigger HAL, skip here */
1689 if (type == WCD9XXX_MAD_CAL)
1690 continue;
1691
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001692 ret = 0;
Banajit Goswami20cdd212015-09-11 01:11:30 -07001693
Banajit Goswami4dc87fb2015-10-11 21:46:07 -07001694 if ((plat_data->is_vbat_speaker) && (WCD9XXX_VBAT_CAL == type)) {
Banajit Goswami20cdd212015-09-11 01:11:30 -07001695 ret = send_vbat_adc_data_to_acdb(plat_data, cal_name_info[type]);
1696 if (ret < 0)
1697 ALOGE("%s error in sending vbat adc data to acdb", __func__);
1698 }
1699
Anish Kumar55e6df22014-08-26 17:38:05 -07001700 calib.get_size = 1;
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001701 ret = acdb_loader_get_calibration(cal_name_info[type],
1702 sizeof(struct param_data),
1703 &calib);
Anish Kumar55e6df22014-08-26 17:38:05 -07001704 if (ret < 0) {
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001705 ALOGE("%s: %s get_calibration size failed, err = %d\n",
1706 __func__, cal_name_info[type], ret);
1707 continue;
Anish Kumar55e6df22014-08-26 17:38:05 -07001708 }
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001709
Anish Kumar55e6df22014-08-26 17:38:05 -07001710 calib.get_size = 0;
1711 calib.buff = malloc(calib.buff_size);
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001712 if (!calib.buff) {
1713 ALOGE("%s: %s: No Memory for size = %d\n",
1714 __func__, cal_name_info[type], calib.buff_size);
1715 continue;
1716 }
1717
Anish Kumar55e6df22014-08-26 17:38:05 -07001718 ret = acdb_loader_get_calibration(cal_name_info[type],
1719 sizeof(struct param_data), &calib);
1720 if (ret < 0) {
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001721 ALOGE("%s: %s get_calibration failed, err = %d\n",
1722 __func__, cal_name_info[type], ret);
Anish Kumar55e6df22014-08-26 17:38:05 -07001723 free(calib.buff);
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001724 continue;
Anish Kumar55e6df22014-08-26 17:38:05 -07001725 }
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001726
Anish Kumar55e6df22014-08-26 17:38:05 -07001727 codec_buffer.buffer = calib.buff;
1728 codec_buffer.size = calib.data_size;
1729 codec_buffer.cal_type = type;
1730 if (ioctl(fd, SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE, &codec_buffer) < 0)
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001731 ALOGE("%s: %s Failed to call ioctl, err=%d",
1732 __func__, cal_name_info[type], errno);
1733 else
1734 ALOGD("%s: %s cal sent successfully\n",
1735 __func__, cal_name_info[type]);
1736
Anish Kumar55e6df22014-08-26 17:38:05 -07001737 free(calib.buff);
1738 }
Anish Kumar55e6df22014-08-26 17:38:05 -07001739}
1740
1741static void audio_hwdep_send_cal(struct platform_data *plat_data)
1742{
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301743 int fd = plat_data->hw_dep_fd;
Anish Kumar55e6df22014-08-26 17:38:05 -07001744
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301745 if (fd < 0)
1746 fd = hw_util_open(plat_data->adev->snd_card);
Anish Kumar55e6df22014-08-26 17:38:05 -07001747 if (fd == -1) {
1748 ALOGE("%s error open\n", __func__);
1749 return;
1750 }
1751
1752 acdb_loader_get_calibration = (acdb_loader_get_calibration_t)
1753 dlsym(plat_data->acdb_handle, "acdb_loader_get_calibration");
1754
1755 if (acdb_loader_get_calibration == NULL) {
1756 ALOGE("%s: ERROR. dlsym Error:%s acdb_loader_get_calibration", __func__,
1757 dlerror());
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301758 if (fd >= 0) {
1759 close(fd);
1760 plat_data->hw_dep_fd = -1;
1761 }
Anish Kumar55e6df22014-08-26 17:38:05 -07001762 return;
1763 }
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001764
Banajit Goswami20cdd212015-09-11 01:11:30 -07001765 send_codec_cal(acdb_loader_get_calibration, plat_data, fd);
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301766 plat_data->hw_dep_fd = fd;
Anish Kumar55e6df22014-08-26 17:38:05 -07001767}
1768
Aditya Bavanari71b6d532018-01-16 17:48:08 +05301769const char * platform_get_snd_card_name_for_acdb_loader(const char *snd_card_name) {
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05301770
1771 if(snd_card_name == NULL)
1772 return NULL;
1773
1774 if(!strncmp(snd_card_name, "sdm660-tashalite-snd-card",
1775 sizeof("sdm660-tashalite-snd-card"))) {
1776 ALOGD("using tasha ACDB files for tasha-lite");
1777 return "sdm660-tasha-snd-card";
1778 }
Sharad Sangled39232d2017-08-08 20:27:18 +05301779 if(!strncmp(snd_card_name, "sdm670-tashalite-snd-card",
1780 sizeof("sdm670-tashalite-snd-card"))) {
1781 ALOGD("using tasha ACDB files for tasha-lite");
1782 return "sdm670-tasha-snd-card";
1783 }
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05301784 return snd_card_name;
1785}
1786
Ben Rombergerfeca4b82015-07-07 20:40:44 -07001787static int platform_acdb_init(void *platform)
Ramjee Singh203473b2015-06-09 15:18:42 +05301788{
1789 struct platform_data *my_data = (struct platform_data *)platform;
1790 char *cvd_version = NULL;
Ramjee Singh203473b2015-06-09 15:18:42 +05301791 const char *snd_card_name;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05301792 int result = -1;
1793 struct listnode *node;
1794 struct meta_key_list *key_info;
1795 int key = 0;
1796
Ramjee Singh203473b2015-06-09 15:18:42 +05301797 cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301798 if (!cvd_version) {
Ramjee Singh203473b2015-06-09 15:18:42 +05301799 ALOGE("Failed to allocate cvd version");
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301800 return -1;
1801 } else {
Ramjee Singh203473b2015-06-09 15:18:42 +05301802 get_cvd_version(cvd_version, my_data->adev);
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301803 }
Ramjee Singh203473b2015-06-09 15:18:42 +05301804
Ramjee Singh203473b2015-06-09 15:18:42 +05301805 snd_card_name = mixer_get_name(my_data->adev->mixer);
Aditya Bavanari71b6d532018-01-16 17:48:08 +05301806 snd_card_name = platform_get_snd_card_name_for_acdb_loader(snd_card_name);
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05301807
Aditya Bavanari20fd7812017-10-03 20:10:35 +05301808 my_data->acdb_init_data.cvd_version = cvd_version;
1809 my_data->acdb_init_data.snd_card_name = strdup(snd_card_name);
1810 my_data->acdb_init_data.meta_key_list = &my_data->acdb_meta_key_list;
1811 if (my_data->acdb_init_v4) {
1812 result = my_data->acdb_init_v4(&my_data->acdb_init_data, ACDB_LOADER_INIT_V4);
1813 } else if (my_data->acdb_init_v3) {
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05301814 result = my_data->acdb_init_v3(snd_card_name, cvd_version,
1815 &my_data->acdb_meta_key_list);
1816 } else if (my_data->acdb_init) {
1817 node = list_head(&my_data->acdb_meta_key_list);
1818 key_info = node_to_item(node, struct meta_key_list, list);
1819 key = key_info->cal_info.nKey;
1820 result = my_data->acdb_init(snd_card_name, cvd_version, key);
1821 }
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05301822
1823 /* Save these variables in platform_data. These will be used
1824 while reloading ACDB files during run time. */
1825 strlcpy(my_data->cvd_version, cvd_version, MAX_CVD_VERSION_STRING_SIZE);
1826 strlcpy(my_data->snd_card_name, snd_card_name,
1827 MAX_SND_CARD_STRING_SIZE);
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05301828
Ramjee Singh203473b2015-06-09 15:18:42 +05301829 if (cvd_version)
1830 free(cvd_version);
1831 if (!result) {
1832 my_data->is_acdb_initialized = true;
1833 ALOGD("ACDB initialized");
1834 audio_hwdep_send_cal(my_data);
1835 } else {
1836 my_data->is_acdb_initialized = false;
1837 ALOGD("ACDB initialization failed");
1838 }
1839 return result;
1840}
1841
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05301842static void get_source_mic_type(struct platform_data * my_data)
1843{
1844 // support max to mono, example if max count is 3, usecase supports Three, dual and mono mic
1845 switch (my_data->max_mic_count) {
1846 case 4:
1847 my_data->source_mic_type |= SOURCE_QUAD_MIC;
1848 case 3:
1849 my_data->source_mic_type |= SOURCE_THREE_MIC;
1850 case 2:
1851 my_data->source_mic_type |= SOURCE_DUAL_MIC;
1852 case 1:
1853 my_data->source_mic_type |= SOURCE_MONO_MIC;
1854 break;
1855 default:
1856 ALOGE("%s: max_mic_count (%d), is not supported, setting to default",
1857 __func__, my_data->max_mic_count);
1858 my_data->source_mic_type = SOURCE_MONO_MIC | SOURCE_DUAL_MIC;
1859 break;
1860 }
1861}
1862
Siena Richard7c2db772016-12-21 11:32:34 -08001863/*
1864 * Retrieves the be_dai_name_table from kernel to enable a mapping
1865 * between sound device hw interfaces and backend IDs. This allows HAL to
1866 * specify the backend a specific calibration is needed for.
1867 */
1868static int init_be_dai_name_table(struct audio_device *adev)
1869{
1870 const char *mixer_ctl_name = "Backend DAI Name Table";
1871 struct mixer_ctl *ctl;
1872 int i, j, ret, size;
1873 bool valid_hw_interface;
1874
1875 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1876 if (!ctl) {
1877 ALOGE("%s: Could not get ctl for mixer name %s\n",
1878 __func__, mixer_ctl_name);
1879 ret = -EINVAL;
1880 goto done;
1881 }
1882
1883 mixer_ctl_update(ctl);
1884
1885 size = mixer_ctl_get_num_values(ctl);
1886 if (size <= 0){
1887 ALOGE("%s: Failed to get %s size %d\n",
1888 __func__, mixer_ctl_name, size);
1889 ret = -EFAULT;
1890 goto done;
1891 }
1892
1893 be_dai_name_table =
1894 (const struct be_dai_name_struct *)calloc(1, size);
1895 if (be_dai_name_table == NULL) {
1896 ALOGE("%s: Failed to allocate memory for %s\n",
1897 __func__, mixer_ctl_name);
1898 ret = -ENOMEM;
1899 goto freeMem;
1900 }
1901
1902 ret = mixer_ctl_get_array(ctl, (void *)be_dai_name_table, size);
1903 if (ret) {
1904 ALOGE("%s: Failed to get %s, ret %d\n",
1905 __func__, mixer_ctl_name, ret);
1906 ret = -EFAULT;
1907 goto freeMem;
1908 }
1909
1910 if (be_dai_name_table != NULL) {
1911 max_be_dai_names = size / sizeof(struct be_dai_name_struct);
1912 ALOGV("%s: Successfully got %s, number of be dais is %d\n",
1913 __func__, mixer_ctl_name, max_be_dai_names);
1914 ret = 0;
1915 } else {
1916 ALOGE("%s: Failed to get %s\n", __func__, mixer_ctl_name);
1917 ret = -EFAULT;
1918 goto freeMem;
1919 }
1920
1921 /*
1922 * Validate all sound devices have a valid backend set to catch
1923 * errors for uncommon sound devices
1924 */
1925 for (i = 0; i < SND_DEVICE_MAX; i++) {
1926 valid_hw_interface = false;
1927
1928 if (hw_interface_table[i] == NULL) {
1929 ALOGW("%s: sound device %s has no hw interface set\n",
1930 __func__, platform_get_snd_device_name(i));
1931 continue;
1932 }
1933
1934 for (j = 0; j < max_be_dai_names; j++) {
1935 if (strcmp(hw_interface_table[i], be_dai_name_table[j].be_name)
1936 == 0) {
1937 valid_hw_interface = true;
1938 break;
1939 }
1940 }
1941 if (!valid_hw_interface)
1942 ALOGD("%s: sound device %s does not have a valid hw interface set (disregard for combo devices) %s\n",
1943 __func__, platform_get_snd_device_name(i), hw_interface_table[i]);
1944 }
1945
1946 goto done;
1947
1948freeMem:
1949 if (be_dai_name_table) {
1950 free((void *)be_dai_name_table);
1951 be_dai_name_table = NULL;
1952 }
1953
1954done:
1955 return ret;
1956}
1957
Eric Laurentb23d5282013-05-14 15:27:20 -07001958void *platform_init(struct audio_device *adev)
1959{
Vidyakumar Athota77327dd2014-08-07 16:44:25 -07001960 char platform[PROPERTY_VALUE_MAX];
1961 char baseband[PROPERTY_VALUE_MAX];
Eric Laurentb23d5282013-05-14 15:27:20 -07001962 char value[PROPERTY_VALUE_MAX];
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08001963 struct platform_data *my_data = NULL;
Alexy Josephb1379942016-01-29 15:49:38 -08001964 char *snd_card_name = NULL, *snd_card_name_t = NULL;
Apoorv Raghuvanshia433fb52015-03-16 15:22:30 -07001965 char *snd_internal_name = NULL;
1966 char *tmp = NULL;
1967 char mixer_xml_file[MIXER_PATH_MAX_LENGTH]= {0};
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08001968 int idx;
`Deeraj Soman676c2702017-09-18 19:25:53 +05301969 struct mixer_ctl *ctl = NULL;
1970 const char *id_string = NULL;
1971 int cfg_value = -1;
sangwoo1b9f4b32013-06-21 18:22:55 -07001972
Soumya Managolid4a9c962018-04-06 16:21:50 +05301973 adev->snd_card = audio_extn_utils_open_snd_mixer(&adev->mixer);
Vignesh Kulothungan55396882017-04-20 14:37:02 -07001974 if (adev->snd_card < 0) {
1975 ALOGE("%s: Unable to find correct sound card", __func__);
1976 return NULL;
1977 }
1978 ALOGD("%s: Opened sound card:%d", __func__, adev->snd_card);
Eric Laurentb23d5282013-05-14 15:27:20 -07001979
Vignesh Kulothungan55396882017-04-20 14:37:02 -07001980 snd_card_name = strdup(mixer_get_name(adev->mixer));
1981 if (!snd_card_name) {
1982 ALOGE("failed to allocate memory for snd_card_name\n");
Soumya Managolid4a9c962018-04-06 16:21:50 +05301983 audio_extn_utils_close_snd_mixer(adev->mixer);
Vignesh Kulothungan55396882017-04-20 14:37:02 -07001984 return NULL;
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08001985 }
1986
Vignesh Kulothungan55396882017-04-20 14:37:02 -07001987 my_data = calloc(1, sizeof(struct platform_data));
1988 if (!my_data) {
1989 ALOGE("failed to allocate platform data");
1990 if (snd_card_name)
1991 free(snd_card_name);
Soumya Managolid4a9c962018-04-06 16:21:50 +05301992 audio_extn_utils_close_snd_mixer(adev->mixer);
Vignesh Kulothungan55396882017-04-20 14:37:02 -07001993 return NULL;
1994 }
1995
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05301996 my_data->is_slimbus_interface = true;
1997 my_data->is_internal_codec = false;
1998
Vignesh Kulothungan55396882017-04-20 14:37:02 -07001999 my_data->hw_info = hw_info_init(snd_card_name);
2000 if (!my_data->hw_info) {
2001 ALOGE("failed to init hw_info");
Soumya Managolid4a9c962018-04-06 16:21:50 +05302002 audio_extn_utils_close_snd_mixer(adev->mixer);
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002003 if (my_data)
2004 free(my_data);
2005
2006 if (snd_card_name)
2007 free(snd_card_name);
2008 return NULL;
2009 }
2010
2011 if (platform_is_i2s_ext_modem(snd_card_name, my_data)) {
2012 ALOGD("%s: Call MIXER_XML_PATH_I2S", __func__);
2013
2014 adev->audio_route = audio_route_init(adev->snd_card,
2015 MIXER_XML_PATH_I2S);
2016 } else {
2017 /* Get the codec internal name from the sound card name
2018 * and form the mixer paths file name dynamically. This
2019 * is generic way of picking any codec name based mixer
2020 * files in future with no code change. This code
2021 * assumes mixer files are formed with format as
2022 * mixer_paths_internalcodecname.xml
2023
2024 * If this dynamically read mixer files fails to open then it
2025 * falls back to default mixer file i.e mixer_paths.xml. This is
2026 * done to preserve backward compatibility but not mandatory as
2027 * long as the mixer files are named as per above assumption.
2028 */
2029 snd_card_name_t = strdup(snd_card_name);
2030 snd_internal_name = strtok_r(snd_card_name_t, "-", &tmp);
2031
2032 if (snd_internal_name != NULL) {
2033 snd_internal_name = strtok_r(NULL, "-", &tmp);
2034 }
2035 if (snd_internal_name != NULL) {
2036 strlcpy(mixer_xml_file, MIXER_XML_BASE_STRING,
2037 MIXER_PATH_MAX_LENGTH);
2038 strlcat(mixer_xml_file, MIXER_FILE_DELIMITER,
2039 MIXER_PATH_MAX_LENGTH);
2040 strlcat(mixer_xml_file, snd_internal_name,
2041 MIXER_PATH_MAX_LENGTH);
2042 strlcat(mixer_xml_file, MIXER_FILE_EXT,
2043 MIXER_PATH_MAX_LENGTH);
2044 } else {
2045 strlcpy(mixer_xml_file, MIXER_XML_DEFAULT_PATH,
2046 MIXER_PATH_MAX_LENGTH);
2047 }
2048
2049 if (F_OK == access(mixer_xml_file, 0)) {
2050 ALOGD("%s: Loading mixer file: %s", __func__, mixer_xml_file);
2051 if (audio_extn_read_xml(adev, adev->snd_card, mixer_xml_file,
2052 MIXER_XML_PATH_AUXPCM) == -ENOSYS)
2053 adev->audio_route = audio_route_init(adev->snd_card,
2054 mixer_xml_file);
Sharad Sangle999cf722017-10-18 18:25:47 +05302055 update_codec_type_and_interface(my_data, snd_card_name);
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002056 } else {
2057 ALOGD("%s: Loading default mixer file", __func__);
2058 if (audio_extn_read_xml(adev, adev->snd_card, MIXER_XML_DEFAULT_PATH,
2059 MIXER_XML_PATH_AUXPCM) == -ENOSYS)
2060 adev->audio_route = audio_route_init(adev->snd_card,
2061 MIXER_XML_DEFAULT_PATH);
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05302062 update_codec_type_and_interface(my_data, snd_card_name);
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002063 }
2064 }
2065 if (!adev->audio_route) {
2066 ALOGE("%s: Failed to init audio route controls, aborting.",
2067 __func__);
Alexy Josephb1379942016-01-29 15:49:38 -08002068 if (my_data)
2069 free(my_data);
Ravi Kumar Alamanda31c90df2015-10-16 10:06:59 -07002070 if (snd_card_name)
2071 free(snd_card_name);
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302072 if (snd_card_name_t)
2073 free(snd_card_name_t);
Soumya Managolid4a9c962018-04-06 16:21:50 +05302074 audio_extn_utils_close_snd_mixer(adev->mixer);
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08002075 return NULL;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -07002076 }
2077
Aalique Grahame37659862017-12-03 22:34:26 -08002078 adev->dp_allowed_for_voice =
2079 property_get_bool("vendor.audio.enable.dp.for.voice", false);
2080
Eric Laurentb23d5282013-05-14 15:27:20 -07002081 my_data->adev = adev;
Eric Laurentb23d5282013-05-14 15:27:20 -07002082 my_data->fluence_in_spkr_mode = false;
2083 my_data->fluence_in_voice_call = false;
2084 my_data->fluence_in_voice_rec = false;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08002085 my_data->fluence_in_audio_rec = false;
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302086 my_data->fluence_in_hfp_call = false;
Tanya Finkel00130052014-07-14 04:26:56 -07002087 my_data->external_spk_1 = false;
2088 my_data->external_spk_2 = false;
2089 my_data->external_mic = false;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07002090 my_data->fluence_type = FLUENCE_NONE;
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -08002091 my_data->fluence_mode = FLUENCE_ENDFIRE;
Sachin Mohan Gadagbe2054d2018-01-29 16:05:05 +05302092 my_data->ambisonic_capture = false;
2093 my_data->ambisonic_profile = false;
Avinash Vaishd5fa4572014-09-15 14:41:14 +05302094 my_data->slowtalk = false;
2095 my_data->hd_voice = false;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07002096 my_data->edid_info = NULL;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07002097 my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05302098 my_data->hw_dep_fd = -1;
Rohit kumarf4120402016-08-05 19:19:48 +05302099 my_data->mono_speaker = SPKR_1;
Aalique Grahame5f596f32018-01-09 12:56:35 -08002100 my_data->speaker_lr_swap = false;
Surendar Karka45850ae2018-07-02 17:45:27 +05302101 my_data->spkr_ch_map = NULL;
Dieter Luecking5d57def2018-09-07 14:23:37 +02002102 my_data->use_sprk_default_sample_rate = true;
Siena Richard7c2db772016-12-21 11:32:34 -08002103 be_dai_name_table = NULL;
2104
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002105 property_get("ro.vendor.audio.sdk.fluencetype", my_data->fluence_cap, "");
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05302106 if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08002107 my_data->fluence_type = FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC;
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05302108
2109 if (property_get_bool("persist.vendor.audio.fluence.tmic.enabled",false)) {
2110 my_data->fluence_type |= FLUENCE_TRI_MIC;
2111 }
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05302112 } else if (!strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) {
Mingming Yin8e5a4f62013-10-07 15:23:41 -07002113 my_data->fluence_type = FLUENCE_DUAL_MIC;
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05302114
2115 if (property_get_bool("persist.vendor.audio.fluence.tmic.enabled",false)) {
2116 my_data->fluence_type |= FLUENCE_TRI_MIC;
2117 }
Mingming Yin8e5a4f62013-10-07 15:23:41 -07002118 } else {
2119 my_data->fluence_type = FLUENCE_NONE;
Eric Laurentb23d5282013-05-14 15:27:20 -07002120 }
2121
Mingming Yin8e5a4f62013-10-07 15:23:41 -07002122 if (my_data->fluence_type != FLUENCE_NONE) {
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002123 property_get("persist.vendor.audio.fluence.voicecall",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -07002124 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -07002125 my_data->fluence_in_voice_call = true;
2126 }
2127
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002128 property_get("persist.vendor.audio.fluence.voicerec",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -07002129 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -07002130 my_data->fluence_in_voice_rec = true;
2131 }
2132
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002133 property_get("persist.vendor.audio.fluence.audiorec",value,"");
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08002134 if (!strncmp("true", value, sizeof("true"))) {
2135 my_data->fluence_in_audio_rec = true;
2136 }
2137
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002138 property_get("persist.vendor.audio.fluence.speaker",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -07002139 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -07002140 my_data->fluence_in_spkr_mode = true;
2141 }
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -08002142
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002143 property_get("persist.vendor.audio.fluence.mode",value,"");
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -08002144 if (!strncmp("broadside", value, sizeof("broadside"))) {
2145 my_data->fluence_mode = FLUENCE_BROADSIDE;
2146 }
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302147
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002148 property_get("persist.vendor.audio.fluence.hfpcall",value,"");
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302149 if (!strncmp("true", value, sizeof("true"))) {
2150 my_data->fluence_in_hfp_call = true;
2151 }
Eric Laurentb23d5282013-05-14 15:27:20 -07002152 }
Sachin Mohan Gadagbe2054d2018-01-29 16:05:05 +05302153 /* Check for Ambisonic Capture Enablement */
2154 if (property_get_bool("persist.vendor.audio.ambisonic.capture",false))
2155 my_data->ambisonic_capture = true;
2156
2157 /* Check for Ambisonic Profile Assignment*/
2158 if (property_get_bool("persist.vendor.audio.ambisonic.auto.profile",false))
2159 my_data->ambisonic_profile = true;
Eric Laurentb23d5282013-05-14 15:27:20 -07002160
Banajit Goswami20cdd212015-09-11 01:11:30 -07002161 /* Check if Vbat speaker enabled property is set, this should be done before acdb init */
2162 bool ret = false;
2163 ret = audio_extn_can_use_vbat();
2164 if (ret)
2165 my_data->is_vbat_speaker = true;
2166
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302167 list_init(&my_data->acdb_meta_key_list);
2168
2169 set_platform_defaults(my_data);
2170
2171 /* Initialize ACDB ID's */
2172 if (my_data->is_i2s_ext_modem)
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002173 platform_info_init(PLATFORM_INFO_XML_PATH_I2S, my_data, PLATFORM);
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05302174 else if (!strncmp(snd_card_name, "sdm660-snd-card-skush",
2175 sizeof("sdm660-snd-card-skush")))
2176 platform_info_init(PLATFORM_INFO_XML_PATH_SKUSH, my_data, PLATFORM);
Walter Yang319c6fe2017-09-21 17:09:39 +08002177 else if (!strncmp(snd_card_name, "sdm670-skuw-snd-card",
2178 sizeof("sdm670-skuw-snd-card")))
2179 platform_info_init(PLATFORM_INFO_XML_PATH_SKUW, my_data, PLATFORM);
Ramu Gottipati54ed9482018-08-21 16:00:22 +05302180 else if (!strncmp(snd_card_name, "qcs405-wsa-snd-card",
2181 sizeof("qcs405-wsa-snd-card")))
2182 platform_info_init(PLATFORM_INFO_XML_PATH_WSA, my_data, PLATFORM);
Dhananjay Kumarb34c5c12018-09-25 16:04:26 +05302183 else if (!strncmp(snd_card_name, "qcs405-tdm-snd-card",
2184 sizeof("qcs405-tdm-snd-card")))
2185 platform_info_init(PLATFORM_INFO_XML_PATH_TDM, my_data, PLATFORM);
Walter Yang319c6fe2017-09-21 17:09:39 +08002186 else if (my_data->is_internal_codec)
2187 platform_info_init(PLATFORM_INFO_XML_PATH_INTCODEC, my_data, PLATFORM);
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302188 else
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002189 platform_info_init(PLATFORM_INFO_XML_PATH, my_data, PLATFORM);
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302190
Dieter Luecking5d57def2018-09-07 14:23:37 +02002191 /* CSRA devices support multiple sample rates via I2S at spkr out */
2192 if (!strncmp(snd_card_name, "qcs405-csra", strlen("qcs405-csra"))) {
2193 ALOGE("%s: soundcard: %s supports multiple sample rates", __func__, snd_card_name);
2194 my_data->use_sprk_default_sample_rate = false;
2195 } else {
2196 my_data->use_sprk_default_sample_rate = true;
2197 ALOGE("%s: soundcard: %s supports only default sample rate", __func__, snd_card_name);
2198 }
2199
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08002200 my_data->voice_feature_set = VOICE_FEATURE_SET_DEFAULT;
Eric Laurentb23d5282013-05-14 15:27:20 -07002201 my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
2202 if (my_data->acdb_handle == NULL) {
2203 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
2204 } else {
2205 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
2206 my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle,
2207 "acdb_loader_deallocate_ACDB");
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08002208 if (!my_data->acdb_deallocate)
2209 ALOGE("%s: Could not find the symbol acdb_loader_deallocate_ACDB from %s",
2210 __func__, LIB_ACDB_LOADER);
2211
Eric Laurentb23d5282013-05-14 15:27:20 -07002212 my_data->acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(my_data->acdb_handle,
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07002213 "acdb_loader_send_audio_cal_v2");
Eric Laurentb23d5282013-05-14 15:27:20 -07002214 if (!my_data->acdb_send_audio_cal)
Siena Richard7c2db772016-12-21 11:32:34 -08002215 ALOGE("%s: Could not find the symbol acdb_send_audio_cal_v2 from %s",
2216 __func__, LIB_ACDB_LOADER);
2217
2218 my_data->acdb_send_audio_cal_v3 = (acdb_send_audio_cal_v3_t)dlsym(my_data->acdb_handle,
2219 "acdb_loader_send_audio_cal_v3");
2220 if (!my_data->acdb_send_audio_cal_v3)
2221 ALOGE("%s: Could not find the symbol acdb_send_audio_cal_v3 from %s",
Eric Laurentb23d5282013-05-14 15:27:20 -07002222 __func__, LIB_ACDB_LOADER);
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08002223
Ben Rombergera04fabc2014-11-14 12:16:03 -08002224 my_data->acdb_set_audio_cal = (acdb_set_audio_cal_t)dlsym(my_data->acdb_handle,
2225 "acdb_loader_set_audio_cal_v2");
2226 if (!my_data->acdb_set_audio_cal)
2227 ALOGE("%s: Could not find the symbol acdb_set_audio_cal_v2 from %s",
2228 __func__, LIB_ACDB_LOADER);
2229
2230 my_data->acdb_get_audio_cal = (acdb_get_audio_cal_t)dlsym(my_data->acdb_handle,
2231 "acdb_loader_get_audio_cal_v2");
2232 if (!my_data->acdb_get_audio_cal)
2233 ALOGE("%s: Could not find the symbol acdb_get_audio_cal_v2 from %s",
2234 __func__, LIB_ACDB_LOADER);
2235
Eric Laurentb23d5282013-05-14 15:27:20 -07002236 my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle,
2237 "acdb_loader_send_voice_cal");
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08002238 if (!my_data->acdb_send_voice_cal)
2239 ALOGE("%s: Could not find the symbol acdb_loader_send_voice_cal from %s",
2240 __func__, LIB_ACDB_LOADER);
2241
2242 my_data->acdb_reload_vocvoltable = (acdb_reload_vocvoltable_t)dlsym(my_data->acdb_handle,
2243 "acdb_loader_reload_vocvoltable");
2244 if (!my_data->acdb_reload_vocvoltable)
2245 ALOGE("%s: Could not find the symbol acdb_loader_reload_vocvoltable from %s",
2246 __func__, LIB_ACDB_LOADER);
2247
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07002248 my_data->acdb_get_default_app_type = (acdb_get_default_app_type_t)dlsym(
2249 my_data->acdb_handle,
2250 "acdb_loader_get_default_app_type");
2251 if (!my_data->acdb_get_default_app_type)
2252 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
2253 __func__, LIB_ACDB_LOADER);
2254
vivek mehtaa76401a2015-04-24 14:12:15 -07002255 my_data->acdb_send_gain_dep_cal = (acdb_send_gain_dep_cal_t)dlsym(my_data->acdb_handle,
2256 "acdb_loader_send_gain_dep_cal");
2257 if (!my_data->acdb_send_gain_dep_cal)
2258 ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s",
2259 __func__, LIB_ACDB_LOADER);
2260
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002261 my_data->acdb_send_common_top = (acdb_send_common_top_t)dlsym(
2262 my_data->acdb_handle,
2263 "acdb_loader_send_common_custom_topology");
2264 if (!my_data->acdb_send_common_top)
2265 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
2266 __func__, LIB_ACDB_LOADER);
2267
Banajit Goswami20cdd212015-09-11 01:11:30 -07002268 my_data->acdb_set_codec_data = (acdb_set_codec_data_t)dlsym(
2269 my_data->acdb_handle,
2270 "acdb_loader_set_codec_data");
2271 if (!my_data->acdb_set_codec_data)
2272 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
2273 __func__, LIB_ACDB_LOADER);
2274
2275
Aditya Bavanari20fd7812017-10-03 20:10:35 +05302276 my_data->acdb_init_v4 = (acdb_init_v4_t)dlsym(my_data->acdb_handle,
2277 "acdb_loader_init_v4");
2278 if (my_data->acdb_init_v4 == NULL) {
2279 ALOGE("%s: dlsym error %s for acdb_loader_init_v4", __func__, dlerror());
2280 }
2281
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302282 my_data->acdb_init_v3 = (acdb_init_v3_t)dlsym(my_data->acdb_handle,
2283 "acdb_loader_init_v3");
2284 if (my_data->acdb_init_v3 == NULL) {
2285 ALOGE("%s: dlsym error %s for acdb_loader_init_v3", __func__, dlerror());
2286 }
2287
Eric Laurentb23d5282013-05-14 15:27:20 -07002288 my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302289 "acdb_loader_init_v3");
Walter Yang6f800052014-07-14 16:15:38 -07002290 if (my_data->acdb_init == NULL) {
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302291 ALOGE("%s: dlsym error %s for acdb_loader_init_v3", __func__, dlerror());
Walter Yang6f800052014-07-14 16:15:38 -07002292 goto acdb_init_fail;
2293 }
2294
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302295 my_data->acdb_reload_v2 = (acdb_reload_v2_t)dlsym(my_data->acdb_handle,
2296 "acdb_loader_reload_acdb_files_v2");
2297 if (my_data->acdb_reload_v2 == NULL) {
2298 ALOGE("%s: dlsym error %s for acdb_loader_reload_acdb_files_v2", __func__, dlerror());
2299 }
2300
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05302301 my_data->acdb_reload = (acdb_reload_t)dlsym(my_data->acdb_handle,
2302 "acdb_loader_reload_acdb_files");
2303 if (my_data->acdb_reload == NULL) {
2304 ALOGE("%s: dlsym error %s for acdb_loader_reload_acdb_files", __func__, dlerror());
2305 goto acdb_init_fail;
2306 }
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002307
Soumya Managolid4a9c962018-04-06 16:21:50 +05302308 int result = acdb_init_v2(adev->mixer);
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002309 if (!result) {
2310 my_data->is_acdb_initialized = true;
2311 ALOGD("ACDB initialized");
2312 audio_hwdep_send_cal(my_data);
2313 } else {
2314 my_data->is_acdb_initialized = false;
2315 ALOGD("ACDB initialization failed");
2316 }
Eric Laurentb23d5282013-05-14 15:27:20 -07002317 }
2318
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +05302319#ifdef DYNAMIC_LOG_ENABLED
2320 log_utils_init();
2321#endif
Walter Yang6f800052014-07-14 16:15:38 -07002322acdb_init_fail:
2323
Ben Romberger55886882014-01-10 13:49:02 -08002324
Siena Richard7c2db772016-12-21 11:32:34 -08002325 /*
2326 * Get the be_dai_name_table from kernel which provides a mapping
2327 * between a backend string name and a backend ID
2328 */
2329 init_be_dai_name_table(adev);
2330
Srinivas Julakanti1ca769a2017-01-04 23:18:08 -08002331 if (audio_extn_can_use_ras()) {
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002332 if (property_get_bool("persist.vendor.audio.speaker.prot.enable", false)) {
Srinivas Julakanti1ca769a2017-01-04 23:18:08 -08002333 platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED,
2334 acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS]);
2335 platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
2336 acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS]);
2337 } else {
2338 ALOGD("%s: RAS Feature should be enabled with Speaker Protection", __func__);
2339 }
2340 }
2341
Vidyakumar Athota77327dd2014-08-07 16:44:25 -07002342 /* If platform is apq8084 and baseband is MDM, load CSD Client specific
2343 * symbols. Voice call is handled by MDM and apps processor talks to
2344 * MDM through CSD Client
2345 */
2346 property_get("ro.board.platform", platform, "");
2347 property_get("ro.baseband", baseband, "");
Josh Kirschc3894372016-03-28 15:59:48 -07002348 if ((!strncmp("apq8084", platform, sizeof("apq8084")) ||
Xiaoyu Yec494c752017-11-02 18:52:48 -07002349 !strncmp("msm8996", platform, sizeof("msm8996")) ||
Josh Kirschf20adbf2018-03-06 16:26:22 -08002350 !strncmp("sdx", platform, sizeof("sdx")) ||
2351 !strncmp("sdm845", platform, sizeof("sdm845"))) &&
2352 ( !strncmp("mdm", baseband, (sizeof("mdm")-1)) ||
2353 !strncmp("sdx", baseband, (sizeof("sdx")-1)))) {
Vidyakumar Athota77327dd2014-08-07 16:44:25 -07002354 my_data->csd = open_csd_client(my_data->is_i2s_ext_modem);
2355 } else {
2356 my_data->csd = NULL;
2357 }
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002358
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302359 /* obtain source mic type from max mic count*/
2360 get_source_mic_type(my_data);
2361 ALOGD("%s: Fluence_Type(%d) max_mic_count(%d) mic_type(0x%x) fluence_in_voice_call(%d)"
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302362 " fluence_in_voice_rec(%d) fluence_in_spkr_mode(%d) fluence_in_hfp_call(%d) ",
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302363 __func__, my_data->fluence_type, my_data->max_mic_count, my_data->source_mic_type,
2364 my_data->fluence_in_voice_call, my_data->fluence_in_voice_rec,
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302365 my_data->fluence_in_spkr_mode, my_data->fluence_in_hfp_call);
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302366
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07002367 /* init usb */
2368 audio_extn_usb_init(adev);
2369
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302370 /*init a2dp*/
2371 audio_extn_a2dp_init(adev);
2372
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07002373 /* init dap hal */
2374 audio_extn_dap_hal_init(adev->snd_card);
2375
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07002376 /* Read one time ssr property */
Mingming Yin49be8032013-12-19 12:51:25 -08002377 audio_extn_ssr_update_enabled();
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -07002378 audio_extn_spkr_prot_init(adev);
Dhananjay Kumar89ea3bd2014-04-29 15:45:57 +05302379
Dhananjay Kumar89ea3bd2014-04-29 15:45:57 +05302380
Lior Barenboim0b61bc72014-05-13 13:01:37 +03002381 /* init audio device arbitration */
2382 audio_extn_dev_arbi_init();
2383
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05302384 default_rx_backend = strdup("SLIMBUS_0_RX");
2385
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08002386 /* initialize backend config */
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002387 for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
2388 my_data->current_backend_cfg[idx].sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
2389 if (idx == HEADPHONE_44_1_BACKEND)
2390 my_data->current_backend_cfg[idx].sample_rate = OUTPUT_SAMPLING_RATE_44100;
2391 my_data->current_backend_cfg[idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Ashish Jainb26edfb2016-08-25 00:10:11 +05302392 my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
Kuirong Wang0b947f72016-09-29 11:03:09 -07002393 if (idx > MAX_RX_CODEC_BACKENDS)
2394 my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05302395 my_data->current_backend_cfg[idx].format = AUDIO_FORMAT_PCM;
Ashish Jainb26edfb2016-08-25 00:10:11 +05302396 my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
2397 my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
2398 my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08002399 }
2400
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002401 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
2402 strdup("SLIM_0_RX Format");
2403 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
2404 strdup("SLIM_0_RX SampleRate");
2405
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05302406 my_data->current_backend_cfg[DSD_NATIVE_BACKEND].bitwidth_mixer_ctl =
2407 strdup("SLIM_2_RX Format");
2408 my_data->current_backend_cfg[DSD_NATIVE_BACKEND].samplerate_mixer_ctl =
2409 strdup("SLIM_2_RX SampleRate");
2410
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002411 my_data->current_backend_cfg[HEADPHONE_44_1_BACKEND].bitwidth_mixer_ctl =
2412 strdup("SLIM_5_RX Format");
2413 my_data->current_backend_cfg[HEADPHONE_44_1_BACKEND].samplerate_mixer_ctl =
2414 strdup("SLIM_5_RX SampleRate");
2415
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05302416 if (!my_data->is_slimbus_interface) {
Sharad Sangled39232d2017-08-08 20:27:18 +05302417 if (!strncmp(snd_card_name, "sdm660", strlen("sdm660")) ||
Sachin Mohan Gadageffd7562018-02-13 17:10:09 +05302418 !strncmp(snd_card_name, "sdm670", strlen("sdm670")) ||
2419 !strncmp(snd_card_name, "qcs605", strlen("qcs605"))) {
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05302420
2421 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
2422 strdup("INT4_MI2S_RX Format");
2423 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
2424 strdup("INT4_MI2S_RX SampleRate");
2425
2426 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
2427 strdup("INT3_MI2S_TX Format");
2428 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
2429 strdup("INT3_MI2S_TX SampleRate");
2430
2431 if (default_rx_backend)
2432 free(default_rx_backend);
2433 default_rx_backend = strdup("INT4_MI2S_RX");
2434
2435 } else {
2436 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
2437 strdup("MI2S_RX Format");
2438 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
2439 strdup("MI2S_RX SampleRate");
2440 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].channels_mixer_ctl =
2441 strdup("MI2S_RX Channels");
2442
2443 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
2444 strdup("MI2S_TX Format");
2445 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
2446 strdup("MI2S_TX SampleRate");
2447 }
2448 my_data->current_backend_cfg[HEADPHONE_BACKEND].bitwidth_mixer_ctl =
2449 strdup("INT0_MI2S_RX Format");
2450 my_data->current_backend_cfg[HEADPHONE_BACKEND].samplerate_mixer_ctl =
2451 strdup("INT0_MI2S_RX SampleRate");
2452
Revathi Uddaraju75843112017-11-30 14:30:47 +05302453 } else {
Dhananjay Kumar75c9a0c2018-06-07 15:59:00 +05302454 if (!strncmp(snd_card_name, "qcs405", strlen("qcs405"))) {
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05302455
Dieter Luecking5d57def2018-09-07 14:23:37 +02002456 if (!strncmp(snd_card_name, "qcs405-csra", strlen("qcs405-csra"))) {
2457 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
2458 strdup("PRIM_MI2S_RX Format");
2459 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
2460 strdup("PRIM_MI2S_RX SampleRate");
2461 } else {
2462 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
2463 strdup("WSA_CDC_DMA_RX_0 Format");
2464 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
2465 strdup("WSA_CDC_DMA_RX_0 SampleRate");
2466 }
Dhananjay Kumar75c9a0c2018-06-07 15:59:00 +05302467 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
2468 strdup("VA_CDC_DMA_TX_0 Format");
2469 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
2470 strdup("VA_CDC_DMA_TX_0 SampleRate");
2471 } else {
2472 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
2473 strdup("SLIM_0_TX Format");
2474 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
2475 strdup("SLIM_0_TX SampleRate");
2476 }
Revathi Uddaraju75843112017-11-30 14:30:47 +05302477 my_data->current_backend_cfg[HEADPHONE_BACKEND].bitwidth_mixer_ctl =
2478 strdup("SLIM_6_RX Format");
2479 my_data->current_backend_cfg[HEADPHONE_BACKEND].samplerate_mixer_ctl =
2480 strdup("SLIM_6_RX SampleRate");
2481 }
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05302482
Kuirong Wang0b947f72016-09-29 11:03:09 -07002483 my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
Kuirong Wange9894162016-08-26 15:16:39 -07002484 strdup("USB_AUDIO_TX Format");
Kuirong Wang0b947f72016-09-29 11:03:09 -07002485 my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
Kuirong Wange9894162016-08-26 15:16:39 -07002486 strdup("USB_AUDIO_TX SampleRate");
Kuirong Wang0b947f72016-09-29 11:03:09 -07002487 my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
2488 strdup("USB_AUDIO_TX Channels");
Kuirong Wange9894162016-08-26 15:16:39 -07002489
Ralf Herzafb164f2018-07-03 07:08:07 +02002490 if (!strncmp(platform_get_snd_device_backend_interface(SND_DEVICE_IN_HDMI_MIC),
2491 "SEC_MI2S_TX", sizeof("SEC_MI2S_TX"))) {
2492 my_data->current_backend_cfg[HDMI_TX_BACKEND].bitwidth_mixer_ctl =
2493 strdup("SEC_MI2S_TX Format");
2494 my_data->current_backend_cfg[HDMI_TX_BACKEND].samplerate_mixer_ctl =
2495 strdup("SEC_MI2S_TX SampleRate");
2496 my_data->current_backend_cfg[HDMI_TX_BACKEND].channels_mixer_ctl =
2497 strdup("SEC_MI2S_TX Channels");
2498 } else {
2499 my_data->current_backend_cfg[HDMI_TX_BACKEND].bitwidth_mixer_ctl =
2500 strdup("QUAT_MI2S_TX Format");
2501 my_data->current_backend_cfg[HDMI_TX_BACKEND].samplerate_mixer_ctl =
2502 strdup("QUAT_MI2S_TX SampleRate");
2503 my_data->current_backend_cfg[HDMI_TX_BACKEND].channels_mixer_ctl =
2504 strdup("QUAT_MI2S_TX Channels");
2505 }
2506
2507 my_data->current_backend_cfg[SPDIF_TX_BACKEND].bitwidth_mixer_ctl =
2508 strdup("PRIM_SPDIF_TX Format");
2509 my_data->current_backend_cfg[SPDIF_TX_BACKEND].samplerate_mixer_ctl =
2510 strdup("PRIM_SPDIF_TX SampleRate");
2511 my_data->current_backend_cfg[SPDIF_TX_BACKEND].channels_mixer_ctl =
2512 strdup("PRIM_SPDIF_TX Channels");
2513
2514 my_data->current_backend_cfg[HDMI_ARC_TX_BACKEND].bitwidth_mixer_ctl =
2515 strdup("SEC_SPDIF_TX Format");
2516 my_data->current_backend_cfg[HDMI_ARC_TX_BACKEND].samplerate_mixer_ctl =
2517 strdup("SEC_SPDIF_TX SampleRate");
2518 my_data->current_backend_cfg[HDMI_ARC_TX_BACKEND].channels_mixer_ctl =
2519 strdup("SEC_SPDIF_TX Channels");
Siddartha Shaik44dd7702017-06-14 12:13:25 +05302520
`Deeraj Soman676c2702017-09-18 19:25:53 +05302521 for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
2522 if (my_data->current_backend_cfg[idx].bitwidth_mixer_ctl) {
2523 ctl = mixer_get_ctl_by_name(adev->mixer,
2524 my_data->current_backend_cfg[idx].bitwidth_mixer_ctl);
2525 id_string = platform_get_mixer_control(ctl);
2526 if (id_string) {
2527 cfg_value = audio_extn_utils_get_bit_width_from_string(id_string);
2528 if (cfg_value > 0)
2529 my_data->current_backend_cfg[idx].bit_width = cfg_value;
2530 }
2531 }
2532
2533 if (my_data->current_backend_cfg[idx].samplerate_mixer_ctl) {
2534 ctl = mixer_get_ctl_by_name(adev->mixer,
2535 my_data->current_backend_cfg[idx].samplerate_mixer_ctl);
2536 id_string = platform_get_mixer_control(ctl);
2537 if (id_string) {
2538 cfg_value = audio_extn_utils_get_sample_rate_from_string(id_string);
2539 if (cfg_value > 0)
2540 my_data->current_backend_cfg[idx].sample_rate = cfg_value;
2541 }
2542 }
2543
2544 if (my_data->current_backend_cfg[idx].channels_mixer_ctl) {
2545 ctl = mixer_get_ctl_by_name(adev->mixer,
2546 my_data->current_backend_cfg[idx].channels_mixer_ctl);
2547 id_string = platform_get_mixer_control(ctl);
2548 if (id_string) {
2549 cfg_value = audio_extn_utils_get_channels_from_string(id_string);
2550 if (cfg_value > 0)
2551 my_data->current_backend_cfg[idx].channels = cfg_value;
2552 }
2553 }
2554 }
2555
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302556 ret = audio_extn_utils_get_codec_version(snd_card_name,
2557 my_data->adev->snd_card,
2558 my_data->codec_version);
2559
2560 if (NATIVE_AUDIO_MODE_INVALID != platform_get_native_support()) {
2561 /*
2562 * Native playback is enabled from the UI.
2563 */
2564 if(strstr(snd_card_name, "tasha")) {
2565 if (strstr(my_data->codec_version, "WCD9335_1_0") ||
2566 strstr(my_data->codec_version, "WCD9335_1_1")) {
2567 ALOGD("%s:napb: TASHA 1.0 or 1.1 only SRC mode is supported",
2568 __func__);
2569 platform_set_native_support(NATIVE_AUDIO_MODE_SRC);
2570 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302571 }
Ashish Jain4826f6c2017-02-06 13:33:20 +05302572 if (strstr(snd_card_name, "tavil")) {
2573 ALOGD("%s:DSD playback is supported", __func__);
2574 my_data->is_dsd_supported = true;
2575 my_data->is_asrc_supported = true;
2576 platform_set_native_support(NATIVE_AUDIO_MODE_MULTIPLE_44_1);
2577 }
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05302578 }
2579
Mingming Yinddd610b2016-01-20 17:09:32 -08002580 my_data->current_backend_cfg[HDMI_RX_BACKEND].bitwidth_mixer_ctl =
2581 strdup("HDMI_RX Bit Format");
2582 my_data->current_backend_cfg[HDMI_RX_BACKEND].samplerate_mixer_ctl =
2583 strdup("HDMI_RX SampleRate");
Ashish Jaind84fd6a2016-07-27 12:33:25 +05302584 my_data->current_backend_cfg[HDMI_RX_BACKEND].channels_mixer_ctl =
2585 strdup("HDMI_RX Channels");
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07002586 my_data->current_backend_cfg[DISP_PORT_RX_BACKEND].bitwidth_mixer_ctl =
2587 strdup("Display Port RX Bit Format");
2588 my_data->current_backend_cfg[DISP_PORT_RX_BACKEND].samplerate_mixer_ctl =
2589 strdup("Display Port RX SampleRate");
2590 my_data->current_backend_cfg[DISP_PORT_RX_BACKEND].channels_mixer_ctl =
2591 strdup("Display Port RX Channels");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302592
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08002593 my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].bitwidth_mixer_ctl =
2594 strdup("USB_AUDIO_RX Format");
2595 my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].samplerate_mixer_ctl =
2596 strdup("USB_AUDIO_RX SampleRate");
Ashish Jainb26edfb2016-08-25 00:10:11 +05302597 my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].channels_mixer_ctl =
2598 strdup("USB_AUDIO_RX Channels");
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08002599
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +05302600 if (property_get_bool("vendor.audio.apptype.multirec.enabled", false))
2601 my_data->use_generic_handset = true;
2602
Md Mansoor Ahmeddb1b4f92018-01-25 18:56:31 +05302603 /* Initialize keep alive for HDMI/loopback silence */
2604 audio_extn_keep_alive_init(adev);
2605
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07002606 my_data->edid_info = NULL;
Sudheer Papothi4e0ea9a2015-09-30 06:57:51 +05302607 free(snd_card_name);
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302608 free(snd_card_name_t);
Eric Laurentb23d5282013-05-14 15:27:20 -07002609 return my_data;
2610}
2611
Ramu Gottipati62f6d9b2018-05-01 15:21:38 +05302612void platform_release_acdb_metainfo_key(void *platform)
2613{
2614 struct platform_data *my_data = (struct platform_data *)platform;
2615 struct listnode *node, *tempnode;
2616
2617 list_for_each_safe(node, tempnode, &my_data->acdb_meta_key_list) {
2618 list_remove(node);
2619 free(node_to_item(node, struct meta_key_list, list));
2620 }
2621}
2622
Eric Laurentb23d5282013-05-14 15:27:20 -07002623void platform_deinit(void *platform)
2624{
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -07002625 struct platform_data *my_data = (struct platform_data *)platform;
2626
Md Mansoor Ahmeddb1b4f92018-01-25 18:56:31 +05302627 audio_extn_keep_alive_deinit();
2628
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07002629 if (my_data->edid_info) {
2630 free(my_data->edid_info);
2631 my_data->edid_info = NULL;
2632 }
2633
Siena Richard7c2db772016-12-21 11:32:34 -08002634 if (be_dai_name_table) {
2635 free((void *)be_dai_name_table);
2636 be_dai_name_table = NULL;
2637 }
2638
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05302639 if (my_data->hw_dep_fd >= 0) {
2640 close(my_data->hw_dep_fd);
2641 my_data->hw_dep_fd = -1;
2642 }
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05302643 if (default_rx_backend)
2644 free(default_rx_backend);
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05302645
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -07002646 hw_info_deinit(my_data->hw_info);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002647 close_csd_client(my_data->csd);
2648
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002649 int32_t dev;
2650 for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302651 if (backend_tag_table[dev]) {
2652 free(backend_tag_table[dev]);
2653 backend_tag_table[dev]= NULL;
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002654 }
2655 }
2656
Lior Barenboim0b61bc72014-05-13 13:01:37 +03002657 /* deinit audio device arbitration */
2658 audio_extn_dev_arbi_deinit();
2659
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07002660 if (my_data->edid_info) {
2661 free(my_data->edid_info);
2662 my_data->edid_info = NULL;
2663 }
2664
Dhananjay Kumara5ba5f22016-11-30 16:01:29 +05302665 if (my_data->adev->mixer) {
Soumya Managolid4a9c962018-04-06 16:21:50 +05302666 audio_extn_utils_close_snd_mixer(my_data->adev->mixer);
Dhananjay Kumara5ba5f22016-11-30 16:01:29 +05302667 my_data->adev->mixer = NULL;
2668 }
2669
Surendar Karka45850ae2018-07-02 17:45:27 +05302670 if (my_data->spkr_ch_map) {
2671 free(my_data->spkr_ch_map);
2672 my_data->spkr_ch_map = NULL;
2673 }
2674
Ramu Gottipati62f6d9b2018-05-01 15:21:38 +05302675 int32_t idx;
2676
2677 for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
2678 if (my_data->current_backend_cfg[idx].bitwidth_mixer_ctl) {
2679 free(my_data->current_backend_cfg[idx].bitwidth_mixer_ctl);
2680 my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
2681 }
2682
2683 if (my_data->current_backend_cfg[idx].samplerate_mixer_ctl) {
2684 free(my_data->current_backend_cfg[idx].samplerate_mixer_ctl);
2685 my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
2686 }
2687
2688 if (my_data->current_backend_cfg[idx].channels_mixer_ctl) {
2689 free(my_data->current_backend_cfg[idx].channels_mixer_ctl);
2690 my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
2691 }
2692 }
2693
2694 /* free acdb_meta_key_list */
2695 platform_release_acdb_metainfo_key(platform);
2696
Aditya Bavanari7076ff42018-06-08 16:33:43 +05302697 if (my_data->acdb_deallocate)
2698 my_data->acdb_deallocate();
2699
Eric Laurentb23d5282013-05-14 15:27:20 -07002700 free(platform);
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07002701 /* deinit usb */
2702 audio_extn_usb_deinit();
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07002703 audio_extn_dap_hal_deinit();
Aditya Bavanaria56da222017-07-14 17:54:21 +05302704 if (audio_extn_spkr_prot_is_enabled())
2705 audio_extn_spkr_prot_deinit();
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +05302706#ifdef DYNAMIC_LOG_ENABLED
2707 log_utils_deinit();
2708#endif
Eric Laurentb23d5282013-05-14 15:27:20 -07002709}
2710
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002711static int platform_is_acdb_initialized(void *platform)
Ramjee Singh203473b2015-06-09 15:18:42 +05302712{
2713 struct platform_data *my_data = (struct platform_data *)platform;
2714 ALOGD("%s: acdb initialized %d\n", __func__, my_data->is_acdb_initialized);
2715 return my_data->is_acdb_initialized;
2716}
2717
Dhananjay Kumare6293dd2017-05-25 17:25:30 +05302718void platform_snd_card_update(void *platform, card_status_t card_status)
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002719{
2720 struct platform_data *my_data = (struct platform_data *)platform;
2721
Dhananjay Kumare6293dd2017-05-25 17:25:30 +05302722 if (card_status == CARD_STATUS_ONLINE) {
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002723 if (!platform_is_acdb_initialized(my_data)) {
2724 if(platform_acdb_init(my_data))
2725 ALOGE("%s: acdb initialization is failed", __func__);
2726 } else if (my_data->acdb_send_common_top() < 0) {
2727 ALOGD("%s: acdb did not set common topology", __func__);
2728 }
2729 }
2730}
2731
Eric Laurentb23d5282013-05-14 15:27:20 -07002732const char *platform_get_snd_device_name(snd_device_t snd_device)
2733{
2734 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
2735 return device_table[snd_device];
2736 else
2737 return "";
2738}
2739
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -07002740int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
2741 char *device_name)
2742{
2743 struct platform_data *my_data = (struct platform_data *)platform;
2744
2745 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
2746 strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
2747 hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
2748 } else {
2749 strlcpy(device_name, "", DEVICE_NAME_MAX_SIZE);
2750 return -EINVAL;
2751 }
2752
2753 return 0;
2754}
2755
Banajit Goswami20cdd212015-09-11 01:11:30 -07002756void platform_add_backend_name(char *mixer_path, snd_device_t snd_device,
2757 struct audio_usecase *usecase)
Eric Laurentb23d5282013-05-14 15:27:20 -07002758{
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002759 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
2760 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
2761 return;
2762 }
2763
Rohit kumarf4120402016-08-05 19:19:48 +05302764 if ((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
2765 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
Banajit Goswami20cdd212015-09-11 01:11:30 -07002766 !(usecase->type == VOICE_CALL || usecase->type == VOIP_CALL)) {
2767 ALOGI("%s: Not adding vbat speaker device to non voice use cases", __func__);
2768 return;
2769 }
2770
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302771 const char * suffix = backend_tag_table[snd_device];
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002772
2773 if (suffix != NULL) {
2774 strlcat(mixer_path, " ", MIXER_PATH_MAX_LENGTH);
2775 strlcat(mixer_path, suffix, MIXER_PATH_MAX_LENGTH);
Aalique Grahame37659862017-12-03 22:34:26 -08002776
2777 /* if we can use display-port for voice call and usb mic
2778 * is connected, choose dp_rx, usb_tx audio route
2779 */
2780 if (usecase->type == VOICE_CALL) {
2781 struct audio_device *adev = usecase->stream.out->dev;
2782 if ((snd_device == SND_DEVICE_OUT_DISPLAY_PORT) &&
2783 adev->dp_allowed_for_voice &&
2784 (usecase->in_snd_device == SND_DEVICE_IN_VOICE_USB_HEADSET_MIC)) {
2785 strlcat(mixer_path, "-and-usb-headset-mic", MIXER_PATH_MAX_LENGTH);
2786 }
2787 }
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002788 }
Eric Laurentb23d5282013-05-14 15:27:20 -07002789}
2790
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302791bool platform_check_backends_match(snd_device_t snd_device1, snd_device_t snd_device2)
2792{
2793 bool result = true;
2794
2795 ALOGV("%s: snd_device1 = %s, snd_device2 = %s", __func__,
2796 platform_get_snd_device_name(snd_device1),
2797 platform_get_snd_device_name(snd_device2));
2798
2799 if ((snd_device1 < SND_DEVICE_MIN) || (snd_device1 >= SND_DEVICE_OUT_END)) {
2800 ALOGE("%s: Invalid snd_device = %s", __func__,
2801 platform_get_snd_device_name(snd_device1));
2802 return false;
2803 }
2804 if ((snd_device2 < SND_DEVICE_MIN) || (snd_device2 >= SND_DEVICE_OUT_END)) {
2805 ALOGE("%s: Invalid snd_device = %s", __func__,
2806 platform_get_snd_device_name(snd_device2));
2807 return false;
2808 }
2809 const char * be_itf1 = hw_interface_table[snd_device1];
2810 const char * be_itf2 = hw_interface_table[snd_device2];
2811
2812 if (NULL != be_itf1 && NULL != be_itf2) {
Kuirong Wangb9fbb1e2016-05-03 18:36:39 -07002813 if ((NULL == strstr(be_itf2, be_itf1)) && (NULL == strstr(be_itf1, be_itf2)))
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302814 result = false;
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05302815 } else if (NULL == be_itf1 && NULL != be_itf2 && (NULL == strstr(be_itf2, default_rx_backend))) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302816 result = false;
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05302817 } else if (NULL != be_itf1 && NULL == be_itf2 && (NULL == strstr(be_itf1, default_rx_backend))) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302818 result = false;
2819 }
2820
2821 ALOGV("%s: be_itf1 = %s, be_itf2 = %s, match %d", __func__, be_itf1, be_itf2, result);
2822 return result;
2823}
2824
Eric Laurentb23d5282013-05-14 15:27:20 -07002825int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
2826{
2827 int device_id;
2828 if (device_type == PCM_PLAYBACK)
2829 device_id = pcm_device_table[usecase][0];
2830 else
2831 device_id = pcm_device_table[usecase][1];
2832 return device_id;
2833}
2834
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002835static int find_index(struct name_to_index * table, int32_t len, const char * name)
Ben Romberger61764e32014-01-10 13:49:02 -08002836{
2837 int ret = 0;
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002838 int32_t i;
Ben Romberger61764e32014-01-10 13:49:02 -08002839
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002840 if (table == NULL) {
2841 ALOGE("%s: table is NULL", __func__);
Ben Romberger61764e32014-01-10 13:49:02 -08002842 ret = -ENODEV;
2843 goto done;
2844 }
2845
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002846 if (name == NULL) {
2847 ALOGE("null key");
2848 ret = -ENODEV;
2849 goto done;
2850 }
2851
2852 for (i=0; i < len; i++) {
2853 const char* tn = table[i].name;
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07002854 size_t len = strlen(tn);
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002855 if (strncmp(tn, name, len) == 0) {
2856 if (strlen(name) != len) {
2857 continue; // substring
2858 }
2859 ret = table[i].index;
Ben Romberger61764e32014-01-10 13:49:02 -08002860 goto done;
2861 }
2862 }
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002863 ALOGE("%s: Could not find index for name = %s",
2864 __func__, name);
Ben Romberger61764e32014-01-10 13:49:02 -08002865 ret = -ENODEV;
2866done:
2867 return ret;
2868}
2869
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05302870int platform_set_fluence_type(void *platform, char *value)
2871{
2872 int ret = 0;
2873 int fluence_type = FLUENCE_NONE;
2874 int fluence_flag = NONE_FLAG;
2875 struct platform_data *my_data = (struct platform_data *)platform;
2876 struct audio_device *adev = my_data->adev;
2877
2878 ALOGV("%s: fluence type:%d", __func__, my_data->fluence_type);
2879
2880 /* only dual mic turn on and off is supported as of now through setparameters */
2881 if (!strncmp(AUDIO_PARAMETER_VALUE_DUALMIC,value, sizeof(AUDIO_PARAMETER_VALUE_DUALMIC))) {
2882 if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro")) ||
2883 !strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) {
2884 ALOGV("fluence dualmic feature enabled \n");
2885 fluence_type = FLUENCE_DUAL_MIC;
2886 fluence_flag = DMIC_FLAG;
2887 } else {
2888 ALOGE("%s: Failed to set DUALMIC", __func__);
2889 ret = -1;
2890 goto done;
2891 }
2892 } else if (!strncmp(AUDIO_PARAMETER_KEY_NO_FLUENCE, value, sizeof(AUDIO_PARAMETER_KEY_NO_FLUENCE))) {
2893 ALOGV("fluence disabled");
2894 fluence_type = FLUENCE_NONE;
2895 } else {
2896 ALOGE("Invalid fluence value : %s",value);
2897 ret = -1;
2898 goto done;
2899 }
2900
2901 if (fluence_type != my_data->fluence_type) {
2902 ALOGV("%s: Updating fluence_type to :%d", __func__, fluence_type);
2903 my_data->fluence_type = fluence_type;
2904 adev->acdb_settings = (adev->acdb_settings & FLUENCE_MODE_CLEAR) | fluence_flag;
2905 }
2906done:
2907 return ret;
2908}
2909
2910int platform_get_fluence_type(void *platform, char *value, uint32_t len)
2911{
2912 int ret = 0;
2913 struct platform_data *my_data = (struct platform_data *)platform;
2914
2915 if (my_data->fluence_type == FLUENCE_QUAD_MIC) {
2916 strlcpy(value, "quadmic", len);
2917 } else if (my_data->fluence_type == FLUENCE_DUAL_MIC) {
2918 strlcpy(value, "dualmic", len);
2919 } else if (my_data->fluence_type == FLUENCE_NONE) {
2920 strlcpy(value, "none", len);
2921 } else
2922 ret = -1;
2923
2924 return ret;
2925}
2926
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002927int platform_get_snd_device_index(char *device_name)
2928{
2929 return find_index(snd_device_name_index, SND_DEVICE_MAX, device_name);
2930}
2931
2932int platform_get_usecase_index(const char *usecase_name)
2933{
2934 return find_index(usecase_name_index, AUDIO_USECASE_MAX, usecase_name);
2935}
2936
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07002937int platform_get_effect_config_data(snd_device_t snd_device,
2938 struct audio_effect_config *effect_config,
2939 effect_type_t effect_type)
2940{
2941 int ret = 0;
2942
2943 if ((snd_device < SND_DEVICE_IN_BEGIN) || (snd_device >= SND_DEVICE_MAX) ||
2944 (effect_type <= EFFECT_NONE) || (effect_type >= EFFECT_MAX)) {
2945 ALOGE("%s: Invalid snd_device = %d",
2946 __func__, snd_device);
2947 ret = -EINVAL;
2948 goto done;
2949 }
2950
2951 if(effect_config == NULL) {
2952 ALOGE("%s: Invalid effect_config", __func__);
2953 ret = -EINVAL;
2954 goto done;
2955 }
2956
2957 ALOGV("%s: snd_device = %d module_id = %d",
2958 __func__, snd_device, effect_config_table[GET_IN_DEVICE_INDEX(snd_device)][effect_type].module_id);
2959 memcpy(effect_config, &effect_config_table[GET_IN_DEVICE_INDEX(snd_device)][effect_type],
2960 sizeof(struct audio_effect_config));
2961
2962done:
2963 return ret;
2964}
2965
Ben Romberger55886882014-01-10 13:49:02 -08002966int platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id)
2967{
2968 int ret = 0;
2969
2970 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
2971 ALOGE("%s: Invalid snd_device = %d",
2972 __func__, snd_device);
2973 ret = -EINVAL;
2974 goto done;
2975 }
2976
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302977 ALOGV("%s: acdb_device_table[%s]: old = %d new = %d", __func__,
2978 platform_get_snd_device_name(snd_device), acdb_device_table[snd_device], acdb_id);
Ben Romberger55886882014-01-10 13:49:02 -08002979 acdb_device_table[snd_device] = acdb_id;
2980done:
2981 return ret;
2982}
2983
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07002984int platform_set_effect_config_data(snd_device_t snd_device,
2985 struct audio_effect_config effect_config,
2986 effect_type_t effect_type)
2987{
2988 int ret = 0;
2989
2990 if ((snd_device < SND_DEVICE_IN_BEGIN) || (snd_device >= SND_DEVICE_MAX) ||
2991 (effect_type <= EFFECT_NONE) || (effect_type >= EFFECT_MAX)) {
2992 ALOGE("%s: Invalid snd_device = %d",
2993 __func__, snd_device);
2994 ret = -EINVAL;
2995 goto done;
2996 }
2997
2998 ALOGV("%s 0x%x 0x%x 0x%x 0x%x", __func__, effect_config.module_id,
2999 effect_config.instance_id, effect_config.param_id,
3000 effect_config.param_value);
3001 effect_config_table[GET_IN_DEVICE_INDEX(snd_device)][effect_type] = effect_config;
3002
3003done:
3004 return ret;
3005}
3006
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05303007int platform_set_acdb_metainfo_key(void *platform, char *name, int key)
3008{
3009 struct meta_key_list *key_info;
3010 struct platform_data *pdata = (struct platform_data *)platform;
3011
3012 key_info = (struct meta_key_list *)calloc(1, sizeof(struct meta_key_list));
3013 if (!key_info) {
3014 ALOGE("%s: Could not allocate memory for key %d", __func__, key);
3015 return -ENOMEM;
3016 }
3017
3018 key_info->cal_info.nKey = key;
3019 strlcpy(key_info->name, name, sizeof(key_info->name));
3020 list_add_tail(&pdata->acdb_meta_key_list, &key_info->list);
3021
3022 ALOGD("%s: successfully added module %s and key %d to the list", __func__,
3023 key_info->name, key_info->cal_info.nKey);
3024 return 0;
3025}
3026
3027int platform_get_meta_info_key_from_list(void *platform, char *mod_name)
3028{
3029 struct listnode *node;
3030 struct meta_key_list *key_info;
3031 struct platform_data *pdata = (struct platform_data *)platform;
3032 int key = 0;
3033
3034 ALOGV("%s: for module %s", __func__, mod_name);
3035
3036 list_for_each(node, &pdata->acdb_meta_key_list) {
3037 key_info = node_to_item(node, struct meta_key_list, list);
3038 if (strcmp(key_info->name, mod_name) == 0) {
3039 key = key_info->cal_info.nKey;
3040 ALOGD("%s: Found key %d for module %s", __func__, key, mod_name);
3041 break;
3042 }
3043 }
3044 return key;
3045}
3046
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07003047int platform_get_default_app_type(void *platform)
3048{
3049 struct platform_data *my_data = (struct platform_data *)platform;
3050
3051 if (my_data->acdb_get_default_app_type)
3052 return my_data->acdb_get_default_app_type();
3053 else
Srikanth Uyyalaa1e32352015-10-09 14:48:04 +05303054 return DEFAULT_APP_TYPE_RX_PATH;
3055}
3056
3057int platform_get_default_app_type_v2(void *platform, usecase_type_t type)
3058{
Alexy Josephb1379942016-01-29 15:49:38 -08003059 ALOGV("%s: Platform: %p, type: %d", __func__, platform, type);
Srikanth Uyyalaa1e32352015-10-09 14:48:04 +05303060 if(type == PCM_CAPTURE)
3061 return DEFAULT_APP_TYPE_TX_PATH;
3062 else
3063 return DEFAULT_APP_TYPE_RX_PATH;
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07003064}
3065
Subhash Chandra Bose Naripeddy19dc03b2014-03-10 14:43:05 -07003066int platform_get_snd_device_acdb_id(snd_device_t snd_device)
3067{
3068 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
3069 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
3070 return -EINVAL;
3071 }
3072 return acdb_device_table[snd_device];
3073}
3074
Amit Shekhar5a39c912014-10-14 15:39:30 -07003075int platform_set_snd_device_bit_width(snd_device_t snd_device, unsigned int bit_width)
3076{
3077 int ret = 0;
3078
3079 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
3080 ALOGE("%s: Invalid snd_device = %d",
3081 __func__, snd_device);
3082 ret = -EINVAL;
3083 goto done;
3084 }
3085
3086 backend_bit_width_table[snd_device] = bit_width;
3087done:
3088 return ret;
3089}
3090
3091int platform_get_snd_device_bit_width(snd_device_t snd_device)
3092{
3093 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
3094 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
Ashish Jain058165c2016-09-28 23:18:48 +05303095 return CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Amit Shekhar5a39c912014-10-14 15:39:30 -07003096 }
3097 return backend_bit_width_table[snd_device];
3098}
3099
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303100int platform_set_native_support(int na_mode)
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003101{
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05303102 if (NATIVE_AUDIO_MODE_SRC == na_mode || NATIVE_AUDIO_MODE_TRUE_44_1 == na_mode
3103 || NATIVE_AUDIO_MODE_MULTIPLE_44_1 == na_mode) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303104 na_props.platform_na_prop_enabled = na_props.ui_na_prop_enabled = true;
3105 na_props.na_mode = na_mode;
Ashish Jain6fced6e2017-01-09 14:13:22 +05303106 ALOGD("%s:napb: native audio playback enabled in (%s) mode", __func__,
3107 ((na_mode == NATIVE_AUDIO_MODE_SRC)?"SRC":
3108 (na_mode == NATIVE_AUDIO_MODE_TRUE_44_1)?"True":"Multiple"));
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303109 }
3110 else {
3111 na_props.platform_na_prop_enabled = false;
3112 na_props.na_mode = NATIVE_AUDIO_MODE_INVALID;
3113 ALOGD("%s:napb: native audio playback disabled", __func__);
3114 }
3115
3116 return 0;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003117}
3118
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05303119bool platform_check_codec_dsd_support(void *platform)
3120{
3121 struct platform_data *my_data = (struct platform_data *)platform;
3122 return my_data->is_dsd_supported;
3123}
3124
Preetam Singh Ranawatb0c0dd72016-08-18 00:32:06 +05303125bool platform_check_codec_asrc_support(void *platform)
3126{
3127 struct platform_data *my_data = (struct platform_data *)platform;
3128 return my_data->is_asrc_supported;
3129}
3130
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003131int platform_get_native_support()
3132{
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303133 int ret = NATIVE_AUDIO_MODE_INVALID;
3134 if (na_props.platform_na_prop_enabled &&
3135 na_props.ui_na_prop_enabled) {
3136 ret = na_props.na_mode;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003137 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303138 ALOGV("%s:napb: ui Prop enabled(%d) version(%d)", __func__,
3139 na_props.ui_na_prop_enabled, na_props.na_mode);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003140 return ret;
3141}
3142
3143void native_audio_get_params(struct str_parms *query,
3144 struct str_parms *reply,
3145 char *value, int len)
3146{
3147 int ret;
3148 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
3149 value, len);
3150 if (ret >= 0) {
3151 if (na_props.platform_na_prop_enabled) {
3152 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
3153 na_props.ui_na_prop_enabled ? "true" : "false");
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303154 ALOGV("%s:napb: na_props.ui_na_prop_enabled: %d", __func__,
3155 na_props.ui_na_prop_enabled);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003156 } else {
3157 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
3158 "false");
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303159 ALOGV("%s:napb: native audio not supported: %d", __func__,
3160 na_props.platform_na_prop_enabled);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003161 }
3162 }
3163}
3164
3165int native_audio_set_params(struct platform_data *platform,
3166 struct str_parms *parms, char *value, int len)
3167{
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05303168 int ret = -1;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003169 struct audio_usecase *usecase;
3170 struct listnode *node;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303171 int mode = NATIVE_AUDIO_MODE_INVALID;
3172
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05303173 if (!value || !parms)
3174 return ret;
3175
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303176 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_NATIVE_AUDIO_MODE,
3177 value, len);
3178 if (ret >= 0) {
3179 if (value && !strncmp(value, "src", sizeof("src")))
3180 mode = NATIVE_AUDIO_MODE_SRC;
3181 else if (value && !strncmp(value, "true", sizeof("true")))
3182 mode = NATIVE_AUDIO_MODE_TRUE_44_1;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05303183 else if (value && !strncmp(value, "multiple", sizeof("multiple")))
3184 mode = NATIVE_AUDIO_MODE_MULTIPLE_44_1;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303185 else {
3186 mode = NATIVE_AUDIO_MODE_INVALID;
3187 ALOGE("%s:napb:native_audio_mode in platform info xml,invalid mode string",
3188 __func__);
3189 }
3190 ALOGD("%s:napb updating mode (%d) from XML",__func__, mode);
3191 platform_set_native_support(mode);
3192 }
3193
3194
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003195
3196 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
3197 value, len);
3198 if (ret >= 0) {
3199 if (na_props.platform_na_prop_enabled) {
Sidipotu Ashok894644d2015-07-06 18:35:03 +05303200 if (!strncmp("true", value, sizeof("true"))) {
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003201 na_props.ui_na_prop_enabled = true;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303202 ALOGD("%s:napb: native audio feature enabled from UI",
3203 __func__);
3204 } else {
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003205 na_props.ui_na_prop_enabled = false;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303206 ALOGD("%s:napb: native audio feature disabled from UI",
3207 __func__);
Sidipotu Ashok894644d2015-07-06 18:35:03 +05303208 }
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003209
3210 str_parms_del(parms, AUDIO_PARAMETER_KEY_NATIVE_AUDIO);
3211
3212 /*
3213 * Iterate through the usecase list and trigger device switch for
3214 * all the appropriate usecases
3215 */
3216 list_for_each(node, &(platform->adev)->usecase_list) {
3217 usecase = node_to_item(node, struct audio_usecase, list);
3218
3219 if (is_offload_usecase(usecase->id) &&
3220 (usecase->stream.out->devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
3221 usecase->stream.out->devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) &&
3222 OUTPUT_SAMPLING_RATE_44100 == usecase->stream.out->sample_rate) {
Alexy Josephb1379942016-01-29 15:49:38 -08003223 ALOGD("%s:napb: triggering dynamic device switch for usecase %d, %s"
3224 " stream %p, device (%u)", __func__, usecase->id,
3225 use_case_table[usecase->id],
3226 (void*) usecase->stream.out,
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003227 usecase->stream.out->devices);
Sidipotu Ashok894644d2015-07-06 18:35:03 +05303228 select_devices(platform->adev, usecase->id);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003229 }
3230 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303231 } else
3232 ALOGD("%s:napb: native audio cannot be enabled from UI",
3233 __func__);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003234 }
3235 return ret;
3236}
3237
Sidipotu Ashokad8fff82016-02-02 10:48:42 +05303238int check_hdset_combo_device(snd_device_t snd_device)
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303239{
3240 int ret = false;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303241
Sidipotu Ashokad8fff82016-02-02 10:48:42 +05303242 if (SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES == snd_device ||
3243 SND_DEVICE_OUT_SPEAKER_AND_LINE == snd_device ||
3244 SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1 == snd_device ||
3245 SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2 == snd_device ||
Meng Wang841d6c02017-01-24 12:34:36 +08003246 SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET == snd_device ||
3247 SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET == snd_device)
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303248 ret = true;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303249
3250 return ret;
3251}
kunleiz207afaa2016-07-22 14:26:49 +08003252
Ashish Jainb26edfb2016-08-25 00:10:11 +05303253int codec_device_supports_native_playback(audio_devices_t out_device)
kunleiz207afaa2016-07-22 14:26:49 +08003254{
Ashish Jainb26edfb2016-08-25 00:10:11 +05303255 int ret = false;
kunleiz207afaa2016-07-22 14:26:49 +08003256
3257 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
3258 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
3259 out_device & AUDIO_DEVICE_OUT_LINE)
Ashish Jainb26edfb2016-08-25 00:10:11 +05303260 ret = true;
kunleiz207afaa2016-07-22 14:26:49 +08003261
3262 return ret;
3263}
3264
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05303265int platform_get_backend_index(snd_device_t snd_device)
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003266{
3267 int32_t port = DEFAULT_CODEC_BACKEND;
3268
Kuirong Wang0b947f72016-09-29 11:03:09 -07003269 if (snd_device >= SND_DEVICE_OUT_BEGIN && snd_device < SND_DEVICE_OUT_END) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303270 if (backend_tag_table[snd_device] != NULL) {
3271 if (strncmp(backend_tag_table[snd_device], "headphones-44.1",
3272 sizeof("headphones-44.1")) == 0)
3273 port = HEADPHONE_44_1_BACKEND;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05303274 else if (strncmp(backend_tag_table[snd_device], "headphones-dsd",
3275 sizeof("headphones-dsd")) == 0)
3276 port = DSD_NATIVE_BACKEND;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303277 else if (strncmp(backend_tag_table[snd_device], "headphones",
3278 sizeof("headphones")) == 0)
3279 port = HEADPHONE_BACKEND;
3280 else if (strcmp(backend_tag_table[snd_device], "hdmi") == 0)
3281 port = HDMI_RX_BACKEND;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003282 else if (strcmp(backend_tag_table[snd_device], "display-port") == 0)
3283 port = DISP_PORT_RX_BACKEND;
Ashish Jain3e37a702016-11-25 12:27:15 +05303284 else if ((strcmp(backend_tag_table[snd_device], "usb-headphones") == 0) ||
3285 (strcmp(backend_tag_table[snd_device], "usb-headset") == 0))
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003286 port = USB_AUDIO_RX_BACKEND;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303287 }
Kuirong Wang0b947f72016-09-29 11:03:09 -07003288 } else if (snd_device >= SND_DEVICE_IN_BEGIN && snd_device < SND_DEVICE_IN_END) {
3289 port = DEFAULT_CODEC_TX_BACKEND;
Kuirong Wange9894162016-08-26 15:16:39 -07003290 if (backend_tag_table[snd_device] != NULL) {
3291 if (strcmp(backend_tag_table[snd_device], "usb-headset-mic") == 0)
3292 port = USB_AUDIO_TX_BACKEND;
Dhanalakshmi Siddanib678a802016-12-03 11:51:41 +05303293 else if (strstr(backend_tag_table[snd_device], "bt-sco") != NULL)
3294 port = BT_SCO_TX_BACKEND;
Ralf Herzafb164f2018-07-03 07:08:07 +02003295 else if (strcmp(backend_tag_table[snd_device], "spdif-in") == 0)
3296 port = SPDIF_TX_BACKEND;
3297 else if (strcmp(backend_tag_table[snd_device], "hdmi-in") == 0)
Siddartha Shaik44dd7702017-06-14 12:13:25 +05303298 port = HDMI_TX_BACKEND;
Ralf Herzafb164f2018-07-03 07:08:07 +02003299 else if (strcmp(backend_tag_table[snd_device], "hdmi-arc-in") == 0)
3300 port = HDMI_ARC_TX_BACKEND;
Kuirong Wange9894162016-08-26 15:16:39 -07003301 }
3302 } else {
Kuirong Wang0b947f72016-09-29 11:03:09 -07003303 ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
Kuirong Wange9894162016-08-26 15:16:39 -07003304 }
3305
Kuirong Wang0b947f72016-09-29 11:03:09 -07003306 ALOGV("%s:napb: backend port - %d device - %d ", __func__, port, snd_device);
Kuirong Wange9894162016-08-26 15:16:39 -07003307 return port;
3308}
3309
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05303310int platform_send_audio_calibration(void *platform, struct audio_usecase *usecase,
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07003311 int app_type, int sample_rate)
Eric Laurentb23d5282013-05-14 15:27:20 -07003312{
3313 struct platform_data *my_data = (struct platform_data *)platform;
3314 int acdb_dev_id, acdb_dev_type;
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05303315 int snd_device = SND_DEVICE_OUT_SPEAKER;
Siena Richard7c2db772016-12-21 11:32:34 -08003316 int new_snd_device[SND_DEVICE_OUT_END] = {0};
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303317 int i, num_devices = 1;
Eric Laurentb23d5282013-05-14 15:27:20 -07003318
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05303319 if (usecase->type == PCM_PLAYBACK)
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303320 snd_device = usecase->out_snd_device;
Karthik Reddy Katta81c42612015-11-13 17:49:07 +05303321 else if ((usecase->type == PCM_CAPTURE) &&
3322 voice_is_in_call_rec_stream(usecase->stream.in))
3323 snd_device = voice_get_incall_rec_snd_device(usecase->in_snd_device);
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05303324 else if ((usecase->type == PCM_HFP_CALL) || (usecase->type == PCM_CAPTURE))
Vidyakumar Athotab0975c32015-07-21 14:15:03 -07003325 snd_device = usecase->in_snd_device;
Surendar Karka93cd25a2018-08-28 14:21:37 +05303326 else if (usecase->type == TRANSCODE_LOOPBACK_RX)
Siddartha Shaik343abc62017-08-08 11:15:25 +05303327 snd_device = usecase->out_snd_device;
Vidyakumar Athotab0975c32015-07-21 14:15:03 -07003328
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08003329 acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(snd_device)];
Eric Laurentb23d5282013-05-14 15:27:20 -07003330 if (acdb_dev_id < 0) {
3331 ALOGE("%s: Could not find acdb id for device(%d)",
3332 __func__, snd_device);
3333 return -EINVAL;
3334 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303335
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003336 if (platform_split_snd_device(my_data, snd_device,
3337 &num_devices, new_snd_device) < 0) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303338 new_snd_device[0] = snd_device;
Eric Laurentb23d5282013-05-14 15:27:20 -07003339 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303340
3341 for (i = 0; i < num_devices; i++) {
3342 acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(new_snd_device[i])];
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05303343
3344 // Do not use Rx path default app type for TX path
3345 if ((usecase->type == PCM_CAPTURE) && (app_type == DEFAULT_APP_TYPE_RX_PATH)) {
3346 ALOGD("Resetting app type for Tx path to default");
3347 app_type = DEFAULT_APP_TYPE_TX_PATH;
3348 }
3349
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303350 if (acdb_dev_id < 0) {
3351 ALOGE("%s: Could not find acdb id for device(%d)",
3352 __func__, new_snd_device[i]);
3353 return -EINVAL;
3354 }
Siena Richard7c2db772016-12-21 11:32:34 -08003355 ALOGV("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
3356 __func__, new_snd_device[i], acdb_dev_id);
3357 if (new_snd_device[i] >= SND_DEVICE_OUT_BEGIN &&
3358 new_snd_device[i] < SND_DEVICE_OUT_END)
3359 acdb_dev_type = ACDB_DEV_TYPE_OUT;
3360 else
3361 acdb_dev_type = ACDB_DEV_TYPE_IN;
3362
3363 if (my_data->acdb_send_audio_cal_v3) {
3364 my_data->acdb_send_audio_cal_v3(acdb_dev_id, acdb_dev_type,
3365 app_type, sample_rate, i);
3366 } else if (my_data->acdb_send_audio_cal) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303367 my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type, app_type,
3368 sample_rate);
3369 }
3370 }
3371
Eric Laurentb23d5282013-05-14 15:27:20 -07003372 return 0;
3373}
3374
3375int platform_switch_voice_call_device_pre(void *platform)
3376{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003377 struct platform_data *my_data = (struct platform_data *)platform;
3378 int ret = 0;
3379
Vidyakumar Athota1fd21792013-11-15 14:50:57 -08003380 if (my_data->csd != NULL &&
Ravi Kumar Alamandabe149392014-10-20 17:07:43 -07003381 voice_is_in_call(my_data->adev)) {
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003382 /* This must be called before disabling mixer controls on APQ side */
3383 ret = my_data->csd->disable_device();
3384 if (ret < 0) {
3385 ALOGE("%s: csd_client_disable_device, failed, error %d",
3386 __func__, ret);
3387 }
3388 }
3389 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003390}
3391
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08003392int platform_switch_voice_call_enable_device_config(void *platform,
3393 snd_device_t out_snd_device,
3394 snd_device_t in_snd_device)
3395{
3396 struct platform_data *my_data = (struct platform_data *)platform;
3397 int acdb_rx_id, acdb_tx_id;
3398 int ret = 0;
3399
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003400 if (my_data->csd == NULL)
3401 return ret;
3402
Banajit Goswami20cdd212015-09-11 01:11:30 -07003403 if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
Rohit kumarf4120402016-08-05 19:19:48 +05303404 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
3405 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
3406 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
Banajit Goswami20cdd212015-09-11 01:11:30 -07003407 audio_extn_spkr_prot_is_enabled()) {
3408 if (my_data->is_vbat_speaker)
3409 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
3410 else
3411 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED];
3412 } else
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003413 acdb_rx_id = acdb_device_table[out_snd_device];
3414
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08003415 acdb_tx_id = acdb_device_table[in_snd_device];
3416
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003417 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
3418 ret = my_data->csd->enable_device_config(acdb_rx_id, acdb_tx_id);
3419 if (ret < 0) {
3420 ALOGE("%s: csd_enable_device_config, failed, error %d",
3421 __func__, ret);
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08003422 }
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003423 } else {
3424 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
3425 acdb_rx_id, acdb_tx_id);
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08003426 }
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003427
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08003428 return ret;
3429}
3430
Eric Laurentb23d5282013-05-14 15:27:20 -07003431int platform_switch_voice_call_device_post(void *platform,
3432 snd_device_t out_snd_device,
3433 snd_device_t in_snd_device)
3434{
3435 struct platform_data *my_data = (struct platform_data *)platform;
3436 int acdb_rx_id, acdb_tx_id;
3437
3438 if (my_data->acdb_send_voice_cal == NULL) {
3439 ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
3440 } else {
Rohit kumarf4120402016-08-05 19:19:48 +05303441 if (audio_extn_spkr_prot_is_enabled()) {
3442 if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER)
3443 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
3444 else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)
3445 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
Rohit kumard3c3b912016-11-15 18:50:31 +05303446 else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2)
Rohit kumarf4120402016-08-05 19:19:48 +05303447 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
3448 else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)
3449 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
3450 }
Anish Kumar46c7b872014-09-09 01:49:44 -07003451
Vidyakumar Athota1fd21792013-11-15 14:50:57 -08003452 acdb_rx_id = acdb_device_table[out_snd_device];
3453 acdb_tx_id = acdb_device_table[in_snd_device];
3454
Eric Laurentb23d5282013-05-14 15:27:20 -07003455 if (acdb_rx_id > 0 && acdb_tx_id > 0)
3456 my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id);
3457 else
3458 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
3459 acdb_rx_id, acdb_tx_id);
3460 }
3461
Vidyakumar Athota1fd21792013-11-15 14:50:57 -08003462 return 0;
3463}
3464
3465int platform_switch_voice_call_usecase_route_post(void *platform,
3466 snd_device_t out_snd_device,
3467 snd_device_t in_snd_device)
3468{
3469 struct platform_data *my_data = (struct platform_data *)platform;
3470 int acdb_rx_id, acdb_tx_id;
3471 int ret = 0;
3472
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003473 if (my_data->csd == NULL)
3474 return ret;
3475
Banajit Goswami20cdd212015-09-11 01:11:30 -07003476 if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
Rohit kumarf4120402016-08-05 19:19:48 +05303477 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
3478 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
3479 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
Banajit Goswami20cdd212015-09-11 01:11:30 -07003480 audio_extn_spkr_prot_is_enabled()) {
3481 if (my_data->is_vbat_speaker)
3482 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
3483 else
3484 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED];
3485 } else
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003486 acdb_rx_id = acdb_device_table[out_snd_device];
3487
Vidyakumar Athota1fd21792013-11-15 14:50:57 -08003488 acdb_tx_id = acdb_device_table[in_snd_device];
3489
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003490 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
3491 ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id,
3492 my_data->adev->acdb_settings);
3493 if (ret < 0) {
3494 ALOGE("%s: csd_enable_device, failed, error %d", __func__, ret);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003495 }
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003496 } else {
3497 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
3498 acdb_rx_id, acdb_tx_id);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003499 }
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08003500
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003501 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003502}
3503
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003504int platform_start_voice_call(void *platform, uint32_t vsid)
Eric Laurentb23d5282013-05-14 15:27:20 -07003505{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003506 struct platform_data *my_data = (struct platform_data *)platform;
3507 int ret = 0;
3508
3509 if (my_data->csd != NULL) {
3510 ret = my_data->csd->start_voice(vsid);
3511 if (ret < 0) {
3512 ALOGE("%s: csd_start_voice error %d\n", __func__, ret);
3513 }
3514 }
3515 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003516}
3517
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003518int platform_stop_voice_call(void *platform, uint32_t vsid)
Eric Laurentb23d5282013-05-14 15:27:20 -07003519{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003520 struct platform_data *my_data = (struct platform_data *)platform;
3521 int ret = 0;
3522
3523 if (my_data->csd != NULL) {
3524 ret = my_data->csd->stop_voice(vsid);
3525 if (ret < 0) {
3526 ALOGE("%s: csd_stop_voice error %d\n", __func__, ret);
3527 }
3528 }
3529 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003530}
3531
Helen Zeng6a16ad72014-02-23 22:04:44 -08003532int platform_get_sample_rate(void *platform, uint32_t *rate)
3533{
3534 struct platform_data *my_data = (struct platform_data *)platform;
3535 int ret = 0;
3536
3537 if ((my_data->csd != NULL) && my_data->is_i2s_ext_modem) {
3538 ret = my_data->csd->get_sample_rate(rate);
3539 if (ret < 0) {
3540 ALOGE("%s: csd_get_sample_rate error %d\n", __func__, ret);
3541 }
3542 }
3543 return ret;
3544}
3545
Eric Laurentb23d5282013-05-14 15:27:20 -07003546int platform_set_voice_volume(void *platform, int volume)
3547{
3548 struct platform_data *my_data = (struct platform_data *)platform;
3549 struct audio_device *adev = my_data->adev;
3550 struct mixer_ctl *ctl;
sangwoo53b2cf02013-07-25 19:18:44 -07003551 const char *mixer_ctl_name = "Voice Rx Gain";
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003552 int vol_index = 0, ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05303553 long set_values[ ] = {0,
3554 ALL_SESSION_VSID,
3555 DEFAULT_VOLUME_RAMP_DURATION_MS};
Eric Laurentb23d5282013-05-14 15:27:20 -07003556
3557 // Voice volume levels are mapped to adsp volume levels as follows.
3558 // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1 0 -> 0
3559 // But this values don't changed in kernel. So, below change is need.
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003560 vol_index = (int)percent_to_index(volume, MIN_VOL_INDEX, MAX_VOL_INDEX);
3561 set_values[0] = vol_index;
Eric Laurentb23d5282013-05-14 15:27:20 -07003562
3563 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3564 if (!ctl) {
3565 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3566 __func__, mixer_ctl_name);
Josh Kirsch5669ad92016-12-09 10:48:52 -08003567 ret = -EINVAL;
3568 } else {
Manish Dewangan338c50a2017-09-12 15:22:03 +05303569 ALOGV("%s: Setting voice volume index: %ld", __func__, set_values[0]);
Josh Kirsch5669ad92016-12-09 10:48:52 -08003570 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Eric Laurentb23d5282013-05-14 15:27:20 -07003571 }
Eric Laurentb23d5282013-05-14 15:27:20 -07003572
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003573 if (my_data->csd != NULL) {
Vidyakumar Athotac37f42a2014-03-11 11:57:48 -07003574 ret = my_data->csd->volume(ALL_SESSION_VSID, volume,
3575 DEFAULT_VOLUME_RAMP_DURATION_MS);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003576 if (ret < 0) {
3577 ALOGE("%s: csd_volume error %d", __func__, ret);
3578 }
3579 }
3580 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003581}
3582
3583int platform_set_mic_mute(void *platform, bool state)
3584{
3585 struct platform_data *my_data = (struct platform_data *)platform;
3586 struct audio_device *adev = my_data->adev;
3587 struct mixer_ctl *ctl;
3588 const char *mixer_ctl_name = "Voice Tx Mute";
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003589 int ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05303590 long set_values[ ] = {0,
3591 ALL_SESSION_VSID,
3592 DEFAULT_MUTE_RAMP_DURATION_MS};
Eric Laurentb23d5282013-05-14 15:27:20 -07003593
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003594 set_values[0] = state;
3595 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3596 if (!ctl) {
3597 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3598 __func__, mixer_ctl_name);
Josh Kirsch5669ad92016-12-09 10:48:52 -08003599 ret = -EINVAL;
3600 } else {
3601 ALOGV("%s Setting voice mute state: %d", __func__, state);
3602 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003603 }
Eric Laurentb23d5282013-05-14 15:27:20 -07003604
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003605 if (my_data->csd != NULL) {
Vidyakumar Athotac37f42a2014-03-11 11:57:48 -07003606 ret = my_data->csd->mic_mute(ALL_SESSION_VSID, state,
3607 DEFAULT_MUTE_RAMP_DURATION_MS);
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003608 if (ret < 0) {
3609 ALOGE("%s: csd_mic_mute error %d", __func__, ret);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003610 }
3611 }
3612 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003613}
3614
Shiv Maliyappanahallic6fd8ee2014-03-07 15:31:55 -08003615int platform_set_device_mute(void *platform, bool state, char *dir)
3616{
3617 struct platform_data *my_data = (struct platform_data *)platform;
3618 struct audio_device *adev = my_data->adev;
3619 struct mixer_ctl *ctl;
3620 char *mixer_ctl_name = NULL;
3621 int ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05303622 long set_values[ ] = {0,
3623 ALL_SESSION_VSID,
3624 0};
Shiv Maliyappanahallic6fd8ee2014-03-07 15:31:55 -08003625 if(dir == NULL) {
3626 ALOGE("%s: Invalid direction:%s", __func__, dir);
3627 return -EINVAL;
3628 }
3629
3630 if (!strncmp("rx", dir, sizeof("rx"))) {
3631 mixer_ctl_name = "Voice Rx Device Mute";
3632 } else if (!strncmp("tx", dir, sizeof("tx"))) {
3633 mixer_ctl_name = "Voice Tx Device Mute";
3634 } else {
3635 return -EINVAL;
3636 }
3637
3638 set_values[0] = state;
3639 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3640 if (!ctl) {
3641 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3642 __func__, mixer_ctl_name);
3643 return -EINVAL;
3644 }
3645
3646 ALOGV("%s: Setting device mute state: %d, mixer ctrl:%s",
3647 __func__,state, mixer_ctl_name);
3648 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
3649
3650 return ret;
3651}
3652
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003653int platform_split_snd_device(void *platform,
3654 snd_device_t snd_device,
3655 int *num_devices,
3656 snd_device_t *new_snd_devices)
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303657{
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003658 int ret = -EINVAL;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303659 struct platform_data *my_data = (struct platform_data *)platform;
3660
3661 if ( NULL == num_devices || NULL == new_snd_devices || NULL == my_data) {
3662 ALOGE("%s: NULL pointer ..", __func__);
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003663 return -EINVAL;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303664 }
3665
3666 /*
3667 * If wired headset/headphones/line devices share the same backend
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003668 * with speaker/earpiece this routine returns -EINVAL.
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303669 */
3670 if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES &&
3671 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HEADPHONES)) {
3672 *num_devices = 2;
3673 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3674 new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003675 ret = 0;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303676 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET &&
3677 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_ANC_HEADSET)) {
3678 *num_devices = 2;
3679 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3680 new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
3681 ret = 0;
3682 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET &&
3683 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_ANC_FB_HEADSET)) {
3684 *num_devices = 2;
3685 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3686 new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
3687 ret = 0;
3688 } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES &&
3689 !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER, SND_DEVICE_OUT_VOICE_HEADPHONES)) {
3690 *num_devices = 2;
3691 new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
3692 new_snd_devices[1] = SND_DEVICE_OUT_VOICE_HEADPHONES;
3693 ret = 0;
3694 } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET &&
3695 !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER, SND_DEVICE_OUT_VOICE_ANC_HEADSET)) {
3696 *num_devices = 2;
3697 new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
3698 new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
3699 ret = 0;
3700 } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET &&
3701 !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER, SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET)) {
3702 *num_devices = 2;
3703 new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
3704 new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
3705 ret = 0;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303706 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI &&
3707 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HDMI)) {
3708 *num_devices = 2;
3709 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3710 new_snd_devices[1] = SND_DEVICE_OUT_HDMI;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003711 ret = 0;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003712 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT &&
3713 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_DISPLAY_PORT)) {
3714 *num_devices = 2;
3715 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3716 new_snd_devices[1] = SND_DEVICE_OUT_DISPLAY_PORT;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003717 ret = 0;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003718 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET &&
3719 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_USB_HEADSET)) {
3720 *num_devices = 2;
3721 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3722 new_snd_devices[1] = SND_DEVICE_OUT_USB_HEADSET;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003723 ret = 0;
kunleizbe6a8442017-08-08 17:11:35 +08003724 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_SCO &&
3725 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_BT_SCO)) {
3726 *num_devices = 2;
3727 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3728 new_snd_devices[1] = SND_DEVICE_OUT_BT_SCO;
3729 ret = 0;
3730 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB &&
3731 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_BT_SCO_WB)) {
3732 *num_devices = 2;
3733 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3734 new_snd_devices[1] = SND_DEVICE_OUT_BT_SCO_WB;
3735 ret = 0;
Naresh Tannirucd2353e2016-08-19 00:37:25 +05303736 } else if (SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP == snd_device) {
3737 *num_devices = 2;
3738 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3739 new_snd_devices[1] = SND_DEVICE_OUT_BT_A2DP;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003740 ret = 0;
Divya Narayanan Poojary356e01e2018-02-06 14:25:16 +05303741 } else if (SND_DEVICE_IN_INCALL_REC_RX_TX == snd_device) {
3742 *num_devices = 2;
3743 new_snd_devices[0] = SND_DEVICE_IN_INCALL_REC_RX;
3744 new_snd_devices[1] = SND_DEVICE_IN_INCALL_REC_TX;
3745 ret = 0;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303746 }
3747
3748 ALOGD("%s: snd_device(%d) num devices(%d) new_snd_devices(%d)", __func__,
3749 snd_device, *num_devices, *new_snd_devices);
3750
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003751 return ret;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303752}
3753
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003754int platform_get_ext_disp_type(void *platform)
3755{
3756 int disp_type;
3757 struct platform_data *my_data = (struct platform_data *)platform;
3758
3759 if (my_data->ext_disp_type != EXT_DISPLAY_TYPE_NONE) {
3760 ALOGD("%s: Returning cached ext disp type:%s",
3761 __func__, (my_data->ext_disp_type == EXT_DISPLAY_TYPE_DP) ? "DisplayPort" : "HDMI");
3762 return my_data->ext_disp_type;
3763 }
3764
3765#ifdef DISPLAY_PORT_ENABLED
3766 struct audio_device *adev = my_data->adev;
3767 struct mixer_ctl *ctl;
3768 char *mixer_ctl_name = "External Display Type";
3769
3770 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3771 if (!ctl) {
3772 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3773 __func__, mixer_ctl_name);
3774 return -EINVAL;
3775 }
3776
3777 disp_type = mixer_ctl_get_value(ctl, 0);
3778 if (disp_type == EXT_DISPLAY_TYPE_NONE) {
3779 ALOGE("%s: Invalid external display type: %d", __func__, disp_type);
3780 return -EINVAL;
3781 }
3782#else
3783 disp_type = EXT_DISPLAY_TYPE_HDMI;
3784#endif
3785
3786 my_data->ext_disp_type = disp_type;
3787 ALOGD("%s: ext disp type:%s", __func__, (disp_type == EXT_DISPLAY_TYPE_DP) ? "DisplayPort" : "HDMI");
3788 return disp_type;
3789}
3790
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08003791snd_device_t platform_get_output_snd_device(void *platform, struct stream_out *out)
Eric Laurentb23d5282013-05-14 15:27:20 -07003792{
3793 struct platform_data *my_data = (struct platform_data *)platform;
3794 struct audio_device *adev = my_data->adev;
3795 audio_mode_t mode = adev->mode;
3796 snd_device_t snd_device = SND_DEVICE_NONE;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08003797 audio_devices_t devices = out->devices;
3798 unsigned int sample_rate = out->sample_rate;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303799 int na_mode = platform_get_native_support();
Eric Laurentb23d5282013-05-14 15:27:20 -07003800
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003801 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
3802 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
3803 int channel_count = popcount(channel_mask);
3804
Eric Laurentb23d5282013-05-14 15:27:20 -07003805 ALOGV("%s: enter: output devices(%#x)", __func__, devices);
3806 if (devices == AUDIO_DEVICE_NONE ||
3807 devices & AUDIO_DEVICE_BIT_IN) {
3808 ALOGV("%s: Invalid output devices (%#x)", __func__, devices);
3809 goto exit;
3810 }
3811
Shiv Maliyappanahallibd401262015-08-17 11:02:21 -07003812 if (popcount(devices) == 2) {
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303813 bool is_active_voice_call = false;
3814
3815 /*
3816 * This is special case handling for combo device use case during
3817 * voice call. APM route use case to combo device if stream type is
3818 * enforced audible (e.g. Camera shutter sound).
3819 */
3820 if ((mode == AUDIO_MODE_IN_CALL) ||
3821 voice_is_in_call(adev) ||
3822 voice_extn_compress_voip_is_active(adev))
3823 is_active_voice_call = true;
3824
Mingming Yin4a72d652014-01-03 18:54:18 -08003825 if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
3826 AUDIO_DEVICE_OUT_SPEAKER)) {
Tanya Finkel00130052014-07-14 04:26:56 -07003827 if (my_data->external_spk_1)
3828 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1;
3829 else if (my_data->external_spk_2)
3830 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303831 else if (is_active_voice_call)
3832 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES;
Tanya Finkel00130052014-07-14 04:26:56 -07003833 else
3834 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
Mingming Yin4a72d652014-01-03 18:54:18 -08003835 } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
3836 AUDIO_DEVICE_OUT_SPEAKER)) {
Meng Wang841d6c02017-01-24 12:34:36 +08003837 if (audio_extn_get_anc_enabled()) {
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303838 if (audio_extn_should_use_fb_anc()) {
3839 if (is_active_voice_call)
3840 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET;
3841 else
3842 snd_device = SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET;
3843 } else {
3844 if (is_active_voice_call)
3845 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET;
3846 else
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05303847 snd_device = SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303848 }
Meng Wang841d6c02017-01-24 12:34:36 +08003849 } else if (my_data->external_spk_1)
Tanya Finkel00130052014-07-14 04:26:56 -07003850 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1;
3851 else if (my_data->external_spk_2)
3852 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303853 else {
3854 if (is_active_voice_call)
3855 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES;
3856 else
3857 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
3858 }
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003859 } else if (devices == (AUDIO_DEVICE_OUT_LINE |
3860 AUDIO_DEVICE_OUT_SPEAKER)) {
3861 snd_device = SND_DEVICE_OUT_SPEAKER_AND_LINE;
Mingming Yin4a72d652014-01-03 18:54:18 -08003862 } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL |
3863 AUDIO_DEVICE_OUT_SPEAKER)) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003864 switch(my_data->ext_disp_type) {
3865 case EXT_DISPLAY_TYPE_HDMI:
3866 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI;
3867 break;
3868 case EXT_DISPLAY_TYPE_DP:
3869 snd_device = SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT;
3870 break;
3871 default:
3872 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
3873 goto exit;
3874 }
Mingming Yin4a72d652014-01-03 18:54:18 -08003875 } else if (devices == (AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
3876 AUDIO_DEVICE_OUT_SPEAKER)) {
3877 snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +05303878 } else if ((devices == (AUDIO_DEVICE_OUT_USB_DEVICE |
3879 AUDIO_DEVICE_OUT_SPEAKER)) ||
3880 (devices == (AUDIO_DEVICE_OUT_USB_HEADSET |
3881 AUDIO_DEVICE_OUT_SPEAKER))) {
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003882 snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303883 } else if ((devices & AUDIO_DEVICE_OUT_SPEAKER) &&
3884 (devices & AUDIO_DEVICE_OUT_ALL_A2DP)) {
3885 snd_device = SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP;
kunleizbe6a8442017-08-08 17:11:35 +08003886 } else if ((devices & AUDIO_DEVICE_OUT_ALL_SCO) &&
3887 ((devices & ~AUDIO_DEVICE_OUT_ALL_SCO) == AUDIO_DEVICE_OUT_SPEAKER)) {
3888 snd_device = adev->bt_wb_speech_enabled ?
3889 SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB :
3890 SND_DEVICE_OUT_SPEAKER_AND_BT_SCO;
Mingming Yin4a72d652014-01-03 18:54:18 -08003891 } else {
3892 ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
3893 goto exit;
3894 }
3895 if (snd_device != SND_DEVICE_NONE) {
3896 goto exit;
3897 }
3898 }
3899
3900 if (popcount(devices) != 1) {
3901 ALOGE("%s: Invalid output devices(%#x)", __func__, devices);
3902 goto exit;
3903 }
3904
Venkata Narendra Kumar Guttabfdfa152015-06-22 14:25:35 +05303905 if ((mode == AUDIO_MODE_IN_CALL) ||
kunleiz16dbcc32016-12-13 18:23:04 +08003906 voice_is_in_call(adev) ||
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003907 voice_extn_compress_voip_is_active(adev)) {
Eric Laurentb23d5282013-05-14 15:27:20 -07003908 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003909 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
3910 devices & AUDIO_DEVICE_OUT_LINE) {
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003911 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
3912 !voice_extn_compress_voip_is_active(adev)) {
3913 switch (adev->voice.tty_mode) {
3914 case TTY_MODE_FULL:
3915 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
3916 break;
3917 case TTY_MODE_VCO:
3918 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
3919 break;
3920 case TTY_MODE_HCO:
3921 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
3922 break;
3923 default:
3924 ALOGE("%s: Invalid TTY mode (%#x)",
3925 __func__, adev->voice.tty_mode);
3926 }
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003927 } else if (devices & AUDIO_DEVICE_OUT_LINE) {
3928 snd_device = SND_DEVICE_OUT_VOICE_LINE;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003929 } else if (audio_extn_get_anc_enabled()) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003930 if (audio_extn_should_use_fb_anc())
3931 snd_device = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
3932 else
3933 snd_device = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003934 } else {
Eric Laurentb23d5282013-05-14 15:27:20 -07003935 snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003936 }
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +05303937 } else if (devices &
3938 (AUDIO_DEVICE_OUT_USB_DEVICE |
3939 AUDIO_DEVICE_OUT_USB_HEADSET)) {
Aniket Kumar Lata91886592017-05-25 16:53:32 -07003940 if (voice_is_in_call(adev)) {
3941 switch (adev->voice.tty_mode) {
3942 case TTY_MODE_FULL:
3943 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_USB;
3944 break;
3945 case TTY_MODE_VCO:
3946 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_USB;
3947 break;
3948 case TTY_MODE_HCO:
3949 // since Hearing will be on handset\speaker, use existing device
3950 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
3951 break;
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07003952 case TTY_MODE_OFF:
3953 break;
Aniket Kumar Lata91886592017-05-25 16:53:32 -07003954 default:
3955 ALOGE("%s: Invalid TTY mode (%#x)",
3956 __func__, adev->voice.tty_mode);
3957 }
3958 }
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07003959 if (snd_device == SND_DEVICE_NONE) {
3960 snd_device = audio_extn_usb_is_capture_supported() ?
3961 SND_DEVICE_OUT_VOICE_USB_HEADSET :
3962 SND_DEVICE_OUT_VOICE_USB_HEADPHONES;
3963 }
Eric Laurentb23d5282013-05-14 15:27:20 -07003964 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Mingming Yin514a8bc2014-07-29 15:22:21 -07003965 if (adev->bt_wb_speech_enabled)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003966 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
3967 else
3968 snd_device = SND_DEVICE_OUT_BT_SCO;
Eric Laurentb23d5282013-05-14 15:27:20 -07003969 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
Rohit kumarf4120402016-08-05 19:19:48 +05303970 if (my_data->is_vbat_speaker) {
kunleizaa6a3f12017-01-19 12:28:28 +08003971 if (hw_info_is_stereo_spkr(my_data->hw_info)) {
3972 if (my_data->mono_speaker == SPKR_1)
3973 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
3974 else
3975 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT;
3976 } else
Rohit kumarf4120402016-08-05 19:19:48 +05303977 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
Rohit kumarf4120402016-08-05 19:19:48 +05303978 } else {
kunleizaa6a3f12017-01-19 12:28:28 +08003979 if (hw_info_is_stereo_spkr(my_data->hw_info)) {
3980 if (my_data->mono_speaker == SPKR_1)
3981 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
3982 else
3983 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
3984 } else
3985 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
Rohit kumarf4120402016-08-05 19:19:48 +05303986 }
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07003987 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
3988 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
3989 snd_device = SND_DEVICE_OUT_USB_HEADSET;
Aalique Grahame37659862017-12-03 22:34:26 -08003990 } else if ((devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) &&
3991 adev->dp_allowed_for_voice) {
3992 switch(my_data->ext_disp_type) {
3993 case EXT_DISPLAY_TYPE_DP:
3994 snd_device = SND_DEVICE_OUT_DISPLAY_PORT;
3995 break;
3996 default:
3997 ALOGE("%s: Invalid disp_type %d", __func__,
3998 my_data->ext_disp_type);
3999 goto exit;
4000 }
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -07004001 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
4002 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07004003 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
Ravi Kumar Alamandaceb40822013-11-06 11:01:47 -08004004 if (audio_extn_should_use_handset_anc(channel_count))
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07004005 snd_device = SND_DEVICE_OUT_ANC_HANDSET;
Eric Laurentb23d5282013-05-14 15:27:20 -07004006 else
Mingming Yin8e5a4f62013-10-07 15:23:41 -07004007 snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -07004008 } else if (devices & AUDIO_DEVICE_OUT_TELEPHONY_TX)
4009 snd_device = SND_DEVICE_OUT_VOICE_TX;
4010
Eric Laurentb23d5282013-05-14 15:27:20 -07004011 if (snd_device != SND_DEVICE_NONE) {
4012 goto exit;
4013 }
4014 }
4015
Eric Laurentb23d5282013-05-14 15:27:20 -07004016 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Preetam Singh Ranawatf5fbdd62016-09-29 18:38:31 +05304017 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
4018 devices & AUDIO_DEVICE_OUT_LINE) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07004019 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADSET
4020 && audio_extn_get_anc_enabled()) {
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05304021 if (audio_extn_should_use_fb_anc())
4022 snd_device = SND_DEVICE_OUT_ANC_FB_HEADSET;
4023 else
4024 snd_device = SND_DEVICE_OUT_ANC_HEADSET;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304025 } else if (NATIVE_AUDIO_MODE_SRC == na_mode &&
4026 OUTPUT_SAMPLING_RATE_44100 == sample_rate) {
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004027 snd_device = SND_DEVICE_OUT_HEADPHONES_44_1;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05304028 } else if (NATIVE_AUDIO_MODE_MULTIPLE_44_1 == na_mode &&
4029 (sample_rate % OUTPUT_SAMPLING_RATE_44100 == 0) &&
4030 (out->format != AUDIO_FORMAT_DSD)) {
4031 snd_device = SND_DEVICE_OUT_HEADPHONES_44_1;
4032 } else if (out->format == AUDIO_FORMAT_DSD) {
4033 snd_device = SND_DEVICE_OUT_HEADPHONES_DSD;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304034 } else
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05304035 snd_device = SND_DEVICE_OUT_HEADPHONES;
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07004036 } else if (devices & AUDIO_DEVICE_OUT_LINE) {
4037 snd_device = SND_DEVICE_OUT_LINE;
Eric Laurentb23d5282013-05-14 15:27:20 -07004038 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
Tanya Finkel00130052014-07-14 04:26:56 -07004039 if (my_data->external_spk_1)
4040 snd_device = SND_DEVICE_OUT_SPEAKER_EXTERNAL_1;
4041 else if (my_data->external_spk_2)
4042 snd_device = SND_DEVICE_OUT_SPEAKER_EXTERNAL_2;
4043 else if (adev->speaker_lr_swap)
Eric Laurentb23d5282013-05-14 15:27:20 -07004044 snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
Banajit Goswami20cdd212015-09-11 01:11:30 -07004045 else if (my_data->is_vbat_speaker)
4046 snd_device = SND_DEVICE_OUT_SPEAKER_VBAT;
Eric Laurentb23d5282013-05-14 15:27:20 -07004047 else
4048 snd_device = SND_DEVICE_OUT_SPEAKER;
4049 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Mingming Yin514a8bc2014-07-29 15:22:21 -07004050 if (adev->bt_wb_speech_enabled)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004051 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
4052 else
4053 snd_device = SND_DEVICE_OUT_BT_SCO;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05304054 } else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
4055 snd_device = SND_DEVICE_OUT_BT_A2DP;
Eric Laurentb23d5282013-05-14 15:27:20 -07004056 } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07004057 switch(my_data->ext_disp_type) {
4058 case EXT_DISPLAY_TYPE_HDMI:
4059 snd_device = SND_DEVICE_OUT_HDMI;
4060 break;
4061 case EXT_DISPLAY_TYPE_DP:
4062 snd_device = SND_DEVICE_OUT_DISPLAY_PORT;
4063 break;
4064 default:
4065 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
4066 goto exit;
4067 }
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07004068 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
4069 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
Mingming Yin5a7c5d62014-03-05 17:45:03 -08004070 ALOGD("%s: setting USB hadset channel capability(2) for Proxy", __func__);
4071 audio_extn_set_afe_proxy_channel_mixer(adev, 2);
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07004072 snd_device = SND_DEVICE_OUT_USB_HEADSET;
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +05304073 } else if (devices &
4074 (AUDIO_DEVICE_OUT_USB_DEVICE |
4075 AUDIO_DEVICE_OUT_USB_HEADSET)) {
Ashish Jain3e37a702016-11-25 12:27:15 +05304076 if (audio_extn_usb_is_capture_supported())
4077 snd_device = SND_DEVICE_OUT_USB_HEADSET;
4078 else
4079 snd_device = SND_DEVICE_OUT_USB_HEADPHONES;
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -07004080 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
4081 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07004082 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
4083 snd_device = SND_DEVICE_OUT_HANDSET;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07004084 } else if (devices & AUDIO_DEVICE_OUT_PROXY) {
Mingming Yin5a7c5d62014-03-05 17:45:03 -08004085 channel_count = audio_extn_get_afe_proxy_channel_count();
4086 ALOGD("%s: setting sink capability(%d) for Proxy", __func__, channel_count);
4087 audio_extn_set_afe_proxy_channel_mixer(adev, channel_count);
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07004088 snd_device = SND_DEVICE_OUT_AFE_PROXY;
Eric Laurentb23d5282013-05-14 15:27:20 -07004089 } else {
4090 ALOGE("%s: Unknown device(s) %#x", __func__, devices);
4091 }
4092exit:
4093 ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]);
4094 return snd_device;
4095}
4096
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004097#ifdef DYNAMIC_ECNS_ENABLED
4098static snd_device_t get_snd_device_for_voice_comm(struct platform_data *my_data,
4099 audio_devices_t out_device,
4100 audio_devices_t in_device)
4101{
4102 struct audio_device *adev = my_data->adev;
4103 snd_device_t snd_device = SND_DEVICE_NONE;
4104
4105 if (my_data->fluence_type != FLUENCE_NONE) {
4106 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4107 if (my_data->fluence_in_spkr_mode) {
4108 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4109 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4110 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS;
4111 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4112 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4113 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4114 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE;
4115 else
4116 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
4117 }
4118 adev->acdb_settings |= DMIC_FLAG;
4119 } else
4120 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
4121 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05304122 if ((my_data->fluence_type & FLUENCE_TRI_MIC) &&
4123 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4124 snd_device = SND_DEVICE_IN_HANDSET_TMIC_AEC_NS;
4125 adev->acdb_settings |= TMIC_FLAG;
4126 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004127 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4128 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
4129 adev->acdb_settings |= DMIC_FLAG;
4130 } else
4131 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
4132 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4133 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
4134 }
4135 platform_set_echo_reference(adev, true, out_device);
4136 }
4137
4138 return snd_device;
4139}
4140#else
4141static snd_device_t get_snd_device_for_voice_comm(struct platform_data *my_data,
4142 audio_devices_t out_device,
4143 audio_devices_t in_device)
4144{
4145 struct audio_device *adev = my_data->adev;
4146 snd_device_t snd_device = SND_DEVICE_NONE;
4147
4148 if (my_data->fluence_type != FLUENCE_NONE && adev->active_input->enable_aec &&
4149 adev->active_input->enable_ns) {
4150 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4151 if (my_data->fluence_in_spkr_mode) {
4152 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4153 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4154 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS;
4155 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4156 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4157 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4158 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE;
4159 else
4160 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
4161 }
4162 adev->acdb_settings |= DMIC_FLAG;
4163 } else
4164 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
4165 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05304166 if ((my_data->fluence_type & FLUENCE_TRI_MIC) &&
4167 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4168 snd_device = SND_DEVICE_IN_HANDSET_TMIC_AEC_NS;
4169 adev->acdb_settings |= TMIC_FLAG;
4170 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004171 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4172 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
4173 adev->acdb_settings |= DMIC_FLAG;
4174 } else
4175 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
4176 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4177 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
kunleiz5bda9e22018-06-14 18:48:16 +08004178 } else if (audio_extn_usb_connected(NULL) && audio_is_usb_in_device(in_device | AUDIO_DEVICE_BIT_IN)) {
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004179 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC_AEC;
4180 }
4181 platform_set_echo_reference(adev, true, out_device);
4182 } else if (my_data->fluence_type != FLUENCE_NONE &&
4183 adev->active_input->enable_aec) {
4184 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4185 if (my_data->fluence_in_spkr_mode) {
4186 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4187 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4188 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_AEC;
4189 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4190 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4191 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4192 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE;
4193 else
4194 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
4195 }
4196 adev->acdb_settings |= DMIC_FLAG;
4197 } else
4198 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
4199 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05304200 if ((my_data->fluence_type & FLUENCE_TRI_MIC) &&
4201 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4202 snd_device = SND_DEVICE_IN_HANDSET_TMIC_AEC;
4203 adev->acdb_settings |= TMIC_FLAG;
4204 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004205 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4206 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
4207 adev->acdb_settings |= DMIC_FLAG;
4208 } else
4209 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC;
4210 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4211 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
kunleiz5bda9e22018-06-14 18:48:16 +08004212 } else if (audio_extn_usb_connected(NULL) && audio_is_usb_in_device(in_device | AUDIO_DEVICE_BIT_IN)) {
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004213 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC_AEC;
4214 }
4215 platform_set_echo_reference(adev, true, out_device);
4216 } else if (my_data->fluence_type != FLUENCE_NONE &&
4217 adev->active_input->enable_ns) {
4218 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4219 if (my_data->fluence_in_spkr_mode) {
4220 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4221 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4222 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_NS;
4223 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4224 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4225 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4226 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE;
4227 else
4228 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
4229 }
4230 adev->acdb_settings |= DMIC_FLAG;
4231 } else
4232 snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS;
4233 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05304234 if ((my_data->fluence_type & FLUENCE_TRI_MIC) &&
4235 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4236 snd_device = SND_DEVICE_IN_HANDSET_TMIC_NS;
4237 adev->acdb_settings |= TMIC_FLAG;
4238 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004239 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4240 snd_device = SND_DEVICE_IN_HANDSET_DMIC_NS;
4241 adev->acdb_settings |= DMIC_FLAG;
4242 } else
4243 snd_device = SND_DEVICE_IN_HANDSET_MIC_NS;
4244 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4245 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
4246 }
4247 platform_set_echo_reference(adev, false, out_device);
4248 } else
4249 platform_set_echo_reference(adev, false, out_device);
4250
4251 return snd_device;
4252}
4253#endif //DYNAMIC_ECNS_ENABLED
4254
Eric Laurentb23d5282013-05-14 15:27:20 -07004255snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device)
4256{
4257 struct platform_data *my_data = (struct platform_data *)platform;
4258 struct audio_device *adev = my_data->adev;
Dhanalakshmi Siddanib678a802016-12-03 11:51:41 +05304259 /*
4260 * TODO: active_input always points to last opened input. Source returned will
4261 * be wrong if more than one active inputs are present.
4262 */
Eric Laurentb23d5282013-05-14 15:27:20 -07004263 audio_source_t source = (adev->active_input == NULL) ?
4264 AUDIO_SOURCE_DEFAULT : adev->active_input->source;
4265
4266 audio_mode_t mode = adev->mode;
4267 audio_devices_t in_device = ((adev->active_input == NULL) ?
4268 AUDIO_DEVICE_NONE : adev->active_input->device)
4269 & ~AUDIO_DEVICE_BIT_IN;
4270 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
4271 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
4272 snd_device_t snd_device = SND_DEVICE_NONE;
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07004273 int channel_count = popcount(channel_mask);
Ashish Jainb8d55fd2016-12-29 14:00:24 +05304274 int str_bitwidth = (adev->active_input == NULL) ?
4275 CODEC_BACKEND_DEFAULT_BIT_WIDTH : adev->active_input->bit_width;
Eric Laurentb23d5282013-05-14 15:27:20 -07004276
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304277 ALOGV("%s: enter: out_device(%#x) in_device(%#x) channel_count (%d) channel_mask (0x%x)",
4278 __func__, out_device, in_device, channel_count, channel_mask);
Tanya Finkel00130052014-07-14 04:26:56 -07004279 if (my_data->external_mic) {
kunleiz16dbcc32016-12-13 18:23:04 +08004280 if ((out_device != AUDIO_DEVICE_NONE) && ((mode == AUDIO_MODE_IN_CALL) || voice_is_in_call(adev) ||
Venkata Narendra Kumar Guttabfdfa152015-06-22 14:25:35 +05304281 voice_extn_compress_voip_is_active(adev) || audio_extn_hfp_is_active(adev))) {
Tanya Finkel00130052014-07-14 04:26:56 -07004282 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
4283 out_device & AUDIO_DEVICE_OUT_EARPIECE ||
4284 out_device & AUDIO_DEVICE_OUT_SPEAKER )
4285 snd_device = SND_DEVICE_IN_HANDSET_MIC_EXTERNAL;
4286 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
4287 in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4288 snd_device = SND_DEVICE_IN_HANDSET_MIC_EXTERNAL;
4289 }
4290 }
4291
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07004292 if (snd_device != AUDIO_DEVICE_NONE)
Tanya Finkel00130052014-07-14 04:26:56 -07004293 goto exit;
4294
kunleiz16dbcc32016-12-13 18:23:04 +08004295 if ((out_device != AUDIO_DEVICE_NONE) && ((mode == AUDIO_MODE_IN_CALL) || voice_is_in_call(adev) ||
Satya Krishna Pindiproli071950f2014-05-21 14:45:28 +05304296 voice_extn_compress_voip_is_active(adev) || audio_extn_hfp_is_active(adev))) {
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08004297 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
4298 !voice_extn_compress_voip_is_active(adev)) {
Eric Laurentb23d5282013-05-14 15:27:20 -07004299 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07004300 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
4301 out_device & AUDIO_DEVICE_OUT_LINE) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004302 switch (adev->voice.tty_mode) {
Aniket Kumar Lata91886592017-05-25 16:53:32 -07004303 case TTY_MODE_FULL:
4304 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC;
4305 break;
4306 case TTY_MODE_VCO:
4307 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
4308 break;
4309 case TTY_MODE_HCO:
4310 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC;
4311 break;
4312 default:
4313 ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->voice.tty_mode);
4314 }
4315 goto exit;
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +05304316 } else if (out_device &
4317 (AUDIO_DEVICE_OUT_USB_DEVICE |
4318 AUDIO_DEVICE_OUT_USB_HEADSET)) {
Aniket Kumar Lata91886592017-05-25 16:53:32 -07004319 switch (adev->voice.tty_mode) {
4320 case TTY_MODE_FULL:
4321 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC;
4322 break;
4323 case TTY_MODE_VCO:
4324 // since voice will be captured from handset mic, use existing device
4325 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
4326 break;
4327 case TTY_MODE_HCO:
4328 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC;
4329 break;
4330 default:
4331 ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->voice.tty_mode);
Eric Laurentb23d5282013-05-14 15:27:20 -07004332 }
4333 goto exit;
4334 }
4335 }
Narsinga Rao Chella97db8702014-10-03 13:34:45 -07004336 if (out_device & AUDIO_DEVICE_OUT_EARPIECE ||
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07004337 out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
4338 out_device & AUDIO_DEVICE_OUT_LINE) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07004339 if (out_device & AUDIO_DEVICE_OUT_EARPIECE &&
4340 audio_extn_should_use_handset_anc(channel_count)) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304341 if ((my_data->fluence_type != FLUENCE_NONE) &&
4342 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Shiv Maliyappanahallidd287262016-01-08 15:57:07 -08004343 snd_device = SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC;
4344 adev->acdb_settings |= DMIC_FLAG;
4345 } else {
4346 snd_device = SND_DEVICE_IN_AANC_HANDSET_MIC;
4347 }
Banajit Goswamide0ea452014-04-07 12:11:47 -07004348 adev->acdb_settings |= ANC_FLAG;
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07004349 } else if (my_data->fluence_type == FLUENCE_NONE ||
Vikram Pandurangae7b21342017-06-05 15:57:23 -07004350 (my_data->fluence_in_voice_call == false &&
4351 my_data->fluence_in_hfp_call == false)) {
Eric Laurentb23d5282013-05-14 15:27:20 -07004352 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05304353 if (audio_extn_hfp_is_active(adev))
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004354 platform_set_echo_reference(adev, true, out_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07004355 } else {
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05304356 if ((my_data->fluence_type & FLUENCE_TRI_MIC) &&
4357 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4358 snd_device = SND_DEVICE_IN_HANDSET_TMIC;
4359 adev->acdb_settings |= TMIC_FLAG;
4360 } else { /* for FLUENCE_DUAL_MIC and SOURCE_DUAL_MIC */
4361 snd_device = SND_DEVICE_IN_VOICE_DMIC;
4362 adev->acdb_settings |= DMIC_FLAG;
4363 }
Eric Laurentb23d5282013-05-14 15:27:20 -07004364 }
4365 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
4366 snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05304367 if (audio_extn_hfp_is_active(adev))
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004368 platform_set_echo_reference(adev, true, out_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07004369 } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07004370 if (adev->bt_wb_speech_enabled) {
4371 if (adev->bluetooth_nrec)
4372 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
4373 else
4374 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
4375 } else {
4376 if (adev->bluetooth_nrec)
4377 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
4378 else
4379 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
4380 }
Aalique Grahame37659862017-12-03 22:34:26 -08004381 } else if ((out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) &&
4382 adev->dp_allowed_for_voice) {
4383 if (audio_extn_usb_is_capture_supported())
4384 snd_device = SND_DEVICE_IN_VOICE_USB_HEADSET_MIC;
4385 else
4386 snd_device = SND_DEVICE_IN_HANDSET_MIC;
4387
4388 if (voice_is_in_call(adev))
4389 platform_set_echo_reference(adev, true, out_device);
Narsinga Rao Chella97db8702014-10-03 13:34:45 -07004390 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Mingming Yin8e5a4f62013-10-07 15:23:41 -07004391 if (my_data->fluence_type != FLUENCE_NONE &&
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05304392 (my_data->fluence_in_voice_call ||
4393 my_data->fluence_in_hfp_call) &&
Mingming Yin8e5a4f62013-10-07 15:23:41 -07004394 my_data->fluence_in_spkr_mode) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304395 if((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4396 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05304397 adev->acdb_settings |= QMIC_FLAG;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07004398 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_QMIC;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08004399 } else {
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05304400 adev->acdb_settings |= DMIC_FLAG;
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -08004401 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4402 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE;
4403 else
4404 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07004405 }
Dhanalakshmi Siddani1eb3a352017-06-05 15:18:23 +05304406 if (audio_extn_hfp_is_active(adev))
4407 platform_set_echo_reference(adev, true, out_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07004408 } else {
4409 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05304410 if (audio_extn_hfp_is_active(adev))
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004411 platform_set_echo_reference(adev, true, out_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07004412 }
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07004413 } else if (out_device & AUDIO_DEVICE_OUT_TELEPHONY_TX) {
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -07004414 snd_device = SND_DEVICE_IN_VOICE_RX;
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +05304415 } else if (out_device &
4416 (AUDIO_DEVICE_OUT_USB_DEVICE |
4417 AUDIO_DEVICE_OUT_USB_HEADSET)) {
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07004418 if (audio_extn_usb_is_capture_supported()) {
4419 snd_device = SND_DEVICE_IN_VOICE_USB_HEADSET_MIC;
4420 }
4421 }
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +05304422 } else if (my_data->use_generic_handset == true && // system prop is enabled
4423 (my_data->source_mic_type & SOURCE_QUAD_MIC) && // AND 4mic is available
4424 ((in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) || // AND device is buit-in mic or back mic
4425 (in_device & AUDIO_DEVICE_IN_BACK_MIC)) &&
4426 (my_data->fluence_in_audio_rec == true && // AND fluencepro is enabled
4427 my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4428 (source == AUDIO_SOURCE_CAMCORDER || // AND source is cam/mic/unprocessed
4429 source == AUDIO_SOURCE_UNPROCESSED ||
4430 source == AUDIO_SOURCE_MIC)) {
4431 snd_device = SND_DEVICE_IN_HANDSET_GENERIC_QMIC;
4432 platform_set_echo_reference(adev, true, out_device);
Sachin Mohan Gadage6aa1952018-03-05 17:50:02 +05304433 } else if (my_data->use_generic_handset == true && // System prop is enabled
4434 (my_data->ambisonic_capture == true) && // Enable Ambisonic capture
Sachin Mohan Gadagbe2054d2018-01-29 16:05:05 +05304435 (my_data->source_mic_type & SOURCE_QUAD_MIC) && // AND 4mic is available
Sachin Mohan Gadage6aa1952018-03-05 17:50:02 +05304436 ((in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) || // AND device is Built-in
4437 (in_device & AUDIO_DEVICE_IN_BACK_MIC)) && // OR Back-mic
4438 (source == AUDIO_SOURCE_MIC || // AND source is MIC for 16bit
4439 source == AUDIO_SOURCE_UNPROCESSED || // OR unprocessed for 24bit
4440 source == AUDIO_SOURCE_CAMCORDER)) { // OR camera usecase
Sachin Mohan Gadagbe2054d2018-01-29 16:05:05 +05304441 snd_device = SND_DEVICE_IN_HANDSET_GENERIC_QMIC;
4442 /* Below check is true only in LA build to set
4443 ambisonic profile. In LE hal client will set profile
4444 */
4445 if (my_data->ambisonic_profile == true) {
4446 strlcpy(adev->active_input->profile, "record_ambisonic",
4447 sizeof(adev->active_input->profile));
4448 }
Sachin Mohan Gadage6aa1952018-03-05 17:50:02 +05304449
4450 if (!strncmp(adev->active_input->profile, "record_ambisonic",
4451 strlen("record_ambisonic"))) {
4452 /* Validate input stream configuration for
4453 Ambisonic capture.
4454 */
4455 if (((int)channel_mask != (int)AUDIO_CHANNEL_INDEX_MASK_4) ||
4456 (adev->active_input->sample_rate != 48000)) {
4457 snd_device = SND_DEVICE_NONE;
4458 ALOGW("Unsupported Input configuration for ambisonic capture");
4459 goto exit;
4460 }
4461 }
Eric Laurentb23d5282013-05-14 15:27:20 -07004462 } else if (source == AUDIO_SOURCE_CAMCORDER) {
4463 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
4464 in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05304465
4466 if (str_bitwidth == 16) {
4467 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4468 (my_data->source_mic_type & SOURCE_DUAL_MIC) &&
4469 (channel_count == 2))
4470 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
4471 else
4472 snd_device = SND_DEVICE_IN_CAMCORDER_MIC;
4473 }
4474 /*
4475 * for other bit widths
4476 */
4477 else {
4478 if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
4479 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
4480 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4481 snd_device = SND_DEVICE_IN_UNPROCESSED_STEREO_MIC;
4482 }
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304483 else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_3) &&
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05304484 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4485 snd_device = SND_DEVICE_IN_UNPROCESSED_THREE_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304486 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_4) &&
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05304487 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4488 snd_device = SND_DEVICE_IN_UNPROCESSED_QUAD_MIC;
4489 } else {
4490 snd_device = SND_DEVICE_IN_UNPROCESSED_MIC;
4491 }
4492 }
4493 }
4494 } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) {
Eric Laurentb23d5282013-05-14 15:27:20 -07004495 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304496 if (my_data->fluence_in_voice_rec && channel_count == 1) {
4497 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4498 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Ben Romberger182c8252016-07-18 16:54:54 -07004499 snd_device = SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304500 } else if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4501 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
Ben Rombergera4d76db2016-10-13 15:26:02 -07004502 snd_device = SND_DEVICE_IN_VOICE_REC_TMIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304503 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4504 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Vidyakumar Athota78b70c02015-06-29 17:19:45 -07004505 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
4506 }
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304507 platform_set_echo_reference(adev, true, out_device);
4508 } else if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
4509 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
4510 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4511 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_STEREO;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304512 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_3) &&
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304513 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4514 snd_device = SND_DEVICE_IN_THREE_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304515 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_4) &&
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304516 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4517 snd_device = SND_DEVICE_IN_QUAD_MIC;
4518 }
4519 if (snd_device == SND_DEVICE_NONE) {
4520 if (adev->active_input->enable_ns)
4521 snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS;
4522 else
4523 snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08004524 }
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +05304525 } else if (audio_is_usb_in_device(in_device | AUDIO_DEVICE_BIT_IN)) {
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07004526 snd_device = SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07004527 }
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05304528 } else if (source == AUDIO_SOURCE_UNPROCESSED) {
4529 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
4530 if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
4531 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
4532 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4533 snd_device = SND_DEVICE_IN_UNPROCESSED_STEREO_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304534 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_3) &&
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05304535 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4536 snd_device = SND_DEVICE_IN_UNPROCESSED_THREE_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304537 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_4) &&
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05304538 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4539 snd_device = SND_DEVICE_IN_UNPROCESSED_QUAD_MIC;
4540 } else {
4541 snd_device = SND_DEVICE_IN_UNPROCESSED_MIC;
4542 }
4543 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05304544 snd_device = SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC;
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +05304545 } else if (audio_is_usb_in_device(in_device | AUDIO_DEVICE_BIT_IN)) {
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07004546 snd_device = SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC;
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05304547 }
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05304548 } else if ((source == AUDIO_SOURCE_VOICE_COMMUNICATION) ||
4549 (mode == AUDIO_MODE_IN_COMMUNICATION)) {
Eric Laurentb23d5282013-05-14 15:27:20 -07004550 if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
4551 in_device = AUDIO_DEVICE_IN_BACK_MIC;
kunleiz18bdec02018-08-07 17:09:11 +08004552 else if (out_device & AUDIO_DEVICE_OUT_EARPIECE)
4553 in_device = AUDIO_DEVICE_IN_BUILTIN_MIC;
4554 else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET)
4555 in_device = AUDIO_DEVICE_IN_WIRED_HEADSET;
4556 else if (out_device & AUDIO_DEVICE_OUT_USB_DEVICE)
4557 in_device = AUDIO_DEVICE_IN_USB_DEVICE;
4558
4559 in_device = ((out_device == AUDIO_DEVICE_NONE) ?
4560 AUDIO_DEVICE_IN_BUILTIN_MIC : in_device) & ~AUDIO_DEVICE_BIT_IN;
4561
Eric Laurentb23d5282013-05-14 15:27:20 -07004562 if (adev->active_input) {
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004563 snd_device = get_snd_device_for_voice_comm(my_data, out_device, in_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07004564 }
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08004565 } else if (source == AUDIO_SOURCE_MIC) {
Apoorv Raghuvanshic0536542013-11-14 16:25:59 -08004566 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC &&
4567 channel_count == 1 ) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07004568 if(my_data->fluence_in_audio_rec) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304569 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4570 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07004571 snd_device = SND_DEVICE_IN_HANDSET_QMIC;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004572 platform_set_echo_reference(adev, true, out_device);
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304573 } else if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4574 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
Aditya Bavanari4051c8d2017-12-13 13:31:26 +05304575 snd_device = SND_DEVICE_IN_HANDSET_TMIC_FLUENCE_PRO;
4576 } else if ((my_data->fluence_type & FLUENCE_TRI_MIC) &&
4577 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304578 snd_device = SND_DEVICE_IN_HANDSET_TMIC;
4579 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4580 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07004581 snd_device = SND_DEVICE_IN_HANDSET_DMIC;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004582 platform_set_echo_reference(adev, true, out_device);
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07004583 }
Ravi Kumar Alamanda7076b162014-03-07 11:40:24 -08004584 }
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08004585 }
Mingming Yin12125e82015-10-26 20:40:36 -07004586 } else if (source == AUDIO_SOURCE_FM_TUNER) {
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07004587 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07004588 } else if (source == AUDIO_SOURCE_DEFAULT) {
4589 goto exit;
4590 }
4591
Shiv Maliyappanahalli5a10aea2015-07-02 10:36:23 -07004592 if (adev->active_input && (audio_extn_ssr_get_stream() == adev->active_input))
4593 snd_device = SND_DEVICE_IN_THREE_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07004594
4595 if (snd_device != SND_DEVICE_NONE) {
4596 goto exit;
4597 }
4598
4599 if (in_device != AUDIO_DEVICE_NONE &&
4600 !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) &&
4601 !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) {
4602 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Shiv Maliyappanahalli5a10aea2015-07-02 10:36:23 -07004603 if (adev->active_input && (audio_extn_ssr_get_stream() == adev->active_input))
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07004604 snd_device = SND_DEVICE_IN_QUAD_MIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304605 else if ((my_data->fluence_type & (FLUENCE_DUAL_MIC | FLUENCE_QUAD_MIC)) &&
4606 (channel_count == 2) && (my_data->source_mic_type & SOURCE_DUAL_MIC))
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07004607 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07004608 else
4609 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07004610 } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4611 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
Ramu Gottipati813ae982018-07-25 14:14:48 +05304612 } else if (in_device & AUDIO_DEVICE_IN_LINE) {
4613 snd_device = SND_DEVICE_IN_LINE;
Eric Laurentb23d5282013-05-14 15:27:20 -07004614 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4615 snd_device = SND_DEVICE_IN_HEADSET_MIC;
4616 } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07004617 if (adev->bt_wb_speech_enabled) {
4618 if (adev->bluetooth_nrec)
4619 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
4620 else
4621 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
4622 } else {
4623 if (adev->bluetooth_nrec)
4624 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
4625 else
4626 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
4627 }
Ralf Herzafb164f2018-07-03 07:08:07 +02004628 } else if (in_device & AUDIO_DEVICE_IN_SPDIF) {
4629 snd_device = SND_DEVICE_IN_SPDIF;
Eric Laurentb23d5282013-05-14 15:27:20 -07004630 } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
4631 snd_device = SND_DEVICE_IN_HDMI_MIC;
Ralf Herz76b455c2018-09-10 13:58:04 +02004632 } else if (in_device & AUDIO_DEVICE_IN_HDMI_ARC) {
Ralf Herzafb164f2018-07-03 07:08:07 +02004633 snd_device = SND_DEVICE_IN_HDMI_ARC;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07004634 } else if (in_device & AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET ||
4635 in_device & AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET) {
4636 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Mingming Yin12125e82015-10-26 20:40:36 -07004637 } else if (in_device & AUDIO_DEVICE_IN_FM_TUNER) {
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -07004638 snd_device = SND_DEVICE_IN_CAPTURE_FM;
kunleiz5bda9e22018-06-14 18:48:16 +08004639 } else if (audio_extn_usb_connected(NULL) && audio_is_usb_in_device(in_device | AUDIO_DEVICE_BIT_IN)) {
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08004640 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07004641 } else {
4642 ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
4643 ALOGW("%s: Using default handset-mic", __func__);
4644 snd_device = SND_DEVICE_IN_HANDSET_MIC;
4645 }
4646 } else {
4647 if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
4648 snd_device = SND_DEVICE_IN_HANDSET_MIC;
4649 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
4650 snd_device = SND_DEVICE_IN_HEADSET_MIC;
Narsinga Rao Chella97db8702014-10-03 13:34:45 -07004651 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304652 if ((my_data->source_mic_type & SOURCE_DUAL_MIC) &&
4653 (channel_count == 2)) {
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07004654 snd_device = SND_DEVICE_IN_SPEAKER_STEREO_DMIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304655 } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) &&
4656 (channel_count == 1)) {
4657 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
4658 } else {
4659 ALOGE("%s: something wrong: source type (%d) channel_count (%d) .."
4660 " no combination found .. setting to mono", __func__,
4661 my_data->source_mic_type, channel_count);
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07004662 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304663 }
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07004664 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
4665 out_device & AUDIO_DEVICE_OUT_LINE) {
Narsinga Rao Chella97db8702014-10-03 13:34:45 -07004666 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07004667 } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07004668 if (adev->bt_wb_speech_enabled) {
4669 if (adev->bluetooth_nrec)
4670 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
4671 else
4672 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
4673 } else {
4674 if (adev->bluetooth_nrec)
4675 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
4676 else
4677 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
4678 }
Eric Laurentb23d5282013-05-14 15:27:20 -07004679 } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
4680 snd_device = SND_DEVICE_IN_HDMI_MIC;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07004681 } else if (out_device & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
4682 out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
4683 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Satya Krishna Pindiprolice227962017-12-13 16:07:14 +05304684 } else if (out_device &
4685 (AUDIO_DEVICE_OUT_USB_DEVICE |
4686 AUDIO_DEVICE_OUT_USB_HEADSET)) {
kunleiz5bda9e22018-06-14 18:48:16 +08004687 if (audio_extn_usb_is_capture_supported() && audio_extn_usb_connected(NULL))
Ashish Jain3e37a702016-11-25 12:27:15 +05304688 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
4689 else
4690 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07004691 } else {
4692 ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
4693 ALOGW("%s: Using default handset-mic", __func__);
4694 snd_device = SND_DEVICE_IN_HANDSET_MIC;
4695 }
4696 }
4697exit:
4698 ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
4699 return snd_device;
4700}
4701
4702int platform_set_hdmi_channels(void *platform, int channel_count)
4703{
4704 struct platform_data *my_data = (struct platform_data *)platform;
4705 struct audio_device *adev = my_data->adev;
4706 struct mixer_ctl *ctl;
4707 const char *channel_cnt_str = NULL;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07004708 char *mixer_ctl_name;
Eric Laurentb23d5282013-05-14 15:27:20 -07004709 switch (channel_count) {
4710 case 8:
4711 channel_cnt_str = "Eight"; break;
4712 case 7:
4713 channel_cnt_str = "Seven"; break;
4714 case 6:
4715 channel_cnt_str = "Six"; break;
4716 case 5:
4717 channel_cnt_str = "Five"; break;
4718 case 4:
4719 channel_cnt_str = "Four"; break;
4720 case 3:
4721 channel_cnt_str = "Three"; break;
4722 default:
4723 channel_cnt_str = "Two"; break;
4724 }
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07004725
4726 switch(my_data->ext_disp_type) {
4727 case EXT_DISPLAY_TYPE_HDMI:
4728 mixer_ctl_name = "HDMI_RX Channels";
4729 break;
4730 case EXT_DISPLAY_TYPE_DP:
4731 mixer_ctl_name = "Display Port RX Channels";
4732 break;
4733 default:
4734 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
4735 return -EINVAL;
4736 }
4737
Eric Laurentb23d5282013-05-14 15:27:20 -07004738 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4739 if (!ctl) {
4740 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4741 __func__, mixer_ctl_name);
4742 return -EINVAL;
4743 }
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07004744 ALOGV("Ext disp channel count: %s", channel_cnt_str);
Eric Laurentb23d5282013-05-14 15:27:20 -07004745 mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
4746 return 0;
4747}
4748
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07004749int platform_edid_get_max_channels(void *platform)
Eric Laurentb23d5282013-05-14 15:27:20 -07004750{
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07004751 int channel_count;
4752 int max_channels = 2;
4753 int i = 0, ret = 0;
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07004754 struct platform_data *my_data = (struct platform_data *)platform;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07004755 edid_audio_info *info = NULL;
4756 ret = platform_get_edid_info(platform);
4757 info = (edid_audio_info *)my_data->edid_info;
Eric Laurentb23d5282013-05-14 15:27:20 -07004758
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07004759 if(ret == 0 && info != NULL) {
4760 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
4761 ALOGV("%s:format %d channel %d", __func__,
4762 info->audio_blocks_array[i].format_id,
4763 info->audio_blocks_array[i].channels);
4764 if (info->audio_blocks_array[i].format_id == LPCM) {
4765 channel_count = info->audio_blocks_array[i].channels;
4766 if (channel_count > max_channels) {
4767 max_channels = channel_count;
4768 }
4769 }
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07004770 }
Eric Laurentb23d5282013-05-14 15:27:20 -07004771 }
Eric Laurentb23d5282013-05-14 15:27:20 -07004772 return max_channels;
4773}
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004774
4775static int platform_set_slowtalk(struct platform_data *my_data, bool state)
4776{
4777 int ret = 0;
4778 struct audio_device *adev = my_data->adev;
4779 struct mixer_ctl *ctl;
4780 const char *mixer_ctl_name = "Slowtalk Enable";
Manish Dewangan338c50a2017-09-12 15:22:03 +05304781 long set_values[ ] = {0,
4782 ALL_SESSION_VSID};
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004783
4784 set_values[0] = state;
4785 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4786 if (!ctl) {
4787 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4788 __func__, mixer_ctl_name);
4789 ret = -EINVAL;
4790 } else {
4791 ALOGV("Setting slowtalk state: %d", state);
4792 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
4793 my_data->slowtalk = state;
4794 }
4795
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08004796 if (my_data->csd != NULL) {
4797 ret = my_data->csd->slow_talk(ALL_SESSION_VSID, state);
4798 if (ret < 0) {
4799 ALOGE("%s: csd_client_disable_device, failed, error %d",
4800 __func__, ret);
4801 }
4802 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004803 return ret;
4804}
4805
Avinash Vaishd5fa4572014-09-15 14:41:14 +05304806static int set_hd_voice(struct platform_data *my_data, bool state)
4807{
4808 struct audio_device *adev = my_data->adev;
4809 struct mixer_ctl *ctl;
4810 char *mixer_ctl_name = "HD Voice Enable";
4811 int ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05304812 long set_values[ ] = {0,
4813 ALL_SESSION_VSID};
Avinash Vaishd5fa4572014-09-15 14:41:14 +05304814
4815 set_values[0] = state;
4816 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4817 if (!ctl) {
4818 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4819 __func__, mixer_ctl_name);
4820 return -EINVAL;
4821 } else {
4822 ALOGV("Setting HD Voice state: %d", state);
4823 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
4824 my_data->hd_voice = state;
4825 }
4826
4827 return ret;
4828}
Tanya Finkel00130052014-07-14 04:26:56 -07004829
4830static int update_external_device_status(struct platform_data *my_data,
4831 char* event_name, bool status)
4832{
4833 int ret = 0;
4834 struct audio_usecase *usecase;
4835 struct listnode *node;
4836
4837 ALOGD("Recieved external event switch %s", event_name);
4838
4839 if (!strcmp(event_name, EVENT_EXTERNAL_SPK_1))
4840 my_data->external_spk_1 = status;
4841 else if (!strcmp(event_name, EVENT_EXTERNAL_SPK_2))
4842 my_data->external_spk_2 = status;
4843 else if (!strcmp(event_name, EVENT_EXTERNAL_MIC))
4844 my_data->external_mic = status;
4845 else {
4846 ALOGE("The audio event type is not found");
4847 return -EINVAL;
4848 }
4849
4850 list_for_each(node, &my_data->adev->usecase_list) {
4851 usecase = node_to_item(node, struct audio_usecase, list);
4852 select_devices(my_data->adev, usecase->id);
4853 }
4854
4855 return ret;
4856}
4857
Ben Rombergera04fabc2014-11-14 12:16:03 -08004858static int parse_audiocal_cfg(struct str_parms *parms, acdb_audio_cal_cfg_t *cal)
4859{
4860 int err;
Ben Rombergera04fabc2014-11-14 12:16:03 -08004861 char value[64];
4862 int ret = 0;
4863
4864 if(parms == NULL || cal == NULL)
4865 return ret;
4866
4867 err = str_parms_get_str(parms, "cal_persist", value, sizeof(value));
4868 if (err >= 0) {
4869 str_parms_del(parms, "cal_persist");
4870 cal->persist = (uint32_t) strtoul(value, NULL, 0);
4871 ret = ret | 0x1;
4872 }
4873 err = str_parms_get_str(parms, "cal_apptype", value, sizeof(value));
4874 if (err >= 0) {
4875 str_parms_del(parms, "cal_apptype");
4876 cal->app_type = (uint32_t) strtoul(value, NULL, 0);
4877 ret = ret | 0x2;
4878 }
4879 err = str_parms_get_str(parms, "cal_caltype", value, sizeof(value));
4880 if (err >= 0) {
4881 str_parms_del(parms, "cal_caltype");
4882 cal->cal_type = (uint32_t) strtoul(value, NULL, 0);
4883 ret = ret | 0x4;
4884 }
4885 err = str_parms_get_str(parms, "cal_samplerate", value, sizeof(value));
4886 if (err >= 0) {
4887 str_parms_del(parms, "cal_samplerate");
4888 cal->sampling_rate = (uint32_t) strtoul(value, NULL, 0);
4889 ret = ret | 0x8;
4890 }
4891 err = str_parms_get_str(parms, "cal_devid", value, sizeof(value));
4892 if (err >= 0) {
4893 str_parms_del(parms, "cal_devid");
4894 cal->dev_id = (uint32_t) strtoul(value, NULL, 0);
4895 ret = ret | 0x10;
4896 }
4897 err = str_parms_get_str(parms, "cal_snddevid", value, sizeof(value));
4898 if (err >= 0) {
4899 str_parms_del(parms, "cal_snddevid");
4900 cal->snd_dev_id = (uint32_t) strtoul(value, NULL, 0);
4901 ret = ret | 0x20;
4902 }
4903 err = str_parms_get_str(parms, "cal_topoid", value, sizeof(value));
4904 if (err >= 0) {
4905 str_parms_del(parms, "cal_topoid");
4906 cal->topo_id = (uint32_t) strtoul(value, NULL, 0);
4907 ret = ret | 0x40;
4908 }
4909 err = str_parms_get_str(parms, "cal_moduleid", value, sizeof(value));
4910 if (err >= 0) {
4911 str_parms_del(parms, "cal_moduleid");
4912 cal->module_id = (uint32_t) strtoul(value, NULL, 0);
4913 ret = ret | 0x80;
4914 }
Aditya Bavanari20fd7812017-10-03 20:10:35 +05304915#ifdef INSTANCE_ID_ENABLED
4916 err = str_parms_get_str(parms, "cal_instanceid", value, sizeof(value));
4917 if (err >= 0) {
4918 str_parms_del(parms, "cal_instanceid");
4919 cal->instance_id = (uint32_t) strtoul(value, NULL, 0);
4920 ret = ret | 0x100;
4921 }
4922#endif
Ben Rombergera04fabc2014-11-14 12:16:03 -08004923 err = str_parms_get_str(parms, "cal_paramid", value, sizeof(value));
4924 if (err >= 0) {
4925 str_parms_del(parms, "cal_paramid");
4926 cal->param_id = (uint32_t) strtoul(value, NULL, 0);
Aditya Bavanari20fd7812017-10-03 20:10:35 +05304927 ret = ret | 0x200;
Ben Rombergera04fabc2014-11-14 12:16:03 -08004928 }
4929 return ret;
4930}
4931
4932static void set_audiocal(void *platform, struct str_parms *parms, char *value, int len) {
4933 struct platform_data *my_data = (struct platform_data *)platform;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08004934 struct stream_out out;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05304935 acdb_audio_cal_cfg_t cal;
Ben Rombergera04fabc2014-11-14 12:16:03 -08004936 uint8_t *dptr = NULL;
4937 int32_t dlen;
4938 int err, ret;
4939 if(value == NULL || platform == NULL || parms == NULL) {
4940 ALOGE("[%s] received null pointer, failed",__func__);
4941 goto done_key_audcal;
4942 }
4943
Aditya Bavanarie293d5b2017-11-15 12:48:36 +05304944 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
Ben Rombergera04fabc2014-11-14 12:16:03 -08004945 /* parse audio calibration keys */
4946 ret = parse_audiocal_cfg(parms, &cal);
4947
4948 /* handle audio calibration data now */
4949 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_AUD_CALDATA, value, len);
4950 if (err >= 0) {
4951 str_parms_del(parms, AUDIO_PARAMETER_KEY_AUD_CALDATA);
4952 dlen = strlen(value);
4953 if(dlen <= 0) {
4954 ALOGE("[%s] null data received",__func__);
4955 goto done_key_audcal;
4956 }
4957 dptr = (uint8_t*) calloc(dlen, sizeof(uint8_t));
4958 if(dptr == NULL) {
4959 ALOGE("[%s] memory allocation failed for %d",__func__, dlen);
4960 goto done_key_audcal;
4961 }
4962 dlen = b64decode(value, strlen(value), dptr);
4963 if(dlen<=0) {
4964 ALOGE("[%s] data decoding failed %d", __func__, dlen);
4965 goto done_key_audcal;
4966 }
4967
4968 if(cal.dev_id) {
4969 if(audio_is_input_device(cal.dev_id)) {
4970 cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
4971 } else {
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004972 out.devices = cal.dev_id;
Leena Winterrowdd7a04cd2016-01-07 11:50:02 -08004973 out.sample_rate = cal.sampling_rate;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004974 cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
Ben Rombergera04fabc2014-11-14 12:16:03 -08004975 }
4976 }
4977 cal.acdb_dev_id = platform_get_snd_device_acdb_id(cal.snd_dev_id);
4978 ALOGD("Setting audio calibration for snd_device(%d) acdb_id(%d)",
4979 cal.snd_dev_id, cal.acdb_dev_id);
4980 if(cal.acdb_dev_id == -EINVAL) {
4981 ALOGE("[%s] Invalid acdb_device id %d for snd device id %d",
4982 __func__, cal.acdb_dev_id, cal.snd_dev_id);
4983 goto done_key_audcal;
4984 }
4985 if(my_data->acdb_set_audio_cal) {
4986 ret = my_data->acdb_set_audio_cal((void *)&cal, (void*)dptr, dlen);
4987 }
4988 }
4989done_key_audcal:
4990 if(dptr != NULL)
4991 free(dptr);
4992}
4993
Ashish Jainf1eaa582016-05-23 20:54:24 +05304994static void true_32_bit_set_params(struct str_parms *parms,
4995 char *value, int len)
4996{
4997 int ret = 0;
4998
4999 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_TRUE_32_BIT,
5000 value,len);
5001 if (ret >= 0) {
5002 if (value && !strncmp(value, "true", sizeof("src")))
5003 supports_true_32_bit = true;
5004 else
5005 supports_true_32_bit = false;
5006 str_parms_del(parms, AUDIO_PARAMETER_KEY_TRUE_32_BIT);
5007 }
5008
5009}
5010
5011bool platform_supports_true_32bit()
5012{
5013 return supports_true_32_bit;
5014}
5015
Sudheer Papothifa9d2282015-09-17 01:53:25 +05305016static void perf_lock_set_params(struct platform_data *platform,
5017 struct str_parms *parms,
5018 char *value, int len)
5019{
5020 int err = 0, i = 0, num_opts = 0;
5021 char *test_r = NULL;
5022 char *opts = NULL;
5023 char *opts_size = NULL;
5024
5025 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_PERF_LOCK_OPTS,
5026 value, len);
5027 if (err >= 0) {
5028 opts_size = strtok_r(value, ", ", &test_r);
5029 if (opts_size == NULL) {
5030 ALOGE("%s: incorrect perf lock opts\n", __func__);
5031 return;
5032 }
5033 num_opts = atoi(opts_size);
5034 if (num_opts > 0) {
5035 if (num_opts > MAX_PERF_LOCK_OPTS) {
5036 ALOGD("%s: num_opts %d exceeds max %d, setting to max\n",
5037 __func__, num_opts, MAX_PERF_LOCK_OPTS);
5038 num_opts = MAX_PERF_LOCK_OPTS;
5039 }
5040 for (i = 0; i < num_opts; i++) {
5041 opts = strtok_r(NULL, ", ", &test_r);
5042 if (opts == NULL) {
5043 ALOGE("%s: incorrect perf lock opts\n", __func__);
5044 break;
5045 }
5046 platform->adev->perf_lock_opts[i] = strtoul(opts, NULL, 16);
5047 }
5048 platform->adev->perf_lock_opts_size = i;
5049 }
5050 str_parms_del(parms, AUDIO_PARAMETER_KEY_PERF_LOCK_OPTS);
5051 }
5052}
5053
Surendar Karka45850ae2018-07-02 17:45:27 +05305054static void platform_spkr_device_set_params(struct platform_data *platform,
5055 struct str_parms *parms,
5056 char *value, int len)
5057{
5058 int err = 0, i = 0, num_ch = 0;
5059 char *test_r = NULL;
5060 char *opts = NULL;
5061 char *ch_count = NULL;
5062
5063 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_SPKR_DEVICE_CHMAP,
5064 value, len);
5065 if (err >= 0) {
5066 platform->spkr_ch_map = calloc(1, sizeof(struct spkr_device_chmap));
5067 if (!platform->spkr_ch_map) {
5068 ALOGE("%s: failed to allocate mem for adm channel map\n", __func__);
5069 str_parms_del(parms, AUDIO_PARAMETER_KEY_SPKR_DEVICE_CHMAP);
5070 return ;
5071 }
5072
5073 ch_count = strtok_r(value, ", ", &test_r);
5074 if (ch_count == NULL) {
5075 ALOGE("%s: incorrect ch_map\n", __func__);
5076 free(platform->spkr_ch_map);
5077 platform->spkr_ch_map = NULL;
5078 str_parms_del(parms, AUDIO_PARAMETER_KEY_SPKR_DEVICE_CHMAP);
5079 return;
5080 }
5081
5082 num_ch = atoi(ch_count);
5083 if ((num_ch > 0) && (num_ch <= AUDIO_CHANNEL_COUNT_MAX) ) {
5084 platform->spkr_ch_map->num_ch = num_ch;
5085 for (i = 0; i < num_ch; i++) {
5086 opts = strtok_r(NULL, ", ", &test_r);
5087 platform->spkr_ch_map->chmap[i] = strtoul(opts, NULL, 16);
5088 }
5089 }
5090 str_parms_del(parms, AUDIO_PARAMETER_KEY_SPKR_DEVICE_CHMAP);
5091 }
5092}
5093
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005094int platform_set_parameters(void *platform, struct str_parms *parms)
5095{
5096 struct platform_data *my_data = (struct platform_data *)platform;
Satya Krishna Pindiprolic6b0a742017-02-03 14:37:18 +05305097 struct audio_device *adev = my_data->adev;
Ben Rombergera04fabc2014-11-14 12:16:03 -08005098 char *value=NULL;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05305099 int len;
Shiv Maliyappanahalli3e064fd2013-12-16 15:54:40 -08005100 int ret = 0, err;
Krishnankutty Kolathappilly061a9492014-01-31 18:12:13 -08005101 char *kv_pairs = str_parms_to_str(parms);
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05305102 struct listnode *node;
5103 struct meta_key_list *key_info;
5104 int key = 0;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005105
Mingming Yin7b762e72015-03-04 13:47:32 -08005106 if(kv_pairs == NULL) {
5107 ret = -ENOMEM;
5108 ALOGE("[%s] key-value pair is NULL",__func__);
5109 goto done;
5110 }
5111
Krishnankutty Kolathappilly061a9492014-01-31 18:12:13 -08005112 ALOGV_IF(kv_pairs != NULL, "%s: enter: %s", __func__, kv_pairs);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005113
Ben Rombergera04fabc2014-11-14 12:16:03 -08005114 len = strlen(kv_pairs);
5115 value = (char*)calloc(len, sizeof(char));
5116 if(value == NULL) {
5117 ret = -ENOMEM;
5118 ALOGE("[%s] failed to allocate memory",__func__);
5119 goto done;
5120 }
5121 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_SLOWTALK, value, len);
Shiv Maliyappanahalli3e064fd2013-12-16 15:54:40 -08005122 if (err >= 0) {
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08005123 bool state = false;
5124 if (!strncmp("true", value, sizeof("true"))) {
5125 state = true;
5126 }
5127
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005128 str_parms_del(parms, AUDIO_PARAMETER_KEY_SLOWTALK);
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08005129 ret = platform_set_slowtalk(my_data, state);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005130 if (ret)
5131 ALOGE("%s: Failed to set slow talk err: %d", __func__, ret);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005132 }
5133
Ben Rombergera04fabc2014-11-14 12:16:03 -08005134 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_HD_VOICE, value, len);
Avinash Vaishd5fa4572014-09-15 14:41:14 +05305135 if (err >= 0) {
5136 bool state = false;
5137 if (!strncmp("true", value, sizeof("true"))) {
5138 state = true;
5139 }
5140
5141 str_parms_del(parms, AUDIO_PARAMETER_KEY_HD_VOICE);
5142 if (my_data->hd_voice != state) {
5143 ret = set_hd_voice(my_data, state);
5144 if (ret)
5145 ALOGE("%s: Failed to set HD voice err: %d", __func__, ret);
5146 } else {
5147 ALOGV("%s: HD Voice already set to %d", __func__, state);
5148 }
5149 }
5150
Shiv Maliyappanahalli3e064fd2013-12-16 15:54:40 -08005151 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_VOLUME_BOOST,
Ben Rombergera04fabc2014-11-14 12:16:03 -08005152 value, len);
Shiv Maliyappanahalli3e064fd2013-12-16 15:54:40 -08005153 if (err >= 0) {
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08005154 str_parms_del(parms, AUDIO_PARAMETER_KEY_VOLUME_BOOST);
5155
5156 if (my_data->acdb_reload_vocvoltable == NULL) {
5157 ALOGE("%s: acdb_reload_vocvoltable is NULL", __func__);
5158 } else if (!strcmp(value, "on")) {
5159 if (!my_data->acdb_reload_vocvoltable(VOICE_FEATURE_SET_VOLUME_BOOST)) {
5160 my_data->voice_feature_set = 1;
5161 }
5162 } else {
5163 if (!my_data->acdb_reload_vocvoltable(VOICE_FEATURE_SET_DEFAULT)) {
5164 my_data->voice_feature_set = 0;
5165 }
5166 }
5167 }
5168
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05305169 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB,
5170 value, len);
5171 if (err >= 0) {
5172 str_parms_del(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB);
5173
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05305174 if (my_data->acdb_reload_v2) {
5175 my_data->acdb_reload_v2(value, my_data->snd_card_name,
5176 my_data->cvd_version, &my_data->acdb_meta_key_list);
5177 } else if (my_data->acdb_reload) {
5178 node = list_head(&my_data->acdb_meta_key_list);
5179 key_info = node_to_item(node, struct meta_key_list, list);
5180 key = key_info->cal_info.nKey;
5181 my_data->acdb_reload(value, my_data->snd_card_name,
5182 my_data->cvd_version, key);
5183 }
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05305184 }
5185
Rohit kumard3c3b912016-11-15 18:50:31 +05305186 if (hw_info_is_stereo_spkr(my_data->hw_info)) {
5187 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER, value, len);
5188 if (err >= 0) {
5189 if (!strncmp("left", value, sizeof("left")))
5190 my_data->mono_speaker = SPKR_1;
5191 else if (!strncmp("right", value, sizeof("right")))
5192 my_data->mono_speaker = SPKR_2;
Rohit kumarf4120402016-08-05 19:19:48 +05305193
Rohit kumard3c3b912016-11-15 18:50:31 +05305194 str_parms_del(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER);
5195 }
Rohit kumarf4120402016-08-05 19:19:48 +05305196 }
Tanya Finkel00130052014-07-14 04:26:56 -07005197 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE,
Ben Rombergera04fabc2014-11-14 12:16:03 -08005198 value, len);
Tanya Finkel00130052014-07-14 04:26:56 -07005199 if (err >= 0) {
5200 char *event_name, *status_str;
5201 bool status = false;
5202 str_parms_del(parms, AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE);
5203 event_name = strtok_r(value, ",", &status_str);
Apoorv Raghuvanshi8880cac2015-02-06 15:33:49 -08005204 if (!event_name) {
5205 ret = -EINVAL;
5206 ALOGE("%s: event_name is NULL", __func__);
5207 goto done;
5208 }
Tanya Finkel00130052014-07-14 04:26:56 -07005209 ALOGV("%s: recieved update of external audio device %s %s",
5210 __func__,
5211 event_name, status_str);
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07005212 if (!strncmp(status_str, "ON", sizeof("ON")))
Tanya Finkel00130052014-07-14 04:26:56 -07005213 status = true;
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07005214 else if (!strncmp(status_str, "OFF", sizeof("OFF")))
Tanya Finkel00130052014-07-14 04:26:56 -07005215 status = false;
5216 update_external_device_status(my_data, event_name, status);
5217 }
5218
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05305219 err = str_parms_get_str(parms, PLATFORM_MAX_MIC_COUNT,
5220 value, sizeof(value));
5221 if (err >= 0) {
5222 str_parms_del(parms, PLATFORM_MAX_MIC_COUNT);
5223 my_data->max_mic_count = atoi(value);
5224 ALOGV("%s: max_mic_count %d", __func__, my_data->max_mic_count);
5225 }
5226
Ben Rombergera04fabc2014-11-14 12:16:03 -08005227 /* handle audio calibration parameters */
5228 set_audiocal(platform, parms, value, len);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005229 native_audio_set_params(platform, parms, value, len);
Sudheer Papothi991966d2015-07-20 21:54:36 +05305230 audio_extn_spkr_prot_set_parameters(parms, value, len);
Kuirong Wang1cad7142016-05-24 15:21:56 -07005231 audio_extn_usb_set_sidetone_gain(parms, value, len);
Satya Krishna Pindiprolic6b0a742017-02-03 14:37:18 +05305232 audio_extn_hfp_set_parameters(adev, parms);
Sudheer Papothifa9d2282015-09-17 01:53:25 +05305233 perf_lock_set_params(platform, parms, value, len);
Ashish Jainf1eaa582016-05-23 20:54:24 +05305234 true_32_bit_set_params(parms, value, len);
Surendar Karka45850ae2018-07-02 17:45:27 +05305235 platform_spkr_device_set_params(platform, parms, value, len);
Ben Rombergera04fabc2014-11-14 12:16:03 -08005236done:
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005237 ALOGV("%s: exit with code(%d)", __func__, ret);
Mingming Yin7b762e72015-03-04 13:47:32 -08005238 if(kv_pairs != NULL)
5239 free(kv_pairs);
Ben Rombergera04fabc2014-11-14 12:16:03 -08005240 if(value != NULL)
5241 free(value);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005242 return ret;
5243}
5244
Vidyakumar Athota2850d532013-11-19 16:02:12 -08005245int platform_set_incall_recording_session_id(void *platform,
5246 uint32_t session_id, int rec_mode)
Shiv Maliyappanahallida107642013-10-17 11:16:13 -07005247{
5248 int ret = 0;
5249 struct platform_data *my_data = (struct platform_data *)platform;
5250 struct audio_device *adev = my_data->adev;
5251 struct mixer_ctl *ctl;
5252 const char *mixer_ctl_name = "Voc VSID";
5253 int num_ctl_values;
5254 int i;
5255
5256 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
5257 if (!ctl) {
5258 ALOGE("%s: Could not get ctl for mixer cmd - %s",
5259 __func__, mixer_ctl_name);
5260 ret = -EINVAL;
5261 } else {
5262 num_ctl_values = mixer_ctl_get_num_values(ctl);
5263 for (i = 0; i < num_ctl_values; i++) {
5264 if (mixer_ctl_set_value(ctl, i, session_id)) {
5265 ALOGV("Error: invalid session_id: %x", session_id);
5266 ret = -EINVAL;
5267 break;
5268 }
5269 }
5270 }
5271
Vidyakumar Athota2850d532013-11-19 16:02:12 -08005272 if (my_data->csd != NULL) {
5273 ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode);
5274 if (ret < 0) {
5275 ALOGE("%s: csd_client_start_record failed, error %d",
5276 __func__, ret);
5277 }
5278 }
5279
5280 return ret;
5281}
5282
5283int platform_stop_incall_recording_usecase(void *platform)
5284{
5285 int ret = 0;
5286 struct platform_data *my_data = (struct platform_data *)platform;
5287
5288 if (my_data->csd != NULL) {
5289 ret = my_data->csd->stop_record(ALL_SESSION_VSID);
5290 if (ret < 0) {
5291 ALOGE("%s: csd_client_stop_record failed, error %d",
5292 __func__, ret);
5293 }
5294 }
5295
5296 return ret;
5297}
5298
5299int platform_start_incall_music_usecase(void *platform)
5300{
5301 int ret = 0;
5302 struct platform_data *my_data = (struct platform_data *)platform;
5303
5304 if (my_data->csd != NULL) {
5305 ret = my_data->csd->start_playback(ALL_SESSION_VSID);
5306 if (ret < 0) {
5307 ALOGE("%s: csd_client_start_playback failed, error %d",
5308 __func__, ret);
5309 }
5310 }
5311
5312 return ret;
5313}
5314
5315int platform_stop_incall_music_usecase(void *platform)
5316{
5317 int ret = 0;
5318 struct platform_data *my_data = (struct platform_data *)platform;
5319
5320 if (my_data->csd != NULL) {
5321 ret = my_data->csd->stop_playback(ALL_SESSION_VSID);
5322 if (ret < 0) {
5323 ALOGE("%s: csd_client_stop_playback failed, error %d",
5324 __func__, ret);
5325 }
5326 }
5327
Shiv Maliyappanahallida107642013-10-17 11:16:13 -07005328 return ret;
5329}
5330
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -07005331int platform_update_lch(void *platform, struct voice_session *session,
5332 enum voice_lch_mode lch_mode)
5333{
5334 int ret = 0;
5335 struct platform_data *my_data = (struct platform_data *)platform;
5336
5337 if ((my_data->csd != NULL) && (my_data->csd->set_lch != NULL))
5338 ret = my_data->csd->set_lch(session->vsid, lch_mode);
5339 else
5340 ret = pcm_ioctl(session->pcm_tx, SNDRV_VOICE_IOCTL_LCH, &lch_mode);
5341
5342 return ret;
5343}
5344
Ben Rombergera04fabc2014-11-14 12:16:03 -08005345static void get_audiocal(void *platform, void *keys, void *pReply) {
5346 struct platform_data *my_data = (struct platform_data *)platform;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005347 struct stream_out out;
Ben Rombergera04fabc2014-11-14 12:16:03 -08005348 struct str_parms *query = (struct str_parms *)keys;
5349 struct str_parms *reply=(struct str_parms *)pReply;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05305350 acdb_audio_cal_cfg_t cal;
Ben Rombergera04fabc2014-11-14 12:16:03 -08005351 uint8_t *dptr = NULL;
5352 char value[512] = {0};
5353 char *rparms=NULL;
5354 int ret=0, err;
5355 uint32_t param_len;
5356
5357 if(query==NULL || platform==NULL || reply==NULL) {
5358 ALOGE("[%s] received null pointer",__func__);
5359 ret=-EINVAL;
5360 goto done;
5361 }
Aditya Bavanarie293d5b2017-11-15 12:48:36 +05305362
5363 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
Ben Rombergera04fabc2014-11-14 12:16:03 -08005364 /* parse audiocal configuration keys */
5365 ret = parse_audiocal_cfg(query, &cal);
5366 if(ret == 0) {
5367 /* No calibration keys found */
5368 goto done;
5369 }
5370 err = str_parms_get_str(query, AUDIO_PARAMETER_KEY_AUD_CALDATA, value, sizeof(value));
5371 if (err >= 0) {
5372 str_parms_del(query, AUDIO_PARAMETER_KEY_AUD_CALDATA);
5373 } else {
5374 goto done;
5375 }
5376
5377 if(cal.dev_id & AUDIO_DEVICE_BIT_IN) {
5378 cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
5379 } else if(cal.dev_id) {
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08005380 out.devices = cal.dev_id;
Leena Winterrowdd7a04cd2016-01-07 11:50:02 -08005381 out.sample_rate = cal.sampling_rate;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08005382 cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
Ben Rombergera04fabc2014-11-14 12:16:03 -08005383 }
5384 cal.acdb_dev_id = platform_get_snd_device_acdb_id(cal.snd_dev_id);
5385 if (cal.acdb_dev_id < 0) {
5386 ALOGE("%s: Failed. Could not find acdb id for snd device(%d)",
5387 __func__, cal.snd_dev_id);
5388 ret = -EINVAL;
5389 goto done_key_audcal;
5390 }
5391 ALOGD("[%s] Getting audio calibration for snd_device(%d) acdb_id(%d)",
5392 __func__, cal.snd_dev_id, cal.acdb_dev_id);
5393
5394 param_len = MAX_SET_CAL_BYTE_SIZE;
5395 dptr = (uint8_t*)calloc(param_len, sizeof(uint8_t));
5396 if(dptr == NULL) {
5397 ALOGE("[%s] Memory allocation failed for length %d",__func__,param_len);
5398 ret = -ENOMEM;
5399 goto done_key_audcal;
5400 }
5401 if (my_data->acdb_get_audio_cal != NULL) {
5402 ret = my_data->acdb_get_audio_cal((void*)&cal, (void*)dptr, &param_len);
5403 if (ret == 0) {
Ben Rombergera04fabc2014-11-14 12:16:03 -08005404 if(param_len == 0 || param_len == MAX_SET_CAL_BYTE_SIZE) {
5405 ret = -EINVAL;
5406 goto done_key_audcal;
5407 }
5408 /* Allocate memory for encoding */
5409 rparms = (char*)calloc((param_len*2), sizeof(char));
5410 if(rparms == NULL) {
5411 ALOGE("[%s] Memory allocation failed for size %d",
5412 __func__, param_len*2);
5413 ret = -ENOMEM;
5414 goto done_key_audcal;
5415 }
5416 if(cal.persist==0 && cal.module_id && cal.param_id) {
5417 err = b64encode(dptr+12, param_len-12, rparms);
5418 } else {
5419 err = b64encode(dptr, param_len, rparms);
5420 }
5421 if(err < 0) {
5422 ALOGE("[%s] failed to convert data to string", __func__);
5423 ret = -EINVAL;
5424 goto done_key_audcal;
5425 }
5426 str_parms_add_int(reply, AUDIO_PARAMETER_KEY_AUD_CALRESULT, ret);
5427 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_AUD_CALDATA, rparms);
5428 }
5429 }
5430done_key_audcal:
5431 if(ret != 0) {
5432 str_parms_add_int(reply, AUDIO_PARAMETER_KEY_AUD_CALRESULT, ret);
5433 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_AUD_CALDATA, "");
5434 }
5435done:
5436 if(dptr != NULL)
5437 free(dptr);
5438 if(rparms != NULL)
5439 free(rparms);
5440}
5441
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005442void platform_get_parameters(void *platform,
5443 struct str_parms *query,
5444 struct str_parms *reply)
5445{
5446 struct platform_data *my_data = (struct platform_data *)platform;
Aalique Grahame37659862017-12-03 22:34:26 -08005447 struct audio_device *adev = my_data->adev;
Ben Rombergera04fabc2014-11-14 12:16:03 -08005448 char value[512] = {0};
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005449 int ret;
Krishnankutty Kolathappilly061a9492014-01-31 18:12:13 -08005450 char *kv_pairs = NULL;
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305451 char propValue[PROPERTY_VALUE_MAX]={0};
5452 bool prop_playback_enabled = false;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005453
Shiv Maliyappanahalli9d899292013-11-20 14:43:01 -08005454 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_SLOWTALK,
5455 value, sizeof(value));
5456 if (ret >= 0) {
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08005457 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_SLOWTALK,
5458 my_data->slowtalk?"true":"false");
Shiv Maliyappanahalli9d899292013-11-20 14:43:01 -08005459 }
5460
Avinash Vaishd5fa4572014-09-15 14:41:14 +05305461 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_HD_VOICE,
5462 value, sizeof(value));
5463 if (ret >= 0) {
5464 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_HD_VOICE,
5465 my_data->hd_voice?"true":"false");
5466 }
5467
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08005468 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_VOLUME_BOOST,
5469 value, sizeof(value));
5470 if (ret >= 0) {
5471 if (my_data->voice_feature_set == VOICE_FEATURE_SET_VOLUME_BOOST) {
5472 strlcpy(value, "on", sizeof(value));
5473 } else {
5474 strlcpy(value, "off", sizeof(value));
5475 }
5476
5477 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_VOLUME_BOOST, value);
5478 }
5479
Aalique Grahame37659862017-12-03 22:34:26 -08005480 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_DP_FOR_VOICE_USECASE,
5481 value, sizeof(value));
5482
5483 if (ret >= 0) {
5484 if (my_data->ext_disp_type == EXT_DISPLAY_TYPE_DP &&
5485 adev->dp_allowed_for_voice)
5486 strlcpy(value, "true", sizeof(value));
5487 else
5488 strlcpy(value, "false", sizeof(value));
5489
5490 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_DP_FOR_VOICE_USECASE, value);
5491 }
5492
Ben Rombergera04fabc2014-11-14 12:16:03 -08005493 /* Handle audio calibration keys */
5494 get_audiocal(platform, query, reply);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005495 native_audio_get_params(query, reply, value, sizeof(value));
Ben Rombergera04fabc2014-11-14 12:16:03 -08005496
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305497 ret = str_parms_get_str(query, AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED,
5498 value, sizeof(value));
5499 if (ret >= 0) {
5500 int isallowed = 1; /*true*/
5501
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07005502 if (property_get("vendor.voice.playback.conc.disabled", propValue, NULL)) {
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305503 prop_playback_enabled = atoi(propValue) ||
5504 !strncmp("true", propValue, 4);
5505 }
5506
Dhanalakshmi Siddania15c6792016-08-10 15:33:53 +05305507 if ((prop_playback_enabled && (voice_is_in_call(my_data->adev))) ||
Dhananjay Kumare6293dd2017-05-25 17:25:30 +05305508 (CARD_STATUS_OFFLINE == my_data->adev->card_status)) {
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305509 char *decoder_mime_type = value;
5510
5511 //check if unsupported mime type or not
5512 if(decoder_mime_type) {
Alexy Josephb1379942016-01-29 15:49:38 -08005513 unsigned int i = 0;
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305514 for (i = 0; i < sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]); i++) {
5515 if (!strncmp(decoder_mime_type, dsp_only_decoders_mime[i],
5516 strlen(dsp_only_decoders_mime[i]))) {
5517 ALOGD("Rejecting request for DSP only session from HAL during voice call/SSR state");
5518 isallowed = 0;
5519 break;
5520 }
5521 }
5522 }
5523 }
5524 str_parms_add_int(reply, AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED, isallowed);
5525 }
5526
Krishnankutty Kolathappilly061a9492014-01-31 18:12:13 -08005527 kv_pairs = str_parms_to_str(reply);
5528 ALOGV_IF(kv_pairs != NULL, "%s: exit: returns - %s", __func__, kv_pairs);
Narsinga Rao Chellacde45d12014-02-13 11:44:31 -08005529 free(kv_pairs);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07005530}
5531
Lakshman Chaluvaraju22ba9f12016-09-12 11:42:10 +05305532unsigned char* platform_get_license(void *platform, int *size)
5533{
5534 struct platform_data *my_data = (struct platform_data *)platform;
5535 char value[PROPERTY_VALUE_MAX] = {0};
5536 acdb_audio_cal_cfg_t cal;
5537 unsigned char *dptr = NULL;
5538 int ret=0;
5539 uint32_t param_len;
5540
5541 if (platform == NULL) {
5542 ALOGE("[%s] received null pointer %d ",__func__, __LINE__);
5543 ret = -EINVAL;
5544 goto done;
5545 }
5546 memset(&cal, 0, sizeof(cal));
5547 cal.persist = 1;
5548 cal.cal_type = AUDIO_CORE_METAINFO_CAL_TYPE;
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07005549 if (!property_get("vendor.audio.qaf.acdbid", value , "") && !atoi(value)) {
5550 ALOGE("[%s] vendor.audio.qaf.acdbid is not set %d ",__func__, __LINE__);
Lakshman Chaluvaraju22ba9f12016-09-12 11:42:10 +05305551 ret = -EINVAL;
5552 goto done;
5553 }
5554 cal.acdb_dev_id = (uint32_t) atoi (value);
5555 param_len = MAX_SET_CAL_BYTE_SIZE;
Sachin Mohan Gadage64c61e2017-07-17 18:11:16 +05305556 dptr = (unsigned char*) calloc(param_len, sizeof(unsigned char));
Lakshman Chaluvaraju22ba9f12016-09-12 11:42:10 +05305557 if (dptr == NULL) {
5558 ALOGE("[%s] Memory allocation failed for length %d",__func__,param_len);
5559 ret = -ENOMEM;
5560 goto done;
5561 }
5562 if (my_data->acdb_get_audio_cal != NULL) {
5563 ret = my_data->acdb_get_audio_cal((void*)&cal, (void*)dptr, &param_len);
5564 ALOGE("%s, ret[%d], param_len[%d] line %d", __func__, ret, param_len, __LINE__);
5565 if (ret == 0) {
5566 *size = param_len;
5567 return dptr;
5568 } else {
5569 *size = 0;
5570 }
5571 }
5572done:
5573 if (dptr != NULL)
5574 free(dptr);
5575
5576 return NULL;
5577}
5578
5579/* Delay in Us */
Ashish Jain5106d362016-05-11 19:23:33 +05305580/* Delay in Us, only to be used for PCM formats */
Haynes Mathew George7ff216f2013-09-11 19:51:41 -07005581int64_t platform_render_latency(audio_usecase_t usecase)
5582{
5583 switch (usecase) {
5584 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
5585 return DEEP_BUFFER_PLATFORM_DELAY;
5586 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
5587 return LOW_LATENCY_PLATFORM_DELAY;
Ashish Jain5106d362016-05-11 19:23:33 +05305588 case USECASE_AUDIO_PLAYBACK_OFFLOAD:
5589 case USECASE_AUDIO_PLAYBACK_OFFLOAD2:
5590 return PCM_OFFLOAD_PLATFORM_DELAY;
Haynes Mathew George5beddd42016-06-27 18:33:40 -07005591 case USECASE_AUDIO_PLAYBACK_ULL:
5592 return ULL_PLATFORM_DELAY;
Haynes Mathew George16081042017-05-31 17:16:49 -07005593 case USECASE_AUDIO_PLAYBACK_MMAP:
5594 return MMAP_PLATFORM_DELAY;
Haynes Mathew George7ff216f2013-09-11 19:51:41 -07005595 default:
5596 return 0;
5597 }
5598}
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07005599
Mingming Yine62d7842013-10-25 16:26:03 -07005600int platform_update_usecase_from_source(int source, int usecase)
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07005601{
Mingming Yinab429782013-11-07 11:16:55 -08005602 ALOGV("%s: input source :%d", __func__, source);
Mingming Yin12125e82015-10-26 20:40:36 -07005603 if (source == AUDIO_SOURCE_FM_TUNER)
Mingming Yine62d7842013-10-25 16:26:03 -07005604 usecase = USECASE_AUDIO_RECORD_FM_VIRTUAL;
5605 return usecase;
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07005606}
Kiran Kandide144c82013-11-20 15:58:32 -08005607
Dhananjay Kumar45b71742014-05-29 21:47:27 +05305608bool platform_listen_device_needs_event(snd_device_t snd_device)
Kiran Kandide144c82013-11-20 15:58:32 -08005609{
Dhananjay Kumar45b71742014-05-29 21:47:27 +05305610 bool needs_event = false;
5611
Kiran Kandide144c82013-11-20 15:58:32 -08005612 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
5613 (snd_device < SND_DEVICE_IN_END) &&
5614 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
Rohit kumarf4120402016-08-05 19:19:48 +05305615 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
5616 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
5617 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
Dhananjay Kumar45b71742014-05-29 21:47:27 +05305618 needs_event = true;
5619
5620 return needs_event;
5621}
5622
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07005623bool platform_listen_usecase_needs_event(audio_usecase_t uc_id __unused)
5624{
5625 return false;
5626}
5627
5628bool platform_sound_trigger_device_needs_event(snd_device_t snd_device)
5629{
5630 bool needs_event = false;
5631
5632 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
5633 (snd_device < SND_DEVICE_IN_END) &&
5634 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
Rohit kumarf4120402016-08-05 19:19:48 +05305635 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
5636 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
5637 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07005638 needs_event = true;
5639
5640 return needs_event;
5641}
5642
Quinn Malef15123f2017-04-27 18:58:05 -07005643bool platform_sound_trigger_usecase_needs_event(audio_usecase_t uc_id)
Dhananjay Kumar45b71742014-05-29 21:47:27 +05305644{
Quinn Malef15123f2017-04-27 18:58:05 -07005645 bool needs_event = false;
5646
5647 switch(uc_id){
5648 /* concurrent playback usecases needs event */
5649 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
5650 case USECASE_AUDIO_PLAYBACK_MULTI_CH:
5651 case USECASE_AUDIO_PLAYBACK_OFFLOAD:
5652 case USECASE_AUDIO_PLAYBACK_OFFLOAD2:
5653 needs_event = true;
5654 break;
5655 /* concurrent playback in low latency allowed */
5656 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
5657 break;
5658 /* concurrent playback FM needs event */
5659 case USECASE_AUDIO_PLAYBACK_FM:
5660 needs_event = true;
5661 break;
5662
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +05305663 /* concurrent capture usecases which needs event */
5664 case USECASE_AUDIO_RECORD:
5665 case USECASE_AUDIO_RECORD_LOW_LATENCY:
5666 case USECASE_AUDIO_RECORD_COMPRESS:
5667 case USECASE_AUDIO_RECORD_MMAP:
5668 case USECASE_AUDIO_RECORD_HIFI:
5669 case USECASE_VOICE_CALL:
5670 case USECASE_VOICE2_CALL:
5671 case USECASE_VOLTE_CALL:
5672 case USECASE_QCHAT_CALL:
5673 case USECASE_VOWLAN_CALL:
5674 case USECASE_VOICEMMODE1_CALL:
5675 case USECASE_VOICEMMODE2_CALL:
5676 case USECASE_COMPRESS_VOIP_CALL:
5677 case USECASE_AUDIO_RECORD_FM_VIRTUAL:
5678 case USECASE_INCALL_REC_UPLINK:
5679 case USECASE_INCALL_REC_DOWNLINK:
5680 case USECASE_INCALL_REC_UPLINK_AND_DOWNLINK:
5681 case USECASE_INCALL_REC_UPLINK_COMPRESS:
5682 case USECASE_INCALL_REC_DOWNLINK_COMPRESS:
5683 case USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS:
5684 case USECASE_INCALL_MUSIC_UPLINK:
5685 case USECASE_INCALL_MUSIC_UPLINK2:
5686 case USECASE_AUDIO_SPKR_CALIB_RX:
5687 case USECASE_AUDIO_SPKR_CALIB_TX:
5688 case USECASE_AUDIO_RECORD_VOIP:
5689 needs_event = true;
5690 break;
Quinn Malef15123f2017-04-27 18:58:05 -07005691 default:
5692 ALOGV("%s:usecase_id[%d] no need to raise event.", __func__, uc_id);
5693 }
5694 return needs_event;
Kiran Kandide144c82013-11-20 15:58:32 -08005695}
ApurupaPattapuc6a3a9e2014-01-10 14:46:02 -08005696
5697/* Read offload buffer size from a property.
5698 * If value is not power of 2 round it to
5699 * power of 2.
5700 */
5701uint32_t platform_get_compress_offload_buffer_size(audio_offload_info_t* info)
5702{
5703 char value[PROPERTY_VALUE_MAX] = {0};
5704 uint32_t fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE;
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07005705 if((property_get("vendor.audio.offload.buffer.size.kb", value, "")) &&
ApurupaPattapuc6a3a9e2014-01-10 14:46:02 -08005706 atoi(value)) {
5707 fragment_size = atoi(value) * 1024;
5708 }
5709
vivek mehta80a44292015-08-10 12:58:10 -07005710 /* Use incoming offload buffer size if default buffer size is less */
5711 if ((info != NULL) && (fragment_size < info->offload_buffer_size)) {
5712 ALOGI("%s:: Overwriting offload buffer size default:%d new:%d", __func__,
5713 fragment_size,
5714 info->offload_buffer_size);
5715 fragment_size = info->offload_buffer_size;
5716 }
5717
Ramjee Singh21ffaa82017-07-28 17:47:01 +05305718 if (info != NULL) {
5719 if (info->is_streaming && info->has_video) {
Preetam Singh Ranawatf5fbdd62016-09-29 18:38:31 +05305720 fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING;
5721 ALOGV("%s: offload fragment size reduced for AV streaming to %d",
5722 __func__, fragment_size);
5723 } else if (info->format == AUDIO_FORMAT_FLAC) {
5724 fragment_size = FLAC_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
5725 ALOGV("FLAC fragment size %d", fragment_size);
5726 } else if (info->format == AUDIO_FORMAT_DSD) {
5727 fragment_size = MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07005728 if((property_get("vendor.audio.native.dsd.buffer.size.kb", value, "")) &&
Preetam Singh Ranawatf5fbdd62016-09-29 18:38:31 +05305729 atoi(value))
5730 fragment_size = atoi(value) * 1024;
5731 ALOGV("DSD fragment size %d", fragment_size);
5732 }
ApurupaPattapuc6a3a9e2014-01-10 14:46:02 -08005733 }
5734
5735 fragment_size = ALIGN( fragment_size, 1024);
5736
5737 if(fragment_size < MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE)
5738 fragment_size = MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
5739 else if(fragment_size > MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE)
5740 fragment_size = MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
5741 ALOGV("%s: fragment_size %d", __func__, fragment_size);
5742 return fragment_size;
5743}
5744
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305745/*
Ashish Jainb26edfb2016-08-25 00:10:11 +05305746 * return backend_idx on which voice call is active
5747 */
5748static int platform_get_voice_call_backend(struct audio_device* adev)
5749{
5750 struct audio_usecase *uc = NULL;
5751 struct listnode *node;
5752 snd_device_t out_snd_device = SND_DEVICE_NONE;
5753
5754 int backend_idx = -1;
5755
5756 if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
5757 list_for_each(node, &adev->usecase_list) {
5758 uc = node_to_item(node, struct audio_usecase, list);
5759 if (uc && (uc->type == VOICE_CALL || uc->type == VOIP_CALL) && uc->stream.out) {
5760 out_snd_device = platform_get_output_snd_device(adev->platform, uc->stream.out);
5761 backend_idx = platform_get_backend_index(out_snd_device);
5762 break;
5763 }
5764 }
5765 }
5766 return backend_idx;
5767}
5768
5769/*
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305770 * configures afe with bit width and Sample Rate
5771 */
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305772static int platform_set_codec_backend_cfg(struct audio_device* adev,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305773 snd_device_t snd_device, struct audio_backend_cfg backend_cfg)
Mingming Yin3ee55c62014-08-04 14:23:35 -07005774{
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305775 int ret = -EINVAL;
Kuirong Wang0b947f72016-09-29 11:03:09 -07005776 int backend_idx = platform_get_backend_index(snd_device);
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08005777 struct platform_data *my_data = (struct platform_data *)adev->platform;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005778 backend_idx = platform_get_backend_index(snd_device);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305779 unsigned int bit_width = backend_cfg.bit_width;
5780 unsigned int sample_rate = backend_cfg.sample_rate;
5781 unsigned int channels = backend_cfg.channels;
5782 audio_format_t format = backend_cfg.format;
5783 bool passthrough_enabled = backend_cfg.passthrough_enabled;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305784 struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params;
5785
5786 /* Override the config params if client has already set them */
5787 adev_device_cfg_ptr += backend_idx;
5788 if (adev_device_cfg_ptr->use_client_dev_cfg) {
5789 ALOGV("%s::: Updating with the config set by client "
5790 "bitwidth %d, samplerate %d, channels %d format %d",
5791 __func__, adev_device_cfg_ptr->dev_cfg_params.bit_width,
5792 adev_device_cfg_ptr->dev_cfg_params.sample_rate,
5793 adev_device_cfg_ptr->dev_cfg_params.channels,
5794 adev_device_cfg_ptr->dev_cfg_params.format);
5795
5796 bit_width = adev_device_cfg_ptr->dev_cfg_params.bit_width;
5797 sample_rate = adev_device_cfg_ptr->dev_cfg_params.sample_rate;
5798 channels = adev_device_cfg_ptr->dev_cfg_params.channels;
5799 format = adev_device_cfg_ptr->dev_cfg_params.format;
5800 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305801
Siddartha Shaik44dd7702017-06-14 12:13:25 +05305802 ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d format %d"
Kuirong Wang0b947f72016-09-29 11:03:09 -07005803 ", backend_idx %d device (%s)", __func__, bit_width,
Siddartha Shaik44dd7702017-06-14 12:13:25 +05305804 sample_rate, channels, format, backend_idx,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305805 platform_get_snd_device_name(snd_device));
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08005806
Dhanalakshmi Siddanib678a802016-12-03 11:51:41 +05305807 if ((my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl) &&
5808 (bit_width != my_data->current_backend_cfg[backend_idx].bit_width)) {
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08005809
Kuirong Wang0b947f72016-09-29 11:03:09 -07005810 struct mixer_ctl *ctl = NULL;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005811 ctl = mixer_get_ctl_by_name(adev->mixer,
5812 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005813 if (!ctl) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305814 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
5815 __func__,
5816 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005817 return -EINVAL;
5818 }
5819
5820 if (bit_width == 24) {
Ashish Jain5106d362016-05-11 19:23:33 +05305821 if (format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
Kuirong Wang0b947f72016-09-29 11:03:09 -07005822 ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
Ashish Jain5106d362016-05-11 19:23:33 +05305823 else
Kuirong Wang0b947f72016-09-29 11:03:09 -07005824 ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08005825 } else if (bit_width == 32) {
Ashish Jain058165c2016-09-28 23:18:48 +05305826 ret = mixer_ctl_set_enum_by_string(ctl, "S32_LE");
Mingming Yin3ee55c62014-08-04 14:23:35 -07005827 } else {
Kuirong Wang0b947f72016-09-29 11:03:09 -07005828 ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
Mingming Yin3ee55c62014-08-04 14:23:35 -07005829 }
Kuirong Wang0b947f72016-09-29 11:03:09 -07005830 if ( ret < 0) {
5831 ALOGE("%s:becf: afe: fail for %s mixer set to %d bit for %x format", __func__,
5832 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
5833 } else {
5834 my_data->current_backend_cfg[backend_idx].bit_width = bit_width;
5835 ALOGD("%s:becf: afe: %s mixer set to %d bit for %x format", __func__,
5836 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
5837 }
5838 /* set the ret as 0 and not pass back to upper layer */
5839 ret = 0;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005840 }
5841
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305842 if ((my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl) &&
5843 (passthrough_enabled || (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate))) {
Mingming Yin3ee55c62014-08-04 14:23:35 -07005844 char *rate_str = NULL;
Kuirong Wang0b947f72016-09-29 11:03:09 -07005845 struct mixer_ctl *ctl = NULL;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005846
Preetam Singh Ranawat63c02ea2017-08-10 11:53:30 +05305847 if (backend_idx == USB_AUDIO_RX_BACKEND ||
5848 backend_idx == USB_AUDIO_TX_BACKEND) {
5849 switch (sample_rate) {
5850 case 32000:
5851 rate_str = "KHZ_32";
5852 break;
5853 case 8000:
5854 rate_str = "KHZ_8";
5855 break;
5856 case 11025:
5857 rate_str = "HZ_11P025";
5858 break;
5859 case 16000:
5860 rate_str = "KHZ_16";
5861 break;
5862 case 22050:
5863 rate_str = "KHZ_22P05";
5864 break;
5865 }
5866 }
5867
5868 if (rate_str == NULL) {
5869 switch (sample_rate) {
5870 case 32000:
Ralf Herzafb164f2018-07-03 07:08:07 +02005871 if (passthrough_enabled || (backend_idx == SPDIF_TX_BACKEND ) ||
5872 (backend_idx == HDMI_TX_BACKEND ) ||
5873 (backend_idx == HDMI_ARC_TX_BACKEND )) {
Preetam Singh Ranawat63c02ea2017-08-10 11:53:30 +05305874 rate_str = "KHZ_32";
5875 break;
5876 }
5877 case 48000:
5878 rate_str = "KHZ_48";
5879 break;
5880 case 44100:
5881 rate_str = "KHZ_44P1";
5882 break;
5883 case 64000:
5884 case 96000:
5885 rate_str = "KHZ_96";
5886 break;
5887 case 88200:
5888 rate_str = "KHZ_88P2";
5889 break;
5890 case 176400:
5891 rate_str = "KHZ_176P4";
5892 break;
5893 case 192000:
5894 rate_str = "KHZ_192";
5895 break;
5896 case 352800:
5897 rate_str = "KHZ_352P8";
5898 break;
5899 case 384000:
5900 rate_str = "KHZ_384";
5901 break;
5902 case 144000:
5903 if (passthrough_enabled) {
5904 rate_str = "KHZ_144";
5905 break;
5906 }
5907 default:
5908 rate_str = "KHZ_48";
Satish Babu Patakokilaa395a9e2016-11-01 12:18:49 +05305909 break;
5910 }
Mingming Yin3ee55c62014-08-04 14:23:35 -07005911 }
5912
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005913 ctl = mixer_get_ctl_by_name(adev->mixer,
5914 my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005915 if(!ctl) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305916 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
5917 __func__,
5918 my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005919 return -EINVAL;
5920 }
5921
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305922 ALOGD("%s:becf: afe: %s set to %s", __func__,
5923 my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl, rate_str);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005924 mixer_ctl_set_enum_by_string(ctl, rate_str);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005925 my_data->current_backend_cfg[backend_idx].sample_rate = sample_rate;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305926 ret = 0;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005927 }
Ashish Jainb26edfb2016-08-25 00:10:11 +05305928 if ((my_data->current_backend_cfg[backend_idx].channels_mixer_ctl) &&
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305929 (channels != my_data->current_backend_cfg[backend_idx].channels)) {
Kuirong Wang0b947f72016-09-29 11:03:09 -07005930 struct mixer_ctl *ctl = NULL;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305931 char *channel_cnt_str = NULL;
5932
5933 switch (channels) {
5934 case 8:
5935 channel_cnt_str = "Eight"; break;
5936 case 7:
5937 channel_cnt_str = "Seven"; break;
5938 case 6:
5939 channel_cnt_str = "Six"; break;
5940 case 5:
5941 channel_cnt_str = "Five"; break;
5942 case 4:
5943 channel_cnt_str = "Four"; break;
5944 case 3:
5945 channel_cnt_str = "Three"; break;
Kuirong Wang0b947f72016-09-29 11:03:09 -07005946 case 1:
5947 channel_cnt_str = "One"; break;
5948 case 2:
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305949 default:
5950 channel_cnt_str = "Two"; break;
5951 }
5952
5953 ctl = mixer_get_ctl_by_name(adev->mixer,
5954 my_data->current_backend_cfg[backend_idx].channels_mixer_ctl);
5955 if (!ctl) {
5956 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
5957 __func__,
5958 my_data->current_backend_cfg[backend_idx].channels_mixer_ctl);
5959 return -EINVAL;
5960 }
5961 mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
5962 my_data->current_backend_cfg[backend_idx].channels = channels;
Ashish Jainb26edfb2016-08-25 00:10:11 +05305963
5964 if (backend_idx == HDMI_RX_BACKEND)
5965 platform_set_edid_channels_configuration(adev->platform, channels);
5966
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305967 ALOGD("%s:becf: afe: %s set to %s ", __func__,
Kuirong Wang0b947f72016-09-29 11:03:09 -07005968 my_data->current_backend_cfg[backend_idx].channels_mixer_ctl,
5969 channel_cnt_str);
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305970 ret = 0;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305971 }
5972
Siddartha Shaik44dd7702017-06-14 12:13:25 +05305973 bool set_ext_disp_format = false, set_mi2s_tx_data_format = false;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005974 char *ext_disp_format = NULL;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305975
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005976 if (backend_idx == HDMI_RX_BACKEND) {
5977 ext_disp_format = "HDMI RX Format";
5978 set_ext_disp_format = true;
5979 } else if (backend_idx == DISP_PORT_RX_BACKEND) {
Garmond Leungade0f6d2017-02-03 15:56:10 -08005980 ext_disp_format = "Display Port RX Format";
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005981 set_ext_disp_format = true;
Ralf Herzafb164f2018-07-03 07:08:07 +02005982 } else if (backend_idx == SPDIF_TX_BACKEND) {
5983 ext_disp_format = "PRI SPDIF TX Format";
5984 set_mi2s_tx_data_format = true;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05305985 } else if (backend_idx == HDMI_TX_BACKEND) {
Ralf Herzafb164f2018-07-03 07:08:07 +02005986 if (!strncmp(platform_get_snd_device_backend_interface(snd_device),
5987 "SEC_MI2S_TX", sizeof("SEC_MI2S_TX")))
5988 ext_disp_format = "SEC MI2S TX Format";
5989 else
5990 ext_disp_format = "QUAT MI2S TX Format";
5991 set_mi2s_tx_data_format = true;
5992 } else if (backend_idx == HDMI_ARC_TX_BACKEND) {
5993 ext_disp_format = "SEC SPDIF TX Format";
Siddartha Shaik44dd7702017-06-14 12:13:25 +05305994 set_mi2s_tx_data_format = true;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005995 } else {
5996 ALOGV("%s: Format doesnt have to be set", __func__);
5997 }
5998
Siddartha Shaik44dd7702017-06-14 12:13:25 +05305999 format = format & AUDIO_FORMAT_MAIN_MASK;
6000 /* Set data format only if there is a change from PCM to compressed
6001 and vice versa */
6002 if (set_mi2s_tx_data_format && (format ^ my_data->current_backend_cfg[backend_idx].format)) {
6003 struct mixer_ctl *ctl = mixer_get_ctl_by_name(adev->mixer, ext_disp_format);
6004 if (!ctl) {
6005 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
6006 __func__, ext_disp_format);
6007 return -EINVAL;
6008 }
6009 if (format == AUDIO_FORMAT_PCM) {
Ralf Herzafb164f2018-07-03 07:08:07 +02006010 ALOGE("%s:Set %s to LPCM", __func__, ext_disp_format);
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306011 mixer_ctl_set_enum_by_string(ctl, "LPCM");
6012 } else {
Ralf Herzafb164f2018-07-03 07:08:07 +02006013 ALOGE("%s:Set %s to Compr", __func__, ext_disp_format);
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306014 mixer_ctl_set_enum_by_string(ctl, "Compr");
6015 }
6016 my_data->current_backend_cfg[backend_idx].format = format;
6017 }
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006018 if (set_ext_disp_format) {
6019 struct mixer_ctl *ctl = mixer_get_ctl_by_name(adev->mixer, ext_disp_format);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306020 if (!ctl) {
6021 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006022 __func__, ext_disp_format);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306023 return -EINVAL;
6024 }
6025
6026 if (passthrough_enabled) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006027 ALOGD("%s:Ext display compress format", __func__);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306028 mixer_ctl_set_enum_by_string(ctl, "Compr");
6029 } else {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006030 ALOGD("%s: Ext display PCM format", __func__);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306031 mixer_ctl_set_enum_by_string(ctl, "LPCM");
6032 }
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05306033 ret = 0;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306034 }
Mingming Yin3ee55c62014-08-04 14:23:35 -07006035 return ret;
6036}
6037
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306038/*
Satish Babu Patakokila5933e972017-08-24 12:22:08 +05306039 * Get the backend configuration for current snd device
6040 */
6041int platform_get_codec_backend_cfg(struct audio_device* adev,
6042 snd_device_t snd_device,
6043 struct audio_backend_cfg *backend_cfg)
6044{
6045 int backend_idx = platform_get_backend_index(snd_device);
6046 struct platform_data *my_data = (struct platform_data *)adev->platform;
6047
6048 backend_cfg->bit_width = my_data->current_backend_cfg[backend_idx].bit_width;
6049 backend_cfg->sample_rate =
6050 my_data->current_backend_cfg[backend_idx].sample_rate;
6051 backend_cfg->channels =
6052 my_data->current_backend_cfg[backend_idx].channels;
6053 backend_cfg->format =
6054 my_data->current_backend_cfg[backend_idx].format;
6055
6056 ALOGV("%s:becf: afe: bitwidth %d, samplerate %d channels %d format %d"
6057 ", backend_idx %d device (%s)", __func__, backend_cfg->bit_width,
6058 backend_cfg->sample_rate, backend_cfg->channels, backend_cfg->format,
6059 backend_idx, platform_get_snd_device_name(snd_device));
6060
6061 return 0;
6062}
6063
6064/*
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306065 *Validate the selected bit_width, sample_rate and channels using the edid
6066 *of the connected sink device.
6067 */
6068static void platform_check_hdmi_backend_cfg(struct audio_device* adev,
6069 struct audio_usecase* usecase,
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006070 int backend_idx,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306071 struct audio_backend_cfg *hdmi_backend_cfg)
6072{
6073 unsigned int bit_width;
6074 unsigned int sample_rate;
Manish Dewangan37864bc2017-06-09 12:28:37 +05306075 int channels, max_supported_channels = 0;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306076 struct platform_data *my_data = (struct platform_data *)adev->platform;
6077 edid_audio_info *edid_info = (edid_audio_info *)my_data->edid_info;
6078 bool passthrough_enabled = false;
6079
6080 bit_width = hdmi_backend_cfg->bit_width;
6081 sample_rate = hdmi_backend_cfg->sample_rate;
6082 channels = hdmi_backend_cfg->channels;
6083
6084
6085 ALOGI("%s:becf: HDMI: bitwidth %d, samplerate %d, channels %d"
6086 ", usecase = %d", __func__, bit_width,
6087 sample_rate, channels, usecase->id);
6088
6089 if (audio_extn_passthru_is_enabled() && audio_extn_passthru_is_active()
6090 && (usecase->stream.out->compr_config.codec->compr_passthr != 0)) {
6091 passthrough_enabled = true;
6092 ALOGI("passthrough is enabled for this stream");
6093 }
6094
6095 // For voice calls use default configuration i.e. 16b/48K, only applicable to
6096 // default backend
6097 if (!passthrough_enabled) {
6098
6099 max_supported_channels = platform_edid_get_max_channels(my_data);
6100
6101 //Check EDID info for supported samplerate
6102 if (!edid_is_supported_sr(edid_info,sample_rate)) {
Garmond Leung2f78a672016-11-07 16:27:40 -08006103 //check to see if current BE sample rate is supported by EDID
6104 //else assign the highest sample rate supported by EDID
6105 if (edid_is_supported_sr(edid_info,my_data->current_backend_cfg[backend_idx].sample_rate))
6106 sample_rate = my_data->current_backend_cfg[backend_idx].sample_rate;
6107 else
6108 sample_rate = edid_get_highest_supported_sr(edid_info);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306109 }
6110
6111 //Check EDID info for supported bit width
6112 if (!edid_is_supported_bps(edid_info,bit_width)) {
6113 //reset to current sample rate
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006114 bit_width = my_data->current_backend_cfg[backend_idx].bit_width;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306115 }
6116
6117 if (channels > max_supported_channels)
6118 channels = max_supported_channels;
6119
6120 } else {
Manish Dewangan37864bc2017-06-09 12:28:37 +05306121 channels = audio_extn_passthru_get_channel_count(usecase->stream.out);
6122 if (channels <= 0) {
6123 ALOGE("%s: becf: afe: HDMI backend using defalut channel %u",
6124 __func__, DEFAULT_HDMI_OUT_CHANNELS);
Ben Romberger1aaaf862017-04-06 17:49:46 -07006125 channels = DEFAULT_HDMI_OUT_CHANNELS;
Manish Dewangan37864bc2017-06-09 12:28:37 +05306126 }
Harsh Bansal026d97f2017-08-17 17:44:49 +05306127 if (((usecase->stream.out->format == AUDIO_FORMAT_E_AC3) ||
Ben Romberger1aaaf862017-04-06 17:49:46 -07006128 (usecase->stream.out->format == AUDIO_FORMAT_E_AC3_JOC) ||
Harsh Bansal026d97f2017-08-17 17:44:49 +05306129 (usecase->stream.out->format == AUDIO_FORMAT_DOLBY_TRUEHD))
6130 && (usecase->stream.out->compr_config.codec->compr_passthr == PASSTHROUGH)) {
Naresh Tanniru3a406772017-05-10 13:09:05 -07006131 sample_rate = sample_rate * 4;
6132 if (sample_rate > HDMI_PASSTHROUGH_MAX_SAMPLE_RATE)
6133 sample_rate = HDMI_PASSTHROUGH_MAX_SAMPLE_RATE;
6134 }
Ben Romberger1aaaf862017-04-06 17:49:46 -07006135
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306136 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
6137 /* We force route so that the BE format can be set to Compr */
6138 }
6139
6140 ALOGI("%s:becf: afe: HDMI backend: passthrough %d updated bit width: %d and sample rate: %d"
6141 "channels %d", __func__, passthrough_enabled , bit_width,
6142 sample_rate, channels);
6143
6144 hdmi_backend_cfg->bit_width = bit_width;
6145 hdmi_backend_cfg->sample_rate = sample_rate;
6146 hdmi_backend_cfg->channels = channels;
6147 hdmi_backend_cfg->passthrough_enabled = passthrough_enabled;
6148}
6149
6150/*
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306151 * goes through all the current usecases and picks the highest
6152 * bitwidth & samplerate
6153 */
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306154static bool platform_check_codec_backend_cfg(struct audio_device* adev,
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006155 struct audio_usecase* usecase,
6156 snd_device_t snd_device,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306157 struct audio_backend_cfg *backend_cfg)
Mingming Yin3ee55c62014-08-04 14:23:35 -07006158{
6159 bool backend_change = false;
6160 struct listnode *node;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006161 unsigned int bit_width;
6162 unsigned int sample_rate;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306163 unsigned int channels;
6164 bool passthrough_enabled = false;
Ashish Jain8c930292017-03-13 16:33:12 +05306165 bool voice_call_active = false;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006166 int backend_idx = DEFAULT_CODEC_BACKEND;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08006167 struct platform_data *my_data = (struct platform_data *)adev->platform;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306168 int na_mode = platform_get_native_support();
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306169 bool channels_updated = false;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05306170 struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08006171
Ashish Jainc597d102016-12-12 10:31:34 +05306172 /*BT devices backend is not configured from HAL hence skip*/
6173 if (snd_device == SND_DEVICE_OUT_BT_A2DP ||
6174 snd_device == SND_DEVICE_OUT_BT_SCO ||
Sachin Mohan Gadag2e4dcb12017-05-12 13:05:08 +05306175 snd_device == SND_DEVICE_OUT_BT_SCO_WB ||
6176 snd_device == SND_DEVICE_OUT_AFE_PROXY) {
Ashish Jainc597d102016-12-12 10:31:34 +05306177 backend_change = false;
6178 return backend_change;
6179 }
6180
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006181 backend_idx = platform_get_backend_index(snd_device);
6182
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306183 bit_width = backend_cfg->bit_width;
6184 sample_rate = backend_cfg->sample_rate;
6185 channels = backend_cfg->channels;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006186
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306187 ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306188 ", backend_idx %d usecase = %d device (%s)", __func__, bit_width,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306189 sample_rate, channels, backend_idx, usecase->id,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306190 platform_get_snd_device_name(snd_device));
Mingming Yin3ee55c62014-08-04 14:23:35 -07006191
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07006192 // For voice calls use default configuration i.e. 16b/48K, only applicable to
6193 // default backend
Mingming Yin3ee55c62014-08-04 14:23:35 -07006194 // force routing is not required here, caller will do it anyway
Ashish Jainb26edfb2016-08-25 00:10:11 +05306195 if (backend_idx == platform_get_voice_call_backend(adev)) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306196 ALOGW("%s:becf: afe:Use default bw and sr for voice/voip calls ",
6197 __func__);
Narsinga Rao Chella44376cc2014-10-24 13:27:14 -07006198 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
6199 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Ashish Jainb26edfb2016-08-25 00:10:11 +05306200 channels = CODEC_BACKEND_DEFAULT_CHANNELS;
Ashish Jain8c930292017-03-13 16:33:12 +05306201 voice_call_active = true;
Narsinga Rao Chella44376cc2014-10-24 13:27:14 -07006202 } else {
6203 /*
6204 * The backend should be configured at highest bit width and/or
6205 * sample rate amongst all playback usecases.
6206 * If the selected sample rate and/or bit width differ with
6207 * current backend sample rate and/or bit width, then, we set the
6208 * backend re-configuration flag.
6209 *
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306210 * Exception: 16 bit playbacks is allowed through 16 bit/48/44.1 khz backend only
Narsinga Rao Chella44376cc2014-10-24 13:27:14 -07006211 */
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306212 int i =0;
Mingming Yin3ee55c62014-08-04 14:23:35 -07006213 list_for_each(node, &adev->usecase_list) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306214 struct audio_usecase *uc;
6215 uc = node_to_item(node, struct audio_usecase, list);
6216 struct stream_out *out = (struct stream_out*) uc->stream.out;
6217 if (uc->type == PCM_PLAYBACK && out && usecase != uc) {
Preetam Singh Ranawataa37d3f2016-08-23 12:25:23 +05306218 unsigned int out_channels = audio_channel_count_from_out_mask(out->channel_mask);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006219
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306220 ALOGD("%s:napb: (%d) - (%s)id (%d) sr %d bw "
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306221 "(%d) ch (%d) device %s", __func__, i++, use_case_table[uc->id],
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306222 uc->id, out->sample_rate,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306223 out->bit_width, out_channels,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306224 platform_get_snd_device_name(uc->out_snd_device));
6225
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306226 if (platform_check_backends_match(snd_device, uc->out_snd_device)) {
Amit Shekhar278e3362014-09-08 14:08:19 -07006227 if (bit_width < out->bit_width)
6228 bit_width = out->bit_width;
6229 if (sample_rate < out->sample_rate)
6230 sample_rate = out->sample_rate;
Revathi Uddaraju869ae492018-02-09 16:27:35 +05306231 /*
6232 * TODO: Add Support for Backend configuration for devices which support
6233 * sample rate less than 44.1
6234 */
6235 if (sample_rate < OUTPUT_SAMPLING_RATE_44100)
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006236 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306237 if (channels < out_channels)
6238 channels = out_channels;
Mingming Yin3ee55c62014-08-04 14:23:35 -07006239 }
6240 }
6241 }
6242 }
6243
Ashish Jainb26edfb2016-08-25 00:10:11 +05306244 /* Native playback is preferred for Headphone/HS device over 192Khz */
Ashish Jain8c930292017-03-13 16:33:12 +05306245 if (!voice_call_active && codec_device_supports_native_playback(usecase->devices)) {
Ashish Jainb26edfb2016-08-25 00:10:11 +05306246 if (audio_is_true_native_stream_active(adev)) {
6247 if (check_hdset_combo_device(snd_device)) {
6248 /*
6249 * In true native mode Tasha has a limitation that one port at 44.1 khz
6250 * cannot drive both spkr and hdset, to simiplify the solution lets
6251 * move the AFE to 48khzwhen a ring tone selects combo device.
6252 * or if NATIVE playback is not enabled.
6253 */
6254 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
6255 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Ashish Jain8c930292017-03-13 16:33:12 +05306256 ALOGD("%s:becf: afe: port to run at 48k if combo device or in voice call"
6257 , __func__);
Ashish Jainb26edfb2016-08-25 00:10:11 +05306258 } else {
6259 /*
6260 * in single BE mode, if native audio playback
6261 * is active then it will take priority
6262 */
6263 sample_rate = OUTPUT_SAMPLING_RATE_44100;
6264 ALOGD("%s:becf: afe: true napb active set rate to 44.1 khz",
6265 __func__);
6266 }
Ashish Jain7f25be32016-10-25 21:44:16 +05306267 } else if (na_mode != NATIVE_AUDIO_MODE_MULTIPLE_44_1) {
6268 /*
6269 * Map native sampling rates to upper limit range
6270 * if multiple of native sampling rates are not supported.
6271 * This check also indicates that this is not tavil codec
6272 * And 32bit/384kHz is only supported on tavil
6273 * Hence reset 32b/384kHz to 24b/192kHz.
6274 */
6275 switch (sample_rate) {
6276 case 44100:
6277 sample_rate = 48000;
6278 break;
6279 case 88200:
6280 sample_rate = 96000;
6281 break;
6282 case 176400:
6283 case 352800:
6284 case 384000:
6285 sample_rate = 192000;
6286 break;
6287 }
6288 if (bit_width > 24)
6289 bit_width = 24;
6290
6291 ALOGD("%s:becf: afe: napb not active - set non fractional rate",
Ashish Jainb26edfb2016-08-25 00:10:11 +05306292 __func__);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006293 }
kunleizef820832018-08-10 11:08:03 +08006294 /*reset sample rate to 48khz if sample rate less than 44.1khz, or device backend dose not support 44.1 khz*/
6295 if ((sample_rate == OUTPUT_SAMPLING_RATE_44100 && backend_idx != HEADPHONE_44_1_BACKEND)
6296 || sample_rate < OUTPUT_SAMPLING_RATE_44100) {
6297 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
6298 ALOGD("%s:becf: afe: reset sample rate to default Sample Rate(48k)",__func__);
kunleiz22ca32a2018-06-20 13:55:46 +08006299 }
Ashish Jain6fced6e2017-01-09 14:13:22 +05306300 }
6301
6302 /*
6303 * Check if the device is speaker or handset,assumption handset shares
6304 * backend with speaker, and these devices are restricited to 48kHz.
6305 */
6306 if (platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device)) {
Ramu Gottipati074fa4d2018-09-11 20:05:51 +05306307 int bw = platform_get_snd_device_bit_width(SND_DEVICE_OUT_SPEAKER);
6308 if ((-ENOSYS != bw) && (bit_width > (uint32_t)bw)) {
6309 bit_width = (uint32_t)bw;
Ashish Jain058165c2016-09-28 23:18:48 +05306310 ALOGD("%s:becf: afe: reset bitwidth to %d (based on supported"
Ramu Gottipati074fa4d2018-09-11 20:05:51 +05306311 " value for this platform)", __func__, bit_width);
6312 } else if (-ENOSYS == bw) {
6313 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
6314 ALOGD("%s:becf: afe: reset to default bitwidth %d", __func__, bit_width);
Ashish Jain058165c2016-09-28 23:18:48 +05306315 }
Dieter Luecking5d57def2018-09-07 14:23:37 +02006316 /*
6317 * In case of CSRA speaker out, all sample rates are supported, so
6318 * check platform here
6319 */
6320 if (platform_spkr_use_default_sample_rate(adev->platform)) {
6321 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
6322 ALOGD("%s:becf: afe: playback on codec device not supporting native playback set "
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306323 "default Sample Rate(48k)", __func__);
Dieter Luecking5d57def2018-09-07 14:23:37 +02006324 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306325 }
6326
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08006327 if (backend_idx == USB_AUDIO_RX_BACKEND) {
Kuirong Wange9894162016-08-26 15:16:39 -07006328 audio_extn_usb_is_config_supported(&bit_width, &sample_rate, &channels, true);
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08006329 ALOGV("%s: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
6330 __func__, bit_width, sample_rate, channels);
Ashish Jainb26edfb2016-08-25 00:10:11 +05306331 if (channels != my_data->current_backend_cfg[backend_idx].channels)
6332 channels_updated = true;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08006333 }
6334
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006335 if (backend_idx == HDMI_RX_BACKEND || backend_idx == DISP_PORT_RX_BACKEND) {
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306336 struct audio_backend_cfg hdmi_backend_cfg;
6337 hdmi_backend_cfg.bit_width = bit_width;
6338 hdmi_backend_cfg.sample_rate = sample_rate;
6339 hdmi_backend_cfg.channels = channels;
6340 hdmi_backend_cfg.passthrough_enabled = false;
6341
Ashish Jain058165c2016-09-28 23:18:48 +05306342 /*
6343 * HDMI does not support 384Khz/32bit playback hence configure BE to 24b/192Khz
6344 * TODO: Instead have the validation against edid return the next best match
6345 */
6346 if (bit_width > 24)
6347 hdmi_backend_cfg.bit_width = 24;
6348 if (sample_rate > 192000)
6349 hdmi_backend_cfg.sample_rate = 192000;
6350
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006351 platform_check_hdmi_backend_cfg(adev, usecase, backend_idx, &hdmi_backend_cfg);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306352
6353 bit_width = hdmi_backend_cfg.bit_width;
6354 sample_rate = hdmi_backend_cfg.sample_rate;
6355 channels = hdmi_backend_cfg.channels;
6356 passthrough_enabled = hdmi_backend_cfg.passthrough_enabled;
6357
6358 if (channels != my_data->current_backend_cfg[backend_idx].channels)
6359 channels_updated = true;
Mingming Yinddd610b2016-01-20 17:09:32 -08006360 }
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306361
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306362 ALOGI("%s:becf: afe: Codec selected backend: %d updated bit width: %d and sample rate: %d",
6363 __func__, backend_idx , bit_width, sample_rate);
Mingming Yinddd610b2016-01-20 17:09:32 -08006364
Mingming Yin3ee55c62014-08-04 14:23:35 -07006365 // Force routing if the expected bitwdith or samplerate
6366 // is not same as current backend comfiguration
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006367 if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306368 (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
6369 passthrough_enabled || channels_updated) {
6370 backend_cfg->bit_width = bit_width;
6371 backend_cfg->sample_rate = sample_rate;
6372 backend_cfg->channels = channels;
6373 backend_cfg->passthrough_enabled = passthrough_enabled;
Mingming Yin3ee55c62014-08-04 14:23:35 -07006374 backend_change = true;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306375 ALOGI("%s:becf: afe: Codec backend needs to be updated. new bit width: %d"
6376 "new sample rate: %d new channels: %d",
6377 __func__, backend_cfg->bit_width, backend_cfg->sample_rate, backend_cfg->channels);
Mingming Yin3ee55c62014-08-04 14:23:35 -07006378 }
6379
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05306380 // Force routing if the client sends config params for this backend
6381 adev_device_cfg_ptr += backend_idx;
6382 if (adev_device_cfg_ptr->use_client_dev_cfg) {
6383 ALOGV("%s: Codec backend needs to be updated as Client provided "
6384 "config params", __func__);
6385 backend_change = true;
6386 }
6387
Preetam Singh Ranawatdc1a3952016-11-24 17:35:51 +05306388 if (snd_device == SND_DEVICE_OUT_HEADPHONES || snd_device ==
6389 SND_DEVICE_OUT_HEADPHONES_44_1) {
6390 if (sample_rate > 48000 ||
6391 (bit_width >= 24 && (sample_rate == 48000 || sample_rate == 44100))) {
6392 ALOGI("%s: apply HPH HQ mode\n", __func__);
6393 audio_route_apply_and_update_path(adev->audio_route, "hph-highquality-mode");
6394 } else {
6395 ALOGI("%s: apply HPH LP mode\n", __func__);
6396 audio_route_apply_and_update_path(adev->audio_route, "hph-lowpower-mode");
6397 }
6398 }
6399
Mingming Yin3ee55c62014-08-04 14:23:35 -07006400 return backend_change;
6401}
6402
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006403bool platform_check_and_set_codec_backend_cfg(struct audio_device* adev,
6404 struct audio_usecase *usecase, snd_device_t snd_device)
Mingming Yin3ee55c62014-08-04 14:23:35 -07006405{
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006406 int backend_idx = DEFAULT_CODEC_BACKEND;
Siena Richard7c2db772016-12-21 11:32:34 -08006407 int new_snd_devices[SND_DEVICE_OUT_END] = {0};
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306408 int i, num_devices = 1;
6409 bool ret = false;
6410 struct platform_data *my_data = (struct platform_data *)adev->platform;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306411 struct audio_backend_cfg backend_cfg;
Mingming Yin3ee55c62014-08-04 14:23:35 -07006412
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006413 backend_idx = platform_get_backend_index(snd_device);
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08006414
Surendar Karka93cd25a2018-08-28 14:21:37 +05306415 if (usecase->type == TRANSCODE_LOOPBACK_RX) {
Siddartha Shaik31b530e2017-05-19 15:26:33 +05306416 backend_cfg.bit_width = usecase->stream.inout->out_config.bit_width;
6417 backend_cfg.sample_rate = usecase->stream.inout->out_config.sample_rate;
6418 backend_cfg.format = usecase->stream.inout->out_config.format;
6419 backend_cfg.channels = audio_channel_count_from_out_mask(
6420 usecase->stream.inout->out_config.channel_mask);
6421 } else {
6422 backend_cfg.bit_width = usecase->stream.out->bit_width;
6423 backend_cfg.sample_rate = usecase->stream.out->sample_rate;
6424 backend_cfg.format = usecase->stream.out->format;
6425 backend_cfg.channels = audio_channel_count_from_out_mask(usecase->stream.out->channel_mask);
6426 }
Xiaojun Sang785b5da2017-08-03 15:52:29 +08006427 if (audio_extn_is_dsp_bit_width_enforce_mode_supported(usecase->stream.out->flags) &&
6428 (adev->dsp_bit_width_enforce_mode > backend_cfg.bit_width))
6429 backend_cfg.bit_width = adev->dsp_bit_width_enforce_mode;
Siddartha Shaik31b530e2017-05-19 15:26:33 +05306430
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306431 /*this is populated by check_codec_backend_cfg hence set default value to false*/
6432 backend_cfg.passthrough_enabled = false;
Mingming Yin3ee55c62014-08-04 14:23:35 -07006433
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05306434 /* Set Backend sampling rate to 176.4 for DSD64 and
6435 * 352.8Khz for DSD128.
6436 * Set Bit Width to 16
6437 */
6438 if ((backend_idx == DSD_NATIVE_BACKEND) && (backend_cfg.format == AUDIO_FORMAT_DSD)) {
6439 backend_cfg.bit_width = 16;
6440 if (backend_cfg.sample_rate == INPUT_SAMPLING_RATE_DSD64)
6441 backend_cfg.sample_rate = OUTPUT_SAMPLING_RATE_DSD64;
6442 else if (backend_cfg.sample_rate == INPUT_SAMPLING_RATE_DSD128)
6443 backend_cfg.sample_rate = OUTPUT_SAMPLING_RATE_DSD128;
6444 }
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306445 ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
6446 ", backend_idx %d usecase = %d device (%s)", __func__, backend_cfg.bit_width,
6447 backend_cfg.sample_rate, backend_cfg.channels, backend_idx, usecase->id,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306448 platform_get_snd_device_name(snd_device));
6449
Surendar Karka45850ae2018-07-02 17:45:27 +05306450 if ((my_data->spkr_ch_map != NULL) &&
6451 (platform_get_backend_index(snd_device) == DEFAULT_CODEC_BACKEND))
6452 platform_set_channel_map(my_data, my_data->spkr_ch_map->num_ch,
6453 my_data->spkr_ch_map->chmap, -1);
6454
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07006455 if (platform_split_snd_device(my_data, snd_device, &num_devices,
6456 new_snd_devices) < 0)
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306457 new_snd_devices[0] = snd_device;
6458
6459 for (i = 0; i < num_devices; i++) {
6460 ALOGI("%s: new_snd_devices[%d] is %d", __func__, i, new_snd_devices[i]);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306461 if ((platform_check_codec_backend_cfg(adev, usecase, new_snd_devices[i],
kunleizef820832018-08-10 11:08:03 +08006462 &backend_cfg))) {
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05306463 ret = platform_set_codec_backend_cfg(adev, new_snd_devices[i],
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306464 backend_cfg);
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05306465 if (!ret) {
6466 ret = true;
6467 } else {
6468 ret = false;
6469 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306470 }
Mingming Yin3ee55c62014-08-04 14:23:35 -07006471 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306472 return ret;
Mingming Yin3ee55c62014-08-04 14:23:35 -07006473}
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07006474
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306475/*
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306476 * goes through all the current usecases and picks the highest
6477 * bitwidth & samplerate
6478 */
Kuirong Wange9894162016-08-26 15:16:39 -07006479static bool platform_check_capture_codec_backend_cfg(struct audio_device* adev,
6480 int backend_idx,
6481 struct audio_backend_cfg *backend_cfg)
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306482{
6483 bool backend_change = false;
6484 unsigned int bit_width;
6485 unsigned int sample_rate;
Kuirong Wange9894162016-08-26 15:16:39 -07006486 unsigned int channels;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306487 unsigned int format;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306488 struct platform_data *my_data = (struct platform_data *)adev->platform;
6489
Kuirong Wange9894162016-08-26 15:16:39 -07006490 bit_width = backend_cfg->bit_width;
6491 sample_rate = backend_cfg->sample_rate;
6492 channels = backend_cfg->channels;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306493 format = backend_cfg->format;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306494
6495 ALOGI("%s:txbecf: afe: Codec selected backend: %d current bit width: %d and "
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306496 "sample rate: %d, channels %d format %d",__func__,backend_idx, bit_width,
6497 sample_rate, channels,format);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306498
6499 // For voice calls use default configuration i.e. 16b/48K, only applicable to
6500 // default backend
6501 // force routing is not required here, caller will do it anyway
Preetam Singh Ranawatd770a362017-05-24 19:07:15 +05306502 if ((voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION)
6503 || (my_data->is_internal_codec)) {
6504
Kuirong Wang0b947f72016-09-29 11:03:09 -07006505 ALOGW("%s:txbecf: afe: Use default bw and sr for voice/voip calls and "
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306506 "for unprocessed/camera source", __func__);
6507 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
6508 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Dhananjay Kumar9983c372016-12-09 22:00:40 +05306509 channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
6510 } else {
6511 struct listnode *node;
6512 struct audio_usecase *uc = NULL;
6513 unsigned int uc_channels = 0;
6514 struct stream_in *in = NULL;
6515 /* update cfg against other existing capture usecases on same backend */
6516 list_for_each(node, &adev->usecase_list) {
6517 uc = node_to_item(node, struct audio_usecase, list);
Satya Krishna Pindiproli9f566672017-02-28 11:14:01 +05306518 in = (struct stream_in *) uc->stream.in;
6519 if (in != NULL && uc->type == PCM_CAPTURE &&
Dhananjay Kumar9983c372016-12-09 22:00:40 +05306520 backend_idx == platform_get_backend_index(uc->in_snd_device)) {
Dhananjay Kumar9983c372016-12-09 22:00:40 +05306521 uc_channels = audio_channel_count_from_in_mask(in->channel_mask);
6522
6523 ALOGV("%s:txbecf: uc %s, id %d, sr %d, bw %d, ch %d, device %s",
6524 __func__, use_case_table[uc->id], uc->id, in->sample_rate,
6525 in->bit_width, uc_channels,
6526 platform_get_snd_device_name(uc->in_snd_device));
6527
6528 if (sample_rate < in->sample_rate)
6529 sample_rate = in->sample_rate;
6530 if (bit_width < in->bit_width)
6531 bit_width = in->bit_width;
6532 if (channels < uc_channels)
6533 channels = uc_channels;
6534 }
6535 }
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306536 }
Kuirong Wange9894162016-08-26 15:16:39 -07006537 if (backend_idx == USB_AUDIO_TX_BACKEND) {
6538 audio_extn_usb_is_config_supported(&bit_width, &sample_rate, &channels, false);
Kuirong Wang0b947f72016-09-29 11:03:09 -07006539 ALOGV("%s:txbecf: afe: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
Kuirong Wange9894162016-08-26 15:16:39 -07006540 __func__, bit_width, sample_rate, channels);
6541 }
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306542
6543 ALOGI("%s:txbecf: afe: Codec selected backend: %d updated bit width: %d and "
6544 "sample rate: %d", __func__, backend_idx, bit_width, sample_rate);
6545 // Force routing if the expected bitwdith or samplerate
6546 // is not same as current backend comfiguration
Kuirong Wang0b947f72016-09-29 11:03:09 -07006547 if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
6548 (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306549 (channels != my_data->current_backend_cfg[backend_idx].channels) ||
6550 ((format & AUDIO_FORMAT_MAIN_MASK) != my_data->current_backend_cfg[backend_idx].format)) {
Kuirong Wange9894162016-08-26 15:16:39 -07006551 backend_cfg->bit_width = bit_width;
6552 backend_cfg->sample_rate= sample_rate;
Kuirong Wang0b947f72016-09-29 11:03:09 -07006553 backend_cfg->channels = channels;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306554 backend_cfg->format = format & AUDIO_FORMAT_MAIN_MASK;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306555 backend_change = true;
6556 ALOGI("%s:txbecf: afe: Codec backend needs to be updated. new bit width: %d "
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306557 "new sample rate: %d new channel: %d new format: %d",
Kuirong Wang0b947f72016-09-29 11:03:09 -07006558 __func__, backend_cfg->bit_width,
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306559 backend_cfg->sample_rate, backend_cfg->channels, backend_cfg->format);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306560 }
6561
6562 return backend_change;
6563}
6564
6565bool platform_check_and_set_capture_codec_backend_cfg(struct audio_device* adev,
6566 struct audio_usecase *usecase, snd_device_t snd_device)
6567{
Kuirong Wang0b947f72016-09-29 11:03:09 -07006568 int backend_idx = platform_get_backend_index(snd_device);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306569 int ret = 0;
Kuirong Wange9894162016-08-26 15:16:39 -07006570 struct audio_backend_cfg backend_cfg;
6571
6572 backend_cfg.passthrough_enabled = false;
Siddartha Shaik31b530e2017-05-19 15:26:33 +05306573
Surendar Karka93cd25a2018-08-28 14:21:37 +05306574 if (usecase->type == TRANSCODE_LOOPBACK_TX) {
Siddartha Shaik31b530e2017-05-19 15:26:33 +05306575 backend_cfg.bit_width = usecase->stream.inout->in_config.bit_width;
6576 backend_cfg.sample_rate = usecase->stream.inout->in_config.sample_rate;
6577 backend_cfg.format = usecase->stream.inout->in_config.format;
6578 backend_cfg.channels = audio_channel_count_from_out_mask(
6579 usecase->stream.inout->in_config.channel_mask);
6580 } else if (usecase->type == PCM_CAPTURE) {
Kuirong Wange9894162016-08-26 15:16:39 -07006581 backend_cfg.sample_rate= usecase->stream.in->sample_rate;
6582 backend_cfg.bit_width= usecase->stream.in->bit_width;
6583 backend_cfg.format= usecase->stream.in->format;
6584 backend_cfg.channels = audio_channel_count_from_in_mask(usecase->stream.in->channel_mask);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306585 } else {
Kuirong Wange9894162016-08-26 15:16:39 -07006586 backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
6587 backend_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
6588 backend_cfg.format = AUDIO_FORMAT_PCM_16_BIT;
6589 backend_cfg.channels = 1;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306590 }
6591
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306592 ALOGI("%s:txbecf: afe: bitwidth %d, samplerate %d, channel %d format %d"
Kuirong Wange9894162016-08-26 15:16:39 -07006593 ", backend_idx %d usecase = %d device (%s)", __func__,
6594 backend_cfg.bit_width,
6595 backend_cfg.sample_rate,
6596 backend_cfg.channels,
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306597 backend_cfg.format,
Kuirong Wange9894162016-08-26 15:16:39 -07006598 backend_idx, usecase->id,
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306599 platform_get_snd_device_name(snd_device));
Kuirong Wange9894162016-08-26 15:16:39 -07006600 if (platform_check_capture_codec_backend_cfg(adev, backend_idx,
6601 &backend_cfg)) {
Kuirong Wang0b947f72016-09-29 11:03:09 -07006602 ret = platform_set_codec_backend_cfg(adev, snd_device,
6603 backend_cfg);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306604 if(!ret)
6605 return true;
6606 }
6607
6608 return false;
6609}
6610
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306611int platform_set_snd_device_backend(snd_device_t device, const char *backend_tag,
6612 const char * hw_interface)
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07006613{
6614 int ret = 0;
6615
6616 if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
6617 ALOGE("%s: Invalid snd_device = %d",
6618 __func__, device);
6619 ret = -EINVAL;
6620 goto done;
6621 }
6622
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306623 ALOGD("%s: backend_tag_table[%s]: old = %s new = %s", __func__,
6624 platform_get_snd_device_name(device),
6625 backend_tag_table[device] != NULL ? backend_tag_table[device]: "null",
6626 backend_tag);
Ashish Jaind150d4c2017-02-03 18:44:34 +05306627
6628 if (backend_tag != NULL ) {
6629 if (backend_tag_table[device]) {
6630 free(backend_tag_table[device]);
6631 }
6632 backend_tag_table[device] = strdup(backend_tag);
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07006633 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306634
6635 if (hw_interface != NULL) {
6636 if (hw_interface_table[device])
6637 free(hw_interface_table[device]);
6638
6639 ALOGD("%s: hw_interface_table[%d] = %s", __func__, device, hw_interface);
6640 hw_interface_table[device] = strdup(hw_interface);
6641 }
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07006642done:
6643 return ret;
6644}
6645
Naresh Tanniru6160c712017-04-17 15:43:48 +05306646const char *platform_get_snd_device_backend_interface(snd_device_t device)
6647{
6648 const char *hw_interface_name = NULL;
6649
6650 if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
6651 ALOGE("%s: Invalid snd_device = %d",
6652 __func__, device);
6653 goto done;
6654 }
6655
6656 /* Get string value of necessary backend for device */
6657 hw_interface_name = hw_interface_table[device];
6658 if (hw_interface_name == NULL)
6659 ALOGE("%s: no hw_interface set for device %d\n", __func__, device);
6660 else
6661 ALOGD("%s: hw_interface set for device %s\n", __func__, hw_interface_name);
6662done:
6663 return hw_interface_name;
6664}
6665
Siena Richard7c2db772016-12-21 11:32:34 -08006666int platform_get_snd_device_backend_index(snd_device_t device)
6667{
6668 int i, be_dai_id;
6669 const char * hw_interface_name = NULL;
6670
6671 ALOGV("%s: enter with device %d\n", __func__, device);
6672
Aditya Bavanari701a6992017-03-30 19:17:16 +05306673 if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
Siena Richard7c2db772016-12-21 11:32:34 -08006674 ALOGE("%s: Invalid snd_device = %d",
6675 __func__, device);
6676 be_dai_id = -EINVAL;
6677 goto done;
6678 }
6679
6680 /* Get string value of necessary backend for device */
6681 hw_interface_name = hw_interface_table[device];
6682 if (hw_interface_name == NULL) {
6683 ALOGE("%s: no hw_interface set for device %d\n", __func__, device);
6684 be_dai_id = -EINVAL;
6685 goto done;
6686 }
6687
6688 /* Check if be dai name table was retrieved successfully */
6689 if (be_dai_name_table == NULL) {
6690 ALOGE("%s: BE DAI Name Table is not present\n", __func__);
6691 be_dai_id = -EFAULT;
6692 goto done;
6693 }
6694
6695 /* Get backend ID for device specified */
6696 for (i = 0; i < max_be_dai_names; i++) {
6697 if (strcmp(hw_interface_name, be_dai_name_table[i].be_name) == 0) {
6698 be_dai_id = be_dai_name_table[i].be_id;
6699 goto done;
6700 }
6701 }
6702 ALOGE("%s: no interface matching name %s\n", __func__, hw_interface_name);
6703 be_dai_id = -EINVAL;
6704 goto done;
6705
6706done:
6707 return be_dai_id;
6708}
6709
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07006710int platform_set_usecase_pcm_id(audio_usecase_t usecase, int32_t type, int32_t pcm_id)
6711{
6712 int ret = 0;
6713 if ((usecase <= USECASE_INVALID) || (usecase >= AUDIO_USECASE_MAX)) {
6714 ALOGE("%s: invalid usecase case idx %d", __func__, usecase);
6715 ret = -EINVAL;
6716 goto done;
6717 }
6718
6719 if ((type != 0) && (type != 1)) {
6720 ALOGE("%s: invalid usecase type", __func__);
6721 ret = -EINVAL;
6722 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306723 ALOGV("%s: pcm_device_table[%d][%d] = %d", __func__, usecase, type, pcm_id);
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07006724 pcm_device_table[usecase][type] = pcm_id;
6725done:
6726 return ret;
6727}
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07006728
6729void platform_get_device_to_be_id_map(int **device_to_be_id, int *length)
6730{
Alexy Josephb1379942016-01-29 15:49:38 -08006731 *device_to_be_id = (int*) msm_device_to_be_id;
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07006732 *length = msm_be_id_array_len;
6733}
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306734
Varun Balaraje49253e2017-07-06 19:48:56 +05306735int platform_set_stream_pan_scale_params(void *platform,
6736 int snd_id,
6737 struct mix_matrix_params mm_params)
6738{
6739 struct platform_data *my_data = (struct platform_data *)platform;
6740 struct audio_device *adev = my_data->adev;
6741 struct mixer_ctl *ctl = NULL;
6742 char mixer_ctl_name[MIXER_PATH_MAX_LENGTH] = {0};
6743 int ret = 0;
6744 int iter_i = 0;
6745 int iter_j = 0;
6746 int length = 0;
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306747 char *pan_scale_data = NULL;
Varun Balaraje49253e2017-07-06 19:48:56 +05306748
6749 snprintf(mixer_ctl_name, sizeof(mixer_ctl_name),
6750 "Audio Stream %d Pan Scale Control", snd_id);
6751 ALOGD("%s mixer_ctl_name:%s", __func__, mixer_ctl_name);
6752
6753 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
6754 if (!ctl) {
6755 ALOGE("%s: Could not get ctl for mixer cmd - %s",
6756 __func__, mixer_ctl_name);
6757 ret = -EINVAL;
6758 goto end;
6759 }
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306760 pan_scale_data = (char *) calloc(1, sizeof(mm_params));
Nikhil Latukar2e6f6242017-08-15 13:37:07 +05306761 if (!pan_scale_data) {
6762 ret = -ENOMEM;
6763 goto end;
6764 }
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306765 memcpy(&pan_scale_data[length], &mm_params.num_output_channels,
6766 sizeof(mm_params.num_output_channels));
6767 length += sizeof(mm_params.num_output_channels);
6768 memcpy(&pan_scale_data[length], &mm_params.num_input_channels,
6769 sizeof(mm_params.num_input_channels));
6770 length += sizeof(mm_params.num_input_channels);
Varun Balaraje49253e2017-07-06 19:48:56 +05306771
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306772 memcpy(&pan_scale_data[length], &mm_params.has_output_channel_map,
6773 sizeof(mm_params.has_output_channel_map));
6774 length += sizeof(mm_params.has_output_channel_map);
Varun Balaraje49253e2017-07-06 19:48:56 +05306775 if (mm_params.has_output_channel_map &&
6776 mm_params.num_output_channels <= MAX_CHANNELS_SUPPORTED &&
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306777 mm_params.num_output_channels > 0) {
6778 memcpy(&pan_scale_data[length], mm_params.output_channel_map,
6779 (mm_params.num_output_channels * sizeof(mm_params.output_channel_map[0])));
6780 length += (mm_params.num_output_channels * sizeof(mm_params.output_channel_map[0]));
6781 } else {
Varun Balaraje49253e2017-07-06 19:48:56 +05306782 ret = -EINVAL;
6783 goto end;
6784 }
6785
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306786 memcpy(&pan_scale_data[length], &mm_params.has_input_channel_map,
6787 sizeof(mm_params.has_input_channel_map));
6788 length += sizeof(mm_params.has_input_channel_map);
Varun Balaraje49253e2017-07-06 19:48:56 +05306789 if (mm_params.has_input_channel_map &&
6790 mm_params.num_input_channels <= MAX_CHANNELS_SUPPORTED &&
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306791 mm_params.num_input_channels > 0) {
6792 memcpy(&pan_scale_data[length], mm_params.input_channel_map,
6793 (mm_params.num_input_channels * sizeof(mm_params.input_channel_map[0])));
6794 length += (mm_params.num_input_channels * sizeof(mm_params.input_channel_map[0]));
6795 } else {
Varun Balaraje49253e2017-07-06 19:48:56 +05306796 ret = -EINVAL;
6797 goto end;
6798 }
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306799 pan_scale_data[length] = mm_params.has_mixer_coeffs;
6800 length += sizeof(mm_params.has_mixer_coeffs);
Varun Balaraje49253e2017-07-06 19:48:56 +05306801 if (mm_params.has_mixer_coeffs)
6802 for (iter_i = 0; iter_i < mm_params.num_output_channels; iter_i++)
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306803 for (iter_j = 0; iter_j < mm_params.num_input_channels; iter_j++) {
6804 memcpy(&pan_scale_data[length],
6805 &mm_params.mixer_coeffs[iter_i][iter_j],
6806 (sizeof(mm_params.mixer_coeffs[0][0])));
6807 length += (sizeof(mm_params.mixer_coeffs[0][0]));
6808 }
Varun Balaraje49253e2017-07-06 19:48:56 +05306809
6810 ret = mixer_ctl_set_array(ctl, pan_scale_data, length);
6811end:
Nikhil Latukar2e6f6242017-08-15 13:37:07 +05306812 if (pan_scale_data)
6813 free(pan_scale_data);
Varun Balaraje49253e2017-07-06 19:48:56 +05306814 return ret;
6815}
6816
6817int platform_set_stream_downmix_params(void *platform,
6818 int snd_id,
6819 snd_device_t snd_device,
6820 struct mix_matrix_params mm_params)
6821{
6822 struct platform_data *my_data = (struct platform_data *)platform;
6823 struct audio_device *adev = my_data->adev;
6824 struct mixer_ctl *ctl;
6825 char mixer_ctl_name[MIXER_PATH_MAX_LENGTH] = {0};
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306826 char *downmix_param_data = NULL;
Varun Balaraje49253e2017-07-06 19:48:56 +05306827 int ret = 0;
6828 int iter_i = 0;
6829 int iter_j = 0;
6830 int length = 0;
6831 int be_idx = 0;
6832
Varun Balaraje49253e2017-07-06 19:48:56 +05306833 snprintf(mixer_ctl_name, sizeof(mixer_ctl_name),
6834 "Audio Device %d Downmix Control", snd_id);
6835 ALOGD("%s mixer_ctl_name:%s", __func__, mixer_ctl_name);
6836
6837 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
6838 if (!ctl) {
6839 ALOGE("%s: Could not get ctl for mixer cmd - %s",
6840 __func__, mixer_ctl_name);
6841 ret = -EINVAL;
6842 }
6843
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306844 downmix_param_data = (char *) calloc(1, sizeof(mm_params) + sizeof(be_idx));
Nikhil Latukar2e6f6242017-08-15 13:37:07 +05306845 if (!downmix_param_data) {
6846 ret = -ENOMEM;
6847 goto end;
6848 }
Varun Balaraje49253e2017-07-06 19:48:56 +05306849 be_idx = platform_get_snd_device_backend_index(snd_device);
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306850 memcpy(&downmix_param_data[length], &be_idx, sizeof(be_idx));
6851 length += sizeof(be_idx);
6852 memcpy(&downmix_param_data[length], &mm_params.num_output_channels,
6853 sizeof(mm_params.num_output_channels));
6854 length += sizeof(mm_params.num_output_channels);
6855 memcpy(&downmix_param_data[length], &mm_params.num_input_channels,
6856 sizeof(mm_params.num_input_channels));
6857 length += sizeof(mm_params.num_input_channels);
Varun Balaraje49253e2017-07-06 19:48:56 +05306858
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306859 memcpy(&downmix_param_data[length], &mm_params.has_output_channel_map,
6860 sizeof(mm_params.has_output_channel_map));
6861 length += sizeof(mm_params.has_output_channel_map);
Varun Balaraje49253e2017-07-06 19:48:56 +05306862 if (mm_params.has_output_channel_map &&
6863 mm_params.num_output_channels <= MAX_CHANNELS_SUPPORTED &&
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306864 mm_params.num_output_channels > 0) {
6865 memcpy(&downmix_param_data[length], mm_params.output_channel_map,
6866 (mm_params.num_output_channels * sizeof(mm_params.output_channel_map[0])));
6867 length += (mm_params.num_output_channels * sizeof(mm_params.output_channel_map[0]));
6868 } else {
Varun Balaraje49253e2017-07-06 19:48:56 +05306869 ret = -EINVAL;
6870 goto end;
6871 }
6872
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306873 memcpy(&downmix_param_data[length], &mm_params.has_input_channel_map,
6874 sizeof(mm_params.has_input_channel_map));
6875 length += sizeof(mm_params.has_input_channel_map);
Varun Balaraje49253e2017-07-06 19:48:56 +05306876 if (mm_params.has_input_channel_map &&
6877 mm_params.num_input_channels <= MAX_CHANNELS_SUPPORTED &&
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306878 mm_params.num_input_channels > 0) {
6879 memcpy(&downmix_param_data[length], mm_params.input_channel_map,
6880 (mm_params.num_input_channels * sizeof(mm_params.input_channel_map[0])));
6881 length += (mm_params.num_input_channels * sizeof(mm_params.input_channel_map[0]));
6882 } else {
Varun Balaraje49253e2017-07-06 19:48:56 +05306883 ret = -EINVAL;
6884 goto end;
6885 }
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306886 memcpy(&downmix_param_data[length], &mm_params.has_mixer_coeffs,
6887 sizeof(mm_params.has_mixer_coeffs));
6888 length += sizeof(mm_params.has_mixer_coeffs);
Varun Balaraje49253e2017-07-06 19:48:56 +05306889 if (mm_params.has_mixer_coeffs)
6890 for (iter_i = 0; iter_i < mm_params.num_output_channels; iter_i++)
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306891 for (iter_j = 0; iter_j < mm_params.num_input_channels; iter_j++) {
6892 memcpy((uint32_t *) &downmix_param_data[length],
6893 &mm_params.mixer_coeffs[iter_i][iter_j],
6894 (sizeof(mm_params.mixer_coeffs[0][0])));
6895 length += (sizeof(mm_params.mixer_coeffs[0][0]));
6896 }
Varun Balaraje49253e2017-07-06 19:48:56 +05306897
6898 ret = mixer_ctl_set_array(ctl, downmix_param_data, length);
6899end:
Nikhil Latukar2e6f6242017-08-15 13:37:07 +05306900 if (downmix_param_data)
6901 free(downmix_param_data);
Varun Balaraje49253e2017-07-06 19:48:56 +05306902 return ret;
6903}
6904
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306905int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel_mask,
6906 int snd_id, uint8_t *input_channel_map)
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006907{
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306908 int ret = 0, i = 0;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006909 int channels = audio_channel_count_from_out_mask(channel_mask);
6910
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306911 char channel_map[AUDIO_CHANNEL_COUNT_MAX];
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006912 memset(channel_map, 0, sizeof(channel_map));
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306913 if (*input_channel_map) {
6914 for (i = 0; i < channels; i++) {
6915 ALOGV("%s:: Channel Map channel_map[%d] - %d", __func__, i, *input_channel_map);
6916 channel_map[i] = *input_channel_map;
6917 input_channel_map++;
6918 }
6919 } else {
6920 /* Following are all most common standard WAV channel layouts
6921 overridden by channel mask if its allowed and different */
6922 switch (channels) {
6923 case 1:
6924 /* AUDIO_CHANNEL_OUT_MONO */
6925 channel_map[0] = PCM_CHANNEL_FC;
6926 break;
6927 case 2:
6928 /* AUDIO_CHANNEL_OUT_STEREO */
6929 channel_map[0] = PCM_CHANNEL_FL;
6930 channel_map[1] = PCM_CHANNEL_FR;
6931 break;
6932 case 3:
6933 /* AUDIO_CHANNEL_OUT_2POINT1 */
6934 channel_map[0] = PCM_CHANNEL_FL;
6935 channel_map[1] = PCM_CHANNEL_FR;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006936 channel_map[2] = PCM_CHANNEL_FC;
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306937 break;
6938 case 4:
6939 /* AUDIO_CHANNEL_OUT_QUAD_SIDE */
6940 channel_map[0] = PCM_CHANNEL_FL;
6941 channel_map[1] = PCM_CHANNEL_FR;
6942 channel_map[2] = PCM_CHANNEL_LS;
6943 channel_map[3] = PCM_CHANNEL_RS;
6944 if (channel_mask == AUDIO_CHANNEL_OUT_QUAD_BACK) {
6945 channel_map[2] = PCM_CHANNEL_LB;
6946 channel_map[3] = PCM_CHANNEL_RB;
6947 }
6948 if (channel_mask == AUDIO_CHANNEL_OUT_SURROUND) {
6949 channel_map[2] = PCM_CHANNEL_FC;
6950 channel_map[3] = PCM_CHANNEL_CS;
6951 }
6952 break;
6953 case 5:
6954 /* AUDIO_CHANNEL_OUT_PENTA */
6955 channel_map[0] = PCM_CHANNEL_FL;
6956 channel_map[1] = PCM_CHANNEL_FR;
6957 channel_map[2] = PCM_CHANNEL_FC;
6958 channel_map[3] = PCM_CHANNEL_LB;
6959 channel_map[4] = PCM_CHANNEL_RB;
6960 break;
6961 case 6:
6962 /* AUDIO_CHANNEL_OUT_5POINT1 */
6963 channel_map[0] = PCM_CHANNEL_FL;
6964 channel_map[1] = PCM_CHANNEL_FR;
6965 channel_map[2] = PCM_CHANNEL_FC;
6966 channel_map[3] = PCM_CHANNEL_LFE;
6967 channel_map[4] = PCM_CHANNEL_LB;
6968 channel_map[5] = PCM_CHANNEL_RB;
6969 if (channel_mask == AUDIO_CHANNEL_OUT_5POINT1_SIDE) {
6970 channel_map[4] = PCM_CHANNEL_LS;
6971 channel_map[5] = PCM_CHANNEL_RS;
6972 }
6973 break;
6974 case 7:
6975 /* AUDIO_CHANNEL_OUT_6POINT1 */
6976 channel_map[0] = PCM_CHANNEL_FL;
6977 channel_map[1] = PCM_CHANNEL_FR;
6978 channel_map[2] = PCM_CHANNEL_FC;
6979 channel_map[3] = PCM_CHANNEL_LFE;
6980 channel_map[4] = PCM_CHANNEL_LB;
6981 channel_map[5] = PCM_CHANNEL_RB;
6982 channel_map[6] = PCM_CHANNEL_CS;
6983 break;
6984 case 8:
6985 /* AUDIO_CHANNEL_OUT_7POINT1 */
6986 channel_map[0] = PCM_CHANNEL_FL;
6987 channel_map[1] = PCM_CHANNEL_FR;
6988 channel_map[2] = PCM_CHANNEL_FC;
6989 channel_map[3] = PCM_CHANNEL_LFE;
6990 channel_map[4] = PCM_CHANNEL_LB;
6991 channel_map[5] = PCM_CHANNEL_RB;
6992 channel_map[6] = PCM_CHANNEL_LS;
6993 channel_map[7] = PCM_CHANNEL_RS;
6994 break;
Dieter Luecking5d57def2018-09-07 14:23:37 +02006995 case 12:
6996 /* AUDIO_CHANNEL_OUT_7POINT1POINT4 */
6997 channel_map[0] = PCM_CHANNEL_FL;
6998 channel_map[1] = PCM_CHANNEL_FR;
6999 channel_map[2] = PCM_CHANNEL_FC;
7000 channel_map[3] = PCM_CHANNEL_LFE;
7001 channel_map[4] = PCM_CHANNEL_LB;
7002 channel_map[5] = PCM_CHANNEL_RB;
7003 channel_map[6] = PCM_CHANNEL_LS;
7004 channel_map[7] = PCM_CHANNEL_RS;
7005 channel_map[8] = PCM_CHANNEL_TFL;
7006 channel_map[9] = PCM_CHANNEL_TFR;
7007 channel_map[10] = PCM_CHANNEL_TSL;
7008 channel_map[11] = PCM_CHANNEL_TSR;
7009 break;
7010 case 16:
7011 /* 16 channels */
7012 channel_map[0] = PCM_CHANNEL_FL;
7013 channel_map[1] = PCM_CHANNEL_FR;
7014 channel_map[2] = PCM_CHANNEL_FC;
7015 channel_map[3] = PCM_CHANNEL_LFE;
7016 channel_map[4] = PCM_CHANNEL_LB;
7017 channel_map[5] = PCM_CHANNEL_RB;
7018 channel_map[6] = PCM_CHANNEL_LS;
7019 channel_map[7] = PCM_CHANNEL_RS;
7020 channel_map[8] = PCM_CHANNEL_TFL;
7021 channel_map[9] = PCM_CHANNEL_TFR;
7022 channel_map[10] = PCM_CHANNEL_TSL;
7023 channel_map[11] = PCM_CHANNEL_TSR;
7024 channel_map[12] = PCM_CHANNEL_FLC;
7025 channel_map[13] = PCM_CHANNEL_FRC;
7026 channel_map[14] = PCM_CHANNEL_RLC;
7027 channel_map[15] = PCM_CHANNEL_RRC;
7028 break;
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05307029 default:
7030 ALOGE("unsupported channels %d for setting channel map", channels);
7031 return -1;
7032 }
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007033 }
7034 ret = platform_set_channel_map(platform, channels, channel_map, snd_id);
7035 return ret;
7036}
7037
7038int platform_get_edid_info(void *platform)
7039{
7040 struct platform_data *my_data = (struct platform_data *)platform;
7041 struct audio_device *adev = my_data->adev;
7042 char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE];
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05307043 int ret, count;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007044 char *mix_ctl_name;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007045 struct mixer_ctl *ctl;
7046 char edid_data[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE + 1] = {0};
7047 edid_audio_info *info;
7048
7049 if (my_data->edid_valid) {
7050 /* use cached edid */
7051 return 0;
7052 }
7053
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007054 switch(my_data->ext_disp_type) {
7055 case EXT_DISPLAY_TYPE_HDMI:
7056 mix_ctl_name = "HDMI EDID";
7057 break;
7058 case EXT_DISPLAY_TYPE_DP:
7059 mix_ctl_name = "Display Port EDID";
7060 break;
7061 default:
7062 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
7063 return -EINVAL;
7064 }
7065
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007066 if (my_data->edid_info == NULL) {
7067 my_data->edid_info =
7068 (struct edid_audio_info *)calloc(1, sizeof(struct edid_audio_info));
7069 }
7070
7071 info = my_data->edid_info;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007072 ctl = mixer_get_ctl_by_name(adev->mixer, mix_ctl_name);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007073 if (!ctl) {
7074 ALOGE("%s: Could not get ctl for mixer cmd - %s",
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007075 __func__, mix_ctl_name);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007076 goto fail;
7077 }
7078
7079 mixer_ctl_update(ctl);
7080
7081 count = mixer_ctl_get_num_values(ctl);
7082
7083 /* Read SAD blocks, clamping the maximum size for safety */
7084 if (count > (int)sizeof(block))
7085 count = (int)sizeof(block);
7086
7087 ret = mixer_ctl_get_array(ctl, block, count);
7088 if (ret != 0) {
7089 ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__);
7090 goto fail;
7091 }
7092 edid_data[0] = count;
7093 memcpy(&edid_data[1], block, count);
7094
7095 if (!edid_get_sink_caps(info, edid_data)) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007096 ALOGE("%s: Failed to get extn disp sink capabilities", __func__);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007097 goto fail;
7098 }
7099 my_data->edid_valid = true;
7100 return 0;
7101fail:
7102 if (my_data->edid_info) {
7103 free(my_data->edid_info);
7104 my_data->edid_info = NULL;
7105 my_data->edid_valid = false;
7106 }
7107 ALOGE("%s: return -EINVAL", __func__);
7108 return -EINVAL;
7109}
7110
7111
7112int platform_set_channel_allocation(void *platform, int channel_alloc)
7113{
7114 struct mixer_ctl *ctl;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007115 char *mixer_ctl_name;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007116 int ret;
7117 struct platform_data *my_data = (struct platform_data *)platform;
7118 struct audio_device *adev = my_data->adev;
7119
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007120 switch(my_data->ext_disp_type) {
7121 case EXT_DISPLAY_TYPE_HDMI:
7122 mixer_ctl_name = "HDMI RX CA";
7123 break;
7124 case EXT_DISPLAY_TYPE_DP:
7125 mixer_ctl_name = "Display Port RX CA";
7126 break;
7127 default:
7128 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
7129 return -EINVAL;
7130 }
7131
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007132 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
7133 if (!ctl) {
7134 ALOGE("%s: Could not get ctl for mixer cmd - %s",
7135 __func__, mixer_ctl_name);
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007136 return -EINVAL;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007137 }
7138 ALOGD(":%s channel allocation = 0x%x", __func__, channel_alloc);
7139 ret = mixer_ctl_set_value(ctl, 0, channel_alloc);
7140
7141 if (ret < 0) {
7142 ALOGE("%s: Could not set ctl, error:%d ", __func__, ret);
7143 }
7144
7145 return ret;
7146}
7147
7148int platform_set_channel_map(void *platform, int ch_count, char *ch_map, int snd_id)
7149{
7150 struct mixer_ctl *ctl;
Apoorv Raghuvanshi8880cac2015-02-06 15:33:49 -08007151 char mixer_ctl_name[44] = {0}; // max length of name is 44 as defined
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007152 int ret;
Dieter Luecking5d57def2018-09-07 14:23:37 +02007153 unsigned int i=0, n=0;
7154 long set_values[AUDIO_MAX_DSP_CHANNELS];
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007155 struct platform_data *my_data = (struct platform_data *)platform;
7156 struct audio_device *adev = my_data->adev;
7157 ALOGV("%s channel_count:%d",__func__, ch_count);
Dieter Luecking5d57def2018-09-07 14:23:37 +02007158
7159 /*
7160 * FIXME:
7161 * Currently the channel mask in audio.h is limited to 30 channels,
7162 * (=AUDIO_CHANNEL_COUNT_MAX), whereas the mixer controls already
7163 * allow up to AUDIO_MAX_DSP_CHANNELS channels as per final requirement.
7164 * Until channel mask definition is not changed from a uint32_t value
7165 * to something else, a sanity check is needed here.
7166 */
7167 if (NULL == ch_map || (ch_count < 1) || (ch_count > AUDIO_CHANNEL_COUNT_MAX)) {
Divya Narayanan Poojary21de6aa2017-01-06 12:07:19 +05307168 ALOGE("%s: Invalid channel mapping or channel count value", __func__);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007169 return -EINVAL;
7170 }
Fred Ohe0479682015-03-25 16:30:26 -07007171
7172 /*
7173 * If snd_id is greater than 0, stream channel mapping
7174 * If snd_id is below 0, typically -1, device channel mapping
7175 */
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007176 if (snd_id >= 0) {
Fred Ohe0479682015-03-25 16:30:26 -07007177 snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "Playback Channel Map%d", snd_id);
7178 } else {
7179 strlcpy(mixer_ctl_name, "Playback Device Channel Map", sizeof(mixer_ctl_name));
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007180 }
7181
7182 ALOGD("%s mixer_ctl_name:%s", __func__, mixer_ctl_name);
7183
7184 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
Dieter Luecking5d57def2018-09-07 14:23:37 +02007185
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007186 if (!ctl) {
7187 ALOGE("%s: Could not get ctl for mixer cmd - %s",
7188 __func__, mixer_ctl_name);
7189 return -EINVAL;
7190 }
Dieter Luecking5d57def2018-09-07 14:23:37 +02007191
7192 /* find out how many values the control can set */
7193 n = mixer_ctl_get_num_values(ctl);
7194
7195 if (n != ch_count)
7196 ALOGV("%s chcnt %d != mixerctl elem size %d",__func__, ch_count, n);
7197
7198 if (n < ch_count) {
7199 ALOGE("%s chcnt %d > mixerctl elem size %d",__func__, ch_count, n);
7200 return -EINVAL;
7201 }
7202
7203 if (n > AUDIO_MAX_DSP_CHANNELS) {
7204 ALOGE("%s mixerctl elem size %d > AUDIO_MAX_DSP_CHANNELS %d",__func__, n, AUDIO_MAX_DSP_CHANNELS);
7205 return -EINVAL;
7206 }
7207
7208 /* initialize all set_values to zero */
7209 memset (set_values, 0, sizeof(set_values));
7210
7211 /* copy only as many values as corresponding mixer_ctrl allows */
7212 for (i = 0; i < ch_count; i++) {
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007213 set_values[i] = ch_map[i];
7214 }
7215
Manish Dewangan338c50a2017-09-12 15:22:03 +05307216 ALOGD("%s: set mapping(%ld %ld %ld %ld %ld %ld %ld %ld) for channel:%d", __func__,
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007217 set_values[0], set_values[1], set_values[2], set_values[3], set_values[4],
7218 set_values[5], set_values[6], set_values[7], ch_count);
7219
Dieter Luecking5d57def2018-09-07 14:23:37 +02007220 ret = mixer_ctl_set_array(ctl, set_values, n);
7221
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007222 if (ret < 0) {
7223 ALOGE("%s: Could not set ctl, error:%d ch_count:%d",
7224 __func__, ret, ch_count);
7225 }
7226 return ret;
7227}
7228
7229unsigned char platform_map_to_edid_format(int audio_format)
7230{
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007231 unsigned char format;
7232 switch (audio_format & AUDIO_FORMAT_MAIN_MASK) {
7233 case AUDIO_FORMAT_AC3:
7234 ALOGV("%s: AC3", __func__);
7235 format = AC3;
7236 break;
7237 case AUDIO_FORMAT_AAC:
7238 ALOGV("%s:AAC", __func__);
7239 format = AAC;
7240 break;
Manish Dewangana6fc5442015-08-24 20:30:31 +05307241 case AUDIO_FORMAT_AAC_ADTS:
7242 ALOGV("%s:AAC_ADTS", __func__);
7243 format = AAC;
7244 break;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007245 case AUDIO_FORMAT_E_AC3:
Satish Babu Patakokilaa395a9e2016-11-01 12:18:49 +05307246 case AUDIO_FORMAT_E_AC3_JOC:
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007247 ALOGV("%s:E_AC3", __func__);
7248 format = DOLBY_DIGITAL_PLUS;
7249 break;
Ben Romberger1aaaf862017-04-06 17:49:46 -07007250 case AUDIO_FORMAT_DOLBY_TRUEHD:
7251 ALOGV("%s:MAT", __func__);
7252 format = MAT;
7253 break;
Mingming Yin3a941d42016-02-17 18:08:05 -08007254 case AUDIO_FORMAT_DTS:
7255 ALOGV("%s:DTS", __func__);
7256 format = DTS;
7257 break;
7258 case AUDIO_FORMAT_DTS_HD:
7259 ALOGV("%s:DTS_HD", __func__);
7260 format = DTS_HD;
7261 break;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007262 case AUDIO_FORMAT_PCM_16_BIT:
Ashish Jain5106d362016-05-11 19:23:33 +05307263 case AUDIO_FORMAT_PCM_24_BIT_PACKED:
7264 case AUDIO_FORMAT_PCM_8_24_BIT:
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007265 ALOGV("%s:PCM", __func__);
Mingming Yin3a941d42016-02-17 18:08:05 -08007266 format = LPCM;
7267 break;
Naresh Tanniru928f0862017-04-07 16:44:23 -07007268 case AUDIO_FORMAT_IEC61937:
7269 ALOGV("%s:IEC61937", __func__);
7270 format = 0;
7271 break;
Mingming Yin3a941d42016-02-17 18:08:05 -08007272 default:
Mingming Yin3a941d42016-02-17 18:08:05 -08007273 format = -1;
Naresh Tanniru928f0862017-04-07 16:44:23 -07007274 ALOGE("%s:invalid format: 0x%x", __func__, audio_format);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007275 break;
7276 }
7277 return format;
7278}
7279
Ashish Jaina052e572016-11-07 16:41:07 +05307280void platform_check_and_update_copp_sample_rate(void* platform, snd_device_t snd_device,
7281 unsigned int stream_sr, int* sample_rate)
7282{
7283 struct platform_data* my_data = (struct platform_data *)platform;
7284 int backend_idx = platform_get_backend_index(snd_device);
7285 int device_sr = my_data->current_backend_cfg[backend_idx].sample_rate;
7286 /*
7287 *Check if device SR is multiple of 8K or 11.025 Khz
7288 *check if the stream SR is multiple of same base, if yes
7289 *then have copp SR equal to stream SR, this ensures that
7290 *post processing happens at stream SR, else have
7291 *copp SR equal to device SR.
7292 */
7293 if (!(((sample_rate_multiple(device_sr, SAMPLE_RATE_8000)) &&
7294 (sample_rate_multiple(stream_sr, SAMPLE_RATE_8000))) ||
7295 ((sample_rate_multiple(device_sr, SAMPLE_RATE_11025)) &&
7296 (sample_rate_multiple(stream_sr, SAMPLE_RATE_11025))))) {
7297 *sample_rate = device_sr;
7298 } else
7299 *sample_rate = stream_sr;
7300
Revathi Uddaraju0553e8f2017-11-30 14:56:11 +05307301 if ((snd_device == SND_DEVICE_OUT_HDMI) || (snd_device == SND_DEVICE_OUT_DISPLAY_PORT) ||
7302 (snd_device == SND_DEVICE_OUT_USB_HEADSET))
7303 *sample_rate = platform_get_supported_copp_sampling_rate(stream_sr);
Venugopal Nadipalli83134582017-09-21 22:34:50 +05307304
7305 ALOGI("sn_device %d device sr %d stream sr %d copp sr %d", snd_device, device_sr, stream_sr, *sample_rate);
Ashish Jaina052e572016-11-07 16:41:07 +05307306
7307}
7308
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07007309void platform_reset_edid_info(void *platform) {
7310
7311 ALOGV("%s:", __func__);
7312 struct platform_data *my_data = (struct platform_data *)platform;
7313 if (my_data->edid_info) {
7314 ALOGV("%s :free edid", __func__);
7315 free(my_data->edid_info);
7316 my_data->edid_info = NULL;
7317 }
7318}
7319
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007320bool platform_is_edid_supported_format(void *platform, int format)
7321{
7322 struct platform_data *my_data = (struct platform_data *)platform;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007323 edid_audio_info *info = NULL;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05307324 int i, ret;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007325 unsigned char format_id = platform_map_to_edid_format(format);
7326
Naresh Tanniru928f0862017-04-07 16:44:23 -07007327 if (format == AUDIO_FORMAT_IEC61937)
7328 return true;
7329
Mingming Yin3a941d42016-02-17 18:08:05 -08007330 if (format_id <= 0) {
7331 ALOGE("%s invalid edid format mappting for :%x" ,__func__, format);
7332 return false;
7333 }
7334
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007335 ret = platform_get_edid_info(platform);
7336 info = (edid_audio_info *)my_data->edid_info;
7337 if (ret == 0 && info != NULL) {
7338 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07007339 /*
7340 * To check
7341 * is there any special for CONFIG_HDMI_PASSTHROUGH_CONVERT
7342 * & DOLBY_DIGITAL_PLUS
7343 */
7344 if (info->audio_blocks_array[i].format_id == format_id) {
Mingming Yin3a941d42016-02-17 18:08:05 -08007345 ALOGV("%s:returns true %x",
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07007346 __func__, format);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007347 return true;
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07007348 }
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007349 }
7350 }
Mingming Yin3a941d42016-02-17 18:08:05 -08007351 ALOGV("%s:returns false %x",
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007352 __func__, format);
7353 return false;
7354}
7355
Mingming Yin3a941d42016-02-17 18:08:05 -08007356bool platform_is_edid_supported_sample_rate(void *platform, int sample_rate)
7357{
7358 struct platform_data *my_data = (struct platform_data *)platform;
Mingming Yin3a941d42016-02-17 18:08:05 -08007359 edid_audio_info *info = NULL;
Garmond Leung2f78a672016-11-07 16:27:40 -08007360 int ret = 0;
Mingming Yin3a941d42016-02-17 18:08:05 -08007361
7362 ret = platform_get_edid_info(platform);
7363 info = (edid_audio_info *)my_data->edid_info;
7364 if (ret == 0 && info != NULL) {
Garmond Leung2f78a672016-11-07 16:27:40 -08007365 return edid_is_supported_sr(info, sample_rate);
Mingming Yin3a941d42016-02-17 18:08:05 -08007366 }
Mingming Yin3a941d42016-02-17 18:08:05 -08007367
7368 return false;
7369}
7370
Naresh Tanniru3a406772017-05-10 13:09:05 -07007371int platform_edid_get_highest_supported_sr(void *platform)
7372{
7373 struct platform_data *my_data = (struct platform_data *)platform;
7374 edid_audio_info *info = NULL;
7375 int ret = 0;
7376
7377 ret = platform_get_edid_info(platform);
7378 info = (edid_audio_info *)my_data->edid_info;
7379 if (ret == 0 && info != NULL) {
7380 return edid_get_highest_supported_sr(info);
7381 }
7382
7383 return 0;
7384}
Mingming Yin3a941d42016-02-17 18:08:05 -08007385
Dieter Luecking5d57def2018-09-07 14:23:37 +02007386bool platform_spkr_use_default_sample_rate(void *platform) {
7387 struct platform_data *my_data = (struct platform_data *)platform;
7388 return my_data->use_sprk_default_sample_rate;
7389}
7390
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007391int platform_set_edid_channels_configuration(void *platform, int channels) {
7392
7393 struct platform_data *my_data = (struct platform_data *)platform;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307394 struct audio_device *adev = my_data->adev;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007395 edid_audio_info *info = NULL;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007396 int channel_count = 2;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05307397 int i, ret;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007398 char default_channelMap[MAX_CHANNELS_SUPPORTED] = {0};
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307399 struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007400
7401 ret = platform_get_edid_info(platform);
7402 info = (edid_audio_info *)my_data->edid_info;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307403 adev_device_cfg_ptr += HDMI_RX_BACKEND;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007404 if(ret == 0 && info != NULL) {
7405 if (channels > 2) {
7406
7407 ALOGV("%s:able to get HDMI sink capabilities multi channel playback",
7408 __func__);
7409 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
7410 if (info->audio_blocks_array[i].format_id == LPCM &&
7411 info->audio_blocks_array[i].channels > channel_count &&
7412 info->audio_blocks_array[i].channels <= MAX_HDMI_CHANNEL_CNT) {
7413 channel_count = info->audio_blocks_array[i].channels;
7414 }
7415 }
7416 ALOGVV("%s:channel_count:%d", __func__, channel_count);
7417 /*
7418 * Channel map is set for supported hdmi max channel count even
7419 * though the input channel count set on adm is less than or equal to
7420 * max supported channel count
7421 */
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307422 if (adev_device_cfg_ptr->use_client_dev_cfg) {
7423 platform_set_channel_map(platform, adev_device_cfg_ptr->dev_cfg_params.channels,
7424 (char *)adev_device_cfg_ptr->dev_cfg_params.channel_map, -1);
7425 } else {
7426 platform_set_channel_map(platform, channel_count, info->channel_map, -1);
7427 }
7428
7429 if (adev_device_cfg_ptr->use_client_dev_cfg) {
7430 ALOGV("%s:: Setting client selected CA %d", __func__,
7431 adev_device_cfg_ptr->dev_cfg_params.channel_allocation);
7432 platform_set_channel_allocation(platform,
7433 adev_device_cfg_ptr->dev_cfg_params.channel_allocation);
7434 } else {
7435 platform_set_channel_allocation(platform, info->channel_allocation);
7436 }
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007437 } else {
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307438 if (adev_device_cfg_ptr->use_client_dev_cfg) {
7439 default_channelMap[0] = adev_device_cfg_ptr->dev_cfg_params.channel_map[0];
7440 default_channelMap[1] = adev_device_cfg_ptr->dev_cfg_params.channel_map[1];
7441 } else {
7442 default_channelMap[0] = PCM_CHANNEL_FL;
7443 default_channelMap[1] = PCM_CHANNEL_FR;
7444 }
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007445 platform_set_channel_map(platform,2,default_channelMap,-1);
7446 platform_set_channel_allocation(platform,0);
7447 }
7448 }
7449
7450 return 0;
7451}
7452
7453void platform_cache_edid(void * platform)
7454{
7455 platform_get_edid_info(platform);
7456}
7457
Siddartha Shaik44dd7702017-06-14 12:13:25 +05307458void platform_invalidate_backend_config(void * platform,snd_device_t snd_device)
7459{
7460 struct platform_data *my_data = (struct platform_data *)platform;
7461 struct audio_device *adev = my_data->adev;
7462 struct audio_backend_cfg backend_cfg;
7463 int backend_idx;
7464
7465 backend_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
7466 backend_cfg.channels = CODEC_BACKEND_DEFAULT_CHANNELS;
7467 backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
7468 backend_cfg.format = AUDIO_FORMAT_PCM_16_BIT;
7469 backend_cfg.passthrough_enabled = false;
7470
7471 backend_idx = platform_get_backend_index(snd_device);
7472 platform_set_codec_backend_cfg(adev, snd_device, backend_cfg);
7473 my_data->current_backend_cfg[backend_idx].sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
7474 my_data->current_backend_cfg[backend_idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
7475 my_data->current_backend_cfg[backend_idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
7476 my_data->current_backend_cfg[backend_idx].format = AUDIO_FORMAT_PCM_16_BIT;
7477}
7478
Mingming Yinddd610b2016-01-20 17:09:32 -08007479void platform_invalidate_hdmi_config(void * platform)
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007480{
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007481 //reset ext display EDID info
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007482 struct platform_data *my_data = (struct platform_data *)platform;
Ben Rombergere9e80ee2017-04-26 16:00:10 -07007483 struct audio_device *adev = my_data->adev;
7484 struct audio_backend_cfg backend_cfg;
7485 int backend_idx;
7486 snd_device_t snd_device;
7487
7488 backend_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
7489 backend_cfg.channels = DEFAULT_HDMI_OUT_CHANNELS;
7490 backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
7491 backend_cfg.format = 0;
7492 backend_cfg.passthrough_enabled = false;
7493
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007494 my_data->edid_valid = false;
7495 if (my_data->edid_info) {
7496 memset(my_data->edid_info, 0, sizeof(struct edid_audio_info));
7497 }
Mingming Yinddd610b2016-01-20 17:09:32 -08007498
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007499 if (my_data->ext_disp_type == EXT_DISPLAY_TYPE_HDMI) {
7500 //reset HDMI_RX_BACKEND to default values
Ben Rombergere9e80ee2017-04-26 16:00:10 -07007501 backend_idx = HDMI_RX_BACKEND;
7502 snd_device = SND_DEVICE_OUT_HDMI;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007503 } else {
7504 //reset Display port BACKEND to default values
Ben Rombergere9e80ee2017-04-26 16:00:10 -07007505 backend_idx = DISP_PORT_RX_BACKEND;
7506 snd_device = SND_DEVICE_OUT_DISPLAY_PORT;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007507 }
Ben Rombergere9e80ee2017-04-26 16:00:10 -07007508 platform_set_codec_backend_cfg(adev, snd_device, backend_cfg);
7509 my_data->current_backend_cfg[backend_idx].sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
7510 my_data->current_backend_cfg[backend_idx].channels = DEFAULT_HDMI_OUT_CHANNELS;
7511 my_data->current_backend_cfg[backend_idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007512 my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007513}
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07007514
7515int platform_set_mixer_control(struct stream_out *out, const char * mixer_ctl_name,
7516 const char *mixer_val)
7517{
7518 struct audio_device *adev = out->dev;
7519 struct mixer_ctl *ctl = NULL;
7520 ALOGD("setting mixer ctl %s with value %s", mixer_ctl_name, mixer_val);
7521 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
7522 if (!ctl) {
7523 ALOGE("%s: could not get ctl for mixer cmd - %s",
7524 __func__, mixer_ctl_name);
7525 return -EINVAL;
7526 }
7527
7528 return mixer_ctl_set_enum_by_string(ctl, mixer_val);
7529}
7530
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07007531int platform_set_device_params(struct stream_out *out, int param, int value)
7532{
7533 struct audio_device *adev = out->dev;
7534 struct mixer_ctl *ctl;
7535 char *mixer_ctl_name = "Device PP Params";
7536 int ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05307537 long set_values[] = {0,0};
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07007538
7539 set_values[0] = param;
7540 set_values[1] = value;
7541
7542 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
7543 if (!ctl) {
7544 ALOGE("%s: Could not get ctl for mixer cmd - %s",
7545 __func__, mixer_ctl_name);
7546 ret = -EINVAL;
7547 goto end;
7548 }
7549
7550 ALOGV("%s: Setting device pp params param: %d, value %d mixer ctrl:%s",
7551 __func__,param, value, mixer_ctl_name);
7552 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
7553
7554end:
7555 return ret;
7556}
Narsinga Rao Chellaf928a982015-03-06 14:57:35 -08007557
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007558bool platform_can_enable_spkr_prot_on_device(snd_device_t snd_device)
7559{
7560 bool ret = false;
7561
7562 if (snd_device == SND_DEVICE_OUT_SPEAKER ||
Vignesh Kulothungan3b5fae52017-09-25 12:16:30 -07007563 snd_device == SND_DEVICE_OUT_SPEAKER_REVERSE ||
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007564 snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
7565 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
Rohit kumarf4120402016-08-05 19:19:48 +05307566 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
7567 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
7568 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2) {
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007569 ret = true;
7570 }
7571
7572 return ret;
7573}
7574
7575int platform_get_spkr_prot_acdb_id(snd_device_t snd_device)
7576{
7577 int acdb_id;
7578
7579 switch(snd_device) {
7580 case SND_DEVICE_OUT_SPEAKER:
7581 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED);
7582 break;
7583 case SND_DEVICE_OUT_VOICE_SPEAKER:
7584 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
7585 break;
Rohit kumarf4120402016-08-05 19:19:48 +05307586 case SND_DEVICE_OUT_VOICE_SPEAKER_2:
7587 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
7588 break;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007589 case SND_DEVICE_OUT_SPEAKER_VBAT:
7590 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
7591 break;
7592 case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
7593 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT);
7594 break;
Rohit kumarf4120402016-08-05 19:19:48 +05307595 case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
7596 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT);
7597 break;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007598 default:
7599 acdb_id = -EINVAL;
7600 break;
7601 }
7602 return acdb_id;
7603}
7604
7605int platform_get_spkr_prot_snd_device(snd_device_t snd_device)
7606{
7607 if (!audio_extn_spkr_prot_is_enabled())
7608 return snd_device;
7609
7610 switch(snd_device) {
7611 case SND_DEVICE_OUT_SPEAKER:
7612 return SND_DEVICE_OUT_SPEAKER_PROTECTED;
7613 case SND_DEVICE_OUT_VOICE_SPEAKER:
7614 return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
Rohit kumarf4120402016-08-05 19:19:48 +05307615 case SND_DEVICE_OUT_VOICE_SPEAKER_2:
7616 return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007617 case SND_DEVICE_OUT_SPEAKER_VBAT:
7618 return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
7619 case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
7620 return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
Rohit kumarf4120402016-08-05 19:19:48 +05307621 case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
7622 return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007623 default:
7624 return snd_device;
7625 }
7626}
Rohit kumarf4120402016-08-05 19:19:48 +05307627int platform_get_vi_feedback_snd_device(snd_device_t snd_device)
7628{
7629 switch(snd_device) {
7630 case SND_DEVICE_OUT_SPEAKER_PROTECTED:
7631 case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
7632 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
7633 case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
7634 case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
7635 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1;
7636 case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
7637 case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
7638 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2;
7639 default:
7640 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
7641 }
7642}
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007643
Venkata Narendra Kumar Gutta7f4817f2016-01-29 14:15:53 +05307644int platform_spkr_prot_is_wsa_analog_mode(void *adev __unused)
7645{
7646 return 0;
7647}
7648
Narsinga Rao Chellaf928a982015-03-06 14:57:35 -08007649/*
7650 * This is a lookup table to map android audio input device to audio h/w interface (backend).
7651 * The table can be extended for other input devices by adding appropriate entries.
7652 * Also the audio interface for a particular input device can be overriden by adding
7653 * corresponding entry in audio_platform_info.xml file.
7654 */
7655struct audio_device_to_audio_interface audio_device_to_interface_table[] = {
7656 {AUDIO_DEVICE_IN_BUILTIN_MIC, ENUM_TO_STRING(AUDIO_DEVICE_IN_BUILTIN_MIC), "SLIMBUS_0"},
7657 {AUDIO_DEVICE_IN_BACK_MIC, ENUM_TO_STRING(AUDIO_DEVICE_IN_BACK_MIC), "SLIMBUS_0"},
7658};
7659
7660int audio_device_to_interface_table_len =
7661 sizeof(audio_device_to_interface_table) / sizeof(audio_device_to_interface_table[0]);
7662
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05307663int platform_set_audio_device_interface(const char *device_name, const char *intf_name,
7664 const char *codec_type __unused)
Narsinga Rao Chellaf928a982015-03-06 14:57:35 -08007665{
7666 int ret = 0;
7667 int i;
7668
7669 if (device_name == NULL || intf_name == NULL) {
7670 ALOGE("%s: Invalid input", __func__);
7671
7672 ret = -EINVAL;
7673 goto done;
7674 }
7675
7676 ALOGD("%s: Enter, device name:%s, intf name:%s", __func__, device_name, intf_name);
7677
7678 size_t device_name_len = strlen(device_name);
7679 for (i = 0; i < audio_device_to_interface_table_len; i++) {
7680 char* name = audio_device_to_interface_table[i].device_name;
7681 size_t name_len = strlen(name);
7682 if ((name_len == device_name_len) &&
7683 (strncmp(device_name, name, name_len) == 0)) {
7684 ALOGD("%s: Matched device name:%s, overwrite intf name with %s",
7685 __func__, device_name, intf_name);
7686
7687 strlcpy(audio_device_to_interface_table[i].interface_name, intf_name,
7688 sizeof(audio_device_to_interface_table[i].interface_name));
7689 goto done;
7690 }
7691 }
7692 ALOGE("%s: Could not find matching device name %s",
7693 __func__, device_name);
7694
7695 ret = -EINVAL;
7696
7697done:
7698 return ret;
7699}
Laxminath Kasam44f49402015-05-29 18:37:11 +05307700
Kuirong Wang1cad7142016-05-24 15:21:56 -07007701int platform_set_sidetone(struct audio_device *adev,
7702 snd_device_t out_snd_device,
7703 bool enable,
7704 char *str)
7705{
7706 int ret;
Ashish Jain3e37a702016-11-25 12:27:15 +05307707 if ((out_snd_device == SND_DEVICE_OUT_USB_HEADSET) ||
7708 (out_snd_device == SND_DEVICE_OUT_USB_HEADPHONES)) {
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07007709 if (property_get_bool("vendor.audio.usb.disable.sidetone", 0)) {
Haynes Mathew George492a6c42016-10-28 11:41:43 -07007710 ALOGI("Debug: Disable sidetone");
7711 } else {
Kuirong Wang1cad7142016-05-24 15:21:56 -07007712 ret = audio_extn_usb_enable_sidetone(out_snd_device, enable);
Vikram Panduranga6e761cd2016-10-12 16:50:52 -07007713 if (ret) {
7714 /*fall back to AFE sidetone*/
7715 ALOGV("%s: No USB sidetone supported, switching to AFE sidetone",
7716 __func__);
7717
7718 if (enable)
7719 audio_route_apply_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
7720 else
7721 audio_route_reset_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
7722 }
Haynes Mathew George492a6c42016-10-28 11:41:43 -07007723 }
Kuirong Wang1cad7142016-05-24 15:21:56 -07007724 } else {
7725 ALOGV("%s: sidetone out device(%d) mixer cmd = %s\n",
7726 __func__, out_snd_device, str);
Laxminath Kasam44f49402015-05-29 18:37:11 +05307727
Vikram Panduranga6e761cd2016-10-12 16:50:52 -07007728 if (enable) {
7729 ret = audio_route_apply_and_update_path(adev->audio_route, str);
7730 if (ret) {
7731 ALOGV("%s: No device sidetone supported, switching to AFE sidetone",
7732 __func__);
7733 audio_route_apply_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
7734 }
7735 }
7736 else {
7737 ret = audio_route_reset_and_update_path(adev->audio_route, str);
7738 if (ret) {
7739 ALOGV("%s: No device sidetone supported, switching to AFE sidetone",
7740 __func__);
7741 audio_route_reset_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
7742 }
7743 }
Kuirong Wang1cad7142016-05-24 15:21:56 -07007744 }
7745 return 0;
7746}
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007747
Vidyakumar Athotaea269c62016-10-31 09:05:59 -07007748void platform_update_aanc_path(struct audio_device *adev,
7749 snd_device_t out_snd_device,
7750 bool enable,
7751 char *str)
7752{
7753 ALOGD("%s: aanc out device(%d) mixer cmd = %s, enable = %d\n",
7754 __func__, out_snd_device, str, enable);
7755
7756 if (enable)
7757 audio_route_apply_and_update_path(adev->audio_route, str);
7758 else
7759 audio_route_reset_and_update_path(adev->audio_route, str);
7760
7761 return;
7762}
7763
Aditya Bavanari20fd7812017-10-03 20:10:35 +05307764#ifdef INSTANCE_ID_ENABLED
7765void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
7766 int acdb_device_type, int app_type, int topology_id,
7767 int sample_rate, uint32_t module_id, uint16_t instance_id,
7768 uint32_t param_id, bool persist)
7769{
7770 int persist_send_flags = 1;
7771
7772 if (!cal) {
7773 return;
7774 }
7775
7776 if (persist)
7777 persist_send_flags |= 0x2;
7778
7779 memset(cal, 0, sizeof(acdb_audio_cal_cfg_t));
7780
7781 cal->persist = persist;
7782 cal->app_type = app_type;
7783 cal->acdb_dev_id = acdb_dev_id;
7784 cal->sampling_rate = sample_rate;
7785 cal->topo_id = topology_id;
7786 //if module and param id is set to 0, the whole blob will be stored
7787 //or sent to the DSP
7788 cal->module_id = module_id;
7789 cal->instance_id = instance_id;
7790 cal->param_id = param_id;
7791 cal->cal_type = acdb_device_type;
7792}
7793#else
7794void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007795 int acdb_device_type, int app_type, int topology_id,
7796 int sample_rate, uint32_t module_id, uint32_t param_id, bool persist)
7797{
7798 int persist_send_flags = 1;
7799
7800 if (!cal) {
7801 return;
7802 }
7803
7804 if (persist)
7805 persist_send_flags |= 0x2;
7806
7807 memset(cal, 0, sizeof(acdb_audio_cal_cfg_t));
7808
7809 cal->persist = persist;
7810 cal->app_type = app_type;
7811 cal->acdb_dev_id = acdb_dev_id;
7812 cal->sampling_rate = sample_rate;
7813 cal->topo_id = topology_id;
7814 //if module and param id is set to 0, the whole blob will be stored
7815 //or sent to the DSP
7816 cal->module_id = module_id;
7817 cal->param_id = param_id;
7818 cal->cal_type = acdb_device_type;
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007819}
Aditya Bavanari20fd7812017-10-03 20:10:35 +05307820#endif
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007821
Aditya Bavanari20fd7812017-10-03 20:10:35 +05307822int platform_send_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
7823 void* data, int length, bool persist)
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007824{
7825 int ret = 0;
7826 struct platform_data *my_data = (struct platform_data *)platform;
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007827
7828 if (!my_data) {
7829 ret = -EINVAL;
7830 goto ERROR_RETURN;
7831 }
7832
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007833 if (my_data->acdb_set_audio_cal) {
7834 // persist audio cal in local cache
7835 if (persist) {
Vignesh Kulothungan7d8a56a2018-05-29 14:33:24 -07007836 ret = my_data->acdb_set_audio_cal((void*)cal, data, (uint32_t)length);
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007837 }
7838 // send audio cal to dsp
7839 if (ret == 0) {
Aditya Bavanari20fd7812017-10-03 20:10:35 +05307840 cal->persist = false;
Vignesh Kulothungan7d8a56a2018-05-29 14:33:24 -07007841 ret = my_data->acdb_set_audio_cal((void*)cal, data, (uint32_t)length);
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007842 if (persist && (ret != 0)) {
7843 ALOGV("[%s] audio cal stored with success, ignore set cal failure", __func__);
7844 ret = 0;
7845 }
7846 }
7847 }
7848
7849ERROR_RETURN:
7850 return ret;
7851}
7852
Aditya Bavanari20fd7812017-10-03 20:10:35 +05307853int platform_get_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007854 void* data, int* length, bool persist)
7855{
7856 int ret = 0;
7857 struct platform_data *my_data = (struct platform_data *)platform;
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007858
7859 if (!my_data) {
7860 ret = -EINVAL;
7861 goto ERROR_RETURN;
7862 }
7863
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007864 if (my_data->acdb_get_audio_cal) {
7865 // get cal from dsp
Vignesh Kulothungan7d8a56a2018-05-29 14:33:24 -07007866 ret = my_data->acdb_get_audio_cal((void*)cal, data, (uint32_t*)length);
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007867 // get cached cal if prevoius attempt fails and persist flag is set
7868 if ((ret != 0) && persist) {
Aditya Bavanari20fd7812017-10-03 20:10:35 +05307869 cal->persist = true;
Vignesh Kulothungan7d8a56a2018-05-29 14:33:24 -07007870 ret = my_data->acdb_get_audio_cal((void*)cal, data, (uint32_t*)length);
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007871 }
7872 }
7873
7874ERROR_RETURN:
7875 return ret;
7876}
7877
Aditya Bavanari20fd7812017-10-03 20:10:35 +05307878int platform_store_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007879 void* data, int length)
7880{
7881 int ret = 0;
7882 struct platform_data *my_data = (struct platform_data *)platform;
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007883
7884 if (!my_data) {
7885 ret = -EINVAL;
7886 goto ERROR_RETURN;
7887 }
7888
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007889 if (my_data->acdb_set_audio_cal) {
Vignesh Kulothungan7d8a56a2018-05-29 14:33:24 -07007890 ret = my_data->acdb_set_audio_cal((void*)cal, data, (uint32_t)length);
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007891 }
7892
7893ERROR_RETURN:
7894 return ret;
7895}
7896
Aditya Bavanari20fd7812017-10-03 20:10:35 +05307897int platform_retrieve_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007898 void* data, int* length)
7899{
7900 int ret = 0;
7901 struct platform_data *my_data = (struct platform_data *)platform;
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007902
7903 if (!my_data) {
7904 ret = -EINVAL;
7905 goto ERROR_RETURN;
7906 }
7907
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007908 if (my_data->acdb_get_audio_cal) {
Vignesh Kulothungan7d8a56a2018-05-29 14:33:24 -07007909 ret = my_data->acdb_get_audio_cal((void*)cal, data, (uint32_t*)length);
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007910 }
7911
7912ERROR_RETURN:
7913 return ret;
7914}
Divya Narayanan Poojary45f19192016-09-30 18:52:13 +05307915
7916int platform_get_max_mic_count(void *platform) {
7917 struct platform_data *my_data = (struct platform_data *)platform;
7918 return my_data->max_mic_count;
7919}
Aniket Kumar Lataf56b6402016-10-27 12:03:18 -07007920
Vignesh Kulothungan3b5fae52017-09-25 12:16:30 -07007921#define DEFAULT_NOMINAL_SPEAKER_GAIN 20
7922int ramp_speaker_gain(struct audio_device *adev, bool ramp_up, int target_ramp_up_gain) {
7923 // backup_gain: gain to try to set in case of an error during ramp
7924 int start_gain, end_gain, step, backup_gain, i;
7925 bool error = false;
7926 const char *mixer_ctl_name_gain_left = "Left Speaker Gain";
7927 const char *mixer_ctl_name_gain_right = "Right Speaker Gain";
7928 struct mixer_ctl *ctl_left = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_left);
7929 struct mixer_ctl *ctl_right = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_right);
7930 if (!ctl_left || !ctl_right) {
7931 ALOGE("%s: Could not get ctl for mixer cmd - %s or %s, not applying speaker gain ramp",
7932 __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right);
7933 return -EINVAL;
7934 } else if ((mixer_ctl_get_num_values(ctl_left) != 1)
7935 || (mixer_ctl_get_num_values(ctl_right) != 1)) {
7936 ALOGE("%s: Unexpected num values for mixer cmd - %s or %s, not applying speaker gain ramp",
7937 __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right);
7938 return -EINVAL;
7939 }
7940 if (ramp_up) {
7941 start_gain = 0;
7942 end_gain = target_ramp_up_gain > 0 ? target_ramp_up_gain : DEFAULT_NOMINAL_SPEAKER_GAIN;
7943 step = +1;
7944 backup_gain = end_gain;
7945 } else {
7946 // using same gain on left and right
7947 const int left_gain = mixer_ctl_get_value(ctl_left, 0);
7948 start_gain = left_gain > 0 ? left_gain : DEFAULT_NOMINAL_SPEAKER_GAIN;
7949 end_gain = 0;
7950 step = -1;
7951 backup_gain = start_gain;
7952 }
7953 for (i = start_gain ; i != (end_gain + step) ; i += step) {
7954 if (mixer_ctl_set_value(ctl_left, 0, i)) {
7955 ALOGE("%s: error setting %s to %d during gain ramp",
7956 __func__, mixer_ctl_name_gain_left, i);
7957 error = true;
7958 break;
7959 }
7960 if (mixer_ctl_set_value(ctl_right, 0, i)) {
7961 ALOGE("%s: error setting %s to %d during gain ramp",
7962 __func__, mixer_ctl_name_gain_right, i);
7963 error = true;
7964 break;
7965 }
7966 usleep(1000);
7967 }
7968 if (error) {
7969 // an error occured during the ramp, let's still try to go back to a safe volume
7970 if (mixer_ctl_set_value(ctl_left, 0, backup_gain)) {
7971 ALOGE("%s: error restoring left gain to %d", __func__, backup_gain);
7972 }
7973 if (mixer_ctl_set_value(ctl_right, 0, backup_gain)) {
7974 ALOGE("%s: error restoring right gain to %d", __func__, backup_gain);
7975 }
7976 }
7977 return start_gain;
7978}
7979
7980int platform_set_swap_mixer(struct audio_device *adev, bool swap_channels)
7981{
7982 const char *mixer_ctl_name = "Swap channel";
7983 struct mixer_ctl *ctl;
7984 const char *mixer_path;
7985 struct platform_data *my_data = (struct platform_data *)adev->platform;
7986
7987 // forced to set to swap, but device not rotated ... ignore set
7988 if (swap_channels && !my_data->speaker_lr_swap)
7989 return 0;
7990
7991 ALOGV("%s:", __func__);
7992
7993 if (swap_channels)
7994 mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER_REVERSE);
7995 else
7996 mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER);
7997
7998 audio_route_apply_and_update_path(adev->audio_route, mixer_path);
7999
8000 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
8001 if (!ctl) {
8002 ALOGE("%s: Could not get ctl for mixer cmd - %s",__func__, mixer_ctl_name);
8003 return -EINVAL;
8004 }
8005
8006 if (mixer_ctl_set_value(ctl, 0, swap_channels) < 0) {
8007 ALOGE("%s: Could not set reverse cotrol %d",__func__, swap_channels);
8008 return -EINVAL;
8009 }
8010
8011 ALOGV("platfor_force_swap_channel :: Channel orientation ( %s ) ",
8012 swap_channels?"R --> L":"L --> R");
8013
8014 return 0;
8015}
8016
8017int platform_check_and_set_swap_lr_channels(struct audio_device *adev, bool swap_channels)
8018{
8019 // only update if there is active pcm playback on speaker
8020 struct platform_data *my_data = (struct platform_data *)adev->platform;
8021
8022 my_data->speaker_lr_swap = swap_channels;
8023
8024 return platform_set_swap_channels(adev, swap_channels);
8025}
8026
8027int platform_set_swap_channels(struct audio_device *adev, bool swap_channels)
8028{
8029 // only update if there is active pcm playback on speaker
8030 struct audio_usecase *usecase;
8031 struct listnode *node;
8032
kunleiz8c0c5632018-05-17 18:01:24 +08008033 //swap channels only for stereo spkr
8034 struct platform_data *my_data = (struct platform_data *)adev->platform;
8035 if (my_data) {
8036 if (!hw_info_is_stereo_spkr(my_data->hw_info)) {
8037 ALOGV("%s: will not swap due to it is not stereo spkr", __func__);
8038 return 0;
8039 }
8040 } else {
8041 ALOGE("%s: failed to allocate platform data", __func__);
8042 return -EINVAL;
8043 }
8044
Vignesh Kulothungan3b5fae52017-09-25 12:16:30 -07008045 // do not swap channels in audio modes with concurrent capture and playback
8046 // as this may break the echo reference
8047 if ((adev->mode == AUDIO_MODE_IN_COMMUNICATION) || (adev->mode == AUDIO_MODE_IN_CALL)) {
8048 ALOGV("%s: will not swap due to audio mode %d", __func__, adev->mode);
8049 return 0;
8050 }
8051
8052 list_for_each(node, &adev->usecase_list) {
8053 usecase = node_to_item(node, struct audio_usecase, list);
8054 if (usecase->type == PCM_PLAYBACK &&
8055 usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) {
8056 /*
8057 * If acdb tuning is different for SPEAKER_REVERSE, it is must
8058 * to perform device switch to disable the current backend to
8059 * enable it with new acdb data.
8060 */
kunleiz8c0c5632018-05-17 18:01:24 +08008061 if (my_data->speaker_lr_swap &&
8062 (acdb_device_table[SND_DEVICE_OUT_SPEAKER] !=
8063 acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE])) {
Vignesh Kulothungan3b5fae52017-09-25 12:16:30 -07008064 const int initial_skpr_gain = ramp_speaker_gain(adev, false /*ramp_up*/, -1);
8065 select_devices(adev, usecase->id);
8066 if (initial_skpr_gain != -EINVAL)
8067 ramp_speaker_gain(adev, true /*ramp_up*/, initial_skpr_gain);
8068
8069 } else {
8070 platform_set_swap_mixer(adev, swap_channels);
8071 }
8072 break;
8073 }
8074 }
8075
8076 return 0;
8077}
8078
Aniket Kumar Lataf56b6402016-10-27 12:03:18 -07008079static struct amp_db_and_gain_table tbl_mapping[MAX_VOLUME_CAL_STEPS];
8080static int num_gain_tbl_entry = 0;
8081
8082bool platform_add_gain_level_mapping(struct amp_db_and_gain_table *tbl_entry) {
8083
8084 ALOGV("%s: enter .. add %f %f %d", __func__, tbl_entry->amp, tbl_entry->db, tbl_entry->level);
8085 if (num_gain_tbl_entry == -1) {
8086 ALOGE("%s: num entry beyond valid step levels or corrupted..rejecting custom mapping",
8087 __func__);
8088 return false;
8089 }
8090
8091 if (num_gain_tbl_entry >= MAX_VOLUME_CAL_STEPS) {
8092 ALOGE("%s: max entry reached max[%d] current index[%d] .. rejecting", __func__,
8093 MAX_VOLUME_CAL_STEPS, num_gain_tbl_entry);
8094 num_gain_tbl_entry = -1; // indicates error and no more info will be cached
8095 return false;
8096 }
8097
8098 if (num_gain_tbl_entry > 0 && tbl_mapping[num_gain_tbl_entry - 1].amp >= tbl_entry->amp) {
8099 ALOGE("%s: value not in ascending order .. rejecting custom mapping", __func__);
8100 num_gain_tbl_entry = -1; // indicates error and no more info will be cached
8101 return false;
8102 }
8103
8104 tbl_mapping[num_gain_tbl_entry] = *tbl_entry;
8105 ++num_gain_tbl_entry;
8106
8107 return true;
8108}
8109
8110int platform_get_gain_level_mapping(struct amp_db_and_gain_table *mapping_tbl,
8111 int table_size) {
8112 int itt = 0;
8113 ALOGV("platform_get_gain_level_mapping called ");
8114
8115 if (num_gain_tbl_entry <= 0 || num_gain_tbl_entry > MAX_VOLUME_CAL_STEPS) {
8116 ALOGD("%s: empty or currupted gain_mapping_table", __func__);
8117 return 0;
8118 }
8119
8120 for (; itt < num_gain_tbl_entry && itt <= table_size; itt++) {
8121 mapping_tbl[itt] = tbl_mapping[itt];
8122 ALOGV("%s: added amp[%f] db[%f] level[%d]", __func__,
8123 mapping_tbl[itt].amp, mapping_tbl[itt].db, mapping_tbl[itt].level);
8124 }
8125
8126 return num_gain_tbl_entry;
8127}
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05308128
8129int platform_get_max_codec_backend() {
8130
8131 return MAX_CODEC_BACKENDS;
8132}
Revathi Uddaraju0553e8f2017-11-30 14:56:11 +05308133int platform_get_supported_copp_sampling_rate(uint32_t stream_sr)
Venugopal Nadipalli83134582017-09-21 22:34:50 +05308134{
8135 int sample_rate;
8136 switch (stream_sr){
8137 case 8000:
8138 case 11025:
8139 case 16000:
8140 case 22050:
8141 case 32000:
8142 case 48000:
8143 sample_rate = 48000;
8144 break;
8145 case 44100:
8146 sample_rate = 44100;
8147 break;
8148 case 64000:
8149 case 96000:
8150 sample_rate = 96000;
8151 break;
8152 case 88200:
8153 sample_rate = 88200;
8154 break;
8155 case 176400:
8156 sample_rate = 176400;
8157 break;
8158 case 192000:
8159 sample_rate = 192000;
8160 break;
8161 case 352800:
8162 sample_rate = 352800;
8163 break;
8164 case 384000:
8165 sample_rate = 384000;
8166 break;
8167 case 144000:
8168 default:
8169 sample_rate = 48000;
8170 break;
8171 }
8172 return sample_rate;
8173}
Haynes Mathew Georgeef514882017-05-01 17:46:23 -07008174
Dhananjay Kumar75c9a0c2018-06-07 15:59:00 +05308175#if defined (PLATFORM_MSM8998) || (PLATFORM_SDM845) || (PLATFORM_SDM670) || defined (PLATFORM_QCS605) || defined (PLATFORM_MSMNILE) || defined (PLATFORM_QCS405)
Haynes Mathew Georgeef514882017-05-01 17:46:23 -07008176int platform_get_mmap_data_fd(void *platform, int fe_dev, int dir, int *fd,
8177 uint32_t *size)
8178{
8179 struct platform_data *my_data = (struct platform_data *)platform;
8180 struct audio_device *adev = my_data->adev;
8181 int hw_fd = -1;
8182 char dev_name[128];
8183 struct snd_pcm_mmap_fd mmap_fd;
8184 memset(&mmap_fd, 0, sizeof(mmap_fd));
8185 mmap_fd.dir = dir;
8186 snprintf(dev_name, sizeof(dev_name), "/dev/snd/hwC%uD%u",
8187 adev->snd_card, HWDEP_FE_BASE+fe_dev);
8188 hw_fd = open(dev_name, O_RDONLY);
8189 if (hw_fd < 0) {
8190 ALOGE("fe hw dep node open %d/%d failed", adev->snd_card, fe_dev);
8191 return -1;
8192 }
8193 if (ioctl(hw_fd, SNDRV_PCM_IOCTL_MMAP_DATA_FD, &mmap_fd) < 0) {
8194 ALOGE("fe hw dep node ioctl failed");
8195 close(hw_fd);
8196 return -1;
8197 }
8198 *fd = mmap_fd.fd;
8199 *size = mmap_fd.size;
8200 close(hw_fd); // mmap_fd should still be valid
8201 return 0;
8202}
8203#else
8204int platform_get_mmap_data_fd(void *platform __unused, int fe_dev __unused,
8205 int dir __unused, int *fd __unused,
8206 uint32_t *size __unused)
8207{
8208 return -1;
8209}
8210#endif
`Deeraj Soman676c2702017-09-18 19:25:53 +05308211
8212static const char *platform_get_mixer_control(struct mixer_ctl *ctl)
8213{
8214 int id = -1;
8215 const char *id_string = NULL;
8216
8217 if (!ctl) {
8218 ALOGD("%s: mixer ctl not obtained", __func__);
8219 } else {
8220 id = mixer_ctl_get_value(ctl, 0);
8221 if (id >= 0) {
8222 id_string = mixer_ctl_get_enum_string(ctl, id);
8223 }
8224 }
8225
8226 return id_string;
8227}
Surendar karka30569792018-05-08 12:02:21 +05308228
8229int platform_get_license_by_product(void *platform, const char* product_name, int *product_id, char* product_license)
8230{
8231 return -ENOSYS;
8232}