blob: 77baa937679aae27feaf82e4e6d138367a158fc6 [file] [log] [blame]
Eric Laurentb23d5282013-05-14 15:27:20 -07001/*
Ashish Jain6fced6e2017-01-09 14:13:22 +05302 * Copyright (c) 2013-2017, 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"
Narsinga Rao Chella05573b72013-11-15 15:21:40 -080041#include "voice_extn.h"
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -070042#include "edid.h"
ApurupaPattapuc6a3a9e2014-01-10 14:46:02 -080043#include "sound/compress_params.h"
Anish Kumar55e6df22014-08-26 17:38:05 -070044#include "sound/msmcal-hwdep.h"
Lakshman Chaluvaraju22ba9f12016-09-12 11:42:10 +053045#include <linux/msm_audio_calibration.h>
Eric Laurentb23d5282013-05-14 15:27:20 -070046
Anish Kumar55e6df22014-08-26 17:38:05 -070047#define SOUND_TRIGGER_DEVICE_HANDSET_MONO_LOW_POWER_ACDB_ID (100)
Apoorv Raghuvanshia433fb52015-03-16 15:22:30 -070048#define MIXER_FILE_DELIMITER "_"
49#define MIXER_FILE_EXT ".xml"
50
Kuirong Wang0b73b3f2016-12-04 12:59:43 -080051#ifdef LINUX_ENABLED
52#define MIXER_XML_BASE_STRING "/etc/mixer_paths"
53#define MIXER_XML_DEFAULT_PATH "/etc/mixer_paths.xml"
54#define PLATFORM_INFO_XML_PATH "/etc/audio_platform_info.xml"
55#define MIXER_XML_PATH_AUXPCM "/etc/mixer_paths_auxpcm.xml"
56#define MIXER_XML_PATH_I2S "/etc/mixer_paths_i2s.xml"
57#define PLATFORM_INFO_XML_PATH_I2S "/etc/audio_platform_info_i2s.xml"
58#else
59#define MIXER_XML_BASE_STRING "/system/etc/mixer_paths"
60#define MIXER_XML_DEFAULT_PATH "/system/etc/mixer_paths.xml"
61#define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml"
62#define MIXER_XML_PATH_AUXPCM "/system/etc/mixer_paths_auxpcm.xml"
63#define MIXER_XML_PATH_I2S "/system/etc/mixer_paths_i2s.xml"
64#define PLATFORM_INFO_XML_PATH_I2S "/system/etc/audio_platform_info_i2s.xml"
65#endif
Helen Zeng6a16ad72014-02-23 22:04:44 -080066
vivek mehtaa76401a2015-04-24 14:12:15 -070067#include <linux/msm_audio.h>
Helen Zeng6a16ad72014-02-23 22:04:44 -080068
Eric Laurentb23d5282013-05-14 15:27:20 -070069#define LIB_ACDB_LOADER "libacdbloader.so"
Walter Yang6f800052014-07-14 16:15:38 -070070#define CVD_VERSION_MIXER_CTL "CVD Version"
Eric Laurentb23d5282013-05-14 15:27:20 -070071
Preetam Singh Ranawatf5fbdd62016-09-29 18:38:31 +053072#define FLAC_COMPRESS_OFFLOAD_FRAGMENT_SIZE (256 * 1024)
73#define MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE (2 * 1024 * 1024)
ApurupaPattapuc6a3a9e2014-01-10 14:46:02 -080074#define MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE (2 * 1024)
75#define COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING (2 * 1024)
76#define COMPRESS_OFFLOAD_FRAGMENT_SIZE (32 * 1024)
77
Vikram Panduranga7e784962016-10-27 12:32:30 -070078#define DEFAULT_RX_BACKEND "SLIMBUS_0_RX"
79
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -070080/*
81 * Offload buffer size for compress passthrough
82 */
83#define MIN_COMPRESS_PASSTHROUGH_FRAGMENT_SIZE (2 * 1024)
84#define MAX_COMPRESS_PASSTHROUGH_FRAGMENT_SIZE (8 * 1024)
85
Eric Laurentb23d5282013-05-14 15:27:20 -070086/*
Eric Laurentb23d5282013-05-14 15:27:20 -070087 * This file will have a maximum of 38 bytes:
88 *
89 * 4 bytes: number of audio blocks
90 * 4 bytes: total length of Short Audio Descriptor (SAD) blocks
91 * Maximum 10 * 3 bytes: SAD blocks
92 */
93#define MAX_SAD_BLOCKS 10
94#define SAD_BLOCK_SIZE 3
95
Walter Yang6f800052014-07-14 16:15:38 -070096#define MAX_CVD_VERSION_STRING_SIZE 100
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +053097#define MAX_SND_CARD_STRING_SIZE 100
Walter Yang6f800052014-07-14 16:15:38 -070098
Eric Laurentb23d5282013-05-14 15:27:20 -070099/* EDID format ID for LPCM audio */
100#define EDID_FORMAT_LPCM 1
101
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700102/* fallback app type if the default app type from acdb loader fails */
Srikanth Uyyalaa1e32352015-10-09 14:48:04 +0530103#define DEFAULT_APP_TYPE_RX_PATH 0x11130
104#define DEFAULT_APP_TYPE_TX_PATH 0x11132
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700105
sangwoo1b9f4b32013-06-21 18:22:55 -0700106/* Retry for delay in FW loading*/
107#define RETRY_NUMBER 10
108#define RETRY_US 500000
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -0800109#define MAX_SND_CARD 8
sangwoo1b9f4b32013-06-21 18:22:55 -0700110
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700111#define SAMPLE_RATE_8KHZ 8000
112#define SAMPLE_RATE_16KHZ 16000
113
Ben Rombergera04fabc2014-11-14 12:16:03 -0800114#define MAX_SET_CAL_BYTE_SIZE 65536
115
Vikram Panduranga6e761cd2016-10-12 16:50:52 -0700116/* Mixer path names */
117#define AFE_SIDETONE_MIXER_PATH "afe-sidetone"
118
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700119#define AUDIO_PARAMETER_KEY_FLUENCE_TYPE "fluence"
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700120#define AUDIO_PARAMETER_KEY_SLOWTALK "st_enable"
Avinash Vaishd5fa4572014-09-15 14:41:14 +0530121#define AUDIO_PARAMETER_KEY_HD_VOICE "hd_voice"
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800122#define AUDIO_PARAMETER_KEY_VOLUME_BOOST "volume_boost"
Ben Rombergera04fabc2014-11-14 12:16:03 -0800123#define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data"
124#define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
125
Rohit kumarf4120402016-08-05 19:19:48 +0530126#define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
127
Sudheer Papothifa9d2282015-09-17 01:53:25 +0530128#define AUDIO_PARAMETER_KEY_PERF_LOCK_OPTS "perf_lock_opts"
Ben Rombergera04fabc2014-11-14 12:16:03 -0800129
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +0530130/* Reload ACDB files from specified path */
131#define AUDIO_PARAMETER_KEY_RELOAD_ACDB "reload_acdb"
132
Tanya Finkel00130052014-07-14 04:26:56 -0700133/* Query external audio device connection status */
134#define AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE "ext_audio_device"
135
136#define EVENT_EXTERNAL_SPK_1 "qc_ext_spk_1"
137#define EVENT_EXTERNAL_SPK_2 "qc_ext_spk_2"
138#define EVENT_EXTERNAL_MIC "qc_ext_mic"
Anish Kumar55e6df22014-08-26 17:38:05 -0700139#define MAX_CAL_NAME 20
Naresh Tanniru34a303c2016-01-27 17:26:41 +0530140#define MAX_MIME_TYPE_LENGTH 30
Anish Kumar55e6df22014-08-26 17:38:05 -0700141
142char cal_name_info[WCD9XXX_MAX_CAL][MAX_CAL_NAME] = {
143 [WCD9XXX_ANC_CAL] = "anc_cal",
144 [WCD9XXX_MBHC_CAL] = "mbhc_cal",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700145 [WCD9XXX_VBAT_CAL] = "vbat_cal",
Anish Kumar55e6df22014-08-26 17:38:05 -0700146};
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800147
Sidipotu Ashok42483b62015-09-08 10:21:44 +0530148#define AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED "is_hw_dec_session_allowed"
149
Naresh Tanniru34a303c2016-01-27 17:26:41 +0530150char dsp_only_decoders_mime[][MAX_MIME_TYPE_LENGTH] = {
Sidipotu Ashok42483b62015-09-08 10:21:44 +0530151 "audio/x-ms-wma" /* wma*/ ,
152 "audio/x-ms-wma-lossless" /* wma lossless */ ,
153 "audio/x-ms-wma-pro" /* wma prop */ ,
154 "audio/amr-wb-plus" /* amr wb plus */ ,
155 "audio/alac" /*alac */ ,
156 "audio/x-ape" /*ape */,
157};
158
159
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800160enum {
161 VOICE_FEATURE_SET_DEFAULT,
162 VOICE_FEATURE_SET_VOLUME_BOOST
163};
sangwoo53b2cf02013-07-25 19:18:44 -0700164
Eric Laurentb23d5282013-05-14 15:27:20 -0700165struct audio_block_header
166{
167 int reserved;
168 int length;
169};
170
Ben Rombergera04fabc2014-11-14 12:16:03 -0800171typedef struct acdb_audio_cal_cfg {
172 uint32_t persist;
173 uint32_t snd_dev_id;
174 audio_devices_t dev_id;
175 int32_t acdb_dev_id;
176 uint32_t app_type;
177 uint32_t topo_id;
178 uint32_t sampling_rate;
179 uint32_t cal_type;
180 uint32_t module_id;
181 uint32_t param_id;
182} acdb_audio_cal_cfg_t;
183
vivek mehtaa76401a2015-04-24 14:12:15 -0700184enum {
185 CAL_MODE_SEND = 0x1,
186 CAL_MODE_PERSIST = 0x2,
187 CAL_MODE_RTAC = 0x4
188};
189
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800190/* Audio calibration related functions */
Eric Laurentb23d5282013-05-14 15:27:20 -0700191typedef void (*acdb_deallocate_t)();
Dhananjay Kumara3565b32014-07-23 01:12:48 +0530192typedef int (*acdb_init_t)(const char *, char *, int);
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530193typedef int (*acdb_init_v3_t)(const char *, char *, struct listnode *);
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700194typedef void (*acdb_send_audio_cal_t)(int, int, int , int);
Siena Richard7c2db772016-12-21 11:32:34 -0800195typedef void (*acdb_send_audio_cal_v3_t)(int, int, int, int, int);
Eric Laurentb23d5282013-05-14 15:27:20 -0700196typedef void (*acdb_send_voice_cal_t)(int, int);
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800197typedef int (*acdb_reload_vocvoltable_t)(int);
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700198typedef int (*acdb_get_default_app_type_t)(void);
Anish Kumar55e6df22014-08-26 17:38:05 -0700199typedef int (*acdb_loader_get_calibration_t)(char *attr, int size, void *data);
200acdb_loader_get_calibration_t acdb_loader_get_calibration;
Ben Rombergera04fabc2014-11-14 12:16:03 -0800201typedef int (*acdb_set_audio_cal_t) (void *, void *, uint32_t);
202typedef int (*acdb_get_audio_cal_t) (void *, void *, uint32_t*);
Ben Rombergerfeca4b82015-07-07 20:40:44 -0700203typedef int (*acdb_send_common_top_t) (void);
Banajit Goswami20cdd212015-09-11 01:11:30 -0700204typedef int (*acdb_set_codec_data_t) (void *, char *);
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +0530205typedef int (*acdb_reload_t) (char *, char *, char *, int);
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530206typedef int (*acdb_reload_v2_t) (char *, char *, char *, struct listnode *);
Eric Laurentb23d5282013-05-14 15:27:20 -0700207
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800208typedef struct codec_backend_cfg {
209 uint32_t sample_rate;
210 uint32_t bit_width;
Ashish Jaind84fd6a2016-07-27 12:33:25 +0530211 uint32_t channels;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -0800212 char *bitwidth_mixer_ctl;
213 char *samplerate_mixer_ctl;
Ashish Jaind84fd6a2016-07-27 12:33:25 +0530214 char *channels_mixer_ctl;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -0800215} codec_backend_cfg_t;
216
Ashish Jain4826f6c2017-02-06 13:33:20 +0530217static native_audio_prop na_props = {0, 0, NATIVE_AUDIO_MODE_INVALID};
Ashish Jainf1eaa582016-05-23 20:54:24 +0530218static bool supports_true_32_bit = false;
vivek mehtaa76401a2015-04-24 14:12:15 -0700219typedef int (*acdb_send_gain_dep_cal_t)(int, int, int, int, int);
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800220
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530221struct meta_key_list {
222 struct listnode list;
223 struct audio_cal_info_metainfo cal_info;
224 char name[ACDB_METAINFO_KEY_MODULE_NAME_LEN];
225};
226
Siena Richard7c2db772016-12-21 11:32:34 -0800227static int max_be_dai_names = 0;
228static const struct be_dai_name_struct *be_dai_name_table;
229
Eric Laurentb23d5282013-05-14 15:27:20 -0700230struct platform_data {
231 struct audio_device *adev;
232 bool fluence_in_spkr_mode;
233 bool fluence_in_voice_call;
234 bool fluence_in_voice_rec;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800235 bool fluence_in_audio_rec;
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +0530236 bool fluence_in_hfp_call;
Tanya Finkel00130052014-07-14 04:26:56 -0700237 bool external_spk_1;
238 bool external_spk_2;
239 bool external_mic;
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700240 int fluence_type;
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -0800241 int fluence_mode;
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +0530242 char fluence_cap[PROPERTY_VALUE_MAX];
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700243 bool slowtalk;
Avinash Vaishd5fa4572014-09-15 14:41:14 +0530244 bool hd_voice;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +0530245 bool ec_ref_enabled;
Helen Zeng6a16ad72014-02-23 22:04:44 -0800246 bool is_i2s_ext_modem;
Ramjee Singh203473b2015-06-09 15:18:42 +0530247 bool is_acdb_initialized;
Banajit Goswami20cdd212015-09-11 01:11:30 -0700248 /* Vbat monitor related flags */
249 bool is_vbat_speaker;
250 bool gsm_mode_enabled;
Rohit kumarf4120402016-08-05 19:19:48 +0530251 int mono_speaker;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700252 /* Audio calibration related functions */
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800253 void *acdb_handle;
254 int voice_feature_set;
255 acdb_init_t acdb_init;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530256 acdb_init_v3_t acdb_init_v3;
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800257 acdb_deallocate_t acdb_deallocate;
258 acdb_send_audio_cal_t acdb_send_audio_cal;
Siena Richard7c2db772016-12-21 11:32:34 -0800259 acdb_send_audio_cal_v3_t acdb_send_audio_cal_v3;
Ben Rombergera04fabc2014-11-14 12:16:03 -0800260 acdb_set_audio_cal_t acdb_set_audio_cal;
261 acdb_get_audio_cal_t acdb_get_audio_cal;
Ben Rombergerc1dc70d2013-12-19 15:11:17 -0800262 acdb_send_voice_cal_t acdb_send_voice_cal;
263 acdb_reload_vocvoltable_t acdb_reload_vocvoltable;
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700264 acdb_get_default_app_type_t acdb_get_default_app_type;
Ben Rombergerfeca4b82015-07-07 20:40:44 -0700265 acdb_send_common_top_t acdb_send_common_top;
Banajit Goswami20cdd212015-09-11 01:11:30 -0700266 acdb_set_codec_data_t acdb_set_codec_data;
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +0530267 acdb_reload_t acdb_reload;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530268 acdb_reload_v2_t acdb_reload_v2;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700269 void *hw_info;
vivek mehtaa76401a2015-04-24 14:12:15 -0700270 acdb_send_gain_dep_cal_t acdb_send_gain_dep_cal;
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800271 struct csd_data *csd;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700272 void *edid_info;
273 bool edid_valid;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700274 int ext_disp_type;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -0700275 char ec_ref_mixer_path[64];
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -0800276 codec_backend_cfg_t current_backend_cfg[MAX_CODEC_BACKENDS];
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +0530277 char codec_version[CODEC_VERSION_MAX_LENGTH];
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +0530278 int hw_dep_fd;
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +0530279 char cvd_version[MAX_CVD_VERSION_STRING_SIZE];
280 char snd_card_name[MAX_SND_CARD_STRING_SIZE];
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530281 int source_mic_type;
282 int max_mic_count;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +0530283 bool is_dsd_supported;
Preetam Singh Ranawatb0c0dd72016-08-18 00:32:06 +0530284 bool is_asrc_supported;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530285 struct listnode acdb_meta_key_list;
Eric Laurentb23d5282013-05-14 15:27:20 -0700286};
287
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700288static int pcm_device_table[AUDIO_USECASE_MAX][2] = {
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700289 [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE,
290 DEEP_BUFFER_PCM_DEVICE},
291 [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700292 LOWLATENCY_PCM_DEVICE},
Ravi Kumar Alamanda474de5a2015-06-25 20:08:01 -0700293 [USECASE_AUDIO_PLAYBACK_ULL] = {MULTIMEDIA3_PCM_DEVICE,
294 MULTIMEDIA3_PCM_DEVICE},
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700295 [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE,
Ravi Kumar Alamanda474de5a2015-06-25 20:08:01 -0700296 MULTIMEDIA2_PCM_DEVICE},
Krishnankutty Kolathappillya43f96e2013-11-01 12:17:53 -0700297 [USECASE_AUDIO_PLAYBACK_OFFLOAD] =
298 {PLAYBACK_OFFLOAD_DEVICE, PLAYBACK_OFFLOAD_DEVICE},
Subhash Chandra Bose Naripeddy16ff4f82014-04-01 21:03:10 -0700299 [USECASE_AUDIO_PLAYBACK_OFFLOAD2] =
300 {PLAYBACK_OFFLOAD_DEVICE2, PLAYBACK_OFFLOAD_DEVICE2},
301 [USECASE_AUDIO_PLAYBACK_OFFLOAD3] =
302 {PLAYBACK_OFFLOAD_DEVICE3, PLAYBACK_OFFLOAD_DEVICE3},
303 [USECASE_AUDIO_PLAYBACK_OFFLOAD4] =
304 {PLAYBACK_OFFLOAD_DEVICE4, PLAYBACK_OFFLOAD_DEVICE4},
305 [USECASE_AUDIO_PLAYBACK_OFFLOAD5] =
306 {PLAYBACK_OFFLOAD_DEVICE5, PLAYBACK_OFFLOAD_DEVICE5},
307 [USECASE_AUDIO_PLAYBACK_OFFLOAD6] =
308 {PLAYBACK_OFFLOAD_DEVICE6, PLAYBACK_OFFLOAD_DEVICE6},
309 [USECASE_AUDIO_PLAYBACK_OFFLOAD7] =
310 {PLAYBACK_OFFLOAD_DEVICE7, PLAYBACK_OFFLOAD_DEVICE7},
311 [USECASE_AUDIO_PLAYBACK_OFFLOAD8] =
312 {PLAYBACK_OFFLOAD_DEVICE8, PLAYBACK_OFFLOAD_DEVICE8},
313 [USECASE_AUDIO_PLAYBACK_OFFLOAD9] =
314 {PLAYBACK_OFFLOAD_DEVICE9, PLAYBACK_OFFLOAD_DEVICE9},
vivek mehta0ea887a2015-08-26 14:01:20 -0700315
vivek mehta0ea887a2015-08-26 14:01:20 -0700316
Shiv Maliyappanahallida107642013-10-17 11:16:13 -0700317 [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
Mingming Yine62d7842013-10-25 16:26:03 -0700318 [USECASE_AUDIO_RECORD_COMPRESS] = {COMPRESS_CAPTURE_DEVICE, COMPRESS_CAPTURE_DEVICE},
Dhananjay Kumaree4d2002016-10-25 18:02:58 +0530319 [USECASE_AUDIO_RECORD_COMPRESS2] = {-1, -1},
320 [USECASE_AUDIO_RECORD_COMPRESS3] = {-1, -1},
321 [USECASE_AUDIO_RECORD_COMPRESS4] = {-1, -1},
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700322 [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
323 LOWLATENCY_PCM_DEVICE},
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700324 [USECASE_AUDIO_RECORD_FM_VIRTUAL] = {MULTIMEDIA2_PCM_DEVICE,
325 MULTIMEDIA2_PCM_DEVICE},
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700326 [USECASE_AUDIO_PLAYBACK_FM] = {FM_PLAYBACK_PCM_DEVICE, FM_CAPTURE_PCM_DEVICE},
Vimal Puthanveed5b4d3f12013-11-05 15:57:39 -0800327 [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
Vimal Puthanveed47e64852013-12-20 13:23:39 -0800328 [USECASE_AUDIO_HFP_SCO_WB] = {HFP_PCM_RX, HFP_SCO_RX},
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700329 [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE, VOICE_CALL_PCM_DEVICE},
330 [USECASE_VOICE2_CALL] = {VOICE2_CALL_PCM_DEVICE, VOICE2_CALL_PCM_DEVICE},
331 [USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE},
332 [USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE},
Vicky Sehrawat7e4fc152014-02-12 17:58:59 -0800333 [USECASE_VOWLAN_CALL] = {VOWLAN_CALL_PCM_DEVICE, VOWLAN_CALL_PCM_DEVICE},
Vidyakumar Athota0e109352015-02-12 17:38:22 -0800334 [USECASE_VOICEMMODE1_CALL] = {VOICEMMODE1_CALL_PCM_DEVICE,
335 VOICEMMODE1_CALL_PCM_DEVICE},
336 [USECASE_VOICEMMODE2_CALL] = {VOICEMMODE2_CALL_PCM_DEVICE,
337 VOICEMMODE2_CALL_PCM_DEVICE},
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800338 [USECASE_COMPRESS_VOIP_CALL] = {COMPRESS_VOIP_CALL_PCM_DEVICE, COMPRESS_VOIP_CALL_PCM_DEVICE},
Shiv Maliyappanahallida107642013-10-17 11:16:13 -0700339 [USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE,
340 AUDIO_RECORD_PCM_DEVICE},
341 [USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
342 AUDIO_RECORD_PCM_DEVICE},
343 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
344 AUDIO_RECORD_PCM_DEVICE},
Helen Zenge56b4852013-12-03 16:54:40 -0800345 [USECASE_INCALL_REC_UPLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
346 COMPRESS_CAPTURE_DEVICE},
347 [USECASE_INCALL_REC_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
348 COMPRESS_CAPTURE_DEVICE},
349 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
350 COMPRESS_CAPTURE_DEVICE},
Shiv Maliyappanahallif3b9a422013-10-22 16:38:08 -0700351 [USECASE_INCALL_MUSIC_UPLINK] = {INCALL_MUSIC_UPLINK_PCM_DEVICE,
352 INCALL_MUSIC_UPLINK_PCM_DEVICE},
353 [USECASE_INCALL_MUSIC_UPLINK2] = {INCALL_MUSIC_UPLINK2_PCM_DEVICE,
354 INCALL_MUSIC_UPLINK2_PCM_DEVICE},
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700355 [USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1},
356 [USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE},
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700357
358 [USECASE_AUDIO_PLAYBACK_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
359 AFE_PROXY_RECORD_PCM_DEVICE},
360 [USECASE_AUDIO_RECORD_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
361 AFE_PROXY_RECORD_PCM_DEVICE},
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700362 [USECASE_AUDIO_PLAYBACK_EXT_DISP_SILENCE] = {MULTIMEDIA9_PCM_DEVICE, -1},
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700363
Eric Laurentb23d5282013-05-14 15:27:20 -0700364};
365
366/* Array to store sound devices */
367static const char * const device_table[SND_DEVICE_MAX] = {
368 [SND_DEVICE_NONE] = "none",
369 /* Playback sound devices */
370 [SND_DEVICE_OUT_HANDSET] = "handset",
371 [SND_DEVICE_OUT_SPEAKER] = "speaker",
Tanya Finkel00130052014-07-14 04:26:56 -0700372 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_1] = "speaker-ext-1",
373 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_2] = "speaker-ext-2",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700374 [SND_DEVICE_OUT_SPEAKER_VBAT] = "speaker-vbat",
Eric Laurentb23d5282013-05-14 15:27:20 -0700375 [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse",
376 [SND_DEVICE_OUT_HEADPHONES] = "headphones",
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +0530377 [SND_DEVICE_OUT_HEADPHONES_DSD] = "headphones-dsd",
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800378 [SND_DEVICE_OUT_HEADPHONES_44_1] = "headphones-44.1",
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700379 [SND_DEVICE_OUT_LINE] = "line",
Eric Laurentb23d5282013-05-14 15:27:20 -0700380 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700381 [SND_DEVICE_OUT_SPEAKER_AND_LINE] = "speaker-and-line",
Tanya Finkel00130052014-07-14 04:26:56 -0700382 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = "speaker-and-headphones-ext-1",
383 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = "speaker-and-headphones-ext-2",
Eric Laurentb23d5282013-05-14 15:27:20 -0700384 [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
385 [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700386 [SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "voice-speaker-vbat",
Rohit kumarf4120402016-08-05 19:19:48 +0530387 [SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
388 [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = "voice-speaker-2-vbat",
Eric Laurentb23d5282013-05-14 15:27:20 -0700389 [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700390 [SND_DEVICE_OUT_VOICE_LINE] = "voice-line",
Eric Laurentb23d5282013-05-14 15:27:20 -0700391 [SND_DEVICE_OUT_HDMI] = "hdmi",
392 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700393 [SND_DEVICE_OUT_DISPLAY_PORT] = "display-port",
394 [SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = "speaker-and-display-port",
Eric Laurentb23d5282013-05-14 15:27:20 -0700395 [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700396 [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530397 [SND_DEVICE_OUT_BT_A2DP] = "bt-a2dp",
398 [SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = "speaker-and-bt-a2dp",
Eric Laurentb23d5282013-05-14 15:27:20 -0700399 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
400 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
401 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700402 [SND_DEVICE_OUT_VOICE_TTY_FULL_USB] = "voice-tty-full-usb",
403 [SND_DEVICE_OUT_VOICE_TTY_VCO_USB] = "voice-tty-vco-usb",
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700404 [SND_DEVICE_OUT_VOICE_TX] = "voice-tx",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700405 [SND_DEVICE_OUT_AFE_PROXY] = "afe-proxy",
Ashish Jain3e37a702016-11-25 12:27:15 +0530406 [SND_DEVICE_OUT_USB_HEADSET] = "usb-headset",
407 [SND_DEVICE_OUT_USB_HEADPHONES] = "usb-headphones",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700408 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = "speaker-and-usb-headphones",
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700409 [SND_DEVICE_OUT_TRANSMISSION_FM] = "transmission-fm",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700410 [SND_DEVICE_OUT_ANC_HEADSET] = "anc-headphones",
411 [SND_DEVICE_OUT_ANC_FB_HEADSET] = "anc-fb-headphones",
412 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = "voice-anc-headphones",
413 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = "voice-anc-fb-headphones",
Preetam Singh Ranawat91132162017-03-13 20:32:03 +0530414 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = "voice-speaker-and-voice-headphones",
415 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = "voice-speaker-and-voice-anc-headphones",
416 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = "voice-speaker-and-voice-anc-fb-headphones",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700417 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
Meng Wang841d6c02017-01-24 12:34:36 +0800418 [SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET] = "speaker-and-anc-fb-headphones",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700419 [SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700420 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
Anish Kumar46c7b872014-09-09 01:49:44 -0700421 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
Rohit kumarf4120402016-08-05 19:19:48 +0530422 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700423 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
424 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
Rohit kumarf4120402016-08-05 19:19:48 +0530425 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = "voice-speaker-2-protected-vbat",
Srinivas Julakanti1ca769a2017-01-04 23:18:08 -0800426 [SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = "speaker-protected",
427 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = "speaker-protected-vbat",
Eric Laurentb23d5282013-05-14 15:27:20 -0700428
429 /* Capture sound devices */
430 [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
Tanya Finkel00130052014-07-14 04:26:56 -0700431 [SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = "handset-mic-ext",
Eric Laurentb23d5282013-05-14 15:27:20 -0700432 [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800433 [SND_DEVICE_IN_HANDSET_MIC_NS] = "handset-mic",
434 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = "handset-mic",
435 [SND_DEVICE_IN_HANDSET_DMIC] = "dmic-endfire",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800436 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = "dmic-endfire",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800437 [SND_DEVICE_IN_HANDSET_DMIC_NS] = "dmic-endfire",
438 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = "dmic-endfire",
439 [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800440 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800441 [SND_DEVICE_IN_SPEAKER_MIC_NS] = "speaker-mic",
442 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = "speaker-mic",
443 [SND_DEVICE_IN_SPEAKER_DMIC] = "speaker-dmic-endfire",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800444 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = "speaker-dmic-endfire",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800445 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = "speaker-dmic-endfire",
446 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = "speaker-dmic-endfire",
447 [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic",
448 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = "headset-mic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700449 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
450 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
451 [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
452 [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700453 [SND_DEVICE_IN_BT_SCO_MIC_NREC] = "bt-sco-mic",
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700454 [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700455 [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = "bt-sco-mic-wb",
Eric Laurentb23d5282013-05-14 15:27:20 -0700456 [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700457 [SND_DEVICE_IN_VOICE_DMIC] = "voice-dmic-ef",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700458 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = "voice-speaker-dmic-ef",
Vidyakumar Athotaadfe4e32013-12-13 14:51:26 -0800459 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = "voice-speaker-qmic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700460 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
461 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
462 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700463 [SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC] = "voice-tty-full-usb-mic",
464 [SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC] = "voice-tty-hco-usb-mic",
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700465 [SND_DEVICE_IN_VOICE_RX] = "voice-rx",
466
Eric Laurentb23d5282013-05-14 15:27:20 -0700467 [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800468 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800469 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700470 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700471 [SND_DEVICE_IN_USB_HEADSET_MIC] = "usb-headset-mic",
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700472 [SND_DEVICE_IN_CAPTURE_FM] = "capture-fm",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700473 [SND_DEVICE_IN_AANC_HANDSET_MIC] = "aanc-handset-mic",
Shiv Maliyappanahallidd287262016-01-08 15:57:07 -0800474 [SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = "aanc-handset-mic",
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700475 [SND_DEVICE_IN_QUAD_MIC] = "quad-mic",
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -0700476 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
477 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700478 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
Rohit kumarf4120402016-08-05 19:19:48 +0530479 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = "vi-feedback-mono-1",
480 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = "vi-feedback-mono-2",
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -0800481 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = "voice-speaker-dmic-broadside",
482 [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = "speaker-dmic-broadside",
483 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = "speaker-dmic-broadside",
484 [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = "speaker-dmic-broadside",
485 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = "speaker-dmic-broadside",
Narsinga Rao Chella975572e2014-10-21 11:49:00 -0700486 [SND_DEVICE_IN_HANDSET_QMIC] = "quad-mic",
487 [SND_DEVICE_IN_SPEAKER_QMIC_AEC] = "quad-mic",
488 [SND_DEVICE_IN_SPEAKER_QMIC_NS] = "quad-mic",
489 [SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS] = "quad-mic",
Ben Romberger182c8252016-07-18 16:54:54 -0700490 [SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE] = "quad-mic",
Shiv Maliyappanahalli5a10aea2015-07-02 10:36:23 -0700491 [SND_DEVICE_IN_THREE_MIC] = "three-mic",
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530492 [SND_DEVICE_IN_HANDSET_TMIC] = "three-mic",
Ben Rombergera4d76db2016-10-13 15:26:02 -0700493 [SND_DEVICE_IN_VOICE_REC_TMIC] = "three-mic",
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +0530494 [SND_DEVICE_IN_UNPROCESSED_MIC] = "unprocessed-mic",
495 [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = "voice-rec-dmic-ef",
496 [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = "three-mic",
497 [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = "quad-mic",
498 [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = "headset-mic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700499};
500
Amit Shekhar5a39c912014-10-14 15:39:30 -0700501// Platform specific backend bit width table
502static int backend_bit_width_table[SND_DEVICE_MAX] = {0};
503
Eric Laurentb23d5282013-05-14 15:27:20 -0700504/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
Ben Romberger55886882014-01-10 13:49:02 -0800505static int acdb_device_table[SND_DEVICE_MAX] = {
Eric Laurentb23d5282013-05-14 15:27:20 -0700506 [SND_DEVICE_NONE] = -1,
507 [SND_DEVICE_OUT_HANDSET] = 7,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800508 [SND_DEVICE_OUT_SPEAKER] = 14,
Tanya Finkel87af1a52015-03-27 14:54:23 -0700509 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_1] = 130,
510 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_2] = 130,
Banajit Goswami20cdd212015-09-11 01:11:30 -0700511 [SND_DEVICE_OUT_SPEAKER_VBAT] = 14,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800512 [SND_DEVICE_OUT_SPEAKER_REVERSE] = 14,
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700513 [SND_DEVICE_OUT_LINE] = 10,
Eric Laurentb23d5282013-05-14 15:27:20 -0700514 [SND_DEVICE_OUT_HEADPHONES] = 10,
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +0530515 [SND_DEVICE_OUT_HEADPHONES_DSD] = 10,
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800516 [SND_DEVICE_OUT_HEADPHONES_44_1] = 10,
Eric Laurentb23d5282013-05-14 15:27:20 -0700517 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10,
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700518 [SND_DEVICE_OUT_SPEAKER_AND_LINE] = 10,
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -0800519 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = 130,
520 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = 130,
Eric Laurentb23d5282013-05-14 15:27:20 -0700521 [SND_DEVICE_OUT_VOICE_HANDSET] = 7,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800522 [SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
Banajit Goswami20cdd212015-09-11 01:11:30 -0700523 [SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = 14,
Rohit kumarf4120402016-08-05 19:19:48 +0530524 [SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
525 [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700526 [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700527 [SND_DEVICE_OUT_VOICE_LINE] = 10,
Preetam Singh Ranawat91132162017-03-13 20:32:03 +0530528 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = 10,
529 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = 10,
530 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = 10,
Eric Laurentb23d5282013-05-14 15:27:20 -0700531 [SND_DEVICE_OUT_HDMI] = 18,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800532 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700533 [SND_DEVICE_OUT_DISPLAY_PORT] = 18,
534 [SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700535 [SND_DEVICE_OUT_BT_SCO] = 22,
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700536 [SND_DEVICE_OUT_BT_SCO_WB] = 39,
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530537 [SND_DEVICE_OUT_BT_A2DP] = 20,
538 [SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700539 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
540 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
541 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700542 [SND_DEVICE_OUT_VOICE_TTY_FULL_USB] = 17,
543 [SND_DEVICE_OUT_VOICE_TTY_VCO_USB] = 17,
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700544 [SND_DEVICE_OUT_VOICE_TX] = 45,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700545 [SND_DEVICE_OUT_AFE_PROXY] = 0,
Vidyakumar Athotab9522202014-01-14 20:08:27 -0800546 [SND_DEVICE_OUT_USB_HEADSET] = 45,
Ashish Jain3e37a702016-11-25 12:27:15 +0530547 [SND_DEVICE_OUT_USB_HEADPHONES] = 45,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700548 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 14,
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700549 [SND_DEVICE_OUT_TRANSMISSION_FM] = 0,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700550 [SND_DEVICE_OUT_ANC_HEADSET] = 26,
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700551 [SND_DEVICE_OUT_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700552 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = 26,
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700553 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700554 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26,
Meng Wang841d6c02017-01-24 12:34:36 +0800555 [SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700556 [SND_DEVICE_OUT_ANC_HANDSET] = 103,
Anish Kumar46c7b872014-09-09 01:49:44 -0700557 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124,
558 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101,
Rohit kumarf4120402016-08-05 19:19:48 +0530559 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = 101,
Banajit Goswami20cdd212015-09-11 01:11:30 -0700560 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
561 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
Rohit kumarf4120402016-08-05 19:19:48 +0530562 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
Srinivas Julakanti1ca769a2017-01-04 23:18:08 -0800563 [SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = 134,
564 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = 134,
Eric Laurentb23d5282013-05-14 15:27:20 -0700565 [SND_DEVICE_IN_HANDSET_MIC] = 4,
Tanya Finkel00130052014-07-14 04:26:56 -0700566 [SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = 4,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800567 [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106,
568 [SND_DEVICE_IN_HANDSET_MIC_NS] = 107,
569 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = 108,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800570 [SND_DEVICE_IN_HANDSET_DMIC] = 41,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800571 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = 109,
572 [SND_DEVICE_IN_HANDSET_DMIC_NS] = 110,
573 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = 111,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800574 [SND_DEVICE_IN_SPEAKER_MIC] = 11,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800575 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 112,
576 [SND_DEVICE_IN_SPEAKER_MIC_NS] = 113,
577 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = 114,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800578 [SND_DEVICE_IN_SPEAKER_DMIC] = 43,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800579 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = 115,
580 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = 116,
581 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117,
Eric Laurentb23d5282013-05-14 15:27:20 -0700582 [SND_DEVICE_IN_HEADSET_MIC] = 8,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800583 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = 47,
Eric Laurentb23d5282013-05-14 15:27:20 -0700584 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
585 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
586 [SND_DEVICE_IN_HDMI_MIC] = 4,
587 [SND_DEVICE_IN_BT_SCO_MIC] = 21,
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700588 [SND_DEVICE_IN_BT_SCO_MIC_NREC] = 122,
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700589 [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700590 [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = 123,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800591 [SND_DEVICE_IN_CAMCORDER_MIC] = 4,
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700592 [SND_DEVICE_IN_VOICE_DMIC] = 41,
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700593 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43,
Vidyakumar Athotaadfe4e32013-12-13 14:51:26 -0800594 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = 19,
Eric Laurentb23d5282013-05-14 15:27:20 -0700595 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
596 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
597 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700598 [SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC] = 16,
599 [SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC] = 16,
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -0700600 [SND_DEVICE_IN_VOICE_RX] = 44,
601
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800602 [SND_DEVICE_IN_VOICE_REC_MIC] = 4,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800603 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = 107,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800604 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 34,
605 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 41,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700606 [SND_DEVICE_IN_USB_HEADSET_MIC] = 44,
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700607 [SND_DEVICE_IN_CAPTURE_FM] = 0,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700608 [SND_DEVICE_IN_AANC_HANDSET_MIC] = 104,
Shiv Maliyappanahallidd287262016-01-08 15:57:07 -0800609 [SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = 105,
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700610 [SND_DEVICE_IN_QUAD_MIC] = 46,
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -0700611 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
612 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700613 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
Rohit kumarf4120402016-08-05 19:19:48 +0530614 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = 102,
615 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = 102,
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -0800616 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = 12,
617 [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = 12,
618 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = 119,
619 [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = 121,
620 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = 120,
Narsinga Rao Chella975572e2014-10-21 11:49:00 -0700621 [SND_DEVICE_IN_HANDSET_QMIC] = 125,
622 [SND_DEVICE_IN_SPEAKER_QMIC_AEC] = 126,
623 [SND_DEVICE_IN_SPEAKER_QMIC_NS] = 127,
624 [SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS] = 129,
Ben Romberger182c8252016-07-18 16:54:54 -0700625 [SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE] = 125,
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530626 [SND_DEVICE_IN_THREE_MIC] = 46, /* for APSS Surround Sound Recording */
627 [SND_DEVICE_IN_HANDSET_TMIC] = 125, /* for 3mic recording with fluence */
Ben Rombergera4d76db2016-10-13 15:26:02 -0700628 [SND_DEVICE_IN_VOICE_REC_TMIC] = 125,
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +0530629 [SND_DEVICE_IN_UNPROCESSED_MIC] = 143,
630 [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = 144,
631 [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = 145,
632 [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = 146,
633 [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = 147,
Eric Laurentb23d5282013-05-14 15:27:20 -0700634};
635
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700636struct name_to_index {
Ben Romberger61764e32014-01-10 13:49:02 -0800637 char name[100];
638 unsigned int index;
639};
640
641#define TO_NAME_INDEX(X) #X, X
642
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800643/* Used to get index from parsed string */
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700644static struct name_to_index snd_device_name_index[SND_DEVICE_MAX] = {
Ben Romberger61764e32014-01-10 13:49:02 -0800645 {TO_NAME_INDEX(SND_DEVICE_OUT_HANDSET)},
646 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER)},
Tanya Finkel00130052014-07-14 04:26:56 -0700647 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_EXTERNAL_1)},
648 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_EXTERNAL_2)},
Banajit Goswami20cdd212015-09-11 01:11:30 -0700649 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_VBAT)},
Ben Romberger61764e32014-01-10 13:49:02 -0800650 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_REVERSE)},
651 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES)},
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +0530652 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES_DSD)},
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -0800653 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES_44_1)},
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700654 {TO_NAME_INDEX(SND_DEVICE_OUT_LINE)},
Ben Romberger61764e32014-01-10 13:49:02 -0800655 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES)},
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700656 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_LINE)},
Tanya Finkel00130052014-07-14 04:26:56 -0700657 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1)},
658 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2)},
Ben Romberger61764e32014-01-10 13:49:02 -0800659 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET)},
660 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
Banajit Goswami20cdd212015-09-11 01:11:30 -0700661 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)},
Rohit kumarf4120402016-08-05 19:19:48 +0530662 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2)},
663 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)},
Ben Romberger61764e32014-01-10 13:49:02 -0800664 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -0700665 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)},
Ben Romberger61764e32014-01-10 13:49:02 -0800666 {TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
667 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HDMI)},
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700668 {TO_NAME_INDEX(SND_DEVICE_OUT_DISPLAY_PORT)},
669 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT)},
Ben Romberger61764e32014-01-10 13:49:02 -0800670 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO)},
671 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)},
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530672 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_A2DP)},
673 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP)},
Ben Romberger61764e32014-01-10 13:49:02 -0800674 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
675 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)},
676 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)},
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700677 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_USB)},
678 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_USB)},
Ben Romberger61764e32014-01-10 13:49:02 -0800679 {TO_NAME_INDEX(SND_DEVICE_OUT_AFE_PROXY)},
680 {TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADSET)},
Ashish Jain3e37a702016-11-25 12:27:15 +0530681 {TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADPHONES)},
Ben Romberger61764e32014-01-10 13:49:02 -0800682 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET)},
683 {TO_NAME_INDEX(SND_DEVICE_OUT_TRANSMISSION_FM)},
684 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HEADSET)},
685 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_FB_HEADSET)},
686 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_ANC_HEADSET)},
687 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET)},
688 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET)},
Meng Wang841d6c02017-01-24 12:34:36 +0800689 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET)},
Ben Romberger61764e32014-01-10 13:49:02 -0800690 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)},
691 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
Anish Kumar46c7b872014-09-09 01:49:44 -0700692 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
Rohit kumarf4120402016-08-05 19:19:48 +0530693 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
Banajit Goswami20cdd212015-09-11 01:11:30 -0700694 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
695 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
Rohit kumarf4120402016-08-05 19:19:48 +0530696 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
Srinivas Julakanti1ca769a2017-01-04 23:18:08 -0800697 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS)},
698 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS)},
Ben Romberger61764e32014-01-10 13:49:02 -0800699 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
Tanya Finkel00130052014-07-14 04:26:56 -0700700 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_EXTERNAL)},
Ben Romberger61764e32014-01-10 13:49:02 -0800701 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)},
702 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_NS)},
703 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)},
704 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC)},
705 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC)},
706 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_NS)},
707 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)},
708 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC)},
709 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC)},
710 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_NS)},
711 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)},
712 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC)},
713 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC)},
714 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS)},
715 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)},
716 {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC)},
717 {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC_FLUENCE)},
718 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
719 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
720 {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
721 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC)},
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700722 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_NREC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800723 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB)},
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700724 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB_NREC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800725 {TO_NAME_INDEX(SND_DEVICE_IN_CAMCORDER_MIC)},
726 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC)},
727 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC)},
728 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_QMIC)},
729 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC)},
730 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC)},
731 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC)},
Aniket Kumar Lata91886592017-05-25 16:53:32 -0700732 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC)},
733 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800734 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC)},
735 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_NS)},
736 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_STEREO)},
737 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)},
738 {TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MIC)},
739 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_FM)},
740 {TO_NAME_INDEX(SND_DEVICE_IN_AANC_HANDSET_MIC)},
Shiv Maliyappanahallidd287262016-01-08 15:57:07 -0800741 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800742 {TO_NAME_INDEX(SND_DEVICE_IN_QUAD_MIC)},
743 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_STEREO_DMIC)},
744 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_STEREO_DMIC)},
745 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
Rohit kumarf4120402016-08-05 19:19:48 +0530746 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1)},
747 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2)},
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -0800748 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE)},
749 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE)},
750 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE)},
751 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE)},
752 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE)},
Narsinga Rao Chella975572e2014-10-21 11:49:00 -0700753 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC)},
754 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC)},
755 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_NS)},
756 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS)},
Ben Romberger182c8252016-07-18 16:54:54 -0700757 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE)},
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530758 {TO_NAME_INDEX(SND_DEVICE_IN_THREE_MIC)},
759 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC)},
Ben Rombergera4d76db2016-10-13 15:26:02 -0700760 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_TMIC)},
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +0530761 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_MIC)},
762 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_STEREO_MIC)},
763 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_THREE_MIC)},
764 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_QUAD_MIC)},
765 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC)},
Ben Romberger61764e32014-01-10 13:49:02 -0800766};
767
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +0530768static char * backend_tag_table[SND_DEVICE_MAX] = {0};
769static char * hw_interface_table[SND_DEVICE_MAX] = {0};
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700770
771static struct name_to_index usecase_name_index[AUDIO_USECASE_MAX] = {
772 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_DEEP_BUFFER)},
773 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_LOW_LATENCY)},
Ravi Kumar Alamanda474de5a2015-06-25 20:08:01 -0700774 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_ULL)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700775 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MULTI_CH)},
776 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD)},
Alexy Joseph2f89cfa2014-10-06 12:15:01 -0700777 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD2)},
778 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD3)},
779 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD4)},
780 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD5)},
781 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD6)},
782 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD7)},
783 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD8)},
784 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD9)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700785 {TO_NAME_INDEX(USECASE_AUDIO_RECORD)},
Dhananjay Kumaree4d2002016-10-25 18:02:58 +0530786 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS)},
787 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS2)},
788 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS3)},
789 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS4)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700790 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_LOW_LATENCY)},
791 {TO_NAME_INDEX(USECASE_VOICE_CALL)},
792 {TO_NAME_INDEX(USECASE_VOICE2_CALL)},
793 {TO_NAME_INDEX(USECASE_VOLTE_CALL)},
794 {TO_NAME_INDEX(USECASE_QCHAT_CALL)},
795 {TO_NAME_INDEX(USECASE_VOWLAN_CALL)},
Shiv Maliyappanahallif2d2a492016-05-11 22:03:47 -0700796 {TO_NAME_INDEX(USECASE_VOICEMMODE1_CALL)},
797 {TO_NAME_INDEX(USECASE_VOICEMMODE2_CALL)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700798 {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK)},
799 {TO_NAME_INDEX(USECASE_INCALL_REC_DOWNLINK)},
800 {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK_AND_DOWNLINK)},
801 {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO)},
Satya Krishna Pindiprolic6b0a742017-02-03 14:37:18 +0530802 {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO_WB)},
Shiv Maliyappanahallie236ff02016-05-26 11:47:48 -0700803 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_FM)},
804 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_FM_VIRTUAL)},
Stephen Oglesbyf8a7bf92016-05-11 14:23:16 -0700805 {TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_RX)},
806 {TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_TX)},
Garmond Leunge1e8c762016-06-27 16:35:15 -0700807 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_AFE_PROXY)},
808 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_AFE_PROXY)},
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700809 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_EXT_DISP_SILENCE)},
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -0700810};
811
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700812#define NO_COLS 2
813#ifdef PLATFORM_APQ8084
814static int msm_device_to_be_id [][NO_COLS] = {
815 {AUDIO_DEVICE_OUT_EARPIECE , 2},
816 {AUDIO_DEVICE_OUT_SPEAKER , 2},
817 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 2},
818 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 2},
819 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
820 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
821 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
822 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
823 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
824 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
825 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
826 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
827 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
828 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
829 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
830 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
831 {AUDIO_DEVICE_OUT_PROXY , 9},
832 {AUDIO_DEVICE_OUT_FM , 7},
833 {AUDIO_DEVICE_OUT_FM_TX , 8},
834 {AUDIO_DEVICE_OUT_ALL , -1},
835 {AUDIO_DEVICE_NONE , -1},
836 {AUDIO_DEVICE_OUT_DEFAULT , -1},
837};
838#elif PLATFORM_MSM8994
839static int msm_device_to_be_id [][NO_COLS] = {
840 {AUDIO_DEVICE_OUT_EARPIECE , 2},
841 {AUDIO_DEVICE_OUT_SPEAKER , 2},
842 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 2},
843 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 2},
844 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 38},
845 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 38},
846 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 38},
847 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
848 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
849 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
850 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
851 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
852 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
853 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
854 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
855 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
856 {AUDIO_DEVICE_OUT_PROXY , 9},
857/* Add the correct be ids */
858 {AUDIO_DEVICE_OUT_FM , 7},
859 {AUDIO_DEVICE_OUT_FM_TX , 8},
860 {AUDIO_DEVICE_OUT_ALL , -1},
861 {AUDIO_DEVICE_NONE , -1},
862 {AUDIO_DEVICE_OUT_DEFAULT , -1},
863};
Pradnya Chaphekarf0b1cfe2015-04-15 16:52:49 -0700864#elif PLATFORM_MSM8996
865static int msm_device_to_be_id [][NO_COLS] = {
866 {AUDIO_DEVICE_OUT_EARPIECE , 2},
867 {AUDIO_DEVICE_OUT_SPEAKER , 2},
Sharad Sangle1f705a72016-10-05 20:01:39 +0530868 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 41},
869 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 41},
Pradnya Chaphekarf0b1cfe2015-04-15 16:52:49 -0700870 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
871 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
872 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
873 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
874 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
875 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
876 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
877 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
878 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
879 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
880 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
881 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
882 {AUDIO_DEVICE_OUT_PROXY , 9},
883/* Add the correct be ids */
884 {AUDIO_DEVICE_OUT_FM , 7},
885 {AUDIO_DEVICE_OUT_FM_TX , 8},
886 {AUDIO_DEVICE_OUT_ALL , -1},
887 {AUDIO_DEVICE_NONE , -1},
888 {AUDIO_DEVICE_OUT_DEFAULT , -1},
889};
Weiyin Jiang6f4c8062016-11-23 15:30:29 +0800890#elif PLATFORM_MSM8998
891static int msm_device_to_be_id [][NO_COLS] = {
892 {AUDIO_DEVICE_OUT_EARPIECE , 2},
893 {AUDIO_DEVICE_OUT_SPEAKER , 2},
894 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 41},
895 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 41},
896 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
897 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
898 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
899 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
900 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
901 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
902 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
903 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
904 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
905 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
906 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
907 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
908 {AUDIO_DEVICE_OUT_PROXY , 9},
909/* Add the correct be ids */
910 {AUDIO_DEVICE_OUT_FM , 7},
911 {AUDIO_DEVICE_OUT_FM_TX , 8},
912 {AUDIO_DEVICE_OUT_ALL , -1},
913 {AUDIO_DEVICE_NONE , -1},
914 {AUDIO_DEVICE_OUT_DEFAULT , -1},
915};
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700916#else
917static int msm_device_to_be_id [][NO_COLS] = {
918 {AUDIO_DEVICE_NONE, -1},
919};
920#endif
921static int msm_be_id_array_len =
922 sizeof(msm_device_to_be_id) / sizeof(msm_device_to_be_id[0]);
923
924
Haynes Mathew George7ff216f2013-09-11 19:51:41 -0700925#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL)
Ashish Jain5106d362016-05-11 19:23:33 +0530926#define PCM_OFFLOAD_PLATFORM_DELAY (30*1000LL)
Haynes Mathew George7ff216f2013-09-11 19:51:41 -0700927#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
Haynes Mathew George5beddd42016-06-27 18:33:40 -0700928#define ULL_PLATFORM_DELAY (6*1000LL)
Haynes Mathew George7ff216f2013-09-11 19:51:41 -0700929
Preetam Singh Ranawatbfec31e2017-05-04 11:51:50 +0530930static bool can_enable_mbdrc_on_device(snd_device_t snd_device)
931{
932 bool ret = false;
933
934 if (snd_device == SND_DEVICE_OUT_SPEAKER ||
935 snd_device == SND_DEVICE_OUT_SPEAKER_WSA ||
936 snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
937 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
938 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
939 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
940 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
941 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
942 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
943 ret = true;
944 }
945 return ret;
946}
947
vivek mehtaa76401a2015-04-24 14:12:15 -0700948bool platform_send_gain_dep_cal(void *platform, int level) {
949 bool ret_val = false;
950 struct platform_data *my_data = (struct platform_data *)platform;
951 struct audio_device *adev = my_data->adev;
952 int acdb_dev_id, app_type;
953 int acdb_dev_type = MSM_SNDDEV_CAP_RX;
954 int mode = CAL_MODE_RTAC;
955 struct listnode *node;
956 struct audio_usecase *usecase;
957
958 if (my_data->acdb_send_gain_dep_cal == NULL) {
959 ALOGE("%s: dlsym error for acdb_send_gain_dep_cal", __func__);
960 return ret_val;
961 }
962
963 if (!voice_is_in_call(adev)) {
964 ALOGV("%s: Not Voice call usecase, apply new cal for level %d",
965 __func__, level);
966
967 // find the current active sound device
968 list_for_each(node, &adev->usecase_list) {
969 usecase = node_to_item(node, struct audio_usecase, list);
970
971 if (usecase != NULL &&
972 usecase->type == PCM_PLAYBACK &&
Preetam Singh Ranawatbfec31e2017-05-04 11:51:50 +0530973 usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) {
974 int new_snd_device[2] = {0};
975 int i, num_devices = 1;
vivek mehtaa76401a2015-04-24 14:12:15 -0700976
977 ALOGV("%s: out device is %d", __func__, usecase->out_snd_device);
978 app_type = usecase->stream.out->app_type_cfg.app_type;
vivek mehta0b8ea6f2015-07-23 17:27:26 -0700979
Preetam Singh Ranawatbfec31e2017-05-04 11:51:50 +0530980 if (platform_split_snd_device(my_data, usecase->out_snd_device,
981 &num_devices, new_snd_device) < 0)
982 new_snd_device[0] = usecase->out_snd_device;
983
984 for (i = 0; i < num_devices; i++)
985 if (can_enable_mbdrc_on_device(new_snd_device[i])) {
986 if (audio_extn_spkr_prot_is_enabled())
987 acdb_dev_id = platform_get_spkr_prot_acdb_id(new_snd_device[i]);
988 else
989 acdb_dev_id = acdb_device_table[new_snd_device[i]];
990 }
vivek mehta0b8ea6f2015-07-23 17:27:26 -0700991
vivek mehtaa76401a2015-04-24 14:12:15 -0700992 if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type,
993 acdb_dev_type, mode, level)) {
994 // set ret_val true if at least one calibration is set successfully
995 ret_val = true;
996 } else {
997 ALOGE("%s: my_data->acdb_send_gain_dep_cal failed ", __func__);
998 }
999 } else {
1000 ALOGW("%s: Usecase list is empty", __func__);
1001 }
1002 }
1003 } else {
1004 ALOGW("%s: Voice call in progress .. ignore setting new cal",
1005 __func__);
1006 }
1007 return ret_val;
1008}
1009
Banajit Goswami20cdd212015-09-11 01:11:30 -07001010void platform_set_gsm_mode(void *platform, bool enable)
1011{
1012 struct platform_data *my_data = (struct platform_data *)platform;
1013 struct audio_device *adev = my_data->adev;
1014
1015 if (my_data->gsm_mode_enabled) {
1016 my_data->gsm_mode_enabled = false;
1017 ALOGV("%s: disabling gsm mode", __func__);
1018 audio_route_reset_and_update_path(adev->audio_route, "gsm-mode");
1019 }
1020
1021 if (enable) {
1022 my_data->gsm_mode_enabled = true;
1023 ALOGD("%s: enabling gsm mode", __func__);
1024 audio_route_apply_and_update_path(adev->audio_route, "gsm-mode");
1025 }
1026}
1027
1028void platform_set_echo_reference(struct audio_device *adev, bool enable,
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05301029 audio_devices_t out_device __unused)
Eric Laurentb23d5282013-05-14 15:27:20 -07001030{
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001031 struct platform_data *my_data = (struct platform_data *)adev->platform;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001032
1033 if (strcmp(my_data->ec_ref_mixer_path, "")) {
1034 ALOGV("%s: disabling %s", __func__, my_data->ec_ref_mixer_path);
Banajit Goswami20cdd212015-09-11 01:11:30 -07001035 audio_route_reset_and_update_path(adev->audio_route,
1036 my_data->ec_ref_mixer_path);
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05301037 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001038
Ravi Kumar Alamandad1c85bb2014-11-17 18:36:24 -08001039 if (enable) {
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001040 /*
1041 * If native audio device reference count > 0, then apply codec EC otherwise
Banajit Goswami20cdd212015-09-11 01:11:30 -07001042 * fallback to Speakers with VBat if enabled or default
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001043 */
1044 if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_HEADPHONES_44_1] > 0)
Banajit Goswami20cdd212015-09-11 01:11:30 -07001045 strlcpy(my_data->ec_ref_mixer_path, "echo-reference headphones-44.1",
1046 sizeof(my_data->ec_ref_mixer_path));
Leena Winterrowdd7a04cd2016-01-07 11:50:02 -08001047 else if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_SPEAKER_VBAT] > 0)
Banajit Goswami20cdd212015-09-11 01:11:30 -07001048 strlcpy(my_data->ec_ref_mixer_path, "echo-reference speaker-vbat",
1049 sizeof(my_data->ec_ref_mixer_path));
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001050 else
Banajit Goswami20cdd212015-09-11 01:11:30 -07001051 strlcpy(my_data->ec_ref_mixer_path, "echo-reference",
1052 sizeof(my_data->ec_ref_mixer_path));
Ravi Kumar Alamandad1c85bb2014-11-17 18:36:24 -08001053
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07001054 ALOGD("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
1055 audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
1056 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001057}
1058
Helen Zeng6a16ad72014-02-23 22:04:44 -08001059static struct csd_data *open_csd_client(bool i2s_ext_modem)
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001060{
1061 struct csd_data *csd = calloc(1, sizeof(struct csd_data));
1062
Haynes Mathew Georgeb51ceb12014-06-30 13:56:18 -07001063 if (!csd) {
1064 ALOGE("failed to allocate csd_data mem");
1065 return NULL;
1066 }
1067
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001068 csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW);
1069 if (csd->csd_client == NULL) {
1070 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT);
1071 goto error;
1072 } else {
1073 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT);
1074
1075 csd->deinit = (deinit_t)dlsym(csd->csd_client,
1076 "csd_client_deinit");
1077 if (csd->deinit == NULL) {
1078 ALOGE("%s: dlsym error %s for csd_client_deinit", __func__,
1079 dlerror());
1080 goto error;
1081 }
1082 csd->disable_device = (disable_device_t)dlsym(csd->csd_client,
1083 "csd_client_disable_device");
1084 if (csd->disable_device == NULL) {
1085 ALOGE("%s: dlsym error %s for csd_client_disable_device",
1086 __func__, dlerror());
1087 goto error;
1088 }
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08001089 csd->enable_device_config = (enable_device_config_t)dlsym(csd->csd_client,
1090 "csd_client_enable_device_config");
1091 if (csd->enable_device_config == NULL) {
1092 ALOGE("%s: dlsym error %s for csd_client_enable_device_config",
1093 __func__, dlerror());
1094 goto error;
1095 }
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001096 csd->enable_device = (enable_device_t)dlsym(csd->csd_client,
1097 "csd_client_enable_device");
1098 if (csd->enable_device == NULL) {
1099 ALOGE("%s: dlsym error %s for csd_client_enable_device",
1100 __func__, dlerror());
1101 goto error;
1102 }
1103 csd->start_voice = (start_voice_t)dlsym(csd->csd_client,
1104 "csd_client_start_voice");
1105 if (csd->start_voice == NULL) {
1106 ALOGE("%s: dlsym error %s for csd_client_start_voice",
1107 __func__, dlerror());
1108 goto error;
1109 }
1110 csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client,
1111 "csd_client_stop_voice");
1112 if (csd->stop_voice == NULL) {
1113 ALOGE("%s: dlsym error %s for csd_client_stop_voice",
1114 __func__, dlerror());
1115 goto error;
1116 }
1117 csd->volume = (volume_t)dlsym(csd->csd_client,
1118 "csd_client_volume");
1119 if (csd->volume == NULL) {
1120 ALOGE("%s: dlsym error %s for csd_client_volume",
1121 __func__, dlerror());
1122 goto error;
1123 }
1124 csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client,
1125 "csd_client_mic_mute");
1126 if (csd->mic_mute == NULL) {
1127 ALOGE("%s: dlsym error %s for csd_client_mic_mute",
1128 __func__, dlerror());
1129 goto error;
1130 }
1131 csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client,
1132 "csd_client_slow_talk");
1133 if (csd->slow_talk == NULL) {
1134 ALOGE("%s: dlsym error %s for csd_client_slow_talk",
1135 __func__, dlerror());
1136 goto error;
1137 }
1138 csd->start_playback = (start_playback_t)dlsym(csd->csd_client,
1139 "csd_client_start_playback");
1140 if (csd->start_playback == NULL) {
1141 ALOGE("%s: dlsym error %s for csd_client_start_playback",
1142 __func__, dlerror());
1143 goto error;
1144 }
1145 csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client,
1146 "csd_client_stop_playback");
1147 if (csd->stop_playback == NULL) {
1148 ALOGE("%s: dlsym error %s for csd_client_stop_playback",
1149 __func__, dlerror());
1150 goto error;
1151 }
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -07001152 csd->set_lch = (set_lch_t)dlsym(csd->csd_client, "csd_client_set_lch");
1153 if (csd->set_lch == NULL) {
1154 ALOGE("%s: dlsym error %s for csd_client_set_lch",
1155 __func__, dlerror());
1156 /* Ignore the error as this is not mandatory function for
1157 * basic voice call to work.
1158 */
1159 }
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001160 csd->start_record = (start_record_t)dlsym(csd->csd_client,
1161 "csd_client_start_record");
1162 if (csd->start_record == NULL) {
1163 ALOGE("%s: dlsym error %s for csd_client_start_record",
1164 __func__, dlerror());
1165 goto error;
1166 }
1167 csd->stop_record = (stop_record_t)dlsym(csd->csd_client,
1168 "csd_client_stop_record");
1169 if (csd->stop_record == NULL) {
1170 ALOGE("%s: dlsym error %s for csd_client_stop_record",
1171 __func__, dlerror());
1172 goto error;
1173 }
Helen Zeng6a16ad72014-02-23 22:04:44 -08001174
1175 csd->get_sample_rate = (get_sample_rate_t)dlsym(csd->csd_client,
1176 "csd_client_get_sample_rate");
1177 if (csd->get_sample_rate == NULL) {
1178 ALOGE("%s: dlsym error %s for csd_client_get_sample_rate",
1179 __func__, dlerror());
1180
1181 goto error;
1182 }
1183
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001184 csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init");
1185
1186 if (csd->init == NULL) {
1187 ALOGE("%s: dlsym error %s for csd_client_init",
1188 __func__, dlerror());
1189 goto error;
1190 } else {
Helen Zeng6a16ad72014-02-23 22:04:44 -08001191 csd->init(i2s_ext_modem);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001192 }
1193 }
1194 return csd;
1195
1196error:
1197 free(csd);
1198 csd = NULL;
1199 return csd;
1200}
1201
1202void close_csd_client(struct csd_data *csd)
1203{
1204 if (csd != NULL) {
1205 csd->deinit();
1206 dlclose(csd->csd_client);
1207 free(csd);
1208 csd = NULL;
1209 }
1210}
1211
Helen Zeng6a16ad72014-02-23 22:04:44 -08001212static bool platform_is_i2s_ext_modem(const char *snd_card_name,
1213 struct platform_data *plat_data)
1214{
1215 plat_data->is_i2s_ext_modem = false;
1216
1217 if (!strncmp(snd_card_name, "apq8084-taiko-i2s-mtp-snd-card",
1218 sizeof("apq8084-taiko-i2s-mtp-snd-card")) ||
1219 !strncmp(snd_card_name, "apq8084-taiko-i2s-cdp-snd-card",
1220 sizeof("apq8084-taiko-i2s-cdp-snd-card"))) {
1221 plat_data->is_i2s_ext_modem = true;
1222 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301223 ALOGV("%s, is_i2s_ext_modem:%d soundcard name is %s",__func__,
1224 plat_data->is_i2s_ext_modem, snd_card_name);
Helen Zeng6a16ad72014-02-23 22:04:44 -08001225
1226 return plat_data->is_i2s_ext_modem;
Helen Zeng008aebd2014-02-23 19:13:12 -08001227}
1228
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05301229static void set_platform_defaults(struct platform_data * my_data)
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001230{
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05301231 int32_t dev;
1232 unsigned int count = 0;
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301233 const char *MEDIA_MIMETYPE_AUDIO_ALAC = "audio/alac";
1234 const char *MEDIA_MIMETYPE_AUDIO_APE = "audio/x-ape";
1235
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001236 for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301237 backend_tag_table[dev] = NULL;
1238 hw_interface_table[dev] = NULL;
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001239 }
Amit Shekhar5a39c912014-10-14 15:39:30 -07001240 for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08001241 backend_bit_width_table[dev] = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Amit Shekhar5a39c912014-10-14 15:39:30 -07001242 }
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001243
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301244 // To overwrite these go to the audio_platform_info.xml file.
1245 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("bt-sco");
1246 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("bt-sco-wb");
1247 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("bt-sco");
1248 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("bt-sco-wb");
1249 backend_tag_table[SND_DEVICE_OUT_BT_SCO] = strdup("bt-sco");
1250 backend_tag_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("bt-sco-wb");
1251 backend_tag_table[SND_DEVICE_OUT_HDMI] = strdup("hdmi");
1252 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("speaker-and-hdmi");
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07001253 backend_tag_table[SND_DEVICE_OUT_DISPLAY_PORT] = strdup("display-port");
1254 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = strdup("speaker-and-display-port");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301255 backend_tag_table[SND_DEVICE_OUT_VOICE_TX] = strdup("afe-proxy");
1256 backend_tag_table[SND_DEVICE_IN_VOICE_RX] = strdup("afe-proxy");
1257 backend_tag_table[SND_DEVICE_OUT_AFE_PROXY] = strdup("afe-proxy");
Ashish Jain3e37a702016-11-25 12:27:15 +05301258 backend_tag_table[SND_DEVICE_OUT_USB_HEADSET] = strdup("usb-headset");
1259 backend_tag_table[SND_DEVICE_OUT_USB_HEADPHONES] = strdup("usb-headphones");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301260 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] =
Sidipotu Ashokeaec6392016-04-19 09:37:57 +05301261 strdup("speaker-and-usb-headphones");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301262 backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MIC] = strdup("usb-headset-mic");
1263 backend_tag_table[SND_DEVICE_IN_CAPTURE_FM] = strdup("capture-fm");
1264 backend_tag_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("transmission-fm");
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05301265 backend_tag_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("headphones-dsd");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301266 backend_tag_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
1267 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("voice-speaker-vbat");
Rohit kumarf4120402016-08-05 19:19:48 +05301268 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("voice-speaker-2-vbat");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301269 backend_tag_table[SND_DEVICE_OUT_BT_A2DP] = strdup("bt-a2dp");
1270 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05301271 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
1272 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
1273 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = strdup("speaker-and-headphones");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301274
Siena Richard7c2db772016-12-21 11:32:34 -08001275 hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
1276 hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
1277 hw_interface_table[SND_DEVICE_OUT_SPEAKER_EXTERNAL_1] = strdup("SLIMBUS_0_RX");
1278 hw_interface_table[SND_DEVICE_OUT_SPEAKER_EXTERNAL_2] = strdup("SLIMBUS_0_RX");
1279 hw_interface_table[SND_DEVICE_OUT_SPEAKER_REVERSE] = strdup("SLIMBUS_0_RX");
1280 hw_interface_table[SND_DEVICE_OUT_SPEAKER_VBAT] = strdup("SLIMBUS_0_RX");
1281 hw_interface_table[SND_DEVICE_OUT_LINE] = strdup("SLIMBUS_6_RX");
1282 hw_interface_table[SND_DEVICE_OUT_HEADPHONES] = strdup("SLIMBUS_6_RX");
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05301283 hw_interface_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("SLIMBUS_2_RX");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301284 hw_interface_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("SLIMBUS_5_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001285 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 +05301286 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1287 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1288 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 -08001289 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1290 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1291 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1292 hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET] = strdup("SLIMBUS_0_RX");
1293 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER] = strdup("SLIMBUS_0_RX");
1294 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("SLIMBUS_0_RX");
1295 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2] = strdup("SLIMBUS_0_RX");
1296 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("SLIMBUS_0_RX");
1297 hw_interface_table[SND_DEVICE_OUT_VOICE_HEADPHONES] = strdup("SLIMBUS_6_RX");
1298 hw_interface_table[SND_DEVICE_OUT_VOICE_LINE] = strdup("SLIMBUS_6_RX");
1299 hw_interface_table[SND_DEVICE_OUT_HDMI] = strdup("HDMI");
1300 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("SLIMBUS_0_RX-and-HDMI");
1301 hw_interface_table[SND_DEVICE_OUT_DISPLAY_PORT] = strdup("DISPLAY_PORT");
1302 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = strdup("SLIMBUS_0_RX-and-DISPLAY_PORT");
1303 hw_interface_table[SND_DEVICE_OUT_BT_SCO] = strdup("SLIMBUS_7_RX");
1304 hw_interface_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("SLIMBUS_7_RX");
1305 hw_interface_table[SND_DEVICE_OUT_BT_A2DP] = strdup("SLIMBUS_7_RX");
1306 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("SLIMBUS_0_RX-and-SLIMBUS_7_RX");
1307 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = strdup("SLIMBUS_6_RX");
1308 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = strdup("SLIMBUS_6_RX");
1309 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = strdup("SLIMBUS_0_RX");
1310 hw_interface_table[SND_DEVICE_OUT_VOICE_TX] = strdup("RT_PROXY_DAI_001_RX");
1311 hw_interface_table[SND_DEVICE_OUT_AFE_PROXY] = strdup("RT_PROXY_DAI_001_RX");
Ashish Jainb26edfb2016-08-25 00:10:11 +05301312 hw_interface_table[SND_DEVICE_OUT_USB_HEADSET] = strdup("USB_AUDIO_RX");
Ashish Jain3e37a702016-11-25 12:27:15 +05301313 hw_interface_table[SND_DEVICE_OUT_USB_HEADPHONES] = strdup("USB_AUDIO_RX");
Ashish Jainb26edfb2016-08-25 00:10:11 +05301314 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 -08001315 hw_interface_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("SLIMBUS_8_TX");
1316 hw_interface_table[SND_DEVICE_OUT_ANC_HEADSET] = strdup("SLIMBUS_6_RX");
1317 hw_interface_table[SND_DEVICE_OUT_ANC_FB_HEADSET] = strdup("SLIMBUS_6_RX");
1318 hw_interface_table[SND_DEVICE_OUT_VOICE_ANC_HEADSET] = strdup("SLIMBUS_6_RX");
1319 hw_interface_table[SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = strdup("SLIMBUS_6_RX");
1320 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1321 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1322 hw_interface_table[SND_DEVICE_OUT_ANC_HANDSET] = strdup("SLIMBUS_0_RX");
Aditya Bavanari701a6992017-03-30 19:17:16 +05301323 hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
1324 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
1325 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = strdup("SLIMBUS_0_RX");
1326 hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
1327 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
1328 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001329 hw_interface_table[SND_DEVICE_OUT_SPEAKER_WSA] = strdup("SLIMBUS_0_RX");
1330 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = strdup("SLIMBUS_0_RX");
1331 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = strdup("SLIMBUS_0_RX");
1332 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
1333 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = strdup("SLIMBUS_0_TX");
1334 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_AEC] = strdup("SLIMBUS_0_TX");
1335 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_NS] = strdup("SLIMBUS_0_TX");
1336 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1337 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC] = strdup("SLIMBUS_0_TX");
1338 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC_AEC] = strdup("SLIMBUS_0_TX");
1339 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC_NS] = strdup("SLIMBUS_0_TX");
1340 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1341 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC] = strdup("SLIMBUS_0_TX");
1342 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_AEC] = strdup("SLIMBUS_0_TX");
1343 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_NS] = strdup("SLIMBUS_0_TX");
1344 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1345 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
1346 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC] = strdup("SLIMBUS_0_TX");
1347 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_NS] = strdup("SLIMBUS_0_TX");
1348 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1349 hw_interface_table[SND_DEVICE_IN_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1350 hw_interface_table[SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = strdup("SLIMBUS_0_TX");
1351 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = strdup("SLIMBUS_0_TX");
1352 hw_interface_table[SND_DEVICE_IN_VOICE_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1353 hw_interface_table[SND_DEVICE_IN_HDMI_MIC] = strdup("HDMI");
1354 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("SLIMBUS_7_TX");
1355 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("SLIMBUS_7_TX");
1356 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("SLIMBUS_7_TX");
1357 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("SLIMBUS_7_TX");
1358 hw_interface_table[SND_DEVICE_IN_CAMCORDER_MIC] = strdup("SLIMBUS_0_TX");
1359 hw_interface_table[SND_DEVICE_IN_VOICE_DMIC] = strdup("SLIMBUS_0_TX");
1360 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
1361 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = strdup("SLIMBUS_0_TX");
1362 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1363 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
1364 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1365 hw_interface_table[SND_DEVICE_IN_VOICE_REC_MIC] = strdup("SLIMBUS_0_TX");
1366 hw_interface_table[SND_DEVICE_IN_VOICE_REC_MIC_NS] = strdup("SLIMBUS_0_TX");
1367 hw_interface_table[SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = strdup("SLIMBUS_0_TX");
1368 hw_interface_table[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = strdup("SLIMBUS_0_TX");
1369 hw_interface_table[SND_DEVICE_IN_VOICE_RX] = strdup("RT_PROXY_DAI_002_TX");
1370 hw_interface_table[SND_DEVICE_IN_USB_HEADSET_MIC] = strdup("USB_AUDIO_TX");
1371 hw_interface_table[SND_DEVICE_IN_CAPTURE_FM] = strdup("SLIMBUS_8_TX");
1372 hw_interface_table[SND_DEVICE_IN_AANC_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
1373 hw_interface_table[SND_DEVICE_IN_QUAD_MIC] = strdup("SLIMBUS_0_TX");
1374 hw_interface_table[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = strdup("SLIMBUS_0_TX");
1375 hw_interface_table[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = strdup("SLIMBUS_0_TX");
1376 hw_interface_table[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = strdup("SLIMBUS_4_TX");
1377 hw_interface_table[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = strdup("SLIMBUS_4_TX");
1378 hw_interface_table[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = strdup("SLIMBUS_4_TX");
1379 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = strdup("SLIMBUS_0_TX");
1380 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = strdup("SLIMBUS_0_TX");
1381 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = strdup("SLIMBUS_0_TX");
1382 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = strdup("SLIMBUS_0_TX");
1383 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = strdup("SLIMBUS_0_TX");
1384 hw_interface_table[SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = strdup("SLIMBUS_0_TX");
1385 hw_interface_table[SND_DEVICE_IN_HANDSET_QMIC] = strdup("SLIMBUS_0_TX");
1386 hw_interface_table[SND_DEVICE_IN_SPEAKER_QMIC_AEC] = strdup("SLIMBUS_0_TX");
1387 hw_interface_table[SND_DEVICE_IN_SPEAKER_QMIC_NS] = strdup("SLIMBUS_0_TX");
1388 hw_interface_table[SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1389 hw_interface_table[SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE] = strdup("SLIMBUS_0_TX");
1390 hw_interface_table[SND_DEVICE_IN_THREE_MIC] = strdup("SLIMBUS_0_TX");
1391 hw_interface_table[SND_DEVICE_IN_HANDSET_TMIC] = strdup("SLIMBUS_0_TX");
1392 hw_interface_table[SND_DEVICE_IN_VOICE_REC_TMIC] = strdup("SLIMBUS_0_TX");
1393 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_MIC] = strdup("SLIMBUS_0_TX");
1394 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = strdup("SLIMBUS_0_TX");
1395 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = strdup("SLIMBUS_0_TX");
1396 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = strdup("SLIMBUS_0_TX");
1397 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301398
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05301399 my_data->max_mic_count = PLATFORM_DEFAULT_MIC_COUNT;
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301400
1401 /*remove ALAC & APE from DSP decoder list based on software decoder availability*/
Alexy Josephb1379942016-01-29 15:49:38 -08001402 for (count = 0; count < (int32_t)(sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]));
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301403 count++) {
1404
1405 if (!strncmp(MEDIA_MIMETYPE_AUDIO_ALAC, dsp_only_decoders_mime[count],
1406 strlen(dsp_only_decoders_mime[count]))) {
1407
1408 if(property_get_bool("use.qti.sw.alac.decoder", false)) {
1409 ALOGD("Alac software decoder is available...removing alac from DSP decoder list");
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301410 strlcpy(dsp_only_decoders_mime[count],"none",5);
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301411 }
1412 } else if (!strncmp(MEDIA_MIMETYPE_AUDIO_APE, dsp_only_decoders_mime[count],
1413 strlen(dsp_only_decoders_mime[count]))) {
1414
1415 if(property_get_bool("use.qti.sw.ape.decoder", false)) {
1416 ALOGD("APE software decoder is available...removing ape from DSP decoder list");
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301417 strlcpy(dsp_only_decoders_mime[count],"none",5);
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301418 }
1419 }
1420 }
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07001421}
1422
Walter Yang6f800052014-07-14 16:15:38 -07001423void get_cvd_version(char *cvd_version, struct audio_device *adev)
1424{
1425 struct mixer_ctl *ctl;
1426 int count;
1427 int ret = 0;
1428
1429 ctl = mixer_get_ctl_by_name(adev->mixer, CVD_VERSION_MIXER_CTL);
1430 if (!ctl) {
1431 ALOGE("%s: Could not get ctl for mixer cmd - %s", __func__, CVD_VERSION_MIXER_CTL);
1432 goto done;
1433 }
1434 mixer_ctl_update(ctl);
1435
1436 count = mixer_ctl_get_num_values(ctl);
1437 if (count > MAX_CVD_VERSION_STRING_SIZE)
1438 count = MAX_CVD_VERSION_STRING_SIZE;
1439
1440 ret = mixer_ctl_get_array(ctl, cvd_version, count);
1441 if (ret != 0) {
1442 ALOGE("%s: ERROR! mixer_ctl_get_array() failed to get CVD Version", __func__);
1443 goto done;
1444 }
1445
1446done:
1447 return;
1448}
1449
Anish Kumar55e6df22014-08-26 17:38:05 -07001450static int hw_util_open(int card_no)
1451{
1452 int fd = -1;
1453 char dev_name[256];
1454
1455 snprintf(dev_name, sizeof(dev_name), "/dev/snd/hwC%uD%u",
1456 card_no, WCD9XXX_CODEC_HWDEP_NODE);
1457 ALOGD("%s Opening device %s\n", __func__, dev_name);
1458 fd = open(dev_name, O_WRONLY);
1459 if (fd < 0) {
1460 ALOGE("%s: cannot open device '%s'\n", __func__, dev_name);
1461 return fd;
1462 }
1463 ALOGD("%s success", __func__);
1464 return fd;
1465}
1466
1467struct param_data {
1468 int use_case;
1469 int acdb_id;
1470 int get_size;
1471 int buff_size;
1472 int data_size;
1473 void *buff;
1474};
1475
Banajit Goswami20cdd212015-09-11 01:11:30 -07001476static int send_vbat_adc_data_to_acdb(struct platform_data *plat_data, char *cal_type)
1477{
1478 int ret = 0;
1479 struct mixer_ctl *ctl;
1480 uint16_t vbat_adc_data[2];
1481 struct platform_data *my_data = plat_data;
1482 struct audio_device *adev = my_data->adev;
1483
1484 const char *mixer_ctl_name = "Vbat ADC data";
1485
1486 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1487 if (!ctl) {
1488 ALOGE("%s: Could not get ctl for mixer ctl name - %s",
1489 __func__, mixer_ctl_name);
1490 ret = -EINVAL;
1491 goto done;
1492 }
1493
1494 vbat_adc_data[0] = mixer_ctl_get_value(ctl, 0);
1495 vbat_adc_data[1] = mixer_ctl_get_value(ctl, 1);
1496
1497 ALOGD("%s: Vbat ADC output values: Dcp1: %d , Dcp2: %d",
1498 __func__, vbat_adc_data[0], vbat_adc_data[1]);
1499
1500 ret = my_data->acdb_set_codec_data(&vbat_adc_data[0], cal_type);
1501
1502done:
1503 return ret;
1504}
1505
1506static void send_codec_cal(acdb_loader_get_calibration_t acdb_loader_get_calibration,
1507 struct platform_data *plat_data, int fd)
Anish Kumar55e6df22014-08-26 17:38:05 -07001508{
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001509 int type;
Anish Kumar55e6df22014-08-26 17:38:05 -07001510
1511 for (type = WCD9XXX_ANC_CAL; type < WCD9XXX_MAX_CAL; type++) {
1512 struct wcdcal_ioctl_buffer codec_buffer;
1513 struct param_data calib;
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001514 int ret;
Anish Kumar55e6df22014-08-26 17:38:05 -07001515
Bharath Ramachandramurthy63a47ef2015-08-31 17:41:46 -07001516 /* MAD calibration is handled by sound trigger HAL, skip here */
1517 if (type == WCD9XXX_MAD_CAL)
1518 continue;
1519
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001520 ret = 0;
Banajit Goswami20cdd212015-09-11 01:11:30 -07001521
Banajit Goswami4dc87fb2015-10-11 21:46:07 -07001522 if ((plat_data->is_vbat_speaker) && (WCD9XXX_VBAT_CAL == type)) {
Banajit Goswami20cdd212015-09-11 01:11:30 -07001523 ret = send_vbat_adc_data_to_acdb(plat_data, cal_name_info[type]);
1524 if (ret < 0)
1525 ALOGE("%s error in sending vbat adc data to acdb", __func__);
1526 }
1527
Anish Kumar55e6df22014-08-26 17:38:05 -07001528 calib.get_size = 1;
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001529 ret = acdb_loader_get_calibration(cal_name_info[type],
1530 sizeof(struct param_data),
1531 &calib);
Anish Kumar55e6df22014-08-26 17:38:05 -07001532 if (ret < 0) {
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001533 ALOGE("%s: %s get_calibration size failed, err = %d\n",
1534 __func__, cal_name_info[type], ret);
1535 continue;
Anish Kumar55e6df22014-08-26 17:38:05 -07001536 }
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001537
Anish Kumar55e6df22014-08-26 17:38:05 -07001538 calib.get_size = 0;
1539 calib.buff = malloc(calib.buff_size);
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001540 if (!calib.buff) {
1541 ALOGE("%s: %s: No Memory for size = %d\n",
1542 __func__, cal_name_info[type], calib.buff_size);
1543 continue;
1544 }
1545
Anish Kumar55e6df22014-08-26 17:38:05 -07001546 ret = acdb_loader_get_calibration(cal_name_info[type],
1547 sizeof(struct param_data), &calib);
1548 if (ret < 0) {
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001549 ALOGE("%s: %s get_calibration failed, err = %d\n",
1550 __func__, cal_name_info[type], ret);
Anish Kumar55e6df22014-08-26 17:38:05 -07001551 free(calib.buff);
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001552 continue;
Anish Kumar55e6df22014-08-26 17:38:05 -07001553 }
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001554
Anish Kumar55e6df22014-08-26 17:38:05 -07001555 codec_buffer.buffer = calib.buff;
1556 codec_buffer.size = calib.data_size;
1557 codec_buffer.cal_type = type;
1558 if (ioctl(fd, SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE, &codec_buffer) < 0)
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001559 ALOGE("%s: %s Failed to call ioctl, err=%d",
1560 __func__, cal_name_info[type], errno);
1561 else
1562 ALOGD("%s: %s cal sent successfully\n",
1563 __func__, cal_name_info[type]);
1564
Anish Kumar55e6df22014-08-26 17:38:05 -07001565 free(calib.buff);
1566 }
Anish Kumar55e6df22014-08-26 17:38:05 -07001567}
1568
1569static void audio_hwdep_send_cal(struct platform_data *plat_data)
1570{
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301571 int fd = plat_data->hw_dep_fd;
Anish Kumar55e6df22014-08-26 17:38:05 -07001572
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301573 if (fd < 0)
1574 fd = hw_util_open(plat_data->adev->snd_card);
Anish Kumar55e6df22014-08-26 17:38:05 -07001575 if (fd == -1) {
1576 ALOGE("%s error open\n", __func__);
1577 return;
1578 }
1579
1580 acdb_loader_get_calibration = (acdb_loader_get_calibration_t)
1581 dlsym(plat_data->acdb_handle, "acdb_loader_get_calibration");
1582
1583 if (acdb_loader_get_calibration == NULL) {
1584 ALOGE("%s: ERROR. dlsym Error:%s acdb_loader_get_calibration", __func__,
1585 dlerror());
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301586 if (fd >= 0) {
1587 close(fd);
1588 plat_data->hw_dep_fd = -1;
1589 }
Anish Kumar55e6df22014-08-26 17:38:05 -07001590 return;
1591 }
Bhalchandra Gajare7c1ad7c2015-07-17 17:12:09 -07001592
Banajit Goswami20cdd212015-09-11 01:11:30 -07001593 send_codec_cal(acdb_loader_get_calibration, plat_data, fd);
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301594 plat_data->hw_dep_fd = fd;
Anish Kumar55e6df22014-08-26 17:38:05 -07001595}
1596
Ben Rombergerfeca4b82015-07-07 20:40:44 -07001597static int platform_acdb_init(void *platform)
Ramjee Singh203473b2015-06-09 15:18:42 +05301598{
1599 struct platform_data *my_data = (struct platform_data *)platform;
1600 char *cvd_version = NULL;
Ramjee Singh203473b2015-06-09 15:18:42 +05301601 const char *snd_card_name;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05301602 int result = -1;
1603 struct listnode *node;
1604 struct meta_key_list *key_info;
1605 int key = 0;
1606
Ramjee Singh203473b2015-06-09 15:18:42 +05301607 cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301608 if (!cvd_version) {
Ramjee Singh203473b2015-06-09 15:18:42 +05301609 ALOGE("Failed to allocate cvd version");
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301610 return -1;
1611 } else {
Ramjee Singh203473b2015-06-09 15:18:42 +05301612 get_cvd_version(cvd_version, my_data->adev);
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301613 }
Ramjee Singh203473b2015-06-09 15:18:42 +05301614
Ramjee Singh203473b2015-06-09 15:18:42 +05301615 snd_card_name = mixer_get_name(my_data->adev->mixer);
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05301616 if (my_data->acdb_init_v3) {
1617 result = my_data->acdb_init_v3(snd_card_name, cvd_version,
1618 &my_data->acdb_meta_key_list);
1619 } else if (my_data->acdb_init) {
1620 node = list_head(&my_data->acdb_meta_key_list);
1621 key_info = node_to_item(node, struct meta_key_list, list);
1622 key = key_info->cal_info.nKey;
1623 result = my_data->acdb_init(snd_card_name, cvd_version, key);
1624 }
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05301625
1626 /* Save these variables in platform_data. These will be used
1627 while reloading ACDB files during run time. */
1628 strlcpy(my_data->cvd_version, cvd_version, MAX_CVD_VERSION_STRING_SIZE);
1629 strlcpy(my_data->snd_card_name, snd_card_name,
1630 MAX_SND_CARD_STRING_SIZE);
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05301631
Ramjee Singh203473b2015-06-09 15:18:42 +05301632 if (cvd_version)
1633 free(cvd_version);
1634 if (!result) {
1635 my_data->is_acdb_initialized = true;
1636 ALOGD("ACDB initialized");
1637 audio_hwdep_send_cal(my_data);
1638 } else {
1639 my_data->is_acdb_initialized = false;
1640 ALOGD("ACDB initialization failed");
1641 }
1642 return result;
1643}
1644
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05301645static void get_source_mic_type(struct platform_data * my_data)
1646{
1647 // support max to mono, example if max count is 3, usecase supports Three, dual and mono mic
1648 switch (my_data->max_mic_count) {
1649 case 4:
1650 my_data->source_mic_type |= SOURCE_QUAD_MIC;
1651 case 3:
1652 my_data->source_mic_type |= SOURCE_THREE_MIC;
1653 case 2:
1654 my_data->source_mic_type |= SOURCE_DUAL_MIC;
1655 case 1:
1656 my_data->source_mic_type |= SOURCE_MONO_MIC;
1657 break;
1658 default:
1659 ALOGE("%s: max_mic_count (%d), is not supported, setting to default",
1660 __func__, my_data->max_mic_count);
1661 my_data->source_mic_type = SOURCE_MONO_MIC | SOURCE_DUAL_MIC;
1662 break;
1663 }
1664}
1665
Siena Richard7c2db772016-12-21 11:32:34 -08001666/*
1667 * Retrieves the be_dai_name_table from kernel to enable a mapping
1668 * between sound device hw interfaces and backend IDs. This allows HAL to
1669 * specify the backend a specific calibration is needed for.
1670 */
1671static int init_be_dai_name_table(struct audio_device *adev)
1672{
1673 const char *mixer_ctl_name = "Backend DAI Name Table";
1674 struct mixer_ctl *ctl;
1675 int i, j, ret, size;
1676 bool valid_hw_interface;
1677
1678 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1679 if (!ctl) {
1680 ALOGE("%s: Could not get ctl for mixer name %s\n",
1681 __func__, mixer_ctl_name);
1682 ret = -EINVAL;
1683 goto done;
1684 }
1685
1686 mixer_ctl_update(ctl);
1687
1688 size = mixer_ctl_get_num_values(ctl);
1689 if (size <= 0){
1690 ALOGE("%s: Failed to get %s size %d\n",
1691 __func__, mixer_ctl_name, size);
1692 ret = -EFAULT;
1693 goto done;
1694 }
1695
1696 be_dai_name_table =
1697 (const struct be_dai_name_struct *)calloc(1, size);
1698 if (be_dai_name_table == NULL) {
1699 ALOGE("%s: Failed to allocate memory for %s\n",
1700 __func__, mixer_ctl_name);
1701 ret = -ENOMEM;
1702 goto freeMem;
1703 }
1704
1705 ret = mixer_ctl_get_array(ctl, (void *)be_dai_name_table, size);
1706 if (ret) {
1707 ALOGE("%s: Failed to get %s, ret %d\n",
1708 __func__, mixer_ctl_name, ret);
1709 ret = -EFAULT;
1710 goto freeMem;
1711 }
1712
1713 if (be_dai_name_table != NULL) {
1714 max_be_dai_names = size / sizeof(struct be_dai_name_struct);
1715 ALOGV("%s: Successfully got %s, number of be dais is %d\n",
1716 __func__, mixer_ctl_name, max_be_dai_names);
1717 ret = 0;
1718 } else {
1719 ALOGE("%s: Failed to get %s\n", __func__, mixer_ctl_name);
1720 ret = -EFAULT;
1721 goto freeMem;
1722 }
1723
1724 /*
1725 * Validate all sound devices have a valid backend set to catch
1726 * errors for uncommon sound devices
1727 */
1728 for (i = 0; i < SND_DEVICE_MAX; i++) {
1729 valid_hw_interface = false;
1730
1731 if (hw_interface_table[i] == NULL) {
1732 ALOGW("%s: sound device %s has no hw interface set\n",
1733 __func__, platform_get_snd_device_name(i));
1734 continue;
1735 }
1736
1737 for (j = 0; j < max_be_dai_names; j++) {
1738 if (strcmp(hw_interface_table[i], be_dai_name_table[j].be_name)
1739 == 0) {
1740 valid_hw_interface = true;
1741 break;
1742 }
1743 }
1744 if (!valid_hw_interface)
1745 ALOGD("%s: sound device %s does not have a valid hw interface set (disregard for combo devices) %s\n",
1746 __func__, platform_get_snd_device_name(i), hw_interface_table[i]);
1747 }
1748
1749 goto done;
1750
1751freeMem:
1752 if (be_dai_name_table) {
1753 free((void *)be_dai_name_table);
1754 be_dai_name_table = NULL;
1755 }
1756
1757done:
1758 return ret;
1759}
1760
Eric Laurentb23d5282013-05-14 15:27:20 -07001761void *platform_init(struct audio_device *adev)
1762{
Vidyakumar Athota77327dd2014-08-07 16:44:25 -07001763 char platform[PROPERTY_VALUE_MAX];
1764 char baseband[PROPERTY_VALUE_MAX];
Eric Laurentb23d5282013-05-14 15:27:20 -07001765 char value[PROPERTY_VALUE_MAX];
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08001766 struct platform_data *my_data = NULL;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05301767 int retry_num = 0, snd_card_num = 0;
Alexy Josephb1379942016-01-29 15:49:38 -08001768 char *snd_card_name = NULL, *snd_card_name_t = NULL;
Apoorv Raghuvanshia433fb52015-03-16 15:22:30 -07001769 char *snd_internal_name = NULL;
1770 char *tmp = NULL;
1771 char mixer_xml_file[MIXER_PATH_MAX_LENGTH]= {0};
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08001772 int idx;
sangwoo1b9f4b32013-06-21 18:22:55 -07001773
Eric Laurentb23d5282013-05-14 15:27:20 -07001774 my_data = calloc(1, sizeof(struct platform_data));
1775
Haynes Mathew Georgeb51ceb12014-06-30 13:56:18 -07001776 if (!my_data) {
1777 ALOGE("failed to allocate platform data");
1778 return NULL;
1779 }
1780
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08001781 while (snd_card_num < MAX_SND_CARD) {
1782 adev->mixer = mixer_open(snd_card_num);
1783
1784 while (!adev->mixer && retry_num < RETRY_NUMBER) {
1785 usleep(RETRY_US);
1786 adev->mixer = mixer_open(snd_card_num);
1787 retry_num++;
1788 }
1789
1790 if (!adev->mixer) {
1791 ALOGE("%s: Unable to open the mixer card: %d", __func__,
1792 snd_card_num);
1793 retry_num = 0;
1794 snd_card_num++;
1795 continue;
1796 }
1797
Sudheer Papothi4e0ea9a2015-09-30 06:57:51 +05301798 snd_card_name = strdup(mixer_get_name(adev->mixer));
1799 if (!snd_card_name) {
1800 ALOGE("failed to allocate memory for snd_card_name\n");
1801 free(my_data);
Mingming Yindda29e62015-12-02 18:02:28 -08001802 mixer_close(adev->mixer);
Sudheer Papothi4e0ea9a2015-09-30 06:57:51 +05301803 return NULL;
1804 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05301805 ALOGD("%s: snd_card_name: %s", __func__, snd_card_name);
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08001806
1807 my_data->hw_info = hw_info_init(snd_card_name);
1808 if (!my_data->hw_info) {
1809 ALOGE("%s: Failed to init hardware info", __func__);
1810 } else {
Helen Zeng6a16ad72014-02-23 22:04:44 -08001811 if (platform_is_i2s_ext_modem(snd_card_name, my_data)) {
1812 ALOGD("%s: Call MIXER_XML_PATH_I2S", __func__);
1813
1814 adev->audio_route = audio_route_init(snd_card_num,
1815 MIXER_XML_PATH_I2S);
Apoorv Raghuvanshia433fb52015-03-16 15:22:30 -07001816 } else {
1817 /* Get the codec internal name from the sound card name
1818 * and form the mixer paths file name dynamically. This
1819 * is generic way of picking any codec name based mixer
1820 * files in future with no code change. This code
1821 * assumes mixer files are formed with format as
1822 * mixer_paths_internalcodecname.xml
1823
1824 * If this dynamically read mixer files fails to open then it
1825 * falls back to default mixer file i.e mixer_paths.xml. This is
1826 * done to preserve backward compatibility but not mandatory as
1827 * long as the mixer files are named as per above assumption.
1828 */
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05301829 snd_card_name_t = strdup(snd_card_name);
1830 snd_internal_name = strtok_r(snd_card_name_t, "-", &tmp);
Apoorv Raghuvanshia433fb52015-03-16 15:22:30 -07001831
Apoorv Raghuvanshia433fb52015-03-16 15:22:30 -07001832 if (snd_internal_name != NULL)
1833 snd_internal_name = strtok_r(NULL, "-", &tmp);
1834
1835 if (snd_internal_name != NULL) {
1836 strlcpy(mixer_xml_file, MIXER_XML_BASE_STRING,
1837 MIXER_PATH_MAX_LENGTH);
1838 strlcat(mixer_xml_file, MIXER_FILE_DELIMITER,
1839 MIXER_PATH_MAX_LENGTH);
1840 strlcat(mixer_xml_file, snd_internal_name,
1841 MIXER_PATH_MAX_LENGTH);
1842 strlcat(mixer_xml_file, MIXER_FILE_EXT,
1843 MIXER_PATH_MAX_LENGTH);
1844 } else {
1845 strlcpy(mixer_xml_file, MIXER_XML_DEFAULT_PATH,
1846 MIXER_PATH_MAX_LENGTH);
1847 }
1848
1849 if (F_OK == access(mixer_xml_file, 0)) {
1850 ALOGD("%s: Loading mixer file: %s", __func__, mixer_xml_file);
1851 if (audio_extn_read_xml(adev, snd_card_num, mixer_xml_file,
1852 MIXER_XML_PATH_AUXPCM) == -ENOSYS)
1853 adev->audio_route = audio_route_init(snd_card_num,
1854 mixer_xml_file);
1855 } else {
1856 ALOGD("%s: Loading default mixer file", __func__);
1857 if(audio_extn_read_xml(adev, snd_card_num, MIXER_XML_DEFAULT_PATH,
1858 MIXER_XML_PATH_AUXPCM) == -ENOSYS)
1859 adev->audio_route = audio_route_init(snd_card_num,
1860 MIXER_XML_DEFAULT_PATH);
1861 }
Helen Zeng6a16ad72014-02-23 22:04:44 -08001862 }
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08001863 if (!adev->audio_route) {
1864 ALOGE("%s: Failed to init audio route controls, aborting.",
1865 __func__);
Alexy Josephb1379942016-01-29 15:49:38 -08001866 if (my_data)
1867 free(my_data);
1868 if (snd_card_name)
1869 free(snd_card_name);
1870 if (snd_card_name_t)
1871 free(snd_card_name_t);
Mingming Yindda29e62015-12-02 18:02:28 -08001872 mixer_close(adev->mixer);
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08001873 return NULL;
1874 }
1875 adev->snd_card = snd_card_num;
1876 ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
1877 break;
1878 }
1879 retry_num = 0;
1880 snd_card_num++;
Mingming Yindda29e62015-12-02 18:02:28 -08001881 mixer_close(adev->mixer);
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08001882 }
1883
1884 if (snd_card_num >= MAX_SND_CARD) {
1885 ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
Alexy Josephb1379942016-01-29 15:49:38 -08001886 if (my_data)
1887 free(my_data);
Ravi Kumar Alamanda31c90df2015-10-16 10:06:59 -07001888 if (snd_card_name)
1889 free(snd_card_name);
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05301890 if (snd_card_name_t)
1891 free(snd_card_name_t);
Alexy Josephb1379942016-01-29 15:49:38 -08001892 mixer_close(adev->mixer);
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -08001893 return NULL;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -07001894 }
1895
Eric Laurentb23d5282013-05-14 15:27:20 -07001896 my_data->adev = adev;
Eric Laurentb23d5282013-05-14 15:27:20 -07001897 my_data->fluence_in_spkr_mode = false;
1898 my_data->fluence_in_voice_call = false;
1899 my_data->fluence_in_voice_rec = false;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001900 my_data->fluence_in_audio_rec = false;
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05301901 my_data->fluence_in_hfp_call = false;
Tanya Finkel00130052014-07-14 04:26:56 -07001902 my_data->external_spk_1 = false;
1903 my_data->external_spk_2 = false;
1904 my_data->external_mic = false;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001905 my_data->fluence_type = FLUENCE_NONE;
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -08001906 my_data->fluence_mode = FLUENCE_ENDFIRE;
Avinash Vaishd5fa4572014-09-15 14:41:14 +05301907 my_data->slowtalk = false;
1908 my_data->hd_voice = false;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07001909 my_data->edid_info = NULL;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07001910 my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301911 my_data->hw_dep_fd = -1;
Rohit kumarf4120402016-08-05 19:19:48 +05301912 my_data->mono_speaker = SPKR_1;
Eric Laurentb23d5282013-05-14 15:27:20 -07001913
Siena Richard7c2db772016-12-21 11:32:34 -08001914 be_dai_name_table = NULL;
1915
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05301916 property_get("ro.qc.sdk.audio.fluencetype", my_data->fluence_cap, "");
1917 if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001918 my_data->fluence_type = FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC;
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05301919 } else if (!strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) {
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001920 my_data->fluence_type = FLUENCE_DUAL_MIC;
1921 } else {
1922 my_data->fluence_type = FLUENCE_NONE;
Eric Laurentb23d5282013-05-14 15:27:20 -07001923 }
1924
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001925 if (my_data->fluence_type != FLUENCE_NONE) {
Eric Laurentb23d5282013-05-14 15:27:20 -07001926 property_get("persist.audio.fluence.voicecall",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001927 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -07001928 my_data->fluence_in_voice_call = true;
1929 }
1930
1931 property_get("persist.audio.fluence.voicerec",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001932 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -07001933 my_data->fluence_in_voice_rec = true;
1934 }
1935
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001936 property_get("persist.audio.fluence.audiorec",value,"");
1937 if (!strncmp("true", value, sizeof("true"))) {
1938 my_data->fluence_in_audio_rec = true;
1939 }
1940
Eric Laurentb23d5282013-05-14 15:27:20 -07001941 property_get("persist.audio.fluence.speaker",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001942 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -07001943 my_data->fluence_in_spkr_mode = true;
1944 }
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -08001945
1946 property_get("persist.audio.fluence.mode",value,"");
1947 if (!strncmp("broadside", value, sizeof("broadside"))) {
1948 my_data->fluence_mode = FLUENCE_BROADSIDE;
1949 }
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05301950
1951 property_get("persist.audio.fluence.hfpcall",value,"");
1952 if (!strncmp("true", value, sizeof("true"))) {
1953 my_data->fluence_in_hfp_call = true;
1954 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001955 }
1956
Banajit Goswami20cdd212015-09-11 01:11:30 -07001957 /* Check if Vbat speaker enabled property is set, this should be done before acdb init */
1958 bool ret = false;
1959 ret = audio_extn_can_use_vbat();
1960 if (ret)
1961 my_data->is_vbat_speaker = true;
1962
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05301963 list_init(&my_data->acdb_meta_key_list);
1964
1965 set_platform_defaults(my_data);
1966
1967 /* Initialize ACDB ID's */
1968 if (my_data->is_i2s_ext_modem)
1969 platform_info_init(PLATFORM_INFO_XML_PATH_I2S, my_data);
1970 else
1971 platform_info_init(PLATFORM_INFO_XML_PATH, my_data);
1972
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08001973 my_data->voice_feature_set = VOICE_FEATURE_SET_DEFAULT;
Eric Laurentb23d5282013-05-14 15:27:20 -07001974 my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
1975 if (my_data->acdb_handle == NULL) {
1976 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
1977 } else {
1978 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
1979 my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle,
1980 "acdb_loader_deallocate_ACDB");
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08001981 if (!my_data->acdb_deallocate)
1982 ALOGE("%s: Could not find the symbol acdb_loader_deallocate_ACDB from %s",
1983 __func__, LIB_ACDB_LOADER);
1984
Eric Laurentb23d5282013-05-14 15:27:20 -07001985 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 -07001986 "acdb_loader_send_audio_cal_v2");
Eric Laurentb23d5282013-05-14 15:27:20 -07001987 if (!my_data->acdb_send_audio_cal)
Siena Richard7c2db772016-12-21 11:32:34 -08001988 ALOGE("%s: Could not find the symbol acdb_send_audio_cal_v2 from %s",
1989 __func__, LIB_ACDB_LOADER);
1990
1991 my_data->acdb_send_audio_cal_v3 = (acdb_send_audio_cal_v3_t)dlsym(my_data->acdb_handle,
1992 "acdb_loader_send_audio_cal_v3");
1993 if (!my_data->acdb_send_audio_cal_v3)
1994 ALOGE("%s: Could not find the symbol acdb_send_audio_cal_v3 from %s",
Eric Laurentb23d5282013-05-14 15:27:20 -07001995 __func__, LIB_ACDB_LOADER);
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08001996
Ben Rombergera04fabc2014-11-14 12:16:03 -08001997 my_data->acdb_set_audio_cal = (acdb_set_audio_cal_t)dlsym(my_data->acdb_handle,
1998 "acdb_loader_set_audio_cal_v2");
1999 if (!my_data->acdb_set_audio_cal)
2000 ALOGE("%s: Could not find the symbol acdb_set_audio_cal_v2 from %s",
2001 __func__, LIB_ACDB_LOADER);
2002
2003 my_data->acdb_get_audio_cal = (acdb_get_audio_cal_t)dlsym(my_data->acdb_handle,
2004 "acdb_loader_get_audio_cal_v2");
2005 if (!my_data->acdb_get_audio_cal)
2006 ALOGE("%s: Could not find the symbol acdb_get_audio_cal_v2 from %s",
2007 __func__, LIB_ACDB_LOADER);
2008
Eric Laurentb23d5282013-05-14 15:27:20 -07002009 my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle,
2010 "acdb_loader_send_voice_cal");
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08002011 if (!my_data->acdb_send_voice_cal)
2012 ALOGE("%s: Could not find the symbol acdb_loader_send_voice_cal from %s",
2013 __func__, LIB_ACDB_LOADER);
2014
2015 my_data->acdb_reload_vocvoltable = (acdb_reload_vocvoltable_t)dlsym(my_data->acdb_handle,
2016 "acdb_loader_reload_vocvoltable");
2017 if (!my_data->acdb_reload_vocvoltable)
2018 ALOGE("%s: Could not find the symbol acdb_loader_reload_vocvoltable from %s",
2019 __func__, LIB_ACDB_LOADER);
2020
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07002021 my_data->acdb_get_default_app_type = (acdb_get_default_app_type_t)dlsym(
2022 my_data->acdb_handle,
2023 "acdb_loader_get_default_app_type");
2024 if (!my_data->acdb_get_default_app_type)
2025 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
2026 __func__, LIB_ACDB_LOADER);
2027
vivek mehtaa76401a2015-04-24 14:12:15 -07002028 my_data->acdb_send_gain_dep_cal = (acdb_send_gain_dep_cal_t)dlsym(my_data->acdb_handle,
2029 "acdb_loader_send_gain_dep_cal");
2030 if (!my_data->acdb_send_gain_dep_cal)
2031 ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s",
2032 __func__, LIB_ACDB_LOADER);
2033
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002034 my_data->acdb_send_common_top = (acdb_send_common_top_t)dlsym(
2035 my_data->acdb_handle,
2036 "acdb_loader_send_common_custom_topology");
2037 if (!my_data->acdb_send_common_top)
2038 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
2039 __func__, LIB_ACDB_LOADER);
2040
Banajit Goswami20cdd212015-09-11 01:11:30 -07002041 my_data->acdb_set_codec_data = (acdb_set_codec_data_t)dlsym(
2042 my_data->acdb_handle,
2043 "acdb_loader_set_codec_data");
2044 if (!my_data->acdb_set_codec_data)
2045 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
2046 __func__, LIB_ACDB_LOADER);
2047
2048
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302049 my_data->acdb_init_v3 = (acdb_init_v3_t)dlsym(my_data->acdb_handle,
2050 "acdb_loader_init_v3");
2051 if (my_data->acdb_init_v3 == NULL) {
2052 ALOGE("%s: dlsym error %s for acdb_loader_init_v3", __func__, dlerror());
2053 }
2054
Eric Laurentb23d5282013-05-14 15:27:20 -07002055 my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302056 "acdb_loader_init_v3");
Walter Yang6f800052014-07-14 16:15:38 -07002057 if (my_data->acdb_init == NULL) {
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302058 ALOGE("%s: dlsym error %s for acdb_loader_init_v3", __func__, dlerror());
Walter Yang6f800052014-07-14 16:15:38 -07002059 goto acdb_init_fail;
2060 }
2061
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302062 my_data->acdb_reload_v2 = (acdb_reload_v2_t)dlsym(my_data->acdb_handle,
2063 "acdb_loader_reload_acdb_files_v2");
2064 if (my_data->acdb_reload_v2 == NULL) {
2065 ALOGE("%s: dlsym error %s for acdb_loader_reload_acdb_files_v2", __func__, dlerror());
2066 }
2067
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05302068 my_data->acdb_reload = (acdb_reload_t)dlsym(my_data->acdb_handle,
2069 "acdb_loader_reload_acdb_files");
2070 if (my_data->acdb_reload == NULL) {
2071 ALOGE("%s: dlsym error %s for acdb_loader_reload_acdb_files", __func__, dlerror());
2072 goto acdb_init_fail;
2073 }
Ramjee Singh203473b2015-06-09 15:18:42 +05302074 platform_acdb_init(my_data);
Eric Laurentb23d5282013-05-14 15:27:20 -07002075 }
2076
Satish Babu Patakokila1caa1b72016-05-24 13:47:08 +05302077 /* init keep-alive for compress passthru */
2078 audio_extn_keep_alive_init(adev);
2079
Walter Yang6f800052014-07-14 16:15:38 -07002080acdb_init_fail:
2081
Ben Romberger55886882014-01-10 13:49:02 -08002082
Siena Richard7c2db772016-12-21 11:32:34 -08002083 /*
2084 * Get the be_dai_name_table from kernel which provides a mapping
2085 * between a backend string name and a backend ID
2086 */
2087 init_be_dai_name_table(adev);
2088
Srinivas Julakanti1ca769a2017-01-04 23:18:08 -08002089 if (audio_extn_can_use_ras()) {
2090 if (property_get_bool("persist.speaker.prot.enable", false)) {
2091 platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED,
2092 acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS]);
2093 platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
2094 acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS]);
2095 } else {
2096 ALOGD("%s: RAS Feature should be enabled with Speaker Protection", __func__);
2097 }
2098 }
2099
Vidyakumar Athota77327dd2014-08-07 16:44:25 -07002100 /* If platform is apq8084 and baseband is MDM, load CSD Client specific
2101 * symbols. Voice call is handled by MDM and apps processor talks to
2102 * MDM through CSD Client
2103 */
2104 property_get("ro.board.platform", platform, "");
2105 property_get("ro.baseband", baseband, "");
2106 if (!strncmp("apq8084", platform, sizeof("apq8084")) &&
2107 !strncmp("mdm", baseband, (sizeof("mdm")-1))) {
2108 my_data->csd = open_csd_client(my_data->is_i2s_ext_modem);
2109 } else {
2110 my_data->csd = NULL;
2111 }
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002112
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302113 /* obtain source mic type from max mic count*/
2114 get_source_mic_type(my_data);
2115 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 +05302116 " fluence_in_voice_rec(%d) fluence_in_spkr_mode(%d) fluence_in_hfp_call(%d) ",
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302117 __func__, my_data->fluence_type, my_data->max_mic_count, my_data->source_mic_type,
2118 my_data->fluence_in_voice_call, my_data->fluence_in_voice_rec,
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302119 my_data->fluence_in_spkr_mode, my_data->fluence_in_hfp_call);
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302120
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07002121 /* init usb */
2122 audio_extn_usb_init(adev);
2123
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302124 /*init a2dp*/
2125 audio_extn_a2dp_init(adev);
2126
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07002127 /* init dap hal */
2128 audio_extn_dap_hal_init(adev->snd_card);
2129
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07002130 /* Read one time ssr property */
Mingming Yin49be8032013-12-19 12:51:25 -08002131 audio_extn_ssr_update_enabled();
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -07002132 audio_extn_spkr_prot_init(adev);
Dhananjay Kumar89ea3bd2014-04-29 15:45:57 +05302133
Dhananjay Kumar89ea3bd2014-04-29 15:45:57 +05302134
Lior Barenboim0b61bc72014-05-13 13:01:37 +03002135 /* init audio device arbitration */
2136 audio_extn_dev_arbi_init();
2137
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08002138 /* initialize backend config */
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002139 for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
2140 my_data->current_backend_cfg[idx].sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
2141 if (idx == HEADPHONE_44_1_BACKEND)
2142 my_data->current_backend_cfg[idx].sample_rate = OUTPUT_SAMPLING_RATE_44100;
2143 my_data->current_backend_cfg[idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Ashish Jainb26edfb2016-08-25 00:10:11 +05302144 my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
Kuirong Wang0b947f72016-09-29 11:03:09 -07002145 if (idx > MAX_RX_CODEC_BACKENDS)
2146 my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
Ashish Jainb26edfb2016-08-25 00:10:11 +05302147 my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
2148 my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
2149 my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08002150 }
2151
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002152 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
2153 strdup("SLIM_0_RX Format");
2154 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
2155 strdup("SLIM_0_RX SampleRate");
2156
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05302157 my_data->current_backend_cfg[DSD_NATIVE_BACKEND].bitwidth_mixer_ctl =
2158 strdup("SLIM_2_RX Format");
2159 my_data->current_backend_cfg[DSD_NATIVE_BACKEND].samplerate_mixer_ctl =
2160 strdup("SLIM_2_RX SampleRate");
2161
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002162 my_data->current_backend_cfg[HEADPHONE_44_1_BACKEND].bitwidth_mixer_ctl =
2163 strdup("SLIM_5_RX Format");
2164 my_data->current_backend_cfg[HEADPHONE_44_1_BACKEND].samplerate_mixer_ctl =
2165 strdup("SLIM_5_RX SampleRate");
2166
Kuirong Wang0b947f72016-09-29 11:03:09 -07002167 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05302168 strdup("SLIM_0_TX Format");
Kuirong Wang0b947f72016-09-29 11:03:09 -07002169 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05302170 strdup("SLIM_0_TX SampleRate");
2171
Kuirong Wang0b947f72016-09-29 11:03:09 -07002172 my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
Kuirong Wange9894162016-08-26 15:16:39 -07002173 strdup("USB_AUDIO_TX Format");
Kuirong Wang0b947f72016-09-29 11:03:09 -07002174 my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
Kuirong Wange9894162016-08-26 15:16:39 -07002175 strdup("USB_AUDIO_TX SampleRate");
Kuirong Wang0b947f72016-09-29 11:03:09 -07002176 my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
2177 strdup("USB_AUDIO_TX Channels");
Kuirong Wange9894162016-08-26 15:16:39 -07002178
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302179 ret = audio_extn_utils_get_codec_version(snd_card_name,
2180 my_data->adev->snd_card,
2181 my_data->codec_version);
2182
2183 if (NATIVE_AUDIO_MODE_INVALID != platform_get_native_support()) {
2184 /*
2185 * Native playback is enabled from the UI.
2186 */
2187 if(strstr(snd_card_name, "tasha")) {
2188 if (strstr(my_data->codec_version, "WCD9335_1_0") ||
2189 strstr(my_data->codec_version, "WCD9335_1_1")) {
2190 ALOGD("%s:napb: TASHA 1.0 or 1.1 only SRC mode is supported",
2191 __func__);
2192 platform_set_native_support(NATIVE_AUDIO_MODE_SRC);
2193 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302194 }
Ashish Jain4826f6c2017-02-06 13:33:20 +05302195 if (strstr(snd_card_name, "tavil")) {
2196 ALOGD("%s:DSD playback is supported", __func__);
2197 my_data->is_dsd_supported = true;
2198 my_data->is_asrc_supported = true;
2199 platform_set_native_support(NATIVE_AUDIO_MODE_MULTIPLE_44_1);
2200 }
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05302201 }
2202
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302203 my_data->current_backend_cfg[HEADPHONE_BACKEND].bitwidth_mixer_ctl =
2204 strdup("SLIM_6_RX Format");
2205 my_data->current_backend_cfg[HEADPHONE_BACKEND].samplerate_mixer_ctl =
2206 strdup("SLIM_6_RX SampleRate");
Mingming Yinddd610b2016-01-20 17:09:32 -08002207 my_data->current_backend_cfg[HDMI_RX_BACKEND].bitwidth_mixer_ctl =
2208 strdup("HDMI_RX Bit Format");
2209 my_data->current_backend_cfg[HDMI_RX_BACKEND].samplerate_mixer_ctl =
2210 strdup("HDMI_RX SampleRate");
Ashish Jaind84fd6a2016-07-27 12:33:25 +05302211 my_data->current_backend_cfg[HDMI_RX_BACKEND].channels_mixer_ctl =
2212 strdup("HDMI_RX Channels");
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07002213 my_data->current_backend_cfg[DISP_PORT_RX_BACKEND].bitwidth_mixer_ctl =
2214 strdup("Display Port RX Bit Format");
2215 my_data->current_backend_cfg[DISP_PORT_RX_BACKEND].samplerate_mixer_ctl =
2216 strdup("Display Port RX SampleRate");
2217 my_data->current_backend_cfg[DISP_PORT_RX_BACKEND].channels_mixer_ctl =
2218 strdup("Display Port RX Channels");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302219
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08002220 my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].bitwidth_mixer_ctl =
2221 strdup("USB_AUDIO_RX Format");
2222 my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].samplerate_mixer_ctl =
2223 strdup("USB_AUDIO_RX SampleRate");
Ashish Jainb26edfb2016-08-25 00:10:11 +05302224 my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].channels_mixer_ctl =
2225 strdup("USB_AUDIO_RX Channels");
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08002226
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07002227 my_data->edid_info = NULL;
Sudheer Papothi4e0ea9a2015-09-30 06:57:51 +05302228 free(snd_card_name);
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302229 free(snd_card_name_t);
Eric Laurentb23d5282013-05-14 15:27:20 -07002230 return my_data;
2231}
2232
2233void platform_deinit(void *platform)
2234{
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -07002235 struct platform_data *my_data = (struct platform_data *)platform;
2236
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07002237 if (my_data->edid_info) {
2238 free(my_data->edid_info);
2239 my_data->edid_info = NULL;
2240 }
2241
Siena Richard7c2db772016-12-21 11:32:34 -08002242 if (be_dai_name_table) {
2243 free((void *)be_dai_name_table);
2244 be_dai_name_table = NULL;
2245 }
2246
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05302247 if (my_data->hw_dep_fd >= 0) {
2248 close(my_data->hw_dep_fd);
2249 my_data->hw_dep_fd = -1;
2250 }
2251
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -07002252 hw_info_deinit(my_data->hw_info);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002253 close_csd_client(my_data->csd);
2254
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002255 int32_t dev;
2256 for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302257 if (backend_tag_table[dev]) {
2258 free(backend_tag_table[dev]);
2259 backend_tag_table[dev]= NULL;
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002260 }
2261 }
2262
Lior Barenboim0b61bc72014-05-13 13:01:37 +03002263 /* deinit audio device arbitration */
2264 audio_extn_dev_arbi_deinit();
2265
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07002266 if (my_data->edid_info) {
2267 free(my_data->edid_info);
2268 my_data->edid_info = NULL;
2269 }
2270
Dhananjay Kumara5ba5f22016-11-30 16:01:29 +05302271 if (my_data->adev->mixer) {
2272 mixer_close(my_data->adev->mixer);
2273 my_data->adev->mixer = NULL;
2274 }
2275
Eric Laurentb23d5282013-05-14 15:27:20 -07002276 free(platform);
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07002277 /* deinit usb */
2278 audio_extn_usb_deinit();
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07002279 audio_extn_dap_hal_deinit();
Eric Laurentb23d5282013-05-14 15:27:20 -07002280}
2281
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002282static int platform_is_acdb_initialized(void *platform)
Ramjee Singh203473b2015-06-09 15:18:42 +05302283{
2284 struct platform_data *my_data = (struct platform_data *)platform;
2285 ALOGD("%s: acdb initialized %d\n", __func__, my_data->is_acdb_initialized);
2286 return my_data->is_acdb_initialized;
2287}
2288
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002289void platform_snd_card_update(void *platform, int snd_scard_state)
2290{
2291 struct platform_data *my_data = (struct platform_data *)platform;
2292
2293 if (snd_scard_state == SND_CARD_STATE_ONLINE) {
2294 if (!platform_is_acdb_initialized(my_data)) {
2295 if(platform_acdb_init(my_data))
2296 ALOGE("%s: acdb initialization is failed", __func__);
2297 } else if (my_data->acdb_send_common_top() < 0) {
2298 ALOGD("%s: acdb did not set common topology", __func__);
2299 }
2300 }
2301}
2302
Eric Laurentb23d5282013-05-14 15:27:20 -07002303const char *platform_get_snd_device_name(snd_device_t snd_device)
2304{
2305 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
2306 return device_table[snd_device];
2307 else
2308 return "";
2309}
2310
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -07002311int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
2312 char *device_name)
2313{
2314 struct platform_data *my_data = (struct platform_data *)platform;
2315
2316 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
2317 strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
2318 hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
2319 } else {
2320 strlcpy(device_name, "", DEVICE_NAME_MAX_SIZE);
2321 return -EINVAL;
2322 }
2323
2324 return 0;
2325}
2326
Banajit Goswami20cdd212015-09-11 01:11:30 -07002327void platform_add_backend_name(char *mixer_path, snd_device_t snd_device,
2328 struct audio_usecase *usecase)
Eric Laurentb23d5282013-05-14 15:27:20 -07002329{
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002330 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
2331 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
2332 return;
2333 }
2334
Rohit kumarf4120402016-08-05 19:19:48 +05302335 if ((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
2336 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
Banajit Goswami20cdd212015-09-11 01:11:30 -07002337 !(usecase->type == VOICE_CALL || usecase->type == VOIP_CALL)) {
2338 ALOGI("%s: Not adding vbat speaker device to non voice use cases", __func__);
2339 return;
2340 }
2341
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302342 const char * suffix = backend_tag_table[snd_device];
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002343
2344 if (suffix != NULL) {
2345 strlcat(mixer_path, " ", MIXER_PATH_MAX_LENGTH);
2346 strlcat(mixer_path, suffix, MIXER_PATH_MAX_LENGTH);
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002347 }
Eric Laurentb23d5282013-05-14 15:27:20 -07002348}
2349
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302350bool platform_check_backends_match(snd_device_t snd_device1, snd_device_t snd_device2)
2351{
2352 bool result = true;
2353
2354 ALOGV("%s: snd_device1 = %s, snd_device2 = %s", __func__,
2355 platform_get_snd_device_name(snd_device1),
2356 platform_get_snd_device_name(snd_device2));
2357
2358 if ((snd_device1 < SND_DEVICE_MIN) || (snd_device1 >= SND_DEVICE_OUT_END)) {
2359 ALOGE("%s: Invalid snd_device = %s", __func__,
2360 platform_get_snd_device_name(snd_device1));
2361 return false;
2362 }
2363 if ((snd_device2 < SND_DEVICE_MIN) || (snd_device2 >= SND_DEVICE_OUT_END)) {
2364 ALOGE("%s: Invalid snd_device = %s", __func__,
2365 platform_get_snd_device_name(snd_device2));
2366 return false;
2367 }
2368 const char * be_itf1 = hw_interface_table[snd_device1];
2369 const char * be_itf2 = hw_interface_table[snd_device2];
2370
2371 if (NULL != be_itf1 && NULL != be_itf2) {
Kuirong Wangb9fbb1e2016-05-03 18:36:39 -07002372 if ((NULL == strstr(be_itf2, be_itf1)) && (NULL == strstr(be_itf1, be_itf2)))
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302373 result = false;
Vikram Panduranga7e784962016-10-27 12:32:30 -07002374 } else if (NULL == be_itf1 && NULL != be_itf2 && (NULL == strstr(be_itf2, DEFAULT_RX_BACKEND))) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302375 result = false;
Vikram Panduranga7e784962016-10-27 12:32:30 -07002376 } else if (NULL != be_itf1 && NULL == be_itf2 && (NULL == strstr(be_itf1, DEFAULT_RX_BACKEND))) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302377 result = false;
2378 }
2379
2380 ALOGV("%s: be_itf1 = %s, be_itf2 = %s, match %d", __func__, be_itf1, be_itf2, result);
2381 return result;
2382}
2383
Eric Laurentb23d5282013-05-14 15:27:20 -07002384int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
2385{
2386 int device_id;
2387 if (device_type == PCM_PLAYBACK)
2388 device_id = pcm_device_table[usecase][0];
2389 else
2390 device_id = pcm_device_table[usecase][1];
2391 return device_id;
2392}
2393
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002394static int find_index(struct name_to_index * table, int32_t len, const char * name)
Ben Romberger61764e32014-01-10 13:49:02 -08002395{
2396 int ret = 0;
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002397 int32_t i;
Ben Romberger61764e32014-01-10 13:49:02 -08002398
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002399 if (table == NULL) {
2400 ALOGE("%s: table is NULL", __func__);
Ben Romberger61764e32014-01-10 13:49:02 -08002401 ret = -ENODEV;
2402 goto done;
2403 }
2404
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002405 if (name == NULL) {
2406 ALOGE("null key");
2407 ret = -ENODEV;
2408 goto done;
2409 }
2410
2411 for (i=0; i < len; i++) {
2412 const char* tn = table[i].name;
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07002413 size_t len = strlen(tn);
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002414 if (strncmp(tn, name, len) == 0) {
2415 if (strlen(name) != len) {
2416 continue; // substring
2417 }
2418 ret = table[i].index;
Ben Romberger61764e32014-01-10 13:49:02 -08002419 goto done;
2420 }
2421 }
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002422 ALOGE("%s: Could not find index for name = %s",
2423 __func__, name);
Ben Romberger61764e32014-01-10 13:49:02 -08002424 ret = -ENODEV;
2425done:
2426 return ret;
2427}
2428
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05302429int platform_set_fluence_type(void *platform, char *value)
2430{
2431 int ret = 0;
2432 int fluence_type = FLUENCE_NONE;
2433 int fluence_flag = NONE_FLAG;
2434 struct platform_data *my_data = (struct platform_data *)platform;
2435 struct audio_device *adev = my_data->adev;
2436
2437 ALOGV("%s: fluence type:%d", __func__, my_data->fluence_type);
2438
2439 /* only dual mic turn on and off is supported as of now through setparameters */
2440 if (!strncmp(AUDIO_PARAMETER_VALUE_DUALMIC,value, sizeof(AUDIO_PARAMETER_VALUE_DUALMIC))) {
2441 if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro")) ||
2442 !strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) {
2443 ALOGV("fluence dualmic feature enabled \n");
2444 fluence_type = FLUENCE_DUAL_MIC;
2445 fluence_flag = DMIC_FLAG;
2446 } else {
2447 ALOGE("%s: Failed to set DUALMIC", __func__);
2448 ret = -1;
2449 goto done;
2450 }
2451 } else if (!strncmp(AUDIO_PARAMETER_KEY_NO_FLUENCE, value, sizeof(AUDIO_PARAMETER_KEY_NO_FLUENCE))) {
2452 ALOGV("fluence disabled");
2453 fluence_type = FLUENCE_NONE;
2454 } else {
2455 ALOGE("Invalid fluence value : %s",value);
2456 ret = -1;
2457 goto done;
2458 }
2459
2460 if (fluence_type != my_data->fluence_type) {
2461 ALOGV("%s: Updating fluence_type to :%d", __func__, fluence_type);
2462 my_data->fluence_type = fluence_type;
2463 adev->acdb_settings = (adev->acdb_settings & FLUENCE_MODE_CLEAR) | fluence_flag;
2464 }
2465done:
2466 return ret;
2467}
2468
2469int platform_get_fluence_type(void *platform, char *value, uint32_t len)
2470{
2471 int ret = 0;
2472 struct platform_data *my_data = (struct platform_data *)platform;
2473
2474 if (my_data->fluence_type == FLUENCE_QUAD_MIC) {
2475 strlcpy(value, "quadmic", len);
2476 } else if (my_data->fluence_type == FLUENCE_DUAL_MIC) {
2477 strlcpy(value, "dualmic", len);
2478 } else if (my_data->fluence_type == FLUENCE_NONE) {
2479 strlcpy(value, "none", len);
2480 } else
2481 ret = -1;
2482
2483 return ret;
2484}
2485
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002486int platform_get_snd_device_index(char *device_name)
2487{
2488 return find_index(snd_device_name_index, SND_DEVICE_MAX, device_name);
2489}
2490
2491int platform_get_usecase_index(const char *usecase_name)
2492{
2493 return find_index(usecase_name_index, AUDIO_USECASE_MAX, usecase_name);
2494}
2495
Ben Romberger55886882014-01-10 13:49:02 -08002496int platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id)
2497{
2498 int ret = 0;
2499
2500 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
2501 ALOGE("%s: Invalid snd_device = %d",
2502 __func__, snd_device);
2503 ret = -EINVAL;
2504 goto done;
2505 }
2506
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302507 ALOGV("%s: acdb_device_table[%s]: old = %d new = %d", __func__,
2508 platform_get_snd_device_name(snd_device), acdb_device_table[snd_device], acdb_id);
Ben Romberger55886882014-01-10 13:49:02 -08002509 acdb_device_table[snd_device] = acdb_id;
2510done:
2511 return ret;
2512}
2513
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302514int platform_set_acdb_metainfo_key(void *platform, char *name, int key)
2515{
2516 struct meta_key_list *key_info;
2517 struct platform_data *pdata = (struct platform_data *)platform;
2518
2519 key_info = (struct meta_key_list *)calloc(1, sizeof(struct meta_key_list));
2520 if (!key_info) {
2521 ALOGE("%s: Could not allocate memory for key %d", __func__, key);
2522 return -ENOMEM;
2523 }
2524
2525 key_info->cal_info.nKey = key;
2526 strlcpy(key_info->name, name, sizeof(key_info->name));
2527 list_add_tail(&pdata->acdb_meta_key_list, &key_info->list);
2528
2529 ALOGD("%s: successfully added module %s and key %d to the list", __func__,
2530 key_info->name, key_info->cal_info.nKey);
2531 return 0;
2532}
2533
2534int platform_get_meta_info_key_from_list(void *platform, char *mod_name)
2535{
2536 struct listnode *node;
2537 struct meta_key_list *key_info;
2538 struct platform_data *pdata = (struct platform_data *)platform;
2539 int key = 0;
2540
2541 ALOGV("%s: for module %s", __func__, mod_name);
2542
2543 list_for_each(node, &pdata->acdb_meta_key_list) {
2544 key_info = node_to_item(node, struct meta_key_list, list);
2545 if (strcmp(key_info->name, mod_name) == 0) {
2546 key = key_info->cal_info.nKey;
2547 ALOGD("%s: Found key %d for module %s", __func__, key, mod_name);
2548 break;
2549 }
2550 }
2551 return key;
2552}
2553
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07002554int platform_get_default_app_type(void *platform)
2555{
2556 struct platform_data *my_data = (struct platform_data *)platform;
2557
2558 if (my_data->acdb_get_default_app_type)
2559 return my_data->acdb_get_default_app_type();
2560 else
Srikanth Uyyalaa1e32352015-10-09 14:48:04 +05302561 return DEFAULT_APP_TYPE_RX_PATH;
2562}
2563
2564int platform_get_default_app_type_v2(void *platform, usecase_type_t type)
2565{
Alexy Josephb1379942016-01-29 15:49:38 -08002566 ALOGV("%s: Platform: %p, type: %d", __func__, platform, type);
Srikanth Uyyalaa1e32352015-10-09 14:48:04 +05302567 if(type == PCM_CAPTURE)
2568 return DEFAULT_APP_TYPE_TX_PATH;
2569 else
2570 return DEFAULT_APP_TYPE_RX_PATH;
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07002571}
2572
Subhash Chandra Bose Naripeddy19dc03b2014-03-10 14:43:05 -07002573int platform_get_snd_device_acdb_id(snd_device_t snd_device)
2574{
2575 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
2576 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
2577 return -EINVAL;
2578 }
2579 return acdb_device_table[snd_device];
2580}
2581
Amit Shekhar5a39c912014-10-14 15:39:30 -07002582int platform_set_snd_device_bit_width(snd_device_t snd_device, unsigned int bit_width)
2583{
2584 int ret = 0;
2585
2586 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
2587 ALOGE("%s: Invalid snd_device = %d",
2588 __func__, snd_device);
2589 ret = -EINVAL;
2590 goto done;
2591 }
2592
2593 backend_bit_width_table[snd_device] = bit_width;
2594done:
2595 return ret;
2596}
2597
2598int platform_get_snd_device_bit_width(snd_device_t snd_device)
2599{
2600 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
2601 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
Ashish Jain058165c2016-09-28 23:18:48 +05302602 return CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Amit Shekhar5a39c912014-10-14 15:39:30 -07002603 }
2604 return backend_bit_width_table[snd_device];
2605}
2606
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302607int platform_set_native_support(int na_mode)
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002608{
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05302609 if (NATIVE_AUDIO_MODE_SRC == na_mode || NATIVE_AUDIO_MODE_TRUE_44_1 == na_mode
2610 || NATIVE_AUDIO_MODE_MULTIPLE_44_1 == na_mode) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302611 na_props.platform_na_prop_enabled = na_props.ui_na_prop_enabled = true;
2612 na_props.na_mode = na_mode;
Ashish Jain6fced6e2017-01-09 14:13:22 +05302613 ALOGD("%s:napb: native audio playback enabled in (%s) mode", __func__,
2614 ((na_mode == NATIVE_AUDIO_MODE_SRC)?"SRC":
2615 (na_mode == NATIVE_AUDIO_MODE_TRUE_44_1)?"True":"Multiple"));
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302616 }
2617 else {
2618 na_props.platform_na_prop_enabled = false;
2619 na_props.na_mode = NATIVE_AUDIO_MODE_INVALID;
2620 ALOGD("%s:napb: native audio playback disabled", __func__);
2621 }
2622
2623 return 0;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002624}
2625
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05302626bool platform_check_codec_dsd_support(void *platform)
2627{
2628 struct platform_data *my_data = (struct platform_data *)platform;
2629 return my_data->is_dsd_supported;
2630}
2631
Preetam Singh Ranawatb0c0dd72016-08-18 00:32:06 +05302632bool platform_check_codec_asrc_support(void *platform)
2633{
2634 struct platform_data *my_data = (struct platform_data *)platform;
2635 return my_data->is_asrc_supported;
2636}
2637
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002638int platform_get_native_support()
2639{
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302640 int ret = NATIVE_AUDIO_MODE_INVALID;
2641 if (na_props.platform_na_prop_enabled &&
2642 na_props.ui_na_prop_enabled) {
2643 ret = na_props.na_mode;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002644 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302645 ALOGV("%s:napb: ui Prop enabled(%d) version(%d)", __func__,
2646 na_props.ui_na_prop_enabled, na_props.na_mode);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002647 return ret;
2648}
2649
2650void native_audio_get_params(struct str_parms *query,
2651 struct str_parms *reply,
2652 char *value, int len)
2653{
2654 int ret;
2655 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
2656 value, len);
2657 if (ret >= 0) {
2658 if (na_props.platform_na_prop_enabled) {
2659 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
2660 na_props.ui_na_prop_enabled ? "true" : "false");
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302661 ALOGV("%s:napb: na_props.ui_na_prop_enabled: %d", __func__,
2662 na_props.ui_na_prop_enabled);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002663 } else {
2664 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
2665 "false");
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302666 ALOGV("%s:napb: native audio not supported: %d", __func__,
2667 na_props.platform_na_prop_enabled);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002668 }
2669 }
2670}
2671
2672int native_audio_set_params(struct platform_data *platform,
2673 struct str_parms *parms, char *value, int len)
2674{
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05302675 int ret = -1;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002676 struct audio_usecase *usecase;
2677 struct listnode *node;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302678 int mode = NATIVE_AUDIO_MODE_INVALID;
2679
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05302680 if (!value || !parms)
2681 return ret;
2682
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302683 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_NATIVE_AUDIO_MODE,
2684 value, len);
2685 if (ret >= 0) {
2686 if (value && !strncmp(value, "src", sizeof("src")))
2687 mode = NATIVE_AUDIO_MODE_SRC;
2688 else if (value && !strncmp(value, "true", sizeof("true")))
2689 mode = NATIVE_AUDIO_MODE_TRUE_44_1;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05302690 else if (value && !strncmp(value, "multiple", sizeof("multiple")))
2691 mode = NATIVE_AUDIO_MODE_MULTIPLE_44_1;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302692 else {
2693 mode = NATIVE_AUDIO_MODE_INVALID;
2694 ALOGE("%s:napb:native_audio_mode in platform info xml,invalid mode string",
2695 __func__);
2696 }
2697 ALOGD("%s:napb updating mode (%d) from XML",__func__, mode);
2698 platform_set_native_support(mode);
2699 }
2700
2701
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002702
2703 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
2704 value, len);
2705 if (ret >= 0) {
2706 if (na_props.platform_na_prop_enabled) {
Sidipotu Ashok894644d2015-07-06 18:35:03 +05302707 if (!strncmp("true", value, sizeof("true"))) {
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002708 na_props.ui_na_prop_enabled = true;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302709 ALOGD("%s:napb: native audio feature enabled from UI",
2710 __func__);
2711 } else {
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002712 na_props.ui_na_prop_enabled = false;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302713 ALOGD("%s:napb: native audio feature disabled from UI",
2714 __func__);
Sidipotu Ashok894644d2015-07-06 18:35:03 +05302715 }
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002716
2717 str_parms_del(parms, AUDIO_PARAMETER_KEY_NATIVE_AUDIO);
2718
2719 /*
2720 * Iterate through the usecase list and trigger device switch for
2721 * all the appropriate usecases
2722 */
2723 list_for_each(node, &(platform->adev)->usecase_list) {
2724 usecase = node_to_item(node, struct audio_usecase, list);
2725
2726 if (is_offload_usecase(usecase->id) &&
2727 (usecase->stream.out->devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
2728 usecase->stream.out->devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) &&
2729 OUTPUT_SAMPLING_RATE_44100 == usecase->stream.out->sample_rate) {
Alexy Josephb1379942016-01-29 15:49:38 -08002730 ALOGD("%s:napb: triggering dynamic device switch for usecase %d, %s"
2731 " stream %p, device (%u)", __func__, usecase->id,
2732 use_case_table[usecase->id],
2733 (void*) usecase->stream.out,
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002734 usecase->stream.out->devices);
Sidipotu Ashok894644d2015-07-06 18:35:03 +05302735 select_devices(platform->adev, usecase->id);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002736 }
2737 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302738 } else
2739 ALOGD("%s:napb: native audio cannot be enabled from UI",
2740 __func__);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002741 }
2742 return ret;
2743}
2744
Sidipotu Ashokad8fff82016-02-02 10:48:42 +05302745int check_hdset_combo_device(snd_device_t snd_device)
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302746{
2747 int ret = false;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302748
Sidipotu Ashokad8fff82016-02-02 10:48:42 +05302749 if (SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES == snd_device ||
2750 SND_DEVICE_OUT_SPEAKER_AND_LINE == snd_device ||
2751 SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1 == snd_device ||
2752 SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2 == snd_device ||
Meng Wang841d6c02017-01-24 12:34:36 +08002753 SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET == snd_device ||
2754 SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET == snd_device)
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302755 ret = true;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302756
2757 return ret;
2758}
kunleiz207afaa2016-07-22 14:26:49 +08002759
Ashish Jainb26edfb2016-08-25 00:10:11 +05302760int codec_device_supports_native_playback(audio_devices_t out_device)
kunleiz207afaa2016-07-22 14:26:49 +08002761{
Ashish Jainb26edfb2016-08-25 00:10:11 +05302762 int ret = false;
kunleiz207afaa2016-07-22 14:26:49 +08002763
2764 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
2765 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
2766 out_device & AUDIO_DEVICE_OUT_LINE)
Ashish Jainb26edfb2016-08-25 00:10:11 +05302767 ret = true;
kunleiz207afaa2016-07-22 14:26:49 +08002768
2769 return ret;
2770}
2771
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05302772int platform_get_backend_index(snd_device_t snd_device)
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08002773{
2774 int32_t port = DEFAULT_CODEC_BACKEND;
2775
Kuirong Wang0b947f72016-09-29 11:03:09 -07002776 if (snd_device >= SND_DEVICE_OUT_BEGIN && snd_device < SND_DEVICE_OUT_END) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302777 if (backend_tag_table[snd_device] != NULL) {
2778 if (strncmp(backend_tag_table[snd_device], "headphones-44.1",
2779 sizeof("headphones-44.1")) == 0)
2780 port = HEADPHONE_44_1_BACKEND;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05302781 else if (strncmp(backend_tag_table[snd_device], "headphones-dsd",
2782 sizeof("headphones-dsd")) == 0)
2783 port = DSD_NATIVE_BACKEND;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302784 else if (strncmp(backend_tag_table[snd_device], "headphones",
2785 sizeof("headphones")) == 0)
2786 port = HEADPHONE_BACKEND;
2787 else if (strcmp(backend_tag_table[snd_device], "hdmi") == 0)
2788 port = HDMI_RX_BACKEND;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07002789 else if (strcmp(backend_tag_table[snd_device], "display-port") == 0)
2790 port = DISP_PORT_RX_BACKEND;
Ashish Jain3e37a702016-11-25 12:27:15 +05302791 else if ((strcmp(backend_tag_table[snd_device], "usb-headphones") == 0) ||
2792 (strcmp(backend_tag_table[snd_device], "usb-headset") == 0))
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08002793 port = USB_AUDIO_RX_BACKEND;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302794 }
Kuirong Wang0b947f72016-09-29 11:03:09 -07002795 } else if (snd_device >= SND_DEVICE_IN_BEGIN && snd_device < SND_DEVICE_IN_END) {
2796 port = DEFAULT_CODEC_TX_BACKEND;
Kuirong Wange9894162016-08-26 15:16:39 -07002797 if (backend_tag_table[snd_device] != NULL) {
2798 if (strcmp(backend_tag_table[snd_device], "usb-headset-mic") == 0)
2799 port = USB_AUDIO_TX_BACKEND;
Dhanalakshmi Siddanib678a802016-12-03 11:51:41 +05302800 else if (strstr(backend_tag_table[snd_device], "bt-sco") != NULL)
2801 port = BT_SCO_TX_BACKEND;
Kuirong Wange9894162016-08-26 15:16:39 -07002802 }
2803 } else {
Kuirong Wang0b947f72016-09-29 11:03:09 -07002804 ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
Kuirong Wange9894162016-08-26 15:16:39 -07002805 }
2806
Kuirong Wang0b947f72016-09-29 11:03:09 -07002807 ALOGV("%s:napb: backend port - %d device - %d ", __func__, port, snd_device);
Kuirong Wange9894162016-08-26 15:16:39 -07002808 return port;
2809}
2810
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05302811int platform_send_audio_calibration(void *platform, struct audio_usecase *usecase,
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07002812 int app_type, int sample_rate)
Eric Laurentb23d5282013-05-14 15:27:20 -07002813{
2814 struct platform_data *my_data = (struct platform_data *)platform;
2815 int acdb_dev_id, acdb_dev_type;
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05302816 int snd_device = SND_DEVICE_OUT_SPEAKER;
Siena Richard7c2db772016-12-21 11:32:34 -08002817 int new_snd_device[SND_DEVICE_OUT_END] = {0};
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302818 int i, num_devices = 1;
Eric Laurentb23d5282013-05-14 15:27:20 -07002819
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05302820 if (usecase->type == PCM_PLAYBACK)
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302821 snd_device = usecase->out_snd_device;
Karthik Reddy Katta81c42612015-11-13 17:49:07 +05302822 else if ((usecase->type == PCM_CAPTURE) &&
2823 voice_is_in_call_rec_stream(usecase->stream.in))
2824 snd_device = voice_get_incall_rec_snd_device(usecase->in_snd_device);
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05302825 else if ((usecase->type == PCM_HFP_CALL) || (usecase->type == PCM_CAPTURE))
Vidyakumar Athotab0975c32015-07-21 14:15:03 -07002826 snd_device = usecase->in_snd_device;
2827
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08002828 acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(snd_device)];
Eric Laurentb23d5282013-05-14 15:27:20 -07002829 if (acdb_dev_id < 0) {
2830 ALOGE("%s: Could not find acdb id for device(%d)",
2831 __func__, snd_device);
2832 return -EINVAL;
2833 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302834
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07002835 if (platform_split_snd_device(my_data, snd_device,
2836 &num_devices, new_snd_device) < 0) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302837 new_snd_device[0] = snd_device;
Eric Laurentb23d5282013-05-14 15:27:20 -07002838 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302839
2840 for (i = 0; i < num_devices; i++) {
2841 acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(new_snd_device[i])];
2842 if (acdb_dev_id < 0) {
2843 ALOGE("%s: Could not find acdb id for device(%d)",
2844 __func__, new_snd_device[i]);
2845 return -EINVAL;
2846 }
Siena Richard7c2db772016-12-21 11:32:34 -08002847 ALOGV("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
2848 __func__, new_snd_device[i], acdb_dev_id);
2849 if (new_snd_device[i] >= SND_DEVICE_OUT_BEGIN &&
2850 new_snd_device[i] < SND_DEVICE_OUT_END)
2851 acdb_dev_type = ACDB_DEV_TYPE_OUT;
2852 else
2853 acdb_dev_type = ACDB_DEV_TYPE_IN;
2854
2855 if (my_data->acdb_send_audio_cal_v3) {
2856 my_data->acdb_send_audio_cal_v3(acdb_dev_id, acdb_dev_type,
2857 app_type, sample_rate, i);
2858 } else if (my_data->acdb_send_audio_cal) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302859 my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type, app_type,
2860 sample_rate);
2861 }
2862 }
2863
Eric Laurentb23d5282013-05-14 15:27:20 -07002864 return 0;
2865}
2866
2867int platform_switch_voice_call_device_pre(void *platform)
2868{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002869 struct platform_data *my_data = (struct platform_data *)platform;
2870 int ret = 0;
2871
Vidyakumar Athota1fd21792013-11-15 14:50:57 -08002872 if (my_data->csd != NULL &&
Ravi Kumar Alamandabe149392014-10-20 17:07:43 -07002873 voice_is_in_call(my_data->adev)) {
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002874 /* This must be called before disabling mixer controls on APQ side */
2875 ret = my_data->csd->disable_device();
2876 if (ret < 0) {
2877 ALOGE("%s: csd_client_disable_device, failed, error %d",
2878 __func__, ret);
2879 }
2880 }
2881 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07002882}
2883
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08002884int platform_switch_voice_call_enable_device_config(void *platform,
2885 snd_device_t out_snd_device,
2886 snd_device_t in_snd_device)
2887{
2888 struct platform_data *my_data = (struct platform_data *)platform;
2889 int acdb_rx_id, acdb_tx_id;
2890 int ret = 0;
2891
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002892 if (my_data->csd == NULL)
2893 return ret;
2894
Banajit Goswami20cdd212015-09-11 01:11:30 -07002895 if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
Rohit kumarf4120402016-08-05 19:19:48 +05302896 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
2897 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
2898 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
Banajit Goswami20cdd212015-09-11 01:11:30 -07002899 audio_extn_spkr_prot_is_enabled()) {
2900 if (my_data->is_vbat_speaker)
2901 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
2902 else
2903 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED];
2904 } else
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002905 acdb_rx_id = acdb_device_table[out_snd_device];
2906
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08002907 acdb_tx_id = acdb_device_table[in_snd_device];
2908
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002909 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
2910 ret = my_data->csd->enable_device_config(acdb_rx_id, acdb_tx_id);
2911 if (ret < 0) {
2912 ALOGE("%s: csd_enable_device_config, failed, error %d",
2913 __func__, ret);
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08002914 }
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002915 } else {
2916 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
2917 acdb_rx_id, acdb_tx_id);
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08002918 }
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002919
Vidyakumar Athota545dbd32013-11-13 17:30:53 -08002920 return ret;
2921}
2922
Eric Laurentb23d5282013-05-14 15:27:20 -07002923int platform_switch_voice_call_device_post(void *platform,
2924 snd_device_t out_snd_device,
2925 snd_device_t in_snd_device)
2926{
2927 struct platform_data *my_data = (struct platform_data *)platform;
2928 int acdb_rx_id, acdb_tx_id;
2929
2930 if (my_data->acdb_send_voice_cal == NULL) {
2931 ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
2932 } else {
Rohit kumarf4120402016-08-05 19:19:48 +05302933 if (audio_extn_spkr_prot_is_enabled()) {
2934 if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER)
2935 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
2936 else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)
2937 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
Rohit kumard3c3b912016-11-15 18:50:31 +05302938 else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2)
Rohit kumarf4120402016-08-05 19:19:48 +05302939 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
2940 else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)
2941 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
2942 }
Anish Kumar46c7b872014-09-09 01:49:44 -07002943
Vidyakumar Athota1fd21792013-11-15 14:50:57 -08002944 acdb_rx_id = acdb_device_table[out_snd_device];
2945 acdb_tx_id = acdb_device_table[in_snd_device];
2946
Eric Laurentb23d5282013-05-14 15:27:20 -07002947 if (acdb_rx_id > 0 && acdb_tx_id > 0)
2948 my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id);
2949 else
2950 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
2951 acdb_rx_id, acdb_tx_id);
2952 }
2953
Vidyakumar Athota1fd21792013-11-15 14:50:57 -08002954 return 0;
2955}
2956
2957int platform_switch_voice_call_usecase_route_post(void *platform,
2958 snd_device_t out_snd_device,
2959 snd_device_t in_snd_device)
2960{
2961 struct platform_data *my_data = (struct platform_data *)platform;
2962 int acdb_rx_id, acdb_tx_id;
2963 int ret = 0;
2964
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002965 if (my_data->csd == NULL)
2966 return ret;
2967
Banajit Goswami20cdd212015-09-11 01:11:30 -07002968 if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
Rohit kumarf4120402016-08-05 19:19:48 +05302969 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
2970 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
2971 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
Banajit Goswami20cdd212015-09-11 01:11:30 -07002972 audio_extn_spkr_prot_is_enabled()) {
2973 if (my_data->is_vbat_speaker)
2974 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
2975 else
2976 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED];
2977 } else
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002978 acdb_rx_id = acdb_device_table[out_snd_device];
2979
Vidyakumar Athota1fd21792013-11-15 14:50:57 -08002980 acdb_tx_id = acdb_device_table[in_snd_device];
2981
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002982 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
2983 ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id,
2984 my_data->adev->acdb_settings);
2985 if (ret < 0) {
2986 ALOGE("%s: csd_enable_device, failed, error %d", __func__, ret);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002987 }
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002988 } else {
2989 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
2990 acdb_rx_id, acdb_tx_id);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002991 }
Vidyakumar Athota1c6419a2014-01-10 14:47:34 -08002992
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002993 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07002994}
2995
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002996int platform_start_voice_call(void *platform, uint32_t vsid)
Eric Laurentb23d5282013-05-14 15:27:20 -07002997{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08002998 struct platform_data *my_data = (struct platform_data *)platform;
2999 int ret = 0;
3000
3001 if (my_data->csd != NULL) {
3002 ret = my_data->csd->start_voice(vsid);
3003 if (ret < 0) {
3004 ALOGE("%s: csd_start_voice error %d\n", __func__, ret);
3005 }
3006 }
3007 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003008}
3009
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003010int platform_stop_voice_call(void *platform, uint32_t vsid)
Eric Laurentb23d5282013-05-14 15:27:20 -07003011{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003012 struct platform_data *my_data = (struct platform_data *)platform;
3013 int ret = 0;
3014
3015 if (my_data->csd != NULL) {
3016 ret = my_data->csd->stop_voice(vsid);
3017 if (ret < 0) {
3018 ALOGE("%s: csd_stop_voice error %d\n", __func__, ret);
3019 }
3020 }
3021 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003022}
3023
Helen Zeng6a16ad72014-02-23 22:04:44 -08003024int platform_get_sample_rate(void *platform, uint32_t *rate)
3025{
3026 struct platform_data *my_data = (struct platform_data *)platform;
3027 int ret = 0;
3028
3029 if ((my_data->csd != NULL) && my_data->is_i2s_ext_modem) {
3030 ret = my_data->csd->get_sample_rate(rate);
3031 if (ret < 0) {
3032 ALOGE("%s: csd_get_sample_rate error %d\n", __func__, ret);
3033 }
3034 }
3035 return ret;
3036}
3037
Eric Laurentb23d5282013-05-14 15:27:20 -07003038int platform_set_voice_volume(void *platform, int volume)
3039{
3040 struct platform_data *my_data = (struct platform_data *)platform;
3041 struct audio_device *adev = my_data->adev;
3042 struct mixer_ctl *ctl;
sangwoo53b2cf02013-07-25 19:18:44 -07003043 const char *mixer_ctl_name = "Voice Rx Gain";
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003044 int vol_index = 0, ret = 0;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003045 uint32_t set_values[ ] = {0,
3046 ALL_SESSION_VSID,
3047 DEFAULT_VOLUME_RAMP_DURATION_MS};
Eric Laurentb23d5282013-05-14 15:27:20 -07003048
3049 // Voice volume levels are mapped to adsp volume levels as follows.
3050 // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1 0 -> 0
3051 // But this values don't changed in kernel. So, below change is need.
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003052 vol_index = (int)percent_to_index(volume, MIN_VOL_INDEX, MAX_VOL_INDEX);
3053 set_values[0] = vol_index;
Eric Laurentb23d5282013-05-14 15:27:20 -07003054
3055 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3056 if (!ctl) {
3057 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3058 __func__, mixer_ctl_name);
3059 return -EINVAL;
3060 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003061 ALOGV("Setting voice volume index: %d", set_values[0]);
3062 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Eric Laurentb23d5282013-05-14 15:27:20 -07003063
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003064 if (my_data->csd != NULL) {
Vidyakumar Athotac37f42a2014-03-11 11:57:48 -07003065 ret = my_data->csd->volume(ALL_SESSION_VSID, volume,
3066 DEFAULT_VOLUME_RAMP_DURATION_MS);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003067 if (ret < 0) {
3068 ALOGE("%s: csd_volume error %d", __func__, ret);
3069 }
3070 }
3071 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003072}
3073
3074int platform_set_mic_mute(void *platform, bool state)
3075{
3076 struct platform_data *my_data = (struct platform_data *)platform;
3077 struct audio_device *adev = my_data->adev;
3078 struct mixer_ctl *ctl;
3079 const char *mixer_ctl_name = "Voice Tx Mute";
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003080 int ret = 0;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003081 uint32_t set_values[ ] = {0,
3082 ALL_SESSION_VSID,
Vidyakumar Athotac37f42a2014-03-11 11:57:48 -07003083 DEFAULT_MUTE_RAMP_DURATION_MS};
Eric Laurentb23d5282013-05-14 15:27:20 -07003084
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003085 set_values[0] = state;
3086 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3087 if (!ctl) {
3088 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3089 __func__, mixer_ctl_name);
3090 return -EINVAL;
3091 }
3092 ALOGV("Setting voice mute state: %d", state);
3093 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Eric Laurentb23d5282013-05-14 15:27:20 -07003094
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003095 if (my_data->csd != NULL) {
Vidyakumar Athotac37f42a2014-03-11 11:57:48 -07003096 ret = my_data->csd->mic_mute(ALL_SESSION_VSID, state,
3097 DEFAULT_MUTE_RAMP_DURATION_MS);
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003098 if (ret < 0) {
3099 ALOGE("%s: csd_mic_mute error %d", __func__, ret);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08003100 }
3101 }
3102 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -07003103}
3104
Shiv Maliyappanahallic6fd8ee2014-03-07 15:31:55 -08003105int platform_set_device_mute(void *platform, bool state, char *dir)
3106{
3107 struct platform_data *my_data = (struct platform_data *)platform;
3108 struct audio_device *adev = my_data->adev;
3109 struct mixer_ctl *ctl;
3110 char *mixer_ctl_name = NULL;
3111 int ret = 0;
3112 uint32_t set_values[ ] = {0,
3113 ALL_SESSION_VSID,
3114 0};
3115 if(dir == NULL) {
3116 ALOGE("%s: Invalid direction:%s", __func__, dir);
3117 return -EINVAL;
3118 }
3119
3120 if (!strncmp("rx", dir, sizeof("rx"))) {
3121 mixer_ctl_name = "Voice Rx Device Mute";
3122 } else if (!strncmp("tx", dir, sizeof("tx"))) {
3123 mixer_ctl_name = "Voice Tx Device Mute";
3124 } else {
3125 return -EINVAL;
3126 }
3127
3128 set_values[0] = state;
3129 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3130 if (!ctl) {
3131 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3132 __func__, mixer_ctl_name);
3133 return -EINVAL;
3134 }
3135
3136 ALOGV("%s: Setting device mute state: %d, mixer ctrl:%s",
3137 __func__,state, mixer_ctl_name);
3138 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
3139
3140 return ret;
3141}
3142
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003143int platform_split_snd_device(void *platform,
3144 snd_device_t snd_device,
3145 int *num_devices,
3146 snd_device_t *new_snd_devices)
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303147{
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003148 int ret = -EINVAL;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303149 struct platform_data *my_data = (struct platform_data *)platform;
3150
3151 if ( NULL == num_devices || NULL == new_snd_devices || NULL == my_data) {
3152 ALOGE("%s: NULL pointer ..", __func__);
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003153 return -EINVAL;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303154 }
3155
3156 /*
3157 * If wired headset/headphones/line devices share the same backend
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003158 * with speaker/earpiece this routine returns -EINVAL.
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303159 */
3160 if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES &&
3161 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HEADPHONES)) {
3162 *num_devices = 2;
3163 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3164 new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003165 ret = 0;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303166 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET &&
3167 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_ANC_HEADSET)) {
3168 *num_devices = 2;
3169 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3170 new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
3171 ret = 0;
3172 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET &&
3173 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_ANC_FB_HEADSET)) {
3174 *num_devices = 2;
3175 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3176 new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
3177 ret = 0;
3178 } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES &&
3179 !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER, SND_DEVICE_OUT_VOICE_HEADPHONES)) {
3180 *num_devices = 2;
3181 new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
3182 new_snd_devices[1] = SND_DEVICE_OUT_VOICE_HEADPHONES;
3183 ret = 0;
3184 } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET &&
3185 !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER, SND_DEVICE_OUT_VOICE_ANC_HEADSET)) {
3186 *num_devices = 2;
3187 new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
3188 new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
3189 ret = 0;
3190 } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET &&
3191 !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER, SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET)) {
3192 *num_devices = 2;
3193 new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
3194 new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
3195 ret = 0;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303196 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI &&
3197 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HDMI)) {
3198 *num_devices = 2;
3199 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3200 new_snd_devices[1] = SND_DEVICE_OUT_HDMI;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003201 ret = 0;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003202 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT &&
3203 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_DISPLAY_PORT)) {
3204 *num_devices = 2;
3205 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3206 new_snd_devices[1] = SND_DEVICE_OUT_DISPLAY_PORT;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003207 ret = 0;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003208 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET &&
3209 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_USB_HEADSET)) {
3210 *num_devices = 2;
3211 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3212 new_snd_devices[1] = SND_DEVICE_OUT_USB_HEADSET;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003213 ret = 0;
Naresh Tannirucd2353e2016-08-19 00:37:25 +05303214 } else if (SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP == snd_device) {
3215 *num_devices = 2;
3216 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3217 new_snd_devices[1] = SND_DEVICE_OUT_BT_A2DP;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003218 ret = 0;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303219 }
3220
3221 ALOGD("%s: snd_device(%d) num devices(%d) new_snd_devices(%d)", __func__,
3222 snd_device, *num_devices, *new_snd_devices);
3223
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003224 return ret;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303225}
3226
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003227int platform_get_ext_disp_type(void *platform)
3228{
3229 int disp_type;
3230 struct platform_data *my_data = (struct platform_data *)platform;
3231
3232 if (my_data->ext_disp_type != EXT_DISPLAY_TYPE_NONE) {
3233 ALOGD("%s: Returning cached ext disp type:%s",
3234 __func__, (my_data->ext_disp_type == EXT_DISPLAY_TYPE_DP) ? "DisplayPort" : "HDMI");
3235 return my_data->ext_disp_type;
3236 }
3237
3238#ifdef DISPLAY_PORT_ENABLED
3239 struct audio_device *adev = my_data->adev;
3240 struct mixer_ctl *ctl;
3241 char *mixer_ctl_name = "External Display Type";
3242
3243 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3244 if (!ctl) {
3245 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3246 __func__, mixer_ctl_name);
3247 return -EINVAL;
3248 }
3249
3250 disp_type = mixer_ctl_get_value(ctl, 0);
3251 if (disp_type == EXT_DISPLAY_TYPE_NONE) {
3252 ALOGE("%s: Invalid external display type: %d", __func__, disp_type);
3253 return -EINVAL;
3254 }
3255#else
3256 disp_type = EXT_DISPLAY_TYPE_HDMI;
3257#endif
3258
3259 my_data->ext_disp_type = disp_type;
3260 ALOGD("%s: ext disp type:%s", __func__, (disp_type == EXT_DISPLAY_TYPE_DP) ? "DisplayPort" : "HDMI");
3261 return disp_type;
3262}
3263
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08003264snd_device_t platform_get_output_snd_device(void *platform, struct stream_out *out)
Eric Laurentb23d5282013-05-14 15:27:20 -07003265{
3266 struct platform_data *my_data = (struct platform_data *)platform;
3267 struct audio_device *adev = my_data->adev;
3268 audio_mode_t mode = adev->mode;
3269 snd_device_t snd_device = SND_DEVICE_NONE;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08003270 audio_devices_t devices = out->devices;
3271 unsigned int sample_rate = out->sample_rate;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303272 int na_mode = platform_get_native_support();
Eric Laurentb23d5282013-05-14 15:27:20 -07003273
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003274 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
3275 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
3276 int channel_count = popcount(channel_mask);
3277
Eric Laurentb23d5282013-05-14 15:27:20 -07003278 ALOGV("%s: enter: output devices(%#x)", __func__, devices);
3279 if (devices == AUDIO_DEVICE_NONE ||
3280 devices & AUDIO_DEVICE_BIT_IN) {
3281 ALOGV("%s: Invalid output devices (%#x)", __func__, devices);
3282 goto exit;
3283 }
3284
Shiv Maliyappanahallibd401262015-08-17 11:02:21 -07003285 if (popcount(devices) == 2) {
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303286 bool is_active_voice_call = false;
3287
3288 /*
3289 * This is special case handling for combo device use case during
3290 * voice call. APM route use case to combo device if stream type is
3291 * enforced audible (e.g. Camera shutter sound).
3292 */
3293 if ((mode == AUDIO_MODE_IN_CALL) ||
3294 voice_is_in_call(adev) ||
3295 voice_extn_compress_voip_is_active(adev))
3296 is_active_voice_call = true;
3297
Mingming Yin4a72d652014-01-03 18:54:18 -08003298 if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
3299 AUDIO_DEVICE_OUT_SPEAKER)) {
Tanya Finkel00130052014-07-14 04:26:56 -07003300 if (my_data->external_spk_1)
3301 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1;
3302 else if (my_data->external_spk_2)
3303 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303304 else if (is_active_voice_call)
3305 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES;
Tanya Finkel00130052014-07-14 04:26:56 -07003306 else
3307 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
Mingming Yin4a72d652014-01-03 18:54:18 -08003308 } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
3309 AUDIO_DEVICE_OUT_SPEAKER)) {
Meng Wang841d6c02017-01-24 12:34:36 +08003310 if (audio_extn_get_anc_enabled()) {
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303311 if (audio_extn_should_use_fb_anc()) {
3312 if (is_active_voice_call)
3313 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET;
3314 else
3315 snd_device = SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET;
3316 } else {
3317 if (is_active_voice_call)
3318 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET;
3319 else
3320 snd_device = SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET;
3321 }
Meng Wang841d6c02017-01-24 12:34:36 +08003322 } else if (my_data->external_spk_1)
Tanya Finkel00130052014-07-14 04:26:56 -07003323 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1;
3324 else if (my_data->external_spk_2)
3325 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303326 else {
3327 if (is_active_voice_call)
3328 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES;
3329 else
3330 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
3331 }
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003332 } else if (devices == (AUDIO_DEVICE_OUT_LINE |
3333 AUDIO_DEVICE_OUT_SPEAKER)) {
3334 snd_device = SND_DEVICE_OUT_SPEAKER_AND_LINE;
Mingming Yin4a72d652014-01-03 18:54:18 -08003335 } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL |
3336 AUDIO_DEVICE_OUT_SPEAKER)) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003337 switch(my_data->ext_disp_type) {
3338 case EXT_DISPLAY_TYPE_HDMI:
3339 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI;
3340 break;
3341 case EXT_DISPLAY_TYPE_DP:
3342 snd_device = SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT;
3343 break;
3344 default:
3345 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
3346 goto exit;
3347 }
Mingming Yin4a72d652014-01-03 18:54:18 -08003348 } else if (devices == (AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
3349 AUDIO_DEVICE_OUT_SPEAKER)) {
3350 snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003351 } else if (devices == (AUDIO_DEVICE_OUT_USB_DEVICE |
3352 AUDIO_DEVICE_OUT_SPEAKER)) {
3353 snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303354 } else if ((devices & AUDIO_DEVICE_OUT_SPEAKER) &&
3355 (devices & AUDIO_DEVICE_OUT_ALL_A2DP)) {
3356 snd_device = SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP;
Mingming Yin4a72d652014-01-03 18:54:18 -08003357 } else {
3358 ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
3359 goto exit;
3360 }
3361 if (snd_device != SND_DEVICE_NONE) {
3362 goto exit;
3363 }
3364 }
3365
3366 if (popcount(devices) != 1) {
3367 ALOGE("%s: Invalid output devices(%#x)", __func__, devices);
3368 goto exit;
3369 }
3370
Venkata Narendra Kumar Guttabfdfa152015-06-22 14:25:35 +05303371 if ((mode == AUDIO_MODE_IN_CALL) ||
kunleiz16dbcc32016-12-13 18:23:04 +08003372 voice_is_in_call(adev) ||
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003373 voice_extn_compress_voip_is_active(adev)) {
Eric Laurentb23d5282013-05-14 15:27:20 -07003374 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003375 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
3376 devices & AUDIO_DEVICE_OUT_LINE) {
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003377 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
3378 !voice_extn_compress_voip_is_active(adev)) {
3379 switch (adev->voice.tty_mode) {
3380 case TTY_MODE_FULL:
3381 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
3382 break;
3383 case TTY_MODE_VCO:
3384 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
3385 break;
3386 case TTY_MODE_HCO:
3387 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
3388 break;
3389 default:
3390 ALOGE("%s: Invalid TTY mode (%#x)",
3391 __func__, adev->voice.tty_mode);
3392 }
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003393 } else if (devices & AUDIO_DEVICE_OUT_LINE) {
3394 snd_device = SND_DEVICE_OUT_VOICE_LINE;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003395 } else if (audio_extn_get_anc_enabled()) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003396 if (audio_extn_should_use_fb_anc())
3397 snd_device = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
3398 else
3399 snd_device = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003400 } else {
Eric Laurentb23d5282013-05-14 15:27:20 -07003401 snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003402 }
Aniket Kumar Lata91886592017-05-25 16:53:32 -07003403 } else if (devices & AUDIO_DEVICE_OUT_USB_DEVICE) {
3404 if (voice_is_in_call(adev)) {
3405 switch (adev->voice.tty_mode) {
3406 case TTY_MODE_FULL:
3407 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_USB;
3408 break;
3409 case TTY_MODE_VCO:
3410 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_USB;
3411 break;
3412 case TTY_MODE_HCO:
3413 // since Hearing will be on handset\speaker, use existing device
3414 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
3415 break;
3416 default:
3417 ALOGE("%s: Invalid TTY mode (%#x)",
3418 __func__, adev->voice.tty_mode);
3419 }
3420 }
Eric Laurentb23d5282013-05-14 15:27:20 -07003421 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Mingming Yin514a8bc2014-07-29 15:22:21 -07003422 if (adev->bt_wb_speech_enabled)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003423 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
3424 else
3425 snd_device = SND_DEVICE_OUT_BT_SCO;
Eric Laurentb23d5282013-05-14 15:27:20 -07003426 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
Rohit kumarf4120402016-08-05 19:19:48 +05303427 if (my_data->is_vbat_speaker) {
kunleizaa6a3f12017-01-19 12:28:28 +08003428 if (hw_info_is_stereo_spkr(my_data->hw_info)) {
3429 if (my_data->mono_speaker == SPKR_1)
3430 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
3431 else
3432 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT;
3433 } else
Rohit kumarf4120402016-08-05 19:19:48 +05303434 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
Rohit kumarf4120402016-08-05 19:19:48 +05303435 } else {
kunleizaa6a3f12017-01-19 12:28:28 +08003436 if (hw_info_is_stereo_spkr(my_data->hw_info)) {
3437 if (my_data->mono_speaker == SPKR_1)
3438 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
3439 else
3440 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
3441 } else
3442 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
Rohit kumarf4120402016-08-05 19:19:48 +05303443 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303444 } else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
3445 snd_device = SND_DEVICE_OUT_BT_A2DP;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07003446 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
3447 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
3448 snd_device = SND_DEVICE_OUT_USB_HEADSET;
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -07003449 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
3450 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07003451 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
Ravi Kumar Alamandaceb40822013-11-06 11:01:47 -08003452 if (audio_extn_should_use_handset_anc(channel_count))
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003453 snd_device = SND_DEVICE_OUT_ANC_HANDSET;
Eric Laurentb23d5282013-05-14 15:27:20 -07003454 else
Mingming Yin8e5a4f62013-10-07 15:23:41 -07003455 snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -07003456 } else if (devices & AUDIO_DEVICE_OUT_TELEPHONY_TX)
3457 snd_device = SND_DEVICE_OUT_VOICE_TX;
3458
Eric Laurentb23d5282013-05-14 15:27:20 -07003459 if (snd_device != SND_DEVICE_NONE) {
3460 goto exit;
3461 }
3462 }
3463
Eric Laurentb23d5282013-05-14 15:27:20 -07003464 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Preetam Singh Ranawatf5fbdd62016-09-29 18:38:31 +05303465 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
3466 devices & AUDIO_DEVICE_OUT_LINE) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003467 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADSET
3468 && audio_extn_get_anc_enabled()) {
3469 if (audio_extn_should_use_fb_anc())
3470 snd_device = SND_DEVICE_OUT_ANC_FB_HEADSET;
3471 else
3472 snd_device = SND_DEVICE_OUT_ANC_HEADSET;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303473 } else if (NATIVE_AUDIO_MODE_SRC == na_mode &&
3474 OUTPUT_SAMPLING_RATE_44100 == sample_rate) {
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08003475 snd_device = SND_DEVICE_OUT_HEADPHONES_44_1;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05303476 } else if (NATIVE_AUDIO_MODE_MULTIPLE_44_1 == na_mode &&
3477 (sample_rate % OUTPUT_SAMPLING_RATE_44100 == 0) &&
3478 (out->format != AUDIO_FORMAT_DSD)) {
3479 snd_device = SND_DEVICE_OUT_HEADPHONES_44_1;
3480 } else if (out->format == AUDIO_FORMAT_DSD) {
3481 snd_device = SND_DEVICE_OUT_HEADPHONES_DSD;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303482 } else
3483 snd_device = SND_DEVICE_OUT_HEADPHONES;
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003484 } else if (devices & AUDIO_DEVICE_OUT_LINE) {
3485 snd_device = SND_DEVICE_OUT_LINE;
Eric Laurentb23d5282013-05-14 15:27:20 -07003486 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
Tanya Finkel00130052014-07-14 04:26:56 -07003487 if (my_data->external_spk_1)
3488 snd_device = SND_DEVICE_OUT_SPEAKER_EXTERNAL_1;
3489 else if (my_data->external_spk_2)
3490 snd_device = SND_DEVICE_OUT_SPEAKER_EXTERNAL_2;
3491 else if (adev->speaker_lr_swap)
Eric Laurentb23d5282013-05-14 15:27:20 -07003492 snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
Banajit Goswami20cdd212015-09-11 01:11:30 -07003493 else if (my_data->is_vbat_speaker)
3494 snd_device = SND_DEVICE_OUT_SPEAKER_VBAT;
Eric Laurentb23d5282013-05-14 15:27:20 -07003495 else
3496 snd_device = SND_DEVICE_OUT_SPEAKER;
3497 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Mingming Yin514a8bc2014-07-29 15:22:21 -07003498 if (adev->bt_wb_speech_enabled)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003499 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
3500 else
3501 snd_device = SND_DEVICE_OUT_BT_SCO;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303502 } else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
3503 snd_device = SND_DEVICE_OUT_BT_A2DP;
Eric Laurentb23d5282013-05-14 15:27:20 -07003504 } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003505 switch(my_data->ext_disp_type) {
3506 case EXT_DISPLAY_TYPE_HDMI:
3507 snd_device = SND_DEVICE_OUT_HDMI;
3508 break;
3509 case EXT_DISPLAY_TYPE_DP:
3510 snd_device = SND_DEVICE_OUT_DISPLAY_PORT;
3511 break;
3512 default:
3513 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
3514 goto exit;
3515 }
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07003516 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
3517 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
Mingming Yin5a7c5d62014-03-05 17:45:03 -08003518 ALOGD("%s: setting USB hadset channel capability(2) for Proxy", __func__);
3519 audio_extn_set_afe_proxy_channel_mixer(adev, 2);
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07003520 snd_device = SND_DEVICE_OUT_USB_HEADSET;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003521 } else if (devices & AUDIO_DEVICE_OUT_USB_DEVICE) {
Ashish Jain3e37a702016-11-25 12:27:15 +05303522 if (audio_extn_usb_is_capture_supported())
3523 snd_device = SND_DEVICE_OUT_USB_HEADSET;
3524 else
3525 snd_device = SND_DEVICE_OUT_USB_HEADPHONES;
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -07003526 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
3527 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07003528 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
3529 snd_device = SND_DEVICE_OUT_HANDSET;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07003530 } else if (devices & AUDIO_DEVICE_OUT_PROXY) {
Mingming Yin5a7c5d62014-03-05 17:45:03 -08003531 channel_count = audio_extn_get_afe_proxy_channel_count();
3532 ALOGD("%s: setting sink capability(%d) for Proxy", __func__, channel_count);
3533 audio_extn_set_afe_proxy_channel_mixer(adev, channel_count);
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07003534 snd_device = SND_DEVICE_OUT_AFE_PROXY;
Eric Laurentb23d5282013-05-14 15:27:20 -07003535 } else {
3536 ALOGE("%s: Unknown device(s) %#x", __func__, devices);
3537 }
3538exit:
3539 ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]);
3540 return snd_device;
3541}
3542
3543snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device)
3544{
3545 struct platform_data *my_data = (struct platform_data *)platform;
3546 struct audio_device *adev = my_data->adev;
Dhanalakshmi Siddanib678a802016-12-03 11:51:41 +05303547 /*
3548 * TODO: active_input always points to last opened input. Source returned will
3549 * be wrong if more than one active inputs are present.
3550 */
Eric Laurentb23d5282013-05-14 15:27:20 -07003551 audio_source_t source = (adev->active_input == NULL) ?
3552 AUDIO_SOURCE_DEFAULT : adev->active_input->source;
3553
3554 audio_mode_t mode = adev->mode;
3555 audio_devices_t in_device = ((adev->active_input == NULL) ?
3556 AUDIO_DEVICE_NONE : adev->active_input->device)
3557 & ~AUDIO_DEVICE_BIT_IN;
3558 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
3559 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
3560 snd_device_t snd_device = SND_DEVICE_NONE;
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003561 int channel_count = popcount(channel_mask);
Ashish Jainb8d55fd2016-12-29 14:00:24 +05303562 int str_bitwidth = (adev->active_input == NULL) ?
3563 CODEC_BACKEND_DEFAULT_BIT_WIDTH : adev->active_input->bit_width;
Eric Laurentb23d5282013-05-14 15:27:20 -07003564
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303565 ALOGV("%s: enter: out_device(%#x) in_device(%#x) channel_count (%d) channel_mask (0x%x)",
3566 __func__, out_device, in_device, channel_count, channel_mask);
Tanya Finkel00130052014-07-14 04:26:56 -07003567 if (my_data->external_mic) {
kunleiz16dbcc32016-12-13 18:23:04 +08003568 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 +05303569 voice_extn_compress_voip_is_active(adev) || audio_extn_hfp_is_active(adev))) {
Tanya Finkel00130052014-07-14 04:26:56 -07003570 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
3571 out_device & AUDIO_DEVICE_OUT_EARPIECE ||
3572 out_device & AUDIO_DEVICE_OUT_SPEAKER )
3573 snd_device = SND_DEVICE_IN_HANDSET_MIC_EXTERNAL;
3574 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
3575 in_device & AUDIO_DEVICE_IN_BACK_MIC) {
3576 snd_device = SND_DEVICE_IN_HANDSET_MIC_EXTERNAL;
3577 }
3578 }
3579
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07003580 if (snd_device != AUDIO_DEVICE_NONE)
Tanya Finkel00130052014-07-14 04:26:56 -07003581 goto exit;
3582
kunleiz16dbcc32016-12-13 18:23:04 +08003583 if ((out_device != AUDIO_DEVICE_NONE) && ((mode == AUDIO_MODE_IN_CALL) || voice_is_in_call(adev) ||
Satya Krishna Pindiproli071950f2014-05-21 14:45:28 +05303584 voice_extn_compress_voip_is_active(adev) || audio_extn_hfp_is_active(adev))) {
Narsinga Rao Chella05573b72013-11-15 15:21:40 -08003585 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
3586 !voice_extn_compress_voip_is_active(adev)) {
Eric Laurentb23d5282013-05-14 15:27:20 -07003587 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003588 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
3589 out_device & AUDIO_DEVICE_OUT_LINE) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07003590 switch (adev->voice.tty_mode) {
Aniket Kumar Lata91886592017-05-25 16:53:32 -07003591 case TTY_MODE_FULL:
3592 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC;
3593 break;
3594 case TTY_MODE_VCO:
3595 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
3596 break;
3597 case TTY_MODE_HCO:
3598 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC;
3599 break;
3600 default:
3601 ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->voice.tty_mode);
3602 }
3603 goto exit;
3604 } else if (out_device & AUDIO_DEVICE_OUT_USB_DEVICE) {
3605 switch (adev->voice.tty_mode) {
3606 case TTY_MODE_FULL:
3607 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC;
3608 break;
3609 case TTY_MODE_VCO:
3610 // since voice will be captured from handset mic, use existing device
3611 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
3612 break;
3613 case TTY_MODE_HCO:
3614 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC;
3615 break;
3616 default:
3617 ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->voice.tty_mode);
Eric Laurentb23d5282013-05-14 15:27:20 -07003618 }
3619 goto exit;
3620 }
3621 }
Narsinga Rao Chella97db8702014-10-03 13:34:45 -07003622 if (out_device & AUDIO_DEVICE_OUT_EARPIECE ||
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003623 out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
3624 out_device & AUDIO_DEVICE_OUT_LINE) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003625 if (out_device & AUDIO_DEVICE_OUT_EARPIECE &&
3626 audio_extn_should_use_handset_anc(channel_count)) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303627 if ((my_data->fluence_type != FLUENCE_NONE) &&
3628 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Shiv Maliyappanahallidd287262016-01-08 15:57:07 -08003629 snd_device = SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC;
3630 adev->acdb_settings |= DMIC_FLAG;
3631 } else {
3632 snd_device = SND_DEVICE_IN_AANC_HANDSET_MIC;
3633 }
Banajit Goswamide0ea452014-04-07 12:11:47 -07003634 adev->acdb_settings |= ANC_FLAG;
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07003635 } else if (my_data->fluence_type == FLUENCE_NONE ||
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05303636 my_data->fluence_in_voice_call == false ||
3637 my_data->fluence_in_hfp_call == false) {
Eric Laurentb23d5282013-05-14 15:27:20 -07003638 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05303639 if (audio_extn_hfp_is_active(adev))
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07003640 platform_set_echo_reference(adev, true, out_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07003641 } else {
Ravi Kumar Alamandaceb40822013-11-06 11:01:47 -08003642 snd_device = SND_DEVICE_IN_VOICE_DMIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07003643 }
3644 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
3645 snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05303646 if (audio_extn_hfp_is_active(adev))
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07003647 platform_set_echo_reference(adev, true, out_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07003648 } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07003649 if (adev->bt_wb_speech_enabled) {
3650 if (adev->bluetooth_nrec)
3651 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
3652 else
3653 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
3654 } else {
3655 if (adev->bluetooth_nrec)
3656 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
3657 else
3658 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
3659 }
Narsinga Rao Chella97db8702014-10-03 13:34:45 -07003660 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Mingming Yin8e5a4f62013-10-07 15:23:41 -07003661 if (my_data->fluence_type != FLUENCE_NONE &&
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05303662 (my_data->fluence_in_voice_call ||
3663 my_data->fluence_in_hfp_call) &&
Mingming Yin8e5a4f62013-10-07 15:23:41 -07003664 my_data->fluence_in_spkr_mode) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303665 if((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
3666 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Mingming Yin8e5a4f62013-10-07 15:23:41 -07003667 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_QMIC;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08003668 } else {
Narsinga Rao Chella61e0f9b2014-03-06 21:25:22 -08003669 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
3670 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE;
3671 else
3672 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07003673 }
Eric Laurentb23d5282013-05-14 15:27:20 -07003674 } else {
3675 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05303676 if (audio_extn_hfp_is_active(adev))
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07003677 platform_set_echo_reference(adev, true, out_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07003678 }
Ravi Kumar Alamanda060bc5a2014-09-05 13:51:35 -07003679 } else if (out_device & AUDIO_DEVICE_OUT_TELEPHONY_TX)
3680 snd_device = SND_DEVICE_IN_VOICE_RX;
Eric Laurentb23d5282013-05-14 15:27:20 -07003681 } else if (source == AUDIO_SOURCE_CAMCORDER) {
3682 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
3683 in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05303684
3685 if (str_bitwidth == 16) {
3686 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
3687 (my_data->source_mic_type & SOURCE_DUAL_MIC) &&
3688 (channel_count == 2))
3689 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
3690 else
3691 snd_device = SND_DEVICE_IN_CAMCORDER_MIC;
3692 }
3693 /*
3694 * for other bit widths
3695 */
3696 else {
3697 if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
3698 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
3699 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
3700 snd_device = SND_DEVICE_IN_UNPROCESSED_STEREO_MIC;
3701 }
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05303702 else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_3) &&
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05303703 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
3704 snd_device = SND_DEVICE_IN_UNPROCESSED_THREE_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05303705 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_4) &&
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05303706 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
3707 snd_device = SND_DEVICE_IN_UNPROCESSED_QUAD_MIC;
3708 } else {
3709 snd_device = SND_DEVICE_IN_UNPROCESSED_MIC;
3710 }
3711 }
3712 }
3713 } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) {
Eric Laurentb23d5282013-05-14 15:27:20 -07003714 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303715 if (my_data->fluence_in_voice_rec && channel_count == 1) {
3716 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
3717 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Ben Romberger182c8252016-07-18 16:54:54 -07003718 snd_device = SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303719 } else if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
3720 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
Ben Rombergera4d76db2016-10-13 15:26:02 -07003721 snd_device = SND_DEVICE_IN_VOICE_REC_TMIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303722 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
3723 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Vidyakumar Athota78b70c02015-06-29 17:19:45 -07003724 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
3725 }
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303726 platform_set_echo_reference(adev, true, out_device);
3727 } else if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
3728 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
3729 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
3730 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_STEREO;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05303731 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_3) &&
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303732 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
3733 snd_device = SND_DEVICE_IN_THREE_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05303734 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_4) &&
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303735 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
3736 snd_device = SND_DEVICE_IN_QUAD_MIC;
3737 }
3738 if (snd_device == SND_DEVICE_NONE) {
3739 if (adev->active_input->enable_ns)
3740 snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS;
3741 else
3742 snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003743 }
Eric Laurentb23d5282013-05-14 15:27:20 -07003744 }
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05303745 } else if (source == AUDIO_SOURCE_UNPROCESSED) {
3746 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
3747 if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
3748 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
3749 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
3750 snd_device = SND_DEVICE_IN_UNPROCESSED_STEREO_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05303751 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_3) &&
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05303752 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
3753 snd_device = SND_DEVICE_IN_UNPROCESSED_THREE_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05303754 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_4) &&
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05303755 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
3756 snd_device = SND_DEVICE_IN_UNPROCESSED_QUAD_MIC;
3757 } else {
3758 snd_device = SND_DEVICE_IN_UNPROCESSED_MIC;
3759 }
3760 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05303761 snd_device = SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC;
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05303762 }
Eric Laurentb23d5282013-05-14 15:27:20 -07003763 } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
3764 if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
3765 in_device = AUDIO_DEVICE_IN_BACK_MIC;
3766 if (adev->active_input) {
Ben Romberger6ed1e632016-11-14 16:16:30 -08003767 if (my_data->fluence_type != FLUENCE_NONE &&
3768 adev->active_input->enable_aec &&
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003769 adev->active_input->enable_ns) {
Eric Laurentb23d5282013-05-14 15:27:20 -07003770 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003771 if (my_data->fluence_in_spkr_mode) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303772 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
3773 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003774 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303775 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
3776 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003777 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
3778 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE;
3779 else
3780 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
3781 }
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003782 } else
3783 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
Eric Laurentb23d5282013-05-14 15:27:20 -07003784 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303785 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
3786 (my_data->source_mic_type & SOURCE_DUAL_MIC))
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003787 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303788 else
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003789 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
Eric Laurentb23d5282013-05-14 15:27:20 -07003790 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003791 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
Eric Laurentb23d5282013-05-14 15:27:20 -07003792 }
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07003793 platform_set_echo_reference(adev, true, out_device);
Ben Romberger6ed1e632016-11-14 16:16:30 -08003794 } else if (my_data->fluence_type != FLUENCE_NONE &&
3795 adev->active_input->enable_aec) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003796 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003797 if (my_data->fluence_in_spkr_mode) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303798 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
3799 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003800 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_AEC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303801 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
3802 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003803 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
3804 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE;
3805 else
3806 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
3807 }
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003808 } else
3809 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
3810 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303811 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
3812 (my_data->source_mic_type & SOURCE_DUAL_MIC))
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003813 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303814 else
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003815 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC;
3816 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
3817 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
3818 }
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07003819 platform_set_echo_reference(adev, true, out_device);
Ben Romberger6ed1e632016-11-14 16:16:30 -08003820 } else if (my_data->fluence_type != FLUENCE_NONE &&
3821 adev->active_input->enable_ns) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003822 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003823 if (my_data->fluence_in_spkr_mode) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303824 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
3825 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003826 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_NS;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303827 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
3828 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003829 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
3830 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE;
3831 else
3832 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
3833 }
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003834 } else
3835 snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS;
3836 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303837 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
3838 (my_data->source_mic_type & SOURCE_DUAL_MIC))
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003839 snd_device = SND_DEVICE_IN_HANDSET_DMIC_NS;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303840 else
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08003841 snd_device = SND_DEVICE_IN_HANDSET_MIC_NS;
3842 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
3843 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
3844 }
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07003845 platform_set_echo_reference(adev, false, out_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07003846 } else
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07003847 platform_set_echo_reference(adev, false, out_device);
Eric Laurentb23d5282013-05-14 15:27:20 -07003848 }
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08003849 } else if (source == AUDIO_SOURCE_MIC) {
Apoorv Raghuvanshic0536542013-11-14 16:25:59 -08003850 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC &&
3851 channel_count == 1 ) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003852 if(my_data->fluence_in_audio_rec) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303853 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
3854 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003855 snd_device = SND_DEVICE_IN_HANDSET_QMIC;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07003856 platform_set_echo_reference(adev, true, out_device);
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303857 } else if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
3858 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
3859 snd_device = SND_DEVICE_IN_HANDSET_TMIC;
3860 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
3861 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003862 snd_device = SND_DEVICE_IN_HANDSET_DMIC;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07003863 platform_set_echo_reference(adev, true, out_device);
Narsinga Rao Chella975572e2014-10-21 11:49:00 -07003864 }
Ravi Kumar Alamanda7076b162014-03-07 11:40:24 -08003865 }
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08003866 }
Mingming Yin12125e82015-10-26 20:40:36 -07003867 } else if (source == AUDIO_SOURCE_FM_TUNER) {
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07003868 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07003869 } else if (source == AUDIO_SOURCE_DEFAULT) {
3870 goto exit;
3871 }
3872
Shiv Maliyappanahalli5a10aea2015-07-02 10:36:23 -07003873 if (adev->active_input && (audio_extn_ssr_get_stream() == adev->active_input))
3874 snd_device = SND_DEVICE_IN_THREE_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07003875
3876 if (snd_device != SND_DEVICE_NONE) {
3877 goto exit;
3878 }
3879
3880 if (in_device != AUDIO_DEVICE_NONE &&
3881 !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) &&
3882 !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) {
3883 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Shiv Maliyappanahalli5a10aea2015-07-02 10:36:23 -07003884 if (adev->active_input && (audio_extn_ssr_get_stream() == adev->active_input))
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07003885 snd_device = SND_DEVICE_IN_QUAD_MIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303886 else if ((my_data->fluence_type & (FLUENCE_DUAL_MIC | FLUENCE_QUAD_MIC)) &&
3887 (channel_count == 2) && (my_data->source_mic_type & SOURCE_DUAL_MIC))
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07003888 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07003889 else
3890 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07003891 } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
3892 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
3893 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
3894 snd_device = SND_DEVICE_IN_HEADSET_MIC;
3895 } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07003896 if (adev->bt_wb_speech_enabled) {
3897 if (adev->bluetooth_nrec)
3898 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
3899 else
3900 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
3901 } else {
3902 if (adev->bluetooth_nrec)
3903 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
3904 else
3905 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
3906 }
Eric Laurentb23d5282013-05-14 15:27:20 -07003907 } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
3908 snd_device = SND_DEVICE_IN_HDMI_MIC;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07003909 } else if (in_device & AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET ||
3910 in_device & AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET) {
3911 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Mingming Yin12125e82015-10-26 20:40:36 -07003912 } else if (in_device & AUDIO_DEVICE_IN_FM_TUNER) {
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -07003913 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003914 } else if (in_device & AUDIO_DEVICE_IN_USB_DEVICE ) {
3915 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07003916 } else {
3917 ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
3918 ALOGW("%s: Using default handset-mic", __func__);
3919 snd_device = SND_DEVICE_IN_HANDSET_MIC;
3920 }
3921 } else {
3922 if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
3923 snd_device = SND_DEVICE_IN_HANDSET_MIC;
3924 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
3925 snd_device = SND_DEVICE_IN_HEADSET_MIC;
Narsinga Rao Chella97db8702014-10-03 13:34:45 -07003926 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303927 if ((my_data->source_mic_type & SOURCE_DUAL_MIC) &&
3928 (channel_count == 2)) {
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07003929 snd_device = SND_DEVICE_IN_SPEAKER_STEREO_DMIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303930 } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) &&
3931 (channel_count == 1)) {
3932 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
3933 } else {
3934 ALOGE("%s: something wrong: source type (%d) channel_count (%d) .."
3935 " no combination found .. setting to mono", __func__,
3936 my_data->source_mic_type, channel_count);
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07003937 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05303938 }
Ravi Kumar Alamanda52de13c2015-10-17 22:21:52 -07003939 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
3940 out_device & AUDIO_DEVICE_OUT_LINE) {
Narsinga Rao Chella97db8702014-10-03 13:34:45 -07003941 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07003942 } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07003943 if (adev->bt_wb_speech_enabled) {
3944 if (adev->bluetooth_nrec)
3945 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
3946 else
3947 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
3948 } else {
3949 if (adev->bluetooth_nrec)
3950 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
3951 else
3952 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
3953 }
Eric Laurentb23d5282013-05-14 15:27:20 -07003954 } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
3955 snd_device = SND_DEVICE_IN_HDMI_MIC;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07003956 } else if (out_device & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
3957 out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
3958 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003959 } else if (out_device & AUDIO_DEVICE_OUT_USB_DEVICE) {
Ashish Jain3e37a702016-11-25 12:27:15 +05303960 if (audio_extn_usb_is_capture_supported())
3961 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
3962 else
3963 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07003964 } else {
3965 ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
3966 ALOGW("%s: Using default handset-mic", __func__);
3967 snd_device = SND_DEVICE_IN_HANDSET_MIC;
3968 }
3969 }
3970exit:
3971 ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
3972 return snd_device;
3973}
3974
3975int platform_set_hdmi_channels(void *platform, int channel_count)
3976{
3977 struct platform_data *my_data = (struct platform_data *)platform;
3978 struct audio_device *adev = my_data->adev;
3979 struct mixer_ctl *ctl;
3980 const char *channel_cnt_str = NULL;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003981 char *mixer_ctl_name;
Eric Laurentb23d5282013-05-14 15:27:20 -07003982 switch (channel_count) {
3983 case 8:
3984 channel_cnt_str = "Eight"; break;
3985 case 7:
3986 channel_cnt_str = "Seven"; break;
3987 case 6:
3988 channel_cnt_str = "Six"; break;
3989 case 5:
3990 channel_cnt_str = "Five"; break;
3991 case 4:
3992 channel_cnt_str = "Four"; break;
3993 case 3:
3994 channel_cnt_str = "Three"; break;
3995 default:
3996 channel_cnt_str = "Two"; break;
3997 }
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003998
3999 switch(my_data->ext_disp_type) {
4000 case EXT_DISPLAY_TYPE_HDMI:
4001 mixer_ctl_name = "HDMI_RX Channels";
4002 break;
4003 case EXT_DISPLAY_TYPE_DP:
4004 mixer_ctl_name = "Display Port RX Channels";
4005 break;
4006 default:
4007 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
4008 return -EINVAL;
4009 }
4010
Eric Laurentb23d5282013-05-14 15:27:20 -07004011 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4012 if (!ctl) {
4013 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4014 __func__, mixer_ctl_name);
4015 return -EINVAL;
4016 }
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07004017 ALOGV("Ext disp channel count: %s", channel_cnt_str);
Eric Laurentb23d5282013-05-14 15:27:20 -07004018 mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
4019 return 0;
4020}
4021
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07004022int platform_edid_get_max_channels(void *platform)
Eric Laurentb23d5282013-05-14 15:27:20 -07004023{
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07004024 int channel_count;
4025 int max_channels = 2;
4026 int i = 0, ret = 0;
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07004027 struct platform_data *my_data = (struct platform_data *)platform;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07004028 edid_audio_info *info = NULL;
4029 ret = platform_get_edid_info(platform);
4030 info = (edid_audio_info *)my_data->edid_info;
Eric Laurentb23d5282013-05-14 15:27:20 -07004031
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07004032 if(ret == 0 && info != NULL) {
4033 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
4034 ALOGV("%s:format %d channel %d", __func__,
4035 info->audio_blocks_array[i].format_id,
4036 info->audio_blocks_array[i].channels);
4037 if (info->audio_blocks_array[i].format_id == LPCM) {
4038 channel_count = info->audio_blocks_array[i].channels;
4039 if (channel_count > max_channels) {
4040 max_channels = channel_count;
4041 }
4042 }
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07004043 }
Eric Laurentb23d5282013-05-14 15:27:20 -07004044 }
Eric Laurentb23d5282013-05-14 15:27:20 -07004045 return max_channels;
4046}
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004047
4048static int platform_set_slowtalk(struct platform_data *my_data, bool state)
4049{
4050 int ret = 0;
4051 struct audio_device *adev = my_data->adev;
4052 struct mixer_ctl *ctl;
4053 const char *mixer_ctl_name = "Slowtalk Enable";
4054 uint32_t set_values[ ] = {0,
4055 ALL_SESSION_VSID};
4056
4057 set_values[0] = state;
4058 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4059 if (!ctl) {
4060 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4061 __func__, mixer_ctl_name);
4062 ret = -EINVAL;
4063 } else {
4064 ALOGV("Setting slowtalk state: %d", state);
4065 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
4066 my_data->slowtalk = state;
4067 }
4068
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08004069 if (my_data->csd != NULL) {
4070 ret = my_data->csd->slow_talk(ALL_SESSION_VSID, state);
4071 if (ret < 0) {
4072 ALOGE("%s: csd_client_disable_device, failed, error %d",
4073 __func__, ret);
4074 }
4075 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004076 return ret;
4077}
4078
Avinash Vaishd5fa4572014-09-15 14:41:14 +05304079static int set_hd_voice(struct platform_data *my_data, bool state)
4080{
4081 struct audio_device *adev = my_data->adev;
4082 struct mixer_ctl *ctl;
4083 char *mixer_ctl_name = "HD Voice Enable";
4084 int ret = 0;
4085 uint32_t set_values[ ] = {0,
4086 ALL_SESSION_VSID};
4087
4088 set_values[0] = state;
4089 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4090 if (!ctl) {
4091 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4092 __func__, mixer_ctl_name);
4093 return -EINVAL;
4094 } else {
4095 ALOGV("Setting HD Voice state: %d", state);
4096 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
4097 my_data->hd_voice = state;
4098 }
4099
4100 return ret;
4101}
Tanya Finkel00130052014-07-14 04:26:56 -07004102
4103static int update_external_device_status(struct platform_data *my_data,
4104 char* event_name, bool status)
4105{
4106 int ret = 0;
4107 struct audio_usecase *usecase;
4108 struct listnode *node;
4109
4110 ALOGD("Recieved external event switch %s", event_name);
4111
4112 if (!strcmp(event_name, EVENT_EXTERNAL_SPK_1))
4113 my_data->external_spk_1 = status;
4114 else if (!strcmp(event_name, EVENT_EXTERNAL_SPK_2))
4115 my_data->external_spk_2 = status;
4116 else if (!strcmp(event_name, EVENT_EXTERNAL_MIC))
4117 my_data->external_mic = status;
4118 else {
4119 ALOGE("The audio event type is not found");
4120 return -EINVAL;
4121 }
4122
4123 list_for_each(node, &my_data->adev->usecase_list) {
4124 usecase = node_to_item(node, struct audio_usecase, list);
4125 select_devices(my_data->adev, usecase->id);
4126 }
4127
4128 return ret;
4129}
4130
Ben Rombergera04fabc2014-11-14 12:16:03 -08004131static int parse_audiocal_cfg(struct str_parms *parms, acdb_audio_cal_cfg_t *cal)
4132{
4133 int err;
Ben Rombergera04fabc2014-11-14 12:16:03 -08004134 char value[64];
4135 int ret = 0;
4136
4137 if(parms == NULL || cal == NULL)
4138 return ret;
4139
4140 err = str_parms_get_str(parms, "cal_persist", value, sizeof(value));
4141 if (err >= 0) {
4142 str_parms_del(parms, "cal_persist");
4143 cal->persist = (uint32_t) strtoul(value, NULL, 0);
4144 ret = ret | 0x1;
4145 }
4146 err = str_parms_get_str(parms, "cal_apptype", value, sizeof(value));
4147 if (err >= 0) {
4148 str_parms_del(parms, "cal_apptype");
4149 cal->app_type = (uint32_t) strtoul(value, NULL, 0);
4150 ret = ret | 0x2;
4151 }
4152 err = str_parms_get_str(parms, "cal_caltype", value, sizeof(value));
4153 if (err >= 0) {
4154 str_parms_del(parms, "cal_caltype");
4155 cal->cal_type = (uint32_t) strtoul(value, NULL, 0);
4156 ret = ret | 0x4;
4157 }
4158 err = str_parms_get_str(parms, "cal_samplerate", value, sizeof(value));
4159 if (err >= 0) {
4160 str_parms_del(parms, "cal_samplerate");
4161 cal->sampling_rate = (uint32_t) strtoul(value, NULL, 0);
4162 ret = ret | 0x8;
4163 }
4164 err = str_parms_get_str(parms, "cal_devid", value, sizeof(value));
4165 if (err >= 0) {
4166 str_parms_del(parms, "cal_devid");
4167 cal->dev_id = (uint32_t) strtoul(value, NULL, 0);
4168 ret = ret | 0x10;
4169 }
4170 err = str_parms_get_str(parms, "cal_snddevid", value, sizeof(value));
4171 if (err >= 0) {
4172 str_parms_del(parms, "cal_snddevid");
4173 cal->snd_dev_id = (uint32_t) strtoul(value, NULL, 0);
4174 ret = ret | 0x20;
4175 }
4176 err = str_parms_get_str(parms, "cal_topoid", value, sizeof(value));
4177 if (err >= 0) {
4178 str_parms_del(parms, "cal_topoid");
4179 cal->topo_id = (uint32_t) strtoul(value, NULL, 0);
4180 ret = ret | 0x40;
4181 }
4182 err = str_parms_get_str(parms, "cal_moduleid", value, sizeof(value));
4183 if (err >= 0) {
4184 str_parms_del(parms, "cal_moduleid");
4185 cal->module_id = (uint32_t) strtoul(value, NULL, 0);
4186 ret = ret | 0x80;
4187 }
4188 err = str_parms_get_str(parms, "cal_paramid", value, sizeof(value));
4189 if (err >= 0) {
4190 str_parms_del(parms, "cal_paramid");
4191 cal->param_id = (uint32_t) strtoul(value, NULL, 0);
4192 ret = ret | 0x100;
4193 }
4194 return ret;
4195}
4196
4197static void set_audiocal(void *platform, struct str_parms *parms, char *value, int len) {
4198 struct platform_data *my_data = (struct platform_data *)platform;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08004199 struct stream_out out;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05304200 acdb_audio_cal_cfg_t cal;
Ben Rombergera04fabc2014-11-14 12:16:03 -08004201 uint8_t *dptr = NULL;
4202 int32_t dlen;
4203 int err, ret;
4204 if(value == NULL || platform == NULL || parms == NULL) {
4205 ALOGE("[%s] received null pointer, failed",__func__);
4206 goto done_key_audcal;
4207 }
4208
4209 /* parse audio calibration keys */
4210 ret = parse_audiocal_cfg(parms, &cal);
4211
4212 /* handle audio calibration data now */
4213 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_AUD_CALDATA, value, len);
4214 if (err >= 0) {
4215 str_parms_del(parms, AUDIO_PARAMETER_KEY_AUD_CALDATA);
4216 dlen = strlen(value);
4217 if(dlen <= 0) {
4218 ALOGE("[%s] null data received",__func__);
4219 goto done_key_audcal;
4220 }
4221 dptr = (uint8_t*) calloc(dlen, sizeof(uint8_t));
4222 if(dptr == NULL) {
4223 ALOGE("[%s] memory allocation failed for %d",__func__, dlen);
4224 goto done_key_audcal;
4225 }
4226 dlen = b64decode(value, strlen(value), dptr);
4227 if(dlen<=0) {
4228 ALOGE("[%s] data decoding failed %d", __func__, dlen);
4229 goto done_key_audcal;
4230 }
4231
4232 if(cal.dev_id) {
4233 if(audio_is_input_device(cal.dev_id)) {
4234 cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
4235 } else {
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004236 out.devices = cal.dev_id;
Leena Winterrowdd7a04cd2016-01-07 11:50:02 -08004237 out.sample_rate = cal.sampling_rate;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004238 cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
Ben Rombergera04fabc2014-11-14 12:16:03 -08004239 }
4240 }
4241 cal.acdb_dev_id = platform_get_snd_device_acdb_id(cal.snd_dev_id);
4242 ALOGD("Setting audio calibration for snd_device(%d) acdb_id(%d)",
4243 cal.snd_dev_id, cal.acdb_dev_id);
4244 if(cal.acdb_dev_id == -EINVAL) {
4245 ALOGE("[%s] Invalid acdb_device id %d for snd device id %d",
4246 __func__, cal.acdb_dev_id, cal.snd_dev_id);
4247 goto done_key_audcal;
4248 }
4249 if(my_data->acdb_set_audio_cal) {
4250 ret = my_data->acdb_set_audio_cal((void *)&cal, (void*)dptr, dlen);
4251 }
4252 }
4253done_key_audcal:
4254 if(dptr != NULL)
4255 free(dptr);
4256}
4257
Ashish Jainf1eaa582016-05-23 20:54:24 +05304258static void true_32_bit_set_params(struct str_parms *parms,
4259 char *value, int len)
4260{
4261 int ret = 0;
4262
4263 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_TRUE_32_BIT,
4264 value,len);
4265 if (ret >= 0) {
4266 if (value && !strncmp(value, "true", sizeof("src")))
4267 supports_true_32_bit = true;
4268 else
4269 supports_true_32_bit = false;
4270 str_parms_del(parms, AUDIO_PARAMETER_KEY_TRUE_32_BIT);
4271 }
4272
4273}
4274
4275bool platform_supports_true_32bit()
4276{
4277 return supports_true_32_bit;
4278}
4279
Sudheer Papothifa9d2282015-09-17 01:53:25 +05304280static void perf_lock_set_params(struct platform_data *platform,
4281 struct str_parms *parms,
4282 char *value, int len)
4283{
4284 int err = 0, i = 0, num_opts = 0;
4285 char *test_r = NULL;
4286 char *opts = NULL;
4287 char *opts_size = NULL;
4288
4289 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_PERF_LOCK_OPTS,
4290 value, len);
4291 if (err >= 0) {
4292 opts_size = strtok_r(value, ", ", &test_r);
4293 if (opts_size == NULL) {
4294 ALOGE("%s: incorrect perf lock opts\n", __func__);
4295 return;
4296 }
4297 num_opts = atoi(opts_size);
4298 if (num_opts > 0) {
4299 if (num_opts > MAX_PERF_LOCK_OPTS) {
4300 ALOGD("%s: num_opts %d exceeds max %d, setting to max\n",
4301 __func__, num_opts, MAX_PERF_LOCK_OPTS);
4302 num_opts = MAX_PERF_LOCK_OPTS;
4303 }
4304 for (i = 0; i < num_opts; i++) {
4305 opts = strtok_r(NULL, ", ", &test_r);
4306 if (opts == NULL) {
4307 ALOGE("%s: incorrect perf lock opts\n", __func__);
4308 break;
4309 }
4310 platform->adev->perf_lock_opts[i] = strtoul(opts, NULL, 16);
4311 }
4312 platform->adev->perf_lock_opts_size = i;
4313 }
4314 str_parms_del(parms, AUDIO_PARAMETER_KEY_PERF_LOCK_OPTS);
4315 }
4316}
4317
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004318int platform_set_parameters(void *platform, struct str_parms *parms)
4319{
4320 struct platform_data *my_data = (struct platform_data *)platform;
Satya Krishna Pindiprolic6b0a742017-02-03 14:37:18 +05304321 struct audio_device *adev = my_data->adev;
Ben Rombergera04fabc2014-11-14 12:16:03 -08004322 char *value=NULL;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05304323 int len;
Shiv Maliyappanahalli3e064fd2013-12-16 15:54:40 -08004324 int ret = 0, err;
Krishnankutty Kolathappilly061a9492014-01-31 18:12:13 -08004325 char *kv_pairs = str_parms_to_str(parms);
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05304326 struct listnode *node;
4327 struct meta_key_list *key_info;
4328 int key = 0;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004329
Mingming Yin7b762e72015-03-04 13:47:32 -08004330 if(kv_pairs == NULL) {
4331 ret = -ENOMEM;
4332 ALOGE("[%s] key-value pair is NULL",__func__);
4333 goto done;
4334 }
4335
Krishnankutty Kolathappilly061a9492014-01-31 18:12:13 -08004336 ALOGV_IF(kv_pairs != NULL, "%s: enter: %s", __func__, kv_pairs);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004337
Ben Rombergera04fabc2014-11-14 12:16:03 -08004338 len = strlen(kv_pairs);
4339 value = (char*)calloc(len, sizeof(char));
4340 if(value == NULL) {
4341 ret = -ENOMEM;
4342 ALOGE("[%s] failed to allocate memory",__func__);
4343 goto done;
4344 }
4345 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_SLOWTALK, value, len);
Shiv Maliyappanahalli3e064fd2013-12-16 15:54:40 -08004346 if (err >= 0) {
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08004347 bool state = false;
4348 if (!strncmp("true", value, sizeof("true"))) {
4349 state = true;
4350 }
4351
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004352 str_parms_del(parms, AUDIO_PARAMETER_KEY_SLOWTALK);
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08004353 ret = platform_set_slowtalk(my_data, state);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004354 if (ret)
4355 ALOGE("%s: Failed to set slow talk err: %d", __func__, ret);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004356 }
4357
Ben Rombergera04fabc2014-11-14 12:16:03 -08004358 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_HD_VOICE, value, len);
Avinash Vaishd5fa4572014-09-15 14:41:14 +05304359 if (err >= 0) {
4360 bool state = false;
4361 if (!strncmp("true", value, sizeof("true"))) {
4362 state = true;
4363 }
4364
4365 str_parms_del(parms, AUDIO_PARAMETER_KEY_HD_VOICE);
4366 if (my_data->hd_voice != state) {
4367 ret = set_hd_voice(my_data, state);
4368 if (ret)
4369 ALOGE("%s: Failed to set HD voice err: %d", __func__, ret);
4370 } else {
4371 ALOGV("%s: HD Voice already set to %d", __func__, state);
4372 }
4373 }
4374
Shiv Maliyappanahalli3e064fd2013-12-16 15:54:40 -08004375 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_VOLUME_BOOST,
Ben Rombergera04fabc2014-11-14 12:16:03 -08004376 value, len);
Shiv Maliyappanahalli3e064fd2013-12-16 15:54:40 -08004377 if (err >= 0) {
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08004378 str_parms_del(parms, AUDIO_PARAMETER_KEY_VOLUME_BOOST);
4379
4380 if (my_data->acdb_reload_vocvoltable == NULL) {
4381 ALOGE("%s: acdb_reload_vocvoltable is NULL", __func__);
4382 } else if (!strcmp(value, "on")) {
4383 if (!my_data->acdb_reload_vocvoltable(VOICE_FEATURE_SET_VOLUME_BOOST)) {
4384 my_data->voice_feature_set = 1;
4385 }
4386 } else {
4387 if (!my_data->acdb_reload_vocvoltable(VOICE_FEATURE_SET_DEFAULT)) {
4388 my_data->voice_feature_set = 0;
4389 }
4390 }
4391 }
4392
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05304393 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB,
4394 value, len);
4395 if (err >= 0) {
4396 str_parms_del(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB);
4397
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05304398 if (my_data->acdb_reload_v2) {
4399 my_data->acdb_reload_v2(value, my_data->snd_card_name,
4400 my_data->cvd_version, &my_data->acdb_meta_key_list);
4401 } else if (my_data->acdb_reload) {
4402 node = list_head(&my_data->acdb_meta_key_list);
4403 key_info = node_to_item(node, struct meta_key_list, list);
4404 key = key_info->cal_info.nKey;
4405 my_data->acdb_reload(value, my_data->snd_card_name,
4406 my_data->cvd_version, key);
4407 }
Karthik Reddy Kattaeda85aa2016-05-25 12:42:39 +05304408 }
4409
Rohit kumard3c3b912016-11-15 18:50:31 +05304410 if (hw_info_is_stereo_spkr(my_data->hw_info)) {
4411 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER, value, len);
4412 if (err >= 0) {
4413 if (!strncmp("left", value, sizeof("left")))
4414 my_data->mono_speaker = SPKR_1;
4415 else if (!strncmp("right", value, sizeof("right")))
4416 my_data->mono_speaker = SPKR_2;
Rohit kumarf4120402016-08-05 19:19:48 +05304417
Rohit kumard3c3b912016-11-15 18:50:31 +05304418 str_parms_del(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER);
4419 }
Rohit kumarf4120402016-08-05 19:19:48 +05304420 }
Tanya Finkel00130052014-07-14 04:26:56 -07004421 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE,
Ben Rombergera04fabc2014-11-14 12:16:03 -08004422 value, len);
Tanya Finkel00130052014-07-14 04:26:56 -07004423 if (err >= 0) {
4424 char *event_name, *status_str;
4425 bool status = false;
4426 str_parms_del(parms, AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE);
4427 event_name = strtok_r(value, ",", &status_str);
Apoorv Raghuvanshi8880cac2015-02-06 15:33:49 -08004428 if (!event_name) {
4429 ret = -EINVAL;
4430 ALOGE("%s: event_name is NULL", __func__);
4431 goto done;
4432 }
Tanya Finkel00130052014-07-14 04:26:56 -07004433 ALOGV("%s: recieved update of external audio device %s %s",
4434 __func__,
4435 event_name, status_str);
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07004436 if (!strncmp(status_str, "ON", sizeof("ON")))
Tanya Finkel00130052014-07-14 04:26:56 -07004437 status = true;
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07004438 else if (!strncmp(status_str, "OFF", sizeof("OFF")))
Tanya Finkel00130052014-07-14 04:26:56 -07004439 status = false;
4440 update_external_device_status(my_data, event_name, status);
4441 }
4442
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304443 err = str_parms_get_str(parms, PLATFORM_MAX_MIC_COUNT,
4444 value, sizeof(value));
4445 if (err >= 0) {
4446 str_parms_del(parms, PLATFORM_MAX_MIC_COUNT);
4447 my_data->max_mic_count = atoi(value);
4448 ALOGV("%s: max_mic_count %d", __func__, my_data->max_mic_count);
4449 }
4450
Ben Rombergera04fabc2014-11-14 12:16:03 -08004451 /* handle audio calibration parameters */
4452 set_audiocal(platform, parms, value, len);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08004453 native_audio_set_params(platform, parms, value, len);
Sudheer Papothi991966d2015-07-20 21:54:36 +05304454 audio_extn_spkr_prot_set_parameters(parms, value, len);
Kuirong Wang1cad7142016-05-24 15:21:56 -07004455 audio_extn_usb_set_sidetone_gain(parms, value, len);
Satya Krishna Pindiprolic6b0a742017-02-03 14:37:18 +05304456 audio_extn_hfp_set_parameters(adev, parms);
Sudheer Papothifa9d2282015-09-17 01:53:25 +05304457 perf_lock_set_params(platform, parms, value, len);
Ashish Jainf1eaa582016-05-23 20:54:24 +05304458 true_32_bit_set_params(parms, value, len);
Ben Rombergera04fabc2014-11-14 12:16:03 -08004459done:
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004460 ALOGV("%s: exit with code(%d)", __func__, ret);
Mingming Yin7b762e72015-03-04 13:47:32 -08004461 if(kv_pairs != NULL)
4462 free(kv_pairs);
Ben Rombergera04fabc2014-11-14 12:16:03 -08004463 if(value != NULL)
4464 free(value);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004465 return ret;
4466}
4467
Vidyakumar Athota2850d532013-11-19 16:02:12 -08004468int platform_set_incall_recording_session_id(void *platform,
4469 uint32_t session_id, int rec_mode)
Shiv Maliyappanahallida107642013-10-17 11:16:13 -07004470{
4471 int ret = 0;
4472 struct platform_data *my_data = (struct platform_data *)platform;
4473 struct audio_device *adev = my_data->adev;
4474 struct mixer_ctl *ctl;
4475 const char *mixer_ctl_name = "Voc VSID";
4476 int num_ctl_values;
4477 int i;
4478
4479 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4480 if (!ctl) {
4481 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4482 __func__, mixer_ctl_name);
4483 ret = -EINVAL;
4484 } else {
4485 num_ctl_values = mixer_ctl_get_num_values(ctl);
4486 for (i = 0; i < num_ctl_values; i++) {
4487 if (mixer_ctl_set_value(ctl, i, session_id)) {
4488 ALOGV("Error: invalid session_id: %x", session_id);
4489 ret = -EINVAL;
4490 break;
4491 }
4492 }
4493 }
4494
Vidyakumar Athota2850d532013-11-19 16:02:12 -08004495 if (my_data->csd != NULL) {
4496 ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode);
4497 if (ret < 0) {
4498 ALOGE("%s: csd_client_start_record failed, error %d",
4499 __func__, ret);
4500 }
4501 }
4502
4503 return ret;
4504}
4505
4506int platform_stop_incall_recording_usecase(void *platform)
4507{
4508 int ret = 0;
4509 struct platform_data *my_data = (struct platform_data *)platform;
4510
4511 if (my_data->csd != NULL) {
4512 ret = my_data->csd->stop_record(ALL_SESSION_VSID);
4513 if (ret < 0) {
4514 ALOGE("%s: csd_client_stop_record failed, error %d",
4515 __func__, ret);
4516 }
4517 }
4518
4519 return ret;
4520}
4521
4522int platform_start_incall_music_usecase(void *platform)
4523{
4524 int ret = 0;
4525 struct platform_data *my_data = (struct platform_data *)platform;
4526
4527 if (my_data->csd != NULL) {
4528 ret = my_data->csd->start_playback(ALL_SESSION_VSID);
4529 if (ret < 0) {
4530 ALOGE("%s: csd_client_start_playback failed, error %d",
4531 __func__, ret);
4532 }
4533 }
4534
4535 return ret;
4536}
4537
4538int platform_stop_incall_music_usecase(void *platform)
4539{
4540 int ret = 0;
4541 struct platform_data *my_data = (struct platform_data *)platform;
4542
4543 if (my_data->csd != NULL) {
4544 ret = my_data->csd->stop_playback(ALL_SESSION_VSID);
4545 if (ret < 0) {
4546 ALOGE("%s: csd_client_stop_playback failed, error %d",
4547 __func__, ret);
4548 }
4549 }
4550
Shiv Maliyappanahallida107642013-10-17 11:16:13 -07004551 return ret;
4552}
4553
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -07004554int platform_update_lch(void *platform, struct voice_session *session,
4555 enum voice_lch_mode lch_mode)
4556{
4557 int ret = 0;
4558 struct platform_data *my_data = (struct platform_data *)platform;
4559
4560 if ((my_data->csd != NULL) && (my_data->csd->set_lch != NULL))
4561 ret = my_data->csd->set_lch(session->vsid, lch_mode);
4562 else
4563 ret = pcm_ioctl(session->pcm_tx, SNDRV_VOICE_IOCTL_LCH, &lch_mode);
4564
4565 return ret;
4566}
4567
Ben Rombergera04fabc2014-11-14 12:16:03 -08004568static void get_audiocal(void *platform, void *keys, void *pReply) {
4569 struct platform_data *my_data = (struct platform_data *)platform;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08004570 struct stream_out out;
Ben Rombergera04fabc2014-11-14 12:16:03 -08004571 struct str_parms *query = (struct str_parms *)keys;
4572 struct str_parms *reply=(struct str_parms *)pReply;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05304573 acdb_audio_cal_cfg_t cal;
Ben Rombergera04fabc2014-11-14 12:16:03 -08004574 uint8_t *dptr = NULL;
4575 char value[512] = {0};
4576 char *rparms=NULL;
4577 int ret=0, err;
4578 uint32_t param_len;
4579
4580 if(query==NULL || platform==NULL || reply==NULL) {
4581 ALOGE("[%s] received null pointer",__func__);
4582 ret=-EINVAL;
4583 goto done;
4584 }
4585 /* parse audiocal configuration keys */
4586 ret = parse_audiocal_cfg(query, &cal);
4587 if(ret == 0) {
4588 /* No calibration keys found */
4589 goto done;
4590 }
4591 err = str_parms_get_str(query, AUDIO_PARAMETER_KEY_AUD_CALDATA, value, sizeof(value));
4592 if (err >= 0) {
4593 str_parms_del(query, AUDIO_PARAMETER_KEY_AUD_CALDATA);
4594 } else {
4595 goto done;
4596 }
4597
4598 if(cal.dev_id & AUDIO_DEVICE_BIT_IN) {
4599 cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
4600 } else if(cal.dev_id) {
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004601 out.devices = cal.dev_id;
Leena Winterrowdd7a04cd2016-01-07 11:50:02 -08004602 out.sample_rate = cal.sampling_rate;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004603 cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
Ben Rombergera04fabc2014-11-14 12:16:03 -08004604 }
4605 cal.acdb_dev_id = platform_get_snd_device_acdb_id(cal.snd_dev_id);
4606 if (cal.acdb_dev_id < 0) {
4607 ALOGE("%s: Failed. Could not find acdb id for snd device(%d)",
4608 __func__, cal.snd_dev_id);
4609 ret = -EINVAL;
4610 goto done_key_audcal;
4611 }
4612 ALOGD("[%s] Getting audio calibration for snd_device(%d) acdb_id(%d)",
4613 __func__, cal.snd_dev_id, cal.acdb_dev_id);
4614
4615 param_len = MAX_SET_CAL_BYTE_SIZE;
4616 dptr = (uint8_t*)calloc(param_len, sizeof(uint8_t));
4617 if(dptr == NULL) {
4618 ALOGE("[%s] Memory allocation failed for length %d",__func__,param_len);
4619 ret = -ENOMEM;
4620 goto done_key_audcal;
4621 }
4622 if (my_data->acdb_get_audio_cal != NULL) {
4623 ret = my_data->acdb_get_audio_cal((void*)&cal, (void*)dptr, &param_len);
4624 if (ret == 0) {
Ben Rombergera04fabc2014-11-14 12:16:03 -08004625 if(param_len == 0 || param_len == MAX_SET_CAL_BYTE_SIZE) {
4626 ret = -EINVAL;
4627 goto done_key_audcal;
4628 }
4629 /* Allocate memory for encoding */
4630 rparms = (char*)calloc((param_len*2), sizeof(char));
4631 if(rparms == NULL) {
4632 ALOGE("[%s] Memory allocation failed for size %d",
4633 __func__, param_len*2);
4634 ret = -ENOMEM;
4635 goto done_key_audcal;
4636 }
4637 if(cal.persist==0 && cal.module_id && cal.param_id) {
4638 err = b64encode(dptr+12, param_len-12, rparms);
4639 } else {
4640 err = b64encode(dptr, param_len, rparms);
4641 }
4642 if(err < 0) {
4643 ALOGE("[%s] failed to convert data to string", __func__);
4644 ret = -EINVAL;
4645 goto done_key_audcal;
4646 }
4647 str_parms_add_int(reply, AUDIO_PARAMETER_KEY_AUD_CALRESULT, ret);
4648 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_AUD_CALDATA, rparms);
4649 }
4650 }
4651done_key_audcal:
4652 if(ret != 0) {
4653 str_parms_add_int(reply, AUDIO_PARAMETER_KEY_AUD_CALRESULT, ret);
4654 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_AUD_CALDATA, "");
4655 }
4656done:
4657 if(dptr != NULL)
4658 free(dptr);
4659 if(rparms != NULL)
4660 free(rparms);
4661}
4662
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004663void platform_get_parameters(void *platform,
4664 struct str_parms *query,
4665 struct str_parms *reply)
4666{
4667 struct platform_data *my_data = (struct platform_data *)platform;
Ben Rombergera04fabc2014-11-14 12:16:03 -08004668 char value[512] = {0};
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004669 int ret;
Krishnankutty Kolathappilly061a9492014-01-31 18:12:13 -08004670 char *kv_pairs = NULL;
Sidipotu Ashok42483b62015-09-08 10:21:44 +05304671 char propValue[PROPERTY_VALUE_MAX]={0};
4672 bool prop_playback_enabled = false;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004673
Shiv Maliyappanahalli9d899292013-11-20 14:43:01 -08004674 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_SLOWTALK,
4675 value, sizeof(value));
4676 if (ret >= 0) {
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08004677 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_SLOWTALK,
4678 my_data->slowtalk?"true":"false");
Shiv Maliyappanahalli9d899292013-11-20 14:43:01 -08004679 }
4680
Avinash Vaishd5fa4572014-09-15 14:41:14 +05304681 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_HD_VOICE,
4682 value, sizeof(value));
4683 if (ret >= 0) {
4684 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_HD_VOICE,
4685 my_data->hd_voice?"true":"false");
4686 }
4687
Ben Rombergerc1dc70d2013-12-19 15:11:17 -08004688 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_VOLUME_BOOST,
4689 value, sizeof(value));
4690 if (ret >= 0) {
4691 if (my_data->voice_feature_set == VOICE_FEATURE_SET_VOLUME_BOOST) {
4692 strlcpy(value, "on", sizeof(value));
4693 } else {
4694 strlcpy(value, "off", sizeof(value));
4695 }
4696
4697 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_VOLUME_BOOST, value);
4698 }
4699
Ben Rombergera04fabc2014-11-14 12:16:03 -08004700 /* Handle audio calibration keys */
4701 get_audiocal(platform, query, reply);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08004702 native_audio_get_params(query, reply, value, sizeof(value));
Ben Rombergera04fabc2014-11-14 12:16:03 -08004703
Sidipotu Ashok42483b62015-09-08 10:21:44 +05304704 ret = str_parms_get_str(query, AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED,
4705 value, sizeof(value));
4706 if (ret >= 0) {
4707 int isallowed = 1; /*true*/
4708
4709 if (property_get("voice.playback.conc.disabled", propValue, NULL)) {
4710 prop_playback_enabled = atoi(propValue) ||
4711 !strncmp("true", propValue, 4);
4712 }
4713
Dhanalakshmi Siddania15c6792016-08-10 15:33:53 +05304714 if ((prop_playback_enabled && (voice_is_in_call(my_data->adev))) ||
4715 (SND_CARD_STATE_OFFLINE == get_snd_card_state(my_data->adev))) {
Sidipotu Ashok42483b62015-09-08 10:21:44 +05304716 char *decoder_mime_type = value;
4717
4718 //check if unsupported mime type or not
4719 if(decoder_mime_type) {
Alexy Josephb1379942016-01-29 15:49:38 -08004720 unsigned int i = 0;
Sidipotu Ashok42483b62015-09-08 10:21:44 +05304721 for (i = 0; i < sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]); i++) {
4722 if (!strncmp(decoder_mime_type, dsp_only_decoders_mime[i],
4723 strlen(dsp_only_decoders_mime[i]))) {
4724 ALOGD("Rejecting request for DSP only session from HAL during voice call/SSR state");
4725 isallowed = 0;
4726 break;
4727 }
4728 }
4729 }
4730 }
4731 str_parms_add_int(reply, AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED, isallowed);
4732 }
4733
Krishnankutty Kolathappilly061a9492014-01-31 18:12:13 -08004734 kv_pairs = str_parms_to_str(reply);
4735 ALOGV_IF(kv_pairs != NULL, "%s: exit: returns - %s", __func__, kv_pairs);
Narsinga Rao Chellacde45d12014-02-13 11:44:31 -08004736 free(kv_pairs);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07004737}
4738
Lakshman Chaluvaraju22ba9f12016-09-12 11:42:10 +05304739unsigned char* platform_get_license(void *platform, int *size)
4740{
4741 struct platform_data *my_data = (struct platform_data *)platform;
4742 char value[PROPERTY_VALUE_MAX] = {0};
4743 acdb_audio_cal_cfg_t cal;
4744 unsigned char *dptr = NULL;
4745 int ret=0;
4746 uint32_t param_len;
4747
4748 if (platform == NULL) {
4749 ALOGE("[%s] received null pointer %d ",__func__, __LINE__);
4750 ret = -EINVAL;
4751 goto done;
4752 }
4753 memset(&cal, 0, sizeof(cal));
4754 cal.persist = 1;
4755 cal.cal_type = AUDIO_CORE_METAINFO_CAL_TYPE;
4756 if (!property_get("audio.qaf.acdbid", value , "") && !atoi(value)) {
4757 ALOGE("[%s] audio.qaf.acdbid is not set %d ",__func__, __LINE__);
4758 ret = -EINVAL;
4759 goto done;
4760 }
4761 cal.acdb_dev_id = (uint32_t) atoi (value);
4762 param_len = MAX_SET_CAL_BYTE_SIZE;
4763 dptr = (unsigned char*) calloc(param_len, sizeof(unsigned char*));
4764 if (dptr == NULL) {
4765 ALOGE("[%s] Memory allocation failed for length %d",__func__,param_len);
4766 ret = -ENOMEM;
4767 goto done;
4768 }
4769 if (my_data->acdb_get_audio_cal != NULL) {
4770 ret = my_data->acdb_get_audio_cal((void*)&cal, (void*)dptr, &param_len);
4771 ALOGE("%s, ret[%d], param_len[%d] line %d", __func__, ret, param_len, __LINE__);
4772 if (ret == 0) {
4773 *size = param_len;
4774 return dptr;
4775 } else {
4776 *size = 0;
4777 }
4778 }
4779done:
4780 if (dptr != NULL)
4781 free(dptr);
4782
4783 return NULL;
4784}
4785
4786/* Delay in Us */
Ashish Jain5106d362016-05-11 19:23:33 +05304787/* Delay in Us, only to be used for PCM formats */
Haynes Mathew George7ff216f2013-09-11 19:51:41 -07004788int64_t platform_render_latency(audio_usecase_t usecase)
4789{
4790 switch (usecase) {
4791 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
4792 return DEEP_BUFFER_PLATFORM_DELAY;
4793 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
4794 return LOW_LATENCY_PLATFORM_DELAY;
Ashish Jain5106d362016-05-11 19:23:33 +05304795 case USECASE_AUDIO_PLAYBACK_OFFLOAD:
4796 case USECASE_AUDIO_PLAYBACK_OFFLOAD2:
4797 return PCM_OFFLOAD_PLATFORM_DELAY;
Haynes Mathew George5beddd42016-06-27 18:33:40 -07004798 case USECASE_AUDIO_PLAYBACK_ULL:
4799 return ULL_PLATFORM_DELAY;
Haynes Mathew George7ff216f2013-09-11 19:51:41 -07004800 default:
4801 return 0;
4802 }
4803}
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07004804
Mingming Yine62d7842013-10-25 16:26:03 -07004805int platform_update_usecase_from_source(int source, int usecase)
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07004806{
Mingming Yinab429782013-11-07 11:16:55 -08004807 ALOGV("%s: input source :%d", __func__, source);
Mingming Yin12125e82015-10-26 20:40:36 -07004808 if (source == AUDIO_SOURCE_FM_TUNER)
Mingming Yine62d7842013-10-25 16:26:03 -07004809 usecase = USECASE_AUDIO_RECORD_FM_VIRTUAL;
4810 return usecase;
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07004811}
Kiran Kandide144c82013-11-20 15:58:32 -08004812
Dhananjay Kumar45b71742014-05-29 21:47:27 +05304813bool platform_listen_device_needs_event(snd_device_t snd_device)
Kiran Kandide144c82013-11-20 15:58:32 -08004814{
Dhananjay Kumar45b71742014-05-29 21:47:27 +05304815 bool needs_event = false;
4816
Kiran Kandide144c82013-11-20 15:58:32 -08004817 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
4818 (snd_device < SND_DEVICE_IN_END) &&
4819 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
Rohit kumarf4120402016-08-05 19:19:48 +05304820 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
4821 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
4822 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
Dhananjay Kumar45b71742014-05-29 21:47:27 +05304823 needs_event = true;
4824
4825 return needs_event;
4826}
4827
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07004828bool platform_listen_usecase_needs_event(audio_usecase_t uc_id __unused)
4829{
4830 return false;
4831}
4832
4833bool platform_sound_trigger_device_needs_event(snd_device_t snd_device)
4834{
4835 bool needs_event = false;
4836
4837 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
4838 (snd_device < SND_DEVICE_IN_END) &&
4839 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
Rohit kumarf4120402016-08-05 19:19:48 +05304840 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
4841 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
4842 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07004843 needs_event = true;
4844
4845 return needs_event;
4846}
4847
Quinn Malef15123f2017-04-27 18:58:05 -07004848bool platform_sound_trigger_usecase_needs_event(audio_usecase_t uc_id)
Dhananjay Kumar45b71742014-05-29 21:47:27 +05304849{
Quinn Malef15123f2017-04-27 18:58:05 -07004850 bool needs_event = false;
4851
4852 switch(uc_id){
4853 /* concurrent playback usecases needs event */
4854 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
4855 case USECASE_AUDIO_PLAYBACK_MULTI_CH:
4856 case USECASE_AUDIO_PLAYBACK_OFFLOAD:
4857 case USECASE_AUDIO_PLAYBACK_OFFLOAD2:
4858 needs_event = true;
4859 break;
4860 /* concurrent playback in low latency allowed */
4861 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
4862 break;
4863 /* concurrent playback FM needs event */
4864 case USECASE_AUDIO_PLAYBACK_FM:
4865 needs_event = true;
4866 break;
4867
4868 /* concurrent capture usecases, no event, capture handled by device
4869 * USECASE_AUDIO_RECORD:
4870 * USECASE_AUDIO_RECORD_COMPRESS:
4871 * USECASE_AUDIO_RECORD_LOW_LATENCY:
4872
4873 * USECASE_VOICE_CALL:
4874 * USECASE_VOICE2_CALL:
4875 * USECASE_VOLTE_CALL:
4876 * USECASE_QCHAT_CALL:
4877 * USECASE_VOWLAN_CALL:
4878 * USECASE_VOICEMMODE1_CALL:
4879 * USECASE_VOICEMMODE2_CALL:
4880 * USECASE_COMPRESS_VOIP_CALL:
4881 * USECASE_AUDIO_RECORD_FM_VIRTUAL:
4882 * USECASE_INCALL_REC_UPLINK:
4883 * USECASE_INCALL_REC_DOWNLINK:
4884 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK:
4885 * USECASE_INCALL_REC_UPLINK_COMPRESS:
4886 * USECASE_INCALL_REC_DOWNLINK_COMPRESS:
4887 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS:
4888 * USECASE_INCALL_MUSIC_UPLINK:
4889 * USECASE_INCALL_MUSIC_UPLINK2:
4890 * USECASE_AUDIO_SPKR_CALIB_RX:
4891 * USECASE_AUDIO_SPKR_CALIB_TX:
4892 */
4893 default:
4894 ALOGV("%s:usecase_id[%d] no need to raise event.", __func__, uc_id);
4895 }
4896 return needs_event;
Kiran Kandide144c82013-11-20 15:58:32 -08004897}
ApurupaPattapuc6a3a9e2014-01-10 14:46:02 -08004898
4899/* Read offload buffer size from a property.
4900 * If value is not power of 2 round it to
4901 * power of 2.
4902 */
4903uint32_t platform_get_compress_offload_buffer_size(audio_offload_info_t* info)
4904{
4905 char value[PROPERTY_VALUE_MAX] = {0};
4906 uint32_t fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE;
4907 if((property_get("audio.offload.buffer.size.kb", value, "")) &&
4908 atoi(value)) {
4909 fragment_size = atoi(value) * 1024;
4910 }
4911
vivek mehta80a44292015-08-10 12:58:10 -07004912 /* Use incoming offload buffer size if default buffer size is less */
4913 if ((info != NULL) && (fragment_size < info->offload_buffer_size)) {
4914 ALOGI("%s:: Overwriting offload buffer size default:%d new:%d", __func__,
4915 fragment_size,
4916 info->offload_buffer_size);
4917 fragment_size = info->offload_buffer_size;
4918 }
4919
Preetam Singh Ranawatf5fbdd62016-09-29 18:38:31 +05304920 if (info != NULL && !info->has_video) {
4921 if (info->is_streaming) {
4922 fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING;
4923 ALOGV("%s: offload fragment size reduced for AV streaming to %d",
4924 __func__, fragment_size);
4925 } else if (info->format == AUDIO_FORMAT_FLAC) {
4926 fragment_size = FLAC_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
4927 ALOGV("FLAC fragment size %d", fragment_size);
4928 } else if (info->format == AUDIO_FORMAT_DSD) {
4929 fragment_size = MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
4930 if((property_get("audio.native.dsd.buffer.size.kb", value, "")) &&
4931 atoi(value))
4932 fragment_size = atoi(value) * 1024;
4933 ALOGV("DSD fragment size %d", fragment_size);
4934 }
ApurupaPattapuc6a3a9e2014-01-10 14:46:02 -08004935 }
4936
4937 fragment_size = ALIGN( fragment_size, 1024);
4938
4939 if(fragment_size < MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE)
4940 fragment_size = MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
4941 else if(fragment_size > MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE)
4942 fragment_size = MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
4943 ALOGV("%s: fragment_size %d", __func__, fragment_size);
4944 return fragment_size;
4945}
4946
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304947/*
Ashish Jainb26edfb2016-08-25 00:10:11 +05304948 * return backend_idx on which voice call is active
4949 */
4950static int platform_get_voice_call_backend(struct audio_device* adev)
4951{
4952 struct audio_usecase *uc = NULL;
4953 struct listnode *node;
4954 snd_device_t out_snd_device = SND_DEVICE_NONE;
4955
4956 int backend_idx = -1;
4957
4958 if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
4959 list_for_each(node, &adev->usecase_list) {
4960 uc = node_to_item(node, struct audio_usecase, list);
4961 if (uc && (uc->type == VOICE_CALL || uc->type == VOIP_CALL) && uc->stream.out) {
4962 out_snd_device = platform_get_output_snd_device(adev->platform, uc->stream.out);
4963 backend_idx = platform_get_backend_index(out_snd_device);
4964 break;
4965 }
4966 }
4967 }
4968 return backend_idx;
4969}
4970
4971/*
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304972 * configures afe with bit width and Sample Rate
4973 */
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05304974static int platform_set_codec_backend_cfg(struct audio_device* adev,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05304975 snd_device_t snd_device, struct audio_backend_cfg backend_cfg)
Mingming Yin3ee55c62014-08-04 14:23:35 -07004976{
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004977 int ret = 0;
Kuirong Wang0b947f72016-09-29 11:03:09 -07004978 int backend_idx = platform_get_backend_index(snd_device);
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004979 struct platform_data *my_data = (struct platform_data *)adev->platform;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08004980 backend_idx = platform_get_backend_index(snd_device);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05304981 unsigned int bit_width = backend_cfg.bit_width;
4982 unsigned int sample_rate = backend_cfg.sample_rate;
4983 unsigned int channels = backend_cfg.channels;
4984 audio_format_t format = backend_cfg.format;
4985 bool passthrough_enabled = backend_cfg.passthrough_enabled;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304986
Ashish Jaind84fd6a2016-07-27 12:33:25 +05304987 ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
Kuirong Wang0b947f72016-09-29 11:03:09 -07004988 ", backend_idx %d device (%s)", __func__, bit_width,
4989 sample_rate, channels, backend_idx,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304990 platform_get_snd_device_name(snd_device));
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004991
Dhanalakshmi Siddanib678a802016-12-03 11:51:41 +05304992 if ((my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl) &&
4993 (bit_width != my_data->current_backend_cfg[backend_idx].bit_width)) {
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08004994
Kuirong Wang0b947f72016-09-29 11:03:09 -07004995 struct mixer_ctl *ctl = NULL;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08004996 ctl = mixer_get_ctl_by_name(adev->mixer,
4997 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
Mingming Yin3ee55c62014-08-04 14:23:35 -07004998 if (!ctl) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304999 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
5000 __func__,
5001 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005002 return -EINVAL;
5003 }
5004
5005 if (bit_width == 24) {
Ashish Jain5106d362016-05-11 19:23:33 +05305006 if (format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
Kuirong Wang0b947f72016-09-29 11:03:09 -07005007 ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
Ashish Jain5106d362016-05-11 19:23:33 +05305008 else
Kuirong Wang0b947f72016-09-29 11:03:09 -07005009 ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08005010 } else if (bit_width == 32) {
Ashish Jain058165c2016-09-28 23:18:48 +05305011 ret = mixer_ctl_set_enum_by_string(ctl, "S32_LE");
Mingming Yin3ee55c62014-08-04 14:23:35 -07005012 } else {
Kuirong Wang0b947f72016-09-29 11:03:09 -07005013 ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
Mingming Yin3ee55c62014-08-04 14:23:35 -07005014 }
Kuirong Wang0b947f72016-09-29 11:03:09 -07005015 if ( ret < 0) {
5016 ALOGE("%s:becf: afe: fail for %s mixer set to %d bit for %x format", __func__,
5017 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
5018 } else {
5019 my_data->current_backend_cfg[backend_idx].bit_width = bit_width;
5020 ALOGD("%s:becf: afe: %s mixer set to %d bit for %x format", __func__,
5021 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
5022 }
5023 /* set the ret as 0 and not pass back to upper layer */
5024 ret = 0;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005025 }
5026
Satish Babu Patakokilaa395a9e2016-11-01 12:18:49 +05305027 if (passthrough_enabled || ((my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl) &&
5028 (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate))) {
Mingming Yin3ee55c62014-08-04 14:23:35 -07005029 char *rate_str = NULL;
Kuirong Wang0b947f72016-09-29 11:03:09 -07005030 struct mixer_ctl *ctl = NULL;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005031
5032 switch (sample_rate) {
Satish Babu Patakokilaa395a9e2016-11-01 12:18:49 +05305033 case 32000:
5034 if (passthrough_enabled) {
5035 rate_str = "KHZ_32";
5036 break;
5037 }
Mingming Yin3ee55c62014-08-04 14:23:35 -07005038 case 8000:
Mingming Yin3ee55c62014-08-04 14:23:35 -07005039 case 11025:
Mingming Yin3ee55c62014-08-04 14:23:35 -07005040 case 16000:
Mingming Yin3ee55c62014-08-04 14:23:35 -07005041 case 22050:
Mingming Yin3ee55c62014-08-04 14:23:35 -07005042 case 48000:
5043 rate_str = "KHZ_48";
5044 break;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005045 case 44100:
5046 rate_str = "KHZ_44P1";
5047 break;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005048 case 64000:
Mingming Yin3ee55c62014-08-04 14:23:35 -07005049 case 96000:
5050 rate_str = "KHZ_96";
5051 break;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05305052 case 88200:
5053 rate_str = "KHZ_88P2";
5054 break;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005055 case 176400:
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05305056 rate_str = "KHZ_176P4";
5057 break;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005058 case 192000:
5059 rate_str = "KHZ_192";
5060 break;
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05305061 case 352800:
5062 rate_str = "KHZ_352P8";
5063 break;
5064 case 384000:
5065 rate_str = "KHZ_384";
5066 break;
Satish Babu Patakokilaa395a9e2016-11-01 12:18:49 +05305067 case 144000:
5068 if (passthrough_enabled) {
5069 rate_str = "KHZ_144";
5070 break;
5071 }
5072 default:
Mingming Yin3ee55c62014-08-04 14:23:35 -07005073 rate_str = "KHZ_48";
5074 break;
5075 }
5076
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005077 ctl = mixer_get_ctl_by_name(adev->mixer,
5078 my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005079 if(!ctl) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305080 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
5081 __func__,
5082 my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005083 return -EINVAL;
5084 }
5085
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305086 ALOGD("%s:becf: afe: %s set to %s", __func__,
5087 my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl, rate_str);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005088 mixer_ctl_set_enum_by_string(ctl, rate_str);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005089 my_data->current_backend_cfg[backend_idx].sample_rate = sample_rate;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005090 }
Ashish Jainb26edfb2016-08-25 00:10:11 +05305091 if ((my_data->current_backend_cfg[backend_idx].channels_mixer_ctl) &&
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305092 (channels != my_data->current_backend_cfg[backend_idx].channels)) {
Kuirong Wang0b947f72016-09-29 11:03:09 -07005093 struct mixer_ctl *ctl = NULL;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305094 char *channel_cnt_str = NULL;
5095
5096 switch (channels) {
5097 case 8:
5098 channel_cnt_str = "Eight"; break;
5099 case 7:
5100 channel_cnt_str = "Seven"; break;
5101 case 6:
5102 channel_cnt_str = "Six"; break;
5103 case 5:
5104 channel_cnt_str = "Five"; break;
5105 case 4:
5106 channel_cnt_str = "Four"; break;
5107 case 3:
5108 channel_cnt_str = "Three"; break;
Kuirong Wang0b947f72016-09-29 11:03:09 -07005109 case 1:
5110 channel_cnt_str = "One"; break;
5111 case 2:
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305112 default:
5113 channel_cnt_str = "Two"; break;
5114 }
5115
5116 ctl = mixer_get_ctl_by_name(adev->mixer,
5117 my_data->current_backend_cfg[backend_idx].channels_mixer_ctl);
5118 if (!ctl) {
5119 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
5120 __func__,
5121 my_data->current_backend_cfg[backend_idx].channels_mixer_ctl);
5122 return -EINVAL;
5123 }
5124 mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
5125 my_data->current_backend_cfg[backend_idx].channels = channels;
Ashish Jainb26edfb2016-08-25 00:10:11 +05305126
5127 if (backend_idx == HDMI_RX_BACKEND)
5128 platform_set_edid_channels_configuration(adev->platform, channels);
5129
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305130 ALOGD("%s:becf: afe: %s set to %s", __func__,
Kuirong Wang0b947f72016-09-29 11:03:09 -07005131 my_data->current_backend_cfg[backend_idx].channels_mixer_ctl,
5132 channel_cnt_str);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305133 }
5134
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005135 bool set_ext_disp_format = false;
5136 char *ext_disp_format = NULL;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305137
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005138 if (backend_idx == HDMI_RX_BACKEND) {
5139 ext_disp_format = "HDMI RX Format";
5140 set_ext_disp_format = true;
5141 } else if (backend_idx == DISP_PORT_RX_BACKEND) {
Garmond Leungade0f6d2017-02-03 15:56:10 -08005142 ext_disp_format = "Display Port RX Format";
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005143 set_ext_disp_format = true;
5144 } else {
5145 ALOGV("%s: Format doesnt have to be set", __func__);
5146 }
5147
5148 if (set_ext_disp_format) {
5149 struct mixer_ctl *ctl = mixer_get_ctl_by_name(adev->mixer, ext_disp_format);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305150 if (!ctl) {
5151 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005152 __func__, ext_disp_format);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305153 return -EINVAL;
5154 }
5155
5156 if (passthrough_enabled) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005157 ALOGD("%s:Ext display compress format", __func__);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305158 mixer_ctl_set_enum_by_string(ctl, "Compr");
5159 } else {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005160 ALOGD("%s: Ext display PCM format", __func__);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305161 mixer_ctl_set_enum_by_string(ctl, "LPCM");
5162 }
5163 }
Mingming Yin3ee55c62014-08-04 14:23:35 -07005164 return ret;
5165}
5166
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305167/*
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305168 *Validate the selected bit_width, sample_rate and channels using the edid
5169 *of the connected sink device.
5170 */
5171static void platform_check_hdmi_backend_cfg(struct audio_device* adev,
5172 struct audio_usecase* usecase,
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005173 int backend_idx,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305174 struct audio_backend_cfg *hdmi_backend_cfg)
5175{
5176 unsigned int bit_width;
5177 unsigned int sample_rate;
5178 unsigned int channels, max_supported_channels = 0;
5179 struct platform_data *my_data = (struct platform_data *)adev->platform;
5180 edid_audio_info *edid_info = (edid_audio_info *)my_data->edid_info;
5181 bool passthrough_enabled = false;
5182
5183 bit_width = hdmi_backend_cfg->bit_width;
5184 sample_rate = hdmi_backend_cfg->sample_rate;
5185 channels = hdmi_backend_cfg->channels;
5186
5187
5188 ALOGI("%s:becf: HDMI: bitwidth %d, samplerate %d, channels %d"
5189 ", usecase = %d", __func__, bit_width,
5190 sample_rate, channels, usecase->id);
5191
5192 if (audio_extn_passthru_is_enabled() && audio_extn_passthru_is_active()
5193 && (usecase->stream.out->compr_config.codec->compr_passthr != 0)) {
5194 passthrough_enabled = true;
5195 ALOGI("passthrough is enabled for this stream");
5196 }
5197
5198 // For voice calls use default configuration i.e. 16b/48K, only applicable to
5199 // default backend
5200 if (!passthrough_enabled) {
5201
5202 max_supported_channels = platform_edid_get_max_channels(my_data);
5203
5204 //Check EDID info for supported samplerate
5205 if (!edid_is_supported_sr(edid_info,sample_rate)) {
Garmond Leung2f78a672016-11-07 16:27:40 -08005206 //check to see if current BE sample rate is supported by EDID
5207 //else assign the highest sample rate supported by EDID
5208 if (edid_is_supported_sr(edid_info,my_data->current_backend_cfg[backend_idx].sample_rate))
5209 sample_rate = my_data->current_backend_cfg[backend_idx].sample_rate;
5210 else
5211 sample_rate = edid_get_highest_supported_sr(edid_info);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305212 }
5213
5214 //Check EDID info for supported bit width
5215 if (!edid_is_supported_bps(edid_info,bit_width)) {
5216 //reset to current sample rate
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005217 bit_width = my_data->current_backend_cfg[backend_idx].bit_width;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305218 }
5219
5220 if (channels > max_supported_channels)
5221 channels = max_supported_channels;
5222
5223 } else {
Ben Romberger1aaaf862017-04-06 17:49:46 -07005224 /*During pass through set default bit width */
5225 if (usecase->stream.out->format == AUDIO_FORMAT_DOLBY_TRUEHD)
5226 channels = 8;
5227 else
5228 channels = DEFAULT_HDMI_OUT_CHANNELS;
5229
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305230 if ((usecase->stream.out->format == AUDIO_FORMAT_E_AC3) ||
Ben Romberger1aaaf862017-04-06 17:49:46 -07005231 (usecase->stream.out->format == AUDIO_FORMAT_E_AC3_JOC) ||
5232 (usecase->stream.out->format == AUDIO_FORMAT_DOLBY_TRUEHD))
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305233 sample_rate = sample_rate * 4 ;
5234
Ben Romberger1aaaf862017-04-06 17:49:46 -07005235 if (!edid_is_supported_sr(edid_info, sample_rate))
5236 sample_rate = edid_get_highest_supported_sr(edid_info);
5237
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305238 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
5239 /* We force route so that the BE format can be set to Compr */
5240 }
5241
5242 ALOGI("%s:becf: afe: HDMI backend: passthrough %d updated bit width: %d and sample rate: %d"
5243 "channels %d", __func__, passthrough_enabled , bit_width,
5244 sample_rate, channels);
5245
5246 hdmi_backend_cfg->bit_width = bit_width;
5247 hdmi_backend_cfg->sample_rate = sample_rate;
5248 hdmi_backend_cfg->channels = channels;
5249 hdmi_backend_cfg->passthrough_enabled = passthrough_enabled;
5250}
5251
5252/*
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305253 * goes through all the current usecases and picks the highest
5254 * bitwidth & samplerate
5255 */
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305256static bool platform_check_codec_backend_cfg(struct audio_device* adev,
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005257 struct audio_usecase* usecase,
5258 snd_device_t snd_device,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305259 struct audio_backend_cfg *backend_cfg)
Mingming Yin3ee55c62014-08-04 14:23:35 -07005260{
5261 bool backend_change = false;
5262 struct listnode *node;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005263 unsigned int bit_width;
5264 unsigned int sample_rate;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305265 unsigned int channels;
5266 bool passthrough_enabled = false;
Ashish Jain8c930292017-03-13 16:33:12 +05305267 bool voice_call_active = false;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005268 int backend_idx = DEFAULT_CODEC_BACKEND;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08005269 struct platform_data *my_data = (struct platform_data *)adev->platform;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305270 int na_mode = platform_get_native_support();
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305271 bool channels_updated = false;
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08005272
Ashish Jainc597d102016-12-12 10:31:34 +05305273 /*BT devices backend is not configured from HAL hence skip*/
5274 if (snd_device == SND_DEVICE_OUT_BT_A2DP ||
5275 snd_device == SND_DEVICE_OUT_BT_SCO ||
Sachin Mohan Gadag2e4dcb12017-05-12 13:05:08 +05305276 snd_device == SND_DEVICE_OUT_BT_SCO_WB ||
5277 snd_device == SND_DEVICE_OUT_AFE_PROXY) {
Ashish Jainc597d102016-12-12 10:31:34 +05305278 backend_change = false;
5279 return backend_change;
5280 }
5281
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005282 backend_idx = platform_get_backend_index(snd_device);
5283
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305284 bit_width = backend_cfg->bit_width;
5285 sample_rate = backend_cfg->sample_rate;
5286 channels = backend_cfg->channels;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005287
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305288 ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305289 ", backend_idx %d usecase = %d device (%s)", __func__, bit_width,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305290 sample_rate, channels, backend_idx, usecase->id,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305291 platform_get_snd_device_name(snd_device));
Mingming Yin3ee55c62014-08-04 14:23:35 -07005292
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07005293 // For voice calls use default configuration i.e. 16b/48K, only applicable to
5294 // default backend
Mingming Yin3ee55c62014-08-04 14:23:35 -07005295 // force routing is not required here, caller will do it anyway
Ashish Jainb26edfb2016-08-25 00:10:11 +05305296 if (backend_idx == platform_get_voice_call_backend(adev)) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305297 ALOGW("%s:becf: afe:Use default bw and sr for voice/voip calls ",
5298 __func__);
Narsinga Rao Chella44376cc2014-10-24 13:27:14 -07005299 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
5300 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Ashish Jainb26edfb2016-08-25 00:10:11 +05305301 channels = CODEC_BACKEND_DEFAULT_CHANNELS;
Ashish Jain8c930292017-03-13 16:33:12 +05305302 voice_call_active = true;
Narsinga Rao Chella44376cc2014-10-24 13:27:14 -07005303 } else {
5304 /*
5305 * The backend should be configured at highest bit width and/or
5306 * sample rate amongst all playback usecases.
5307 * If the selected sample rate and/or bit width differ with
5308 * current backend sample rate and/or bit width, then, we set the
5309 * backend re-configuration flag.
5310 *
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305311 * Exception: 16 bit playbacks is allowed through 16 bit/48/44.1 khz backend only
Narsinga Rao Chella44376cc2014-10-24 13:27:14 -07005312 */
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305313 int i =0;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005314 list_for_each(node, &adev->usecase_list) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305315 struct audio_usecase *uc;
5316 uc = node_to_item(node, struct audio_usecase, list);
5317 struct stream_out *out = (struct stream_out*) uc->stream.out;
5318 if (uc->type == PCM_PLAYBACK && out && usecase != uc) {
Preetam Singh Ranawataa37d3f2016-08-23 12:25:23 +05305319 unsigned int out_channels = audio_channel_count_from_out_mask(out->channel_mask);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005320
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305321 ALOGD("%s:napb: (%d) - (%s)id (%d) sr %d bw "
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305322 "(%d) ch (%d) device %s", __func__, i++, use_case_table[uc->id],
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305323 uc->id, out->sample_rate,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305324 out->bit_width, out_channels,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305325 platform_get_snd_device_name(uc->out_snd_device));
5326
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305327 if (platform_check_backends_match(snd_device, uc->out_snd_device)) {
Amit Shekhar278e3362014-09-08 14:08:19 -07005328 if (bit_width < out->bit_width)
5329 bit_width = out->bit_width;
5330 if (sample_rate < out->sample_rate)
5331 sample_rate = out->sample_rate;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005332 if (out->sample_rate < OUTPUT_SAMPLING_RATE_44100)
5333 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305334 if (channels < out_channels)
5335 channels = out_channels;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005336 }
5337 }
5338 }
5339 }
5340
Ashish Jainb26edfb2016-08-25 00:10:11 +05305341 /* Native playback is preferred for Headphone/HS device over 192Khz */
Ashish Jain8c930292017-03-13 16:33:12 +05305342 if (!voice_call_active && codec_device_supports_native_playback(usecase->devices)) {
Ashish Jainb26edfb2016-08-25 00:10:11 +05305343 if (audio_is_true_native_stream_active(adev)) {
5344 if (check_hdset_combo_device(snd_device)) {
5345 /*
5346 * In true native mode Tasha has a limitation that one port at 44.1 khz
5347 * cannot drive both spkr and hdset, to simiplify the solution lets
5348 * move the AFE to 48khzwhen a ring tone selects combo device.
5349 * or if NATIVE playback is not enabled.
5350 */
5351 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
5352 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Ashish Jain8c930292017-03-13 16:33:12 +05305353 ALOGD("%s:becf: afe: port to run at 48k if combo device or in voice call"
5354 , __func__);
Ashish Jainb26edfb2016-08-25 00:10:11 +05305355 } else {
5356 /*
5357 * in single BE mode, if native audio playback
5358 * is active then it will take priority
5359 */
5360 sample_rate = OUTPUT_SAMPLING_RATE_44100;
5361 ALOGD("%s:becf: afe: true napb active set rate to 44.1 khz",
5362 __func__);
5363 }
Ashish Jain7f25be32016-10-25 21:44:16 +05305364 } else if (na_mode != NATIVE_AUDIO_MODE_MULTIPLE_44_1) {
5365 /*
5366 * Map native sampling rates to upper limit range
5367 * if multiple of native sampling rates are not supported.
5368 * This check also indicates that this is not tavil codec
5369 * And 32bit/384kHz is only supported on tavil
5370 * Hence reset 32b/384kHz to 24b/192kHz.
5371 */
5372 switch (sample_rate) {
5373 case 44100:
5374 sample_rate = 48000;
5375 break;
5376 case 88200:
5377 sample_rate = 96000;
5378 break;
5379 case 176400:
5380 case 352800:
5381 case 384000:
5382 sample_rate = 192000;
5383 break;
5384 }
5385 if (bit_width > 24)
5386 bit_width = 24;
5387
5388 ALOGD("%s:becf: afe: napb not active - set non fractional rate",
Ashish Jainb26edfb2016-08-25 00:10:11 +05305389 __func__);
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005390 }
Ashish Jain6fced6e2017-01-09 14:13:22 +05305391 }
5392
5393 /*
5394 * Check if the device is speaker or handset,assumption handset shares
5395 * backend with speaker, and these devices are restricited to 48kHz.
5396 */
5397 if (platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device)) {
Ashish Jain058165c2016-09-28 23:18:48 +05305398
5399 if (bit_width >= 24) {
5400 bit_width = platform_get_snd_device_bit_width(SND_DEVICE_OUT_SPEAKER);
5401 ALOGD("%s:becf: afe: reset bitwidth to %d (based on supported"
5402 " value for this platform)", __func__, bit_width);
5403 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305404 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Ashish Jainb26edfb2016-08-25 00:10:11 +05305405 ALOGD("%s:becf: afe: playback on codec device not supporting native playback set "
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305406 "default Sample Rate(48k)", __func__);
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305407 }
5408
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08005409 if (backend_idx == USB_AUDIO_RX_BACKEND) {
Kuirong Wange9894162016-08-26 15:16:39 -07005410 audio_extn_usb_is_config_supported(&bit_width, &sample_rate, &channels, true);
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08005411 ALOGV("%s: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
5412 __func__, bit_width, sample_rate, channels);
Ashish Jainb26edfb2016-08-25 00:10:11 +05305413 if (channels != my_data->current_backend_cfg[backend_idx].channels)
5414 channels_updated = true;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08005415 }
5416
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005417 if (backend_idx == HDMI_RX_BACKEND || backend_idx == DISP_PORT_RX_BACKEND) {
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305418 struct audio_backend_cfg hdmi_backend_cfg;
5419 hdmi_backend_cfg.bit_width = bit_width;
5420 hdmi_backend_cfg.sample_rate = sample_rate;
5421 hdmi_backend_cfg.channels = channels;
5422 hdmi_backend_cfg.passthrough_enabled = false;
5423
Ashish Jain058165c2016-09-28 23:18:48 +05305424 /*
5425 * HDMI does not support 384Khz/32bit playback hence configure BE to 24b/192Khz
5426 * TODO: Instead have the validation against edid return the next best match
5427 */
5428 if (bit_width > 24)
5429 hdmi_backend_cfg.bit_width = 24;
5430 if (sample_rate > 192000)
5431 hdmi_backend_cfg.sample_rate = 192000;
5432
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005433 platform_check_hdmi_backend_cfg(adev, usecase, backend_idx, &hdmi_backend_cfg);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305434
5435 bit_width = hdmi_backend_cfg.bit_width;
5436 sample_rate = hdmi_backend_cfg.sample_rate;
5437 channels = hdmi_backend_cfg.channels;
5438 passthrough_enabled = hdmi_backend_cfg.passthrough_enabled;
5439
5440 if (channels != my_data->current_backend_cfg[backend_idx].channels)
5441 channels_updated = true;
Mingming Yinddd610b2016-01-20 17:09:32 -08005442 }
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305443
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05305444
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305445 ALOGI("%s:becf: afe: Codec selected backend: %d updated bit width: %d and sample rate: %d",
5446 __func__, backend_idx , bit_width, sample_rate);
Mingming Yinddd610b2016-01-20 17:09:32 -08005447
Mingming Yin3ee55c62014-08-04 14:23:35 -07005448 // Force routing if the expected bitwdith or samplerate
5449 // is not same as current backend comfiguration
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005450 if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305451 (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
5452 passthrough_enabled || channels_updated) {
5453 backend_cfg->bit_width = bit_width;
5454 backend_cfg->sample_rate = sample_rate;
5455 backend_cfg->channels = channels;
5456 backend_cfg->passthrough_enabled = passthrough_enabled;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005457 backend_change = true;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305458 ALOGI("%s:becf: afe: Codec backend needs to be updated. new bit width: %d"
5459 "new sample rate: %d new channels: %d",
5460 __func__, backend_cfg->bit_width, backend_cfg->sample_rate, backend_cfg->channels);
Mingming Yin3ee55c62014-08-04 14:23:35 -07005461 }
5462
Preetam Singh Ranawatdc1a3952016-11-24 17:35:51 +05305463 if (snd_device == SND_DEVICE_OUT_HEADPHONES || snd_device ==
5464 SND_DEVICE_OUT_HEADPHONES_44_1) {
5465 if (sample_rate > 48000 ||
5466 (bit_width >= 24 && (sample_rate == 48000 || sample_rate == 44100))) {
5467 ALOGI("%s: apply HPH HQ mode\n", __func__);
5468 audio_route_apply_and_update_path(adev->audio_route, "hph-highquality-mode");
5469 } else {
5470 ALOGI("%s: apply HPH LP mode\n", __func__);
5471 audio_route_apply_and_update_path(adev->audio_route, "hph-lowpower-mode");
5472 }
5473 }
5474
Mingming Yin3ee55c62014-08-04 14:23:35 -07005475 return backend_change;
5476}
5477
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005478bool platform_check_and_set_codec_backend_cfg(struct audio_device* adev,
5479 struct audio_usecase *usecase, snd_device_t snd_device)
Mingming Yin3ee55c62014-08-04 14:23:35 -07005480{
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005481 int backend_idx = DEFAULT_CODEC_BACKEND;
Siena Richard7c2db772016-12-21 11:32:34 -08005482 int new_snd_devices[SND_DEVICE_OUT_END] = {0};
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305483 int i, num_devices = 1;
5484 bool ret = false;
5485 struct platform_data *my_data = (struct platform_data *)adev->platform;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305486 struct audio_backend_cfg backend_cfg;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005487
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08005488 backend_idx = platform_get_backend_index(snd_device);
Apoorv Raghuvanshif59bb222015-02-18 12:23:23 -08005489
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305490 backend_cfg.bit_width = usecase->stream.out->bit_width;
5491 backend_cfg.sample_rate = usecase->stream.out->sample_rate;
5492 backend_cfg.format = usecase->stream.out->format;
5493 backend_cfg.channels = audio_channel_count_from_out_mask(usecase->stream.out->channel_mask);
5494 /*this is populated by check_codec_backend_cfg hence set default value to false*/
5495 backend_cfg.passthrough_enabled = false;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005496
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05305497 /* Set Backend sampling rate to 176.4 for DSD64 and
5498 * 352.8Khz for DSD128.
5499 * Set Bit Width to 16
5500 */
5501 if ((backend_idx == DSD_NATIVE_BACKEND) && (backend_cfg.format == AUDIO_FORMAT_DSD)) {
5502 backend_cfg.bit_width = 16;
5503 if (backend_cfg.sample_rate == INPUT_SAMPLING_RATE_DSD64)
5504 backend_cfg.sample_rate = OUTPUT_SAMPLING_RATE_DSD64;
5505 else if (backend_cfg.sample_rate == INPUT_SAMPLING_RATE_DSD128)
5506 backend_cfg.sample_rate = OUTPUT_SAMPLING_RATE_DSD128;
5507 }
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305508 ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
5509 ", backend_idx %d usecase = %d device (%s)", __func__, backend_cfg.bit_width,
5510 backend_cfg.sample_rate, backend_cfg.channels, backend_idx, usecase->id,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305511 platform_get_snd_device_name(snd_device));
5512
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07005513 if (platform_split_snd_device(my_data, snd_device, &num_devices,
5514 new_snd_devices) < 0)
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305515 new_snd_devices[0] = snd_device;
5516
5517 for (i = 0; i < num_devices; i++) {
5518 ALOGI("%s: new_snd_devices[%d] is %d", __func__, i, new_snd_devices[i]);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305519 if ((platform_check_codec_backend_cfg(adev, usecase, new_snd_devices[i],
5520 &backend_cfg))) {
5521 platform_set_codec_backend_cfg(adev, new_snd_devices[i],
5522 backend_cfg);
5523 ret = true;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305524 }
Mingming Yin3ee55c62014-08-04 14:23:35 -07005525 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305526 return ret;
Mingming Yin3ee55c62014-08-04 14:23:35 -07005527}
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07005528
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305529/*
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305530 * goes through all the current usecases and picks the highest
5531 * bitwidth & samplerate
5532 */
Kuirong Wange9894162016-08-26 15:16:39 -07005533static bool platform_check_capture_codec_backend_cfg(struct audio_device* adev,
5534 int backend_idx,
5535 struct audio_backend_cfg *backend_cfg)
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305536{
5537 bool backend_change = false;
5538 unsigned int bit_width;
5539 unsigned int sample_rate;
Kuirong Wange9894162016-08-26 15:16:39 -07005540 unsigned int channels;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305541 struct platform_data *my_data = (struct platform_data *)adev->platform;
5542
Kuirong Wange9894162016-08-26 15:16:39 -07005543 bit_width = backend_cfg->bit_width;
5544 sample_rate = backend_cfg->sample_rate;
5545 channels = backend_cfg->channels;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305546
5547 ALOGI("%s:txbecf: afe: Codec selected backend: %d current bit width: %d and "
Kuirong Wang0b947f72016-09-29 11:03:09 -07005548 "sample rate: %d, channels %d",__func__,backend_idx, bit_width,
5549 sample_rate, channels);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305550
5551 // For voice calls use default configuration i.e. 16b/48K, only applicable to
5552 // default backend
5553 // force routing is not required here, caller will do it anyway
5554 if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
Kuirong Wang0b947f72016-09-29 11:03:09 -07005555 ALOGW("%s:txbecf: afe: Use default bw and sr for voice/voip calls and "
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305556 "for unprocessed/camera source", __func__);
5557 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
5558 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Dhananjay Kumar9983c372016-12-09 22:00:40 +05305559 channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
5560 } else {
5561 struct listnode *node;
5562 struct audio_usecase *uc = NULL;
5563 unsigned int uc_channels = 0;
5564 struct stream_in *in = NULL;
5565 /* update cfg against other existing capture usecases on same backend */
5566 list_for_each(node, &adev->usecase_list) {
5567 uc = node_to_item(node, struct audio_usecase, list);
Satya Krishna Pindiproli9f566672017-02-28 11:14:01 +05305568 in = (struct stream_in *) uc->stream.in;
5569 if (in != NULL && uc->type == PCM_CAPTURE &&
Dhananjay Kumar9983c372016-12-09 22:00:40 +05305570 backend_idx == platform_get_backend_index(uc->in_snd_device)) {
Dhananjay Kumar9983c372016-12-09 22:00:40 +05305571 uc_channels = audio_channel_count_from_in_mask(in->channel_mask);
5572
5573 ALOGV("%s:txbecf: uc %s, id %d, sr %d, bw %d, ch %d, device %s",
5574 __func__, use_case_table[uc->id], uc->id, in->sample_rate,
5575 in->bit_width, uc_channels,
5576 platform_get_snd_device_name(uc->in_snd_device));
5577
5578 if (sample_rate < in->sample_rate)
5579 sample_rate = in->sample_rate;
5580 if (bit_width < in->bit_width)
5581 bit_width = in->bit_width;
5582 if (channels < uc_channels)
5583 channels = uc_channels;
5584 }
5585 }
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305586 }
Kuirong Wange9894162016-08-26 15:16:39 -07005587 if (backend_idx == USB_AUDIO_TX_BACKEND) {
5588 audio_extn_usb_is_config_supported(&bit_width, &sample_rate, &channels, false);
Kuirong Wang0b947f72016-09-29 11:03:09 -07005589 ALOGV("%s:txbecf: afe: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
Kuirong Wange9894162016-08-26 15:16:39 -07005590 __func__, bit_width, sample_rate, channels);
5591 }
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305592
5593 ALOGI("%s:txbecf: afe: Codec selected backend: %d updated bit width: %d and "
5594 "sample rate: %d", __func__, backend_idx, bit_width, sample_rate);
5595 // Force routing if the expected bitwdith or samplerate
5596 // is not same as current backend comfiguration
Kuirong Wang0b947f72016-09-29 11:03:09 -07005597 if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
5598 (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
5599 (channels != my_data->current_backend_cfg[backend_idx].channels)) {
Kuirong Wange9894162016-08-26 15:16:39 -07005600 backend_cfg->bit_width = bit_width;
5601 backend_cfg->sample_rate= sample_rate;
Kuirong Wang0b947f72016-09-29 11:03:09 -07005602 backend_cfg->channels = channels;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305603 backend_change = true;
5604 ALOGI("%s:txbecf: afe: Codec backend needs to be updated. new bit width: %d "
Kuirong Wang0b947f72016-09-29 11:03:09 -07005605 "new sample rate: %d new channel: %d",
5606 __func__, backend_cfg->bit_width,
5607 backend_cfg->sample_rate, backend_cfg->channels);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305608 }
5609
5610 return backend_change;
5611}
5612
5613bool platform_check_and_set_capture_codec_backend_cfg(struct audio_device* adev,
5614 struct audio_usecase *usecase, snd_device_t snd_device)
5615{
Kuirong Wang0b947f72016-09-29 11:03:09 -07005616 int backend_idx = platform_get_backend_index(snd_device);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305617 int ret = 0;
Kuirong Wange9894162016-08-26 15:16:39 -07005618 struct audio_backend_cfg backend_cfg;
5619
5620 backend_cfg.passthrough_enabled = false;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305621 if(usecase->type == PCM_CAPTURE) {
Kuirong Wange9894162016-08-26 15:16:39 -07005622 backend_cfg.sample_rate= usecase->stream.in->sample_rate;
5623 backend_cfg.bit_width= usecase->stream.in->bit_width;
5624 backend_cfg.format= usecase->stream.in->format;
5625 backend_cfg.channels = audio_channel_count_from_in_mask(usecase->stream.in->channel_mask);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305626 } else {
Kuirong Wange9894162016-08-26 15:16:39 -07005627 backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
5628 backend_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
5629 backend_cfg.format = AUDIO_FORMAT_PCM_16_BIT;
5630 backend_cfg.channels = 1;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305631 }
5632
Kuirong Wange9894162016-08-26 15:16:39 -07005633 ALOGI("%s:txbecf: afe: bitwidth %d, samplerate %d, channel %d"
5634 ", backend_idx %d usecase = %d device (%s)", __func__,
5635 backend_cfg.bit_width,
5636 backend_cfg.sample_rate,
5637 backend_cfg.channels,
5638 backend_idx, usecase->id,
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305639 platform_get_snd_device_name(snd_device));
Kuirong Wange9894162016-08-26 15:16:39 -07005640 if (platform_check_capture_codec_backend_cfg(adev, backend_idx,
5641 &backend_cfg)) {
Kuirong Wang0b947f72016-09-29 11:03:09 -07005642 ret = platform_set_codec_backend_cfg(adev, snd_device,
5643 backend_cfg);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05305644 if(!ret)
5645 return true;
5646 }
5647
5648 return false;
5649}
5650
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305651int platform_set_snd_device_backend(snd_device_t device, const char *backend_tag,
5652 const char * hw_interface)
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07005653{
5654 int ret = 0;
5655
5656 if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
5657 ALOGE("%s: Invalid snd_device = %d",
5658 __func__, device);
5659 ret = -EINVAL;
5660 goto done;
5661 }
5662
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305663 ALOGD("%s: backend_tag_table[%s]: old = %s new = %s", __func__,
5664 platform_get_snd_device_name(device),
5665 backend_tag_table[device] != NULL ? backend_tag_table[device]: "null",
5666 backend_tag);
Ashish Jaind150d4c2017-02-03 18:44:34 +05305667
5668 if (backend_tag != NULL ) {
5669 if (backend_tag_table[device]) {
5670 free(backend_tag_table[device]);
5671 }
5672 backend_tag_table[device] = strdup(backend_tag);
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07005673 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305674
5675 if (hw_interface != NULL) {
5676 if (hw_interface_table[device])
5677 free(hw_interface_table[device]);
5678
5679 ALOGD("%s: hw_interface_table[%d] = %s", __func__, device, hw_interface);
5680 hw_interface_table[device] = strdup(hw_interface);
5681 }
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07005682done:
5683 return ret;
5684}
5685
Siena Richard7c2db772016-12-21 11:32:34 -08005686int platform_get_snd_device_backend_index(snd_device_t device)
5687{
5688 int i, be_dai_id;
5689 const char * hw_interface_name = NULL;
5690
5691 ALOGV("%s: enter with device %d\n", __func__, device);
5692
Aditya Bavanari701a6992017-03-30 19:17:16 +05305693 if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
Siena Richard7c2db772016-12-21 11:32:34 -08005694 ALOGE("%s: Invalid snd_device = %d",
5695 __func__, device);
5696 be_dai_id = -EINVAL;
5697 goto done;
5698 }
5699
5700 /* Get string value of necessary backend for device */
5701 hw_interface_name = hw_interface_table[device];
5702 if (hw_interface_name == NULL) {
5703 ALOGE("%s: no hw_interface set for device %d\n", __func__, device);
5704 be_dai_id = -EINVAL;
5705 goto done;
5706 }
5707
5708 /* Check if be dai name table was retrieved successfully */
5709 if (be_dai_name_table == NULL) {
5710 ALOGE("%s: BE DAI Name Table is not present\n", __func__);
5711 be_dai_id = -EFAULT;
5712 goto done;
5713 }
5714
5715 /* Get backend ID for device specified */
5716 for (i = 0; i < max_be_dai_names; i++) {
5717 if (strcmp(hw_interface_name, be_dai_name_table[i].be_name) == 0) {
5718 be_dai_id = be_dai_name_table[i].be_id;
5719 goto done;
5720 }
5721 }
5722 ALOGE("%s: no interface matching name %s\n", __func__, hw_interface_name);
5723 be_dai_id = -EINVAL;
5724 goto done;
5725
5726done:
5727 return be_dai_id;
5728}
5729
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07005730int platform_set_usecase_pcm_id(audio_usecase_t usecase, int32_t type, int32_t pcm_id)
5731{
5732 int ret = 0;
5733 if ((usecase <= USECASE_INVALID) || (usecase >= AUDIO_USECASE_MAX)) {
5734 ALOGE("%s: invalid usecase case idx %d", __func__, usecase);
5735 ret = -EINVAL;
5736 goto done;
5737 }
5738
5739 if ((type != 0) && (type != 1)) {
5740 ALOGE("%s: invalid usecase type", __func__);
5741 ret = -EINVAL;
5742 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305743 ALOGV("%s: pcm_device_table[%d][%d] = %d", __func__, usecase, type, pcm_id);
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07005744 pcm_device_table[usecase][type] = pcm_id;
5745done:
5746 return ret;
5747}
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07005748
5749void platform_get_device_to_be_id_map(int **device_to_be_id, int *length)
5750{
Alexy Josephb1379942016-01-29 15:49:38 -08005751 *device_to_be_id = (int*) msm_device_to_be_id;
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07005752 *length = msm_be_id_array_len;
5753}
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005754int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel_mask, int snd_id)
5755{
5756 int ret = 0;
5757 int channels = audio_channel_count_from_out_mask(channel_mask);
5758
5759 char channel_map[8];
5760 memset(channel_map, 0, sizeof(channel_map));
5761 /* Following are all most common standard WAV channel layouts
5762 overridden by channel mask if its allowed and different */
5763 switch (channels) {
5764 case 1:
5765 /* AUDIO_CHANNEL_OUT_MONO */
5766 channel_map[0] = PCM_CHANNEL_FC;
Alexy Josephe844aad2014-12-01 16:06:34 -08005767 break;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005768 case 2:
5769 /* AUDIO_CHANNEL_OUT_STEREO */
5770 channel_map[0] = PCM_CHANNEL_FL;
5771 channel_map[1] = PCM_CHANNEL_FR;
Alexy Josephe844aad2014-12-01 16:06:34 -08005772 break;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005773 case 3:
5774 /* AUDIO_CHANNEL_OUT_2POINT1 */
5775 channel_map[0] = PCM_CHANNEL_FL;
5776 channel_map[1] = PCM_CHANNEL_FR;
5777 channel_map[2] = PCM_CHANNEL_FC;
5778 break;
5779 case 4:
5780 /* AUDIO_CHANNEL_OUT_QUAD_SIDE */
5781 channel_map[0] = PCM_CHANNEL_FL;
5782 channel_map[1] = PCM_CHANNEL_FR;
5783 channel_map[2] = PCM_CHANNEL_LS;
5784 channel_map[3] = PCM_CHANNEL_RS;
5785 if (channel_mask == AUDIO_CHANNEL_OUT_QUAD_BACK)
5786 {
5787 channel_map[2] = PCM_CHANNEL_LB;
5788 channel_map[3] = PCM_CHANNEL_RB;
5789 }
5790 if (channel_mask == AUDIO_CHANNEL_OUT_SURROUND)
5791 {
5792 channel_map[2] = PCM_CHANNEL_FC;
5793 channel_map[3] = PCM_CHANNEL_CS;
5794 }
5795 break;
5796 case 5:
5797 /* AUDIO_CHANNEL_OUT_PENTA */
5798 channel_map[0] = PCM_CHANNEL_FL;
5799 channel_map[1] = PCM_CHANNEL_FR;
5800 channel_map[2] = PCM_CHANNEL_FC;
5801 channel_map[3] = PCM_CHANNEL_LB;
5802 channel_map[4] = PCM_CHANNEL_RB;
5803 break;
5804 case 6:
5805 /* AUDIO_CHANNEL_OUT_5POINT1 */
5806 channel_map[0] = PCM_CHANNEL_FL;
5807 channel_map[1] = PCM_CHANNEL_FR;
5808 channel_map[2] = PCM_CHANNEL_FC;
5809 channel_map[3] = PCM_CHANNEL_LFE;
5810 channel_map[4] = PCM_CHANNEL_LB;
5811 channel_map[5] = PCM_CHANNEL_RB;
5812 if (channel_mask == AUDIO_CHANNEL_OUT_5POINT1_SIDE)
5813 {
5814 channel_map[4] = PCM_CHANNEL_LS;
5815 channel_map[5] = PCM_CHANNEL_RS;
5816 }
5817 break;
5818 case 7:
5819 /* AUDIO_CHANNEL_OUT_6POINT1 */
5820 channel_map[0] = PCM_CHANNEL_FL;
5821 channel_map[1] = PCM_CHANNEL_FR;
5822 channel_map[2] = PCM_CHANNEL_FC;
5823 channel_map[3] = PCM_CHANNEL_LFE;
5824 channel_map[4] = PCM_CHANNEL_LB;
5825 channel_map[5] = PCM_CHANNEL_RB;
5826 channel_map[6] = PCM_CHANNEL_CS;
Alexy Josephe844aad2014-12-01 16:06:34 -08005827 break;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005828 case 8:
5829 /* AUDIO_CHANNEL_OUT_7POINT1 */
5830 channel_map[0] = PCM_CHANNEL_FL;
5831 channel_map[1] = PCM_CHANNEL_FR;
5832 channel_map[2] = PCM_CHANNEL_FC;
5833 channel_map[3] = PCM_CHANNEL_LFE;
5834 channel_map[4] = PCM_CHANNEL_LB;
5835 channel_map[5] = PCM_CHANNEL_RB;
5836 channel_map[6] = PCM_CHANNEL_LS;
5837 channel_map[7] = PCM_CHANNEL_RS;
5838 break;
5839 default:
5840 ALOGE("unsupported channels %d for setting channel map", channels);
5841 return -1;
5842 }
5843 ret = platform_set_channel_map(platform, channels, channel_map, snd_id);
5844 return ret;
5845}
5846
5847int platform_get_edid_info(void *platform)
5848{
5849 struct platform_data *my_data = (struct platform_data *)platform;
5850 struct audio_device *adev = my_data->adev;
5851 char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE];
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05305852 int ret, count;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005853 char *mix_ctl_name;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005854 struct mixer_ctl *ctl;
5855 char edid_data[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE + 1] = {0};
5856 edid_audio_info *info;
5857
5858 if (my_data->edid_valid) {
5859 /* use cached edid */
5860 return 0;
5861 }
5862
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005863 switch(my_data->ext_disp_type) {
5864 case EXT_DISPLAY_TYPE_HDMI:
5865 mix_ctl_name = "HDMI EDID";
5866 break;
5867 case EXT_DISPLAY_TYPE_DP:
5868 mix_ctl_name = "Display Port EDID";
5869 break;
5870 default:
5871 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
5872 return -EINVAL;
5873 }
5874
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005875 if (my_data->edid_info == NULL) {
5876 my_data->edid_info =
5877 (struct edid_audio_info *)calloc(1, sizeof(struct edid_audio_info));
5878 }
5879
5880 info = my_data->edid_info;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005881 ctl = mixer_get_ctl_by_name(adev->mixer, mix_ctl_name);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005882 if (!ctl) {
5883 ALOGE("%s: Could not get ctl for mixer cmd - %s",
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005884 __func__, mix_ctl_name);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005885 goto fail;
5886 }
5887
5888 mixer_ctl_update(ctl);
5889
5890 count = mixer_ctl_get_num_values(ctl);
5891
5892 /* Read SAD blocks, clamping the maximum size for safety */
5893 if (count > (int)sizeof(block))
5894 count = (int)sizeof(block);
5895
5896 ret = mixer_ctl_get_array(ctl, block, count);
5897 if (ret != 0) {
5898 ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__);
5899 goto fail;
5900 }
5901 edid_data[0] = count;
5902 memcpy(&edid_data[1], block, count);
5903
5904 if (!edid_get_sink_caps(info, edid_data)) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005905 ALOGE("%s: Failed to get extn disp sink capabilities", __func__);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005906 goto fail;
5907 }
5908 my_data->edid_valid = true;
5909 return 0;
5910fail:
5911 if (my_data->edid_info) {
5912 free(my_data->edid_info);
5913 my_data->edid_info = NULL;
5914 my_data->edid_valid = false;
5915 }
5916 ALOGE("%s: return -EINVAL", __func__);
5917 return -EINVAL;
5918}
5919
5920
5921int platform_set_channel_allocation(void *platform, int channel_alloc)
5922{
5923 struct mixer_ctl *ctl;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005924 char *mixer_ctl_name;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005925 int ret;
5926 struct platform_data *my_data = (struct platform_data *)platform;
5927 struct audio_device *adev = my_data->adev;
5928
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005929 switch(my_data->ext_disp_type) {
5930 case EXT_DISPLAY_TYPE_HDMI:
5931 mixer_ctl_name = "HDMI RX CA";
5932 break;
5933 case EXT_DISPLAY_TYPE_DP:
5934 mixer_ctl_name = "Display Port RX CA";
5935 break;
5936 default:
5937 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
5938 return -EINVAL;
5939 }
5940
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005941 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
5942 if (!ctl) {
5943 ALOGE("%s: Could not get ctl for mixer cmd - %s",
5944 __func__, mixer_ctl_name);
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005945 return -EINVAL;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005946 }
5947 ALOGD(":%s channel allocation = 0x%x", __func__, channel_alloc);
5948 ret = mixer_ctl_set_value(ctl, 0, channel_alloc);
5949
5950 if (ret < 0) {
5951 ALOGE("%s: Could not set ctl, error:%d ", __func__, ret);
5952 }
5953
5954 return ret;
5955}
5956
5957int platform_set_channel_map(void *platform, int ch_count, char *ch_map, int snd_id)
5958{
5959 struct mixer_ctl *ctl;
Apoorv Raghuvanshi8880cac2015-02-06 15:33:49 -08005960 char mixer_ctl_name[44] = {0}; // max length of name is 44 as defined
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005961 int ret;
5962 unsigned int i;
Divya Narayanan Poojary21de6aa2017-01-06 12:07:19 +05305963 int set_values[FCC_8] = {0};
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005964 struct platform_data *my_data = (struct platform_data *)platform;
5965 struct audio_device *adev = my_data->adev;
5966 ALOGV("%s channel_count:%d",__func__, ch_count);
Divya Narayanan Poojary21de6aa2017-01-06 12:07:19 +05305967 if (NULL == ch_map || (ch_count < 1) || (ch_count > FCC_8)) {
5968 ALOGE("%s: Invalid channel mapping or channel count value", __func__);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005969 return -EINVAL;
5970 }
Fred Ohe0479682015-03-25 16:30:26 -07005971
5972 /*
5973 * If snd_id is greater than 0, stream channel mapping
5974 * If snd_id is below 0, typically -1, device channel mapping
5975 */
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005976 if (snd_id >= 0) {
Fred Ohe0479682015-03-25 16:30:26 -07005977 snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "Playback Channel Map%d", snd_id);
5978 } else {
5979 strlcpy(mixer_ctl_name, "Playback Device Channel Map", sizeof(mixer_ctl_name));
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005980 }
5981
5982 ALOGD("%s mixer_ctl_name:%s", __func__, mixer_ctl_name);
5983
5984 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
5985 if (!ctl) {
5986 ALOGE("%s: Could not get ctl for mixer cmd - %s",
5987 __func__, mixer_ctl_name);
5988 return -EINVAL;
5989 }
Divya Narayanan Poojary21de6aa2017-01-06 12:07:19 +05305990 for (i = 0; i < (unsigned int)ch_count; i++) {
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005991 set_values[i] = ch_map[i];
5992 }
5993
5994 ALOGD("%s: set mapping(%d %d %d %d %d %d %d %d) for channel:%d", __func__,
5995 set_values[0], set_values[1], set_values[2], set_values[3], set_values[4],
5996 set_values[5], set_values[6], set_values[7], ch_count);
5997
Divya Narayanan Poojary21de6aa2017-01-06 12:07:19 +05305998 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07005999 if (ret < 0) {
6000 ALOGE("%s: Could not set ctl, error:%d ch_count:%d",
6001 __func__, ret, ch_count);
6002 }
6003 return ret;
6004}
6005
6006unsigned char platform_map_to_edid_format(int audio_format)
6007{
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006008 unsigned char format;
6009 switch (audio_format & AUDIO_FORMAT_MAIN_MASK) {
6010 case AUDIO_FORMAT_AC3:
6011 ALOGV("%s: AC3", __func__);
6012 format = AC3;
6013 break;
6014 case AUDIO_FORMAT_AAC:
6015 ALOGV("%s:AAC", __func__);
6016 format = AAC;
6017 break;
Manish Dewangana6fc5442015-08-24 20:30:31 +05306018 case AUDIO_FORMAT_AAC_ADTS:
6019 ALOGV("%s:AAC_ADTS", __func__);
6020 format = AAC;
6021 break;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006022 case AUDIO_FORMAT_E_AC3:
Satish Babu Patakokilaa395a9e2016-11-01 12:18:49 +05306023 case AUDIO_FORMAT_E_AC3_JOC:
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006024 ALOGV("%s:E_AC3", __func__);
6025 format = DOLBY_DIGITAL_PLUS;
6026 break;
Ben Romberger1aaaf862017-04-06 17:49:46 -07006027 case AUDIO_FORMAT_DOLBY_TRUEHD:
6028 ALOGV("%s:MAT", __func__);
6029 format = MAT;
6030 break;
Mingming Yin3a941d42016-02-17 18:08:05 -08006031 case AUDIO_FORMAT_DTS:
6032 ALOGV("%s:DTS", __func__);
6033 format = DTS;
6034 break;
6035 case AUDIO_FORMAT_DTS_HD:
6036 ALOGV("%s:DTS_HD", __func__);
6037 format = DTS_HD;
6038 break;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006039 case AUDIO_FORMAT_PCM_16_BIT:
Ashish Jain5106d362016-05-11 19:23:33 +05306040 case AUDIO_FORMAT_PCM_24_BIT_PACKED:
6041 case AUDIO_FORMAT_PCM_8_24_BIT:
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006042 ALOGV("%s:PCM", __func__);
Mingming Yin3a941d42016-02-17 18:08:05 -08006043 format = LPCM;
6044 break;
6045 default:
Mingming Yin3a941d42016-02-17 18:08:05 -08006046 format = -1;
Naresh Tanniru20e8b022016-04-28 16:54:17 +05306047 ALOGE("%s:invalid format:%d", __func__,format);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006048 break;
6049 }
6050 return format;
6051}
6052
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07006053uint32_t platform_get_compress_passthrough_buffer_size(
6054 audio_offload_info_t* info)
6055{
6056 uint32_t fragment_size = MIN_COMPRESS_PASSTHROUGH_FRAGMENT_SIZE;
6057 if (!info->has_video)
6058 fragment_size = MIN_COMPRESS_PASSTHROUGH_FRAGMENT_SIZE;
6059
6060 return fragment_size;
6061}
6062
Ashish Jaina052e572016-11-07 16:41:07 +05306063void platform_check_and_update_copp_sample_rate(void* platform, snd_device_t snd_device,
6064 unsigned int stream_sr, int* sample_rate)
6065{
6066 struct platform_data* my_data = (struct platform_data *)platform;
6067 int backend_idx = platform_get_backend_index(snd_device);
6068 int device_sr = my_data->current_backend_cfg[backend_idx].sample_rate;
6069 /*
6070 *Check if device SR is multiple of 8K or 11.025 Khz
6071 *check if the stream SR is multiple of same base, if yes
6072 *then have copp SR equal to stream SR, this ensures that
6073 *post processing happens at stream SR, else have
6074 *copp SR equal to device SR.
6075 */
6076 if (!(((sample_rate_multiple(device_sr, SAMPLE_RATE_8000)) &&
6077 (sample_rate_multiple(stream_sr, SAMPLE_RATE_8000))) ||
6078 ((sample_rate_multiple(device_sr, SAMPLE_RATE_11025)) &&
6079 (sample_rate_multiple(stream_sr, SAMPLE_RATE_11025))))) {
6080 *sample_rate = device_sr;
6081 } else
6082 *sample_rate = stream_sr;
6083
6084 ALOGI("sn_device %d device sr %d stream sr %d copp sr %d", snd_device, device_sr, stream_sr
6085, *sample_rate);
6086
6087}
6088
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07006089void platform_reset_edid_info(void *platform) {
6090
6091 ALOGV("%s:", __func__);
6092 struct platform_data *my_data = (struct platform_data *)platform;
6093 if (my_data->edid_info) {
6094 ALOGV("%s :free edid", __func__);
6095 free(my_data->edid_info);
6096 my_data->edid_info = NULL;
6097 }
6098}
6099
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006100bool platform_is_edid_supported_format(void *platform, int format)
6101{
6102 struct platform_data *my_data = (struct platform_data *)platform;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006103 edid_audio_info *info = NULL;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05306104 int i, ret;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006105 unsigned char format_id = platform_map_to_edid_format(format);
6106
Mingming Yin3a941d42016-02-17 18:08:05 -08006107 if (format_id <= 0) {
6108 ALOGE("%s invalid edid format mappting for :%x" ,__func__, format);
6109 return false;
6110 }
6111
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006112 ret = platform_get_edid_info(platform);
6113 info = (edid_audio_info *)my_data->edid_info;
6114 if (ret == 0 && info != NULL) {
6115 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07006116 /*
6117 * To check
6118 * is there any special for CONFIG_HDMI_PASSTHROUGH_CONVERT
6119 * & DOLBY_DIGITAL_PLUS
6120 */
6121 if (info->audio_blocks_array[i].format_id == format_id) {
Mingming Yin3a941d42016-02-17 18:08:05 -08006122 ALOGV("%s:returns true %x",
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07006123 __func__, format);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006124 return true;
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07006125 }
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006126 }
6127 }
Mingming Yin3a941d42016-02-17 18:08:05 -08006128 ALOGV("%s:returns false %x",
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006129 __func__, format);
6130 return false;
6131}
6132
Mingming Yin3a941d42016-02-17 18:08:05 -08006133bool platform_is_edid_supported_sample_rate(void *platform, int sample_rate)
6134{
6135 struct platform_data *my_data = (struct platform_data *)platform;
Mingming Yin3a941d42016-02-17 18:08:05 -08006136 edid_audio_info *info = NULL;
Garmond Leung2f78a672016-11-07 16:27:40 -08006137 int ret = 0;
Mingming Yin3a941d42016-02-17 18:08:05 -08006138
6139 ret = platform_get_edid_info(platform);
6140 info = (edid_audio_info *)my_data->edid_info;
6141 if (ret == 0 && info != NULL) {
Garmond Leung2f78a672016-11-07 16:27:40 -08006142 return edid_is_supported_sr(info, sample_rate);
Mingming Yin3a941d42016-02-17 18:08:05 -08006143 }
Mingming Yin3a941d42016-02-17 18:08:05 -08006144
6145 return false;
6146}
6147
6148
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006149int platform_set_edid_channels_configuration(void *platform, int channels) {
6150
6151 struct platform_data *my_data = (struct platform_data *)platform;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006152 edid_audio_info *info = NULL;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006153 int channel_count = 2;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05306154 int i, ret;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006155 char default_channelMap[MAX_CHANNELS_SUPPORTED] = {0};
6156
6157 ret = platform_get_edid_info(platform);
6158 info = (edid_audio_info *)my_data->edid_info;
6159 if(ret == 0 && info != NULL) {
6160 if (channels > 2) {
6161
6162 ALOGV("%s:able to get HDMI sink capabilities multi channel playback",
6163 __func__);
6164 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
6165 if (info->audio_blocks_array[i].format_id == LPCM &&
6166 info->audio_blocks_array[i].channels > channel_count &&
6167 info->audio_blocks_array[i].channels <= MAX_HDMI_CHANNEL_CNT) {
6168 channel_count = info->audio_blocks_array[i].channels;
6169 }
6170 }
6171 ALOGVV("%s:channel_count:%d", __func__, channel_count);
6172 /*
6173 * Channel map is set for supported hdmi max channel count even
6174 * though the input channel count set on adm is less than or equal to
6175 * max supported channel count
6176 */
6177 platform_set_channel_map(platform, channel_count, info->channel_map, -1);
6178 platform_set_channel_allocation(platform, info->channel_allocation);
6179 } else {
6180 default_channelMap[0] = PCM_CHANNEL_FL;
6181 default_channelMap[1] = PCM_CHANNEL_FR;
6182 platform_set_channel_map(platform,2,default_channelMap,-1);
6183 platform_set_channel_allocation(platform,0);
6184 }
6185 }
6186
6187 return 0;
6188}
6189
6190void platform_cache_edid(void * platform)
6191{
6192 platform_get_edid_info(platform);
6193}
6194
Mingming Yinddd610b2016-01-20 17:09:32 -08006195void platform_invalidate_hdmi_config(void * platform)
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006196{
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006197 //reset ext display EDID info
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006198 struct platform_data *my_data = (struct platform_data *)platform;
Ben Rombergere9e80ee2017-04-26 16:00:10 -07006199 struct audio_device *adev = my_data->adev;
6200 struct audio_backend_cfg backend_cfg;
6201 int backend_idx;
6202 snd_device_t snd_device;
6203
6204 backend_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
6205 backend_cfg.channels = DEFAULT_HDMI_OUT_CHANNELS;
6206 backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
6207 backend_cfg.format = 0;
6208 backend_cfg.passthrough_enabled = false;
6209
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006210 my_data->edid_valid = false;
6211 if (my_data->edid_info) {
6212 memset(my_data->edid_info, 0, sizeof(struct edid_audio_info));
6213 }
Mingming Yinddd610b2016-01-20 17:09:32 -08006214
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006215 if (my_data->ext_disp_type == EXT_DISPLAY_TYPE_HDMI) {
6216 //reset HDMI_RX_BACKEND to default values
Ben Rombergere9e80ee2017-04-26 16:00:10 -07006217 backend_idx = HDMI_RX_BACKEND;
6218 snd_device = SND_DEVICE_OUT_HDMI;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006219 } else {
6220 //reset Display port BACKEND to default values
Ben Rombergere9e80ee2017-04-26 16:00:10 -07006221 backend_idx = DISP_PORT_RX_BACKEND;
6222 snd_device = SND_DEVICE_OUT_DISPLAY_PORT;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006223 }
Ben Rombergere9e80ee2017-04-26 16:00:10 -07006224 platform_set_codec_backend_cfg(adev, snd_device, backend_cfg);
6225 my_data->current_backend_cfg[backend_idx].sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
6226 my_data->current_backend_cfg[backend_idx].channels = DEFAULT_HDMI_OUT_CHANNELS;
6227 my_data->current_backend_cfg[backend_idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006228 my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07006229}
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07006230
6231int platform_set_mixer_control(struct stream_out *out, const char * mixer_ctl_name,
6232 const char *mixer_val)
6233{
6234 struct audio_device *adev = out->dev;
6235 struct mixer_ctl *ctl = NULL;
6236 ALOGD("setting mixer ctl %s with value %s", mixer_ctl_name, mixer_val);
6237 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
6238 if (!ctl) {
6239 ALOGE("%s: could not get ctl for mixer cmd - %s",
6240 __func__, mixer_ctl_name);
6241 return -EINVAL;
6242 }
6243
6244 return mixer_ctl_set_enum_by_string(ctl, mixer_val);
6245}
6246
Pradnya Chaphekar80a8cfb2014-10-20 16:17:01 -07006247int platform_set_device_params(struct stream_out *out, int param, int value)
6248{
6249 struct audio_device *adev = out->dev;
6250 struct mixer_ctl *ctl;
6251 char *mixer_ctl_name = "Device PP Params";
6252 int ret = 0;
6253 uint32_t set_values[] = {0,0};
6254
6255 set_values[0] = param;
6256 set_values[1] = value;
6257
6258 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
6259 if (!ctl) {
6260 ALOGE("%s: Could not get ctl for mixer cmd - %s",
6261 __func__, mixer_ctl_name);
6262 ret = -EINVAL;
6263 goto end;
6264 }
6265
6266 ALOGV("%s: Setting device pp params param: %d, value %d mixer ctrl:%s",
6267 __func__,param, value, mixer_ctl_name);
6268 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
6269
6270end:
6271 return ret;
6272}
Narsinga Rao Chellaf928a982015-03-06 14:57:35 -08006273
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08006274bool platform_can_enable_spkr_prot_on_device(snd_device_t snd_device)
6275{
6276 bool ret = false;
6277
6278 if (snd_device == SND_DEVICE_OUT_SPEAKER ||
6279 snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
6280 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
Rohit kumarf4120402016-08-05 19:19:48 +05306281 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
6282 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
6283 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2) {
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08006284 ret = true;
6285 }
6286
6287 return ret;
6288}
6289
6290int platform_get_spkr_prot_acdb_id(snd_device_t snd_device)
6291{
6292 int acdb_id;
6293
6294 switch(snd_device) {
6295 case SND_DEVICE_OUT_SPEAKER:
6296 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED);
6297 break;
6298 case SND_DEVICE_OUT_VOICE_SPEAKER:
6299 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
6300 break;
Rohit kumarf4120402016-08-05 19:19:48 +05306301 case SND_DEVICE_OUT_VOICE_SPEAKER_2:
6302 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
6303 break;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08006304 case SND_DEVICE_OUT_SPEAKER_VBAT:
6305 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
6306 break;
6307 case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
6308 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT);
6309 break;
Rohit kumarf4120402016-08-05 19:19:48 +05306310 case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
6311 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT);
6312 break;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08006313 default:
6314 acdb_id = -EINVAL;
6315 break;
6316 }
6317 return acdb_id;
6318}
6319
6320int platform_get_spkr_prot_snd_device(snd_device_t snd_device)
6321{
6322 if (!audio_extn_spkr_prot_is_enabled())
6323 return snd_device;
6324
6325 switch(snd_device) {
6326 case SND_DEVICE_OUT_SPEAKER:
6327 return SND_DEVICE_OUT_SPEAKER_PROTECTED;
6328 case SND_DEVICE_OUT_VOICE_SPEAKER:
6329 return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
Rohit kumarf4120402016-08-05 19:19:48 +05306330 case SND_DEVICE_OUT_VOICE_SPEAKER_2:
6331 return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08006332 case SND_DEVICE_OUT_SPEAKER_VBAT:
6333 return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
6334 case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
6335 return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
Rohit kumarf4120402016-08-05 19:19:48 +05306336 case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
6337 return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08006338 default:
6339 return snd_device;
6340 }
6341}
Rohit kumarf4120402016-08-05 19:19:48 +05306342int platform_get_vi_feedback_snd_device(snd_device_t snd_device)
6343{
6344 switch(snd_device) {
6345 case SND_DEVICE_OUT_SPEAKER_PROTECTED:
6346 case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
6347 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
6348 case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
6349 case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
6350 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1;
6351 case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
6352 case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
6353 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2;
6354 default:
6355 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
6356 }
6357}
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08006358
Venkata Narendra Kumar Gutta7f4817f2016-01-29 14:15:53 +05306359int platform_spkr_prot_is_wsa_analog_mode(void *adev __unused)
6360{
6361 return 0;
6362}
6363
Narsinga Rao Chellaf928a982015-03-06 14:57:35 -08006364/*
6365 * This is a lookup table to map android audio input device to audio h/w interface (backend).
6366 * The table can be extended for other input devices by adding appropriate entries.
6367 * Also the audio interface for a particular input device can be overriden by adding
6368 * corresponding entry in audio_platform_info.xml file.
6369 */
6370struct audio_device_to_audio_interface audio_device_to_interface_table[] = {
6371 {AUDIO_DEVICE_IN_BUILTIN_MIC, ENUM_TO_STRING(AUDIO_DEVICE_IN_BUILTIN_MIC), "SLIMBUS_0"},
6372 {AUDIO_DEVICE_IN_BACK_MIC, ENUM_TO_STRING(AUDIO_DEVICE_IN_BACK_MIC), "SLIMBUS_0"},
6373};
6374
6375int audio_device_to_interface_table_len =
6376 sizeof(audio_device_to_interface_table) / sizeof(audio_device_to_interface_table[0]);
6377
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05306378int platform_set_audio_device_interface(const char *device_name, const char *intf_name,
6379 const char *codec_type __unused)
Narsinga Rao Chellaf928a982015-03-06 14:57:35 -08006380{
6381 int ret = 0;
6382 int i;
6383
6384 if (device_name == NULL || intf_name == NULL) {
6385 ALOGE("%s: Invalid input", __func__);
6386
6387 ret = -EINVAL;
6388 goto done;
6389 }
6390
6391 ALOGD("%s: Enter, device name:%s, intf name:%s", __func__, device_name, intf_name);
6392
6393 size_t device_name_len = strlen(device_name);
6394 for (i = 0; i < audio_device_to_interface_table_len; i++) {
6395 char* name = audio_device_to_interface_table[i].device_name;
6396 size_t name_len = strlen(name);
6397 if ((name_len == device_name_len) &&
6398 (strncmp(device_name, name, name_len) == 0)) {
6399 ALOGD("%s: Matched device name:%s, overwrite intf name with %s",
6400 __func__, device_name, intf_name);
6401
6402 strlcpy(audio_device_to_interface_table[i].interface_name, intf_name,
6403 sizeof(audio_device_to_interface_table[i].interface_name));
6404 goto done;
6405 }
6406 }
6407 ALOGE("%s: Could not find matching device name %s",
6408 __func__, device_name);
6409
6410 ret = -EINVAL;
6411
6412done:
6413 return ret;
6414}
Laxminath Kasam44f49402015-05-29 18:37:11 +05306415
Kuirong Wang1cad7142016-05-24 15:21:56 -07006416int platform_set_sidetone(struct audio_device *adev,
6417 snd_device_t out_snd_device,
6418 bool enable,
6419 char *str)
6420{
6421 int ret;
Ashish Jain3e37a702016-11-25 12:27:15 +05306422 if ((out_snd_device == SND_DEVICE_OUT_USB_HEADSET) ||
6423 (out_snd_device == SND_DEVICE_OUT_USB_HEADPHONES)) {
Haynes Mathew Georgeb2789322016-11-22 11:55:40 -08006424 if (property_get_bool("audio.usb.disable.sidetone", 0)) {
Haynes Mathew George492a6c42016-10-28 11:41:43 -07006425 ALOGI("Debug: Disable sidetone");
6426 } else {
Kuirong Wang1cad7142016-05-24 15:21:56 -07006427 ret = audio_extn_usb_enable_sidetone(out_snd_device, enable);
Vikram Panduranga6e761cd2016-10-12 16:50:52 -07006428 if (ret) {
6429 /*fall back to AFE sidetone*/
6430 ALOGV("%s: No USB sidetone supported, switching to AFE sidetone",
6431 __func__);
6432
6433 if (enable)
6434 audio_route_apply_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
6435 else
6436 audio_route_reset_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
6437 }
Haynes Mathew George492a6c42016-10-28 11:41:43 -07006438 }
Kuirong Wang1cad7142016-05-24 15:21:56 -07006439 } else {
6440 ALOGV("%s: sidetone out device(%d) mixer cmd = %s\n",
6441 __func__, out_snd_device, str);
Laxminath Kasam44f49402015-05-29 18:37:11 +05306442
Vikram Panduranga6e761cd2016-10-12 16:50:52 -07006443 if (enable) {
6444 ret = audio_route_apply_and_update_path(adev->audio_route, str);
6445 if (ret) {
6446 ALOGV("%s: No device sidetone supported, switching to AFE sidetone",
6447 __func__);
6448 audio_route_apply_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
6449 }
6450 }
6451 else {
6452 ret = audio_route_reset_and_update_path(adev->audio_route, str);
6453 if (ret) {
6454 ALOGV("%s: No device sidetone supported, switching to AFE sidetone",
6455 __func__);
6456 audio_route_reset_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
6457 }
6458 }
Kuirong Wang1cad7142016-05-24 15:21:56 -07006459 }
6460 return 0;
6461}
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08006462
Vidyakumar Athotaea269c62016-10-31 09:05:59 -07006463void platform_update_aanc_path(struct audio_device *adev,
6464 snd_device_t out_snd_device,
6465 bool enable,
6466 char *str)
6467{
6468 ALOGD("%s: aanc out device(%d) mixer cmd = %s, enable = %d\n",
6469 __func__, out_snd_device, str, enable);
6470
6471 if (enable)
6472 audio_route_apply_and_update_path(adev->audio_route, str);
6473 else
6474 audio_route_reset_and_update_path(adev->audio_route, str);
6475
6476 return;
6477}
6478
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08006479static void make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
6480 int acdb_device_type, int app_type, int topology_id,
6481 int sample_rate, uint32_t module_id, uint32_t param_id, bool persist)
6482{
6483 int persist_send_flags = 1;
6484
6485 if (!cal) {
6486 return;
6487 }
6488
6489 if (persist)
6490 persist_send_flags |= 0x2;
6491
6492 memset(cal, 0, sizeof(acdb_audio_cal_cfg_t));
6493
6494 cal->persist = persist;
6495 cal->app_type = app_type;
6496 cal->acdb_dev_id = acdb_dev_id;
6497 cal->sampling_rate = sample_rate;
6498 cal->topo_id = topology_id;
6499 //if module and param id is set to 0, the whole blob will be stored
6500 //or sent to the DSP
6501 cal->module_id = module_id;
6502 cal->param_id = param_id;
6503 cal->cal_type = acdb_device_type;
6504 cal->persist = persist;
6505
6506}
6507
6508int platform_send_audio_cal(void* platform, int acdb_dev_id,
6509 int acdb_device_type, int app_type, int topology_id, int sample_rate,
6510 uint32_t module_id, uint32_t param_id, void* data, int length, bool persist)
6511{
6512 int ret = 0;
6513 struct platform_data *my_data = (struct platform_data *)platform;
6514 acdb_audio_cal_cfg_t cal;
6515 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
6516
6517 if (!my_data) {
6518 ret = -EINVAL;
6519 goto ERROR_RETURN;
6520 }
6521
6522 make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
6523 sample_rate, module_id, param_id, true);
6524
6525 if (my_data->acdb_set_audio_cal) {
6526 // persist audio cal in local cache
6527 if (persist) {
6528 ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
6529 }
6530 // send audio cal to dsp
6531 if (ret == 0) {
6532 cal.persist = false;
6533 ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
6534 if (persist && (ret != 0)) {
6535 ALOGV("[%s] audio cal stored with success, ignore set cal failure", __func__);
6536 ret = 0;
6537 }
6538 }
6539 }
6540
6541ERROR_RETURN:
6542 return ret;
6543}
6544
6545int platform_get_audio_cal(void* platform, int acdb_dev_id,
6546 int acdb_device_type, int app_type, int topology_id,
6547 int sample_rate, uint32_t module_id, uint32_t param_id,
6548 void* data, int* length, bool persist)
6549{
6550 int ret = 0;
6551 struct platform_data *my_data = (struct platform_data *)platform;
6552 acdb_audio_cal_cfg_t cal;
6553 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
6554
6555 if (!my_data) {
6556 ret = -EINVAL;
6557 goto ERROR_RETURN;
6558 }
6559
6560 make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
6561 sample_rate, module_id, param_id, false);
6562
6563 if (my_data->acdb_get_audio_cal) {
6564 // get cal from dsp
6565 ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
6566 // get cached cal if prevoius attempt fails and persist flag is set
6567 if ((ret != 0) && persist) {
6568 cal.persist = true;
6569 ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
6570 }
6571 }
6572
6573ERROR_RETURN:
6574 return ret;
6575}
6576
6577int platform_store_audio_cal(void* platform, int acdb_dev_id,
6578 int acdb_device_type, int app_type, int topology_id,
6579 int sample_rate, uint32_t module_id, uint32_t param_id,
6580 void* data, int length)
6581{
6582 int ret = 0;
6583 struct platform_data *my_data = (struct platform_data *)platform;
6584 acdb_audio_cal_cfg_t cal;
6585 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
6586
6587 if (!my_data) {
6588 ret = -EINVAL;
6589 goto ERROR_RETURN;
6590 }
6591
6592 make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
6593 sample_rate, module_id, param_id, true);
6594
6595 if (my_data->acdb_set_audio_cal) {
6596 ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
6597 }
6598
6599ERROR_RETURN:
6600 return ret;
6601}
6602
6603int platform_retrieve_audio_cal(void* platform, int acdb_dev_id,
6604 int acdb_device_type, int app_type, int topology_id,
6605 int sample_rate, uint32_t module_id, uint32_t param_id,
6606 void* data, int* length)
6607{
6608 int ret = 0;
6609 struct platform_data *my_data = (struct platform_data *)platform;
6610 acdb_audio_cal_cfg_t cal;
6611 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
6612
6613 if (!my_data) {
6614 ret = -EINVAL;
6615 goto ERROR_RETURN;
6616 }
6617
6618 make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
6619 sample_rate, module_id, param_id, true);
6620
6621 if (my_data->acdb_get_audio_cal) {
6622 ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
6623 }
6624
6625ERROR_RETURN:
6626 return ret;
6627}
Divya Narayanan Poojary45f19192016-09-30 18:52:13 +05306628
6629int platform_get_max_mic_count(void *platform) {
6630 struct platform_data *my_data = (struct platform_data *)platform;
6631 return my_data->max_mic_count;
6632}
Aniket Kumar Lataf56b6402016-10-27 12:03:18 -07006633
6634static struct amp_db_and_gain_table tbl_mapping[MAX_VOLUME_CAL_STEPS];
6635static int num_gain_tbl_entry = 0;
6636
6637bool platform_add_gain_level_mapping(struct amp_db_and_gain_table *tbl_entry) {
6638
6639 ALOGV("%s: enter .. add %f %f %d", __func__, tbl_entry->amp, tbl_entry->db, tbl_entry->level);
6640 if (num_gain_tbl_entry == -1) {
6641 ALOGE("%s: num entry beyond valid step levels or corrupted..rejecting custom mapping",
6642 __func__);
6643 return false;
6644 }
6645
6646 if (num_gain_tbl_entry >= MAX_VOLUME_CAL_STEPS) {
6647 ALOGE("%s: max entry reached max[%d] current index[%d] .. rejecting", __func__,
6648 MAX_VOLUME_CAL_STEPS, num_gain_tbl_entry);
6649 num_gain_tbl_entry = -1; // indicates error and no more info will be cached
6650 return false;
6651 }
6652
6653 if (num_gain_tbl_entry > 0 && tbl_mapping[num_gain_tbl_entry - 1].amp >= tbl_entry->amp) {
6654 ALOGE("%s: value not in ascending order .. rejecting custom mapping", __func__);
6655 num_gain_tbl_entry = -1; // indicates error and no more info will be cached
6656 return false;
6657 }
6658
6659 tbl_mapping[num_gain_tbl_entry] = *tbl_entry;
6660 ++num_gain_tbl_entry;
6661
6662 return true;
6663}
6664
6665int platform_get_gain_level_mapping(struct amp_db_and_gain_table *mapping_tbl,
6666 int table_size) {
6667 int itt = 0;
6668 ALOGV("platform_get_gain_level_mapping called ");
6669
6670 if (num_gain_tbl_entry <= 0 || num_gain_tbl_entry > MAX_VOLUME_CAL_STEPS) {
6671 ALOGD("%s: empty or currupted gain_mapping_table", __func__);
6672 return 0;
6673 }
6674
6675 for (; itt < num_gain_tbl_entry && itt <= table_size; itt++) {
6676 mapping_tbl[itt] = tbl_mapping[itt];
6677 ALOGV("%s: added amp[%f] db[%f] level[%d]", __func__,
6678 mapping_tbl[itt].amp, mapping_tbl[itt].db, mapping_tbl[itt].level);
6679 }
6680
6681 return num_gain_tbl_entry;
6682}