blob: 6bb7eb2b0d139a6a55190fe3368cea32d9b6b4a4 [file] [log] [blame]
Naresh Tannirue3b18452014-03-04 14:44:27 +05301/*
Walter Yangfd3f3252017-01-03 01:35:23 -08002 * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303 * Not a Contribution.
4 *
Naresh Tannirue3b18452014-03-04 14:44:27 +05305 * Copyright (C) 2013 The Android Open Source Project
6 *
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
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053020#define LOG_TAG "msm8916_platform"
Naresh Tannirue3b18452014-03-04 14:44:27 +053021/*#define LOG_NDEBUG 0*/
22#define LOG_NDDEBUG 0
23
24#include <stdlib.h>
25#include <dlfcn.h>
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +053026#include <fcntl.h>
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -070027#include <sys/ioctl.h>
Naresh Tannirue3b18452014-03-04 14:44:27 +053028#include <cutils/log.h>
29#include <cutils/properties.h>
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053030#include <cutils/str_parms.h>
Naresh Tannirue3b18452014-03-04 14:44:27 +053031#include <audio_hw.h>
32#include <platform_api.h>
33#include "platform.h"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053034#include "audio_extn.h"
Vignesh Kulothungan55396882017-04-20 14:37:02 -070035#include "acdb.h"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053036#include "voice_extn.h"
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +053037#include "edid.h"
38#include "sound/compress_params.h"
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +053039#include "sound/msmcal-hwdep.h"
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +053040#include <dirent.h>
Sharad Sangleaca972a2017-01-25 12:38:22 +053041#include <linux/msm_audio.h>
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +053042
Haynes Mathew Georgeef514882017-05-01 17:46:23 -070043#if defined(PLATFORM_MSMFALCON)
44#include <sound/devdep_params.h>
45#endif
46
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +053047#ifdef DYNAMIC_LOG_ENABLED
48#include <log_xml_parser.h>
49#define LOG_MASK HAL_MOD_FILE_PLATFORM
50#include <log_utils.h>
51#endif
52
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +053053#define SOUND_TRIGGER_DEVICE_HANDSET_MONO_LOW_POWER_ACDB_ID (100)
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +053054#define MAX_MIXER_XML_PATH 100
Naresh Tanniru10758b62017-06-05 21:05:53 +053055#define MIXER_XML_PATH_QRD_SKUH "/vendor/etc/mixer_paths_qrd_skuh.xml"
56#define MIXER_XML_PATH_QRD_SKUI "/vendor/etc/mixer_paths_qrd_skui.xml"
57#define MIXER_XML_PATH_QRD_SKUHF "/vendor/etc/mixer_paths_qrd_skuhf.xml"
58#define MIXER_XML_PATH_SKUK "/vendor/etc/mixer_paths_skuk.xml"
59#define MIXER_XML_PATH_SKUA "/vendor/etc/mixer_paths_skua.xml"
60#define MIXER_XML_PATH_SKUC "/vendor/etc/mixer_paths_skuc.xml"
61#define MIXER_XML_PATH_SKUE "/vendor/etc/mixer_paths_skue.xml"
62#define MIXER_XML_PATH_SKUL "/vendor/etc/mixer_paths_skul.xml"
63#define MIXER_XML_PATH_SKUS "/vendor/etc/mixer_paths_skus.xml"
64#define MIXER_XML_PATH_SKUSH "/vendor/etc/mixer_paths_skush.xml"
65#define MIXER_XML_PATH_QRD_SKUT "/vendor/etc/mixer_paths_qrd_skut.xml"
66#define MIXER_XML_PATH_SKUM "/vendor/etc/mixer_paths_qrd_skum.xml"
67#define MIXER_XML_PATH_SKU1 "/vendor/etc/mixer_paths_qrd_sku1.xml"
68#define MIXER_XML_PATH_SKUN_CAJON "/vendor/etc/mixer_paths_qrd_skun_cajon.xml"
69#define MIXER_XML_PATH_SKU3 "/vendor/etc/mixer_paths_qrd_sku3.xml"
70#define MIXER_XML_PATH_AUXPCM "/vendor/etc/mixer_paths_auxpcm.xml"
71#define MIXER_XML_PATH_AUXPCM "/vendor/etc/mixer_paths_auxpcm.xml"
72#define MIXER_XML_PATH_I2S "/vendor/etc/mixer_paths_i2s.xml"
73#define MIXER_XML_PATH_WCD9306 "/vendor/etc/mixer_paths_wcd9306.xml"
74#define MIXER_XML_PATH_WCD9330 "/vendor/etc/mixer_paths_wcd9330.xml"
75#define MIXER_XML_PATH_WCD9340 "/vendor/etc/mixer_paths_wcd9340.xml"
Yamit Mehtaa0d653a2016-11-25 20:33:25 +053076#ifdef LINUX_ENABLED
Rohit Kumarb7d4dff2016-12-26 13:20:39 +053077/* For LE platforms */
Yamit Mehtaa0d653a2016-11-25 20:33:25 +053078#define MIXER_XML_PATH "/etc/mixer_paths.xml"
79#define MIXER_XML_PATH_MSM8909_PM8916 "/etc/mixer_paths_msm8909_pm8916.xml"
80#define MIXER_XML_PATH_MTP "/etc/mixer_paths_mtp.xml"
81#define MIXER_XML_PATH_SKU2 "/etc/mixer_paths_qrd_sku2.xml"
82#define MIXER_XML_PATH_WCD9326 "/etc/mixer_paths_wcd9326.xml"
Rohit Kumarb7d4dff2016-12-26 13:20:39 +053083#define MIXER_XML_PATH_WCD9335 "/etc/mixer_paths_wcd9335.xml"
Yamit Mehtaa0d653a2016-11-25 20:33:25 +053084#define PLATFORM_INFO_XML_PATH_EXTCODEC "/etc/audio_platform_info_extcodec.xml"
Walter Yangb3540112017-03-01 14:05:03 +080085#define PLATFORM_INFO_XML_PATH_SKUSH "/etc/audio_platform_info_skush.xml"
Yamit Mehtaa0d653a2016-11-25 20:33:25 +053086#define PLATFORM_INFO_XML_PATH "/etc/audio_platform_info.xml"
87#define MIXER_XML_PATH_WCD9326_I2S "/etc/mixer_paths_wcd9326_i2s.xml"
88#define MIXER_XML_PATH_WCD9330_I2S "/etc/mixer_paths_wcd9330_i2s.xml"
Siena Richard264ed052017-03-17 10:35:01 -070089#define MIXER_XML_PATH_WCD9335_I2S "/etc/mixer_paths_wcd9335_i2s.xml"
Yamit Mehtaa0d653a2016-11-25 20:33:25 +053090#define MIXER_XML_PATH_SBC "/etc/mixer_paths_sbc.xml"
91#else
Naresh Tanniru10758b62017-06-05 21:05:53 +053092#define MIXER_XML_PATH "/vendor/etc/mixer_paths.xml"
93#define MIXER_XML_PATH_MSM8909_PM8916 "/vendor/etc/mixer_paths_msm8909_pm8916.xml"
94#define MIXER_XML_PATH_MTP "/vendor/etc/mixer_paths_mtp.xml"
95#define MIXER_XML_PATH_SKU2 "/vendor/etc/mixer_paths_qrd_sku2.xml"
96#define PLATFORM_INFO_XML_PATH_EXTCODEC "/vendor/etc/audio_platform_info_extcodec.xml"
97#define PLATFORM_INFO_XML_PATH_SKUSH "/vendor/etc/audio_platform_info_skush.xml"
98#define MIXER_XML_PATH_WCD9326 "/vendor/etc/mixer_paths_wcd9326.xml"
99#define MIXER_XML_PATH_WCD9335 "/vendor/etc/mixer_paths_wcd9335.xml"
100#define MIXER_XML_PATH_SKUN "/vendor/etc/mixer_paths_qrd_skun.xml"
101#define PLATFORM_INFO_XML_PATH "/vendor/etc/audio_platform_info.xml"
102#define MIXER_XML_PATH_WCD9326_I2S "/vendor/etc/mixer_paths_wcd9326_i2s.xml"
103#define MIXER_XML_PATH_WCD9330_I2S "/vendor/etc/mixer_paths_wcd9330_i2s.xml"
104#define MIXER_XML_PATH_WCD9335_I2S "/vendor/etc/mixer_paths_wcd9335_i2s.xml"
105#define MIXER_XML_PATH_SBC "/vendor/etc/mixer_paths_sbc.xml"
Yamit Mehtaa0d653a2016-11-25 20:33:25 +0530106#endif
Naresh Tanniru10758b62017-06-05 21:05:53 +0530107#define MIXER_XML_PATH_SKUN "/vendor/etc/mixer_paths_qrd_skun.xml"
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530108
Naresh Tannirue3b18452014-03-04 14:44:27 +0530109#define LIB_ACDB_LOADER "libacdbloader.so"
Avinash Vaish71c066d2014-08-27 12:32:35 +0530110#define CVD_VERSION_MIXER_CTL "CVD Version"
Naresh Tannirue3b18452014-03-04 14:44:27 +0530111
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +0530112#define FLAC_COMPRESS_OFFLOAD_FRAGMENT_SIZE (256 * 1024)
113#define MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE (2 * 1024 * 1024)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530114#define MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE (2 * 1024)
115#define COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING (2 * 1024)
116#define COMPRESS_OFFLOAD_FRAGMENT_SIZE (32 * 1024)
Vikram Panduranga7e784962016-10-27 12:32:30 -0700117#define DEFAULT_RX_BACKEND "SLIMBUS_0_RX"
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530118
119/*
Naresh Tannirue3b18452014-03-04 14:44:27 +0530120 * This file will have a maximum of 38 bytes:
121 *
122 * 4 bytes: number of audio blocks
123 * 4 bytes: total length of Short Audio Descriptor (SAD) blocks
124 * Maximum 10 * 3 bytes: SAD blocks
125 */
126#define MAX_SAD_BLOCKS 10
127#define SAD_BLOCK_SIZE 3
Avinash Vaish71c066d2014-08-27 12:32:35 +0530128#define MAX_CVD_VERSION_STRING_SIZE 100
Karthik Reddy Katta8513f432016-04-12 14:29:27 +0530129#define MAX_SND_CARD_STRING_SIZE 100
Naresh Tannirue3b18452014-03-04 14:44:27 +0530130
131/* EDID format ID for LPCM audio */
132#define EDID_FORMAT_LPCM 1
133
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700134/* fallback app type if the default app type from acdb loader fails */
135#define DEFAULT_APP_TYPE 0x11130
Naresh Tanniru2727f822015-05-11 15:27:08 +0530136#define DEFAULT_APP_TYPE_RX_PATH 0x11130
137#define DEFAULT_APP_TYPE_TX_PATH 0x11132
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700138
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530139#define SAMPLE_RATE_8KHZ 8000
140#define SAMPLE_RATE_16KHZ 16000
141
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530142#define MAX_SET_CAL_BYTE_SIZE 65536
143
Vikram Panduranga6e761cd2016-10-12 16:50:52 -0700144/* Mixer path names */
145#define AFE_SIDETONE_MIXER_PATH "afe-sidetone"
146
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530147#define AUDIO_PARAMETER_KEY_FLUENCE_TYPE "fluence"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530148#define AUDIO_PARAMETER_KEY_SLOWTALK "st_enable"
Avinash Vaishd5fa4572014-09-15 14:41:14 +0530149#define AUDIO_PARAMETER_KEY_HD_VOICE "hd_voice"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530150#define AUDIO_PARAMETER_KEY_VOLUME_BOOST "volume_boost"
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530151#define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data"
152#define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
153
Rohit kumarf4120402016-08-05 19:19:48 +0530154#define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
155
Karthik Reddy Katta8513f432016-04-12 14:29:27 +0530156/* Reload ACDB files from specified path */
157#define AUDIO_PARAMETER_KEY_RELOAD_ACDB "reload_acdb"
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530158
159/* Query external audio device connection status */
160#define AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE "ext_audio_device"
161
162#define EVENT_EXTERNAL_SPK_1 "qc_ext_spk_1"
163#define EVENT_EXTERNAL_SPK_2 "qc_ext_spk_2"
164#define EVENT_EXTERNAL_MIC "qc_ext_mic"
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530165#define MAX_CAL_NAME 20
Naresh Tanniru34a303c2016-01-27 17:26:41 +0530166#define MAX_MIME_TYPE_LENGTH 30
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530167
Vikram Pandurangadf59cae2017-08-03 18:04:55 -0700168#define GET_IN_DEVICE_INDEX(SND_DEVICE) ((SND_DEVICE) - (SND_DEVICE_IN_BEGIN))
169
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530170char cal_name_info[WCD9XXX_MAX_CAL][MAX_CAL_NAME] = {
171 [WCD9XXX_ANC_CAL] = "anc_cal",
172 [WCD9XXX_MBHC_CAL] = "mbhc_cal",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700173 [WCD9XXX_VBAT_CAL] = "vbat_cal",
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530174};
175
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530176#define AUDIO_PARAMETER_KEY_REC_PLAY_CONC "rec_play_conc_on"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530177
Sidipotu Ashokf490be52015-10-20 10:41:34 +0530178#define AUDIO_PARAMETER_IS_HW_DECODER_SESSION_AVAILABLE "is_hw_dec_session_available"
Sidipotu Ashok42483b62015-09-08 10:21:44 +0530179
Naresh Tanniru25873b82016-11-01 14:15:28 +0530180static char *default_rx_backend = NULL;
181
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +0530182#ifdef DYNAMIC_LOG_ENABLED
183extern void log_utils_init(void);
184extern void log_utils_deinit(void);
185#endif
186
Naresh Tanniru34a303c2016-01-27 17:26:41 +0530187char dsp_only_decoders_mime[][MAX_MIME_TYPE_LENGTH] = {
Sidipotu Ashok42483b62015-09-08 10:21:44 +0530188 "audio/x-ms-wma" /* wma*/ ,
189 "audio/x-ms-wma-lossless" /* wma lossless */ ,
190 "audio/x-ms-wma-pro" /* wma prop */ ,
191 "audio/amr-wb-plus" /* amr wb plus */ ,
192 "audio/alac" /*alac */ ,
193 "audio/x-ape" /*ape */,
194};
195
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530196enum {
197 VOICE_FEATURE_SET_DEFAULT,
198 VOICE_FEATURE_SET_VOLUME_BOOST
199};
200
Naresh Tannirue3b18452014-03-04 14:44:27 +0530201struct audio_block_header
202{
203 int reserved;
204 int length;
205};
206
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530207typedef struct acdb_audio_cal_cfg {
208 uint32_t persist;
209 uint32_t snd_dev_id;
210 audio_devices_t dev_id;
211 int32_t acdb_dev_id;
212 uint32_t app_type;
213 uint32_t topo_id;
214 uint32_t sampling_rate;
215 uint32_t cal_type;
216 uint32_t module_id;
217 uint32_t param_id;
218} acdb_audio_cal_cfg_t;
219
Sharad Sangleaca972a2017-01-25 12:38:22 +0530220enum {
221 CAL_MODE_SEND = 0x1,
222 CAL_MODE_PERSIST = 0x2,
223 CAL_MODE_RTAC = 0x4
224};
225
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530226acdb_loader_get_calibration_t acdb_loader_get_calibration;
Naresh Tannirue3b18452014-03-04 14:44:27 +0530227
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +0530228typedef struct codec_backend_cfg {
229 uint32_t sample_rate;
230 uint32_t bit_width;
Ashish Jaind84fd6a2016-07-27 12:33:25 +0530231 uint32_t channels;
Siddartha Shaik44dd7702017-06-14 12:13:25 +0530232 uint32_t format;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +0530233 char *bitwidth_mixer_ctl;
234 char *samplerate_mixer_ctl;
Ashish Jaind84fd6a2016-07-27 12:33:25 +0530235 char *channels_mixer_ctl;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +0530236} codec_backend_cfg_t;
237
Ashish Jain4826f6c2017-02-06 13:33:20 +0530238static native_audio_prop na_props = {0, 0, NATIVE_AUDIO_MODE_INVALID};
Ashish Jainf1eaa582016-05-23 20:54:24 +0530239static bool supports_true_32_bit = false;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +0530240
Siena Richard7c2db772016-12-21 11:32:34 -0800241static int max_be_dai_names = 0;
242static const struct be_dai_name_struct *be_dai_name_table;
243
Naresh Tannirue3b18452014-03-04 14:44:27 +0530244struct platform_data {
245 struct audio_device *adev;
246 bool fluence_in_spkr_mode;
247 bool fluence_in_voice_call;
248 bool fluence_in_voice_rec;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530249 bool fluence_in_audio_rec;
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +0530250 bool fluence_in_hfp_call;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530251 bool external_spk_1;
252 bool external_spk_2;
253 bool external_mic;
Vignesh Kulothungan3b5fae52017-09-25 12:16:30 -0700254 bool speaker_lr_swap;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530255 int fluence_type;
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +0530256 char fluence_cap[PROPERTY_VALUE_MAX];
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +0530257 int fluence_mode;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530258 bool slowtalk;
Avinash Vaishd5fa4572014-09-15 14:41:14 +0530259 bool hd_voice;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +0530260 bool ec_ref_enabled;
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +0530261 bool is_wsa_speaker;
Ramjee Singh203473b2015-06-09 15:18:42 +0530262 bool is_acdb_initialized;
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +0530263 bool hifi_audio;
Banajit Goswami20cdd212015-09-11 01:11:30 -0700264 /* Vbat monitor related flags */
265 bool is_vbat_speaker;
266 bool gsm_mode_enabled;
Rohit kumarf4120402016-08-05 19:19:48 +0530267 int mono_speaker;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530268 /* Audio calibration related functions */
269 void *acdb_handle;
270 int voice_feature_set;
271 acdb_init_t acdb_init;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530272 acdb_init_v3_t acdb_init_v3;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530273 acdb_deallocate_t acdb_deallocate;
274 acdb_send_audio_cal_t acdb_send_audio_cal;
Siena Richard7c2db772016-12-21 11:32:34 -0800275 acdb_send_audio_cal_v3_t acdb_send_audio_cal_v3;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530276 acdb_set_audio_cal_t acdb_set_audio_cal;
277 acdb_get_audio_cal_t acdb_get_audio_cal;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530278 acdb_send_voice_cal_t acdb_send_voice_cal;
279 acdb_reload_vocvoltable_t acdb_reload_vocvoltable;
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700280 acdb_get_default_app_type_t acdb_get_default_app_type;
Ben Rombergerfeca4b82015-07-07 20:40:44 -0700281 acdb_send_common_top_t acdb_send_common_top;
Banajit Goswami20cdd212015-09-11 01:11:30 -0700282 acdb_set_codec_data_t acdb_set_codec_data;
Karthik Reddy Katta8513f432016-04-12 14:29:27 +0530283 acdb_reload_t acdb_reload;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530284 acdb_reload_v2_t acdb_reload_v2;
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530285#ifdef RECORD_PLAY_CONCURRENCY
286 bool rec_play_conc_set;
287#endif
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530288 void *hw_info;
Sharad Sangleaca972a2017-01-25 12:38:22 +0530289 acdb_send_gain_dep_cal_t acdb_send_gain_dep_cal;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530290 struct csd_data *csd;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530291 void *edid_info;
292 bool edid_valid;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700293 int ext_disp_type;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +0530294 codec_backend_cfg_t current_backend_cfg[MAX_CODEC_BACKENDS];
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -0700295 char ec_ref_mixer_path[64];
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +0530296 char codec_version[CODEC_VERSION_MAX_LENGTH];
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +0530297 int hw_dep_fd;
Karthik Reddy Katta8513f432016-04-12 14:29:27 +0530298 char cvd_version[MAX_CVD_VERSION_STRING_SIZE];
299 char snd_card_name[MAX_SND_CARD_STRING_SIZE];
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530300 int source_mic_type;
301 int max_mic_count;
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +0530302 bool is_dsd_supported;
303 bool is_asrc_supported;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +0530304 struct listnode acdb_meta_key_list;
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +0530305 bool use_generic_handset;
Naresh Tannirue3b18452014-03-04 14:44:27 +0530306};
307
Venkata Narendra Kumar Guttaed408a12015-03-31 20:24:04 +0530308static bool is_external_codec = false;
Sachin Mohan Gadag1ec7fab2016-12-12 17:41:26 +0530309static bool is_slimbus_interface = false;
Venkata Narendra Kumar Guttaed408a12015-03-31 20:24:04 +0530310
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530311int pcm_device_table[AUDIO_USECASE_MAX][2] = {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530312 [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE,
313 DEEP_BUFFER_PCM_DEVICE},
314 [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
315 LOWLATENCY_PCM_DEVICE},
316 [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE,
317 MULTIMEDIA2_PCM_DEVICE},
Haynes Mathew George484e8d22017-07-31 18:55:17 -0700318 [USECASE_AUDIO_PLAYBACK_HIFI] = {MULTIMEDIA2_PCM_DEVICE,
319 MULTIMEDIA2_PCM_DEVICE},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530320 [USECASE_AUDIO_PLAYBACK_OFFLOAD] =
321 {PLAYBACK_OFFLOAD_DEVICE, PLAYBACK_OFFLOAD_DEVICE},
Dhananjay Kumara68d7af2015-05-25 19:11:30 +0530322 /* Below entries are initialized with invalid values
323 * Valid values should be updated from fnc platform_info_init()
324 * based on pcm ids defined in audio_platform_info.xml.
325 */
326 [USECASE_AUDIO_PLAYBACK_OFFLOAD2] = {-1, -1},
327 [USECASE_AUDIO_PLAYBACK_OFFLOAD3] = {-1, -1},
328 [USECASE_AUDIO_PLAYBACK_OFFLOAD4] = {-1, -1},
329 [USECASE_AUDIO_PLAYBACK_OFFLOAD5] = {-1, -1},
330 [USECASE_AUDIO_PLAYBACK_OFFLOAD6] = {-1, -1},
331 [USECASE_AUDIO_PLAYBACK_OFFLOAD7] = {-1, -1},
332 [USECASE_AUDIO_PLAYBACK_OFFLOAD8] = {-1, -1},
333 [USECASE_AUDIO_PLAYBACK_OFFLOAD9] = {-1, -1},
Naresh Tanniru3a7dbe72015-06-25 20:08:01 -0700334 [USECASE_AUDIO_PLAYBACK_ULL] = {MULTIMEDIA3_PCM_DEVICE, MULTIMEDIA3_PCM_DEVICE},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530335 [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
336 [USECASE_AUDIO_RECORD_COMPRESS] = {COMPRESS_CAPTURE_DEVICE, COMPRESS_CAPTURE_DEVICE},
Dhananjay Kumaree4d2002016-10-25 18:02:58 +0530337 [USECASE_AUDIO_RECORD_COMPRESS2] = {-1, -1},
338 [USECASE_AUDIO_RECORD_COMPRESS3] = {-1, -1},
339 [USECASE_AUDIO_RECORD_COMPRESS4] = {-1, -1},
Dhananjay Kumar376e38b2017-09-28 22:26:23 +0530340 [USECASE_AUDIO_RECORD_COMPRESS5] = {-1, -1},
341 [USECASE_AUDIO_RECORD_COMPRESS6] = {-1, -1},
342
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530343 [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
344 LOWLATENCY_PCM_DEVICE},
345 [USECASE_AUDIO_RECORD_FM_VIRTUAL] = {MULTIMEDIA2_PCM_DEVICE,
346 MULTIMEDIA2_PCM_DEVICE},
Haynes Mathew George484e8d22017-07-31 18:55:17 -0700347 [USECASE_AUDIO_RECORD_HIFI] = {MULTIMEDIA2_PCM_DEVICE,
348 MULTIMEDIA2_PCM_DEVICE},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530349 [USECASE_AUDIO_PLAYBACK_FM] = {FM_PLAYBACK_PCM_DEVICE, FM_CAPTURE_PCM_DEVICE},
350 [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
351 [USECASE_AUDIO_HFP_SCO_WB] = {HFP_PCM_RX, HFP_SCO_RX},
352 [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE, VOICE_CALL_PCM_DEVICE},
353 [USECASE_VOICE2_CALL] = {VOICE2_CALL_PCM_DEVICE, VOICE2_CALL_PCM_DEVICE},
Haynes Mathew George16081042017-05-31 17:16:49 -0700354 [USECASE_AUDIO_PLAYBACK_MMAP] = {MMAP_PLAYBACK_PCM_DEVICE,
355 MMAP_PLAYBACK_PCM_DEVICE},
356 [USECASE_AUDIO_RECORD_MMAP] = {MMAP_RECORD_PCM_DEVICE,
357 MMAP_RECORD_PCM_DEVICE},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530358 [USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE},
359 [USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE},
Karthik Reddy Katta3b0a60c2014-04-06 14:52:37 +0530360 [USECASE_VOWLAN_CALL] = {VOWLAN_CALL_PCM_DEVICE, VOWLAN_CALL_PCM_DEVICE},
Venkata Narendra Kumar Gutta0d293362015-12-18 15:52:27 +0530361 [USECASE_VOICEMMODE1_CALL] = {-1, -1}, /* pcm ids updated from platform info file */
362 [USECASE_VOICEMMODE2_CALL] = {-1, -1}, /* pcm ids updated from platform info file */
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530363 [USECASE_COMPRESS_VOIP_CALL] = {COMPRESS_VOIP_CALL_PCM_DEVICE, COMPRESS_VOIP_CALL_PCM_DEVICE},
364 [USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE,
365 AUDIO_RECORD_PCM_DEVICE},
366 [USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
367 AUDIO_RECORD_PCM_DEVICE},
368 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
369 AUDIO_RECORD_PCM_DEVICE},
370 [USECASE_INCALL_REC_UPLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
371 COMPRESS_CAPTURE_DEVICE},
372 [USECASE_INCALL_REC_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
373 COMPRESS_CAPTURE_DEVICE},
374 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
375 COMPRESS_CAPTURE_DEVICE},
376 [USECASE_INCALL_MUSIC_UPLINK] = {INCALL_MUSIC_UPLINK_PCM_DEVICE,
377 INCALL_MUSIC_UPLINK_PCM_DEVICE},
378 [USECASE_INCALL_MUSIC_UPLINK2] = {INCALL_MUSIC_UPLINK2_PCM_DEVICE,
379 INCALL_MUSIC_UPLINK2_PCM_DEVICE},
380 [USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1},
381 [USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE},
Preetam Singh Ranawat7112f3b2015-02-26 16:51:58 +0530382 [USECASE_AUDIO_PLAYBACK_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
383 AFE_PROXY_RECORD_PCM_DEVICE},
384 [USECASE_AUDIO_RECORD_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
385 AFE_PROXY_RECORD_PCM_DEVICE},
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700386 [USECASE_AUDIO_PLAYBACK_EXT_DISP_SILENCE] = {MULTIMEDIA9_PCM_DEVICE, -1},
Siddartha Shaik31b530e2017-05-19 15:26:33 +0530387 [USECASE_AUDIO_TRANSCODE_LOOPBACK] = {TRANSCODE_LOOPBACK_RX_DEV_ID, TRANSCODE_LOOPBACK_TX_DEV_ID},
Vikram Panduranga93f080e2017-06-07 18:16:14 -0700388 [USECASE_AUDIO_PLAYBACK_VOIP] = {AUDIO_PLAYBACK_VOIP_PCM_DEVICE, AUDIO_PLAYBACK_VOIP_PCM_DEVICE},
389 [USECASE_AUDIO_RECORD_VOIP] = {AUDIO_RECORD_VOIP_PCM_DEVICE, AUDIO_RECORD_VOIP_PCM_DEVICE},
Siddartha Shaik31b530e2017-05-19 15:26:33 +0530390
Varun Balaraje49253e2017-07-06 19:48:56 +0530391 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM1] =
392 {PLAYBACK_INTERACTIVE_STRM_DEVICE1, PLAYBACK_INTERACTIVE_STRM_DEVICE1},
393 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM2] =
394 {PLAYBACK_INTERACTIVE_STRM_DEVICE2, PLAYBACK_INTERACTIVE_STRM_DEVICE2},
395 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM3] =
396 {PLAYBACK_INTERACTIVE_STRM_DEVICE3, PLAYBACK_INTERACTIVE_STRM_DEVICE3},
397 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM4] =
398 {PLAYBACK_INTERACTIVE_STRM_DEVICE4, PLAYBACK_INTERACTIVE_STRM_DEVICE4},
399 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM5] =
400 {PLAYBACK_INTERACTIVE_STRM_DEVICE5, PLAYBACK_INTERACTIVE_STRM_DEVICE5},
401 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM6] =
402 {PLAYBACK_INTERACTIVE_STRM_DEVICE6, PLAYBACK_INTERACTIVE_STRM_DEVICE6},
403 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM7] =
404 {PLAYBACK_INTERACTIVE_STRM_DEVICE7, PLAYBACK_INTERACTIVE_STRM_DEVICE7},
405 [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM8] =
406 {PLAYBACK_INTERACTIVE_STRM_DEVICE8, PLAYBACK_INTERACTIVE_STRM_DEVICE8},
Garmond Leunge2433c32017-09-28 21:51:22 -0700407 [USECASE_AUDIO_EC_REF_LOOPBACK] = {-1, -1}, /* pcm id updated from platform info file */
Naresh Tannirue3b18452014-03-04 14:44:27 +0530408};
409
410/* Array to store sound devices */
411static const char * const device_table[SND_DEVICE_MAX] = {
412 [SND_DEVICE_NONE] = "none",
413 /* Playback sound devices */
414 [SND_DEVICE_OUT_HANDSET] = "handset",
415 [SND_DEVICE_OUT_SPEAKER] = "speaker",
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530416 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_1] = "speaker-ext-1",
417 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_2] = "speaker-ext-2",
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +0530418 [SND_DEVICE_OUT_SPEAKER_WSA] = "wsa-speaker",
Venkata Narendra Kumar Gutta55def542015-06-16 13:59:08 +0530419 [SND_DEVICE_OUT_SPEAKER_VBAT] = "vbat-speaker",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530420 [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse",
421 [SND_DEVICE_OUT_HEADPHONES] = "headphones",
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +0530422 [SND_DEVICE_OUT_HEADPHONES_DSD] = "headphones-dsd",
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +0530423 [SND_DEVICE_OUT_HEADPHONES_44_1] = "headphones-44.1",
Naresh Tanniru9c4ba542015-11-06 18:01:09 +0530424 [SND_DEVICE_OUT_LINE] = "line",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530425 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
Naresh Tanniru9c4ba542015-11-06 18:01:09 +0530426 [SND_DEVICE_OUT_SPEAKER_AND_LINE] = "speaker-and-line",
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530427 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = "speaker-and-headphones-ext-1",
428 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = "speaker-and-headphones-ext-2",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530429 [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
430 [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +0530431 [SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = "wsa-voice-speaker",
Venkata Narendra Kumar Gutta55def542015-06-16 13:59:08 +0530432 [SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "vbat-voice-speaker",
Rohit kumarf4120402016-08-05 19:19:48 +0530433 [SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
434 [SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = "wsa-voice-speaker-2",
435 [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = "vbat-voice-speaker-2",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530436 [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
Naresh Tanniru9c4ba542015-11-06 18:01:09 +0530437 [SND_DEVICE_OUT_VOICE_LINE] = "voice-line",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530438 [SND_DEVICE_OUT_HDMI] = "hdmi",
439 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700440 [SND_DEVICE_OUT_DISPLAY_PORT] = "display-port",
441 [SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = "speaker-and-display-port",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530442 [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530443 [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530444 [SND_DEVICE_OUT_BT_A2DP] = "bt-a2dp",
445 [SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = "speaker-and-bt-a2dp",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530446 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
447 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
448 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
Preetam Singh Ranawat7112f3b2015-02-26 16:51:58 +0530449 [SND_DEVICE_OUT_VOICE_TX] = "voice-tx",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530450 [SND_DEVICE_OUT_AFE_PROXY] = "afe-proxy",
Ashish Jain3e37a702016-11-25 12:27:15 +0530451 [SND_DEVICE_OUT_USB_HEADSET] = "usb-headset",
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700452 [SND_DEVICE_OUT_VOICE_USB_HEADSET] = "usb-headset",
Ashish Jain3e37a702016-11-25 12:27:15 +0530453 [SND_DEVICE_OUT_USB_HEADPHONES] = "usb-headphones",
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700454 [SND_DEVICE_OUT_VOICE_USB_HEADPHONES] = "usb-headphones",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530455 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = "speaker-and-usb-headphones",
456 [SND_DEVICE_OUT_TRANSMISSION_FM] = "transmission-fm",
457 [SND_DEVICE_OUT_ANC_HEADSET] = "anc-headphones",
458 [SND_DEVICE_OUT_ANC_FB_HEADSET] = "anc-fb-headphones",
459 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = "voice-anc-headphones",
460 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = "voice-anc-fb-headphones",
Preetam Singh Ranawat91132162017-03-13 20:32:03 +0530461 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = "voice-speaker-and-voice-headphones",
462 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = "voice-speaker-and-voice-anc-headphones",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530463 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
464 [SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
465 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530466 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
Rohit kumarf4120402016-08-05 19:19:48 +0530467 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
Banajit Goswami20cdd212015-09-11 01:11:30 -0700468 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
469 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
Rohit kumarf4120402016-08-05 19:19:48 +0530470 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = "voice-speaker-2-protected-vbat",
Rohit Kumarbe6935f2017-01-20 14:58:34 +0530471 [SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = "speaker-protected",
472 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = "speaker-protected-vbat",
kunleizbe6a8442017-08-08 17:11:35 +0800473 [SND_DEVICE_OUT_SPEAKER_AND_BT_SCO] = "speaker-and-bt-sco",
474 [SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB] = "speaker-and-bt-sco-wb",
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530475#ifdef RECORD_PLAY_CONCURRENCY
476 [SND_DEVICE_OUT_VOIP_HANDSET] = "voip-handset",
477 [SND_DEVICE_OUT_VOIP_SPEAKER] = "voip-speaker",
478 [SND_DEVICE_OUT_VOIP_HEADPHONES] = "voip-headphones",
479#endif
Naresh Tannirue3b18452014-03-04 14:44:27 +0530480
481 /* Capture sound devices */
482 [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530483 [SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = "handset-mic-ext",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530484 [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530485 [SND_DEVICE_IN_HANDSET_MIC_NS] = "handset-mic",
486 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = "handset-mic",
487 [SND_DEVICE_IN_HANDSET_DMIC] = "dmic-endfire",
488 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = "dmic-endfire",
489 [SND_DEVICE_IN_HANDSET_DMIC_NS] = "dmic-endfire",
490 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = "dmic-endfire",
491 [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic",
492 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic",
493 [SND_DEVICE_IN_SPEAKER_MIC_NS] = "speaker-mic",
494 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = "speaker-mic",
495 [SND_DEVICE_IN_SPEAKER_DMIC] = "speaker-dmic-endfire",
496 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = "speaker-dmic-endfire",
497 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = "speaker-dmic-endfire",
498 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = "speaker-dmic-endfire",
499 [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic",
500 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = "headset-mic",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530501 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
502 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
503 [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
504 [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700505 [SND_DEVICE_IN_BT_SCO_MIC_NREC] = "bt-sco-mic",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530506 [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700507 [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = "bt-sco-mic-wb",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530508 [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530509 [SND_DEVICE_IN_VOICE_DMIC] = "voice-dmic-ef",
510 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = "voice-speaker-dmic-ef",
511 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = "voice-speaker-qmic",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530512 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
513 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
514 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
515 [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530516 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
517 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
518 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
Preetam Singh Ranawat7112f3b2015-02-26 16:51:58 +0530519 [SND_DEVICE_IN_VOICE_RX] = "voice-rx",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530520 [SND_DEVICE_IN_USB_HEADSET_MIC] = "usb-headset-mic",
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700521 [SND_DEVICE_IN_VOICE_USB_HEADSET_MIC] ="usb-headset-mic",
522 [SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = "usb-headset-mic",
523 [SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC] = "usb-headset-mic",
524 [SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC] = "usb-headset-mic",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530525 [SND_DEVICE_IN_CAPTURE_FM] = "capture-fm",
526 [SND_DEVICE_IN_AANC_HANDSET_MIC] = "aanc-handset-mic",
527 [SND_DEVICE_IN_QUAD_MIC] = "quad-mic",
528 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
529 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
530 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
Rohit kumarf4120402016-08-05 19:19:48 +0530531 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = "vi-feedback-mono-1",
532 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = "vi-feedback-mono-2",
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +0530533 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = "voice-speaker-dmic-broadside",
534 [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = "speaker-dmic-broadside",
535 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = "speaker-dmic-broadside",
536 [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = "speaker-dmic-broadside",
537 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = "speaker-dmic-broadside",
Sidipotu Ashok3bcca232014-11-07 14:41:58 +0530538 [SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = "aanc-fluence-dmic-handset",
Karthik Reddy Kattad71b94b2015-01-19 14:06:53 +0530539 [SND_DEVICE_IN_HANDSET_QMIC] = "quad-mic",
540 [SND_DEVICE_IN_SPEAKER_QMIC_AEC] = "quad-mic",
541 [SND_DEVICE_IN_SPEAKER_QMIC_NS] = "quad-mic",
542 [SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS] = "quad-mic",
Shiv Maliyappanahalli5a10aea2015-07-02 10:36:23 -0700543 [SND_DEVICE_IN_THREE_MIC] = "three-mic",
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530544 [SND_DEVICE_IN_HANDSET_TMIC] = "three-mic",
Ben Rombergera4d76db2016-10-13 15:26:02 -0700545 [SND_DEVICE_IN_VOICE_REC_TMIC] = "three-mic",
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +0530546 [SND_DEVICE_IN_UNPROCESSED_MIC] = "unprocessed-mic",
547 [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = "voice-rec-dmic-ef",
548 [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = "three-mic",
549 [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = "quad-mic",
550 [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = "headset-mic",
Garmond Leunge2433c32017-09-28 21:51:22 -0700551 [SND_DEVICE_IN_HANDSET_6MIC] = "handset-6mic",
552 [SND_DEVICE_IN_HANDSET_8MIC] = "handset-8mic",
553 [SND_DEVICE_IN_EC_REF_LOOPBACK_MONO] = "ec-ref-loopback-mono",
554 [SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO] = "ec-ref-loopback-stereo",
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +0530555 [SND_DEVICE_IN_HANDSET_GENERIC_QMIC] = "quad-mic",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530556};
557
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530558// Platform specific backend bit width table
559static int backend_bit_width_table[SND_DEVICE_MAX] = {0};
560
Vikram Pandurangadf59cae2017-08-03 18:04:55 -0700561static struct audio_effect_config effect_config_table[GET_IN_DEVICE_INDEX(SND_DEVICE_MAX)][EFFECT_MAX] = {
562 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FLUENCE_PROV2, 0x0, 0x10EAF, 0x01},
563 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FLUENCE_PROV2, 0x0, 0x10EAF, 0x02},
564 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE)][EFFECT_AEC] = {TX_VOICE_DM_FV5_BROADSIDE, 0x0,
565 0x10EAF, 0x01},
566 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE)][EFFECT_NS] = {TX_VOICE_DM_FV5_BROADSIDE, 0x0,
567 0x10EAF, 0x02},
568 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FV5ECNS_DM, 0x0, 0x10EAF, 0x01},
569 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FV5ECNS_DM, 0x0, 0x10EAF, 0x02},
570 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FV5ECNS_SM, 0x0, 0x10EAF, 0x01},
571 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FV5ECNS_SM, 0x0, 0x10EAF, 0x02},
572 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FV5ECNS_DM, 0x0, 0x10EAF, 0x01},
573 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FV5ECNS_DM, 0x0, 0x10EAF, 0x02},
574 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)][EFFECT_AEC] = {TX_VOICE_FV5ECNS_SM, 0x0, 0x10EAF, 0x01},
575 [GET_IN_DEVICE_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)][EFFECT_NS] = {TX_VOICE_FV5ECNS_SM, 0x0, 0x10EAF, 0x02},
576};
577
Naresh Tannirue3b18452014-03-04 14:44:27 +0530578/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530579static int acdb_device_table[SND_DEVICE_MAX] = {
Naresh Tannirue3b18452014-03-04 14:44:27 +0530580 [SND_DEVICE_NONE] = -1,
581 [SND_DEVICE_OUT_HANDSET] = 7,
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +0530582 [SND_DEVICE_OUT_SPEAKER] = 14,
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530583 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_1] = 14,
584 [SND_DEVICE_OUT_SPEAKER_EXTERNAL_2] = 14,
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +0530585 [SND_DEVICE_OUT_SPEAKER_WSA] = 135,
Banajit Goswami20cdd212015-09-11 01:11:30 -0700586 [SND_DEVICE_OUT_SPEAKER_VBAT] = 135,
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +0530587 [SND_DEVICE_OUT_SPEAKER_REVERSE] = 14,
Naresh Tanniru9c4ba542015-11-06 18:01:09 +0530588 [SND_DEVICE_OUT_LINE] = 10,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530589 [SND_DEVICE_OUT_HEADPHONES] = 10,
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +0530590 [SND_DEVICE_OUT_HEADPHONES_DSD] = 10,
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +0530591 [SND_DEVICE_OUT_HEADPHONES_44_1] = 10,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530592 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10,
Naresh Tanniru9c4ba542015-11-06 18:01:09 +0530593 [SND_DEVICE_OUT_SPEAKER_AND_LINE] = 10,
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530594 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = 10,
595 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = 10,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530596 [SND_DEVICE_OUT_VOICE_HANDSET] = 7,
Naresh Tanniru9c4ba542015-11-06 18:01:09 +0530597 [SND_DEVICE_OUT_VOICE_LINE] = 10,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530598 [SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
Rohit kumarf4120402016-08-05 19:19:48 +0530599 [SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +0530600 [SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = 135,
Rohit kumarf4120402016-08-05 19:19:48 +0530601 [SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = 135,
Banajit Goswami20cdd212015-09-11 01:11:30 -0700602 [SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = 135,
Rohit kumarf4120402016-08-05 19:19:48 +0530603 [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = 135,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530604 [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
Preetam Singh Ranawat91132162017-03-13 20:32:03 +0530605 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = 10,
606 [SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = 10,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530607 [SND_DEVICE_OUT_HDMI] = 18,
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +0530608 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700609 [SND_DEVICE_OUT_DISPLAY_PORT] = 18,
610 [SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = 14,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530611 [SND_DEVICE_OUT_BT_SCO] = 22,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530612 [SND_DEVICE_OUT_BT_SCO_WB] = 39,
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530613 [SND_DEVICE_OUT_BT_A2DP] = 20,
614 [SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = 14,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530615 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
616 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
617 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
Preetam Singh Ranawat7112f3b2015-02-26 16:51:58 +0530618 [SND_DEVICE_OUT_VOICE_TX] = 45,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530619 [SND_DEVICE_OUT_AFE_PROXY] = 0,
620 [SND_DEVICE_OUT_USB_HEADSET] = 45,
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700621 [SND_DEVICE_OUT_VOICE_USB_HEADSET] = 45,
Ashish Jain3e37a702016-11-25 12:27:15 +0530622 [SND_DEVICE_OUT_USB_HEADPHONES] = 45,
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700623 [SND_DEVICE_OUT_VOICE_USB_HEADPHONES] = 45,
Satya Krishna Pindiprolif5eddfd2016-12-28 11:29:08 +0530624 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 45,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530625 [SND_DEVICE_OUT_TRANSMISSION_FM] = 0,
626 [SND_DEVICE_OUT_ANC_HEADSET] = 26,
627 [SND_DEVICE_OUT_ANC_FB_HEADSET] = 27,
628 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = 26,
629 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = 27,
630 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26,
631 [SND_DEVICE_OUT_ANC_HANDSET] = 103,
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530632 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124,
633 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101,
Rohit kumarf4120402016-08-05 19:19:48 +0530634 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = 101,
Banajit Goswami20cdd212015-09-11 01:11:30 -0700635 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
636 [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
Rohit kumarf4120402016-08-05 19:19:48 +0530637 [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
Rohit Kumarbe6935f2017-01-20 14:58:34 +0530638 [SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = 134,
639 [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = 134,
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530640#ifdef RECORD_PLAY_CONCURRENCY
641 [SND_DEVICE_OUT_VOIP_HANDSET] = 133,
642 [SND_DEVICE_OUT_VOIP_SPEAKER] = 132,
643 [SND_DEVICE_OUT_VOIP_HEADPHONES] = 134,
644#endif
Naresh Tannirue3b18452014-03-04 14:44:27 +0530645
646 [SND_DEVICE_IN_HANDSET_MIC] = 4,
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530647 [SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = 4,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530648 [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106,
649 [SND_DEVICE_IN_HANDSET_MIC_NS] = 107,
650 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = 108,
651 [SND_DEVICE_IN_HANDSET_DMIC] = 41,
652 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = 109,
653 [SND_DEVICE_IN_HANDSET_DMIC_NS] = 110,
654 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = 111,
655 [SND_DEVICE_IN_SPEAKER_MIC] = 11,
656 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 112,
657 [SND_DEVICE_IN_SPEAKER_MIC_NS] = 113,
658 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = 114,
659 [SND_DEVICE_IN_SPEAKER_DMIC] = 43,
660 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = 115,
661 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = 116,
662 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530663 [SND_DEVICE_IN_HEADSET_MIC] = 8,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530664 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = 47,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530665 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
666 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
667 [SND_DEVICE_IN_HDMI_MIC] = 4,
668 [SND_DEVICE_IN_BT_SCO_MIC] = 21,
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700669 [SND_DEVICE_IN_BT_SCO_MIC_NREC] = 122,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530670 [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700671 [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = 123,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530672 [SND_DEVICE_IN_CAMCORDER_MIC] = 4,
673 [SND_DEVICE_IN_VOICE_DMIC] = 41,
674 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43,
675 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = 19,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530676 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
677 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
678 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530679 [SND_DEVICE_IN_VOICE_REC_MIC] = 4,
680 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = 107,
681 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 34,
682 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 41,
Preetam Singh Ranawat7112f3b2015-02-26 16:51:58 +0530683 [SND_DEVICE_IN_VOICE_RX] = 44,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530684 [SND_DEVICE_IN_USB_HEADSET_MIC] = 44,
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700685 [SND_DEVICE_IN_VOICE_USB_HEADSET_MIC] = 44,
686 [SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC] = 44,
687 [SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC] = 44,
688 [SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = 44,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530689 [SND_DEVICE_IN_CAPTURE_FM] = 0,
690 [SND_DEVICE_IN_AANC_HANDSET_MIC] = 104,
691 [SND_DEVICE_IN_QUAD_MIC] = 46,
692 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
693 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
694 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
Rohit kumarf4120402016-08-05 19:19:48 +0530695 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = 102,
696 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = 102,
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +0530697 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = 12,
698 [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = 12,
699 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = 119,
700 [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = 121,
701 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = 120,
Venkata Narendra Kumar Gutta9bb5af62015-06-05 11:53:06 +0530702 [SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = 105,
Karthik Reddy Kattad71b94b2015-01-19 14:06:53 +0530703 [SND_DEVICE_IN_HANDSET_QMIC] = 125,
704 [SND_DEVICE_IN_SPEAKER_QMIC_AEC] = 126,
705 [SND_DEVICE_IN_SPEAKER_QMIC_NS] = 127,
706 [SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS] = 129,
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530707 [SND_DEVICE_IN_THREE_MIC] = 46, /* for APSS Surround Sound Recording */
708 [SND_DEVICE_IN_HANDSET_TMIC] = 125, /* for 3mic recording with fluence */
Ben Rombergera4d76db2016-10-13 15:26:02 -0700709 [SND_DEVICE_IN_VOICE_REC_TMIC] = 125,
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +0530710 [SND_DEVICE_IN_UNPROCESSED_MIC] = 143,
711 [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = 144,
712 [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = 145,
713 [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = 146,
714 [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = 147,
Garmond Leunge2433c32017-09-28 21:51:22 -0700715 [SND_DEVICE_IN_HANDSET_6MIC] = 4,
716 [SND_DEVICE_IN_HANDSET_8MIC] = 4,
717 [SND_DEVICE_IN_EC_REF_LOOPBACK_MONO] = 4,
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +0530718 [SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO] = 4,
719 [SND_DEVICE_IN_HANDSET_GENERIC_QMIC] = 150
Naresh Tannirue3b18452014-03-04 14:44:27 +0530720};
721
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530722struct name_to_index {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530723 char name[100];
724 unsigned int index;
725};
Naresh Tannirue3b18452014-03-04 14:44:27 +0530726
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530727#define TO_NAME_INDEX(X) #X, X
Naresh Tannirue3b18452014-03-04 14:44:27 +0530728
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530729/* Used to get index from parsed sting */
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530730static struct name_to_index snd_device_name_index[SND_DEVICE_MAX] = {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530731 {TO_NAME_INDEX(SND_DEVICE_OUT_HANDSET)},
732 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530733 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_EXTERNAL_1)},
734 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_EXTERNAL_2)},
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +0530735 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_WSA)},
Banajit Goswami20cdd212015-09-11 01:11:30 -0700736 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_VBAT)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530737 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_REVERSE)},
738 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES)},
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +0530739 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES_DSD)},
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +0530740 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES_44_1)},
Naresh Tanniru9c4ba542015-11-06 18:01:09 +0530741 {TO_NAME_INDEX(SND_DEVICE_OUT_LINE)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530742 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES)},
Naresh Tanniru9c4ba542015-11-06 18:01:09 +0530743 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_LINE)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530744 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1)},
745 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530746 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET)},
747 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +0530748 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_WSA)},
Banajit Goswami20cdd212015-09-11 01:11:30 -0700749 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)},
Rohit kumarf4120402016-08-05 19:19:48 +0530750 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2)},
751 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA)},
752 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530753 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
Naresh Tanniru9c4ba542015-11-06 18:01:09 +0530754 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530755 {TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
756 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HDMI)},
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700757 {TO_NAME_INDEX(SND_DEVICE_OUT_DISPLAY_PORT)},
758 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530759 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO)},
760 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)},
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530761 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_A2DP)},
762 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530763 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
764 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)},
765 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)},
kunleizbe6a8442017-08-08 17:11:35 +0800766 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_SCO)},
767 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB)},
Preetam Singh Ranawat7112f3b2015-02-26 16:51:58 +0530768 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TX)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530769 {TO_NAME_INDEX(SND_DEVICE_OUT_AFE_PROXY)},
770 {TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADSET)},
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700771 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_USB_HEADSET)},
Ashish Jain3e37a702016-11-25 12:27:15 +0530772 {TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADPHONES)},
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700773 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_USB_HEADPHONES)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530774 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET)},
775 {TO_NAME_INDEX(SND_DEVICE_OUT_TRANSMISSION_FM)},
776 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HEADSET)},
777 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_FB_HEADSET)},
778 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_ANC_HEADSET)},
779 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET)},
780 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET)},
781 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)},
782 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530783 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
Rohit kumarf4120402016-08-05 19:19:48 +0530784 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
Banajit Goswami20cdd212015-09-11 01:11:30 -0700785 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
786 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
Rohit kumarf4120402016-08-05 19:19:48 +0530787 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
Rohit Kumarbe6935f2017-01-20 14:58:34 +0530788 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS)},
789 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS)},
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530790#ifdef RECORD_PLAY_CONCURRENCY
791 {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HANDSET)},
792 {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_SPEAKER)},
793 {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HEADPHONES)},
794#endif
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530795 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530796 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_EXTERNAL)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530797 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)},
798 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_NS)},
799 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)},
800 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC)},
801 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC)},
802 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_NS)},
803 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)},
804 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC)},
805 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC)},
806 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_NS)},
807 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)},
808 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC)},
809 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC)},
810 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS)},
811 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)},
812 {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC)},
813 {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC_FLUENCE)},
814 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
815 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
816 {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
817 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC)},
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700818 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_NREC)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530819 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB)},
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700820 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB_NREC)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530821 {TO_NAME_INDEX(SND_DEVICE_IN_CAMCORDER_MIC)},
822 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC)},
823 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC)},
824 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_QMIC)},
825 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC)},
826 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC)},
827 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC)},
828 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC)},
829 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_NS)},
830 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_STEREO)},
831 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)},
Preetam Singh Ranawat7112f3b2015-02-26 16:51:58 +0530832 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_RX)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530833 {TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MIC)},
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -0700834 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_USB_HEADSET_MIC)},
835 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC)},
836 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC)},
837 {TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MIC_AEC)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530838 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_FM)},
839 {TO_NAME_INDEX(SND_DEVICE_IN_AANC_HANDSET_MIC)},
840 {TO_NAME_INDEX(SND_DEVICE_IN_QUAD_MIC)},
841 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_STEREO_DMIC)},
842 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_STEREO_DMIC)},
843 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
Rohit kumarf4120402016-08-05 19:19:48 +0530844 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1)},
845 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2)},
Sidipotu Ashok3bcca232014-11-07 14:41:58 +0530846 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530847 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE)},
848 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE)},
849 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE)},
850 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE)},
851 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE)},
Karthik Reddy Kattad71b94b2015-01-19 14:06:53 +0530852 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC)},
853 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC)},
854 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_NS)},
855 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS)},
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +0530856 {TO_NAME_INDEX(SND_DEVICE_IN_THREE_MIC)},
857 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC)},
Ben Rombergera4d76db2016-10-13 15:26:02 -0700858 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_TMIC)},
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +0530859 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_MIC)},
860 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_STEREO_MIC)},
861 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_THREE_MIC)},
862 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_QUAD_MIC)},
863 {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC)},
Garmond Leunge2433c32017-09-28 21:51:22 -0700864 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_6MIC)},
865 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_8MIC)},
866 {TO_NAME_INDEX(SND_DEVICE_IN_EC_REF_LOOPBACK_MONO)},
867 {TO_NAME_INDEX(SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO)},
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +0530868 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_GENERIC_QMIC)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530869};
870
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +0530871static char * backend_tag_table[SND_DEVICE_MAX] = {0};
872static char * hw_interface_table[SND_DEVICE_MAX] = {0};
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530873
874static struct name_to_index usecase_name_index[AUDIO_USECASE_MAX] = {
875 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_DEEP_BUFFER)},
876 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_LOW_LATENCY)},
877 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MULTI_CH)},
878 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530879 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD2)},
880 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD3)},
881 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD4)},
882 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD5)},
883 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD6)},
884 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD7)},
885 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD8)},
886 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD9)},
Haynes Mathew George16081042017-05-31 17:16:49 -0700887 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MMAP)},
Naresh Tanniru3a7dbe72015-06-25 20:08:01 -0700888 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_ULL)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530889 {TO_NAME_INDEX(USECASE_AUDIO_RECORD)},
Dhananjay Kumaree4d2002016-10-25 18:02:58 +0530890 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS)},
891 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS2)},
892 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS3)},
893 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS4)},
Dhananjay Kumar376e38b2017-09-28 22:26:23 +0530894 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS5)},
895 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_COMPRESS6)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530896 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_LOW_LATENCY)},
Haynes Mathew George16081042017-05-31 17:16:49 -0700897 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_MMAP)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530898 {TO_NAME_INDEX(USECASE_VOICE_CALL)},
899 {TO_NAME_INDEX(USECASE_VOICE2_CALL)},
900 {TO_NAME_INDEX(USECASE_VOLTE_CALL)},
901 {TO_NAME_INDEX(USECASE_QCHAT_CALL)},
902 {TO_NAME_INDEX(USECASE_VOWLAN_CALL)},
Avinash Vaish306e6072015-05-13 16:58:18 +0530903 {TO_NAME_INDEX(USECASE_VOICEMMODE1_CALL)},
904 {TO_NAME_INDEX(USECASE_VOICEMMODE2_CALL)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530905 {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK)},
906 {TO_NAME_INDEX(USECASE_INCALL_REC_DOWNLINK)},
907 {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK_AND_DOWNLINK)},
908 {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO)},
Satya Krishna Pindiprolic6b0a742017-02-03 14:37:18 +0530909 {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO_WB)},
Xiaojun Sangb112f882015-08-03 19:38:28 +0800910 {TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_TX)},
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -0700911 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_EXT_DISP_SILENCE)},
Naresh Tannirue8081152016-12-07 16:08:42 +0530912 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_FM)},
913 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_FM_VIRTUAL)},
914 {TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_RX)},
915 {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_AFE_PROXY)},
916 {TO_NAME_INDEX(USECASE_AUDIO_RECORD_AFE_PROXY)},
Garmond Leunge2433c32017-09-28 21:51:22 -0700917 {TO_NAME_INDEX(USECASE_AUDIO_EC_REF_LOOPBACK)},
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +0530918};
919
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700920#define NO_COLS 2
921static int msm_be_id_array_len;
922static int (*msm_device_to_be_id)[];
923
924/* Below table lists output device to BE_ID mapping*/
925/* Update the table based on the board configuration*/
926
927static int msm_device_to_be_id_internal_codec [][NO_COLS] = {
928 {AUDIO_DEVICE_OUT_EARPIECE , 34},
929 {AUDIO_DEVICE_OUT_SPEAKER , 34},
930 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 34},
931 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 34},
932 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
933 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
934 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
935 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
936 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
937 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
938 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
939 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
940 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
941 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
942 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
943 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
944 {AUDIO_DEVICE_OUT_PROXY , 9},
945 {AUDIO_DEVICE_OUT_FM , 7},
946 {AUDIO_DEVICE_OUT_FM_TX , 8},
947 {AUDIO_DEVICE_OUT_ALL , -1},
948 {AUDIO_DEVICE_NONE , -1},
949 {AUDIO_DEVICE_OUT_DEFAULT , -1},
950};
951
952static int msm_device_to_be_id_external_codec [][NO_COLS] = {
953 {AUDIO_DEVICE_OUT_EARPIECE , 2},
954 {AUDIO_DEVICE_OUT_SPEAKER , 2},
Sharad Sangle1f705a72016-10-05 20:01:39 +0530955 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 41},
956 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 41},
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700957 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
958 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
959 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
960 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
961 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
962 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
963 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
964 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
965 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
966 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
967 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
968 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
969 {AUDIO_DEVICE_OUT_PROXY , 9},
970 {AUDIO_DEVICE_OUT_FM , 7},
971 {AUDIO_DEVICE_OUT_FM_TX , 8},
972 {AUDIO_DEVICE_OUT_ALL , -1},
973 {AUDIO_DEVICE_NONE , -1},
974 {AUDIO_DEVICE_OUT_DEFAULT , -1},
975};
976
977
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530978#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL)
Ashish Jain5106d362016-05-11 19:23:33 +0530979#define PCM_OFFLOAD_PLATFORM_DELAY (30*1000LL)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530980#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
Haynes Mathew George5beddd42016-06-27 18:33:40 -0700981#define ULL_PLATFORM_DELAY (6*1000LL)
Haynes Mathew George16081042017-05-31 17:16:49 -0700982#define MMAP_PLATFORM_DELAY (3*1000LL)
Naresh Tannirue3b18452014-03-04 14:44:27 +0530983
`Deeraj Soman676c2702017-09-18 19:25:53 +0530984static const char *platform_get_mixer_control(struct mixer_ctl *);
985
Sachin Mohan Gadag1ec7fab2016-12-12 17:41:26 +0530986static void update_interface(const char *snd_card_name) {
987 if (!strncmp(snd_card_name, "apq8009-tashalite-snd-card",
988 sizeof("apq8009-tashalite-snd-card"))) {
989 is_slimbus_interface = false;
990 }
991}
992
Venkata Narendra Kumar Guttaed408a12015-03-31 20:24:04 +0530993static void update_codec_type(const char *snd_card_name) {
994
995 if (!strncmp(snd_card_name, "msm8939-tapan-snd-card",
996 sizeof("msm8939-tapan-snd-card")) ||
997 !strncmp(snd_card_name, "msm8939-tapan9302-snd-card",
Avinash Vaish306e6072015-05-13 16:58:18 +0530998 sizeof("msm8939-tapan9302-snd-card")) ||
Venkata Narendra Kumar Guttaed408a12015-03-31 20:24:04 +0530999 !strncmp(snd_card_name, "msm8939-tomtom9330-snd-card",
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05301000 sizeof("msm8939-tomtom9330-snd-card")) ||
1001 !strncmp(snd_card_name, "msm8952-tomtom-snd-card",
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05301002 sizeof("msm8952-tomtom-snd-card")) ||
Xiaojun Sang9cd237a2015-11-20 15:30:18 +08001003 !strncmp(snd_card_name, "msm8953-sku3-tasha-snd-card",
1004 sizeof("msm8953-sku3-tasha-snd-card")) ||
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05301005 !strncmp(snd_card_name, "msm8952-tasha-snd-card",
1006 sizeof("msm8952-tasha-snd-card")) ||
1007 !strncmp(snd_card_name, "msm8952-tashalite-snd-card",
1008 sizeof("msm8952-tashalite-snd-card")) ||
1009 !strncmp(snd_card_name, "msm8952-tasha-skun-snd-card",
Preetam Singh Ranawat61716b12015-12-14 11:55:24 +05301010 sizeof("msm8952-tasha-skun-snd-card")) ||
Aravind Kumard7691742015-05-13 13:10:51 +05301011 !strncmp(snd_card_name, "msm8976-tasha-snd-card",
Meng Wangf1ec20c2015-06-26 10:32:32 +08001012 sizeof("msm8976-tasha-snd-card")) ||
Yeleswarapu Nagaradhesh09f30be2015-07-22 14:11:03 +05301013 !strncmp(snd_card_name, "msm8976-tashalite-snd-card",
1014 sizeof("msm8976-tashalite-snd-card")) ||
Meng Wangf1ec20c2015-06-26 10:32:32 +08001015 !strncmp(snd_card_name, "msm8976-tasha-skun-snd-card",
Naresh Tanniru4d1e1a12015-12-16 19:37:50 +05301016 sizeof("msm8976-tasha-skun-snd-card")) ||
1017 !strncmp(snd_card_name, "msm8937-tasha-snd-card",
1018 sizeof("msm8937-tasha-snd-card")) ||
1019 !strncmp(snd_card_name, "msm8937-tashalite-snd-card",
1020 sizeof("msm8937-tashalite-snd-card")) ||
1021 !strncmp(snd_card_name, "msm8953-tasha-snd-card",
1022 sizeof("msm8953-tasha-snd-card")) ||
1023 !strncmp(snd_card_name, "msm8953-tashalite-snd-card",
Dhananjay Kumard3ab9f42016-07-20 17:05:47 +05301024 sizeof("msm8953-tashalite-snd-card")) ||
Arusha Goyalfda29152016-12-26 10:53:39 +05301025 !strncmp(snd_card_name, "sdm660-tasha-snd-card",
1026 sizeof("sdm660-tasha-snd-card")) ||
Yamit Mehtaa0d653a2016-11-25 20:33:25 +05301027 !strncmp(snd_card_name, "apq8009-tashalite-snd-card",
1028 sizeof("apq8009-tashalite-snd-card")) ||
1029 !strncmp(snd_card_name, "mdm9607-tomtom-i2s-snd-card",
Naresh Tanniru25873b82016-11-01 14:15:28 +05301030 sizeof("mdm9607-tomtom-i2s-snd-card")) ||
Siena Richard264ed052017-03-17 10:35:01 -07001031 !strncmp(snd_card_name, "mdm-tasha-i2s-snd-card",
1032 sizeof("mdm-tasha-i2s-snd-card")) ||
Arusha Goyalfda29152016-12-26 10:53:39 +05301033 !strncmp(snd_card_name, "sdm660-tashalite-snd-card",
1034 sizeof("sdm660-tashalite-snd-card")) ||
Walter Yangfd3f3252017-01-03 01:35:23 -08001035 !strncmp(snd_card_name, "sdm660-tasha-skus-snd-card",
1036 sizeof("sdm660-tasha-skus-snd-card")) ||
Arusha Goyalfda29152016-12-26 10:53:39 +05301037 !strncmp(snd_card_name, "sdm660-tavil-snd-card",
1038 sizeof("sdm660-tavil-snd-card")))
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05301039 {
Venkata Narendra Kumar Guttaed408a12015-03-31 20:24:04 +05301040 ALOGI("%s: snd_card_name: %s",__func__,snd_card_name);
1041 is_external_codec = true;
Sachin Mohan Gadag1ec7fab2016-12-12 17:41:26 +05301042 is_slimbus_interface = true;
Venkata Narendra Kumar Guttaed408a12015-03-31 20:24:04 +05301043 }
1044}
Asish Bhattacharya4ff24802014-04-24 17:46:54 +05301045static void query_platform(const char *snd_card_name,
1046 char *mixer_xml_path)
1047{
1048 if (!strncmp(snd_card_name, "msm8x16-snd-card-mtp",
1049 sizeof("msm8x16-snd-card-mtp"))) {
1050 strlcpy(mixer_xml_path, MIXER_XML_PATH_MTP,
1051 sizeof(MIXER_XML_PATH_MTP));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001052
1053 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1054 msm_be_id_array_len =
1055 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1056
Tanya Finkeldd78e062015-05-26 04:29:56 -07001057 } else if (!strncmp(snd_card_name, "msm8x16-snd-card-sbc",
1058 sizeof("msm8x16-snd-card-sbc"))) {
1059 strlcpy(mixer_xml_path, MIXER_XML_PATH_SBC,
1060 sizeof(mixer_xml_path));
1061
1062 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1063 msm_be_id_array_len =
1064 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1065
Walter Yang7ca90d92014-05-06 17:48:02 +08001066 } else if (!strncmp(snd_card_name, "msm8x16-skuh-snd-card",
1067 sizeof("msm8x16-skuh-snd-card"))) {
1068 strlcpy(mixer_xml_path, MIXER_XML_PATH_QRD_SKUH,
1069 sizeof(MIXER_XML_PATH_QRD_SKUH));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001070
1071 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1072 msm_be_id_array_len =
1073 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1074
Walter Yang7ca90d92014-05-06 17:48:02 +08001075 } else if (!strncmp(snd_card_name, "msm8x16-skui-snd-card",
1076 sizeof("msm8x16-skui-snd-card"))) {
1077 strlcpy(mixer_xml_path, MIXER_XML_PATH_QRD_SKUI,
1078 sizeof(MIXER_XML_PATH_QRD_SKUI));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001079
1080 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1081 msm_be_id_array_len =
1082 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1083
Walter Yang19f244a2014-06-17 13:30:08 +08001084 } else if (!strncmp(snd_card_name, "msm8x16-skuhf-snd-card",
1085 sizeof("msm8x16-skuhf-snd-card"))) {
1086 strlcpy(mixer_xml_path, MIXER_XML_PATH_QRD_SKUHF,
1087 sizeof(MIXER_XML_PATH_QRD_SKUHF));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001088
1089 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1090 msm_be_id_array_len =
1091 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1092
Walter Yangc899d572014-05-27 21:52:17 +08001093 } else if (!strncmp(snd_card_name, "msm8939-snd-card-mtp",
Yamit Mehtac6003e22014-05-19 10:26:02 +05301094 sizeof("msm8939-snd-card-mtp"))) {
Aravind Kumar71ba22b2014-06-23 15:18:50 +05301095 strlcpy(mixer_xml_path, MIXER_XML_PATH_MTP,
1096 sizeof(MIXER_XML_PATH_MTP));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001097
1098 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1099 msm_be_id_array_len =
1100 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1101
Meng Wangf00485b2014-06-03 19:44:38 +08001102 } else if (!strncmp(snd_card_name, "msm8939-snd-card-skuk",
1103 sizeof("msm8939-snd-card-skuk"))) {
1104 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUK,
1105 sizeof(MIXER_XML_PATH_SKUK));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001106 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1107 msm_be_id_array_len =
1108 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1109
Asish Bhattacharyacb8e6d02014-06-19 12:32:25 +05301110 } else if (!strncmp(snd_card_name, "msm8939-tapan-snd-card",
1111 sizeof("msm8939-tapan-snd-card"))) {
1112 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9306,
1113 sizeof(MIXER_XML_PATH_WCD9306));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001114 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1115 msm_be_id_array_len =
1116 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1117
Asish Bhattacharyacb8e6d02014-06-19 12:32:25 +05301118 } else if (!strncmp(snd_card_name, "msm8939-tapan9302-snd-card",
1119 sizeof("msm8939-tapan9302-snd-card"))) {
1120 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9306,
1121 sizeof(MIXER_XML_PATH_WCD9306));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001122
1123 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1124 msm_be_id_array_len =
1125 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1126
Aviral Gupta8ed0eec2014-08-25 10:22:11 +05301127 } else if (!strncmp(snd_card_name, "msm8939-tomtom9330-snd-card",
1128 sizeof("msm8939-tomtom9330-snd-card"))) {
1129 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9330,
1130 sizeof(MIXER_XML_PATH_WCD9330));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001131 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1132 msm_be_id_array_len =
1133 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1134
Aravind Kumard7691742015-05-13 13:10:51 +05301135 } else if (!strncmp(snd_card_name, "msm8976-tasha-snd-card",
1136 sizeof("msm8976-tasha-snd-card"))) {
1137 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9335,
1138 sizeof(MIXER_XML_PATH_WCD9335));
1139 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1140 msm_be_id_array_len =
1141 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1142
Yeleswarapu Nagaradhesh09f30be2015-07-22 14:11:03 +05301143 } else if (!strncmp(snd_card_name, "msm8976-tashalite-snd-card",
1144 sizeof("msm8976-tashalite-snd-card"))) {
1145 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9326,
1146 MAX_MIXER_XML_PATH);
1147 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1148 msm_be_id_array_len =
1149 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1150
Meng Wangf1ec20c2015-06-26 10:32:32 +08001151 } else if (!strncmp(snd_card_name, "msm8976-tasha-skun-snd-card",
1152 sizeof("msm8976-tasha-skun-snd-card"))) {
1153 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUN,
1154 sizeof(MIXER_XML_PATH_SKUN));
1155 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1156 msm_be_id_array_len =
1157 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1158
Walter Yang42886c52014-10-23 14:31:48 +08001159 } else if (!strncmp(snd_card_name, "msm8909-skua-snd-card",
1160 sizeof("msm8909-skua-snd-card"))) {
1161 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUA,
1162 sizeof(MIXER_XML_PATH_SKUA));
Walter Yang42886c52014-10-23 14:31:48 +08001163 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1164 msm_be_id_array_len =
1165 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05301166
Walter Yang42886c52014-10-23 14:31:48 +08001167 } else if (!strncmp(snd_card_name, "msm8909-skuc-snd-card",
1168 sizeof("msm8909-skuc-snd-card"))) {
1169 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUC,
1170 sizeof(MIXER_XML_PATH_SKUC));
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05301171 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1172 msm_be_id_array_len =
1173 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Divya Narayanan Poojary64daf662017-04-20 17:30:20 +05301174 } else if (!strncmp(snd_card_name, "msm8909-skut-snd-card",
1175 sizeof("msm8909-skut-snd-card"))) {
1176 strlcpy(mixer_xml_path, MIXER_XML_PATH_QRD_SKUT,
1177 sizeof(MIXER_XML_PATH_QRD_SKUT));
1178 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1179 msm_be_id_array_len =
1180 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05301181
Divya Narayanan Poojary0d2d17a2017-04-20 16:51:42 +05301182 } else if (!strncmp(snd_card_name, "msm8909-skuq-snd-card",
1183 sizeof("msm8909-skuq-snd-card"))) {
1184 strlcpy(mixer_xml_path, MIXER_XML_PATH_QRD_SKUT,
1185 sizeof(MIXER_XML_PATH_QRD_SKUT));
1186 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1187 msm_be_id_array_len =
1188 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05301189 } else if (!strncmp(snd_card_name, "msm8909-pm8916-snd-card",
1190 sizeof("msm8909-pm8916-snd-card"))) {
1191 strlcpy(mixer_xml_path, MIXER_XML_PATH_MSM8909_PM8916,
1192 sizeof(MIXER_XML_PATH_MSM8909_PM8916));
Walter Yang42886c52014-10-23 14:31:48 +08001193
1194 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1195 msm_be_id_array_len =
1196 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05301197
1198 } else if (!strncmp(snd_card_name, "msm8909-skue-snd-card",
1199 sizeof("msm8909-skue-snd-card"))) {
1200 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUE,
1201 sizeof(MIXER_XML_PATH_SKUE));
1202 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1203 msm_be_id_array_len =
1204 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1205
Meng Wangcfefb8b2014-12-05 14:35:55 +08001206 } else if (!strncmp(snd_card_name, "msm8939-snd-card-skul",
1207 sizeof("msm8939-snd-card-skul"))) {
1208 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUL,
1209 sizeof(MIXER_XML_PATH_SKUL));
1210 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1211 msm_be_id_array_len =
1212 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Naresh Tanniru0d28b4a2015-03-23 00:58:49 +05301213 } else if (!strncmp(snd_card_name, "msm8952-snd-card-mtp",
Avinash Vaish306e6072015-05-13 16:58:18 +05301214 sizeof("msm8952-snd-card-mtp"))) {
Naresh Tanniru0d28b4a2015-03-23 00:58:49 +05301215 strlcpy(mixer_xml_path, MIXER_XML_PATH_MTP,
1216 sizeof(MIXER_XML_PATH_MTP));
1217 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1218 msm_be_id_array_len =
1219 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1220 } else if (!strncmp(snd_card_name, "msm8952-tomtom-snd-card",
1221 sizeof("msm8952-tomtom-snd-card"))) {
1222 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9330,
1223 sizeof(MIXER_XML_PATH_WCD9330));
1224 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1225 msm_be_id_array_len =
1226 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Xiaojun Sang68b39442015-09-23 16:29:43 +08001227 } else if (!strncmp(snd_card_name, "msm8952-sku1-snd-card",
1228 sizeof("msm8952-sku1-snd-card"))) {
1229 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKU1,
1230 sizeof(MIXER_XML_PATH_SKU1));
1231 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1232 msm_be_id_array_len =
1233 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1234 } else if (!strncmp(snd_card_name, "msm8952-sku2-snd-card",
1235 sizeof("msm8952-sku2-snd-card"))) {
1236 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKU2,
1237 sizeof(MIXER_XML_PATH_SKU2));
1238 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1239 msm_be_id_array_len =
1240 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Xiaojun Sang9cd237a2015-11-20 15:30:18 +08001241 } else if (!strncmp(snd_card_name, "msm8953-sku3-tasha-snd-card",
1242 sizeof("msm8953-sku3-tasha-snd-card"))) {
1243 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKU3,
1244 sizeof(MIXER_XML_PATH_SKU3));
1245 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1246 msm_be_id_array_len =
1247 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Walter Yangcd132722015-04-08 16:04:30 +08001248 } else if (!strncmp(snd_card_name, "msm8952-skum-snd-card",
1249 sizeof("msm8952-skum-snd-card"))) {
1250 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUM,
1251 sizeof(MIXER_XML_PATH_SKUM));
1252 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1253 msm_be_id_array_len =
1254 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05301255 } else if (!strncmp(snd_card_name, "msm8952-tasha-snd-card",
1256 sizeof("msm8952-tasha-snd-card"))) {
1257 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9335,
1258 sizeof(MIXER_XML_PATH_WCD9335));
1259 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1260 msm_be_id_array_len =
1261 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Naresh Tanniru0d28b4a2015-03-23 00:58:49 +05301262
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05301263 } else if (!strncmp(snd_card_name, "msm8952-tashalite-snd-card",
1264 sizeof("msm8952-tashalite-snd-card"))) {
1265 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9326,
1266 MAX_MIXER_XML_PATH);
1267 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1268 msm_be_id_array_len =
1269 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Meng Wang2d747622015-08-07 10:11:41 +08001270 } else if (!strncmp(snd_card_name, "msm8976-skun-snd-card",
1271 sizeof("msm8976-skun-snd-card"))) {
1272 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUN_CAJON,
1273 sizeof(MIXER_XML_PATH_SKUN_CAJON));
1274 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1275 msm_be_id_array_len =
1276 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Naresh Tanniru4d1e1a12015-12-16 19:37:50 +05301277
1278 } else if (!strncmp(snd_card_name, "msm8937-snd-card-mtp",
1279 sizeof("msm8937-snd-card-mtp"))) {
1280 strlcpy(mixer_xml_path, MIXER_XML_PATH_MTP,
1281 sizeof(MIXER_XML_PATH_MTP));
1282 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1283 msm_be_id_array_len =
1284 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1285 } else if (!strncmp(snd_card_name, "msm8937-tasha-snd-card",
1286 sizeof("msm8937-tasha-snd-card"))) {
1287 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9335,
1288 sizeof(MIXER_XML_PATH_WCD9335));
1289 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1290 msm_be_id_array_len =
1291 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1292 } else if (!strncmp(snd_card_name, "msm8937-tashalite-snd-card",
1293 sizeof("msm8937-tashalite-snd-card"))) {
1294 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9326,
1295 MAX_MIXER_XML_PATH);
1296 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1297 msm_be_id_array_len =
1298 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1299 } else if (!strncmp(snd_card_name, "msm8953-snd-card-mtp",
1300 sizeof("msm8953-snd-card-mtp"))) {
1301 strlcpy(mixer_xml_path, MIXER_XML_PATH_MTP,
1302 sizeof(MIXER_XML_PATH_MTP));
1303 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1304 msm_be_id_array_len =
1305 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1306 } else if (!strncmp(snd_card_name, "msm8953-tasha-snd-card",
1307 sizeof("msm8953-tasha-snd-card"))) {
1308 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9335,
1309 sizeof(MIXER_XML_PATH_WCD9335));
1310 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1311 msm_be_id_array_len =
1312 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1313 } else if (!strncmp(snd_card_name, "msm8953-tashalite-snd-card",
1314 sizeof("msm8937-tashalite-snd-card"))) {
1315 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9326,
1316 MAX_MIXER_XML_PATH);
1317 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1318 msm_be_id_array_len =
1319 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Meng Wangc5274502016-04-12 16:20:41 +08001320 } else if (!strncmp(snd_card_name, "msm8917-tmo-snd-card",
1321 sizeof("msm8917-tmo-snd-card"))) {
1322 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKU2,
1323 MAX_MIXER_XML_PATH);
1324 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1325 msm_be_id_array_len =
1326 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1327 } else if (!strncmp(snd_card_name, "msm8917-sku5-snd-card",
1328 sizeof("msm8917-sku5-snd-card"))) {
1329 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKU2,
1330 MAX_MIXER_XML_PATH);
1331 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1332 msm_be_id_array_len =
1333 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1334 } else if (!strncmp(snd_card_name, "msm8940-sku6-snd-card",
1335 sizeof("msm8940-sku6-snd-card"))) {
1336 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKU1,
1337 MAX_MIXER_XML_PATH);
1338 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1339 msm_be_id_array_len =
1340 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Arusha Goyalfda29152016-12-26 10:53:39 +05301341 } else if (!strncmp(snd_card_name, "sdm660-snd-card",
1342 sizeof("sdm660-snd-card"))) {
Naresh Tanniru25873b82016-11-01 14:15:28 +05301343 strlcpy(mixer_xml_path, MIXER_XML_PATH,
1344 MAX_MIXER_XML_PATH);
1345 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1346 msm_be_id_array_len =
1347 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Arusha Goyalfda29152016-12-26 10:53:39 +05301348 } else if (!strncmp(snd_card_name, "sdm660-snd-card-mtp",
1349 sizeof("sdm660-snd-card-mtp"))) {
Naresh Tanniru25873b82016-11-01 14:15:28 +05301350 strlcpy(mixer_xml_path, MIXER_XML_PATH_MTP,
1351 MAX_MIXER_XML_PATH);
1352 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1353 msm_be_id_array_len =
1354 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Walter Yang0a488e92017-02-13 21:02:39 +08001355 } else if (!strncmp(snd_card_name, "sdm660-snd-card-skush",
1356 sizeof("sdm660-snd-card-skush"))) {
1357 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUSH,
1358 MAX_MIXER_XML_PATH);
1359 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1360 msm_be_id_array_len =
1361 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Arusha Goyalfda29152016-12-26 10:53:39 +05301362 } else if (!strncmp(snd_card_name, "sdm660-tasha-snd-card",
1363 sizeof("sdm660-tasha-snd-card"))) {
Dhananjay Kumard3ab9f42016-07-20 17:05:47 +05301364 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9335,
1365 sizeof(MIXER_XML_PATH_WCD9335));
1366 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1367 msm_be_id_array_len =
1368 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Arusha Goyalfda29152016-12-26 10:53:39 +05301369 } else if (!strncmp(snd_card_name, "sdm660-tashalite-snd-card",
1370 sizeof("sdm660-tashalite-snd-card"))) {
Naresh Tanniru25873b82016-11-01 14:15:28 +05301371 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9326,
1372 sizeof(MIXER_XML_PATH_WCD9326));
1373 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1374 msm_be_id_array_len =
1375 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Walter Yangfd3f3252017-01-03 01:35:23 -08001376 } else if (!strncmp(snd_card_name, "sdm660-tasha-skus-snd-card",
1377 sizeof("sdm660-tasha-skus-snd-card"))) {
1378 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUS,
1379 sizeof(MIXER_XML_PATH_SKUS));
1380 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1381 msm_be_id_array_len =
1382 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Arusha Goyalfda29152016-12-26 10:53:39 +05301383 } else if (!strncmp(snd_card_name, "sdm660-tavil-snd-card",
1384 sizeof("sdm660-tavil-snd-card"))) {
Naresh Tanniru25873b82016-11-01 14:15:28 +05301385 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9340,
1386 sizeof(MIXER_XML_PATH_WCD9340));
1387 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1388 msm_be_id_array_len =
1389 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Xiaojun Sangc30f0282016-07-18 11:22:09 +08001390 } else if (!strncmp(snd_card_name, "msm8920-sku7-snd-card",
1391 sizeof("msm8920-sku7-snd-card"))) {
1392 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKU1,
1393 MAX_MIXER_XML_PATH);
1394 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1395 msm_be_id_array_len =
1396 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Yamit Mehtaa0d653a2016-11-25 20:33:25 +05301397 } else if (!strncmp(snd_card_name, "apq8009-tashalite-snd-card",
1398 sizeof("apq8009-tashalite-snd-card"))) {
1399 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9326_I2S,
1400 MAX_MIXER_XML_PATH);
1401 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1402 msm_be_id_array_len =
1403 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
1404 } else if (!strncmp(snd_card_name, "mdm9607-tomtom-i2s-snd-card",
1405 sizeof("mdm9607-tomtom-i2s-snd-card"))) {
1406 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9330_I2S,
1407 sizeof(MIXER_XML_PATH_WCD9330_I2S));
1408 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1409 msm_be_id_array_len =
1410 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Siena Richard264ed052017-03-17 10:35:01 -07001411 } else if (!strncmp(snd_card_name, "mdm-tasha-i2s-snd-card",
1412 sizeof("mdm-tasha-i2s-snd-card"))) {
1413 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9335_I2S,
1414 sizeof(MIXER_XML_PATH_WCD9335_I2S));
1415 msm_device_to_be_id = msm_device_to_be_id_external_codec;
1416 msm_be_id_array_len =
1417 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
Asish Bhattacharya4ff24802014-04-24 17:46:54 +05301418 } else {
1419 strlcpy(mixer_xml_path, MIXER_XML_PATH,
1420 sizeof(MIXER_XML_PATH));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07001421
1422 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
1423 msm_be_id_array_len =
1424 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
1425
Asish Bhattacharya4ff24802014-04-24 17:46:54 +05301426 }
1427}
1428
Apoorv Raghuvanshi95333352015-07-06 15:07:14 -07001429void platform_set_echo_reference(struct audio_device *adev, bool enable,
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05301430 audio_devices_t out_device __unused)
Apoorv Raghuvanshi95333352015-07-06 15:07:14 -07001431{
1432 struct platform_data *my_data = (struct platform_data *)adev->platform;
Apoorv Raghuvanshi95333352015-07-06 15:07:14 -07001433
1434 if (strcmp(my_data->ec_ref_mixer_path, "")) {
1435 ALOGV("%s: disabling %s", __func__, my_data->ec_ref_mixer_path);
1436 audio_route_reset_and_update_path(adev->audio_route,
1437 my_data->ec_ref_mixer_path);
1438 }
1439
1440 if (enable) {
Apoorv Raghuvanshi95333352015-07-06 15:07:14 -07001441 if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_HEADPHONES_44_1] > 0)
1442 strlcpy(my_data->ec_ref_mixer_path, "echo-reference headphones-44.1",
1443 sizeof(my_data->ec_ref_mixer_path));
Leena Winterrowdd7a04cd2016-01-07 11:50:02 -08001444 else if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_SPEAKER_VBAT] > 0)
Apoorv Raghuvanshi95333352015-07-06 15:07:14 -07001445 strlcpy(my_data->ec_ref_mixer_path, "vbat-speaker echo-reference",
1446 sizeof(my_data->ec_ref_mixer_path));
1447 else
1448 strlcpy(my_data->ec_ref_mixer_path, "echo-reference",
1449 sizeof(my_data->ec_ref_mixer_path));
1450
1451
1452 ALOGD("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
1453 audio_route_apply_and_update_path(adev->audio_route,
1454 my_data->ec_ref_mixer_path);
1455 }
1456}
Banajit Goswami20cdd212015-09-11 01:11:30 -07001457void platform_set_gsm_mode(void *platform, bool enable)
1458{
1459 struct platform_data *my_data = (struct platform_data *)platform;
1460 struct audio_device *adev = my_data->adev;
1461
1462 if (my_data->gsm_mode_enabled) {
1463 my_data->gsm_mode_enabled = false;
1464 ALOGV("%s: disabling gsm mode", __func__);
1465 audio_route_reset_and_update_path(adev->audio_route, "gsm-mode");
1466 }
1467
1468 if (enable) {
1469 my_data->gsm_mode_enabled = true;
1470 ALOGD("%s: enabling gsm mode", __func__);
1471 audio_route_apply_and_update_path(adev->audio_route, "gsm-mode");
1472 }
1473}
1474
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301475void close_csd_client(struct csd_data *csd)
1476{
1477 if (csd != NULL) {
1478 csd->deinit();
1479 dlclose(csd->csd_client);
1480 free(csd);
1481 csd = NULL;
1482 }
1483}
1484
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05301485
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05301486static void set_platform_defaults(struct platform_data * my_data)
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05301487{
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301488 int32_t dev, count = 0;
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301489 const char *MEDIA_MIMETYPE_AUDIO_ALAC = "audio/alac";
1490 const char *MEDIA_MIMETYPE_AUDIO_APE = "audio/x-ape";
1491
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05301492 for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301493 backend_tag_table[dev] = NULL;
1494 hw_interface_table[dev] = NULL;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05301495 }
1496 for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05301497 backend_bit_width_table[dev] = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05301498 }
1499
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301500 // To overwrite these go to the audio_platform_info.xml file.
1501 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("bt-sco");
1502 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("bt-sco-wb");
1503 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("bt-sco");
1504 backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("bt-sco-wb");
Siddartha Shaik44dd7702017-06-14 12:13:25 +05301505 backend_tag_table[SND_DEVICE_IN_HDMI_MIC] = strdup("hdmi-mic");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301506 backend_tag_table[SND_DEVICE_OUT_BT_SCO] = strdup("bt-sco");
1507 backend_tag_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("bt-sco-wb");
1508 backend_tag_table[SND_DEVICE_OUT_HDMI] = strdup("hdmi");
1509 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("speaker-and-hdmi");
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07001510 backend_tag_table[SND_DEVICE_OUT_DISPLAY_PORT] = strdup("display-port");
1511 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = strdup("speaker-and-display-port");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301512 backend_tag_table[SND_DEVICE_OUT_VOICE_TX] = strdup("afe-proxy");
1513 backend_tag_table[SND_DEVICE_IN_VOICE_RX] = strdup("afe-proxy");
1514 backend_tag_table[SND_DEVICE_OUT_AFE_PROXY] = strdup("afe-proxy");
Ashish Jain3e37a702016-11-25 12:27:15 +05301515 backend_tag_table[SND_DEVICE_OUT_USB_HEADSET] = strdup("usb-headset");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001516 backend_tag_table[SND_DEVICE_OUT_VOICE_USB_HEADSET] = strdup("usb-headset");
Ashish Jain3e37a702016-11-25 12:27:15 +05301517 backend_tag_table[SND_DEVICE_OUT_USB_HEADPHONES] = strdup("usb-headphones");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001518 backend_tag_table[SND_DEVICE_OUT_VOICE_USB_HEADPHONES] = strdup("usb-headphones");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301519 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] =
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05301520 strdup("speaker-and-usb-headphones");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301521 backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MIC] = strdup("usb-headset-mic");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001522 backend_tag_table[SND_DEVICE_IN_VOICE_USB_HEADSET_MIC] = strdup("usb-headset-mic");
1523 backend_tag_table[SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC] = strdup("usb-headset-mic");
1524 backend_tag_table[SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC] = strdup("usb-headset-mic");
1525 backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = strdup("usb-headset-mic");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301526 backend_tag_table[SND_DEVICE_IN_CAPTURE_FM] = strdup("capture-fm");
1527 backend_tag_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("transmission-fm");
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05301528 backend_tag_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("headphones-dsd");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301529 backend_tag_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
1530 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("vbat-voice-speaker");
Rohit kumarf4120402016-08-05 19:19:48 +05301531 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("vbat-voice-speaker-2");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301532 backend_tag_table[SND_DEVICE_OUT_BT_A2DP] = strdup("bt-a2dp");
1533 backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05301534 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
1535 backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05301536
Siena Richard7c2db772016-12-21 11:32:34 -08001537 hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
1538 hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
1539 hw_interface_table[SND_DEVICE_OUT_SPEAKER_EXTERNAL_1] = strdup("SLIMBUS_0_RX");
1540 hw_interface_table[SND_DEVICE_OUT_SPEAKER_EXTERNAL_2] = strdup("SLIMBUS_0_RX");
1541 hw_interface_table[SND_DEVICE_OUT_SPEAKER_REVERSE] = strdup("SLIMBUS_0_RX");
1542 hw_interface_table[SND_DEVICE_OUT_SPEAKER_VBAT] = strdup("SLIMBUS_0_RX");
1543 hw_interface_table[SND_DEVICE_OUT_LINE] = strdup("SLIMBUS_6_RX");
1544 hw_interface_table[SND_DEVICE_OUT_HEADPHONES] = strdup("SLIMBUS_6_RX");
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05301545 hw_interface_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("SLIMBUS_2_RX");
1546 hw_interface_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("SLIMBUS_5_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001547 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 +05301548 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1549 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001550 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1551 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1552 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1553 hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET] = strdup("SLIMBUS_0_RX");
1554 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER] = strdup("SLIMBUS_0_RX");
1555 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("SLIMBUS_0_RX");
1556 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2] = strdup("SLIMBUS_0_RX");
1557 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("SLIMBUS_0_RX");
1558 hw_interface_table[SND_DEVICE_OUT_VOICE_HEADPHONES] = strdup("SLIMBUS_6_RX");
1559 hw_interface_table[SND_DEVICE_OUT_VOICE_LINE] = strdup("SLIMBUS_6_RX");
1560 hw_interface_table[SND_DEVICE_OUT_HDMI] = strdup("HDMI");
1561 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("SLIMBUS_0_RX-and-HDMI");
1562 hw_interface_table[SND_DEVICE_OUT_DISPLAY_PORT] = strdup("DISPLAY_PORT");
1563 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT] = strdup("SLIMBUS_0_RX-and-DISPLAY_PORT");
1564 hw_interface_table[SND_DEVICE_OUT_BT_SCO] = strdup("SLIMBUS_7_RX");
1565 hw_interface_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("SLIMBUS_7_RX");
1566 hw_interface_table[SND_DEVICE_OUT_BT_A2DP] = strdup("SLIMBUS_7_RX");
1567 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("SLIMBUS_0_RX-and-SLIMBUS_7_RX");
1568 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = strdup("SLIMBUS_6_RX");
1569 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = strdup("SLIMBUS_6_RX");
1570 hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = strdup("SLIMBUS_0_RX");
1571 hw_interface_table[SND_DEVICE_OUT_VOICE_TX] = strdup("RT_PROXY_DAI_001_RX");
1572 hw_interface_table[SND_DEVICE_OUT_AFE_PROXY] = strdup("RT_PROXY_DAI_001_RX");
Ashish Jainb26edfb2016-08-25 00:10:11 +05301573 hw_interface_table[SND_DEVICE_OUT_USB_HEADSET] = strdup("USB_AUDIO_RX");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001574 hw_interface_table[SND_DEVICE_OUT_VOICE_USB_HEADSET] = strdup("USB_AUDIO_RX");
Ashish Jain3e37a702016-11-25 12:27:15 +05301575 hw_interface_table[SND_DEVICE_OUT_USB_HEADPHONES] = strdup("USB_AUDIO_RX");
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07001576 hw_interface_table[SND_DEVICE_OUT_VOICE_USB_HEADPHONES] = strdup("USB_AUDIO_RX");
Ashish Jainb26edfb2016-08-25 00:10:11 +05301577 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 -08001578 hw_interface_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("SLIMBUS_8_TX");
1579 hw_interface_table[SND_DEVICE_OUT_ANC_HEADSET] = strdup("SLIMBUS_6_RX");
1580 hw_interface_table[SND_DEVICE_OUT_ANC_FB_HEADSET] = strdup("SLIMBUS_6_RX");
1581 hw_interface_table[SND_DEVICE_OUT_VOICE_ANC_HEADSET] = strdup("SLIMBUS_6_RX");
1582 hw_interface_table[SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = strdup("SLIMBUS_6_RX");
1583 hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
1584 hw_interface_table[SND_DEVICE_OUT_ANC_HANDSET] = strdup("SLIMBUS_0_RX");
Aditya Bavanari701a6992017-03-30 19:17:16 +05301585 hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
1586 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
1587 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = strdup("SLIMBUS_0_RX");
1588 hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
1589 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
1590 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
Siena Richard7c2db772016-12-21 11:32:34 -08001591 hw_interface_table[SND_DEVICE_OUT_SPEAKER_WSA] = strdup("SLIMBUS_0_RX");
1592 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = strdup("SLIMBUS_0_RX");
1593 hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = strdup("SLIMBUS_0_RX");
1594#ifdef RECORD_PLAY_CONCURRENCY
1595 hw_interface_table[SND_DEVICE_OUT_VOIP_HANDSET] = strdup("SLIMBUS_0_RX");
1596 hw_interface_table[SND_DEVICE_OUT_VOIP_SPEAKER] = strdup("SLIMBUS_0_RX");
1597 hw_interface_table[SND_DEVICE_OUT_VOIP_HEADPHONES] = strdup("SLIMBUS_6_RX");
1598#endif
1599 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
1600 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = strdup("SLIMBUS_0_TX");
1601 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_AEC] = strdup("SLIMBUS_0_TX");
1602 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_NS] = strdup("SLIMBUS_0_TX");
1603 hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1604 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC] = strdup("SLIMBUS_0_TX");
1605 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC_AEC] = strdup("SLIMBUS_0_TX");
1606 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC_NS] = strdup("SLIMBUS_0_TX");
1607 hw_interface_table[SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1608 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC] = strdup("SLIMBUS_0_TX");
1609 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_AEC] = strdup("SLIMBUS_0_TX");
1610 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_NS] = strdup("SLIMBUS_0_TX");
1611 hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1612 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
1613 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC] = strdup("SLIMBUS_0_TX");
1614 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_NS] = strdup("SLIMBUS_0_TX");
1615 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1616 hw_interface_table[SND_DEVICE_IN_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1617 hw_interface_table[SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = strdup("SLIMBUS_0_TX");
1618 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = strdup("SLIMBUS_0_TX");
1619 hw_interface_table[SND_DEVICE_IN_VOICE_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1620 hw_interface_table[SND_DEVICE_IN_HDMI_MIC] = strdup("HDMI");
1621 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("SLIMBUS_7_TX");
1622 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("SLIMBUS_7_TX");
1623 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("SLIMBUS_7_TX");
1624 hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("SLIMBUS_7_TX");
1625 hw_interface_table[SND_DEVICE_IN_CAMCORDER_MIC] = strdup("SLIMBUS_0_TX");
1626 hw_interface_table[SND_DEVICE_IN_VOICE_DMIC] = strdup("SLIMBUS_0_TX");
1627 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
1628 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = strdup("SLIMBUS_0_TX");
1629 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1630 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
1631 hw_interface_table[SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
1632 hw_interface_table[SND_DEVICE_IN_VOICE_REC_MIC] = strdup("SLIMBUS_0_TX");
1633 hw_interface_table[SND_DEVICE_IN_VOICE_REC_MIC_NS] = strdup("SLIMBUS_0_TX");
1634 hw_interface_table[SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = strdup("SLIMBUS_0_TX");
1635 hw_interface_table[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = strdup("SLIMBUS_0_TX");
1636 hw_interface_table[SND_DEVICE_IN_VOICE_RX] = strdup("RT_PROXY_DAI_002_TX");
1637 hw_interface_table[SND_DEVICE_IN_USB_HEADSET_MIC] = strdup("USB_AUDIO_TX");
1638 hw_interface_table[SND_DEVICE_IN_CAPTURE_FM] = strdup("SLIMBUS_8_TX");
1639 hw_interface_table[SND_DEVICE_IN_AANC_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
1640 hw_interface_table[SND_DEVICE_IN_QUAD_MIC] = strdup("SLIMBUS_0_TX");
1641 hw_interface_table[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = strdup("SLIMBUS_0_TX");
1642 hw_interface_table[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = strdup("SLIMBUS_0_TX");
1643 hw_interface_table[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = strdup("SLIMBUS_4_TX");
1644 hw_interface_table[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = strdup("SLIMBUS_4_TX");
1645 hw_interface_table[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = strdup("SLIMBUS_4_TX");
1646 hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = strdup("SLIMBUS_0_TX");
1647 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = strdup("SLIMBUS_0_TX");
1648 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = strdup("SLIMBUS_0_TX");
1649 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = strdup("SLIMBUS_0_TX");
1650 hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = strdup("SLIMBUS_0_TX");
1651 hw_interface_table[SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = strdup("SLIMBUS_0_TX");
1652 hw_interface_table[SND_DEVICE_IN_HANDSET_QMIC] = strdup("SLIMBUS_0_TX");
1653 hw_interface_table[SND_DEVICE_IN_SPEAKER_QMIC_AEC] = strdup("SLIMBUS_0_TX");
1654 hw_interface_table[SND_DEVICE_IN_SPEAKER_QMIC_NS] = strdup("SLIMBUS_0_TX");
1655 hw_interface_table[SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
1656 hw_interface_table[SND_DEVICE_IN_THREE_MIC] = strdup("SLIMBUS_0_TX");
1657 hw_interface_table[SND_DEVICE_IN_HANDSET_TMIC] = strdup("SLIMBUS_0_TX");
1658 hw_interface_table[SND_DEVICE_IN_VOICE_REC_TMIC] = strdup("SLIMBUS_0_TX");
1659 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_MIC] = strdup("SLIMBUS_0_TX");
1660 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = strdup("SLIMBUS_0_TX");
1661 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = strdup("SLIMBUS_0_TX");
1662 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = strdup("SLIMBUS_0_TX");
1663 hw_interface_table[SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +05301664 hw_interface_table[SND_DEVICE_IN_HANDSET_GENERIC_QMIC] = strdup("SLIMBUS_0_TX");
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301665
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05301666 my_data->max_mic_count = PLATFORM_DEFAULT_MIC_COUNT;
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301667 /*remove ALAC & APE from DSP decoder list based on software decoder availability*/
Alexy Josephb1379942016-01-29 15:49:38 -08001668 for (count = 0; count < (int32_t) (sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]));
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301669 count++) {
1670
1671 if (!strncmp(MEDIA_MIMETYPE_AUDIO_ALAC, dsp_only_decoders_mime[count],
1672 strlen(dsp_only_decoders_mime[count]))) {
1673
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07001674 if(property_get_bool("vendor.audio.use.sw.alac.decoder", false)) {
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301675 ALOGD("Alac software decoder is available...removing alac from DSP decoder list");
Preetam Singh Ranawat53194302016-03-15 16:37:42 +05301676 strlcpy(dsp_only_decoders_mime[count],"none",5);
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301677 }
1678 } else if (!strncmp(MEDIA_MIMETYPE_AUDIO_APE, dsp_only_decoders_mime[count],
1679 strlen(dsp_only_decoders_mime[count]))) {
1680
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07001681 if(property_get_bool("vendor.audio.use.sw.ape.decoder", false)) {
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301682 ALOGD("APE software decoder is available...removing ape from DSP decoder list");
Preetam Singh Ranawat53194302016-03-15 16:37:42 +05301683 strlcpy(dsp_only_decoders_mime[count],"none",5);
Naresh Tanniru34a303c2016-01-27 17:26:41 +05301684 }
1685 }
1686 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05301687}
1688
Avinash Vaish71c066d2014-08-27 12:32:35 +05301689void get_cvd_version(char *cvd_version, struct audio_device *adev)
1690{
1691 struct mixer_ctl *ctl;
1692 int count;
1693 int ret = 0;
1694
1695 ctl = mixer_get_ctl_by_name(adev->mixer, CVD_VERSION_MIXER_CTL);
1696 if (!ctl) {
1697 ALOGE("%s: Could not get ctl for mixer cmd - %s", __func__, CVD_VERSION_MIXER_CTL);
1698 goto done;
1699 }
1700 mixer_ctl_update(ctl);
1701
1702 count = mixer_ctl_get_num_values(ctl);
1703 if (count > MAX_CVD_VERSION_STRING_SIZE)
1704 count = MAX_CVD_VERSION_STRING_SIZE;
1705
1706 ret = mixer_ctl_get_array(ctl, cvd_version, count);
1707 if (ret != 0) {
1708 ALOGE("%s: ERROR! mixer_ctl_get_array() failed to get CVD Version", __func__);
1709 goto done;
1710 }
1711
1712done:
1713 return;
1714}
1715
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301716static int hw_util_open(int card_no)
1717{
1718 int fd = -1;
1719 char dev_name[256];
1720
1721 snprintf(dev_name, sizeof(dev_name), "/dev/snd/hwC%uD%u",
1722 card_no, WCD9XXX_CODEC_HWDEP_NODE);
1723 ALOGD("%s Opening device %s\n", __func__, dev_name);
1724 fd = open(dev_name, O_WRONLY);
1725 if (fd < 0) {
1726 ALOGE("%s: cannot open device '%s'\n", __func__, dev_name);
1727 return fd;
1728 }
1729 ALOGD("%s success", __func__);
1730 return fd;
1731}
1732
1733struct param_data {
1734 int use_case;
1735 int acdb_id;
1736 int get_size;
1737 int buff_size;
1738 int data_size;
1739 void *buff;
1740};
1741
Banajit Goswami20cdd212015-09-11 01:11:30 -07001742static int send_vbat_adc_data_to_acdb(struct platform_data *plat_data, char *cal_type)
1743{
1744 int ret = 0;
1745 struct mixer_ctl *ctl;
1746 uint16_t vbat_adc_data[2];
1747 struct platform_data *my_data = plat_data;
1748 struct audio_device *adev = my_data->adev;
1749
1750 const char *mixer_ctl_name = "Vbat ADC data";
1751
1752 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1753 if (!ctl) {
1754 ALOGE("%s: Could not get ctl for mixer ctl name - %s",
1755 __func__, mixer_ctl_name);
1756 ret = -EINVAL;
1757 goto done;
1758 }
1759
1760 vbat_adc_data[0] = mixer_ctl_get_value(ctl, 0);
1761 vbat_adc_data[1] = mixer_ctl_get_value(ctl, 1);
1762
1763 ALOGD("%s: Vbat ADC output values: Dcp1: %d , Dcp2: %d",
1764 __func__, vbat_adc_data[0], vbat_adc_data[1]);
1765
1766 ret = my_data->acdb_set_codec_data(&vbat_adc_data[0], cal_type);
1767
1768done:
1769 return ret;
1770}
1771
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301772static void send_codec_cal(acdb_loader_get_calibration_t acdb_loader_get_calibration,
Banajit Goswami20cdd212015-09-11 01:11:30 -07001773 struct platform_data *plat_data, int fd)
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301774{
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301775 int type;
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301776
1777 for (type = WCD9XXX_ANC_CAL; type < WCD9XXX_MAX_CAL; type++) {
1778 struct wcdcal_ioctl_buffer codec_buffer;
1779 struct param_data calib;
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301780 int ret;
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301781
Bharath Ramachandramurthy63a47ef2015-08-31 17:41:46 -07001782 /* MAD calibration is handled by sound trigger HAL, skip here */
1783 if (type == WCD9XXX_MAD_CAL)
1784 continue;
1785
Banajit Goswami20cdd212015-09-11 01:11:30 -07001786 if((plat_data->is_vbat_speaker) && (WCD9XXX_VBAT_CAL == type)) {
1787 ret = send_vbat_adc_data_to_acdb(plat_data, cal_name_info[type]);
1788 if (ret < 0)
1789 ALOGE("%s error in sending vbat adc data to acdb", __func__);
1790 }
1791
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301792 calib.get_size = 1;
1793 ret = acdb_loader_get_calibration(cal_name_info[type], sizeof(struct param_data),
1794 &calib);
1795 if (ret < 0) {
1796 ALOGE("%s get_calibration failed\n", __func__);
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301797 continue;
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301798 }
1799 calib.get_size = 0;
1800 calib.buff = malloc(calib.buff_size);
Sidipotu Ashok04ab3d32014-12-30 10:28:31 +05301801 if(calib.buff == NULL) {
1802 ALOGE("%s mem allocation for %d bytes for %s failed\n"
1803 , __func__, calib.buff_size, cal_name_info[type]);
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301804 continue;
Sidipotu Ashok04ab3d32014-12-30 10:28:31 +05301805 }
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301806 ret = acdb_loader_get_calibration(cal_name_info[type],
1807 sizeof(struct param_data), &calib);
1808 if (ret < 0) {
Sidipotu Ashok04ab3d32014-12-30 10:28:31 +05301809 ALOGE("%s get_calibration failed type=%s calib.size=%d\n"
Preetam Singh Ranawat53194302016-03-15 16:37:42 +05301810 , __func__, cal_name_info[type], calib.buff_size);
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301811 free(calib.buff);
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301812 continue;
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301813 }
1814 codec_buffer.buffer = calib.buff;
1815 codec_buffer.size = calib.data_size;
1816 codec_buffer.cal_type = type;
1817 if (ioctl(fd, SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE, &codec_buffer) < 0)
Sidipotu Ashok04ab3d32014-12-30 10:28:31 +05301818 ALOGE("Failed to call ioctl for %s err=%d calib.size=%d",
1819 cal_name_info[type], errno, codec_buffer.size);
1820 ALOGD("%s cal sent for %s calib.size=%d"
1821 , __func__, cal_name_info[type], codec_buffer.size);
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301822 free(calib.buff);
1823 }
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301824}
1825
1826static void audio_hwdep_send_cal(struct platform_data *plat_data)
1827{
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301828 int fd = plat_data->hw_dep_fd;
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301829
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301830 if (fd < 0)
1831 fd = hw_util_open(plat_data->adev->snd_card);
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301832 if (fd == -1) {
1833 ALOGE("%s error open\n", __func__);
1834 return;
1835 }
1836
1837 acdb_loader_get_calibration = (acdb_loader_get_calibration_t)
1838 dlsym(plat_data->acdb_handle, "acdb_loader_get_calibration");
1839
1840 if (acdb_loader_get_calibration == NULL) {
1841 ALOGE("%s: ERROR. dlsym Error:%s acdb_loader_get_calibration", __func__,
1842 dlerror());
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301843 if (fd >= 0) {
1844 close(fd);
1845 plat_data->hw_dep_fd = -1;
1846 }
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301847 return;
1848 }
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05301849
1850 send_codec_cal(acdb_loader_get_calibration, plat_data, fd);
1851 plat_data->hw_dep_fd = fd;
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301852}
1853
Naresh Tanniru516c2452015-08-14 12:58:24 +05301854const char * get_snd_card_name_for_acdb_loader(const char *snd_card_name) {
1855
1856 if(snd_card_name == NULL)
1857 return NULL;
1858
1859 // Both tasha & tasha-lite uses tasha ACDB files
1860 // simulate sound card name for tasha lite, so that
1861 // ACDB module loads tasha ACDB files for tasha lite
1862 if(!strncmp(snd_card_name, "msm8976-tashalite-snd-card",
1863 sizeof("msm8976-tashalite-snd-card"))) {
Naresh Tanniru4d1e1a12015-12-16 19:37:50 +05301864 ALOGD("using tasha ACDB files for tasha-lite");
1865 return "msm8976-tasha-snd-card";
1866 }
1867
1868 if(!strncmp(snd_card_name, "msm8952-tashalite-snd-card",
1869 sizeof("msm8952-tashalite-snd-card"))) {
1870 ALOGD("using tasha ACDB files for tasha-lite");
1871 return "msm8952-tasha-snd-card";
1872 }
1873
1874 if(!strncmp(snd_card_name, "msm8937-tashalite-snd-card",
1875 sizeof("msm8937-tashalite-snd-card"))) {
1876 ALOGD("using tasha ACDB files for tasha-lite");
1877 return "msm8937-tasha-snd-card";
1878 }
1879
1880 if(!strncmp(snd_card_name, "msm8953-tashalite-snd-card",
1881 sizeof("msm8953-tashalite-snd-card"))) {
1882 ALOGD("using tasha ACDB files for tasha-lite");
1883 return "msm8953-tasha-snd-card";
1884 }
1885
Arusha Goyalfda29152016-12-26 10:53:39 +05301886 if(!strncmp(snd_card_name, "sdm660-tashalite-snd-card",
1887 sizeof("sdm660-tashalite-snd-card"))) {
Naresh Tanniru25873b82016-11-01 14:15:28 +05301888 ALOGD("using tasha ACDB files for tasha-lite");
Arusha Goyalfda29152016-12-26 10:53:39 +05301889 return "sdm660-tasha-snd-card";
Naresh Tanniru25873b82016-11-01 14:15:28 +05301890 }
Divya Narayanan Poojary75bda5b2017-04-20 16:26:00 +05301891
1892 // Both tasha & tasha-lite uses tasha ACDB files
1893 // simulate sound card name for tasha lite, so that
1894 // ACDB module loads tasha ACDB files for tasha lite
1895 if(!strncmp(snd_card_name, "msm8x09-tasha9326-snd-card",
1896 sizeof("msm8x09-tasha9326-snd-card"))) {
1897 ALOGD("using tasha ACDB files for tasha-lite");
1898 return "msm8x09-tasha-snd-card";
1899 }
Naresh Tanniru4d1e1a12015-12-16 19:37:50 +05301900 return snd_card_name;
Naresh Tanniru516c2452015-08-14 12:58:24 +05301901}
1902
1903
1904int platform_acdb_init(void *platform)
Ramjee Singh203473b2015-06-09 15:18:42 +05301905{
1906 struct platform_data *my_data = (struct platform_data *)platform;
1907 char *cvd_version = NULL;
Naresh Tanniru516c2452015-08-14 12:58:24 +05301908 const char *snd_card_name, *acdb_snd_card_name;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05301909 int result = -1;
1910 struct listnode *node;
1911 struct meta_key_list *key_info;
1912 int key = 0;
1913
Ramjee Singh203473b2015-06-09 15:18:42 +05301914 cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301915 if (!cvd_version) {
Ramjee Singh203473b2015-06-09 15:18:42 +05301916 ALOGE("Failed to allocate cvd version");
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301917 return -1;
1918 } else {
Ramjee Singh203473b2015-06-09 15:18:42 +05301919 get_cvd_version(cvd_version, my_data->adev);
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05301920 }
Ramjee Singh203473b2015-06-09 15:18:42 +05301921
Ramjee Singh203473b2015-06-09 15:18:42 +05301922 snd_card_name = mixer_get_name(my_data->adev->mixer);
Naresh Tanniru516c2452015-08-14 12:58:24 +05301923 acdb_snd_card_name = get_snd_card_name_for_acdb_loader(snd_card_name);
1924
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05301925 if (my_data->acdb_init_v3) {
1926 result = my_data->acdb_init_v3(acdb_snd_card_name, cvd_version,
1927 &my_data->acdb_meta_key_list);
1928 } else if (my_data->acdb_init) {
1929 node = list_head(&my_data->acdb_meta_key_list);
1930 key_info = node_to_item(node, struct meta_key_list, list);
1931 key = key_info->cal_info.nKey;
1932 result = my_data->acdb_init(acdb_snd_card_name, cvd_version, key);
1933 }
Karthik Reddy Katta8513f432016-04-12 14:29:27 +05301934 /* Save these variables in platform_data. These will be used
1935 while reloading ACDB files during run time. */
1936 strlcpy(my_data->cvd_version, cvd_version, MAX_CVD_VERSION_STRING_SIZE);
1937 strlcpy(my_data->snd_card_name, acdb_snd_card_name,
1938 MAX_SND_CARD_STRING_SIZE);
Karthik Reddy Katta8513f432016-04-12 14:29:27 +05301939
Ramjee Singh203473b2015-06-09 15:18:42 +05301940 if (cvd_version)
1941 free(cvd_version);
1942 if (!result) {
1943 my_data->is_acdb_initialized = true;
1944 ALOGD("ACDB initialized");
1945 audio_hwdep_send_cal(my_data);
1946 } else {
1947 my_data->is_acdb_initialized = false;
1948 ALOGD("ACDB initialization failed");
1949 }
1950 return result;
1951}
1952
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05301953#define MAX_PATH (256)
1954#define THERMAL_SYSFS "/sys/class/thermal"
1955#define TZ_TYPE "/sys/class/thermal/thermal_zone%d/type"
1956#define TZ_WSA "/sys/class/thermal/thermal_zone%d/temp"
1957
Naresh Tanniru74a2eee2016-02-10 13:38:19 +05301958static bool check_and_get_wsa_info(char *snd_card_name, int *wsaCount,
1959 bool *is_wsa_combo_supported)
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05301960{
1961 DIR *tdir = NULL;
1962 struct dirent *tdirent = NULL;
1963 int tzn = 0;
1964 char name[MAX_PATH] = {0};
1965 char cwd[MAX_PATH] = {0};
1966 char file[10] = "wsa";
1967 bool found = false;
1968 int wsa_count = 0;
1969
Naresh Tanniru25873b82016-11-01 14:15:28 +05301970 /* SL/SH hardware always has wsa by default, no need to add wsa */
Preetam Singh Ranawat76bb8632017-01-30 19:46:03 +05301971 if(snd_card_name && !strncmp(snd_card_name, "sdm660", strlen("sdm660"))) {
Arusha Goyalfda29152016-12-26 10:53:39 +05301972 ALOGD(" Ignore WSA extension for sdm 660 varients");
Naresh Tanniru25873b82016-11-01 14:15:28 +05301973 return false;
1974 }
1975
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05301976 if (!getcwd(cwd, sizeof(cwd)))
1977 return false;
1978
1979 chdir(THERMAL_SYSFS); /* Change dir to read the entries. Doesnt work
1980 otherwise */
1981 tdir = opendir(THERMAL_SYSFS);
1982 if (!tdir) {
1983 ALOGE("Unable to open %s\n", THERMAL_SYSFS);
1984 return false;
1985 }
1986
1987 while ((tdirent = readdir(tdir))) {
1988 char buf[50];
1989 struct dirent *tzdirent;
1990 DIR *tzdir = NULL;
1991
1992 tzdir = opendir(tdirent->d_name);
1993 if (!tzdir)
1994 continue;
1995 while ((tzdirent = readdir(tzdir))) {
1996 if (strcmp(tzdirent->d_name, "type"))
1997 continue;
1998 snprintf(name, MAX_PATH, TZ_TYPE, tzn);
1999 ALOGD("Opening %s\n", name);
2000 read_line_from_file(name, buf, sizeof(buf));
2001 if (strstr(buf, file)) {
2002 wsa_count++;
2003 /*We support max only two WSA speakers*/
2004 if (wsa_count == 2)
2005 break;
2006 }
2007 tzn++;
2008 }
2009 closedir(tzdir);
2010 }
2011 if (wsa_count > 0){
2012 ALOGD("Found %d WSA present on the platform", wsa_count);
2013 found = true;
2014 *wsaCount = wsa_count;
Naresh Tanniru74a2eee2016-02-10 13:38:19 +05302015
2016 /* update wsa combo supported flag based on sound card name */
2017 /* wsa combo flag needs to be set to true only for hardware
2018 combinations which has support for both wsa and non-wsa speaker */
Preetam Singh Ranawat53194302016-03-15 16:37:42 +05302019 *is_wsa_combo_supported = false;
2020 if(snd_card_name) {
2021 if ((!strncmp(snd_card_name, "msm8953-snd-card-mtp",
2022 sizeof("msm8953-snd-card-mtp")) ||
2023 (!strncmp(snd_card_name, "msm8952-skum-snd-card",
2024 sizeof("msm8952-skum-snd-card"))))) {
2025 *is_wsa_combo_supported = true;
2026 }
Naresh Tanniru74a2eee2016-02-10 13:38:19 +05302027 }
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05302028 }
2029 closedir(tdir);
2030 chdir(cwd); /* Restore current working dir */
2031 return found;
2032}
2033
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302034static void get_source_mic_type(struct platform_data * my_data)
2035{
2036 // support max to mono, example if max count is 3, usecase supports Three, dual and mono mic
2037 switch (my_data->max_mic_count) {
Garmond Leunge2433c32017-09-28 21:51:22 -07002038 case 6:
2039 my_data->source_mic_type |= SOURCE_HEX_MIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302040 case 4:
2041 my_data->source_mic_type |= SOURCE_QUAD_MIC;
2042 case 3:
2043 my_data->source_mic_type |= SOURCE_THREE_MIC;;
2044 case 2:
2045 my_data->source_mic_type |= SOURCE_DUAL_MIC;
2046 case 1:
2047 my_data->source_mic_type |= SOURCE_MONO_MIC;
2048 break;
2049 default:
2050 ALOGE("%s: max_mic_count (%d), is not supported, setting to default",
2051 __func__, my_data->max_mic_count);
2052 my_data->source_mic_type = SOURCE_MONO_MIC | SOURCE_DUAL_MIC;
2053 break;
2054 }
2055}
2056
Siena Richard7c2db772016-12-21 11:32:34 -08002057/*
2058 * Retrieves the be_dai_name_table from kernel to enable a mapping
2059 * between sound device hw interfaces and backend IDs. This allows HAL to
2060 * specify the backend a specific calibration is needed for.
2061 */
2062static int init_be_dai_name_table(struct audio_device *adev)
2063{
2064 const char *mixer_ctl_name = "Backend DAI Name Table";
2065 struct mixer_ctl *ctl;
2066 int i, j, ret, size;
2067 bool valid_hw_interface;
2068
2069 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
2070 if (!ctl) {
2071 ALOGE("%s: Could not get ctl for mixer name %s\n",
2072 __func__, mixer_ctl_name);
2073 ret = -EINVAL;
2074 goto done;
2075 }
2076
2077 mixer_ctl_update(ctl);
2078
2079 size = mixer_ctl_get_num_values(ctl);
2080 if (size <= 0){
2081 ALOGE("%s: Failed to get %s size %d\n",
2082 __func__, mixer_ctl_name, size);
2083 ret = -EFAULT;
2084 goto done;
2085 }
2086
2087 be_dai_name_table =
2088 (const struct be_dai_name_struct *)calloc(1, size);
2089 if (be_dai_name_table == NULL) {
2090 ALOGE("%s: Failed to allocate memory for %s\n",
2091 __func__, mixer_ctl_name);
2092 ret = -ENOMEM;
2093 goto freeMem;
2094 }
2095
2096 ret = mixer_ctl_get_array(ctl, (void *)be_dai_name_table, size);
2097 if (ret) {
2098 ALOGE("%s: Failed to get %s, ret %d\n",
2099 __func__, mixer_ctl_name, ret);
2100 ret = -EFAULT;
2101 goto freeMem;
2102 }
2103
2104 if (be_dai_name_table != NULL) {
2105 max_be_dai_names = size / sizeof(struct be_dai_name_struct);
2106 ALOGV("%s: Successfully got %s, number of be dais is %d\n",
2107 __func__, mixer_ctl_name, max_be_dai_names);
2108 ret = 0;
2109 } else {
2110 ALOGE("%s: Failed to get %s\n", __func__, mixer_ctl_name);
2111 ret = -EFAULT;
2112 goto freeMem;
2113 }
2114
2115 /*
2116 * Validate all sound devices have a valid backend set to catch
2117 * errors for uncommon sound devices
2118 */
2119 for (i = 0; i < SND_DEVICE_MAX; i++) {
2120 valid_hw_interface = false;
2121
2122 if (hw_interface_table[i] == NULL) {
2123 ALOGW("%s: sound device %s has no hw interface set\n",
2124 __func__, platform_get_snd_device_name(i));
2125 continue;
2126 }
2127
2128 for (j = 0; j < max_be_dai_names; j++) {
2129 if (strcmp(hw_interface_table[i], be_dai_name_table[j].be_name)
2130 == 0) {
2131 valid_hw_interface = true;
2132 break;
2133 }
2134 }
2135 if (!valid_hw_interface)
2136 ALOGD("%s: sound device %s does not have a valid hw interface set (disregard for combo devices) %s\n",
2137 __func__, platform_get_snd_device_name(i), hw_interface_table[i]);
2138 }
2139
2140 goto done;
2141
2142freeMem:
2143 if (be_dai_name_table) {
2144 free((void *)be_dai_name_table);
2145 be_dai_name_table = NULL;
2146 }
2147
2148done:
2149 return ret;
2150}
2151
Naresh Tannirue3b18452014-03-04 14:44:27 +05302152void *platform_init(struct audio_device *adev)
2153{
2154 char value[PROPERTY_VALUE_MAX];
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302155 struct platform_data *my_data = NULL;
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002156 int snd_card_num = 0;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302157 const char *snd_card_name;
Yeleswarapu Nagaradhesh09f30be2015-07-22 14:11:03 +05302158 char mixer_xml_path[MAX_MIXER_XML_PATH],ffspEnable[PROPERTY_VALUE_MAX];
Satish Babu Patakokilabbd4e9d2015-05-13 22:08:06 +05302159 const char *mixer_ctl_name = "Set HPX ActiveBe";
2160 struct mixer_ctl *ctl = NULL;
Naveen Kumar70e27352015-07-22 21:07:10 +05302161 int idx;
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05302162 int wsaCount =0;
Naresh Tanniru74a2eee2016-02-10 13:38:19 +05302163 bool is_wsa_combo_supported = false;
`Deeraj Soman676c2702017-09-18 19:25:53 +05302164 const char *id_string = NULL;
2165 int cfg_value = -1;
Naveen Kumar70e27352015-07-22 21:07:10 +05302166
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002167 snd_card_num = audio_extn_utils_get_snd_card_num();
2168 if(snd_card_num < 0) {
2169 ALOGE("%s: Unable to find correct sound card", __func__);
2170 return NULL;
2171 }
2172
2173 adev->snd_card = snd_card_num;
2174 ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
2175
2176 adev->mixer = mixer_open(snd_card_num);
2177 if (!adev->mixer) {
2178 ALOGE("%s: Unable to open the mixer card: %d", __func__,
2179 snd_card_num);
2180 return NULL;
2181 }
2182
2183 snd_card_name = mixer_get_name(adev->mixer);
2184 ALOGD("%s: snd_card_name: %s", __func__, snd_card_name);
2185
Naveen Kumar70e27352015-07-22 21:07:10 +05302186 my_data = calloc(1, sizeof(struct platform_data));
2187
Chaithanya Krishna Bacharajudb6236a2015-01-30 10:08:33 +05302188 if (!my_data) {
2189 ALOGE("failed to allocate platform data");
2190 return NULL;
2191 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05302192
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002193 my_data->hw_info = hw_info_init(snd_card_name);
2194 if (!my_data->hw_info) {
2195 ALOGE("%s: Failed to init hardware info", __func__);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302196 free(my_data);
2197 return NULL;
2198 }
2199
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002200 query_platform(snd_card_name, mixer_xml_path);
2201 ALOGD("%s: mixer path file is %s", __func__,
2202 mixer_xml_path);
2203 if (audio_extn_read_xml(adev, snd_card_num, mixer_xml_path,
2204 MIXER_XML_PATH_AUXPCM) == -ENOSYS) {
2205 adev->audio_route = audio_route_init(snd_card_num,
2206 mixer_xml_path);
2207 }
2208 if (!adev->audio_route) {
2209 ALOGE("%s: Failed to init audio route controls, aborting.",
2210 __func__);
2211 free(my_data);
2212 mixer_close(adev->mixer);
2213 return NULL;
2214 }
2215 update_codec_type(snd_card_name);
2216 update_interface(snd_card_name);
2217
Naresh Tannirue3b18452014-03-04 14:44:27 +05302218 my_data->adev = adev;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302219 my_data->fluence_in_spkr_mode = false;
2220 my_data->fluence_in_voice_call = false;
2221 my_data->fluence_in_voice_rec = false;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302222 my_data->fluence_in_audio_rec = false;
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302223 my_data->fluence_in_hfp_call = false;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302224 my_data->external_spk_1 = false;
2225 my_data->external_spk_2 = false;
2226 my_data->external_mic = false;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302227 my_data->fluence_type = FLUENCE_NONE;
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05302228 my_data->fluence_mode = FLUENCE_ENDFIRE;
Avinash Vaishd5fa4572014-09-15 14:41:14 +05302229 my_data->slowtalk = false;
2230 my_data->hd_voice = false;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302231 my_data->edid_info = NULL;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07002232 my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +05302233 my_data->is_wsa_speaker = false;
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05302234 my_data->hw_dep_fd = -1;
Rohit kumarf4120402016-08-05 19:19:48 +05302235 my_data->mono_speaker = SPKR_1;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302236
Siena Richard7c2db772016-12-21 11:32:34 -08002237 be_dai_name_table = NULL;
2238
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002239 property_get("ro.vendor.audio.sdk.fluencetype", my_data->fluence_cap, "");
Garmond Leunge2433c32017-09-28 21:51:22 -07002240 if (!strncmp("fluenceffv", my_data->fluence_cap, sizeof("fluenceffv"))) {
2241 my_data->fluence_type = FLUENCE_HEX_MIC | FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC;
2242 } else if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302243 my_data->fluence_type = FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC;
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05302244 } else if (!strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302245 my_data->fluence_type = FLUENCE_DUAL_MIC;
2246 } else {
2247 my_data->fluence_type = FLUENCE_NONE;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302248 }
2249
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302250 if (my_data->fluence_type != FLUENCE_NONE) {
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002251 property_get("persist.vendor.audio.fluence.voicecall",value,"");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302252 if (!strncmp("true", value, sizeof("true"))) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05302253 my_data->fluence_in_voice_call = true;
2254 }
2255
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002256 property_get("persist.vendor.audio.fluence.voicerec",value,"");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302257 if (!strncmp("true", value, sizeof("true"))) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05302258 my_data->fluence_in_voice_rec = true;
2259 }
2260
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002261 property_get("persist.vendor.audio.fluence.audiorec",value,"");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302262 if (!strncmp("true", value, sizeof("true"))) {
2263 my_data->fluence_in_audio_rec = true;
2264 }
2265
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002266 property_get("persist.vendor.audio.fluence.speaker",value,"");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302267 if (!strncmp("true", value, sizeof("true"))) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05302268 my_data->fluence_in_spkr_mode = true;
2269 }
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05302270
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002271 property_get("persist.vendor.audio.fluence.mode",value,"");
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05302272 if (!strncmp("broadside", value, sizeof("broadside"))) {
2273 my_data->fluence_mode = FLUENCE_BROADSIDE;
2274 }
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302275
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002276 property_get("persist.vendor.audio.fluence.hfpcall",value,"");
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302277 if (!strncmp("true", value, sizeof("true"))) {
2278 my_data->fluence_in_hfp_call = true;
2279 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05302280 }
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05302281
Alexy Josephb1379942016-01-29 15:49:38 -08002282 if (check_and_get_wsa_info((char *)snd_card_name, &wsaCount, &is_wsa_combo_supported)) {
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05302283 /*Set ACDB ID of Stereo speaker if two WSAs are present*/
2284 /*Default ACDB ID for wsa speaker is that for mono*/
2285 if (wsaCount == 2) {
2286 platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_WSA, 15);
2287 platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_VBAT, 15);
2288 }
Naresh Tanniru74a2eee2016-02-10 13:38:19 +05302289
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05302290 my_data->is_wsa_speaker = true;
Naresh Tanniru74a2eee2016-02-10 13:38:19 +05302291
2292 if (is_wsa_combo_supported)
2293 hw_info_enable_wsa_combo_usecase_support(my_data->hw_info);
2294
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05302295 }
2296
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002297 property_get("persist.vendor.audio.FFSP.enable", ffspEnable, "");
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +05302298 if (!strncmp("true", ffspEnable, sizeof("true"))) {
2299 acdb_device_table[SND_DEVICE_OUT_SPEAKER] = 131;
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +05302300 acdb_device_table[SND_DEVICE_OUT_SPEAKER_WSA] = 131;
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +05302301 acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE] = 131;
2302 acdb_device_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 131;
2303 acdb_device_table[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 131;
2304 }
Dhananjay Kumara3565b32014-07-23 01:12:48 +05302305
Banajit Goswami20cdd212015-09-11 01:11:30 -07002306 /* Check if Vbat speaker enabled property is set, this should be done before acdb init */
2307 bool ret = false;
2308 ret = audio_extn_can_use_vbat();
2309 if (ret)
2310 my_data->is_vbat_speaker = true;
2311
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +05302312 /*
2313 * Check if hifi audio( i.e. 96, 192 KHZ) is enabled for this platform,
2314 * enable hifi audio by default for external codec targets
2315 */
2316 ret = audio_extn_is_hifi_audio_supported();
2317 if (ret || is_external_codec)
2318 my_data->hifi_audio = true;
2319
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302320 list_init(&my_data->acdb_meta_key_list);
2321
2322 set_platform_defaults(my_data);
2323
2324 /* Initialize ACDB and PCM ID's */
2325 if (is_external_codec)
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002326 platform_info_init(PLATFORM_INFO_XML_PATH_EXTCODEC, my_data, PLATFORM);
Walter Yangb3540112017-03-01 14:05:03 +08002327 else if (!strncmp(snd_card_name, "sdm660-snd-card-skush",
2328 sizeof("sdm660-snd-card-skush")))
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002329 platform_info_init(PLATFORM_INFO_XML_PATH_SKUSH, my_data, PLATFORM);
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302330 else
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002331 platform_info_init(PLATFORM_INFO_XML_PATH, my_data, PLATFORM);
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302332
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302333 my_data->voice_feature_set = VOICE_FEATURE_SET_DEFAULT;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302334 my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
2335 if (my_data->acdb_handle == NULL) {
2336 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
2337 } else {
2338 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
2339 my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle,
2340 "acdb_loader_deallocate_ACDB");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302341 if (!my_data->acdb_deallocate)
2342 ALOGE("%s: Could not find the symbol acdb_loader_deallocate_ACDB from %s",
2343 __func__, LIB_ACDB_LOADER);
2344
Naresh Tannirue3b18452014-03-04 14:44:27 +05302345 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 -07002346 "acdb_loader_send_audio_cal_v2");
Naresh Tannirue3b18452014-03-04 14:44:27 +05302347 if (!my_data->acdb_send_audio_cal)
Siena Richard7c2db772016-12-21 11:32:34 -08002348 ALOGE("%s: Could not find the symbol acdb_send_audio_cal_v2 from %s",
2349 __func__, LIB_ACDB_LOADER);
2350
2351 my_data->acdb_send_audio_cal_v3 = (acdb_send_audio_cal_v3_t)dlsym(my_data->acdb_handle,
2352 "acdb_loader_send_audio_cal_v3");
2353 if (!my_data->acdb_send_audio_cal_v3)
2354 ALOGE("%s: Could not find the symbol acdb_send_audio_cal_v3 from %s",
Naresh Tannirue3b18452014-03-04 14:44:27 +05302355 __func__, LIB_ACDB_LOADER);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302356
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302357 my_data->acdb_set_audio_cal = (acdb_set_audio_cal_t)dlsym(my_data->acdb_handle,
2358 "acdb_loader_set_audio_cal_v2");
2359 if (!my_data->acdb_set_audio_cal)
2360 ALOGE("%s: Could not find the symbol acdb_set_audio_cal_v2 from %s",
2361 __func__, LIB_ACDB_LOADER);
2362
2363 my_data->acdb_get_audio_cal = (acdb_get_audio_cal_t)dlsym(my_data->acdb_handle,
2364 "acdb_loader_get_audio_cal_v2");
2365 if (!my_data->acdb_get_audio_cal)
2366 ALOGE("%s: Could not find the symbol acdb_get_audio_cal_v2 from %s",
2367 __func__, LIB_ACDB_LOADER);
2368
Naresh Tannirue3b18452014-03-04 14:44:27 +05302369 my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle,
2370 "acdb_loader_send_voice_cal");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302371 if (!my_data->acdb_send_voice_cal)
2372 ALOGE("%s: Could not find the symbol acdb_loader_send_voice_cal from %s",
2373 __func__, LIB_ACDB_LOADER);
2374
2375 my_data->acdb_reload_vocvoltable = (acdb_reload_vocvoltable_t)dlsym(my_data->acdb_handle,
2376 "acdb_loader_reload_vocvoltable");
2377 if (!my_data->acdb_reload_vocvoltable)
2378 ALOGE("%s: Could not find the symbol acdb_loader_reload_vocvoltable from %s",
2379 __func__, LIB_ACDB_LOADER);
2380
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07002381 my_data->acdb_get_default_app_type = (acdb_get_default_app_type_t)dlsym(
2382 my_data->acdb_handle,
2383 "acdb_loader_get_default_app_type");
2384 if (!my_data->acdb_get_default_app_type)
2385 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
2386 __func__, LIB_ACDB_LOADER);
2387
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002388 my_data->acdb_send_common_top = (acdb_send_common_top_t)dlsym(
2389 my_data->acdb_handle,
2390 "acdb_loader_send_common_custom_topology");
2391 if (!my_data->acdb_send_common_top)
2392 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
2393 __func__, LIB_ACDB_LOADER);
2394
Banajit Goswami20cdd212015-09-11 01:11:30 -07002395 my_data->acdb_set_codec_data = (acdb_set_codec_data_t)dlsym(
2396 my_data->acdb_handle,
2397 "acdb_loader_set_codec_data");
2398 if (!my_data->acdb_set_codec_data)
2399 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
2400 __func__, LIB_ACDB_LOADER);
2401
Sharad Sangleaca972a2017-01-25 12:38:22 +05302402 my_data->acdb_send_gain_dep_cal = (acdb_send_gain_dep_cal_t)dlsym(my_data->acdb_handle,
2403 "acdb_loader_send_gain_dep_cal");
2404 if (!my_data->acdb_send_gain_dep_cal)
2405 ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s",
2406 __func__, LIB_ACDB_LOADER);
Banajit Goswami20cdd212015-09-11 01:11:30 -07002407
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302408 my_data->acdb_init_v3 = (acdb_init_v3_t)dlsym(my_data->acdb_handle,
2409 "acdb_loader_init_v3");
2410 if (my_data->acdb_init_v3 == NULL) {
2411 ALOGE("%s: dlsym error %s for acdb_loader_init_v3", __func__, dlerror());
2412 }
2413
Naresh Tannirue3b18452014-03-04 14:44:27 +05302414 my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302415 "acdb_loader_init_v2");
Avinash Vaish71c066d2014-08-27 12:32:35 +05302416 if (my_data->acdb_init == NULL) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302417 ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror());
Avinash Vaish71c066d2014-08-27 12:32:35 +05302418 goto acdb_init_fail;
2419 }
Karthik Reddy Katta8513f432016-04-12 14:29:27 +05302420
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302421 my_data->acdb_reload_v2 = (acdb_reload_v2_t)dlsym(my_data->acdb_handle,
2422 "acdb_loader_reload_acdb_files_v2");
2423 if (my_data->acdb_reload_v2 == NULL) {
2424 ALOGE("%s: dlsym error %s for acdb_loader_reload_acdb_files_v2", __func__, dlerror());
2425 }
2426
Karthik Reddy Katta8513f432016-04-12 14:29:27 +05302427 my_data->acdb_reload = (acdb_reload_t)dlsym(my_data->acdb_handle,
2428 "acdb_loader_reload_acdb_files");
2429 if (my_data->acdb_reload == NULL) {
2430 ALOGE("%s: dlsym error %s for acdb_loader_reload_acdb_files", __func__, dlerror());
2431 goto acdb_init_fail;
2432 }
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05302433
Vignesh Kulothungan55396882017-04-20 14:37:02 -07002434 int result = acdb_init(adev->snd_card);
2435 if (!result) {
2436 my_data->is_acdb_initialized = true;
2437 ALOGD("ACDB initialized");
2438 audio_hwdep_send_cal(my_data);
2439 } else {
2440 my_data->is_acdb_initialized = false;
2441 ALOGD("ACDB initialization failed");
2442 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05302443 }
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05302444 audio_extn_pm_vote();
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +05302445#ifdef DYNAMIC_LOG_ENABLED
2446 log_utils_init();
2447#endif
Satish Babu Patakokilabbd4e9d2015-05-13 22:08:06 +05302448 /* Configure active back end for HPX*/
2449 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
2450 if (ctl) {
2451 ALOGE(" sending HPX Active BE information ");
2452 mixer_ctl_set_value(ctl, 0, is_external_codec);
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +05302453 }
2454
Avinash Vaish71c066d2014-08-27 12:32:35 +05302455acdb_init_fail:
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302456
Rohit Kumarbe6935f2017-01-20 14:58:34 +05302457 if (audio_extn_can_use_ras()) {
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07002458 if (property_get_bool("persist.vendor.audio.speaker.prot.enable", false)) {
Rohit Kumarbe6935f2017-01-20 14:58:34 +05302459 platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED,
2460 acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS]);
2461 platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
2462 acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS]);
2463 } else {
2464 ALOGD("%s: RAS Feature should be enabled with Speaker Protection", __func__);
2465 }
2466 }
2467
Siena Richard7c2db772016-12-21 11:32:34 -08002468 /*
2469 * Get the be_dai_name_table from kernel which provides a mapping
2470 * between a backend string name and a backend ID
2471 */
2472 init_be_dai_name_table(adev);
2473
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302474 /* obtain source mic type from max mic count*/
2475 get_source_mic_type(my_data);
2476 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 +05302477 " fluence_in_voice_rec(%d) fluence_in_spkr_mode(%d) fluence_in_hfp_call(%d) ",
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302478 __func__, my_data->fluence_type, my_data->max_mic_count, my_data->source_mic_type,
2479 my_data->fluence_in_voice_call, my_data->fluence_in_voice_rec,
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05302480 my_data->fluence_in_spkr_mode, my_data->fluence_in_hfp_call);
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05302481
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302482 /* init usb */
2483 audio_extn_usb_init(adev);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302484
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302485 /*init a2dp*/
2486 audio_extn_a2dp_init(adev);
2487
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302488 /* Read one time ssr property */
2489 audio_extn_ssr_update_enabled();
Garmond Leunge2433c32017-09-28 21:51:22 -07002490 audio_extn_ffv_update_enabled();
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302491 audio_extn_spkr_prot_init(adev);
Dhananjay Kumar89ea3bd2014-04-29 15:45:57 +05302492
Ashish Jain8ec50472014-10-16 13:56:28 +05302493 /* init dap hal */
2494 audio_extn_dap_hal_init(adev->snd_card);
2495
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302496 /* init audio device arbitration */
2497 audio_extn_dev_arbi_init();
2498
2499 my_data->edid_info = NULL;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05302500
Naresh Tanniru25873b82016-11-01 14:15:28 +05302501 default_rx_backend = strdup("SLIMBUS_0_RX");
2502
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05302503 /* initialize backend config */
2504 for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
2505 my_data->current_backend_cfg[idx].sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
2506 if (idx == HEADPHONE_44_1_BACKEND)
2507 my_data->current_backend_cfg[idx].sample_rate = OUTPUT_SAMPLING_RATE_44100;
2508 my_data->current_backend_cfg[idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Ashish Jainb26edfb2016-08-25 00:10:11 +05302509 my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
Kuirong Wang0b947f72016-09-29 11:03:09 -07002510 if (idx > MAX_RX_CODEC_BACKENDS)
2511 my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05302512 my_data->current_backend_cfg[idx].format = AUDIO_FORMAT_PCM;
Ashish Jainb26edfb2016-08-25 00:10:11 +05302513 my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
2514 my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
2515 my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05302516 }
2517
Sachin Mohan Gadag1ec7fab2016-12-12 17:41:26 +05302518 if (is_slimbus_interface) {
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +05302519 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
2520 strdup("SLIM_0_RX Format");
2521 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
2522 strdup("SLIM_0_RX SampleRate");
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05302523 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].channels_mixer_ctl =
2524 strdup("SLIM_0_RX Channels");
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05302525
Naresh Tanniru25873b82016-11-01 14:15:28 +05302526 my_data->current_backend_cfg[DSD_NATIVE_BACKEND].bitwidth_mixer_ctl =
2527 strdup("SLIM_2_RX Format");
2528 my_data->current_backend_cfg[DSD_NATIVE_BACKEND].samplerate_mixer_ctl =
2529 strdup("SLIM_2_RX SampleRate");
2530
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +05302531 my_data->current_backend_cfg[HEADPHONE_44_1_BACKEND].bitwidth_mixer_ctl =
2532 strdup("SLIM_5_RX Format");
2533 my_data->current_backend_cfg[HEADPHONE_44_1_BACKEND].samplerate_mixer_ctl =
2534 strdup("SLIM_5_RX SampleRate");
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302535
2536 my_data->current_backend_cfg[HEADPHONE_BACKEND].bitwidth_mixer_ctl =
2537 strdup("SLIM_6_RX Format");
2538 my_data->current_backend_cfg[HEADPHONE_BACKEND].samplerate_mixer_ctl =
2539 strdup("SLIM_6_RX SampleRate");
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05302540
Kuirong Wang0b947f72016-09-29 11:03:09 -07002541 my_data->current_backend_cfg[SLIMBUS_0_TX].bitwidth_mixer_ctl =
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05302542 strdup("SLIM_0_TX Format");
Kuirong Wang0b947f72016-09-29 11:03:09 -07002543 my_data->current_backend_cfg[SLIMBUS_0_TX].samplerate_mixer_ctl =
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05302544 strdup("SLIM_0_TX SampleRate");
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +05302545 } else {
Arusha Goyalfda29152016-12-26 10:53:39 +05302546 if (!strncmp(snd_card_name, "sdm660", strlen("sdm660"))) {
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05302547
Naresh Tanniru25873b82016-11-01 14:15:28 +05302548 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
2549 strdup("INT4_MI2S_RX Format");
2550 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
2551 strdup("INT4_MI2S_RX SampleRate");
2552
2553 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
2554 strdup("INT3_MI2S_TX Format");
2555 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
2556 strdup("INT3_MI2S_TX SampleRate");
2557
2558 if (default_rx_backend)
2559 free(default_rx_backend);
2560 default_rx_backend = strdup("INT4_MI2S_RX");
2561
2562 } else {
2563 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
2564 strdup("MI2S_RX Format");
2565 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
2566 strdup("MI2S_RX SampleRate");
Sachin Mohan Gadag1ec7fab2016-12-12 17:41:26 +05302567 my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].channels_mixer_ctl =
2568 strdup("MI2S_RX Channels");
Naresh Tanniru25873b82016-11-01 14:15:28 +05302569
2570 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
2571 strdup("MI2S_TX Format");
2572 my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
2573 strdup("MI2S_TX SampleRate");
2574 }
2575 my_data->current_backend_cfg[HEADPHONE_BACKEND].bitwidth_mixer_ctl =
2576 strdup("INT0_MI2S_RX Format");
2577 my_data->current_backend_cfg[HEADPHONE_BACKEND].samplerate_mixer_ctl =
2578 strdup("INT0_MI2S_RX SampleRate");
2579
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +05302580 }
Kuirong Wang0b947f72016-09-29 11:03:09 -07002581 my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
2582 strdup("USB_AUDIO_TX Format");
2583 my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
2584 strdup("USB_AUDIO_TX SampleRate");
2585 my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
2586 strdup("USB_AUDIO_TX Channels");
Sidipotu Ashokcf877732015-09-22 14:58:48 +05302587
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08002588 my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].bitwidth_mixer_ctl =
2589 strdup("USB_AUDIO_RX Format");
2590 my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].samplerate_mixer_ctl =
2591 strdup("USB_AUDIO_RX SampleRate");
Ashish Jainb26edfb2016-08-25 00:10:11 +05302592 my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].channels_mixer_ctl =
2593 strdup("USB_AUDIO_RX Channels");
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08002594
Mingming Yinddd610b2016-01-20 17:09:32 -08002595 my_data->current_backend_cfg[HDMI_RX_BACKEND].bitwidth_mixer_ctl =
2596 strdup("HDMI_RX Bit Format");
2597 my_data->current_backend_cfg[HDMI_RX_BACKEND].samplerate_mixer_ctl =
2598 strdup("HDMI_RX SampleRate");
Ashish Jaind84fd6a2016-07-27 12:33:25 +05302599 my_data->current_backend_cfg[HDMI_RX_BACKEND].channels_mixer_ctl =
2600 strdup("HDMI_RX Channels");
Mingming Yinddd610b2016-01-20 17:09:32 -08002601
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07002602 my_data->current_backend_cfg[DISP_PORT_RX_BACKEND].bitwidth_mixer_ctl =
2603 strdup("Display Port RX Bit Format");
2604 my_data->current_backend_cfg[DISP_PORT_RX_BACKEND].samplerate_mixer_ctl =
2605 strdup("Display Port RX SampleRate");
2606 my_data->current_backend_cfg[DISP_PORT_RX_BACKEND].channels_mixer_ctl =
2607 strdup("Display Port RX Channels");
2608
Siddartha Shaik44dd7702017-06-14 12:13:25 +05302609 my_data->current_backend_cfg[HDMI_TX_BACKEND].bitwidth_mixer_ctl =
2610 strdup("QUAT_MI2S_TX Format");
2611 my_data->current_backend_cfg[HDMI_TX_BACKEND].samplerate_mixer_ctl =
2612 strdup("QUAT_MI2S_TX SampleRate");
2613 my_data->current_backend_cfg[HDMI_TX_BACKEND].channels_mixer_ctl =
2614 strdup("QUAT_MI2S_TX Channels");
2615
`Deeraj Soman676c2702017-09-18 19:25:53 +05302616 for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
2617 if (my_data->current_backend_cfg[idx].bitwidth_mixer_ctl) {
2618 ctl = mixer_get_ctl_by_name(adev->mixer,
2619 my_data->current_backend_cfg[idx].bitwidth_mixer_ctl);
2620 id_string = platform_get_mixer_control(ctl);
2621 if (id_string) {
2622 cfg_value = audio_extn_utils_get_bit_width_from_string(id_string);
2623 if (cfg_value > 0)
2624 my_data->current_backend_cfg[idx].bit_width = cfg_value;
2625 }
2626 }
2627
2628 if (my_data->current_backend_cfg[idx].samplerate_mixer_ctl) {
2629 ctl = mixer_get_ctl_by_name(adev->mixer,
2630 my_data->current_backend_cfg[idx].samplerate_mixer_ctl);
2631 id_string = platform_get_mixer_control(ctl);
2632 if (id_string) {
2633 cfg_value = audio_extn_utils_get_sample_rate_from_string(id_string);
2634 if (cfg_value > 0)
2635 my_data->current_backend_cfg[idx].sample_rate = cfg_value;
2636 }
2637 }
2638
2639 if (my_data->current_backend_cfg[idx].channels_mixer_ctl) {
2640 ctl = mixer_get_ctl_by_name(adev->mixer,
2641 my_data->current_backend_cfg[idx].channels_mixer_ctl);
2642 id_string = platform_get_mixer_control(ctl);
2643 if (id_string) {
2644 cfg_value = audio_extn_utils_get_channels_from_string(id_string);
2645 if (cfg_value > 0)
2646 my_data->current_backend_cfg[idx].channels = cfg_value;
2647 }
2648 }
2649 }
2650
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302651 ret = audio_extn_utils_get_codec_version(snd_card_name,
2652 my_data->adev->snd_card,
2653 my_data->codec_version);
Sidipotu Ashokcf877732015-09-22 14:58:48 +05302654
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05302655 if (NATIVE_AUDIO_MODE_INVALID != platform_get_native_support()) {
2656 /*
2657 * Native playback is enabled from the UI.
2658 */
2659 if(strstr(snd_card_name, "tasha")) {
2660 if (strstr(my_data->codec_version, "WCD9335_1_0") ||
2661 strstr(my_data->codec_version, "WCD9335_1_1")) {
2662 ALOGD("%s:napb: TASHA 1.0 or 1.1 only SRC mode is supported",
2663 __func__);
2664 platform_set_native_support(NATIVE_AUDIO_MODE_SRC);
2665 }
Ashish Jain4826f6c2017-02-06 13:33:20 +05302666 }
2667 if (strstr(snd_card_name, "tavil")) {
2668 ALOGD("%s:DSD playback is supported", __func__);
2669 my_data->is_dsd_supported = true;
2670 my_data->is_asrc_supported = true;
2671 platform_set_native_support(NATIVE_AUDIO_MODE_MULTIPLE_44_1);
Sidipotu Ashokcf877732015-09-22 14:58:48 +05302672 }
2673 }
2674
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +05302675 if (property_get_bool("vendor.audio.apptype.multirec.enabled", false))
2676 my_data->use_generic_handset = true;
2677
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05302678 my_data->edid_info = NULL;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302679 return my_data;
2680}
2681
2682void platform_deinit(void *platform)
2683{
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302684 struct platform_data *my_data = (struct platform_data *)platform;
2685
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302686 if (my_data->edid_info) {
2687 free(my_data->edid_info);
2688 my_data->edid_info = NULL;
2689 }
2690
Siena Richard7c2db772016-12-21 11:32:34 -08002691 if (be_dai_name_table) {
2692 free((void *)be_dai_name_table);
2693 be_dai_name_table = NULL;
2694 }
2695
Venkata Narendra Kumar Guttae071e5a2016-01-11 18:08:26 +05302696 if (my_data->hw_dep_fd >= 0) {
2697 close(my_data->hw_dep_fd);
2698 my_data->hw_dep_fd = -1;
2699 }
2700
Naresh Tanniru25873b82016-11-01 14:15:28 +05302701 if (default_rx_backend)
2702 free(default_rx_backend);
2703
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302704 hw_info_deinit(my_data->hw_info);
2705 close_csd_client(my_data->csd);
2706
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302707 int32_t dev;
2708 for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302709 if (backend_tag_table[dev]) {
2710 free(backend_tag_table[dev]);
2711 backend_tag_table[dev]= NULL;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302712 }
2713 }
2714
2715 /* deinit audio device arbitration */
2716 audio_extn_dev_arbi_deinit();
2717
2718 if (my_data->edid_info) {
2719 free(my_data->edid_info);
2720 my_data->edid_info = NULL;
2721 }
2722
Dhananjay Kumara5ba5f22016-11-30 16:01:29 +05302723 if (my_data->adev->mixer) {
2724 mixer_close(my_data->adev->mixer);
2725 my_data->adev->mixer = NULL;
2726 }
2727
Naresh Tannirue3b18452014-03-04 14:44:27 +05302728 free(platform);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302729 /* deinit usb */
2730 audio_extn_usb_deinit();
Ashish Jain8ec50472014-10-16 13:56:28 +05302731 audio_extn_dap_hal_deinit();
Aditya Bavanaria56da222017-07-14 17:54:21 +05302732 if (audio_extn_spkr_prot_is_enabled())
2733 audio_extn_spkr_prot_deinit();
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +05302734#ifdef DYNAMIC_LOG_ENABLED
2735 log_utils_deinit();
2736#endif
Naresh Tannirue3b18452014-03-04 14:44:27 +05302737}
2738
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002739static int platform_is_acdb_initialized(void *platform)
Ramjee Singh203473b2015-06-09 15:18:42 +05302740{
2741 struct platform_data *my_data = (struct platform_data *)platform;
2742 ALOGD("%s: acdb initialized %d\n", __func__, my_data->is_acdb_initialized);
2743 return my_data->is_acdb_initialized;
2744}
2745
Dhananjay Kumare6293dd2017-05-25 17:25:30 +05302746void platform_snd_card_update(void *platform, card_status_t card_status)
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002747{
2748 struct platform_data *my_data = (struct platform_data *)platform;
2749
Dhananjay Kumare6293dd2017-05-25 17:25:30 +05302750 if (card_status == CARD_STATUS_ONLINE) {
Ben Rombergerfeca4b82015-07-07 20:40:44 -07002751 if (!platform_is_acdb_initialized(my_data)) {
2752 if(platform_acdb_init(my_data))
2753 ALOGE("%s: acdb initialization is failed", __func__);
2754 } else if (my_data->acdb_send_common_top() < 0) {
2755 ALOGD("%s: acdb did not set common topology", __func__);
2756 }
2757 }
2758}
2759
Naresh Tannirue3b18452014-03-04 14:44:27 +05302760const char *platform_get_snd_device_name(snd_device_t snd_device)
2761{
2762 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
2763 return device_table[snd_device];
2764 else
2765 return "";
2766}
2767
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302768int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
2769 char *device_name)
2770{
2771 struct platform_data *my_data = (struct platform_data *)platform;
2772
2773 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
2774 strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
2775 hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
Garmond Leunge2433c32017-09-28 21:51:22 -07002776
2777 if ((snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_MONO) ||
2778 (snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO))
2779 audio_extn_ffv_append_ec_ref_dev_name(device_name);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302780 } else {
2781 strlcpy(device_name, "", DEVICE_NAME_MAX_SIZE);
2782 return -EINVAL;
2783 }
2784
2785 return 0;
2786}
2787
Banajit Goswami20cdd212015-09-11 01:11:30 -07002788void platform_add_backend_name(char *mixer_path, snd_device_t snd_device,
2789 struct audio_usecase *usecase)
Naresh Tannirue3b18452014-03-04 14:44:27 +05302790{
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302791 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
2792 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
2793 return;
2794 }
2795
Rohit kumarf4120402016-08-05 19:19:48 +05302796 if ((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
2797 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
Banajit Goswami20cdd212015-09-11 01:11:30 -07002798 !(usecase->type == VOICE_CALL || usecase->type == VOIP_CALL)) {
2799 ALOGI("%s: Not adding vbat speaker device to non voice use cases", __func__);
2800 return;
2801 }
2802
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302803 const char * suffix = backend_tag_table[snd_device];
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302804
2805 if (suffix != NULL) {
2806 strlcat(mixer_path, " ", MIXER_PATH_MAX_LENGTH);
2807 strlcat(mixer_path, suffix, MIXER_PATH_MAX_LENGTH);
2808 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05302809}
2810
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302811bool platform_check_backends_match(snd_device_t snd_device1, snd_device_t snd_device2)
2812{
2813 bool result = true;
2814
2815 ALOGV("%s: snd_device1 = %s, snd_device2 = %s", __func__,
2816 platform_get_snd_device_name(snd_device1),
2817 platform_get_snd_device_name(snd_device2));
2818
2819 if ((snd_device1 < SND_DEVICE_MIN) || (snd_device1 >= SND_DEVICE_OUT_END)) {
2820 ALOGE("%s: Invalid snd_device = %s", __func__,
2821 platform_get_snd_device_name(snd_device1));
2822 return false;
2823 }
2824 if ((snd_device2 < SND_DEVICE_MIN) || (snd_device2 >= SND_DEVICE_OUT_END)) {
2825 ALOGE("%s: Invalid snd_device = %s", __func__,
2826 platform_get_snd_device_name(snd_device2));
2827 return false;
2828 }
2829 const char * be_itf1 = hw_interface_table[snd_device1];
2830 const char * be_itf2 = hw_interface_table[snd_device2];
2831
2832 if (NULL != be_itf1 && NULL != be_itf2) {
Kuirong Wangb9fbb1e2016-05-03 18:36:39 -07002833 if ((NULL == strstr(be_itf2, be_itf1)) && (NULL == strstr(be_itf1, be_itf2)))
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302834 result = false;
Naresh Tanniru25873b82016-11-01 14:15:28 +05302835 } else if (NULL == be_itf1 && NULL != be_itf2 && (NULL == strstr(be_itf2, default_rx_backend))) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302836 result = false;
Naresh Tanniru25873b82016-11-01 14:15:28 +05302837 } else if (NULL != be_itf1 && NULL == be_itf2 && (NULL == strstr(be_itf1, default_rx_backend))) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05302838 result = false;
2839 }
2840
2841 ALOGV("%s: be_itf1 = %s, be_itf2 = %s, match %d", __func__, be_itf1, be_itf2, result);
2842 return result;
2843}
2844
Naresh Tannirue3b18452014-03-04 14:44:27 +05302845int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
2846{
Venkata Narendra Kumar Guttaed408a12015-03-31 20:24:04 +05302847 int device_id = -1;
2848
Karthik Reddy Katta561d4ba2016-06-23 13:41:18 +05302849 if (device_type == PCM_PLAYBACK)
2850 device_id = pcm_device_table[usecase][0];
2851 else
2852 device_id = pcm_device_table[usecase][1];
Naresh Tannirue3b18452014-03-04 14:44:27 +05302853 return device_id;
2854}
2855
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302856static int find_index(struct name_to_index * table, int32_t len, const char * name)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302857{
2858 int ret = 0;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302859 int32_t i;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302860
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302861 if (table == NULL) {
2862 ALOGE("%s: table is NULL", __func__);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302863 ret = -ENODEV;
2864 goto done;
2865 }
2866
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302867 if (name == NULL) {
2868 ALOGE("null key");
2869 ret = -ENODEV;
2870 goto done;
2871 }
2872
2873 for (i=0; i < len; i++) {
2874 const char* tn = table[i].name;
2875 size_t len = strlen(tn);
2876 if (strncmp(tn, name, len) == 0) {
2877 if (strlen(name) != len) {
2878 continue; // substring
2879 }
2880 ret = table[i].index;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302881 goto done;
2882 }
2883 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302884 ALOGE("%s: Could not find index for name = %s",
2885 __func__, name);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302886 ret = -ENODEV;
2887done:
2888 return ret;
2889}
2890
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05302891int platform_set_fluence_type(void *platform, char *value)
2892{
2893 int ret = 0;
2894 int fluence_type = FLUENCE_NONE;
2895 int fluence_flag = NONE_FLAG;
2896 struct platform_data *my_data = (struct platform_data *)platform;
2897 struct audio_device *adev = my_data->adev;
2898
2899 ALOGV("%s: fluence type:%d", __func__, my_data->fluence_type);
2900
2901 /* only dual mic turn on and off is supported as of now through setparameters */
2902 if (!strncmp(AUDIO_PARAMETER_VALUE_DUALMIC,value, sizeof(AUDIO_PARAMETER_VALUE_DUALMIC))) {
2903 if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro")) ||
2904 !strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) {
2905 ALOGV("fluence dualmic feature enabled \n");
2906 fluence_type = FLUENCE_DUAL_MIC;
2907 fluence_flag = DMIC_FLAG;
2908 } else {
2909 ALOGE("%s: Failed to set DUALMIC", __func__);
2910 ret = -1;
2911 goto done;
2912 }
2913 } else if (!strncmp(AUDIO_PARAMETER_KEY_NO_FLUENCE, value, sizeof(AUDIO_PARAMETER_KEY_NO_FLUENCE))) {
2914 ALOGV("fluence disabled");
2915 fluence_type = FLUENCE_NONE;
2916 } else {
2917 ALOGE("Invalid fluence value : %s",value);
2918 ret = -1;
2919 goto done;
2920 }
2921
2922 if (fluence_type != my_data->fluence_type) {
2923 ALOGV("%s: Updating fluence_type to :%d", __func__, fluence_type);
2924 my_data->fluence_type = fluence_type;
2925 adev->acdb_settings = (adev->acdb_settings & FLUENCE_MODE_CLEAR) | fluence_flag;
2926 }
2927done:
2928 return ret;
2929}
2930
2931int platform_get_fluence_type(void *platform, char *value, uint32_t len)
2932{
2933 int ret = 0;
2934 struct platform_data *my_data = (struct platform_data *)platform;
2935
Garmond Leunge2433c32017-09-28 21:51:22 -07002936 if (my_data->fluence_type == FLUENCE_HEX_MIC) {
2937 strlcpy(value, "hexmic", len);
2938 } else if (my_data->fluence_type == FLUENCE_QUAD_MIC) {
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05302939 strlcpy(value, "quadmic", len);
2940 } else if (my_data->fluence_type == FLUENCE_DUAL_MIC) {
2941 strlcpy(value, "dualmic", len);
2942 } else if (my_data->fluence_type == FLUENCE_NONE) {
2943 strlcpy(value, "none", len);
2944 } else
2945 ret = -1;
2946
2947 return ret;
2948}
2949
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05302950int platform_get_snd_device_index(char *device_name)
2951{
2952 return find_index(snd_device_name_index, SND_DEVICE_MAX, device_name);
2953}
2954
2955int platform_get_usecase_index(const char *usecase_name)
2956{
2957 return find_index(usecase_name_index, AUDIO_USECASE_MAX, usecase_name);
2958}
2959
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07002960int platform_get_effect_config_data(snd_device_t snd_device,
2961 struct audio_effect_config *effect_config,
2962 effect_type_t effect_type)
2963{
2964 int ret = 0;
2965
2966 if ((snd_device < SND_DEVICE_IN_BEGIN) || (snd_device >= SND_DEVICE_MAX) ||
2967 (effect_type <= EFFECT_NONE) || (effect_type >= EFFECT_MAX)) {
2968 ALOGE("%s: Invalid snd_device = %d",
2969 __func__, snd_device);
2970 ret = -EINVAL;
2971 goto done;
2972 }
2973
2974 if (effect_config == NULL) {
2975 ALOGE("%s: Invalid effect_config", __func__);
2976 ret = -EINVAL;
2977 goto done;
2978 }
2979
2980 ALOGV("%s: snd_device = %d module_id = %d",
2981 __func__, snd_device, effect_config_table[GET_IN_DEVICE_INDEX(snd_device)][effect_type].module_id);
2982 memcpy(effect_config, &effect_config_table[GET_IN_DEVICE_INDEX(snd_device)][effect_type],
2983 sizeof(struct audio_effect_config));
2984
2985done:
2986 return ret;
2987}
2988
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302989int platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id)
2990{
2991 int ret = 0;
2992
2993 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
2994 ALOGE("%s: Invalid snd_device = %d",
2995 __func__, snd_device);
2996 ret = -EINVAL;
2997 goto done;
2998 }
2999
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303000 ALOGV("%s: acdb_device_table[%s]: old = %d new = %d", __func__,
3001 platform_get_snd_device_name(snd_device), acdb_device_table[snd_device], acdb_id);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303002 acdb_device_table[snd_device] = acdb_id;
3003done:
3004 return ret;
3005}
3006
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07003007int platform_set_effect_config_data(snd_device_t snd_device,
3008 struct audio_effect_config effect_config,
3009 effect_type_t effect_type)
3010{
3011 int ret = 0;
3012
3013 if ((snd_device < SND_DEVICE_IN_BEGIN) || (snd_device >= SND_DEVICE_MAX) ||
3014 (effect_type <= EFFECT_NONE) || (effect_type >= EFFECT_MAX)) {
3015 ALOGE("%s: Invalid snd_device = %d",
3016 __func__, snd_device);
3017 ret = -EINVAL;
3018 goto done;
3019 }
3020
3021 ALOGV("%s 0x%x 0x%x 0x%x 0x%x", __func__, effect_config.module_id,
3022 effect_config.instance_id, effect_config.param_id,
3023 effect_config.param_value);
3024 effect_config_table[GET_IN_DEVICE_INDEX(snd_device)][effect_type] = effect_config;
3025
3026done:
3027 return ret;
3028}
3029
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05303030int platform_set_acdb_metainfo_key(void *platform, char *name, int key)
3031{
3032 struct meta_key_list *key_info;
3033 struct platform_data *pdata = (struct platform_data *)platform;
3034
3035 key_info = (struct meta_key_list *)calloc(1, sizeof(struct meta_key_list));
3036 if (!key_info) {
3037 ALOGE("%s: Could not allocate memory for key %d", __func__, key);
3038 return -ENOMEM;
3039 }
3040
3041 key_info->cal_info.nKey = key;
3042 strlcpy(key_info->name, name, sizeof(key_info->name));
3043 list_add_tail(&pdata->acdb_meta_key_list, &key_info->list);
3044 ALOGD("%s: successfully added module %s and key %d to the list", __func__,
3045 key_info->name, key_info->cal_info.nKey);
3046 return 0;
3047}
3048
3049int platform_get_meta_info_key_from_list(void *platform, char *mod_name)
3050{
3051 struct listnode *node;
3052 struct meta_key_list *key_info;
3053 struct platform_data *pdata = (struct platform_data *)platform;
3054 int key = 0;
3055
3056 ALOGV("%s: for module %s", __func__, mod_name);
3057
3058 list_for_each(node, &pdata->acdb_meta_key_list) {
3059 key_info = node_to_item(node, struct meta_key_list, list);
3060 if (strcmp(key_info->name, mod_name) == 0) {
3061 key = key_info->cal_info.nKey;
3062 ALOGD("%s: Found key %d for module %s", __func__, key, mod_name);
3063 break;
3064 }
3065 }
3066 return key;
3067}
3068
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07003069int platform_get_default_app_type(void *platform)
3070{
3071 struct platform_data *my_data = (struct platform_data *)platform;
3072
3073 if (my_data->acdb_get_default_app_type)
3074 return my_data->acdb_get_default_app_type();
3075 else
3076 return DEFAULT_APP_TYPE;
3077}
3078
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05303079int platform_get_default_app_type_v2(void *platform __unused,
3080 usecase_type_t type __unused)
Srikanth Uyyalaa1e32352015-10-09 14:48:04 +05303081{
3082 if(type == PCM_CAPTURE)
3083 return DEFAULT_APP_TYPE_TX_PATH;
3084 else
3085 return DEFAULT_APP_TYPE_RX_PATH;
3086}
3087
Subhash Chandra Bose Naripeddy19dc03b2014-03-10 14:43:05 -07003088int platform_get_snd_device_acdb_id(snd_device_t snd_device)
3089{
3090 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
3091 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
3092 return -EINVAL;
3093 }
3094 return acdb_device_table[snd_device];
3095}
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303096
3097int platform_set_snd_device_bit_width(snd_device_t snd_device, unsigned int bit_width)
Amit Shekhar5a39c912014-10-14 15:39:30 -07003098{
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303099 int ret = 0;
3100
3101 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
3102 ALOGE("%s: Invalid snd_device = %d",
3103 __func__, snd_device);
3104 ret = -EINVAL;
3105 goto done;
3106 }
3107
3108 backend_bit_width_table[snd_device] = bit_width;
3109done:
3110 return ret;
Amit Shekhar5a39c912014-10-14 15:39:30 -07003111}
3112
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303113int platform_get_snd_device_bit_width(snd_device_t snd_device)
Amit Shekhar5a39c912014-10-14 15:39:30 -07003114{
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303115 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
3116 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
Ashish Jainb449be32015-07-19 05:39:23 -07003117 return CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303118 }
3119 return backend_bit_width_table[snd_device];
Amit Shekhar5a39c912014-10-14 15:39:30 -07003120}
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303121int platform_set_native_support(int na_mode)
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003122{
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05303123 if (NATIVE_AUDIO_MODE_SRC == na_mode || NATIVE_AUDIO_MODE_TRUE_44_1 == na_mode
3124 || NATIVE_AUDIO_MODE_MULTIPLE_44_1 == na_mode) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303125 na_props.platform_na_prop_enabled = na_props.ui_na_prop_enabled = true;
3126 na_props.na_mode = na_mode;
Ashish Jain6fced6e2017-01-09 14:13:22 +05303127 ALOGD("%s:napb: native audio playback enabled in (%s) mode", __func__,
3128 ((na_mode == NATIVE_AUDIO_MODE_SRC)?"SRC":
3129 (na_mode == NATIVE_AUDIO_MODE_TRUE_44_1)?"True":"Multiple"));
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303130 } else {
3131 na_props.platform_na_prop_enabled = false;
3132 na_props.na_mode = NATIVE_AUDIO_MODE_INVALID;
3133 ALOGD("%s:napb: native audio playback disabled", __func__);
3134 }
3135
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003136 return 0;
3137}
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05303138bool platform_check_codec_dsd_support(void *platform)
3139{
3140 struct platform_data *my_data = (struct platform_data *)platform;
3141 return my_data->is_dsd_supported;
3142}
3143bool platform_check_codec_asrc_support(void *platform)
3144{
3145 struct platform_data *my_data = (struct platform_data *)platform;
3146 return my_data->is_asrc_supported;
3147}
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003148
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303149int platform_get_native_support()
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003150{
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303151 int ret = NATIVE_AUDIO_MODE_INVALID;
3152 if (na_props.platform_na_prop_enabled &&
3153 na_props.ui_na_prop_enabled) {
3154 ret = na_props.na_mode;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303155 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303156 ALOGV("%s:napb: ui Prop enabled(%d) version(%d)", __func__,
3157 na_props.ui_na_prop_enabled, na_props.na_mode);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303158 return ret;
3159}
3160
3161void native_audio_get_params(struct str_parms *query,
3162 struct str_parms *reply,
3163 char *value, int len)
3164{
3165 int ret;
3166 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
3167 value, len);
3168 if (ret >= 0) {
3169 if (na_props.platform_na_prop_enabled) {
3170 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
3171 na_props.ui_na_prop_enabled ? "true" : "false");
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303172 ALOGV("%s:napb: na_props.ui_na_prop_enabled: %d", __func__,
3173 na_props.ui_na_prop_enabled);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303174 } else {
3175 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
3176 "false");
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303177 ALOGV("%s:napb: native audio not supported: %d", __func__,
3178 na_props.platform_na_prop_enabled);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303179 }
3180 }
3181}
3182
3183int native_audio_set_params(struct platform_data *platform,
3184 struct str_parms *parms, char *value, int len)
3185{
Preetam Singh Ranawat53194302016-03-15 16:37:42 +05303186 int ret = -1;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303187 struct audio_usecase *usecase;
3188 struct listnode *node;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303189 int mode = NATIVE_AUDIO_MODE_INVALID;
3190
Preetam Singh Ranawat6746b7a2016-07-18 16:40:24 +05303191 if (!value || !parms)
Preetam Singh Ranawat53194302016-03-15 16:37:42 +05303192 return ret;
3193
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303194 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_NATIVE_AUDIO_MODE,
3195 value, len);
3196 if (ret >= 0) {
3197 if (value && !strncmp(value, "src", sizeof("src")))
3198 mode = NATIVE_AUDIO_MODE_SRC;
3199 else if (value && !strncmp(value, "true", sizeof("true")))
3200 mode = NATIVE_AUDIO_MODE_TRUE_44_1;
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05303201 else if (value && !strncmp(value, "multiple", sizeof("multiple")))
3202 mode = NATIVE_AUDIO_MODE_MULTIPLE_44_1;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303203 else {
3204 mode = NATIVE_AUDIO_MODE_INVALID;
3205 ALOGE("%s:napb:native_audio_mode in platform info xml,invalid mode string",
3206 __func__);
3207 }
3208 ALOGD("%s:napb updating mode (%d) from XML",__func__, mode);
3209 platform_set_native_support(mode);
3210 }
3211
3212
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303213
3214 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_NATIVE_AUDIO,
3215 value, len);
3216 if (ret >= 0) {
3217 if (na_props.platform_na_prop_enabled) {
Sidipotu Ashok894644d2015-07-06 18:35:03 +05303218 if (!strncmp("true", value, sizeof("true"))) {
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303219 na_props.ui_na_prop_enabled = true;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303220 ALOGD("%s:napb: native audio feature enabled from UI",
3221 __func__);
Sidipotu Ashok894644d2015-07-06 18:35:03 +05303222 }
3223 else {
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303224 na_props.ui_na_prop_enabled = false;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303225 ALOGD("%s:napb: native audio feature disabled from UI",
3226 __func__);
Sidipotu Ashok894644d2015-07-06 18:35:03 +05303227 }
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303228
3229 str_parms_del(parms, AUDIO_PARAMETER_KEY_NATIVE_AUDIO);
3230
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303231 /*
3232 * Iterate through the usecase list and trigger device switch for
3233 * all the appropriate usecases
3234 */
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303235 list_for_each(node, &(platform->adev)->usecase_list) {
3236 usecase = node_to_item(node, struct audio_usecase, list);
3237
3238 if (is_offload_usecase(usecase->id) &&
3239 (usecase->stream.out->devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
3240 usecase->stream.out->devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) &&
3241 OUTPUT_SAMPLING_RATE_44100 == usecase->stream.out->sample_rate) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303242 ALOGD("%s:napb: triggering dynamic device switch for usecase(%d: %s)"
Sidipotu Ashok894644d2015-07-06 18:35:03 +05303243 " stream(%p), device(%d)", __func__, usecase->id,
Alexy Josephb1379942016-01-29 15:49:38 -08003244 use_case_table[usecase->id], (void*) usecase->stream.out,
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303245 usecase->stream.out->devices);
Sidipotu Ashok894644d2015-07-06 18:35:03 +05303246 select_devices(platform->adev, usecase->id);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303247 }
3248 }
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303249 } else
3250 ALOGD("%s:napb: native audio cannot be enabled from UI",
3251 __func__);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303252 }
3253 return ret;
3254}
3255
Ashish Jainf1eaa582016-05-23 20:54:24 +05303256static void true_32_bit_set_params(struct str_parms *parms,
3257 char *value, int len)
3258{
3259 int ret = 0;
3260
3261 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_TRUE_32_BIT,
3262 value,len);
3263 if (ret >= 0) {
3264 if (value && !strncmp(value, "true", sizeof("src")))
3265 supports_true_32_bit = true;
3266 else
3267 supports_true_32_bit = false;
3268 str_parms_del(parms, AUDIO_PARAMETER_KEY_TRUE_32_BIT);
3269 }
3270
3271}
3272
3273bool platform_supports_true_32bit()
3274{
3275 return supports_true_32_bit;
3276}
3277
Sidipotu Ashokad8fff82016-02-02 10:48:42 +05303278int check_hdset_combo_device(snd_device_t snd_device)
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303279{
3280 int ret = false;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303281
Sidipotu Ashokad8fff82016-02-02 10:48:42 +05303282 if (SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES == snd_device ||
3283 SND_DEVICE_OUT_SPEAKER_AND_LINE == snd_device ||
3284 SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1 == snd_device ||
3285 SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2 == snd_device ||
3286 SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET == snd_device)
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303287 ret = true;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303288
3289 return ret;
3290}
3291
Ashish Jainb26edfb2016-08-25 00:10:11 +05303292int codec_device_supports_native_playback(audio_devices_t out_device)
kunleiz207afaa2016-07-22 14:26:49 +08003293{
Ashish Jainb26edfb2016-08-25 00:10:11 +05303294 int ret = false;
kunleiz207afaa2016-07-22 14:26:49 +08003295
3296 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
3297 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
3298 out_device & AUDIO_DEVICE_OUT_LINE)
Ashish Jainb26edfb2016-08-25 00:10:11 +05303299 ret = true;
kunleiz207afaa2016-07-22 14:26:49 +08003300
3301 return ret;
3302}
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303303
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05303304int platform_get_backend_index(snd_device_t snd_device)
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303305{
3306 int32_t port = DEFAULT_CODEC_BACKEND;
3307
Kuirong Wang0b947f72016-09-29 11:03:09 -07003308 if (snd_device >= SND_DEVICE_OUT_BEGIN && snd_device < SND_DEVICE_OUT_END) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303309 if (backend_tag_table[snd_device] != NULL) {
3310 if (strncmp(backend_tag_table[snd_device], "headphones-44.1",
3311 sizeof("headphones-44.1")) == 0)
3312 port = HEADPHONE_44_1_BACKEND;
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05303313 else if (strncmp(backend_tag_table[snd_device], "headphones-dsd",
3314 sizeof("headphones-dsd")) == 0)
3315 port = DSD_NATIVE_BACKEND;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303316 else if (strncmp(backend_tag_table[snd_device], "headphones",
3317 sizeof("headphones")) == 0)
3318 port = HEADPHONE_BACKEND;
3319 else if (strcmp(backend_tag_table[snd_device], "hdmi") == 0)
3320 port = HDMI_RX_BACKEND;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003321 else if (strcmp(backend_tag_table[snd_device], "display-port") == 0)
3322 port = DISP_PORT_RX_BACKEND;
Satya Krishna Pindiprolif5eddfd2016-12-28 11:29:08 +05303323 else if ((strcmp(backend_tag_table[snd_device], "usb-headphones") == 0) ||
3324 (strcmp(backend_tag_table[snd_device], "usb-headset") == 0))
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003325 port = USB_AUDIO_RX_BACKEND;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303326 }
Kuirong Wang0b947f72016-09-29 11:03:09 -07003327 } else if (snd_device >= SND_DEVICE_IN_BEGIN && snd_device < SND_DEVICE_IN_END) {
3328 port = DEFAULT_CODEC_TX_BACKEND;
Kuirong Wange9894162016-08-26 15:16:39 -07003329 if (backend_tag_table[snd_device] != NULL) {
3330 if (strcmp(backend_tag_table[snd_device], "usb-headset-mic") == 0)
3331 port = USB_AUDIO_TX_BACKEND;
Dhanalakshmi Siddanib678a802016-12-03 11:51:41 +05303332 else if (strstr(backend_tag_table[snd_device], "bt-sco") != NULL)
3333 port = BT_SCO_TX_BACKEND;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05303334 else if (strcmp(backend_tag_table[snd_device], "hdmi-mic") == 0)
3335 port = HDMI_TX_BACKEND;
Kuirong Wange9894162016-08-26 15:16:39 -07003336 }
3337 } else {
Kuirong Wang0b947f72016-09-29 11:03:09 -07003338 ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
Kuirong Wange9894162016-08-26 15:16:39 -07003339 }
3340
Kuirong Wang0b947f72016-09-29 11:03:09 -07003341 ALOGV("%s:napb: backend port - %d device - %d ", __func__, port, snd_device);
Kuirong Wange9894162016-08-26 15:16:39 -07003342 return port;
3343}
3344
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05303345int platform_send_audio_calibration(void *platform, struct audio_usecase *usecase,
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07003346 int app_type, int sample_rate)
Naresh Tannirue3b18452014-03-04 14:44:27 +05303347{
3348 struct platform_data *my_data = (struct platform_data *)platform;
3349 int acdb_dev_id, acdb_dev_type;
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05303350 int snd_device = SND_DEVICE_OUT_SPEAKER;
Siena Richard7c2db772016-12-21 11:32:34 -08003351 int new_snd_device[SND_DEVICE_OUT_END] = {0};
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303352 int i, num_devices = 1;
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05303353
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303354 if (usecase->type == PCM_PLAYBACK)
Naresh Tannirucc7c4de2015-03-10 16:19:23 +05303355 snd_device = usecase->out_snd_device;
Karthik Reddy Katta81c42612015-11-13 17:49:07 +05303356 else if ((usecase->type == PCM_CAPTURE) &&
3357 voice_is_in_call_rec_stream(usecase->stream.in))
3358 snd_device = voice_get_incall_rec_snd_device(usecase->in_snd_device);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303359 else if ((usecase->type == PCM_HFP_CALL) || (usecase->type == PCM_CAPTURE))
Naresh Tannirucc7c4de2015-03-10 16:19:23 +05303360 snd_device = usecase->in_snd_device;
Siddartha Shaik343abc62017-08-08 11:15:25 +05303361 else if (usecase->type == TRANSCODE_LOOPBACK)
3362 snd_device = usecase->out_snd_device;
3363
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08003364 acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(snd_device)];
Naresh Tannirue3b18452014-03-04 14:44:27 +05303365
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003366 if (platform_split_snd_device(platform, snd_device, &num_devices,
3367 new_snd_device) < 0) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303368 new_snd_device[0] = snd_device;
Naresh Tanniru2727f822015-05-11 15:27:08 +05303369 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303370
3371 for (i = 0; i < num_devices; i++) {
3372 acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(new_snd_device[i])];
3373
3374 // Do not use Rx path default app type for TX path
3375 if ((usecase->type == PCM_CAPTURE) && (app_type == DEFAULT_APP_TYPE_RX_PATH)) {
3376 ALOGD("Resetting app type for Tx path to default");
3377 app_type = DEFAULT_APP_TYPE_TX_PATH;
3378 }
3379 if (acdb_dev_id < 0) {
3380 ALOGE("%s: Could not find acdb id for device(%d)",
3381 __func__, new_snd_device[i]);
3382 return -EINVAL;
3383 }
Siena Richard7c2db772016-12-21 11:32:34 -08003384 ALOGV("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
3385 __func__, new_snd_device[i], acdb_dev_id);
3386 if (new_snd_device[i] >= SND_DEVICE_OUT_BEGIN &&
3387 new_snd_device[i] < SND_DEVICE_OUT_END)
3388 acdb_dev_type = ACDB_DEV_TYPE_OUT;
3389 else
3390 acdb_dev_type = ACDB_DEV_TYPE_IN;
3391
3392 if (my_data->acdb_send_audio_cal_v3) {
3393 my_data->acdb_send_audio_cal_v3(acdb_dev_id, acdb_dev_type, app_type,
3394 sample_rate, i);
3395 } else if (my_data->acdb_send_audio_cal) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303396 my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type, app_type,
3397 sample_rate);
3398 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05303399 }
3400 return 0;
3401}
3402
3403int platform_switch_voice_call_device_pre(void *platform)
3404{
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303405 struct platform_data *my_data = (struct platform_data *)platform;
3406 int ret = 0;
3407
3408 if (my_data->csd != NULL &&
Ravi Kumar Alamandabe149392014-10-20 17:07:43 -07003409 voice_is_in_call(my_data->adev)) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303410 /* This must be called before disabling mixer controls on APQ side */
3411 ret = my_data->csd->disable_device();
3412 if (ret < 0) {
3413 ALOGE("%s: csd_client_disable_device, failed, error %d",
3414 __func__, ret);
3415 }
3416 }
3417 return ret;
Naresh Tannirue3b18452014-03-04 14:44:27 +05303418}
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303419
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303420int platform_switch_voice_call_enable_device_config(void *platform,
3421 snd_device_t out_snd_device,
3422 snd_device_t in_snd_device)
3423{
3424 struct platform_data *my_data = (struct platform_data *)platform;
3425 int acdb_rx_id, acdb_tx_id;
3426 int ret = 0;
3427
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303428 if (my_data->csd == NULL)
3429 return ret;
3430
Banajit Goswami20cdd212015-09-11 01:11:30 -07003431 if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
Rohit kumarf4120402016-08-05 19:19:48 +05303432 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
3433 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
3434 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
Banajit Goswami20cdd212015-09-11 01:11:30 -07003435 audio_extn_spkr_prot_is_enabled()) {
3436 if (my_data->is_vbat_speaker)
3437 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
3438 else
3439 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED];
3440 } else
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303441 acdb_rx_id = acdb_device_table[out_snd_device];
3442
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303443 acdb_tx_id = acdb_device_table[in_snd_device];
3444
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303445 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
3446 ret = my_data->csd->enable_device_config(acdb_rx_id, acdb_tx_id);
3447 if (ret < 0) {
3448 ALOGE("%s: csd_enable_device_config, failed, error %d",
3449 __func__, ret);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303450 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303451 } else {
3452 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
3453 acdb_rx_id, acdb_tx_id);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303454 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303455
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303456 return ret;
3457}
3458
Naresh Tannirue3b18452014-03-04 14:44:27 +05303459int platform_switch_voice_call_device_post(void *platform,
3460 snd_device_t out_snd_device,
3461 snd_device_t in_snd_device)
3462{
3463 struct platform_data *my_data = (struct platform_data *)platform;
3464 int acdb_rx_id, acdb_tx_id;
3465
3466 if (my_data->acdb_send_voice_cal == NULL) {
3467 ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
3468 } else {
Rohit kumarf4120402016-08-05 19:19:48 +05303469 if (audio_extn_spkr_prot_is_enabled()) {
3470 if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
3471 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA)
3472 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
3473 else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
3474 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA)
3475 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
3476 else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)
3477 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
3478 else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)
3479 out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
3480 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303481
Naresh Tannirue3b18452014-03-04 14:44:27 +05303482 acdb_rx_id = acdb_device_table[out_snd_device];
3483 acdb_tx_id = acdb_device_table[in_snd_device];
3484
3485 if (acdb_rx_id > 0 && acdb_tx_id > 0)
3486 my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id);
3487 else
3488 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
3489 acdb_rx_id, acdb_tx_id);
3490 }
3491
3492 return 0;
3493}
3494
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303495int platform_switch_voice_call_usecase_route_post(void *platform,
3496 snd_device_t out_snd_device,
3497 snd_device_t in_snd_device)
Naresh Tannirue3b18452014-03-04 14:44:27 +05303498{
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303499 struct platform_data *my_data = (struct platform_data *)platform;
3500 int acdb_rx_id, acdb_tx_id;
3501 int ret = 0;
3502
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303503 if (my_data->csd == NULL)
3504 return ret;
3505
Banajit Goswami20cdd212015-09-11 01:11:30 -07003506 if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
Rohit kumarf4120402016-08-05 19:19:48 +05303507 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
3508 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
3509 out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
Banajit Goswami20cdd212015-09-11 01:11:30 -07003510 audio_extn_spkr_prot_is_enabled()) {
3511 if (my_data->is_vbat_speaker)
3512 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
3513 else
3514 acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED];
3515 } else
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303516 acdb_rx_id = acdb_device_table[out_snd_device];
3517
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303518 acdb_tx_id = acdb_device_table[in_snd_device];
3519
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303520 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
3521 ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id,
3522 my_data->adev->acdb_settings);
3523 if (ret < 0) {
3524 ALOGE("%s: csd_enable_device, failed, error %d", __func__, ret);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303525 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303526 } else {
3527 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
3528 acdb_rx_id, acdb_tx_id);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303529 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303530
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303531 return ret;
Naresh Tannirue3b18452014-03-04 14:44:27 +05303532}
3533
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303534int platform_start_voice_call(void *platform, uint32_t vsid)
3535{
3536 struct platform_data *my_data = (struct platform_data *)platform;
3537 int ret = 0;
3538
3539 if (my_data->csd != NULL) {
3540 ret = my_data->csd->start_voice(vsid);
3541 if (ret < 0) {
3542 ALOGE("%s: csd_start_voice error %d\n", __func__, ret);
3543 }
3544 }
3545 return ret;
3546}
3547
3548int platform_stop_voice_call(void *platform, uint32_t vsid)
3549{
3550 struct platform_data *my_data = (struct platform_data *)platform;
3551 int ret = 0;
3552
3553 if (my_data->csd != NULL) {
3554 ret = my_data->csd->stop_voice(vsid);
3555 if (ret < 0) {
3556 ALOGE("%s: csd_stop_voice error %d\n", __func__, ret);
3557 }
3558 }
3559 return ret;
3560}
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07003561
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05303562int platform_get_sample_rate(void *platform __unused,
3563 uint32_t *rate __unused)
Naresh Tannirue3b18452014-03-04 14:44:27 +05303564{
3565 return 0;
3566}
3567
3568int platform_set_voice_volume(void *platform, int volume)
3569{
3570 struct platform_data *my_data = (struct platform_data *)platform;
3571 struct audio_device *adev = my_data->adev;
3572 struct mixer_ctl *ctl;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303573 const char *mixer_ctl_name = "Voice Rx Gain";
3574 int vol_index = 0, ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05303575 long set_values[ ] = {0,
3576 ALL_SESSION_VSID,
3577 DEFAULT_VOLUME_RAMP_DURATION_MS};
Naresh Tannirue3b18452014-03-04 14:44:27 +05303578
3579 // Voice volume levels are mapped to adsp volume levels as follows.
3580 // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1 0 -> 0
3581 // But this values don't changed in kernel. So, below change is need.
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303582 vol_index = (int)percent_to_index(volume, MIN_VOL_INDEX, MAX_VOL_INDEX);
3583 set_values[0] = vol_index;
Naresh Tannirue3b18452014-03-04 14:44:27 +05303584
3585 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3586 if (!ctl) {
3587 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3588 __func__, mixer_ctl_name);
Josh Kirsch5669ad92016-12-09 10:48:52 -08003589 ret = -EINVAL;
3590 } else {
Manish Dewangan338c50a2017-09-12 15:22:03 +05303591 ALOGV("%s Setting voice volume index: %ld",__func__, set_values[0]);
Josh Kirsch5669ad92016-12-09 10:48:52 -08003592 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Naresh Tannirue3b18452014-03-04 14:44:27 +05303593 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05303594
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303595 if (my_data->csd != NULL) {
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303596 ret = my_data->csd->volume(ALL_SESSION_VSID, volume,
3597 DEFAULT_VOLUME_RAMP_DURATION_MS);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303598 if (ret < 0) {
3599 ALOGE("%s: csd_volume error %d", __func__, ret);
3600 }
3601 }
3602 return ret;
Naresh Tannirue3b18452014-03-04 14:44:27 +05303603}
3604
3605int platform_set_mic_mute(void *platform, bool state)
3606{
3607 struct platform_data *my_data = (struct platform_data *)platform;
3608 struct audio_device *adev = my_data->adev;
3609 struct mixer_ctl *ctl;
3610 const char *mixer_ctl_name = "Voice Tx Mute";
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303611 int ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05303612 long set_values[ ] = {0,
3613 ALL_SESSION_VSID,
3614 DEFAULT_MUTE_RAMP_DURATION_MS};
Naresh Tannirue3b18452014-03-04 14:44:27 +05303615
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303616 set_values[0] = state;
3617 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3618 if (!ctl) {
3619 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3620 __func__, mixer_ctl_name);
Josh Kirsch5669ad92016-12-09 10:48:52 -08003621 ret = -EINVAL;
3622 } else {
3623 ALOGV("%s: Setting voice mute state: %d",__func__, state);
3624 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Naresh Tannirue3b18452014-03-04 14:44:27 +05303625 }
3626
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303627 if (my_data->csd != NULL) {
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303628 ret = my_data->csd->mic_mute(ALL_SESSION_VSID, state,
3629 DEFAULT_MUTE_RAMP_DURATION_MS);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303630 if (ret < 0) {
3631 ALOGE("%s: csd_mic_mute error %d", __func__, ret);
3632 }
3633 }
3634 return ret;
Naresh Tannirue3b18452014-03-04 14:44:27 +05303635}
3636
Shiv Maliyappanahallic6fd8ee2014-03-07 15:31:55 -08003637int platform_set_device_mute(void *platform, bool state, char *dir)
3638{
3639 struct platform_data *my_data = (struct platform_data *)platform;
3640 struct audio_device *adev = my_data->adev;
3641 struct mixer_ctl *ctl;
3642 char *mixer_ctl_name = NULL;
3643 int ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05303644 long set_values[ ] = {0,
3645 ALL_SESSION_VSID,
3646 0};
Shiv Maliyappanahallic6fd8ee2014-03-07 15:31:55 -08003647 if(dir == NULL) {
3648 ALOGE("%s: Invalid direction:%s", __func__, dir);
3649 return -EINVAL;
3650 }
3651
3652 if (!strncmp("rx", dir, sizeof("rx"))) {
3653 mixer_ctl_name = "Voice Rx Device Mute";
3654 } else if (!strncmp("tx", dir, sizeof("tx"))) {
3655 mixer_ctl_name = "Voice Tx Device Mute";
3656 } else {
3657 return -EINVAL;
3658 }
3659
3660 set_values[0] = state;
3661 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3662 if (!ctl) {
3663 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3664 __func__, mixer_ctl_name);
3665 return -EINVAL;
3666 }
3667
3668 ALOGV("%s: Setting device mute state: %d, mixer ctrl:%s",
3669 __func__,state, mixer_ctl_name);
3670 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
3671
3672 return ret;
3673}
3674
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003675int platform_split_snd_device(void *platform,
3676 snd_device_t snd_device,
3677 int *num_devices,
3678 snd_device_t *new_snd_devices)
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303679{
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003680 int ret = -EINVAL;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303681 struct platform_data *my_data = (struct platform_data *)platform;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303682 if (NULL == num_devices || NULL == new_snd_devices) {
3683 ALOGE("%s: NULL pointer ..", __func__);
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003684 return -EINVAL;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303685 }
3686
3687 /*
3688 * If wired headset/headphones/line devices share the same backend
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003689 * with speaker/earpiece this routine returns -EINVAL.
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303690 */
3691 if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES &&
3692 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HEADPHONES)) {
3693 *num_devices = 2;
3694
3695 if (my_data->is_vbat_speaker)
3696 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_VBAT;
3697 else if (my_data->is_wsa_speaker)
3698 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_WSA;
3699 else
3700 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3701
3702 new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003703 ret = 0;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303704 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET &&
3705 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_ANC_HEADSET)) {
3706 *num_devices = 2;
3707 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3708 new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
3709 ret = 0;
3710 } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES &&
3711 !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER, SND_DEVICE_OUT_VOICE_HEADPHONES)) {
3712 *num_devices = 2;
3713 new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
3714 new_snd_devices[1] = SND_DEVICE_OUT_VOICE_HEADPHONES;
3715 ret = 0;
3716 } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET &&
3717 !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER, SND_DEVICE_OUT_VOICE_ANC_HEADSET)) {
3718 *num_devices = 2;
3719 new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
3720 new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
3721 ret = 0;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303722 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI &&
3723 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HDMI)) {
3724 *num_devices = 2;
3725
3726 if (my_data->is_vbat_speaker)
3727 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_VBAT;
3728 else if (my_data->is_wsa_speaker)
3729 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_WSA;
3730 else
3731 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3732
3733 new_snd_devices[1] = SND_DEVICE_OUT_HDMI;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003734 ret = 0;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003735 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT &&
3736 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_DISPLAY_PORT)) {
3737 *num_devices = 2;
3738
3739 if (my_data->is_vbat_speaker)
3740 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_VBAT;
3741 else if (my_data->is_wsa_speaker)
3742 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_WSA;
3743 else
3744 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3745
3746 new_snd_devices[1] = SND_DEVICE_OUT_DISPLAY_PORT;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003747 ret = 0;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003748 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET &&
3749 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_USB_HEADSET)) {
3750 *num_devices = 2;
3751 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3752 new_snd_devices[1] = SND_DEVICE_OUT_USB_HEADSET;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003753 ret = 0;
kunleizbe6a8442017-08-08 17:11:35 +08003754 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_SCO &&
3755 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_BT_SCO)) {
3756 *num_devices = 2;
3757 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3758 new_snd_devices[1] = SND_DEVICE_OUT_BT_SCO;
3759 ret = 0;
3760 } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB &&
3761 !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_BT_SCO_WB)) {
3762 *num_devices = 2;
3763 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3764 new_snd_devices[1] = SND_DEVICE_OUT_BT_SCO_WB;
3765 ret = 0;
Naresh Tannirucd2353e2016-08-19 00:37:25 +05303766 } else if (SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP == snd_device) {
3767 *num_devices = 2;
3768 new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
3769 new_snd_devices[1] = SND_DEVICE_OUT_BT_A2DP;
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003770 ret = 0;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303771 }
3772
3773 ALOGD("%s: snd_device(%d) num devices(%d) new_snd_devices(%d)", __func__,
3774 snd_device, *num_devices, *new_snd_devices);
3775
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07003776 return ret;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05303777}
3778
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003779int platform_get_ext_disp_type(void *platform)
3780{
3781 int disp_type;
3782 struct platform_data *my_data = (struct platform_data *)platform;
3783
3784 if (my_data->ext_disp_type != EXT_DISPLAY_TYPE_NONE) {
3785 ALOGD("%s: Returning cached ext disp type:%s",
3786 __func__, (my_data->ext_disp_type == EXT_DISPLAY_TYPE_DP) ? "DisplayPort" : "HDMI");
3787 return my_data->ext_disp_type;
3788 }
3789
3790#ifdef DISPLAY_PORT_ENABLED
3791 struct audio_device *adev = my_data->adev;
3792 struct mixer_ctl *ctl;
3793 char *mixer_ctl_name = "External Display Type";
3794
3795 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3796 if (!ctl) {
3797 ALOGE("%s: Could not get ctl for mixer cmd - %s",
3798 __func__, mixer_ctl_name);
3799 return -EINVAL;
3800 }
3801
3802 disp_type = mixer_ctl_get_value(ctl, 0);
3803 if (disp_type == EXT_DISPLAY_TYPE_NONE) {
3804 ALOGE("%s: Invalid external display type: %d", __func__, disp_type);
3805 return -EINVAL;
3806 }
3807#else
3808 disp_type = EXT_DISPLAY_TYPE_HDMI;
3809#endif
3810 my_data->ext_disp_type = disp_type;
3811 ALOGD("%s: ext disp type:%s", __func__, (disp_type == EXT_DISPLAY_TYPE_DP) ? "DisplayPort" : "HDMI");
3812 return disp_type;
3813}
3814
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003815snd_device_t platform_get_output_snd_device(void *platform, struct stream_out *out)
Naresh Tannirue3b18452014-03-04 14:44:27 +05303816{
3817 struct platform_data *my_data = (struct platform_data *)platform;
3818 struct audio_device *adev = my_data->adev;
3819 audio_mode_t mode = adev->mode;
3820 snd_device_t snd_device = SND_DEVICE_NONE;
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08003821 audio_devices_t devices = out->devices;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05303822 unsigned int sample_rate = out->sample_rate;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05303823 int na_mode = platform_get_native_support();
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05303824#ifdef RECORD_PLAY_CONCURRENCY
3825 bool use_voip_out_devices = false;
3826 bool prop_rec_play_enabled = false;
3827 char recConcPropValue[PROPERTY_VALUE_MAX];
3828
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07003829 if (property_get("vendor.audio.rec.playback.conc.disabled", recConcPropValue, NULL)) {
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05303830 prop_rec_play_enabled = atoi(recConcPropValue) || !strncmp("true", recConcPropValue, 4);
3831 }
3832 use_voip_out_devices = prop_rec_play_enabled &&
3833 (my_data->rec_play_conc_set || adev->mode == AUDIO_MODE_IN_COMMUNICATION);
3834 ALOGV("platform_get_output_snd_device use_voip_out_devices : %d",use_voip_out_devices);
3835#endif
Naresh Tannirue3b18452014-03-04 14:44:27 +05303836
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303837 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
3838 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
3839 int channel_count = popcount(channel_mask);
3840
Naresh Tannirue3b18452014-03-04 14:44:27 +05303841 ALOGV("%s: enter: output devices(%#x)", __func__, devices);
3842 if (devices == AUDIO_DEVICE_NONE ||
3843 devices & AUDIO_DEVICE_BIT_IN) {
3844 ALOGV("%s: Invalid output devices (%#x)", __func__, devices);
3845 goto exit;
3846 }
3847
Shiv Maliyappanahallibd401262015-08-17 11:02:21 -07003848 if (popcount(devices) == 2) {
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303849 bool is_active_voice_call = false;
3850
3851 /*
3852 * This is special case handling for combo device use case during
3853 * voice call. APM route use case to combo device if stream type is
3854 * enforced audible (e.g. Camera shutter sound).
3855 */
3856 if ((mode == AUDIO_MODE_IN_CALL) ||
3857 voice_is_in_call(adev) ||
3858 voice_extn_compress_voip_is_active(adev))
3859 is_active_voice_call = true;
3860
Naresh Tannirue3b18452014-03-04 14:44:27 +05303861 if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
3862 AUDIO_DEVICE_OUT_SPEAKER)) {
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303863 if (my_data->external_spk_1)
3864 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1;
3865 else if (my_data->external_spk_2)
3866 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303867 else if (is_active_voice_call)
3868 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303869 else
3870 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
Naresh Tanniru9c4ba542015-11-06 18:01:09 +05303871 } else if (devices == (AUDIO_DEVICE_OUT_LINE |
3872 AUDIO_DEVICE_OUT_SPEAKER)) {
3873 snd_device = SND_DEVICE_OUT_SPEAKER_AND_LINE;
Naresh Tannirue3b18452014-03-04 14:44:27 +05303874 } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
3875 AUDIO_DEVICE_OUT_SPEAKER)) {
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303876 if (audio_extn_get_anc_enabled()) {
3877 if (is_active_voice_call)
3878 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET;
3879 else
3880 snd_device = SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET;
3881 } else if (my_data->external_spk_1)
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05303882 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1;
3883 else if (my_data->external_spk_2)
3884 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2;
Preetam Singh Ranawat91132162017-03-13 20:32:03 +05303885 else {
3886 if (is_active_voice_call)
3887 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES;
3888 else
3889 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
3890 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05303891 } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL |
3892 AUDIO_DEVICE_OUT_SPEAKER)) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07003893 switch(my_data->ext_disp_type) {
3894 case EXT_DISPLAY_TYPE_HDMI:
3895 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI;
3896 break;
3897 case EXT_DISPLAY_TYPE_DP:
3898 snd_device = SND_DEVICE_OUT_SPEAKER_AND_DISPLAY_PORT;
3899 break;
3900 default:
3901 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
3902 goto exit;
3903 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303904 } else if (devices == (AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
3905 AUDIO_DEVICE_OUT_SPEAKER)) {
3906 snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08003907 } else if (devices == (AUDIO_DEVICE_OUT_USB_DEVICE |
3908 AUDIO_DEVICE_OUT_SPEAKER)) {
3909 snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303910 } else if ((devices & AUDIO_DEVICE_OUT_SPEAKER) &&
3911 (devices & AUDIO_DEVICE_OUT_ALL_A2DP)) {
3912 snd_device = SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP;
kunleizbe6a8442017-08-08 17:11:35 +08003913 } else if ((devices & AUDIO_DEVICE_OUT_ALL_SCO) &&
3914 ((devices & ~AUDIO_DEVICE_OUT_ALL_SCO) == AUDIO_DEVICE_OUT_SPEAKER)) {
3915 snd_device = adev->bt_wb_speech_enabled ?
3916 SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB :
3917 SND_DEVICE_OUT_SPEAKER_AND_BT_SCO;
Naresh Tannirue3b18452014-03-04 14:44:27 +05303918 } else {
3919 ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
3920 goto exit;
3921 }
3922 if (snd_device != SND_DEVICE_NONE) {
3923 goto exit;
3924 }
3925 }
3926
3927 if (popcount(devices) != 1) {
3928 ALOGE("%s: Invalid output devices(%#x)", __func__, devices);
3929 goto exit;
3930 }
3931
Venkata Narendra Kumar Guttabfdfa152015-06-22 14:25:35 +05303932 if ((mode == AUDIO_MODE_IN_CALL) ||
kunleiz16dbcc32016-12-13 18:23:04 +08003933 voice_is_in_call(adev) ||
Venkata Narendra Kumar Guttabfdfa152015-06-22 14:25:35 +05303934 voice_extn_compress_voip_is_active(adev)) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303935 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Naresh Tanniru9c4ba542015-11-06 18:01:09 +05303936 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
3937 devices & AUDIO_DEVICE_OUT_LINE) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303938 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
3939 !voice_extn_compress_voip_is_active(adev)) {
3940 switch (adev->voice.tty_mode) {
3941 case TTY_MODE_FULL:
3942 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
3943 break;
3944 case TTY_MODE_VCO:
3945 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
3946 break;
3947 case TTY_MODE_HCO:
3948 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
3949 break;
3950 default:
3951 ALOGE("%s: Invalid TTY mode (%#x)",
3952 __func__, adev->voice.tty_mode);
3953 }
Naresh Tanniru9c4ba542015-11-06 18:01:09 +05303954 } else if (devices & AUDIO_DEVICE_OUT_LINE) {
3955 snd_device = SND_DEVICE_OUT_VOICE_LINE;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303956 } else if (audio_extn_get_anc_enabled()) {
3957 if (audio_extn_should_use_fb_anc())
3958 snd_device = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
3959 else
3960 snd_device = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
3961 } else {
3962 snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
3963 }
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07003964 } else if (devices & AUDIO_DEVICE_OUT_USB_DEVICE) {
3965 if (snd_device == SND_DEVICE_NONE) {
3966 snd_device = audio_extn_usb_is_capture_supported() ?
3967 SND_DEVICE_OUT_VOICE_USB_HEADSET :
3968 SND_DEVICE_OUT_VOICE_USB_HEADPHONES;
3969 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303970 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Mingming Yin514a8bc2014-07-29 15:22:21 -07003971 if (adev->bt_wb_speech_enabled)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303972 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
3973 else
3974 snd_device = SND_DEVICE_OUT_BT_SCO;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303975 } else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
3976 snd_device = SND_DEVICE_OUT_BT_A2DP;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303977 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
Rohit kumarf4120402016-08-05 19:19:48 +05303978 if (my_data->is_vbat_speaker) {
3979 if (my_data->mono_speaker == SPKR_1)
3980 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
3981 else
3982 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT;
3983 } else if (my_data->is_wsa_speaker) {
3984 if (my_data->mono_speaker == SPKR_1)
3985 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_WSA;
3986 else
3987 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA;
3988 } else {
3989 if (my_data->mono_speaker == SPKR_1)
3990 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
3991 else
3992 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
3993 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05303994 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
3995 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
3996 snd_device = SND_DEVICE_OUT_USB_HEADSET;
3997 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
3998 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
3999 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
4000 if (audio_extn_should_use_handset_anc(channel_count))
4001 snd_device = SND_DEVICE_OUT_ANC_HANDSET;
4002 else
4003 snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
Preetam Singh Ranawat7112f3b2015-02-26 16:51:58 +05304004 } else if (devices & AUDIO_DEVICE_OUT_TELEPHONY_TX)
4005 snd_device = SND_DEVICE_OUT_VOICE_TX;
4006
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304007 if (snd_device != SND_DEVICE_NONE) {
4008 goto exit;
4009 }
4010 }
4011
Naresh Tannirue3b18452014-03-04 14:44:27 +05304012 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05304013 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
4014 devices & AUDIO_DEVICE_OUT_LINE) {
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05304015 if (OUTPUT_SAMPLING_RATE_44100 == sample_rate &&
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304016 NATIVE_AUDIO_MODE_SRC == na_mode &&
Sidipotu Ashokbffd2202015-08-20 14:06:55 +05304017 !audio_extn_get_anc_enabled()) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304018
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05304019 snd_device = SND_DEVICE_OUT_HEADPHONES_44_1;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05304020
4021 } else if (devices & AUDIO_DEVICE_OUT_WIRED_HEADSET
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304022 && audio_extn_get_anc_enabled()) {
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05304023#ifdef RECORD_PLAY_CONCURRENCY
4024 if (use_voip_out_devices) {
4025 // ANC should be disabled for voip concurrency
4026 snd_device = SND_DEVICE_OUT_VOIP_HEADPHONES;
4027 } else
4028#endif
4029 {
4030 if (audio_extn_should_use_fb_anc())
4031 snd_device = SND_DEVICE_OUT_ANC_FB_HEADSET;
4032 else
4033 snd_device = SND_DEVICE_OUT_ANC_HEADSET;
4034 }
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05304035 } else if (NATIVE_AUDIO_MODE_SRC == na_mode &&
4036 OUTPUT_SAMPLING_RATE_44100 == sample_rate) {
4037 snd_device = SND_DEVICE_OUT_HEADPHONES_44_1;
4038 } else if (NATIVE_AUDIO_MODE_MULTIPLE_44_1 == na_mode &&
4039 (sample_rate % OUTPUT_SAMPLING_RATE_44100 == 0) &&
4040 (out->format != AUDIO_FORMAT_DSD)) {
4041 snd_device = SND_DEVICE_OUT_HEADPHONES_44_1;
4042 } else if (out->format == AUDIO_FORMAT_DSD) {
4043 snd_device = SND_DEVICE_OUT_HEADPHONES_DSD;
Surendar karkaff241fc2017-09-21 10:25:50 +05304044 } else if (devices & AUDIO_DEVICE_OUT_LINE) {
4045 snd_device = SND_DEVICE_OUT_LINE;
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05304046 } else {
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05304047#ifdef RECORD_PLAY_CONCURRENCY
4048 if (use_voip_out_devices)
4049 snd_device = SND_DEVICE_OUT_VOIP_HEADPHONES;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304050 else
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05304051#endif
4052 snd_device = SND_DEVICE_OUT_HEADPHONES;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304053 }
Naresh Tanniru9c4ba542015-11-06 18:01:09 +05304054 } else if (devices & AUDIO_DEVICE_OUT_LINE) {
4055 snd_device = SND_DEVICE_OUT_LINE;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304056 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05304057#ifdef RECORD_PLAY_CONCURRENCY
4058 if (use_voip_out_devices) {
4059 snd_device = SND_DEVICE_OUT_VOIP_SPEAKER;
4060 } else
4061#endif
4062 {
4063 if (adev->speaker_lr_swap)
4064 snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
4065 else
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +05304066 {
Banajit Goswami20cdd212015-09-11 01:11:30 -07004067 if (my_data->is_vbat_speaker)
4068 snd_device = SND_DEVICE_OUT_SPEAKER_VBAT;
4069 else if (my_data->is_wsa_speaker)
Preetam Singh Ranawatc7f7f5c2015-04-02 12:19:58 +05304070 snd_device = SND_DEVICE_OUT_SPEAKER_WSA;
4071 else
4072 snd_device = SND_DEVICE_OUT_SPEAKER;
4073 }
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05304074 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05304075 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Mingming Yin514a8bc2014-07-29 15:22:21 -07004076 if (adev->bt_wb_speech_enabled)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304077 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
4078 else
4079 snd_device = SND_DEVICE_OUT_BT_SCO;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304080 } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07004081 switch(my_data->ext_disp_type) {
4082 case EXT_DISPLAY_TYPE_HDMI:
4083 snd_device = SND_DEVICE_OUT_HDMI;
4084 break;
4085 case EXT_DISPLAY_TYPE_DP:
4086 snd_device = SND_DEVICE_OUT_DISPLAY_PORT;
4087 break;
4088 default:
4089 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
4090 goto exit;
4091 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05304092 } else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
4093 snd_device = SND_DEVICE_OUT_BT_A2DP;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304094 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
4095 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
Mingming Yin5a7c5d62014-03-05 17:45:03 -08004096 ALOGD("%s: setting USB hadset channel capability(2) for Proxy", __func__);
4097 audio_extn_set_afe_proxy_channel_mixer(adev, 2);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304098 snd_device = SND_DEVICE_OUT_USB_HEADSET;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08004099 } else if (devices & AUDIO_DEVICE_OUT_USB_DEVICE) {
Ashish Jain3e37a702016-11-25 12:27:15 +05304100 if (audio_extn_usb_is_capture_supported())
4101 snd_device = SND_DEVICE_OUT_USB_HEADSET;
4102 else
4103 snd_device = SND_DEVICE_OUT_USB_HEADPHONES;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304104 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
4105 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304106 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05304107#ifdef RECORD_PLAY_CONCURRENCY
4108 if (use_voip_out_devices)
4109 snd_device = SND_DEVICE_OUT_VOIP_HANDSET;
4110 else
4111#endif
4112 snd_device = SND_DEVICE_OUT_HANDSET;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304113 } else if (devices & AUDIO_DEVICE_OUT_PROXY) {
Mingming Yin5a7c5d62014-03-05 17:45:03 -08004114 channel_count = audio_extn_get_afe_proxy_channel_count();
4115 ALOGD("%s: setting sink capability(%d) for Proxy", __func__, channel_count);
4116 audio_extn_set_afe_proxy_channel_mixer(adev, channel_count);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304117 snd_device = SND_DEVICE_OUT_AFE_PROXY;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304118 } else {
4119 ALOGE("%s: Unknown device(s) %#x", __func__, devices);
4120 }
4121exit:
4122 ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]);
4123 return snd_device;
4124}
4125
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004126#ifdef DYNAMIC_ECNS_ENABLED
4127static snd_device_t get_snd_device_for_voice_comm(struct platform_data *my_data,
4128 audio_devices_t out_device,
4129 audio_devices_t in_device)
4130{
4131 struct audio_device *adev = my_data->adev;
4132 snd_device_t snd_device = SND_DEVICE_NONE;
4133
4134 if (my_data->fluence_type != FLUENCE_NONE) {
4135 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4136 if (my_data->fluence_in_spkr_mode) {
4137 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4138 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4139 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS;
4140 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4141 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4142 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4143 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE;
4144 else
4145 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
4146 }
4147 adev->acdb_settings |= DMIC_FLAG;
4148 } else
4149 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
4150 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
4151 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4152 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4153 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
4154 adev->acdb_settings |= DMIC_FLAG;
4155 } else
4156 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
4157 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4158 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
4159 }
4160 platform_set_echo_reference(adev, true, out_device);
4161 }
4162
4163 return snd_device;
4164}
4165#else
4166static snd_device_t get_snd_device_for_voice_comm(struct platform_data *my_data,
4167 audio_devices_t out_device,
4168 audio_devices_t in_device)
4169{
4170 struct audio_device *adev = my_data->adev;
4171 snd_device_t snd_device = SND_DEVICE_NONE;
4172
4173 if (my_data->fluence_type != FLUENCE_NONE && adev->active_input->enable_aec &&
4174 adev->active_input->enable_ns) {
4175 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4176 if (my_data->fluence_in_spkr_mode) {
4177 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4178 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4179 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS;
4180 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4181 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4182 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4183 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE;
4184 else
4185 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
4186 }
4187 adev->acdb_settings |= DMIC_FLAG;
4188 } else
4189 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
4190 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
4191 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4192 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4193 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
4194 adev->acdb_settings |= DMIC_FLAG;
4195 } else
4196 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
4197 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4198 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
4199 } else if (in_device & AUDIO_DEVICE_IN_USB_DEVICE) {
4200 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC_AEC;
4201 }
4202 platform_set_echo_reference(adev, true, out_device);
4203 } else if (my_data->fluence_type != FLUENCE_NONE &&
4204 adev->active_input->enable_aec) {
4205 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4206 if (my_data->fluence_in_spkr_mode) {
4207 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4208 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4209 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_AEC;
4210 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4211 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4212 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4213 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE;
4214 else
4215 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
4216 }
4217 adev->acdb_settings |= DMIC_FLAG;
4218 } else
4219 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
4220 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
4221 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4222 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4223 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
4224 adev->acdb_settings |= DMIC_FLAG;
4225 } else
4226 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC;
4227 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4228 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
4229 } else if (in_device & AUDIO_DEVICE_IN_USB_DEVICE) {
4230 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC_AEC;
4231 }
4232 platform_set_echo_reference(adev, true, out_device);
4233 } else if (my_data->fluence_type != FLUENCE_NONE &&
4234 adev->active_input->enable_ns) {
4235 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4236 if (my_data->fluence_in_spkr_mode) {
4237 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4238 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4239 snd_device = SND_DEVICE_IN_SPEAKER_QMIC_NS;
4240 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4241 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4242 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4243 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE;
4244 else
4245 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
4246 }
4247 adev->acdb_settings |= DMIC_FLAG;
4248 } else
4249 snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS;
4250 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
4251 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4252 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4253 snd_device = SND_DEVICE_IN_HANDSET_DMIC_NS;
4254 adev->acdb_settings |= DMIC_FLAG;
4255 } else
4256 snd_device = SND_DEVICE_IN_HANDSET_MIC_NS;
4257 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4258 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
4259 }
4260 platform_set_echo_reference(adev, false, out_device);
4261 } else
4262 platform_set_echo_reference(adev, false, out_device);
4263
4264 return snd_device;
4265}
4266#endif //DYNAMIC_ECNS_ENABLED
4267
Naresh Tannirue3b18452014-03-04 14:44:27 +05304268snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device)
4269{
4270 struct platform_data *my_data = (struct platform_data *)platform;
4271 struct audio_device *adev = my_data->adev;
Dhanalakshmi Siddanib678a802016-12-03 11:51:41 +05304272 /*
4273 * TODO: active_input always points to last opened input. Source returned will
4274 * be wrong if more than one active inputs are present.
4275 */
Naresh Tannirue3b18452014-03-04 14:44:27 +05304276 audio_source_t source = (adev->active_input == NULL) ?
4277 AUDIO_SOURCE_DEFAULT : adev->active_input->source;
4278
4279 audio_mode_t mode = adev->mode;
4280 audio_devices_t in_device = ((adev->active_input == NULL) ?
4281 AUDIO_DEVICE_NONE : adev->active_input->device)
4282 & ~AUDIO_DEVICE_BIT_IN;
4283 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
4284 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
4285 snd_device_t snd_device = SND_DEVICE_NONE;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304286 int channel_count = popcount(channel_mask);
Ashish Jainb8d55fd2016-12-29 14:00:24 +05304287 int str_bitwidth = (adev->active_input == NULL) ?
4288 CODEC_BACKEND_DEFAULT_BIT_WIDTH : adev->active_input->bit_width;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304289
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304290 ALOGV("%s: enter: out_device(%#x) in_device(%#x) channel_count (%d) channel_mask (0x%x)",
4291 __func__, out_device, in_device, channel_count, channel_mask);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05304292 if (my_data->external_mic) {
kunleiz16dbcc32016-12-13 18:23:04 +08004293 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 +05304294 voice_extn_compress_voip_is_active(adev) || audio_extn_hfp_is_active(adev))) {
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05304295 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
4296 out_device & AUDIO_DEVICE_OUT_EARPIECE ||
4297 out_device & AUDIO_DEVICE_OUT_SPEAKER )
4298 snd_device = SND_DEVICE_IN_HANDSET_MIC_EXTERNAL;
4299 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
4300 in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4301 snd_device = SND_DEVICE_IN_HANDSET_MIC_EXTERNAL;
4302 }
4303 }
4304
4305 if (snd_device != AUDIO_DEVICE_NONE)
4306 goto exit;
4307
kunleiz16dbcc32016-12-13 18:23:04 +08004308 if ((out_device != AUDIO_DEVICE_NONE) && ((mode == AUDIO_MODE_IN_CALL) || voice_is_in_call(adev) ||
Satya Krishna Pindiproli2aaa6152014-05-21 15:05:22 +05304309 voice_extn_compress_voip_is_active(adev) || audio_extn_hfp_is_active(adev))) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304310 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
4311 !voice_extn_compress_voip_is_active(adev)) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05304312 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Naresh Tanniru9c4ba542015-11-06 18:01:09 +05304313 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
4314 out_device & AUDIO_DEVICE_OUT_LINE) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304315 switch (adev->voice.tty_mode) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05304316 case TTY_MODE_FULL:
4317 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC;
4318 break;
4319 case TTY_MODE_VCO:
4320 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
4321 break;
4322 case TTY_MODE_HCO:
4323 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC;
4324 break;
4325 default:
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304326 ALOGE("%s: Invalid TTY mode (%#x)",
4327 __func__, adev->voice.tty_mode);
Naresh Tannirue3b18452014-03-04 14:44:27 +05304328 }
4329 goto exit;
4330 }
4331 }
4332 if (out_device & AUDIO_DEVICE_OUT_EARPIECE ||
Naresh Tanniru9c4ba542015-11-06 18:01:09 +05304333 out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
4334 out_device & AUDIO_DEVICE_OUT_LINE) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304335 if (out_device & AUDIO_DEVICE_OUT_EARPIECE &&
Sidipotu Ashok3bcca232014-11-07 14:41:58 +05304336 audio_extn_should_use_handset_anc(channel_count) &&
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304337 my_data->fluence_type != FLUENCE_NONE &&
4338 my_data->source_mic_type & SOURCE_DUAL_MIC) {
Sidipotu Ashok3bcca232014-11-07 14:41:58 +05304339 snd_device = SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC;
4340 adev->acdb_settings |= DMIC_FLAG;
4341 ALOGD("Selecting AANC, Fluence combo device");
4342 } else if (out_device & AUDIO_DEVICE_OUT_EARPIECE &&
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304343 audio_extn_should_use_handset_anc(channel_count)) {
4344 snd_device = SND_DEVICE_IN_AANC_HANDSET_MIC;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05304345 adev->acdb_settings |= ANC_FLAG;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304346 } else if (my_data->fluence_type == FLUENCE_NONE ||
Vikram Pandurangae7b21342017-06-05 15:57:23 -07004347 (my_data->fluence_in_voice_call == false &&
4348 my_data->fluence_in_hfp_call == false)) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05304349 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05304350 if (audio_extn_hfp_is_active(adev))
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004351 platform_set_echo_reference(adev, true, out_device);
Naresh Tannirue3b18452014-03-04 14:44:27 +05304352 } else {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304353 snd_device = SND_DEVICE_IN_VOICE_DMIC;
4354 adev->acdb_settings |= DMIC_FLAG;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304355 }
4356 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
4357 snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05304358 if (audio_extn_hfp_is_active(adev))
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004359 platform_set_echo_reference(adev, true, out_device);
Naresh Tannirue3b18452014-03-04 14:44:27 +05304360 } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07004361 if (adev->bt_wb_speech_enabled) {
4362 if (adev->bluetooth_nrec)
4363 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
4364 else
4365 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
4366 } else {
4367 if (adev->bluetooth_nrec)
4368 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
4369 else
4370 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
4371 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05304372 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304373 if (my_data->fluence_type != FLUENCE_NONE &&
Dhanalakshmi Siddani3dbfc382017-03-21 15:15:03 +05304374 (my_data->fluence_in_voice_call ||
4375 my_data->fluence_in_hfp_call) &&
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304376 my_data->fluence_in_spkr_mode) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304377 if((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4378 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304379 adev->acdb_settings |= QMIC_FLAG;
4380 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_QMIC;
4381 } else {
4382 adev->acdb_settings |= DMIC_FLAG;
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05304383 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
4384 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE;
4385 else
4386 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304387 }
Dhanalakshmi Siddani1eb3a352017-06-05 15:18:23 +05304388 if (audio_extn_hfp_is_active(adev))
4389 platform_set_echo_reference(adev, true, out_device);
Naresh Tannirue3b18452014-03-04 14:44:27 +05304390 } else {
4391 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05304392 if (audio_extn_hfp_is_active(adev))
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004393 platform_set_echo_reference(adev, true, out_device);
Naresh Tannirue3b18452014-03-04 14:44:27 +05304394 }
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07004395 } else if (out_device & AUDIO_DEVICE_OUT_TELEPHONY_TX) {
Preetam Singh Ranawat7112f3b2015-02-26 16:51:58 +05304396 snd_device = SND_DEVICE_IN_VOICE_RX;
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07004397 } else if (out_device & AUDIO_DEVICE_OUT_USB_DEVICE) {
4398 if (audio_extn_usb_is_capture_supported()) {
4399 snd_device = SND_DEVICE_IN_VOICE_USB_HEADSET_MIC;
4400 }
4401 }
Dhananjay Kumar704ce6f2017-09-28 22:08:00 +05304402 } else if (my_data->use_generic_handset == true && // system prop is enabled
4403 (my_data->source_mic_type & SOURCE_QUAD_MIC) && // AND 4mic is available
4404 ((in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) || // AND device is buit-in mic or back mic
4405 (in_device & AUDIO_DEVICE_IN_BACK_MIC)) &&
4406 (my_data->fluence_in_audio_rec == true && // AND fluencepro is enabled
4407 my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4408 (source == AUDIO_SOURCE_CAMCORDER || // AND source is cam/mic/unprocessed
4409 source == AUDIO_SOURCE_UNPROCESSED ||
4410 source == AUDIO_SOURCE_MIC)) {
4411 snd_device = SND_DEVICE_IN_HANDSET_GENERIC_QMIC;
4412 platform_set_echo_reference(adev, true, out_device);
Naresh Tannirue3b18452014-03-04 14:44:27 +05304413 } else if (source == AUDIO_SOURCE_CAMCORDER) {
4414 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
4415 in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05304416
4417 if (str_bitwidth == 16) {
4418 if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4419 (my_data->source_mic_type & SOURCE_DUAL_MIC) &&
4420 (channel_count == 2))
4421 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
4422 else
4423 snd_device = SND_DEVICE_IN_CAMCORDER_MIC;
4424 }
4425 /*
4426 * for other bit widths
4427 */
4428 else {
4429 if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
4430 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
4431 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4432 snd_device = SND_DEVICE_IN_UNPROCESSED_STEREO_MIC;
4433 }
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304434 else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_3) &&
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05304435 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4436 snd_device = SND_DEVICE_IN_UNPROCESSED_THREE_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304437 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_4) &&
Arun Tom Abrahamf888ae82016-12-10 04:51:49 +05304438 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4439 snd_device = SND_DEVICE_IN_UNPROCESSED_QUAD_MIC;
4440 } else {
4441 snd_device = SND_DEVICE_IN_UNPROCESSED_MIC;
4442 }
4443 }
4444 }
4445 } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05304446 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304447 if (my_data->fluence_in_voice_rec && channel_count == 1) {
4448 if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4449 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4450 snd_device = SND_DEVICE_IN_HANDSET_QMIC;
4451 } else if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4452 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
Ben Rombergera4d76db2016-10-13 15:26:02 -07004453 snd_device = SND_DEVICE_IN_VOICE_REC_TMIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304454 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4455 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4456 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
4457 }
4458 platform_set_echo_reference(adev, true, out_device);
4459 } else if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
4460 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
4461 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304462 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_STEREO;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304463 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_3) &&
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304464 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4465 snd_device = SND_DEVICE_IN_THREE_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304466 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_4) &&
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304467 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4468 snd_device = SND_DEVICE_IN_QUAD_MIC;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304469 }
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304470 if (snd_device == SND_DEVICE_NONE) {
4471 if (adev->active_input->enable_ns)
4472 snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS;
4473 else
4474 snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
4475 }
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07004476 } else if (in_device & AUDIO_DEVICE_IN_USB_DEVICE) {
4477 snd_device = SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC;
4478 }
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05304479 } else if (source == AUDIO_SOURCE_UNPROCESSED) {
4480 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
4481 if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
4482 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
4483 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
4484 snd_device = SND_DEVICE_IN_UNPROCESSED_STEREO_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304485 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_3) &&
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05304486 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4487 snd_device = SND_DEVICE_IN_UNPROCESSED_THREE_MIC;
Dhananjay Kumara5d42b32017-01-11 21:22:16 +05304488 } else if (((int)channel_mask == (int)AUDIO_CHANNEL_INDEX_MASK_4) &&
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05304489 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
4490 snd_device = SND_DEVICE_IN_UNPROCESSED_QUAD_MIC;
4491 } else {
4492 snd_device = SND_DEVICE_IN_UNPROCESSED_MIC;
4493 }
4494 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4495 snd_device = SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC;
Aniket Kumar Lata3e2e1232017-06-16 17:25:07 -07004496 } else if (in_device & AUDIO_DEVICE_IN_USB_DEVICE) {
4497 snd_device = SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC;
Chaithanya Krishna Bacharaju24f86f32016-05-26 16:34:53 +05304498 }
Karthik Reddy Kattaf621ec72014-11-21 16:37:38 +05304499 } else if ((source == AUDIO_SOURCE_VOICE_COMMUNICATION) ||
4500 (mode == AUDIO_MODE_IN_COMMUNICATION)) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05304501 if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
4502 in_device = AUDIO_DEVICE_IN_BACK_MIC;
4503 if (adev->active_input) {
Vikram Pandurangadf59cae2017-08-03 18:04:55 -07004504 snd_device = get_snd_device_for_voice_comm(my_data, out_device, in_device);
Naresh Tannirue3b18452014-03-04 14:44:27 +05304505 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304506 } else if (source == AUDIO_SOURCE_MIC) {
4507 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC &&
Garmond Leunge2433c32017-09-28 21:51:22 -07004508 channel_count == 1) {
Karthik Reddy Kattad71b94b2015-01-19 14:06:53 +05304509 if(my_data->fluence_in_audio_rec) {
Garmond Leunge2433c32017-09-28 21:51:22 -07004510 if ((my_data->fluence_type & FLUENCE_HEX_MIC) &&
4511 (my_data->source_mic_type & SOURCE_HEX_MIC) &&
4512 (audio_extn_ffv_get_stream() == adev->active_input)) {
4513 snd_device = audio_extn_ffv_get_capture_snd_device();
4514 } else if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304515 (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
Karthik Reddy Kattad71b94b2015-01-19 14:06:53 +05304516 snd_device = SND_DEVICE_IN_HANDSET_QMIC;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004517 platform_set_echo_reference(adev, true, out_device);
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304518 } else if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
4519 (my_data->source_mic_type & SOURCE_THREE_MIC)) {
4520 snd_device = SND_DEVICE_IN_HANDSET_TMIC;
4521 } else if ((my_data->fluence_type & FLUENCE_DUAL_MIC) &&
4522 (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
Karthik Reddy Kattad71b94b2015-01-19 14:06:53 +05304523 snd_device = SND_DEVICE_IN_HANDSET_DMIC;
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07004524 platform_set_echo_reference(adev, true, out_device);
Karthik Reddy Kattad71b94b2015-01-19 14:06:53 +05304525 }
4526 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304527 }
Mingming Yin12125e82015-10-26 20:40:36 -07004528 } else if (source == AUDIO_SOURCE_FM_TUNER) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304529 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304530 } else if (source == AUDIO_SOURCE_DEFAULT) {
4531 goto exit;
4532 }
4533
Shiv Maliyappanahalli5a10aea2015-07-02 10:36:23 -07004534 if (adev->active_input && (audio_extn_ssr_get_stream() == adev->active_input))
4535 snd_device = SND_DEVICE_IN_THREE_MIC;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304536
4537 if (snd_device != SND_DEVICE_NONE) {
4538 goto exit;
4539 }
4540
4541 if (in_device != AUDIO_DEVICE_NONE &&
4542 !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) &&
4543 !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) {
4544 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Shiv Maliyappanahalli5a10aea2015-07-02 10:36:23 -07004545 if (adev->active_input && (audio_extn_ssr_get_stream() == adev->active_input))
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304546 snd_device = SND_DEVICE_IN_QUAD_MIC;
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304547 else if ((my_data->fluence_type & (FLUENCE_DUAL_MIC | FLUENCE_QUAD_MIC)) &&
4548 (channel_count == 2) && (my_data->source_mic_type & SOURCE_DUAL_MIC))
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304549 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
4550 else
4551 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304552 } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
4553 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
4554 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
4555 snd_device = SND_DEVICE_IN_HEADSET_MIC;
4556 } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07004557 if (adev->bt_wb_speech_enabled) {
4558 if (adev->bluetooth_nrec)
4559 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
4560 else
4561 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
4562 } else {
4563 if (adev->bluetooth_nrec)
4564 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
4565 else
4566 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
4567 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05304568 } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
4569 snd_device = SND_DEVICE_IN_HDMI_MIC;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304570 } else if (in_device & AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET ||
4571 in_device & AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET) {
4572 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Mingming Yin12125e82015-10-26 20:40:36 -07004573 } else if (in_device & AUDIO_DEVICE_IN_FM_TUNER) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304574 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08004575 } else if (in_device & AUDIO_DEVICE_IN_USB_DEVICE ) {
4576 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304577 } else {
4578 ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
4579 ALOGW("%s: Using default handset-mic", __func__);
4580 snd_device = SND_DEVICE_IN_HANDSET_MIC;
4581 }
4582 } else {
4583 if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
4584 snd_device = SND_DEVICE_IN_HANDSET_MIC;
4585 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
4586 snd_device = SND_DEVICE_IN_HEADSET_MIC;
4587 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304588 if ((channel_count > 1) && (my_data->source_mic_type & SOURCE_DUAL_MIC))
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304589 snd_device = SND_DEVICE_IN_SPEAKER_STEREO_DMIC;
4590 else
4591 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
Naresh Tanniru9c4ba542015-11-06 18:01:09 +05304592 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
4593 out_device & AUDIO_DEVICE_OUT_LINE) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05304594 snd_device = SND_DEVICE_IN_HANDSET_MIC;
4595 } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07004596 if (adev->bt_wb_speech_enabled) {
4597 if (adev->bluetooth_nrec)
4598 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
4599 else
4600 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
4601 } else {
4602 if (adev->bluetooth_nrec)
4603 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
4604 else
4605 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
4606 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05304607 } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
4608 snd_device = SND_DEVICE_IN_HDMI_MIC;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304609 } else if (out_device & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
4610 out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
4611 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08004612 } else if (out_device & AUDIO_DEVICE_OUT_USB_DEVICE) {
Ashish Jain3e37a702016-11-25 12:27:15 +05304613 if (audio_extn_usb_is_capture_supported())
4614 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
4615 else
4616 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304617 } else {
4618 ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
4619 ALOGW("%s: Using default handset-mic", __func__);
4620 snd_device = SND_DEVICE_IN_HANDSET_MIC;
4621 }
4622 }
4623exit:
4624 ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
4625 return snd_device;
4626}
4627
4628int platform_set_hdmi_channels(void *platform, int channel_count)
4629{
4630 struct platform_data *my_data = (struct platform_data *)platform;
4631 struct audio_device *adev = my_data->adev;
4632 struct mixer_ctl *ctl;
4633 const char *channel_cnt_str = NULL;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07004634 char *mixer_ctl_name;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304635 switch (channel_count) {
4636 case 8:
4637 channel_cnt_str = "Eight"; break;
4638 case 7:
4639 channel_cnt_str = "Seven"; break;
4640 case 6:
4641 channel_cnt_str = "Six"; break;
4642 case 5:
4643 channel_cnt_str = "Five"; break;
4644 case 4:
4645 channel_cnt_str = "Four"; break;
4646 case 3:
4647 channel_cnt_str = "Three"; break;
4648 default:
4649 channel_cnt_str = "Two"; break;
4650 }
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07004651
4652 switch(my_data->ext_disp_type) {
4653 case EXT_DISPLAY_TYPE_HDMI:
4654 mixer_ctl_name = "HDMI_RX Channels";
4655 break;
4656 case EXT_DISPLAY_TYPE_DP:
4657 mixer_ctl_name = "Display Port RX Channels";
4658 break;
4659 default:
4660 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
4661 return -EINVAL;
4662 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05304663 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4664 if (!ctl) {
4665 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4666 __func__, mixer_ctl_name);
4667 return -EINVAL;
4668 }
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07004669 ALOGV("Ext disp channel count: %s", channel_cnt_str);
Naresh Tannirue3b18452014-03-04 14:44:27 +05304670 mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
4671 return 0;
4672}
4673
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304674int platform_edid_get_max_channels(void *platform)
Naresh Tannirue3b18452014-03-04 14:44:27 +05304675{
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05304676 int channel_count;
4677 int max_channels = 2;
4678 int i = 0, ret = 0;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304679 struct platform_data *my_data = (struct platform_data *)platform;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05304680 edid_audio_info *info = NULL;
4681 ret = platform_get_edid_info(platform);
4682 info = (edid_audio_info *)my_data->edid_info;
Naresh Tannirue3b18452014-03-04 14:44:27 +05304683
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05304684 if(ret == 0 && info != NULL) {
4685 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
4686 ALOGV("%s:format %d channel %d", __func__,
4687 info->audio_blocks_array[i].format_id,
4688 info->audio_blocks_array[i].channels);
4689 if (info->audio_blocks_array[i].format_id == LPCM) {
4690 channel_count = info->audio_blocks_array[i].channels;
4691 if (channel_count > max_channels) {
4692 max_channels = channel_count;
4693 }
4694 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304695 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05304696 }
4697
4698 return max_channels;
4699}
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304700
4701static int platform_set_slowtalk(struct platform_data *my_data, bool state)
4702{
4703 int ret = 0;
4704 struct audio_device *adev = my_data->adev;
4705 struct mixer_ctl *ctl;
4706 const char *mixer_ctl_name = "Slowtalk Enable";
Manish Dewangan338c50a2017-09-12 15:22:03 +05304707 long set_values[ ] = {0,
4708 ALL_SESSION_VSID};
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304709
4710 set_values[0] = state;
4711 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4712 if (!ctl) {
4713 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4714 __func__, mixer_ctl_name);
4715 ret = -EINVAL;
4716 } else {
4717 ALOGV("Setting slowtalk state: %d", state);
4718 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
4719 my_data->slowtalk = state;
4720 }
4721
4722 if (my_data->csd != NULL) {
4723 ret = my_data->csd->slow_talk(ALL_SESSION_VSID, state);
4724 if (ret < 0) {
4725 ALOGE("%s: csd_client_disable_device, failed, error %d",
4726 __func__, ret);
4727 }
4728 }
4729 return ret;
4730}
4731
Avinash Vaishd5fa4572014-09-15 14:41:14 +05304732static int set_hd_voice(struct platform_data *my_data, bool state)
4733{
4734 struct audio_device *adev = my_data->adev;
4735 struct mixer_ctl *ctl;
4736 const char *mixer_ctl_name = "HD Voice Enable";
4737 int ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05304738 long set_values[ ] = {0,
4739 ALL_SESSION_VSID};
Avinash Vaishd5fa4572014-09-15 14:41:14 +05304740
4741 set_values[0] = state;
4742 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
4743 if (!ctl) {
4744 ALOGE("%s: Could not get ctl for mixer cmd - %s",
4745 __func__, mixer_ctl_name);
4746 ret = -EINVAL;
4747 } else {
4748 ALOGV("Setting HD Voice state: %d", state);
4749 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
4750 my_data->hd_voice = state;
4751 }
4752
4753 return ret;
4754}
4755
Preetam Singh Ranawatb5271e02017-03-15 17:27:55 +05304756static int parse_audiocal_cfg(struct str_parms *parms, acdb_audio_cal_cfg_t *cal)
4757{
4758 int err;
4759 char value[64];
4760 int ret = 0;
4761
4762 if(parms == NULL || cal == NULL)
4763 return ret;
4764
4765 err = str_parms_get_str(parms, "cal_persist", value, sizeof(value));
4766 if (err >= 0) {
4767 str_parms_del(parms, "cal_persist");
4768 cal->persist = (uint32_t) strtoul(value, NULL, 0);
4769 ret = ret | 0x1;
4770 }
4771 err = str_parms_get_str(parms, "cal_apptype", value, sizeof(value));
4772 if (err >= 0) {
4773 str_parms_del(parms, "cal_apptype");
4774 cal->app_type = (uint32_t) strtoul(value, NULL, 0);
4775 ret = ret | 0x2;
4776 }
4777 err = str_parms_get_str(parms, "cal_caltype", value, sizeof(value));
4778 if (err >= 0) {
4779 str_parms_del(parms, "cal_caltype");
4780 cal->cal_type = (uint32_t) strtoul(value, NULL, 0);
4781 ret = ret | 0x4;
4782 }
4783 err = str_parms_get_str(parms, "cal_samplerate", value, sizeof(value));
4784 if (err >= 0) {
4785 str_parms_del(parms, "cal_samplerate");
4786 cal->sampling_rate = (uint32_t) strtoul(value, NULL, 0);
4787 ret = ret | 0x8;
4788 }
4789 err = str_parms_get_str(parms, "cal_devid", value, sizeof(value));
4790 if (err >= 0) {
4791 str_parms_del(parms, "cal_devid");
4792 cal->dev_id = (uint32_t) strtoul(value, NULL, 0);
4793 ret = ret | 0x10;
4794 }
4795 err = str_parms_get_str(parms, "cal_snddevid", value, sizeof(value));
4796 if (err >= 0) {
4797 str_parms_del(parms, "cal_snddevid");
4798 cal->snd_dev_id = (uint32_t) strtoul(value, NULL, 0);
4799 ret = ret | 0x20;
4800 }
4801 err = str_parms_get_str(parms, "cal_topoid", value, sizeof(value));
4802 if (err >= 0) {
4803 str_parms_del(parms, "cal_topoid");
4804 cal->topo_id = (uint32_t) strtoul(value, NULL, 0);
4805 ret = ret | 0x40;
4806 }
4807 err = str_parms_get_str(parms, "cal_moduleid", value, sizeof(value));
4808 if (err >= 0) {
4809 str_parms_del(parms, "cal_moduleid");
4810 cal->module_id = (uint32_t) strtoul(value, NULL, 0);
4811 ret = ret | 0x80;
4812 }
4813 err = str_parms_get_str(parms, "cal_paramid", value, sizeof(value));
4814 if (err >= 0) {
4815 str_parms_del(parms, "cal_paramid");
4816 cal->param_id = (uint32_t) strtoul(value, NULL, 0);
4817 ret = ret | 0x100;
4818 }
4819 return ret;
4820}
4821
4822static void set_audiocal(void *platform, struct str_parms *parms, char *value, int len) {
4823 struct platform_data *my_data = (struct platform_data *)platform;
4824 struct stream_out out;
4825 acdb_audio_cal_cfg_t cal;
4826 uint8_t *dptr = NULL;
4827 int32_t dlen;
4828 int err, ret;
4829 if(value == NULL || platform == NULL || parms == NULL) {
4830 ALOGE("[%s] received null pointer, failed",__func__);
4831 goto done_key_audcal;
4832 }
4833
4834 /* parse audio calibration keys */
4835 ret = parse_audiocal_cfg(parms, &cal);
4836
4837 /* handle audio calibration data now */
4838 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_AUD_CALDATA, value, len);
4839 if (err >= 0) {
4840 str_parms_del(parms, AUDIO_PARAMETER_KEY_AUD_CALDATA);
4841 dlen = strlen(value);
4842 if(dlen <= 0) {
4843 ALOGE("[%s] null data received",__func__);
4844 goto done_key_audcal;
4845 }
4846 dptr = (uint8_t*) calloc(dlen, sizeof(uint8_t));
4847 if(dptr == NULL) {
4848 ALOGE("[%s] memory allocation failed for %d",__func__, dlen);
4849 goto done_key_audcal;
4850 }
4851 dlen = b64decode(value, strlen(value), dptr);
4852 if(dlen<=0) {
4853 ALOGE("[%s] data decoding failed %d", __func__, dlen);
4854 goto done_key_audcal;
4855 }
4856
4857 if(cal.dev_id) {
4858 if(audio_is_input_device(cal.dev_id)) {
4859 cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
4860 } else {
4861 out.devices = cal.dev_id;
4862 out.sample_rate = cal.sampling_rate;
4863 cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
4864 }
4865 }
4866 cal.acdb_dev_id = platform_get_snd_device_acdb_id(cal.snd_dev_id);
4867 ALOGD("Setting audio calibration for snd_device(%d) acdb_id(%d)",
4868 cal.snd_dev_id, cal.acdb_dev_id);
4869 if(cal.acdb_dev_id == -EINVAL) {
4870 ALOGE("[%s] Invalid acdb_device id %d for snd device id %d",
4871 __func__, cal.acdb_dev_id, cal.snd_dev_id);
4872 goto done_key_audcal;
4873 }
4874 if(my_data->acdb_set_audio_cal) {
4875 ret = my_data->acdb_set_audio_cal((void *)&cal, (void*)dptr, dlen);
4876 }
4877 }
4878done_key_audcal:
4879 if(dptr != NULL)
4880 free(dptr);
4881}
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304882int platform_set_parameters(void *platform, struct str_parms *parms)
4883{
4884 struct platform_data *my_data = (struct platform_data *)platform;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304885 char value[256] = {0};
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05304886 int len;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304887 int ret = 0, err;
Karthik Reddy Kattabfe193d2014-08-14 17:58:18 +05304888 char *kv_pairs = NULL;
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05304889 struct listnode *node;
4890 struct meta_key_list *key_info;
4891 int key = 0;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304892
Karthik Reddy Kattabfe193d2014-08-14 17:58:18 +05304893 kv_pairs = str_parms_to_str(parms);
Preetam Singh Ranawat7156bd82016-09-07 18:29:33 +05304894 if(!kv_pairs)
4895 return ret;
Venkata Narendra Kumar Gutta7c131ef2015-11-17 14:15:57 +05304896 len = strlen(kv_pairs);
Karthik Reddy Kattabfe193d2014-08-14 17:58:18 +05304897 ALOGV("%s: enter: - %s", __func__, kv_pairs);
4898 free(kv_pairs);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304899
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304900 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_SLOWTALK, value, sizeof(value));
4901 if (err >= 0) {
4902 bool state = false;
4903 if (!strncmp("true", value, sizeof("true"))) {
4904 state = true;
4905 }
4906
4907 str_parms_del(parms, AUDIO_PARAMETER_KEY_SLOWTALK);
4908 ret = platform_set_slowtalk(my_data, state);
4909 if (ret)
4910 ALOGE("%s: Failed to set slow talk err: %d", __func__, ret);
4911 }
4912
Avinash Vaishd5fa4572014-09-15 14:41:14 +05304913 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_HD_VOICE, value, sizeof(value));
4914 if (err >= 0) {
4915 bool state = false;
4916 if (!strncmp("true", value, sizeof("true"))) {
4917 state = true;
4918 }
4919
4920 str_parms_del(parms, AUDIO_PARAMETER_KEY_HD_VOICE);
4921 if (my_data->hd_voice != state) {
4922 ret = set_hd_voice(my_data, state);
4923 if (ret)
4924 ALOGE("%s: Failed to set HD voice err: %d", __func__, ret);
4925 } else {
4926 ALOGV("%s: HD Voice already set to %d", __func__, state);
4927 }
4928 }
4929
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05304930 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_VOLUME_BOOST,
4931 value, sizeof(value));
4932 if (err >= 0) {
4933 str_parms_del(parms, AUDIO_PARAMETER_KEY_VOLUME_BOOST);
4934
4935 if (my_data->acdb_reload_vocvoltable == NULL) {
4936 ALOGE("%s: acdb_reload_vocvoltable is NULL", __func__);
4937 } else if (!strcmp(value, "on")) {
4938 if (!my_data->acdb_reload_vocvoltable(VOICE_FEATURE_SET_VOLUME_BOOST)) {
4939 my_data->voice_feature_set = 1;
4940 }
4941 } else {
4942 if (!my_data->acdb_reload_vocvoltable(VOICE_FEATURE_SET_DEFAULT)) {
4943 my_data->voice_feature_set = 0;
4944 }
4945 }
4946 }
4947
Karthik Reddy Katta8513f432016-04-12 14:29:27 +05304948 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB,
4949 value, sizeof(value));
4950 if (err >= 0) {
4951 str_parms_del(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB);
4952
Dhanalakshmi Siddani21be3ac2016-12-29 14:31:08 +05304953 if (my_data->acdb_reload_v2) {
4954 my_data->acdb_reload_v2(value, my_data->snd_card_name,
4955 my_data->cvd_version, &my_data->acdb_meta_key_list);
4956 } else if (my_data->acdb_reload) {
4957 node = list_head(&my_data->acdb_meta_key_list);
4958 key_info = node_to_item(node, struct meta_key_list, list);
4959 key = key_info->cal_info.nKey;
4960 my_data->acdb_reload(value, my_data->snd_card_name,
4961 my_data->cvd_version, key);
4962 }
Karthik Reddy Katta8513f432016-04-12 14:29:27 +05304963 }
4964
Rohit kumard3c3b912016-11-15 18:50:31 +05304965 if (hw_info_is_stereo_spkr(my_data->hw_info)) {
4966 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER, value, len);
4967 if (err >= 0) {
4968 if (!strncmp("left", value, sizeof("left")))
4969 my_data->mono_speaker = SPKR_1;
4970 else if (!strncmp("right", value, sizeof("right")))
4971 my_data->mono_speaker = SPKR_2;
Rohit kumarf4120402016-08-05 19:19:48 +05304972
Rohit kumard3c3b912016-11-15 18:50:31 +05304973 str_parms_del(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER);
4974 }
Rohit kumarf4120402016-08-05 19:19:48 +05304975 }
4976
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05304977#ifdef RECORD_PLAY_CONCURRENCY
4978 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC, value, sizeof(value));
4979 if (err >= 0) {
4980 if (!strncmp("true", value, sizeof("true"))) {
4981 ALOGD("setting record playback concurrency to true");
4982 my_data->rec_play_conc_set = true;
4983 } else {
4984 ALOGD("setting record playback concurrency to false");
4985 my_data->rec_play_conc_set = false;
4986 }
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05304987 }
4988#endif
Chaithanya Krishna Bacharaju9955b162016-05-25 16:25:53 +05304989
4990 err = str_parms_get_str(parms, PLATFORM_MAX_MIC_COUNT,
4991 value, sizeof(value));
4992 if (err >= 0) {
4993 str_parms_del(parms, PLATFORM_MAX_MIC_COUNT);
4994 my_data->max_mic_count = atoi(value);
4995 ALOGV("%s: max_mic_count %d", __func__, my_data->max_mic_count);
4996 }
4997
Preetam Singh Ranawatb5271e02017-03-15 17:27:55 +05304998 /* handle audio calibration parameters */
4999 set_audiocal(platform, parms, value, len);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305000 native_audio_set_params(platform, parms, value, sizeof(value));
Venkata Narendra Kumar Gutta7c131ef2015-11-17 14:15:57 +05305001 audio_extn_spkr_prot_set_parameters(parms, value, len);
Satya Krishna Pindiprolif5eddfd2016-12-28 11:29:08 +05305002 audio_extn_usb_set_sidetone_gain(parms, value, len);
Naresh Tanniru351ffc72017-04-24 17:13:07 +05305003 audio_extn_hfp_set_parameters(my_data->adev, parms);
Ashish Jainf1eaa582016-05-23 20:54:24 +05305004 true_32_bit_set_params(parms, value, len);
Garmond Leunge2433c32017-09-28 21:51:22 -07005005 audio_extn_ffv_set_parameters(my_data->adev, parms);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305006 ALOGV("%s: exit with code(%d)", __func__, ret);
5007 return ret;
5008}
5009
5010int platform_set_incall_recording_session_id(void *platform,
5011 uint32_t session_id, int rec_mode)
5012{
5013 int ret = 0;
5014 struct platform_data *my_data = (struct platform_data *)platform;
5015 struct audio_device *adev = my_data->adev;
5016 struct mixer_ctl *ctl;
5017 const char *mixer_ctl_name = "Voc VSID";
5018 int num_ctl_values;
5019 int i;
5020
5021 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
5022 if (!ctl) {
5023 ALOGE("%s: Could not get ctl for mixer cmd - %s",
5024 __func__, mixer_ctl_name);
5025 ret = -EINVAL;
5026 } else {
5027 num_ctl_values = mixer_ctl_get_num_values(ctl);
5028 for (i = 0; i < num_ctl_values; i++) {
5029 if (mixer_ctl_set_value(ctl, i, session_id)) {
5030 ALOGV("Error: invalid session_id: %x", session_id);
5031 ret = -EINVAL;
5032 break;
5033 }
5034 }
5035 }
5036
5037 if (my_data->csd != NULL) {
5038 ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode);
5039 if (ret < 0) {
5040 ALOGE("%s: csd_client_start_record failed, error %d",
5041 __func__, ret);
5042 }
5043 }
5044
5045 return ret;
5046}
5047
5048int platform_stop_incall_recording_usecase(void *platform)
5049{
5050 int ret = 0;
5051 struct platform_data *my_data = (struct platform_data *)platform;
5052
5053 if (my_data->csd != NULL) {
5054 ret = my_data->csd->stop_record(ALL_SESSION_VSID);
5055 if (ret < 0) {
5056 ALOGE("%s: csd_client_stop_record failed, error %d",
5057 __func__, ret);
5058 }
5059 }
5060
5061 return ret;
5062}
5063
5064int platform_start_incall_music_usecase(void *platform)
5065{
5066 int ret = 0;
5067 struct platform_data *my_data = (struct platform_data *)platform;
5068
5069 if (my_data->csd != NULL) {
5070 ret = my_data->csd->start_playback(ALL_SESSION_VSID);
5071 if (ret < 0) {
5072 ALOGE("%s: csd_client_start_playback failed, error %d",
5073 __func__, ret);
5074 }
5075 }
5076
5077 return ret;
5078}
5079
5080int platform_stop_incall_music_usecase(void *platform)
5081{
5082 int ret = 0;
5083 struct platform_data *my_data = (struct platform_data *)platform;
5084
5085 if (my_data->csd != NULL) {
5086 ret = my_data->csd->stop_playback(ALL_SESSION_VSID);
5087 if (ret < 0) {
5088 ALOGE("%s: csd_client_stop_playback failed, error %d",
5089 __func__, ret);
5090 }
5091 }
5092
5093 return ret;
5094}
5095
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -07005096int platform_update_lch(void *platform, struct voice_session *session,
5097 enum voice_lch_mode lch_mode)
5098{
5099 int ret = 0;
5100 struct platform_data *my_data = (struct platform_data *)platform;
5101
5102 if ((my_data->csd != NULL) && (my_data->csd->set_lch != NULL))
5103 ret = my_data->csd->set_lch(session->vsid, lch_mode);
5104 else
5105 ret = pcm_ioctl(session->pcm_tx, SNDRV_VOICE_IOCTL_LCH, &lch_mode);
5106
5107 return ret;
5108}
5109
Preetam Singh Ranawatb5271e02017-03-15 17:27:55 +05305110static void get_audiocal(void *platform, void *keys, void *pReply) {
5111 struct platform_data *my_data = (struct platform_data *)platform;
5112 struct stream_out out;
5113 struct str_parms *query = (struct str_parms *)keys;
5114 struct str_parms *reply=(struct str_parms *)pReply;
5115 acdb_audio_cal_cfg_t cal;
5116 uint8_t *dptr = NULL;
5117 char value[512] = {0};
5118 char *rparms=NULL;
5119 int ret=0, err;
5120 uint32_t param_len;
5121
5122 if(query==NULL || platform==NULL || reply==NULL) {
5123 ALOGE("[%s] received null pointer",__func__);
5124 ret=-EINVAL;
5125 goto done;
5126 }
5127 /* parse audiocal configuration keys */
5128 ret = parse_audiocal_cfg(query, &cal);
5129 if(ret == 0) {
5130 /* No calibration keys found */
5131 goto done;
5132 }
5133 err = str_parms_get_str(query, AUDIO_PARAMETER_KEY_AUD_CALDATA, value, sizeof(value));
5134 if (err >= 0) {
5135 str_parms_del(query, AUDIO_PARAMETER_KEY_AUD_CALDATA);
5136 } else {
5137 goto done;
5138 }
5139
5140 if(cal.dev_id & AUDIO_DEVICE_BIT_IN) {
5141 cal.snd_dev_id = platform_get_input_snd_device(platform, cal.dev_id);
5142 } else if(cal.dev_id) {
5143 out.devices = cal.dev_id;
5144 out.sample_rate = cal.sampling_rate;
5145 cal.snd_dev_id = platform_get_output_snd_device(platform, &out);
5146 }
5147 cal.acdb_dev_id = platform_get_snd_device_acdb_id(cal.snd_dev_id);
5148 if (cal.acdb_dev_id < 0) {
5149 ALOGE("%s: Failed. Could not find acdb id for snd device(%d)",
5150 __func__, cal.snd_dev_id);
5151 ret = -EINVAL;
5152 goto done_key_audcal;
5153 }
5154 ALOGD("[%s] Getting audio calibration for snd_device(%d) acdb_id(%d)",
5155 __func__, cal.snd_dev_id, cal.acdb_dev_id);
5156
5157 param_len = MAX_SET_CAL_BYTE_SIZE;
5158 dptr = (uint8_t*)calloc(param_len, sizeof(uint8_t));
5159 if(dptr == NULL) {
5160 ALOGE("[%s] Memory allocation failed for length %d",__func__,param_len);
5161 ret = -ENOMEM;
5162 goto done_key_audcal;
5163 }
5164 if (my_data->acdb_get_audio_cal != NULL) {
5165 ret = my_data->acdb_get_audio_cal((void*)&cal, (void*)dptr, &param_len);
5166 if (ret == 0) {
5167 if(param_len == 0 || param_len == MAX_SET_CAL_BYTE_SIZE) {
5168 ret = -EINVAL;
5169 goto done_key_audcal;
5170 }
5171 /* Allocate memory for encoding */
5172 rparms = (char*)calloc((param_len*2), sizeof(char));
5173 if(rparms == NULL) {
5174 ALOGE("[%s] Memory allocation failed for size %d",
5175 __func__, param_len*2);
5176 ret = -ENOMEM;
5177 goto done_key_audcal;
5178 }
5179 if(cal.persist==0 && cal.module_id && cal.param_id) {
5180 err = b64encode(dptr+12, param_len-12, rparms);
5181 } else {
5182 err = b64encode(dptr, param_len, rparms);
5183 }
5184 if(err < 0) {
5185 ALOGE("[%s] failed to convert data to string", __func__);
5186 ret = -EINVAL;
5187 goto done_key_audcal;
5188 }
5189 str_parms_add_int(reply, AUDIO_PARAMETER_KEY_AUD_CALRESULT, ret);
5190 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_AUD_CALDATA, rparms);
5191 }
5192 }
5193done_key_audcal:
5194 if(ret != 0) {
5195 str_parms_add_int(reply, AUDIO_PARAMETER_KEY_AUD_CALRESULT, ret);
5196 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_AUD_CALDATA, "");
5197 }
5198done:
5199 if(dptr != NULL)
5200 free(dptr);
5201 if(rparms != NULL)
5202 free(rparms);
5203}
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305204void platform_get_parameters(void *platform,
5205 struct str_parms *query,
5206 struct str_parms *reply)
5207{
5208 struct platform_data *my_data = (struct platform_data *)platform;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305209 char value[512] = {0};
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305210 int ret;
Karthik Reddy Kattabfe193d2014-08-14 17:58:18 +05305211 char *kv_pairs = NULL;
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305212 char propValue[PROPERTY_VALUE_MAX]={0};
5213 bool prop_playback_enabled = false;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305214
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305215 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_SLOWTALK,
5216 value, sizeof(value));
5217 if (ret >= 0) {
5218 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_SLOWTALK,
5219 my_data->slowtalk?"true":"false");
5220 }
5221
Avinash Vaishd5fa4572014-09-15 14:41:14 +05305222 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_HD_VOICE,
5223 value, sizeof(value));
5224 if (ret >= 0) {
5225 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_HD_VOICE,
5226 my_data->hd_voice?"true":"false");
5227 }
5228
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305229 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_VOLUME_BOOST,
5230 value, sizeof(value));
5231 if (ret >= 0) {
5232 if (my_data->voice_feature_set == VOICE_FEATURE_SET_VOLUME_BOOST) {
5233 strlcpy(value, "on", sizeof(value));
5234 } else {
5235 strlcpy(value, "off", sizeof(value));
5236 }
5237
5238 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_VOLUME_BOOST, value);
5239 }
Preetam Singh Ranawatb5271e02017-03-15 17:27:55 +05305240 /* Handle audio calibration keys */
5241 get_audiocal(platform, query, reply);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305242 native_audio_get_params(query, reply, value, sizeof(value));
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305243
Sidipotu Ashokf490be52015-10-20 10:41:34 +05305244 ret = str_parms_get_str(query, AUDIO_PARAMETER_IS_HW_DECODER_SESSION_AVAILABLE,
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305245 value, sizeof(value));
5246 if (ret >= 0) {
5247 int isallowed = 1; /*true*/
5248
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07005249 if (property_get("vendor.voice.playback.conc.disabled", propValue, NULL)) {
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305250 prop_playback_enabled = atoi(propValue) ||
5251 !strncmp("true", propValue, 4);
5252 }
5253
Dhanalakshmi Siddania15c6792016-08-10 15:33:53 +05305254 if ((prop_playback_enabled && (voice_is_in_call(my_data->adev))) ||
Dhananjay Kumare6293dd2017-05-25 17:25:30 +05305255 (CARD_STATUS_OFFLINE == my_data->adev->card_status)) {
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305256 char *decoder_mime_type = value;
5257
5258 //check if unsupported mime type or not
5259 if(decoder_mime_type) {
Alexy Josephb1379942016-01-29 15:49:38 -08005260 unsigned int i = 0;
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305261 for (i = 0; i < sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]); i++) {
5262 if (!strncmp(decoder_mime_type, dsp_only_decoders_mime[i],
5263 strlen(dsp_only_decoders_mime[i]))) {
5264 ALOGD("Rejecting request for DSP only session from HAL during voice call/SSR state");
5265 isallowed = 0;
5266 break;
5267 }
5268 }
5269 }
5270 }
Sidipotu Ashokf490be52015-10-20 10:41:34 +05305271 str_parms_add_int(reply, AUDIO_PARAMETER_IS_HW_DECODER_SESSION_AVAILABLE, isallowed);
Sidipotu Ashok42483b62015-09-08 10:21:44 +05305272 }
5273
5274
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305275 /* Handle audio calibration keys */
Karthik Reddy Kattabfe193d2014-08-14 17:58:18 +05305276 kv_pairs = str_parms_to_str(reply);
5277 ALOGV("%s: exit: returns - %s", __func__, kv_pairs);
5278 free(kv_pairs);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305279}
5280
Lakshman Chaluvaraju22ba9f12016-09-12 11:42:10 +05305281unsigned char* platform_get_license(void *platform __unused, int *size __unused)
5282{
5283 ALOGE("%s: Not implemented", __func__);
5284 return NULL;
5285}
5286
5287
Ashish Jain5106d362016-05-11 19:23:33 +05305288/* Delay in Us, only to be used for PCM formats */
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305289int64_t platform_render_latency(audio_usecase_t usecase)
5290{
5291 switch (usecase) {
5292 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
5293 return DEEP_BUFFER_PLATFORM_DELAY;
5294 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
5295 return LOW_LATENCY_PLATFORM_DELAY;
Ashish Jain5106d362016-05-11 19:23:33 +05305296 case USECASE_AUDIO_PLAYBACK_OFFLOAD:
5297 case USECASE_AUDIO_PLAYBACK_OFFLOAD2:
5298 return PCM_OFFLOAD_PLATFORM_DELAY;
Haynes Mathew George5beddd42016-06-27 18:33:40 -07005299 case USECASE_AUDIO_PLAYBACK_ULL:
5300 return ULL_PLATFORM_DELAY;
Haynes Mathew George16081042017-05-31 17:16:49 -07005301 case USECASE_AUDIO_PLAYBACK_MMAP:
5302 return MMAP_PLATFORM_DELAY;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305303 default:
5304 return 0;
5305 }
5306}
5307
5308int platform_update_usecase_from_source(int source, int usecase)
5309{
5310 ALOGV("%s: input source :%d", __func__, source);
Mingming Yin12125e82015-10-26 20:40:36 -07005311 if (source == AUDIO_SOURCE_FM_TUNER)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305312 usecase = USECASE_AUDIO_RECORD_FM_VIRTUAL;
5313 return usecase;
5314}
5315
Dhananjay Kumar45b71742014-05-29 21:47:27 +05305316bool platform_listen_device_needs_event(snd_device_t snd_device)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305317{
Dhananjay Kumar45b71742014-05-29 21:47:27 +05305318 bool needs_event = false;
5319
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305320 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
5321 (snd_device < SND_DEVICE_IN_END) &&
5322 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
Rohit kumarf4120402016-08-05 19:19:48 +05305323 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
5324 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
5325 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
Dhananjay Kumar45b71742014-05-29 21:47:27 +05305326 needs_event = true;
5327
5328 return needs_event;
5329}
5330
5331bool platform_listen_usecase_needs_event(audio_usecase_t uc_id)
5332{
5333 bool needs_event = false;
5334
5335 switch(uc_id){
5336 /* concurrent playback usecases needs event */
5337 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
5338 case USECASE_AUDIO_PLAYBACK_MULTI_CH:
5339 case USECASE_AUDIO_PLAYBACK_OFFLOAD:
5340 needs_event = true;
5341 break;
5342 /* concurrent playback in low latency allowed */
5343 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
5344 break;
5345 /* concurrent playback FM needs event */
5346 case USECASE_AUDIO_PLAYBACK_FM:
5347 needs_event = true;
5348 break;
5349
5350 /* concurrent capture usecases, no event, capture handled by device
5351 * USECASE_AUDIO_RECORD:
5352 * USECASE_AUDIO_RECORD_COMPRESS:
5353 * USECASE_AUDIO_RECORD_LOW_LATENCY:
5354
5355 * USECASE_VOICE_CALL:
5356 * USECASE_VOICE2_CALL:
5357 * USECASE_VOLTE_CALL:
5358 * USECASE_QCHAT_CALL:
5359 * USECASE_VOWLAN_CALL:
Avinash Vaish306e6072015-05-13 16:58:18 +05305360 * USECASE_VOICEMMODE1_CALL:
5361 * USECASE_VOICEMMODE2_CALL:
Dhananjay Kumar45b71742014-05-29 21:47:27 +05305362 * USECASE_COMPRESS_VOIP_CALL:
5363 * USECASE_AUDIO_RECORD_FM_VIRTUAL:
5364 * USECASE_INCALL_REC_UPLINK:
5365 * USECASE_INCALL_REC_DOWNLINK:
5366 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK:
5367 * USECASE_INCALL_REC_UPLINK_COMPRESS:
5368 * USECASE_INCALL_REC_DOWNLINK_COMPRESS:
5369 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS:
5370 * USECASE_INCALL_MUSIC_UPLINK:
5371 * USECASE_INCALL_MUSIC_UPLINK2:
5372 * USECASE_AUDIO_SPKR_CALIB_RX:
5373 * USECASE_AUDIO_SPKR_CALIB_TX:
5374 */
5375 default:
5376 ALOGV("%s:usecase_id[%d} no need to raise event.", __func__, uc_id);
5377 }
5378 return needs_event;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305379}
5380
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07005381bool platform_sound_trigger_device_needs_event(snd_device_t snd_device)
5382{
5383 bool needs_event = false;
5384
5385 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
5386 (snd_device < SND_DEVICE_IN_END) &&
5387 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
Rohit kumarf4120402016-08-05 19:19:48 +05305388 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
5389 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
5390 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07005391 needs_event = true;
5392
5393 return needs_event;
5394}
5395
5396bool platform_sound_trigger_usecase_needs_event(audio_usecase_t uc_id)
5397{
5398 bool needs_event = false;
5399
5400 switch(uc_id){
5401 /* concurrent playback usecases needs event */
5402 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
5403 case USECASE_AUDIO_PLAYBACK_MULTI_CH:
5404 case USECASE_AUDIO_PLAYBACK_OFFLOAD:
Quinn Malef15123f2017-04-27 18:58:05 -07005405 case USECASE_AUDIO_PLAYBACK_OFFLOAD2:
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07005406 needs_event = true;
5407 break;
5408 /* concurrent playback in low latency allowed */
5409 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
5410 break;
5411 /* concurrent playback FM needs event */
5412 case USECASE_AUDIO_PLAYBACK_FM:
5413 needs_event = true;
5414 break;
5415
5416 /* concurrent capture usecases, no event, capture handled by device
5417 * USECASE_AUDIO_RECORD:
5418 * USECASE_AUDIO_RECORD_COMPRESS:
5419 * USECASE_AUDIO_RECORD_LOW_LATENCY:
5420
5421 * USECASE_VOICE_CALL:
5422 * USECASE_VOICE2_CALL:
5423 * USECASE_VOLTE_CALL:
5424 * USECASE_QCHAT_CALL:
5425 * USECASE_VOWLAN_CALL:
Avinash Vaish306e6072015-05-13 16:58:18 +05305426 * USECASE_VOICEMMODE1_CALL:
5427 * USECASE_VOICEMMODE2_CALL:
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07005428 * USECASE_COMPRESS_VOIP_CALL:
5429 * USECASE_AUDIO_RECORD_FM_VIRTUAL:
5430 * USECASE_INCALL_REC_UPLINK:
5431 * USECASE_INCALL_REC_DOWNLINK:
5432 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK:
5433 * USECASE_INCALL_REC_UPLINK_COMPRESS:
5434 * USECASE_INCALL_REC_DOWNLINK_COMPRESS:
5435 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS:
5436 * USECASE_INCALL_MUSIC_UPLINK:
5437 * USECASE_INCALL_MUSIC_UPLINK2:
5438 * USECASE_AUDIO_SPKR_CALIB_RX:
5439 * USECASE_AUDIO_SPKR_CALIB_TX:
5440 */
5441 default:
5442 ALOGV("%s:usecase_id[%d] no need to raise event.", __func__, uc_id);
5443 }
5444 return needs_event;
5445}
5446
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305447/* Read offload buffer size from a property.
5448 * If value is not power of 2 round it to
5449 * power of 2.
5450 */
5451uint32_t platform_get_compress_offload_buffer_size(audio_offload_info_t* info)
5452{
5453 char value[PROPERTY_VALUE_MAX] = {0};
5454 uint32_t fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE;
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07005455 if((property_get("vendor.audio.offload.buffer.size.kb", value, "")) &&
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305456 atoi(value)) {
5457 fragment_size = atoi(value) * 1024;
5458 }
5459
vivek mehta80a44292015-08-10 12:58:10 -07005460 /* Use incoming offload buffer size if default buffer size is less */
5461 if ((info != NULL) && (fragment_size < info->offload_buffer_size)) {
5462 ALOGI("%s:: Overwriting offload buffer size default:%d new:%d", __func__,
5463 fragment_size,
5464 info->offload_buffer_size);
5465 fragment_size = info->offload_buffer_size;
5466 }
5467
Ramjee Singh21ffaa82017-07-28 17:47:01 +05305468 if (info != NULL) {
5469 if (info->is_streaming && info->has_video) {
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05305470 fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING;
5471 ALOGV("%s: offload fragment size reduced for AV streaming to %d",
5472 __func__, fragment_size);
5473 } else if (info->format == AUDIO_FORMAT_FLAC) {
5474 fragment_size = FLAC_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
5475 ALOGV("FLAC fragment size %d", fragment_size);
5476 } else if (info->format == AUDIO_FORMAT_DSD) {
5477 fragment_size = MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07005478 if((property_get("vendor.audio.native.dsd.buffer.size.kb", value, "")) &&
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05305479 atoi(value))
5480 fragment_size = atoi(value) * 1024;
5481 ALOGV("DSD fragment size %d", fragment_size);
5482 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305483 }
5484
5485 fragment_size = ALIGN( fragment_size, 1024);
5486
5487 if(fragment_size < MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE)
5488 fragment_size = MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
5489 else if(fragment_size > MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE)
5490 fragment_size = MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
5491 ALOGV("%s: fragment_size %d", __func__, fragment_size);
5492 return fragment_size;
5493}
5494
Ashish Jainb26edfb2016-08-25 00:10:11 +05305495/*
5496 * return backend_idx on which voice call is active
5497 */
5498static int platform_get_voice_call_backend(struct audio_device* adev)
5499{
5500 struct audio_usecase *uc = NULL;
5501 struct listnode *node;
5502 snd_device_t out_snd_device = SND_DEVICE_NONE;
5503
5504 int backend_idx = -1;
5505
5506 if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
5507 list_for_each(node, &adev->usecase_list) {
5508 uc = node_to_item(node, struct audio_usecase, list);
5509 if (uc && (uc->type == VOICE_CALL || uc->type == VOIP_CALL) && uc->stream.out) {
5510 out_snd_device = platform_get_output_snd_device(adev->platform, uc->stream.out);
5511 backend_idx = platform_get_backend_index(out_snd_device);
5512 break;
5513 }
5514 }
5515 }
5516 return backend_idx;
5517}
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05305518
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305519/*
5520 * configures afe with bit width and Sample Rate
5521 */
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305522static int platform_set_codec_backend_cfg(struct audio_device* adev,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305523 snd_device_t snd_device, struct audio_backend_cfg backend_cfg)
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305524{
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305525 int ret = -EINVAL;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305526 int backend_idx = DEFAULT_CODEC_BACKEND;
5527 struct platform_data *my_data = (struct platform_data *)adev->platform;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305528 unsigned int bit_width = backend_cfg.bit_width;
5529 unsigned int sample_rate = backend_cfg.sample_rate;
5530 unsigned int channels = backend_cfg.channels;
5531 audio_format_t format = backend_cfg.format;
5532 bool passthrough_enabled = backend_cfg.passthrough_enabled;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305533 struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305534
5535 backend_idx = platform_get_backend_index(snd_device);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305536
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305537 /* Override the config params if client has already set them */
5538 adev_device_cfg_ptr += backend_idx;
5539 if (adev_device_cfg_ptr->use_client_dev_cfg) {
5540 ALOGV("%s::: Updating with the config set by client "
5541 "bitwidth %d, samplerate %d, channels %d format %d",
5542 __func__, adev_device_cfg_ptr->dev_cfg_params.bit_width,
5543 adev_device_cfg_ptr->dev_cfg_params.sample_rate,
5544 adev_device_cfg_ptr->dev_cfg_params.channels,
5545 adev_device_cfg_ptr->dev_cfg_params.format);
5546
5547 bit_width = adev_device_cfg_ptr->dev_cfg_params.bit_width;
5548 sample_rate = adev_device_cfg_ptr->dev_cfg_params.sample_rate;
5549 channels = adev_device_cfg_ptr->dev_cfg_params.channels;
5550 format = adev_device_cfg_ptr->dev_cfg_params.format;
5551 }
5552
5553 ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d format %d, backend_idx %d device (%s)",
5554 __func__, bit_width, sample_rate, channels, format, backend_idx,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305555 platform_get_snd_device_name(snd_device));
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305556
Dhanalakshmi Siddanib678a802016-12-03 11:51:41 +05305557 if ((my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl) &&
5558 (bit_width != my_data->current_backend_cfg[backend_idx].bit_width)) {
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305559
Kuirong Wang0b947f72016-09-29 11:03:09 -07005560 struct mixer_ctl *ctl = NULL;
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +05305561 ctl = mixer_get_ctl_by_name(adev->mixer,
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305562 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305563 if (!ctl) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305564 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
5565 __func__,
5566 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305567 return -EINVAL;
5568 }
5569
5570 if (bit_width == 24) {
Ashish Jain5106d362016-05-11 19:23:33 +05305571 if (format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
5572 mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
5573 else
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305574 mixer_ctl_set_enum_by_string(ctl, "S24_LE");
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08005575 } else if (bit_width == 32) {
Ashish Jain058165c2016-09-28 23:18:48 +05305576 mixer_ctl_set_enum_by_string(ctl, "S32_LE");
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305577 } else {
5578 mixer_ctl_set_enum_by_string(ctl, "S16_LE");
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305579 }
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305580 my_data->current_backend_cfg[backend_idx].bit_width = bit_width;
Ashish Jain5106d362016-05-11 19:23:33 +05305581 ALOGD("%s:becf: afe: %s mixer set to %d bit for %x format", __func__,
5582 my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl,
5583 bit_width, format);
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305584 ret = 0;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305585 }
5586
5587 /*
5588 * Backend sample rate configuration follows:
5589 * 16 bit playback - 48khz for streams at any valid sample rate
5590 * 24 bit playback - 48khz for stream sample rate less than 48khz
5591 * 24 bit playback - 96khz for sample rate range of 48khz to 96khz
5592 * 24 bit playback - 192khz for sample rate range of 96khz to 192 khz
5593 * Upper limit is inclusive in the sample rate range.
5594 */
5595 // TODO: This has to be more dynamic based on policy file
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305596
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305597 if ((my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl) &&
5598 (((sample_rate != my_data->current_backend_cfg[(int)backend_idx].sample_rate) &&
Satya Krishna Pindiprolif5eddfd2016-12-28 11:29:08 +05305599 (my_data->hifi_audio ||
5600 backend_idx == USB_AUDIO_RX_BACKEND ||
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305601 backend_idx == USB_AUDIO_TX_BACKEND)) || passthrough_enabled)) {
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +05305602 /*
5603 * sample rate update is needed only for hifi audio enabled platforms
5604 */
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305605 char *rate_str = NULL;
Satya Krishna Pindiprolif5eddfd2016-12-28 11:29:08 +05305606 struct mixer_ctl *ctl = NULL;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305607
Preetam Singh Ranawat63c02ea2017-08-10 11:53:30 +05305608 if (backend_idx == USB_AUDIO_RX_BACKEND ||
5609 backend_idx == USB_AUDIO_TX_BACKEND) {
5610 switch (sample_rate) {
5611 case 32000:
5612 rate_str = "KHZ_32";
5613 break;
5614 case 8000:
5615 rate_str = "KHZ_8";
5616 break;
5617 case 11025:
5618 rate_str = "HZ_11P025";
5619 break;
5620 case 16000:
5621 rate_str = "KHZ_16";
5622 break;
5623 case 22050:
5624 rate_str = "KHZ_22P05";
5625 break;
5626 }
5627 }
5628
5629 if (rate_str == NULL) {
5630 switch (sample_rate) {
5631 case 32000:
5632 if (passthrough_enabled) {
5633 rate_str = "KHZ_32";
5634 break;
5635 }
5636 case 48000:
5637 rate_str = "KHZ_48";
5638 break;
5639 case 44100:
5640 rate_str = "KHZ_44P1";
5641 break;
5642 case 64000:
5643 case 96000:
5644 rate_str = "KHZ_96";
5645 break;
5646 case 88200:
5647 rate_str = "KHZ_88P2";
5648 break;
5649 case 176400:
5650 rate_str = "KHZ_176P4";
5651 break;
5652 case 192000:
5653 rate_str = "KHZ_192";
5654 break;
5655 case 352800:
5656 rate_str = "KHZ_352P8";
5657 break;
5658 case 384000:
5659 rate_str = "KHZ_384";
5660 break;
5661 case 144000:
5662 if (passthrough_enabled) {
5663 rate_str = "KHZ_144";
5664 break;
5665 }
5666 default:
5667 rate_str = "KHZ_48";
Satish Babu Patakokilaa395a9e2016-11-01 12:18:49 +05305668 break;
5669 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305670 }
5671
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305672 ctl = mixer_get_ctl_by_name(adev->mixer,
5673 my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305674
5675 if (!ctl) {
5676 ALOGE("%s:becf: afe: Could not get ctl to set the Sample Rate for mixer command - %s",
5677 __func__,
5678 my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305679 return -EINVAL;
5680 }
5681
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305682 ALOGD("%s:becf: afe: %s set to %s", __func__,
5683 my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl,
5684 rate_str);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305685 mixer_ctl_set_enum_by_string(ctl, rate_str);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305686 my_data->current_backend_cfg[backend_idx].sample_rate = sample_rate;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305687 ret = 0;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305688 }
Ashish Jainb26edfb2016-08-25 00:10:11 +05305689 if ((my_data->current_backend_cfg[backend_idx].channels_mixer_ctl) &&
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305690 (channels != my_data->current_backend_cfg[backend_idx].channels)) {
Satya Krishna Pindiprolif5eddfd2016-12-28 11:29:08 +05305691 struct mixer_ctl *ctl = NULL;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305692 char *channel_cnt_str = NULL;
5693
5694 switch (channels) {
5695 case 8:
5696 channel_cnt_str = "Eight"; break;
5697 case 7:
5698 channel_cnt_str = "Seven"; break;
5699 case 6:
5700 channel_cnt_str = "Six"; break;
5701 case 5:
5702 channel_cnt_str = "Five"; break;
5703 case 4:
5704 channel_cnt_str = "Four"; break;
5705 case 3:
5706 channel_cnt_str = "Three"; break;
Kuirong Wang0b947f72016-09-29 11:03:09 -07005707 case 1:
5708 channel_cnt_str = "One"; break;
5709 case 2:
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305710 default:
5711 channel_cnt_str = "Two"; break;
5712 }
5713
5714 ctl = mixer_get_ctl_by_name(adev->mixer,
5715 my_data->current_backend_cfg[backend_idx].channels_mixer_ctl);
5716 if (!ctl) {
5717 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
5718 __func__,
5719 my_data->current_backend_cfg[backend_idx].channels_mixer_ctl);
5720 return -EINVAL;
5721 }
5722 mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
5723 my_data->current_backend_cfg[backend_idx].channels = channels;
Ashish Jainb26edfb2016-08-25 00:10:11 +05305724
5725 if (backend_idx == HDMI_RX_BACKEND)
5726 platform_set_edid_channels_configuration(adev->platform, channels);
5727
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305728 ALOGD("%s:becf: afe: %s set to %s", __func__,
5729 my_data->current_backend_cfg[backend_idx].channels_mixer_ctl, channel_cnt_str);
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305730 ret = 0;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305731 }
5732
Siddartha Shaik44dd7702017-06-14 12:13:25 +05305733 bool set_ext_disp_format = false, set_mi2s_tx_data_format = false;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005734 char *ext_disp_format = NULL;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305735
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005736 if (backend_idx == HDMI_RX_BACKEND) {
5737 ext_disp_format = "HDMI RX Format";
5738 set_ext_disp_format = true;
5739 } else if (backend_idx == DISP_PORT_RX_BACKEND) {
Garmond Leungade0f6d2017-02-03 15:56:10 -08005740 ext_disp_format = "Display Port RX Format";
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005741 set_ext_disp_format = true;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05305742 } else if (backend_idx == HDMI_TX_BACKEND) {
5743 ext_disp_format = "QUAT MI2S TX Format";
5744 set_mi2s_tx_data_format = true;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005745 } else {
5746 ALOGV("%s: Format doesnt have to be set", __func__);
5747 }
5748
Siddartha Shaik44dd7702017-06-14 12:13:25 +05305749 format = format & AUDIO_FORMAT_MAIN_MASK;
5750 /* Set data format only if there is a change from PCM to compressed
5751 and vice versa */
5752 if (set_mi2s_tx_data_format && (format ^ my_data->current_backend_cfg[backend_idx].format)) {
5753 struct mixer_ctl *ctl = mixer_get_ctl_by_name(adev->mixer, ext_disp_format);
5754 if (!ctl) {
5755 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
5756 __func__, ext_disp_format);
5757 return -EINVAL;
5758 }
5759 if (format == AUDIO_FORMAT_PCM) {
5760 ALOGE("%s:MI2S data format LPCM", __func__);
5761 mixer_ctl_set_enum_by_string(ctl, "LPCM");
5762 } else {
5763 ALOGE("%s:MI2S data format Compr", __func__);
5764 mixer_ctl_set_enum_by_string(ctl, "Compr");
5765 }
5766 my_data->current_backend_cfg[backend_idx].format = format;
5767 }
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005768 if (set_ext_disp_format) {
5769 struct mixer_ctl *ctl = mixer_get_ctl_by_name(adev->mixer, ext_disp_format);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305770 if (!ctl) {
5771 ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005772 __func__, ext_disp_format);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305773 return -EINVAL;
5774 }
5775
5776 if (passthrough_enabled) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005777 ALOGD("%s:Ext display compress format", __func__);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305778 mixer_ctl_set_enum_by_string(ctl, "Compr");
5779 } else {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005780 ALOGD("%s: Ext display PCM format", __func__);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305781 mixer_ctl_set_enum_by_string(ctl, "LPCM");
5782 }
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305783 ret = 0;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305784 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305785 return ret;
5786}
5787
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305788/*
Satish Babu Patakokila5933e972017-08-24 12:22:08 +05305789 * Get the backend configuration for current snd device
5790 */
5791int platform_get_codec_backend_cfg(struct audio_device* adev,
5792 snd_device_t snd_device,
5793 struct audio_backend_cfg *backend_cfg)
5794{
5795 int backend_idx = platform_get_backend_index(snd_device);
5796 struct platform_data *my_data = (struct platform_data *)adev->platform;
5797
5798 backend_cfg->bit_width = my_data->current_backend_cfg[backend_idx].bit_width;
5799 backend_cfg->sample_rate =
5800 my_data->current_backend_cfg[backend_idx].sample_rate;
5801 backend_cfg->channels =
5802 my_data->current_backend_cfg[backend_idx].channels;
5803 backend_cfg->format =
5804 my_data->current_backend_cfg[backend_idx].format;
5805
5806 ALOGV("%s:becf: afe: bitwidth %d, samplerate %d channels %d format %d"
5807 ", backend_idx %d device (%s)", __func__, backend_cfg->bit_width,
5808 backend_cfg->sample_rate, backend_cfg->channels, backend_cfg->format,
5809 backend_idx, platform_get_snd_device_name(snd_device));
5810
5811 return 0;
5812}
5813
5814
5815/*
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305816 *Validate the selected bit_width, sample_rate and channels using the edid
5817 *of the connected sink device.
5818 */
5819static void platform_check_hdmi_backend_cfg(struct audio_device* adev,
5820 struct audio_usecase* usecase,
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005821 int backend_idx,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305822 struct audio_backend_cfg *hdmi_backend_cfg)
5823{
5824 unsigned int bit_width;
5825 unsigned int sample_rate;
Manish Dewangan37864bc2017-06-09 12:28:37 +05305826 int channels, max_supported_channels = 0;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305827 struct platform_data *my_data = (struct platform_data *)adev->platform;
5828 edid_audio_info *edid_info = (edid_audio_info *)my_data->edid_info;
5829 bool passthrough_enabled = false;
5830
5831 bit_width = hdmi_backend_cfg->bit_width;
5832 sample_rate = hdmi_backend_cfg->sample_rate;
5833 channels = hdmi_backend_cfg->channels;
5834
5835
5836 ALOGI("%s:becf: HDMI: bitwidth %d, samplerate %d, channels %d"
5837 ", usecase = %d", __func__, bit_width,
5838 sample_rate, channels, usecase->id);
5839
5840 if (audio_extn_passthru_is_enabled() && audio_extn_passthru_is_active()
5841 && (usecase->stream.out->compr_config.codec->compr_passthr != 0)) {
5842 passthrough_enabled = true;
5843 ALOGI("passthrough is enabled for this stream");
5844 }
5845
5846 // For voice calls use default configuration i.e. 16b/48K, only applicable to
5847 // default backend
5848 if (!passthrough_enabled) {
5849
5850 max_supported_channels = platform_edid_get_max_channels(my_data);
5851
5852 //Check EDID info for supported samplerate
5853 if (!edid_is_supported_sr(edid_info,sample_rate)) {
Garmond Leung2f78a672016-11-07 16:27:40 -08005854 //check to see if current BE sample rate is supported by EDID
5855 //else assign the highest sample rate supported by EDID
5856 if (edid_is_supported_sr(edid_info,my_data->current_backend_cfg[backend_idx].sample_rate))
5857 sample_rate = my_data->current_backend_cfg[backend_idx].sample_rate;
5858 else
5859 sample_rate = edid_get_highest_supported_sr(edid_info);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305860 }
5861
5862 //Check EDID info for supported bit width
5863 if (!edid_is_supported_bps(edid_info,bit_width)) {
5864 //reset to current sample rate
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07005865 bit_width = my_data->current_backend_cfg[backend_idx].bit_width;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305866 }
5867
5868 if (channels > max_supported_channels)
5869 channels = max_supported_channels;
5870
5871 } else {
Manish Dewangan37864bc2017-06-09 12:28:37 +05305872 channels = audio_extn_passthru_get_channel_count(usecase->stream.out);
5873 if (channels <= 0) {
5874 ALOGE("%s: becf: afe: HDMI backend using defalut channel %u",
5875 __func__, DEFAULT_HDMI_OUT_CHANNELS);
Ben Romberger1aaaf862017-04-06 17:49:46 -07005876 channels = DEFAULT_HDMI_OUT_CHANNELS;
Manish Dewangan37864bc2017-06-09 12:28:37 +05305877 }
Harsh Bansal026d97f2017-08-17 17:44:49 +05305878 if (((usecase->stream.out->format == AUDIO_FORMAT_E_AC3) ||
Ben Romberger1aaaf862017-04-06 17:49:46 -07005879 (usecase->stream.out->format == AUDIO_FORMAT_E_AC3_JOC) ||
Harsh Bansal026d97f2017-08-17 17:44:49 +05305880 (usecase->stream.out->format == AUDIO_FORMAT_DOLBY_TRUEHD))
5881 && (usecase->stream.out->compr_config.codec->compr_passthr == PASSTHROUGH)) {
5882 sample_rate = sample_rate * 4;
Naresh Tanniru3a406772017-05-10 13:09:05 -07005883 if (sample_rate > HDMI_PASSTHROUGH_MAX_SAMPLE_RATE)
5884 sample_rate = HDMI_PASSTHROUGH_MAX_SAMPLE_RATE;
5885 }
Ben Romberger1aaaf862017-04-06 17:49:46 -07005886
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305887 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
5888 /* We force route so that the BE format can be set to Compr */
5889 }
5890
5891 ALOGI("%s:becf: afe: HDMI backend: passthrough %d updated bit width: %d and sample rate: %d"
5892 "channels %d", __func__, passthrough_enabled , bit_width,
5893 sample_rate, channels);
5894
5895 hdmi_backend_cfg->bit_width = bit_width;
5896 hdmi_backend_cfg->sample_rate = sample_rate;
5897 hdmi_backend_cfg->channels = channels;
5898 hdmi_backend_cfg->passthrough_enabled = passthrough_enabled;
5899}
5900
5901/*
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305902 * goes through all the current usecases and picks the highest
5903 * bitwidth & samplerate
5904 */
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305905static bool platform_check_codec_backend_cfg(struct audio_device* adev,
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305906 struct audio_usecase* usecase,
5907 snd_device_t snd_device,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305908 struct audio_backend_cfg *backend_cfg)
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305909{
5910 bool backend_change = false;
5911 struct listnode *node;
5912 struct stream_out *out = NULL;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305913 char value[PROPERTY_VALUE_MAX] = {0};
5914 unsigned int bit_width;
5915 unsigned int sample_rate;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305916 unsigned int channels;
5917 bool passthrough_enabled = false;
Ashish Jain8c930292017-03-13 16:33:12 +05305918 bool voice_call_active = false;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305919 int backend_idx = DEFAULT_CODEC_BACKEND;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305920 struct platform_data *my_data = (struct platform_data *)adev->platform;
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05305921 int na_mode = platform_get_native_support();
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305922 bool channels_updated = false;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05305923 struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305924
Ashish Jainc597d102016-12-12 10:31:34 +05305925 /*BT devices backend is not configured from HAL hence skip*/
5926 if (snd_device == SND_DEVICE_OUT_BT_A2DP ||
5927 snd_device == SND_DEVICE_OUT_BT_SCO ||
Sachin Mohan Gadag2e4dcb12017-05-12 13:05:08 +05305928 snd_device == SND_DEVICE_OUT_BT_SCO_WB ||
5929 snd_device == SND_DEVICE_OUT_AFE_PROXY) {
Ashish Jainc597d102016-12-12 10:31:34 +05305930 backend_change = false;
5931 return backend_change;
5932 }
5933
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305934 backend_idx = platform_get_backend_index(snd_device);
5935
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305936 bit_width = backend_cfg->bit_width;
5937 sample_rate = backend_cfg->sample_rate;
5938 channels = backend_cfg->channels;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305939
Satya Krishna Pindiprolif5eddfd2016-12-28 11:29:08 +05305940 ALOGI("%s:becf: afe: Codec selected backend: %d current bit width: %d sample rate: %d channels: %d "
5941 "usecase %d device (%s)", __func__, backend_idx, bit_width, sample_rate, channels,
5942 usecase->id, platform_get_snd_device_name(snd_device));
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305943
Apoorv Raghuvanshi924b3022015-07-06 15:07:14 -07005944 // For voice calls use default configuration i.e. 16b/48K, only applicable to
5945 // default backend
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305946 // force routing is not required here, caller will do it anyway
Ashish Jainb26edfb2016-08-25 00:10:11 +05305947 if (backend_idx == platform_get_voice_call_backend(adev)) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305948 ALOGW("%s:becf: afe:Use default bw and sr for voice/voip calls ",
5949 __func__);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305950 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
5951 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05305952 channels = CODEC_BACKEND_DEFAULT_CHANNELS;
Ashish Jain8c930292017-03-13 16:33:12 +05305953 voice_call_active = true;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305954 } else {
5955 /*
5956 * The backend should be configured at highest bit width and/or
5957 * sample rate amongst all playback usecases.
5958 * If the selected sample rate and/or bit width differ with
5959 * current backend sample rate and/or bit width, then, we set the
5960 * backend re-configuration flag.
5961 *
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305962 * Exception: 16 bit playbacks is allowed through 16 bit/48/44.1 khz backend only
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305963 */
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305964 int i =0;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305965 list_for_each(node, &adev->usecase_list) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305966 struct audio_usecase *uc;
5967 uc = node_to_item(node, struct audio_usecase, list);
5968 struct stream_out *out = (struct stream_out*) uc->stream.out;
5969 if (uc->type == PCM_PLAYBACK && out && usecase != uc) {
Preetam Singh Ranawataa37d3f2016-08-23 12:25:23 +05305970 unsigned int out_channels = audio_channel_count_from_out_mask(out->channel_mask);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305971
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305972 ALOGD("%s:napb: (%d) - (%s)id (%d) sr %d bw "
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305973 "(%d) ch (%d) device %s", __func__, i++, use_case_table[uc->id],
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305974 uc->id, out->sample_rate,
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305975 out->bit_width, out_channels,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05305976 platform_get_snd_device_name(uc->out_snd_device));
5977
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05305978 if (platform_check_backends_match(snd_device, uc->out_snd_device)) {
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305979 if (bit_width < out->bit_width)
5980 bit_width = out->bit_width;
5981 if (sample_rate < out->sample_rate)
5982 sample_rate = out->sample_rate;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05305983 if (out->sample_rate < OUTPUT_SAMPLING_RATE_44100)
5984 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05305985 if (channels < out_channels)
5986 channels = out_channels;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05305987 }
5988 }
5989 }
5990 }
5991
Ashish Jainb26edfb2016-08-25 00:10:11 +05305992 /* Native playback is preferred for Headphone/HS device over 192Khz */
Ashish Jain8c930292017-03-13 16:33:12 +05305993 if (!voice_call_active && codec_device_supports_native_playback(usecase->devices)) {
Ashish Jainb26edfb2016-08-25 00:10:11 +05305994 if (audio_is_true_native_stream_active(adev)) {
5995 if (check_hdset_combo_device(snd_device)) {
5996 /*
5997 * In true native mode Tasha has a limitation that one port at 44.1 khz
5998 * cannot drive both spkr and hdset, to simiplify the solution lets
5999 * move the AFE to 48khzwhen a ring tone selects combo device.
6000 * or if NATIVE playback is not enabled.
6001 */
6002 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
6003 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Ashish Jain8c930292017-03-13 16:33:12 +05306004 ALOGD("%s:becf: afe: port to run at 48k if combo device or in voice call"
6005 , __func__);
Ashish Jainb26edfb2016-08-25 00:10:11 +05306006 } else {
6007 /*
6008 * in single BE mode, if native audio playback
6009 * is active then it will take priority
6010 */
6011 sample_rate = OUTPUT_SAMPLING_RATE_44100;
6012 ALOGD("%s:becf: afe: true napb active set rate to 44.1 khz",
6013 __func__);
6014 }
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05306015 } else if (na_mode != NATIVE_AUDIO_MODE_MULTIPLE_44_1) {
6016 /*
6017 * Map native sampling rates to upper limit range
6018 * if multiple of native sampling rates are not supported.
6019 * This check also indicates that this is not tavil codec
6020 * And 32bit/384kHz is only supported on tavil
6021 * Hence reset 32b/384kHz to 24b/192kHz.
6022 */
6023 switch (sample_rate) {
6024 case 44100:
6025 sample_rate = 48000;
6026 break;
6027 case 88200:
6028 sample_rate = 96000;
6029 break;
6030 case 176400:
6031 case 352800:
6032 case 384000:
6033 sample_rate = 192000;
6034 break;
6035 }
6036 if (bit_width > 24)
6037 bit_width = 24;
6038
6039 ALOGD("%s:becf: afe: napb not active - set non fractional rate",
Ashish Jainb26edfb2016-08-25 00:10:11 +05306040 __func__);
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05306041 }
Ashish Jain6fced6e2017-01-09 14:13:22 +05306042 }
6043
6044 /*
6045 * Check if the device is speaker or handset,assumption handset shares
6046 * backend with speaker, and these devices are restricited to 48kHz.
6047 */
6048 if (platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device)) {
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306049 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Ashish Jain058165c2016-09-28 23:18:48 +05306050
6051 if (bit_width >= 24) {
6052 bit_width = platform_get_snd_device_bit_width(SND_DEVICE_OUT_SPEAKER);
6053 ALOGD("%s:becf: afe: reset bitwidth to %d (based on supported"
6054 " value for this platform)", __func__, bit_width);
6055 }
6056
Ashish Jainb26edfb2016-08-25 00:10:11 +05306057 ALOGD("%s:becf: afe: playback on codec device not supporting native playback set "
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306058 "default Sample Rate(48k)", __func__);
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306059 }
6060
6061 /*
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +05306062 * reset the sample rate to default value(48K), if hifi audio is not supported
Ashish Jainb449be32015-07-19 05:39:23 -07006063 */
Ashish Jainb26edfb2016-08-25 00:10:11 +05306064 if (!my_data->hifi_audio && (usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND)) {
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306065 ALOGD("%s:becf: afe: only 48KHZ sample rate is supported "
6066 "Configure afe to default Sample Rate(48k)", __func__);
Venkata Narendra Kumar Gutta4bd09d02016-01-29 15:31:04 +05306067 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306068 }
Ashish Jainb449be32015-07-19 05:39:23 -07006069
Ashish Jain797a4722017-03-15 10:21:12 +05306070 if ((backend_idx == HDMI_RX_BACKEND) || (backend_idx == DISP_PORT_RX_BACKEND)) {
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306071 struct audio_backend_cfg hdmi_backend_cfg;
6072 hdmi_backend_cfg.bit_width = bit_width;
6073 hdmi_backend_cfg.sample_rate = sample_rate;
6074 hdmi_backend_cfg.channels = channels;
6075 hdmi_backend_cfg.passthrough_enabled = false;
6076
Ashish Jain058165c2016-09-28 23:18:48 +05306077 /*HDMI does not support 384Khz/32bit playback hence configure BE to 24b/192Khz*/
6078 /* TODO: Instead have the validation against edid return the next best match*/
6079 if (bit_width > 24)
6080 hdmi_backend_cfg.bit_width = 24;
6081 if (sample_rate > 192000)
6082 hdmi_backend_cfg.sample_rate = 192000;
6083
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006084 platform_check_hdmi_backend_cfg(adev, usecase, backend_idx, &hdmi_backend_cfg);
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306085
6086 bit_width = hdmi_backend_cfg.bit_width;
6087 sample_rate = hdmi_backend_cfg.sample_rate;
6088 channels = hdmi_backend_cfg.channels;
6089 passthrough_enabled = hdmi_backend_cfg.passthrough_enabled;
6090
6091 if (channels != my_data->current_backend_cfg[backend_idx].channels)
6092 channels_updated = true;
Mingming Yinddd610b2016-01-20 17:09:32 -08006093 }
6094
Manish Dewangan837dc462015-05-27 10:17:41 +05306095 //check if mulitchannel clip needs to be down sampled to 48k
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07006096 property_get("vendor.audio.playback.mch.downsample",value,"");
Manish Dewangan837dc462015-05-27 10:17:41 +05306097 if (!strncmp("true", value, sizeof("true"))) {
6098 out = usecase->stream.out;
6099 if ((popcount(out->channel_mask) > 2) &&
6100 (out->sample_rate > CODEC_BACKEND_DEFAULT_SAMPLE_RATE) &&
6101 !(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH)) {
6102 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
6103 /* update out sample rate to reflect current backend sample rate */
6104 out->sample_rate = sample_rate;
6105 ALOGD("%s: MCH session defaulting sample rate to %d",
6106 __func__, sample_rate);
6107 }
6108 }
6109
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08006110 if (backend_idx == USB_AUDIO_RX_BACKEND) {
Kuirong Wange9894162016-08-26 15:16:39 -07006111 audio_extn_usb_is_config_supported(&bit_width, &sample_rate, &channels, true);
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08006112 ALOGV("%s: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
6113 __func__, bit_width, sample_rate, channels);
Ashish Jainb26edfb2016-08-25 00:10:11 +05306114 if (channels != my_data->current_backend_cfg[backend_idx].channels)
6115 channels_updated = true;
Kuirong Wanga9f7cee2016-03-07 11:21:52 -08006116 }
6117
Satya Krishna Pindiprolif5eddfd2016-12-28 11:29:08 +05306118 ALOGI("%s:becf: afe: Codec selected backend: %d updated bit width: %d "
6119 "sample rate: %d channels: %d", __func__, backend_idx,
6120 bit_width, sample_rate, channels);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306121 // Force routing if the expected bitwdith or samplerate
6122 // is not same as current backend comfiguration
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05306123 if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306124 (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
6125 passthrough_enabled || channels_updated) {
6126 backend_cfg->bit_width = bit_width;
6127 backend_cfg->sample_rate = sample_rate;
6128 backend_cfg->channels = channels;
6129 backend_cfg->passthrough_enabled = passthrough_enabled;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306130 backend_change = true;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306131 ALOGI("%s:becf: afe: Codec backend needs to be updated. new bit width: %d"
6132 " new sample rate: %d new channels %d",__func__,
6133 backend_cfg->bit_width, backend_cfg->sample_rate, backend_cfg->channels);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306134 }
6135
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05306136 // Force routing if the client sends config params for this backend
6137 adev_device_cfg_ptr += backend_idx;
6138 if (adev_device_cfg_ptr->use_client_dev_cfg) {
6139 ALOGV("%s: Codec backend needs to be updated as Client provided "
6140 "config params", __func__);
6141 backend_change = true;
6142 }
6143
Preetam Singh Ranawatdc1a3952016-11-24 17:35:51 +05306144 if (snd_device == SND_DEVICE_OUT_HEADPHONES || snd_device ==
6145 SND_DEVICE_OUT_HEADPHONES_44_1) {
6146 if (sample_rate > 48000 ||
6147 (bit_width >= 24 && (sample_rate == 48000 || sample_rate == 44100))) {
6148 ALOGV("%s: apply HPH HQ mode\n", __func__);
6149 audio_route_apply_and_update_path(adev->audio_route, "hph-highquality-mode");
6150 } else {
6151 ALOGV("%s: apply HPH LP mode\n", __func__);
6152 audio_route_apply_and_update_path(adev->audio_route, "hph-lowpower-mode");
6153 }
6154 }
6155
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306156 return backend_change;
6157}
6158
Apoorv Raghuvanshi21492162015-02-19 18:19:36 -08006159bool platform_check_and_set_codec_backend_cfg(struct audio_device* adev,
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05306160 struct audio_usecase *usecase, snd_device_t snd_device)
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306161{
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05306162 int backend_idx = DEFAULT_CODEC_BACKEND;
Siena Richard7c2db772016-12-21 11:32:34 -08006163 int new_snd_devices[SND_DEVICE_OUT_END] = {0};
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306164 int i, num_devices = 1;
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306165 struct audio_backend_cfg backend_cfg;
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306166 bool ret = false;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306167
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05306168 backend_idx = platform_get_backend_index(snd_device);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306169
Siddartha Shaik31b530e2017-05-19 15:26:33 +05306170 if (usecase->type == TRANSCODE_LOOPBACK) {
6171 backend_cfg.bit_width = usecase->stream.inout->out_config.bit_width;
6172 backend_cfg.sample_rate = usecase->stream.inout->out_config.sample_rate;
6173 backend_cfg.format = usecase->stream.inout->out_config.format;
6174 backend_cfg.channels = audio_channel_count_from_out_mask(
6175 usecase->stream.inout->out_config.channel_mask);
6176 } else {
6177 backend_cfg.bit_width = usecase->stream.out->bit_width;
6178 backend_cfg.sample_rate = usecase->stream.out->sample_rate;
6179 backend_cfg.format = usecase->stream.out->format;
6180 backend_cfg.channels = audio_channel_count_from_out_mask(usecase->stream.out->channel_mask);
6181 }
Xiaojun Sang785b5da2017-08-03 15:52:29 +08006182 /* enforce AFE bitwidth mode via backend_cfg */
6183 if (audio_extn_is_dsp_bit_width_enforce_mode_supported(usecase->stream.out->flags) &&
6184 (adev->dsp_bit_width_enforce_mode > backend_cfg.bit_width))
6185 backend_cfg.bit_width = adev->dsp_bit_width_enforce_mode;
Siddartha Shaik31b530e2017-05-19 15:26:33 +05306186
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306187 /*this is populated by check_codec_backend_cfg hence set default value to false*/
6188 backend_cfg.passthrough_enabled = false;
Preetam Singh Ranawatc61f8672015-06-18 23:20:28 +05306189
Preetam Singh Ranawat3e5b9e72016-11-10 16:12:25 +05306190 /* Set Backend sampling rate to 176.4 for DSD64 and
6191 * 352.8Khz for DSD128.
6192 * Set Bit Width to 16
6193 */
6194 if ((backend_idx == DSD_NATIVE_BACKEND) && (backend_cfg.format == AUDIO_FORMAT_DSD)) {
6195 backend_cfg.bit_width = 16;
6196 if (backend_cfg.sample_rate == INPUT_SAMPLING_RATE_DSD64)
6197 backend_cfg.sample_rate = OUTPUT_SAMPLING_RATE_DSD64;
6198 else if (backend_cfg.sample_rate == INPUT_SAMPLING_RATE_DSD128)
6199 backend_cfg.sample_rate = OUTPUT_SAMPLING_RATE_DSD128;
6200 }
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306201 ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
6202 ", backend_idx %d usecase = %d device (%s)", __func__, backend_cfg.bit_width,
6203 backend_cfg.sample_rate, backend_cfg.channels, backend_idx, usecase->id,
Sidipotu Ashoke6f78cb2015-11-05 14:42:20 +05306204 platform_get_snd_device_name(snd_device));
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306205
Haynes Mathew Georgebfe8ff42016-09-22 17:38:16 -07006206 if (platform_split_snd_device(adev->platform, snd_device,
6207 &num_devices, new_snd_devices) < 0)
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306208 new_snd_devices[0] = snd_device;
6209
6210 for (i = 0; i < num_devices; i++) {
6211 ALOGI("%s: becf: new_snd_devices[%d] is %s", __func__, i,
6212 platform_get_snd_device_name(new_snd_devices[i]));
6213 if (platform_check_codec_backend_cfg(adev, usecase, new_snd_devices[i],
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306214 &backend_cfg)) {
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05306215 ret = platform_set_codec_backend_cfg(adev, new_snd_devices[i],
Ashish Jaind84fd6a2016-07-27 12:33:25 +05306216 backend_cfg);
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05306217 if (!ret) {
6218 ret = true;
6219 } else {
6220 ret = false;
6221 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306222 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306223 }
6224
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306225 return ret;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306226}
6227
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306228/*
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306229 * goes through all the current usecases and picks the highest
6230 * bitwidth & samplerate
6231 */
Kuirong Wange9894162016-08-26 15:16:39 -07006232static bool platform_check_capture_codec_backend_cfg(struct audio_device* adev,
6233 int backend_idx,
6234 struct audio_backend_cfg *backend_cfg)
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306235{
6236 bool backend_change = false;
6237 unsigned int bit_width;
6238 unsigned int sample_rate;
Kuirong Wange9894162016-08-26 15:16:39 -07006239 unsigned int channels;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306240 unsigned int format;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306241 struct platform_data *my_data = (struct platform_data *)adev->platform;
6242
Kuirong Wange9894162016-08-26 15:16:39 -07006243 bit_width = backend_cfg->bit_width;
6244 sample_rate = backend_cfg->sample_rate;
6245 channels = backend_cfg->channels;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306246 format = backend_cfg->format;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306247
6248 ALOGI("%s:txbecf: afe: Codec selected backend: %d current bit width: %d and "
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306249 "sample rate: %d, channels %d format %d",__func__,backend_idx, bit_width,
6250 sample_rate, channels,format);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306251
6252 // For voice calls use default configuration i.e. 16b/48K, only applicable to
6253 // default backend
6254 // force routing is not required here, caller will do it anyway
6255 if ((voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) ||
6256 (!is_external_codec)) {
6257 ALOGW("%s:txbecf: afe:Use default bw and sr for voice/voip calls",
6258 __func__);
6259 bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
6260 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
Dhananjay Kumar9983c372016-12-09 22:00:40 +05306261 channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
6262 } else {
6263 struct listnode *node;
6264 struct audio_usecase *uc = NULL;
6265 unsigned int uc_channels = 0;
6266 struct stream_in *in = NULL;
6267 /* update cfg against other existing capture usecases on same backend */
6268 list_for_each(node, &adev->usecase_list) {
6269 uc = node_to_item(node, struct audio_usecase, list);
Satya Krishna Pindiproli9f566672017-02-28 11:14:01 +05306270 in = (struct stream_in *) uc->stream.in;
6271 if (in != NULL && uc->type == PCM_CAPTURE &&
Dhananjay Kumar9983c372016-12-09 22:00:40 +05306272 backend_idx == platform_get_backend_index(uc->in_snd_device)) {
Dhananjay Kumar9983c372016-12-09 22:00:40 +05306273 uc_channels = audio_channel_count_from_in_mask(in->channel_mask);
6274
6275 ALOGV("%s:txbecf: uc %s, id %d, sr %d, bw %d, ch %d, device %s",
6276 __func__, use_case_table[uc->id], uc->id, in->sample_rate,
6277 in->bit_width, uc_channels,
6278 platform_get_snd_device_name(uc->in_snd_device));
6279
6280 if (sample_rate < in->sample_rate)
6281 sample_rate = in->sample_rate;
6282 if (bit_width < in->bit_width)
6283 bit_width = in->bit_width;
6284 if (channels < uc_channels)
6285 channels = uc_channels;
6286 }
6287 }
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306288 }
Kuirong Wange9894162016-08-26 15:16:39 -07006289 if (backend_idx == USB_AUDIO_TX_BACKEND) {
6290 audio_extn_usb_is_config_supported(&bit_width, &sample_rate, &channels, false);
6291 ALOGV("%s: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
6292 __func__, bit_width, sample_rate, channels);
6293 }
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306294
6295 ALOGI("%s:txbecf: afe: Codec selected backend: %d updated bit width: %d and "
6296 "sample rate: %d", __func__, backend_idx, bit_width, sample_rate);
6297 // Force routing if the expected bitwdith or samplerate
6298 // is not same as current backend comfiguration
Kuirong Wang0b947f72016-09-29 11:03:09 -07006299 if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
6300 (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306301 (channels != my_data->current_backend_cfg[backend_idx].channels) ||
6302 ((format & AUDIO_FORMAT_MAIN_MASK) != my_data->current_backend_cfg[backend_idx].format)) {
Kuirong Wange9894162016-08-26 15:16:39 -07006303 backend_cfg->bit_width = bit_width;
6304 backend_cfg->sample_rate= sample_rate;
Kuirong Wang0b947f72016-09-29 11:03:09 -07006305 backend_cfg->channels = channels;
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306306 backend_cfg->format = format & AUDIO_FORMAT_MAIN_MASK;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306307 backend_change = true;
6308 ALOGI("%s:txbecf: afe: Codec backend needs to be updated. new bit width: %d "
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306309 "new sample rate: %d new channel: %d new format: %d",
Kuirong Wang0b947f72016-09-29 11:03:09 -07006310 __func__, backend_cfg->bit_width,
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306311 backend_cfg->sample_rate, backend_cfg->channels, backend_cfg->format);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306312 }
6313
6314 return backend_change;
6315}
6316
6317bool platform_check_and_set_capture_codec_backend_cfg(struct audio_device* adev,
6318 struct audio_usecase *usecase, snd_device_t snd_device)
6319{
Kuirong Wang0b947f72016-09-29 11:03:09 -07006320 int backend_idx = platform_get_backend_index(snd_device);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306321 int ret = 0;
Kuirong Wange9894162016-08-26 15:16:39 -07006322 struct audio_backend_cfg backend_cfg;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306323
Kuirong Wange9894162016-08-26 15:16:39 -07006324 backend_cfg.passthrough_enabled = false;
Siddartha Shaik31b530e2017-05-19 15:26:33 +05306325
6326 if (usecase->type == TRANSCODE_LOOPBACK) {
6327 backend_cfg.bit_width = usecase->stream.inout->in_config.bit_width;
6328 backend_cfg.sample_rate = usecase->stream.inout->in_config.sample_rate;
6329 backend_cfg.format = usecase->stream.inout->in_config.format;
6330 backend_cfg.channels = audio_channel_count_from_out_mask(
6331 usecase->stream.inout->in_config.channel_mask);
6332 } else if (usecase->type == PCM_CAPTURE) {
Kuirong Wange9894162016-08-26 15:16:39 -07006333 backend_cfg.sample_rate= usecase->stream.in->sample_rate;
6334 backend_cfg.bit_width= usecase->stream.in->bit_width;
6335 backend_cfg.format= usecase->stream.in->format;
6336 backend_cfg.channels = audio_channel_count_from_in_mask(usecase->stream.in->channel_mask);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306337 } else {
Kuirong Wange9894162016-08-26 15:16:39 -07006338 backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
6339 backend_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
6340 backend_cfg.format = AUDIO_FORMAT_PCM_16_BIT;
6341 backend_cfg.channels = 1;
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306342 }
6343
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306344 ALOGI("%s:txbecf: afe: bitwidth %d, samplerate %d, channel %d format %d"
Kuirong Wange9894162016-08-26 15:16:39 -07006345 ", backend_idx %d usecase = %d device (%s)", __func__,
6346 backend_cfg.bit_width,
6347 backend_cfg.sample_rate,
6348 backend_cfg.channels,
Siddartha Shaik44dd7702017-06-14 12:13:25 +05306349 backend_cfg.format,
Kuirong Wange9894162016-08-26 15:16:39 -07006350 backend_idx, usecase->id,
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306351 platform_get_snd_device_name(snd_device));
Kuirong Wange9894162016-08-26 15:16:39 -07006352 if (platform_check_capture_codec_backend_cfg(adev, backend_idx,
6353 &backend_cfg)) {
Kuirong Wang0b947f72016-09-29 11:03:09 -07006354 ret = platform_set_codec_backend_cfg(adev, snd_device,
6355 backend_cfg);
Manish Dewanganba9fcfa2016-03-24 16:20:06 +05306356 if(!ret)
6357 return true;
6358 }
6359
6360 return false;
6361}
6362
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306363int platform_set_snd_device_backend(snd_device_t device, const char *backend_tag,
6364 const char * hw_interface)
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306365{
6366 int ret = 0;
6367
6368 if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
6369 ALOGE("%s: Invalid snd_device = %d",
6370 __func__, device);
6371 ret = -EINVAL;
6372 goto done;
6373 }
6374
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306375 ALOGD("%s: backend_tag_table[%s]: old = %s new = %s", __func__,
6376 platform_get_snd_device_name(device),
6377 backend_tag_table[device] != NULL ? backend_tag_table[device]: "null",
6378 backend_tag);
Ashish Jaind150d4c2017-02-03 18:44:34 +05306379
6380 if (backend_tag != NULL ) {
6381 if (backend_tag_table[device]) {
6382 free(backend_tag_table[device]);
6383 }
6384 backend_tag_table[device] = strdup(backend_tag);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306385 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306386
6387 if (hw_interface != NULL) {
6388 if (hw_interface_table[device])
6389 free(hw_interface_table[device]);
6390
6391 ALOGD("%s: hw_interface_table[%d] = %s", __func__, device, hw_interface);
6392 hw_interface_table[device] = strdup(hw_interface);
6393 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306394done:
6395 return ret;
6396}
6397
Naresh Tanniru6160c712017-04-17 15:43:48 +05306398const char *platform_get_snd_device_backend_interface(snd_device_t device)
6399{
6400 const char *hw_interface_name = NULL;
6401
6402 if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
6403 ALOGE("%s: Invalid snd_device = %d",
6404 __func__, device);
6405 goto done;
6406 }
6407
6408 /* Get string value of necessary backend for device */
6409 hw_interface_name = hw_interface_table[device];
6410 if (hw_interface_name == NULL)
6411 ALOGE("%s: no hw_interface set for device %d\n", __func__, device);
6412 else
6413 ALOGD("%s: hw_interface set for device %s\n", __func__, hw_interface_name);
6414done:
6415 return hw_interface_name;
6416}
6417
6418
Siena Richard7c2db772016-12-21 11:32:34 -08006419int platform_get_snd_device_backend_index(snd_device_t device)
6420{
6421 int i, be_dai_id;
6422 const char * hw_interface_name = NULL;
6423
6424 ALOGV("%s: enter with device %s\n",
6425 __func__, platform_get_snd_device_name(device));
6426
Aditya Bavanari701a6992017-03-30 19:17:16 +05306427 if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
Siena Richard7c2db772016-12-21 11:32:34 -08006428 ALOGE("%s: Invalid snd_device = %d", __func__, device);
6429 be_dai_id = -EINVAL;
6430 goto done;
6431 }
6432
6433 /* Get string value of necessary backend for device */
6434 hw_interface_name = hw_interface_table[device];
6435 if (hw_interface_name == NULL) {
6436 ALOGE("%s: no hw_interface set for device %s\n",
6437 __func__, platform_get_snd_device_name(device));
6438 be_dai_id = -EINVAL;
6439 goto done;
6440 }
6441
6442 /* Check if be dai name table was retrieved successfully */
6443 if (be_dai_name_table == NULL) {
6444 ALOGE("%s: BE DAI Name Table is not present\n", __func__);
6445 be_dai_id = -EFAULT;
6446 goto done;
6447 }
6448
6449 /* Get backend ID for device specified */
6450 for (i = 0; i < max_be_dai_names; i++) {
6451 if (strcmp(hw_interface_name, be_dai_name_table[i].be_name) == 0) {
6452 be_dai_id = be_dai_name_table[i].be_id;
6453 goto done;
6454 }
6455 }
6456 ALOGE("%s: no interface matching name %s\n", __func__, hw_interface_name);
6457 be_dai_id = -EINVAL;
6458 goto done;
6459
6460done:
6461 return be_dai_id;
6462}
6463
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306464int platform_set_usecase_pcm_id(audio_usecase_t usecase, int32_t type, int32_t pcm_id)
6465{
6466 int ret = 0;
6467 if ((usecase <= USECASE_INVALID) || (usecase >= AUDIO_USECASE_MAX)) {
6468 ALOGE("%s: invalid usecase case idx %d", __func__, usecase);
6469 ret = -EINVAL;
6470 goto done;
6471 }
6472
6473 if ((type != 0) && (type != 1)) {
6474 ALOGE("%s: invalid usecase type", __func__);
6475 ret = -EINVAL;
6476 }
Sidipotu Ashok9f0b16e2016-04-28 13:48:28 +05306477 ALOGV("%s: pcm_device_table[%d][%d] = %d", __func__, usecase, type, pcm_id);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306478 pcm_device_table[usecase][type] = pcm_id;
6479done:
6480 return ret;
6481}
6482
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07006483void platform_get_device_to_be_id_map(int **device_to_be_id, int *length)
6484{
Alexy Josephb1379942016-01-29 15:49:38 -08006485 *device_to_be_id = (int*) msm_device_to_be_id;
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07006486 *length = msm_be_id_array_len;
6487}
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306488
Varun Balaraje49253e2017-07-06 19:48:56 +05306489int platform_set_stream_pan_scale_params(void *platform,
6490 int snd_id,
6491 struct mix_matrix_params mm_params)
6492{
6493 struct platform_data *my_data = (struct platform_data *)platform;
6494 struct audio_device *adev = my_data->adev;
6495 struct mixer_ctl *ctl = NULL;
6496 char mixer_ctl_name[MIXER_PATH_MAX_LENGTH] = {0};
6497 int ret = 0;
6498 int iter_i = 0;
6499 int iter_j = 0;
6500 int length = 0;
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306501 char *pan_scale_data = NULL;
Varun Balaraje49253e2017-07-06 19:48:56 +05306502
6503 snprintf(mixer_ctl_name, sizeof(mixer_ctl_name),
6504 "Audio Stream %d Pan Scale Control", snd_id);
6505 ALOGD("%s mixer_ctl_name:%s", __func__, mixer_ctl_name);
6506
6507 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
6508 if (!ctl) {
6509 ALOGE("%s: Could not get ctl for mixer cmd - %s",
6510 __func__, mixer_ctl_name);
6511 ret = -EINVAL;
6512 goto end;
6513 }
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306514 pan_scale_data = (char *) calloc(1, sizeof(mm_params));
6515 if (!pan_scale_data) {
6516 ret = -ENOMEM;
6517 goto end;
6518 }
6519 memcpy(&pan_scale_data[length], &mm_params.num_output_channels,
6520 sizeof(mm_params.num_output_channels));
6521 length += sizeof(mm_params.num_output_channels);
6522 memcpy(&pan_scale_data[length], &mm_params.num_input_channels,
6523 sizeof(mm_params.num_input_channels));
6524 length += sizeof(mm_params.num_input_channels);
Varun Balaraje49253e2017-07-06 19:48:56 +05306525
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306526 memcpy(&pan_scale_data[length], &mm_params.has_output_channel_map,
6527 sizeof(mm_params.has_output_channel_map));
6528 length += sizeof(mm_params.has_output_channel_map);
Varun Balaraje49253e2017-07-06 19:48:56 +05306529 if (mm_params.has_output_channel_map &&
6530 mm_params.num_output_channels <= MAX_CHANNELS_SUPPORTED &&
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306531 mm_params.num_output_channels > 0) {
6532 memcpy(&pan_scale_data[length], mm_params.output_channel_map,
6533 (mm_params.num_output_channels * sizeof(mm_params.output_channel_map[0])));
6534 length += (mm_params.num_output_channels * sizeof(mm_params.output_channel_map[0]));
6535 } else {
Varun Balaraje49253e2017-07-06 19:48:56 +05306536 ret = -EINVAL;
6537 goto end;
6538 }
6539
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306540 memcpy(&pan_scale_data[length], &mm_params.has_input_channel_map,
6541 sizeof(mm_params.has_input_channel_map));
6542 length += sizeof(mm_params.has_input_channel_map);
Varun Balaraje49253e2017-07-06 19:48:56 +05306543 if (mm_params.has_input_channel_map &&
6544 mm_params.num_input_channels <= MAX_CHANNELS_SUPPORTED &&
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306545 mm_params.num_input_channels > 0) {
6546 memcpy(&pan_scale_data[length], mm_params.input_channel_map,
6547 (mm_params.num_input_channels * sizeof(mm_params.input_channel_map[0])));
6548 length += (mm_params.num_input_channels * sizeof(mm_params.input_channel_map[0]));
6549 } else {
Varun Balaraje49253e2017-07-06 19:48:56 +05306550 ret = -EINVAL;
6551 goto end;
6552 }
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306553 pan_scale_data[length] = mm_params.has_mixer_coeffs;
6554 length += sizeof(mm_params.has_mixer_coeffs);
Varun Balaraje49253e2017-07-06 19:48:56 +05306555 if (mm_params.has_mixer_coeffs)
6556 for (iter_i = 0; iter_i < mm_params.num_output_channels; iter_i++)
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306557 for (iter_j = 0; iter_j < mm_params.num_input_channels; iter_j++) {
6558 memcpy(&pan_scale_data[length],
6559 &mm_params.mixer_coeffs[iter_i][iter_j],
6560 (sizeof(mm_params.mixer_coeffs[0][0])));
6561 length += (sizeof(mm_params.mixer_coeffs[0][0]));
6562 }
Varun Balaraje49253e2017-07-06 19:48:56 +05306563
6564 ret = mixer_ctl_set_array(ctl, pan_scale_data, length);
6565end:
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306566 if (pan_scale_data)
6567 free(pan_scale_data);
Varun Balaraje49253e2017-07-06 19:48:56 +05306568 return ret;
6569}
6570
6571int platform_set_stream_downmix_params(void *platform,
6572 int snd_id,
6573 snd_device_t snd_device,
6574 struct mix_matrix_params mm_params)
6575{
6576 struct platform_data *my_data = (struct platform_data *)platform;
6577 struct audio_device *adev = my_data->adev;
6578 struct mixer_ctl *ctl;
6579 char mixer_ctl_name[MIXER_PATH_MAX_LENGTH] = {0};
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306580 char *downmix_param_data = NULL;
Varun Balaraje49253e2017-07-06 19:48:56 +05306581 int ret = 0;
6582 int iter_i = 0;
6583 int iter_j = 0;
6584 int length = 0;
6585 int be_idx = 0;
6586
Varun Balaraje49253e2017-07-06 19:48:56 +05306587 snprintf(mixer_ctl_name, sizeof(mixer_ctl_name),
6588 "Audio Device %d Downmix Control", snd_id);
6589 ALOGD("%s mixer_ctl_name:%s", __func__, mixer_ctl_name);
6590
6591 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
6592 if (!ctl) {
6593 ALOGE("%s: Could not get ctl for mixer cmd - %s",
6594 __func__, mixer_ctl_name);
6595 ret = -EINVAL;
Varun Balaraje49253e2017-07-06 19:48:56 +05306596 }
6597
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306598 downmix_param_data = (char *) calloc(1, sizeof(mm_params) + sizeof(be_idx));
6599 if (!downmix_param_data) {
6600 ret = -ENOMEM;
6601 goto end;
6602 }
Varun Balaraje49253e2017-07-06 19:48:56 +05306603 be_idx = platform_get_snd_device_backend_index(snd_device);
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306604 memcpy(&downmix_param_data[length], &be_idx, sizeof(be_idx));
6605 length += sizeof(be_idx);
6606 memcpy(&downmix_param_data[length], &mm_params.num_output_channels,
6607 sizeof(mm_params.num_output_channels));
6608 length += sizeof(mm_params.num_output_channels);
6609 memcpy(&downmix_param_data[length], &mm_params.num_input_channels,
6610 sizeof(mm_params.num_input_channels));
6611 length += sizeof(mm_params.num_input_channels);
Varun Balaraje49253e2017-07-06 19:48:56 +05306612
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306613 memcpy(&downmix_param_data[length], &mm_params.has_output_channel_map,
6614 sizeof(mm_params.has_output_channel_map));
6615 length += sizeof(mm_params.has_output_channel_map);
Varun Balaraje49253e2017-07-06 19:48:56 +05306616 if (mm_params.has_output_channel_map &&
6617 mm_params.num_output_channels <= MAX_CHANNELS_SUPPORTED &&
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306618 mm_params.num_output_channels > 0) {
6619 memcpy(&downmix_param_data[length], mm_params.output_channel_map,
6620 (mm_params.num_output_channels * sizeof(mm_params.output_channel_map[0])));
6621 length += (mm_params.num_output_channels * sizeof(mm_params.output_channel_map[0]));
6622 } else {
Varun Balaraje49253e2017-07-06 19:48:56 +05306623 ret = -EINVAL;
6624 goto end;
6625 }
6626
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306627 memcpy(&downmix_param_data[length], &mm_params.has_input_channel_map,
6628 sizeof(mm_params.has_input_channel_map));
6629 length += sizeof(mm_params.has_input_channel_map);
Varun Balaraje49253e2017-07-06 19:48:56 +05306630 if (mm_params.has_input_channel_map &&
6631 mm_params.num_input_channels <= MAX_CHANNELS_SUPPORTED &&
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306632 mm_params.num_input_channels > 0) {
6633 memcpy(&downmix_param_data[length], mm_params.input_channel_map,
6634 (mm_params.num_input_channels * sizeof(mm_params.input_channel_map[0])));
6635 length += (mm_params.num_input_channels * sizeof(mm_params.input_channel_map[0]));
6636 } else {
Varun Balaraje49253e2017-07-06 19:48:56 +05306637 ret = -EINVAL;
6638 goto end;
6639 }
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306640 memcpy(&downmix_param_data[length], &mm_params.has_mixer_coeffs,
6641 sizeof(mm_params.has_mixer_coeffs));
6642 length += sizeof(mm_params.has_mixer_coeffs);
Varun Balaraje49253e2017-07-06 19:48:56 +05306643 if (mm_params.has_mixer_coeffs)
6644 for (iter_i = 0; iter_i < mm_params.num_output_channels; iter_i++)
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306645 for (iter_j = 0; iter_j < mm_params.num_input_channels; iter_j++) {
6646 memcpy((uint32_t *) &downmix_param_data[length],
6647 &mm_params.mixer_coeffs[iter_i][iter_j],
6648 (sizeof(mm_params.mixer_coeffs[0][0])));
6649 length += (sizeof(mm_params.mixer_coeffs[0][0]));
6650 }
Varun Balaraje49253e2017-07-06 19:48:56 +05306651
6652 ret = mixer_ctl_set_array(ctl, downmix_param_data, length);
6653end:
Varun Balarajf3cc95c2017-09-13 16:36:32 +05306654 if (downmix_param_data)
6655 free(downmix_param_data);
Varun Balaraje49253e2017-07-06 19:48:56 +05306656 return ret;
6657}
6658
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306659int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel_mask,
6660 int snd_id, uint8_t *input_channel_map)
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306661{
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306662 int ret = 0, i = 0;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306663 int channels = audio_channel_count_from_out_mask(channel_mask);
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07006664
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306665 char channel_map[AUDIO_CHANNEL_COUNT_MAX];
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306666 memset(channel_map, 0, sizeof(channel_map));
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306667 if (*input_channel_map) {
6668 for (i = 0; i < channels; i++) {
6669 ALOGV("%s:: Channel Map channel_map[%d] - %d", __func__, i, *input_channel_map);
6670 channel_map[i] = *input_channel_map;
6671 input_channel_map++;
6672 }
6673 } else {
6674 /* Following are all most common standard WAV channel layouts
6675 overridden by channel mask if its allowed and different */
6676 switch (channels) {
6677 case 1:
6678 /* AUDIO_CHANNEL_OUT_MONO */
6679 channel_map[0] = PCM_CHANNEL_FC;
6680 break;
6681 case 2:
6682 /* AUDIO_CHANNEL_OUT_STEREO */
6683 channel_map[0] = PCM_CHANNEL_FL;
6684 channel_map[1] = PCM_CHANNEL_FR;
6685 break;
6686 case 3:
6687 /* AUDIO_CHANNEL_OUT_2POINT1 */
6688 channel_map[0] = PCM_CHANNEL_FL;
6689 channel_map[1] = PCM_CHANNEL_FR;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306690 channel_map[2] = PCM_CHANNEL_FC;
Naresh Tanniru29bce4e2017-04-27 17:54:30 +05306691 break;
6692 case 4:
6693 /* AUDIO_CHANNEL_OUT_QUAD_SIDE */
6694 channel_map[0] = PCM_CHANNEL_FL;
6695 channel_map[1] = PCM_CHANNEL_FR;
6696 channel_map[2] = PCM_CHANNEL_LS;
6697 channel_map[3] = PCM_CHANNEL_RS;
6698 if (channel_mask == AUDIO_CHANNEL_OUT_QUAD_BACK) {
6699 channel_map[2] = PCM_CHANNEL_LB;
6700 channel_map[3] = PCM_CHANNEL_RB;
6701 }
6702 if (channel_mask == AUDIO_CHANNEL_OUT_SURROUND) {
6703 channel_map[2] = PCM_CHANNEL_FC;
6704 channel_map[3] = PCM_CHANNEL_CS;
6705 }
6706 break;
6707 case 5:
6708 /* AUDIO_CHANNEL_OUT_PENTA */
6709 channel_map[0] = PCM_CHANNEL_FL;
6710 channel_map[1] = PCM_CHANNEL_FR;
6711 channel_map[2] = PCM_CHANNEL_FC;
6712 channel_map[3] = PCM_CHANNEL_LB;
6713 channel_map[4] = PCM_CHANNEL_RB;
6714 break;
6715 case 6:
6716 /* AUDIO_CHANNEL_OUT_5POINT1 */
6717 channel_map[0] = PCM_CHANNEL_FL;
6718 channel_map[1] = PCM_CHANNEL_FR;
6719 channel_map[2] = PCM_CHANNEL_FC;
6720 channel_map[3] = PCM_CHANNEL_LFE;
6721 channel_map[4] = PCM_CHANNEL_LB;
6722 channel_map[5] = PCM_CHANNEL_RB;
6723 if (channel_mask == AUDIO_CHANNEL_OUT_5POINT1_SIDE) {
6724 channel_map[4] = PCM_CHANNEL_LS;
6725 channel_map[5] = PCM_CHANNEL_RS;
6726 }
6727 break;
6728 case 7:
6729 /* AUDIO_CHANNEL_OUT_6POINT1 */
6730 channel_map[0] = PCM_CHANNEL_FL;
6731 channel_map[1] = PCM_CHANNEL_FR;
6732 channel_map[2] = PCM_CHANNEL_FC;
6733 channel_map[3] = PCM_CHANNEL_LFE;
6734 channel_map[4] = PCM_CHANNEL_LB;
6735 channel_map[5] = PCM_CHANNEL_RB;
6736 channel_map[6] = PCM_CHANNEL_CS;
6737 break;
6738 case 8:
6739 /* AUDIO_CHANNEL_OUT_7POINT1 */
6740 channel_map[0] = PCM_CHANNEL_FL;
6741 channel_map[1] = PCM_CHANNEL_FR;
6742 channel_map[2] = PCM_CHANNEL_FC;
6743 channel_map[3] = PCM_CHANNEL_LFE;
6744 channel_map[4] = PCM_CHANNEL_LB;
6745 channel_map[5] = PCM_CHANNEL_RB;
6746 channel_map[6] = PCM_CHANNEL_LS;
6747 channel_map[7] = PCM_CHANNEL_RS;
6748 break;
6749 default:
6750 ALOGE("unsupported channels %d for setting channel map", channels);
6751 return -1;
6752 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306753 }
6754 ret = platform_set_channel_map(platform, channels, channel_map, snd_id);
6755 return ret;
6756}
6757
Ashish Jaina052e572016-11-07 16:41:07 +05306758void platform_check_and_update_copp_sample_rate(void* platform, snd_device_t snd_device,
6759 unsigned int stream_sr, int* sample_rate)
6760{
6761 struct platform_data* my_data = (struct platform_data *)platform;
6762 int backend_idx = platform_get_backend_index(snd_device);
6763 int device_sr = my_data->current_backend_cfg[backend_idx].sample_rate;
6764 /*Check if device SR is multiple of 8K or 11.025 Khz
6765 *check if the stream SR is multiple of same base, if not set
6766 *copp sample rate equal to device sample rate.
6767 */
6768 if (!(((sample_rate_multiple(device_sr, SAMPLE_RATE_8000)) &&
6769 (sample_rate_multiple(stream_sr, SAMPLE_RATE_8000))) ||
6770 ((sample_rate_multiple(device_sr, SAMPLE_RATE_11025)) &&
6771 (sample_rate_multiple(stream_sr, SAMPLE_RATE_11025))))) {
6772 *sample_rate = device_sr;
6773 } else
6774 *sample_rate = stream_sr;
6775
Venugopal Nadipalli83134582017-09-21 22:34:50 +05306776 if (snd_device == SND_DEVICE_OUT_HDMI)
6777 *sample_rate = platform_get_supported_sampling_rate_on_hdmi(stream_sr);
6778
Ashish Jaina052e572016-11-07 16:41:07 +05306779 ALOGI("sn_device %d device sr %d stream sr %d copp sr %d", snd_device, device_sr, stream_sr
6780, *sample_rate);
6781
6782}
6783
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306784int platform_get_edid_info(void *platform)
6785{
6786 struct platform_data *my_data = (struct platform_data *)platform;
6787 struct audio_device *adev = my_data->adev;
6788 char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE];
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05306789 int ret, count;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006790 char *mix_ctl_name;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306791 struct mixer_ctl *ctl;
6792 char edid_data[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE + 1] = {0};
6793 edid_audio_info *info;
6794
6795 if (my_data->edid_valid) {
6796 /* use cached edid */
6797 return 0;
6798 }
6799
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006800 switch(my_data->ext_disp_type) {
6801 case EXT_DISPLAY_TYPE_HDMI:
6802 mix_ctl_name = "HDMI EDID";
6803 break;
6804 case EXT_DISPLAY_TYPE_DP:
6805 mix_ctl_name = "Display Port EDID";
6806 break;
6807 default:
6808 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
6809 return -EINVAL;
6810 }
6811
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306812 if (my_data->edid_info == NULL) {
6813 my_data->edid_info =
6814 (struct edid_audio_info *)calloc(1, sizeof(struct edid_audio_info));
6815 }
6816
6817 info = my_data->edid_info;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006818 ctl = mixer_get_ctl_by_name(adev->mixer, mix_ctl_name);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306819 if (!ctl) {
6820 ALOGE("%s: Could not get ctl for mixer cmd - %s",
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006821 __func__, mix_ctl_name);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306822 goto fail;
6823 }
6824
6825 mixer_ctl_update(ctl);
6826
6827 count = mixer_ctl_get_num_values(ctl);
6828
6829 /* Read SAD blocks, clamping the maximum size for safety */
6830 if (count > (int)sizeof(block))
6831 count = (int)sizeof(block);
6832
6833 ret = mixer_ctl_get_array(ctl, block, count);
6834 if (ret != 0) {
6835 ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__);
6836 goto fail;
6837 }
6838 edid_data[0] = count;
6839 memcpy(&edid_data[1], block, count);
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006840
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306841 if (!edid_get_sink_caps(info, edid_data)) {
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006842 ALOGE("%s: Failed to get extn disp sink capabilities", __func__);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306843 goto fail;
6844 }
6845 my_data->edid_valid = true;
6846 return 0;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306847fail:
6848 if (my_data->edid_info) {
6849 free(my_data->edid_info);
6850 my_data->edid_info = NULL;
6851 my_data->edid_valid = false;
6852 }
6853 ALOGE("%s: return -EINVAL", __func__);
6854 return -EINVAL;
6855}
6856
6857
6858int platform_set_channel_allocation(void *platform, int channel_alloc)
6859{
6860 struct mixer_ctl *ctl;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006861 char *mixer_ctl_name;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306862 int ret;
6863 struct platform_data *my_data = (struct platform_data *)platform;
6864 struct audio_device *adev = my_data->adev;
6865
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006866 switch(my_data->ext_disp_type) {
6867 case EXT_DISPLAY_TYPE_HDMI:
6868 mixer_ctl_name = "HDMI RX CA";
6869 break;
6870 case EXT_DISPLAY_TYPE_DP:
6871 mixer_ctl_name = "Display Port RX CA";
6872 break;
6873 default:
6874 ALOGE("%s: Invalid disp_type %d", __func__, my_data->ext_disp_type);
6875 return -EINVAL;
6876 }
6877
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306878 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
6879 if (!ctl) {
6880 ALOGE("%s: Could not get ctl for mixer cmd - %s",
6881 __func__, mixer_ctl_name);
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006882 return -EINVAL;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306883 }
6884 ALOGD(":%s channel allocation = 0x%x", __func__, channel_alloc);
6885 ret = mixer_ctl_set_value(ctl, 0, channel_alloc);
6886
6887 if (ret < 0) {
6888 ALOGE("%s: Could not set ctl, error:%d ", __func__, ret);
6889 }
6890
6891 return ret;
6892}
6893
6894int platform_set_channel_map(void *platform, int ch_count, char *ch_map, int snd_id)
6895{
6896 struct mixer_ctl *ctl;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07006897 char mixer_ctl_name[44] = {0}; // max length of name is 44 as defined
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306898 int ret;
6899 unsigned int i;
Manish Dewangan338c50a2017-09-12 15:22:03 +05306900 long set_values[FCC_8] = {0};
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306901 struct platform_data *my_data = (struct platform_data *)platform;
6902 struct audio_device *adev = my_data->adev;
6903 ALOGV("%s channel_count:%d",__func__, ch_count);
Divya Narayanan Poojary21de6aa2017-01-06 12:07:19 +05306904 if (NULL == ch_map || (ch_count < 1) || (ch_count > FCC_8)) {
6905 ALOGE("%s: Invalid channel mapping or channel count value", __func__);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306906 return -EINVAL;
6907 }
Satish Babu Patakokila624cc922015-06-17 21:21:06 +05306908
6909 /*
6910 * If snd_id is greater than 0, stream channel mapping
6911 * If snd_id is below 0, typically -1, device channel mapping
6912 */
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306913 if (snd_id >= 0) {
Satish Babu Patakokila624cc922015-06-17 21:21:06 +05306914 snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "Playback Channel Map%d", snd_id);
6915 } else {
6916 strlcpy(mixer_ctl_name, "Playback Device Channel Map", sizeof(mixer_ctl_name));
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306917 }
6918
6919 ALOGD("%s mixer_ctl_name:%s", __func__, mixer_ctl_name);
6920
6921 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
6922 if (!ctl) {
6923 ALOGE("%s: Could not get ctl for mixer cmd - %s",
6924 __func__, mixer_ctl_name);
6925 return -EINVAL;
6926 }
Divya Narayanan Poojary21de6aa2017-01-06 12:07:19 +05306927 for (i = 0; i < (unsigned int)ch_count; i++) {
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306928 set_values[i] = ch_map[i];
6929 }
6930
Manish Dewangan338c50a2017-09-12 15:22:03 +05306931 ALOGD("%s: set mapping(%ld %ld %ld %ld %ld %ld %ld %d) for channel:%d", __func__,
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306932 set_values[0], set_values[1], set_values[2], set_values[3], set_values[4],
6933 set_values[5], set_values[6], set_values[7], ch_count);
6934
Divya Narayanan Poojary21de6aa2017-01-06 12:07:19 +05306935 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306936 if (ret < 0) {
6937 ALOGE("%s: Could not set ctl, error:%d ch_count:%d",
6938 __func__, ret, ch_count);
6939 }
6940 return ret;
6941}
6942
6943unsigned char platform_map_to_edid_format(int audio_format)
6944{
6945 unsigned char format;
6946 switch (audio_format & AUDIO_FORMAT_MAIN_MASK) {
6947 case AUDIO_FORMAT_AC3:
6948 ALOGV("%s: AC3", __func__);
6949 format = AC3;
6950 break;
6951 case AUDIO_FORMAT_AAC:
6952 ALOGV("%s:AAC", __func__);
6953 format = AAC;
6954 break;
Manish Dewangana6fc5442015-08-24 20:30:31 +05306955 case AUDIO_FORMAT_AAC_ADTS:
6956 ALOGV("%s:AAC_ADTS", __func__);
6957 format = AAC;
6958 break;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306959 case AUDIO_FORMAT_E_AC3:
Satish Babu Patakokilaa395a9e2016-11-01 12:18:49 +05306960 case AUDIO_FORMAT_E_AC3_JOC:
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306961 ALOGV("%s:E_AC3", __func__);
6962 format = DOLBY_DIGITAL_PLUS;
6963 break;
Ben Romberger1aaaf862017-04-06 17:49:46 -07006964 case AUDIO_FORMAT_DOLBY_TRUEHD:
6965 ALOGV("%s:MAT", __func__);
6966 format = MAT;
6967 break;
Mingming Yin3a941d42016-02-17 18:08:05 -08006968 case AUDIO_FORMAT_DTS:
6969 ALOGV("%s:DTS", __func__);
6970 format = DTS;
6971 break;
6972 case AUDIO_FORMAT_DTS_HD:
6973 ALOGV("%s:DTS_HD", __func__);
6974 format = DTS_HD;
6975 break;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306976 case AUDIO_FORMAT_PCM_16_BIT:
Ashish Jain5106d362016-05-11 19:23:33 +05306977 case AUDIO_FORMAT_PCM_24_BIT_PACKED:
6978 case AUDIO_FORMAT_PCM_8_24_BIT:
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306979 ALOGV("%s:PCM", __func__);
Mingming Yin3a941d42016-02-17 18:08:05 -08006980 format = LPCM;
6981 break;
Naresh Tanniru928f0862017-04-07 16:44:23 -07006982 case AUDIO_FORMAT_IEC61937:
6983 ALOGV("%s:IEC61937", __func__);
6984 format = 0;
6985 break;
Mingming Yin3a941d42016-02-17 18:08:05 -08006986 default:
Mingming Yin3a941d42016-02-17 18:08:05 -08006987 format = -1;
Naresh Tanniru928f0862017-04-07 16:44:23 -07006988 ALOGE("%s:invalid format:0x%x", __func__, audio_format);
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306989 break;
6990 }
6991 return format;
6992}
6993
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05306994void platform_reset_edid_info(void *platform) {
6995
6996 ALOGV("%s:", __func__);
6997 struct platform_data *my_data = (struct platform_data *)platform;
6998 if (my_data->edid_info) {
6999 ALOGV("%s :free edid", __func__);
7000 free(my_data->edid_info);
7001 my_data->edid_info = NULL;
7002 }
7003}
7004
7005bool platform_is_edid_supported_format(void *platform, int format)
7006{
7007 struct platform_data *my_data = (struct platform_data *)platform;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307008 edid_audio_info *info = NULL;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05307009 int i, ret;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307010 unsigned char format_id = platform_map_to_edid_format(format);
7011
Naresh Tanniru928f0862017-04-07 16:44:23 -07007012 if (format == AUDIO_FORMAT_IEC61937)
7013 return true;
7014
Mingming Yin3a941d42016-02-17 18:08:05 -08007015 if (format_id <= 0) {
7016 ALOGE("%s invalid edid format mappting for :%x" ,__func__, format);
7017 return false;
7018 }
7019
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307020 ret = platform_get_edid_info(platform);
7021 info = (edid_audio_info *)my_data->edid_info;
7022 if (ret == 0 && info != NULL) {
7023 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
7024 /*
7025 * To check
7026 * is there any special for CONFIG_HDMI_PASSTHROUGH_CONVERT
7027 * & DOLBY_DIGITAL_PLUS
7028 */
7029 if (info->audio_blocks_array[i].format_id == format_id) {
Mingming Yin3a941d42016-02-17 18:08:05 -08007030 ALOGV("%s:returns true %x",
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307031 __func__, format);
7032 return true;
7033 }
7034 }
7035 }
Mingming Yin3a941d42016-02-17 18:08:05 -08007036 ALOGV("%s:returns false %x",
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307037 __func__, format);
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07007038 return false;
7039}
7040
Mingming Yin3a941d42016-02-17 18:08:05 -08007041bool platform_is_edid_supported_sample_rate(void *platform, int sample_rate)
7042{
7043 struct platform_data *my_data = (struct platform_data *)platform;
Mingming Yin3a941d42016-02-17 18:08:05 -08007044 edid_audio_info *info = NULL;
Garmond Leung2f78a672016-11-07 16:27:40 -08007045 int ret = 0;
Mingming Yin3a941d42016-02-17 18:08:05 -08007046
7047 ret = platform_get_edid_info(platform);
7048 info = (edid_audio_info *)my_data->edid_info;
7049 if (ret == 0 && info != NULL) {
Garmond Leung2f78a672016-11-07 16:27:40 -08007050 return edid_is_supported_sr(info, sample_rate);
Mingming Yin3a941d42016-02-17 18:08:05 -08007051 }
Mingming Yin3a941d42016-02-17 18:08:05 -08007052
7053 return false;
7054}
7055
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307056int platform_set_edid_channels_configuration(void *platform, int channels) {
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07007057
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307058 struct platform_data *my_data = (struct platform_data *)platform;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307059 struct audio_device *adev = my_data->adev;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307060 edid_audio_info *info = NULL;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307061 int channel_count = 2;
Satya Krishna Pindiprolif1cd92b2016-04-14 19:05:23 +05307062 int i, ret;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307063 char default_channelMap[MAX_CHANNELS_SUPPORTED] = {0};
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307064 struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params;
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07007065
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307066 ret = platform_get_edid_info(platform);
7067 info = (edid_audio_info *)my_data->edid_info;
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307068 adev_device_cfg_ptr += HDMI_RX_BACKEND;
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307069 if(ret == 0 && info != NULL) {
7070 if (channels > 2) {
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07007071
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307072 ALOGV("%s:able to get HDMI sink capabilities multi channel playback",
7073 __func__);
7074 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
7075 if (info->audio_blocks_array[i].format_id == LPCM &&
7076 info->audio_blocks_array[i].channels > channel_count &&
7077 info->audio_blocks_array[i].channels <= MAX_HDMI_CHANNEL_CNT) {
7078 channel_count = info->audio_blocks_array[i].channels;
7079 }
7080 }
7081 ALOGV("%s:channel_count:%d", __func__, channel_count);
7082 /*
7083 * Channel map is set for supported hdmi max channel count even
7084 * though the input channel count set on adm is less than or equal to
7085 * max supported channel count
7086 */
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307087 if (adev_device_cfg_ptr->use_client_dev_cfg) {
7088 platform_set_channel_map(platform, adev_device_cfg_ptr->dev_cfg_params.channels,
7089 (char *)adev_device_cfg_ptr->dev_cfg_params.channel_map, -1);
7090 } else {
7091 platform_set_channel_map(platform, channel_count, info->channel_map, -1);
7092 }
7093
7094 if (adev_device_cfg_ptr->use_client_dev_cfg) {
7095 ALOGV("%s:: Setting client selected CA %d", __func__,
7096 adev_device_cfg_ptr->dev_cfg_params.channel_allocation);
7097 platform_set_channel_allocation(platform,
7098 adev_device_cfg_ptr->dev_cfg_params.channel_allocation);
7099 } else {
7100 platform_set_channel_allocation(platform, info->channel_allocation);
7101 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307102 } else {
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307103 if (adev_device_cfg_ptr->use_client_dev_cfg) {
7104 default_channelMap[0] = adev_device_cfg_ptr->dev_cfg_params.channel_map[0];
7105 default_channelMap[1] = adev_device_cfg_ptr->dev_cfg_params.channel_map[1];
7106 } else {
7107 default_channelMap[0] = PCM_CHANNEL_FL;
7108 default_channelMap[1] = PCM_CHANNEL_FR;
7109 }
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307110 platform_set_channel_map(platform,2,default_channelMap,-1);
7111 platform_set_channel_allocation(platform,0);
7112 }
7113 }
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007114
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007115 return 0;
7116}
7117
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307118void platform_cache_edid(void * platform)
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007119{
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307120 platform_get_edid_info(platform);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007121}
7122
Siddartha Shaik44dd7702017-06-14 12:13:25 +05307123void platform_invalidate_backend_config(void * platform,snd_device_t snd_device)
7124{
7125 struct platform_data *my_data = (struct platform_data *)platform;
7126 struct audio_device *adev = my_data->adev;
7127 struct audio_backend_cfg backend_cfg;
7128 int backend_idx;
7129
7130 backend_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
7131 backend_cfg.channels = CODEC_BACKEND_DEFAULT_CHANNELS;
7132 backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
7133 backend_cfg.format = AUDIO_FORMAT_PCM_16_BIT;
7134 backend_cfg.passthrough_enabled = false;
7135
7136 backend_idx = platform_get_backend_index(snd_device);
7137 platform_set_codec_backend_cfg(adev, snd_device, backend_cfg);
7138 my_data->current_backend_cfg[backend_idx].sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
7139 my_data->current_backend_cfg[backend_idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
7140 my_data->current_backend_cfg[backend_idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
7141 my_data->current_backend_cfg[backend_idx].format = AUDIO_FORMAT_PCM_16_BIT;
7142}
7143
Mingming Yinddd610b2016-01-20 17:09:32 -08007144void platform_invalidate_hdmi_config(void * platform)
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007145{
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007146 //reset ext display EDID info
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307147 struct platform_data *my_data = (struct platform_data *)platform;
Ben Rombergere9e80ee2017-04-26 16:00:10 -07007148 struct audio_device *adev = my_data->adev;
7149 struct audio_backend_cfg backend_cfg;
7150 int backend_idx;
7151 snd_device_t snd_device;
7152
7153 backend_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
7154 backend_cfg.channels = DEFAULT_HDMI_OUT_CHANNELS;
7155 backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
7156 backend_cfg.format = 0;
7157 backend_cfg.passthrough_enabled = false;
7158
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307159 my_data->edid_valid = false;
7160 if (my_data->edid_info) {
7161 memset(my_data->edid_info, 0, sizeof(struct edid_audio_info));
7162 }
Mingming Yinddd610b2016-01-20 17:09:32 -08007163
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007164 if (my_data->ext_disp_type == EXT_DISPLAY_TYPE_HDMI) {
7165 //reset HDMI_RX_BACKEND to default values
Ben Rombergere9e80ee2017-04-26 16:00:10 -07007166 backend_idx = HDMI_RX_BACKEND;
7167 snd_device = SND_DEVICE_OUT_HDMI;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007168 } else {
7169 //reset Display port BACKEND to default values
Ben Rombergere9e80ee2017-04-26 16:00:10 -07007170 backend_idx = DISP_PORT_RX_BACKEND;
7171 snd_device = SND_DEVICE_OUT_DISPLAY_PORT;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007172 }
Ben Rombergere9e80ee2017-04-26 16:00:10 -07007173 platform_set_codec_backend_cfg(adev, snd_device, backend_cfg);
7174 my_data->current_backend_cfg[backend_idx].sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
7175 my_data->current_backend_cfg[backend_idx].channels = DEFAULT_HDMI_OUT_CHANNELS;
7176 my_data->current_backend_cfg[backend_idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
Shiv Maliyappanahallic0656402016-09-03 14:13:26 -07007177 my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07007178}
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307179
7180int platform_set_mixer_control(struct stream_out *out, const char * mixer_ctl_name,
7181 const char *mixer_val)
7182{
7183 struct audio_device *adev = out->dev;
7184 struct mixer_ctl *ctl = NULL;
7185 ALOGD("setting mixer ctl %s with value %s", mixer_ctl_name, mixer_val);
7186 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
7187 if (!ctl) {
7188 ALOGE("%s: could not get ctl for mixer cmd - %s",
7189 __func__, mixer_ctl_name);
7190 return -EINVAL;
7191 }
7192
7193 return mixer_ctl_set_enum_by_string(ctl, mixer_val);
7194}
7195
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307196int platform_set_device_params(struct stream_out *out, int param, int value)
7197{
7198 struct audio_device *adev = out->dev;
7199 struct mixer_ctl *ctl;
7200 char *mixer_ctl_name = "Device PP Params";
7201 int ret = 0;
Manish Dewangan338c50a2017-09-12 15:22:03 +05307202 long set_values[] = {0,0};
Preetam Singh Ranawat8bde2c52015-03-20 12:00:49 +05307203
7204 set_values[0] = param;
7205 set_values[1] = value;
7206
7207 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
7208 if (!ctl) {
7209 ALOGE("%s: Could not get ctl for mixer cmd - %s",
7210 __func__, mixer_ctl_name);
7211 ret = -EINVAL;
7212 goto end;
7213 }
7214
7215 ALOGV("%s: Setting device pp params param: %d, value %d mixer ctrl:%s",
7216 __func__,param, value, mixer_ctl_name);
7217 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
7218
7219end:
7220 return ret;
7221}
7222
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05307223int platform_get_subsys_image_name(char *buf)
7224{
7225 strlcpy(buf, PLATFORM_IMAGE_NAME, sizeof(PLATFORM_IMAGE_NAME));
7226 return 0;
7227}
Narsinga Rao Chellaf928a982015-03-06 14:57:35 -08007228
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307229/*
7230 * This is a lookup table to map android audio input device to audio h/w interface (backend).
7231 * The table can be extended for other input devices by adding appropriate entries.
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05307232 * The audio interface for a particular input device need to be added in
7233 * audio_platform_info.xml file.
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307234 */
7235struct audio_device_to_audio_interface audio_device_to_interface_table[] = {
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05307236 {AUDIO_DEVICE_IN_BUILTIN_MIC, ENUM_TO_STRING(AUDIO_DEVICE_IN_BUILTIN_MIC), ""},
7237 {AUDIO_DEVICE_IN_BACK_MIC, ENUM_TO_STRING(AUDIO_DEVICE_IN_BACK_MIC), ""},
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307238};
7239
7240int audio_device_to_interface_table_len =
7241 sizeof(audio_device_to_interface_table) / sizeof(audio_device_to_interface_table[0]);
7242
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307243int platform_set_audio_device_interface(const char * device_name,
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05307244 const char *intf_name,
7245 const char *codec_type)
Narsinga Rao Chellaf928a982015-03-06 14:57:35 -08007246{
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307247 int ret = 0;
7248 int i;
7249
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05307250 if (device_name == NULL || intf_name == NULL || codec_type == NULL) {
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307251 ALOGE("%s: Invalid input", __func__);
7252
7253 ret = -EINVAL;
7254 goto done;
7255 }
7256
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05307257 ALOGD("%s: Enter, device name:%s, intf name:%s, codec_type:%s", __func__,
7258 device_name, intf_name, codec_type);
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307259
7260 size_t device_name_len = strlen(device_name);
7261 for (i = 0; i < audio_device_to_interface_table_len; i++) {
7262 char* name = audio_device_to_interface_table[i].device_name;
7263 size_t name_len = strlen(name);
7264 if ((name_len == device_name_len) &&
7265 (strncmp(device_name, name, name_len) == 0)) {
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05307266 if (is_external_codec &&
7267 (strncmp(codec_type, "external", strlen(codec_type)) == 0)) {
7268 ALOGD("%s: Matched device name:%s, overwrite intf name with %s",
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307269 __func__, device_name, intf_name);
7270
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05307271 strlcpy(audio_device_to_interface_table[i].interface_name, intf_name,
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307272 sizeof(audio_device_to_interface_table[i].interface_name));
Karthik Reddy Katta508eca42015-05-11 13:43:18 +05307273 } else if (!is_external_codec &&
7274 (strncmp(codec_type, "internal", strlen(codec_type)) == 0)) {
7275 ALOGD("%s: Matched device name:%s, overwrite intf name with %s",
7276 __func__, device_name, intf_name);
7277
7278 strlcpy(audio_device_to_interface_table[i].interface_name, intf_name,
7279 sizeof(audio_device_to_interface_table[i].interface_name));
7280 } else
7281 ALOGE("Invalid codec_type specified. Ignoring this interface entry.");
Karthik Reddy Kattae4078ed2015-04-21 11:46:15 +05307282 goto done;
7283 }
7284 }
7285 ALOGE("%s: Could not find matching device name %s",
7286 __func__, device_name);
7287
7288 ret = -EINVAL;
7289
7290done:
7291 return ret;
Narsinga Rao Chellaf928a982015-03-06 14:57:35 -08007292}
Laxminath Kasam82252432015-05-29 18:37:11 +05307293
Venkata Narendra Kumar Gutta7f4817f2016-01-29 14:15:53 +05307294int platform_spkr_prot_is_wsa_analog_mode(void *adev)
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05307295{
7296 struct audio_device *adev_h = adev;
Alexy Josephb1379942016-01-29 15:49:38 -08007297 const char *snd_card_name;
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05307298
Venkata Narendra Kumar Gutta7f4817f2016-01-29 14:15:53 +05307299 /*
7300 * wsa analog mode is decided based on the sound card name
7301 */
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05307302 snd_card_name = mixer_get_name(adev_h->mixer);
7303 if ((!strcmp(snd_card_name, "msm8952-skum-snd-card")) ||
7304 (!strcmp(snd_card_name, "msm8952-snd-card")) ||
7305 (!strcmp(snd_card_name, "msm8952-snd-card-mtp")) ||
Venkata Narendra Kumar Gutta7f4817f2016-01-29 14:15:53 +05307306 (!strcmp(snd_card_name, "msm8976-skun-snd-card")) ||
7307 (!strcmp(snd_card_name, "msm8953-snd-card-mtp")))
Preetam Singh Ranawat9519e9c2015-11-18 16:05:55 +05307308 return 1;
7309 else
7310 return 0;
7311}
Preetam Singh Ranawat61716b12015-12-14 11:55:24 +05307312
Preetam Singh Ranawatbfec31e2017-05-04 11:51:50 +05307313static bool can_enable_mbdrc_on_device(snd_device_t snd_device)
7314{
7315 bool ret = false;
7316
7317 if (snd_device == SND_DEVICE_OUT_SPEAKER ||
7318 snd_device == SND_DEVICE_OUT_SPEAKER_WSA ||
7319 snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
7320 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
7321 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
7322 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
7323 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
7324 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
7325 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
7326 ret = true;
7327 }
7328 return ret;
7329}
7330
Sharad Sangleaca972a2017-01-25 12:38:22 +05307331bool platform_send_gain_dep_cal(void *platform,
7332 int level )
Preetam Singh Ranawat61716b12015-12-14 11:55:24 +05307333{
Sharad Sangleaca972a2017-01-25 12:38:22 +05307334 bool ret_val = false;
7335 struct platform_data *my_data = (struct platform_data *)platform;
7336 struct audio_device *adev = my_data->adev;
7337 int acdb_dev_id, app_type;
7338 int acdb_dev_type = MSM_SNDDEV_CAP_RX;
7339 int mode = CAL_MODE_RTAC;
7340 struct listnode *node;
7341 struct audio_usecase *usecase;
7342
7343 if (my_data->acdb_send_gain_dep_cal == NULL) {
7344 ALOGE("%s: dlsym error for acdb_send_gain_dep_cal", __func__);
7345 return ret_val;
7346 }
7347
7348 if (!voice_is_in_call(adev)) {
7349 ALOGV("%s: Not Voice call usecase, apply new cal for level %d",
7350 __func__, level);
7351
7352 // find the current active sound device
7353 list_for_each(node, &adev->usecase_list) {
7354 usecase = node_to_item(node, struct audio_usecase, list);
7355
Vikram Panduranga93f080e2017-06-07 18:16:14 -07007356 if (usecase != NULL && usecase->type == PCM_PLAYBACK) {
Preetam Singh Ranawatbfec31e2017-05-04 11:51:50 +05307357 int new_snd_device[2] = {0};
7358 int i, num_devices = 1;
Sharad Sangleaca972a2017-01-25 12:38:22 +05307359
7360 ALOGV("%s: out device is %d", __func__, usecase->out_snd_device);
7361 app_type = usecase->stream.out->app_type_cfg.app_type;
Preetam Singh Ranawatafe17c72017-05-16 13:12:34 +05307362 acdb_dev_id = acdb_device_table[usecase->out_snd_device];
Sharad Sangleaca972a2017-01-25 12:38:22 +05307363
Preetam Singh Ranawatbfec31e2017-05-04 11:51:50 +05307364 if (platform_split_snd_device(my_data, usecase->out_snd_device,
7365 &num_devices, new_snd_device) < 0)
7366 new_snd_device[0] = usecase->out_snd_device;
7367
7368 for (i = 0; i < num_devices; i++)
7369 if (can_enable_mbdrc_on_device(new_snd_device[i])) {
7370 if (audio_extn_spkr_prot_is_enabled())
7371 acdb_dev_id = platform_get_spkr_prot_acdb_id(new_snd_device[i]);
7372 else
7373 acdb_dev_id = acdb_device_table[new_snd_device[i]];
7374 }
Sharad Sangleaca972a2017-01-25 12:38:22 +05307375
7376 if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type,
7377 acdb_dev_type, mode, level)) {
7378 // set ret_val true if at least one calibration is set successfully
7379 ret_val = true;
7380 } else {
7381 ALOGE("%s: my_data->acdb_send_gain_dep_cal failed ", __func__);
7382 }
7383 } else {
7384 ALOGW("%s: Usecase list is empty", __func__);
7385 }
7386 }
7387 } else {
7388 ALOGW("%s: Voice call in progress .. ignore setting new cal",
7389 __func__);
7390 }
7391 return ret_val;
Preetam Singh Ranawat61716b12015-12-14 11:55:24 +05307392}
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007393
7394bool platform_can_enable_spkr_prot_on_device(snd_device_t snd_device)
7395{
7396 bool ret = false;
7397
7398 if (snd_device == SND_DEVICE_OUT_SPEAKER ||
Vignesh Kulothungan3b5fae52017-09-25 12:16:30 -07007399 snd_device == SND_DEVICE_OUT_SPEAKER_REVERSE ||
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007400 snd_device == SND_DEVICE_OUT_SPEAKER_WSA ||
7401 snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
7402 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
Rohit kumarf4120402016-08-05 19:19:48 +05307403 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007404 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
Rohit kumarf4120402016-08-05 19:19:48 +05307405 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
7406 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
7407 snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007408 ret = true;
7409 }
7410
7411 return ret;
7412}
7413
7414int platform_get_spkr_prot_acdb_id(snd_device_t snd_device)
7415{
7416 int acdb_id;
7417
7418 switch(snd_device) {
7419 case SND_DEVICE_OUT_SPEAKER:
7420 case SND_DEVICE_OUT_SPEAKER_WSA:
7421 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED);
7422 break;
7423 case SND_DEVICE_OUT_VOICE_SPEAKER:
7424 case SND_DEVICE_OUT_VOICE_SPEAKER_WSA:
7425 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
7426 break;
Rohit kumarf4120402016-08-05 19:19:48 +05307427 case SND_DEVICE_OUT_VOICE_SPEAKER_2:
7428 case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
7429 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
7430 break;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007431 case SND_DEVICE_OUT_SPEAKER_VBAT:
7432 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
7433 break;
7434 case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
7435 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT);
7436 break;
Rohit kumarf4120402016-08-05 19:19:48 +05307437 case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
7438 acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT);
7439 break;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007440 default:
7441 acdb_id = -EINVAL;
7442 break;
7443 }
7444 return acdb_id;
7445}
7446
7447int platform_get_spkr_prot_snd_device(snd_device_t snd_device)
7448{
7449 if (!audio_extn_spkr_prot_is_enabled())
7450 return snd_device;
7451
7452 switch(snd_device) {
7453 case SND_DEVICE_OUT_SPEAKER:
7454 case SND_DEVICE_OUT_SPEAKER_WSA:
7455 return SND_DEVICE_OUT_SPEAKER_PROTECTED;
7456 case SND_DEVICE_OUT_VOICE_SPEAKER:
7457 case SND_DEVICE_OUT_VOICE_SPEAKER_WSA:
7458 return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
Rohit kumarf4120402016-08-05 19:19:48 +05307459 case SND_DEVICE_OUT_VOICE_SPEAKER_2:
7460 case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
7461 return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007462 case SND_DEVICE_OUT_SPEAKER_VBAT:
7463 return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
7464 case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
7465 return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
Rohit kumarf4120402016-08-05 19:19:48 +05307466 case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
7467 return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
Xiaojun Sang040cc9f2015-08-03 19:38:28 +08007468 default:
7469 return snd_device;
7470 }
7471}
Kuirong Wang1cad7142016-05-24 15:21:56 -07007472
Rohit kumarf4120402016-08-05 19:19:48 +05307473int platform_get_vi_feedback_snd_device(snd_device_t snd_device)
7474{
7475 switch(snd_device) {
7476 case SND_DEVICE_OUT_SPEAKER_PROTECTED:
7477 case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
7478 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
7479 case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
7480 case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
7481 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1;
7482 case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
7483 case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
7484 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2;
7485 default:
7486 return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
7487 }
7488}
7489
Garmond Leunge2433c32017-09-28 21:51:22 -07007490int platform_get_ec_ref_loopback_snd_device(int channel_count)
7491{
7492 snd_device_t snd_device;
7493
7494 if (channel_count == 1)
7495 snd_device = SND_DEVICE_IN_EC_REF_LOOPBACK_MONO;
7496 else if (channel_count == 2)
7497 snd_device = SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO;
7498 else
7499 snd_device = SND_DEVICE_NONE;
7500
7501 return snd_device;
7502}
7503
Kuirong Wang1cad7142016-05-24 15:21:56 -07007504int platform_set_sidetone(struct audio_device *adev,
7505 snd_device_t out_snd_device,
7506 bool enable,
7507 char *str)
7508{
7509 int ret;
Ashish Jain3e37a702016-11-25 12:27:15 +05307510 if ((out_snd_device == SND_DEVICE_OUT_USB_HEADSET) ||
7511 (out_snd_device == SND_DEVICE_OUT_USB_HEADPHONES)) {
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -07007512 if (property_get_bool("vendor.audio.usb.disable.sidetone", 0)) {
Haynes Mathew Georgeb2789322016-11-22 11:55:40 -08007513 ALOGI("Debug: Disable sidetone");
7514 } else {
Kuirong Wang1cad7142016-05-24 15:21:56 -07007515 ret = audio_extn_usb_enable_sidetone(out_snd_device, enable);
Vikram Panduranga6e761cd2016-10-12 16:50:52 -07007516 if (ret) {
7517 /*fall back to AFE sidetone*/
7518 ALOGV("%s: No USB sidetone supported, switching to AFE sidetone",
7519 __func__);
7520
7521 if (enable)
7522 audio_route_apply_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
7523 else
7524 audio_route_reset_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
7525 }
7526 }
Kuirong Wang1cad7142016-05-24 15:21:56 -07007527 } else {
7528 ALOGV("%s: sidetone out device(%d) mixer cmd = %s\n",
7529 __func__, out_snd_device, str);
7530
Vikram Panduranga6e761cd2016-10-12 16:50:52 -07007531 if (enable) {
7532 ret = audio_route_apply_and_update_path(adev->audio_route, str);
7533 if (ret) {
7534 ALOGV("%s: No device sidetone supported, switching to AFE sidetone",
7535 __func__);
7536 audio_route_apply_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
7537 }
7538 } else {
7539 ret = audio_route_reset_and_update_path(adev->audio_route, str);
7540 if (ret) {
7541 ALOGV("%s: No device sidetone supported, switching to AFE sidetone",
7542 __func__);
7543 audio_route_reset_and_update_path(adev->audio_route, AFE_SIDETONE_MIXER_PATH);
7544 }
7545 }
Kuirong Wang1cad7142016-05-24 15:21:56 -07007546 }
7547 return 0;
7548}
Preetam Singh Ranawatcb6212e2016-07-19 18:33:53 +05307549
Laxminath Kasameda80032017-04-11 23:06:32 +05307550void platform_update_aanc_path(struct audio_device *adev,
7551 snd_device_t out_snd_device,
7552 bool enable,
7553 char *str)
Vidyakumar Athotaea269c62016-10-31 09:05:59 -07007554{
Laxminath Kasameda80032017-04-11 23:06:32 +05307555 ALOGD("%s: aanc out device(%d) mixer cmd = %s, enable = %d\n",
7556 __func__, out_snd_device, str, enable);
7557
7558 if (enable)
7559 audio_route_apply_and_update_path(adev->audio_route, str);
7560 else
7561 audio_route_reset_and_update_path(adev->audio_route, str);
7562
Vidyakumar Athotaea269c62016-10-31 09:05:59 -07007563 return;
7564}
7565
Weiyin Jiang82e40942017-01-10 16:07:34 +08007566static void make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
7567 int acdb_device_type, int app_type, int topology_id,
7568 int sample_rate, uint32_t module_id, uint32_t param_id, bool persist)
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007569{
Weiyin Jiang82e40942017-01-10 16:07:34 +08007570 int persist_send_flags = 1;
7571
7572 if (!cal) {
7573 return;
7574 }
7575
7576 if (persist)
7577 persist_send_flags |= 0x2;
7578
7579 memset(cal, 0, sizeof(acdb_audio_cal_cfg_t));
7580
7581 cal->persist = persist;
7582 cal->app_type = app_type;
7583 cal->acdb_dev_id = acdb_dev_id;
7584 cal->sampling_rate = sample_rate;
7585 cal->topo_id = topology_id;
7586 //if module and param id is set to 0, the whole blob will be stored
7587 //or sent to the DSP
7588 cal->module_id = module_id;
7589 cal->param_id = param_id;
7590 cal->cal_type = acdb_device_type;
7591 cal->persist = persist;
7592
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007593}
7594
Weiyin Jiang82e40942017-01-10 16:07:34 +08007595int platform_send_audio_cal(void* platform, int acdb_dev_id,
7596 int acdb_device_type, int app_type, int topology_id, int sample_rate,
7597 uint32_t module_id, uint32_t param_id, void* data, int length, bool persist)
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007598{
Weiyin Jiang82e40942017-01-10 16:07:34 +08007599 int ret = 0;
7600 struct platform_data *my_data = (struct platform_data *)platform;
7601 acdb_audio_cal_cfg_t cal;
7602 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
7603
7604 if (!my_data) {
7605 ret = -EINVAL;
7606 goto ERROR_RETURN;
7607 }
7608
7609 make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
7610 sample_rate, module_id, param_id, true);
7611
7612 if (my_data->acdb_set_audio_cal) {
7613 // persist audio cal in local cache
7614 if (persist) {
7615 ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
7616 }
7617 // send audio cal to dsp
7618 if (ret == 0) {
7619 cal.persist = false;
7620 ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
7621 if (persist && (ret != 0)) {
7622 ALOGV("[%s] audio cal stored with success, ignore set cal failure", __func__);
7623 ret = 0;
7624 }
7625 }
7626 }
7627
7628ERROR_RETURN:
7629 return ret;
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007630}
7631
Weiyin Jiang82e40942017-01-10 16:07:34 +08007632int platform_get_audio_cal(void* platform, int acdb_dev_id,
7633 int acdb_device_type, int app_type, int topology_id,
7634 int sample_rate, uint32_t module_id, uint32_t param_id,
7635 void* data, int* length, bool persist)
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007636{
Weiyin Jiang82e40942017-01-10 16:07:34 +08007637 int ret = 0;
7638 struct platform_data *my_data = (struct platform_data *)platform;
7639 acdb_audio_cal_cfg_t cal;
7640 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
7641
7642 if (!my_data) {
7643 ret = -EINVAL;
7644 goto ERROR_RETURN;
7645 }
7646
7647 make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
7648 sample_rate, module_id, param_id, false);
7649
7650 if (my_data->acdb_get_audio_cal) {
7651 // get cal from dsp
7652 ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
7653 // get cached cal if prevoius attempt fails and persist flag is set
7654 if ((ret != 0) && persist) {
7655 cal.persist = true;
7656 ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
7657 }
7658 }
7659
7660ERROR_RETURN:
7661 return ret;
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007662}
7663
Weiyin Jiang82e40942017-01-10 16:07:34 +08007664int platform_store_audio_cal(void* platform, int acdb_dev_id,
7665 int acdb_device_type, int app_type, int topology_id,
7666 int sample_rate, uint32_t module_id, uint32_t param_id,
7667 void* data, int length)
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007668{
Weiyin Jiang82e40942017-01-10 16:07:34 +08007669 int ret = 0;
7670 struct platform_data *my_data = (struct platform_data *)platform;
7671 acdb_audio_cal_cfg_t cal;
7672 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
7673
7674 if (!my_data) {
7675 ret = -EINVAL;
7676 goto ERROR_RETURN;
7677 }
7678
7679 make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
7680 sample_rate, module_id, param_id, true);
7681
7682 if (my_data->acdb_set_audio_cal) {
7683 ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
7684 }
7685
7686ERROR_RETURN:
7687 return ret;
7688}
7689
7690int platform_retrieve_audio_cal(void* platform, int acdb_dev_id,
7691 int acdb_device_type, int app_type, int topology_id,
7692 int sample_rate, uint32_t module_id, uint32_t param_id,
7693 void* data, int* length)
7694{
7695 int ret = 0;
7696 struct platform_data *my_data = (struct platform_data *)platform;
7697 acdb_audio_cal_cfg_t cal;
7698 memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
7699
7700 if (!my_data) {
7701 ret = -EINVAL;
7702 goto ERROR_RETURN;
7703 }
7704
7705 make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
7706 sample_rate, module_id, param_id, true);
7707
7708 if (my_data->acdb_get_audio_cal) {
7709 ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
7710 }
7711
7712ERROR_RETURN:
7713 return ret;
Weiyin Jiangaa80acd2016-09-21 16:42:11 +08007714}
Divya Narayanan Poojary45f19192016-09-30 18:52:13 +05307715
7716int platform_get_max_mic_count(void *platform) {
7717 struct platform_data *my_data = (struct platform_data *)platform;
7718 return my_data->max_mic_count;
7719}
Aniket Kumar Lataf56b6402016-10-27 12:03:18 -07007720
Vignesh Kulothungan3b5fae52017-09-25 12:16:30 -07007721#define DEFAULT_NOMINAL_SPEAKER_GAIN 20
7722int ramp_speaker_gain(struct audio_device *adev, bool ramp_up, int target_ramp_up_gain) {
7723 // backup_gain: gain to try to set in case of an error during ramp
7724 int start_gain, end_gain, step, backup_gain, i;
7725 bool error = false;
7726 const char *mixer_ctl_name_gain_left = "Left Speaker Gain";
7727 const char *mixer_ctl_name_gain_right = "Right Speaker Gain";
7728 struct mixer_ctl *ctl_left = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_left);
7729 struct mixer_ctl *ctl_right = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_right);
7730 if (!ctl_left || !ctl_right) {
7731 ALOGE("%s: Could not get ctl for mixer cmd - %s or %s, not applying speaker gain ramp",
7732 __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right);
7733 return -EINVAL;
7734 } else if ((mixer_ctl_get_num_values(ctl_left) != 1)
7735 || (mixer_ctl_get_num_values(ctl_right) != 1)) {
7736 ALOGE("%s: Unexpected num values for mixer cmd - %s or %s, not applying speaker gain ramp",
7737 __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right);
7738 return -EINVAL;
7739 }
7740 if (ramp_up) {
7741 start_gain = 0;
7742 end_gain = target_ramp_up_gain > 0 ? target_ramp_up_gain : DEFAULT_NOMINAL_SPEAKER_GAIN;
7743 step = +1;
7744 backup_gain = end_gain;
7745 } else {
7746 // using same gain on left and right
7747 const int left_gain = mixer_ctl_get_value(ctl_left, 0);
7748 start_gain = left_gain > 0 ? left_gain : DEFAULT_NOMINAL_SPEAKER_GAIN;
7749 end_gain = 0;
7750 step = -1;
7751 backup_gain = start_gain;
7752 }
7753 for (i = start_gain ; i != (end_gain + step) ; i += step) {
7754 if (mixer_ctl_set_value(ctl_left, 0, i)) {
7755 ALOGE("%s: error setting %s to %d during gain ramp",
7756 __func__, mixer_ctl_name_gain_left, i);
7757 error = true;
7758 break;
7759 }
7760 if (mixer_ctl_set_value(ctl_right, 0, i)) {
7761 ALOGE("%s: error setting %s to %d during gain ramp",
7762 __func__, mixer_ctl_name_gain_right, i);
7763 error = true;
7764 break;
7765 }
7766 usleep(1000);
7767 }
7768 if (error) {
7769 // an error occured during the ramp, let's still try to go back to a safe volume
7770 if (mixer_ctl_set_value(ctl_left, 0, backup_gain)) {
7771 ALOGE("%s: error restoring left gain to %d", __func__, backup_gain);
7772 }
7773 if (mixer_ctl_set_value(ctl_right, 0, backup_gain)) {
7774 ALOGE("%s: error restoring right gain to %d", __func__, backup_gain);
7775 }
7776 }
7777 return start_gain;
7778}
7779
7780int platform_set_swap_mixer(struct audio_device *adev, bool swap_channels)
7781{
7782 const char *mixer_ctl_name = "Swap channel";
7783 struct mixer_ctl *ctl;
7784 const char *mixer_path;
7785 struct platform_data *my_data = (struct platform_data *)adev->platform;
7786
7787 // forced to set to swap, but device not rotated ... ignore set
7788 if (swap_channels && !my_data->speaker_lr_swap)
7789 return 0;
7790
7791 ALOGV("%s:", __func__);
7792
7793 if (swap_channels)
7794 mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER_REVERSE);
7795 else
7796 mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER);
7797
7798 audio_route_apply_and_update_path(adev->audio_route, mixer_path);
7799
7800 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
7801 if (!ctl) {
7802 ALOGE("%s: Could not get ctl for mixer cmd - %s",__func__, mixer_ctl_name);
7803 return -EINVAL;
7804 }
7805
7806 if (mixer_ctl_set_value(ctl, 0, swap_channels) < 0) {
7807 ALOGE("%s: Could not set reverse cotrol %d",__func__, swap_channels);
7808 return -EINVAL;
7809 }
7810
7811 ALOGV("platfor_force_swap_channel :: Channel orientation ( %s ) ",
7812 swap_channels?"R --> L":"L --> R");
7813
7814 return 0;
7815}
7816
7817int platform_check_and_set_swap_lr_channels(struct audio_device *adev, bool swap_channels)
7818{
7819 // only update if there is active pcm playback on speaker
7820 struct platform_data *my_data = (struct platform_data *)adev->platform;
7821
7822 my_data->speaker_lr_swap = swap_channels;
7823
7824 return platform_set_swap_channels(adev, swap_channels);
7825}
7826
7827int platform_set_swap_channels(struct audio_device *adev, bool swap_channels)
7828{
7829 // only update if there is active pcm playback on speaker
7830 struct audio_usecase *usecase;
7831 struct listnode *node;
7832
7833 // do not swap channels in audio modes with concurrent capture and playback
7834 // as this may break the echo reference
7835 if ((adev->mode == AUDIO_MODE_IN_COMMUNICATION) || (adev->mode == AUDIO_MODE_IN_CALL)) {
7836 ALOGV("%s: will not swap due to audio mode %d", __func__, adev->mode);
7837 return 0;
7838 }
7839
7840 list_for_each(node, &adev->usecase_list) {
7841 usecase = node_to_item(node, struct audio_usecase, list);
7842 if (usecase->type == PCM_PLAYBACK &&
7843 usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) {
7844 /*
7845 * If acdb tuning is different for SPEAKER_REVERSE, it is must
7846 * to perform device switch to disable the current backend to
7847 * enable it with new acdb data.
7848 */
7849 if (acdb_device_table[SND_DEVICE_OUT_SPEAKER] !=
7850 acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE]) {
7851 const int initial_skpr_gain = ramp_speaker_gain(adev, false /*ramp_up*/, -1);
7852 select_devices(adev, usecase->id);
7853 if (initial_skpr_gain != -EINVAL)
7854 ramp_speaker_gain(adev, true /*ramp_up*/, initial_skpr_gain);
7855
7856 } else {
7857 platform_set_swap_mixer(adev, swap_channels);
7858 }
7859 break;
7860 }
7861 }
7862
7863 return 0;
7864}
7865
Aniket Kumar Lataf56b6402016-10-27 12:03:18 -07007866bool platform_add_gain_level_mapping(struct amp_db_and_gain_table *tbl_entry __unused)
7867{
7868 return false;
7869}
7870
7871int platform_get_gain_level_mapping(struct amp_db_and_gain_table *mapping_tbl __unused,
7872 int table_size __unused)
7873{
7874 return 0;
7875}
Satish Babu Patakokilac3c5d432017-07-04 22:48:59 +05307876
7877int platform_get_max_codec_backend() {
7878
7879 return MAX_CODEC_BACKENDS;
7880}
Haynes Mathew Georgeef514882017-05-01 17:46:23 -07007881
Venugopal Nadipalli83134582017-09-21 22:34:50 +05307882int platform_get_supported_sampling_rate_on_hdmi(uint32_t stream_sr)
7883{
7884 int sample_rate;
7885 switch (stream_sr){
7886 case 8000:
7887 case 11025:
7888 case 16000:
7889 case 22050:
7890 case 32000:
7891 case 48000:
7892 sample_rate = 48000;
7893 break;
7894 case 44100:
7895 sample_rate = 44100;
7896 break;
7897 case 64000:
7898 case 96000:
7899 sample_rate = 96000;
7900 break;
7901 case 88200:
7902 sample_rate = 88200;
7903 break;
7904 case 176400:
7905 sample_rate = 176400;
7906 break;
7907 case 192000:
7908 sample_rate = 192000;
7909 break;
7910 case 352800:
7911 sample_rate = 352800;
7912 break;
7913 case 384000:
7914 sample_rate = 384000;
7915 break;
7916 case 144000:
7917 default:
7918 sample_rate = 48000;
7919 break;
7920 }
7921 return sample_rate;
7922}
7923
Haynes Mathew Georgeef514882017-05-01 17:46:23 -07007924#if defined(PLATFORM_MSMFALCON)
7925int platform_get_mmap_data_fd(void *platform, int fe_dev, int dir, int *fd,
7926 uint32_t *size)
7927{
7928 struct platform_data *my_data = (struct platform_data *)platform;
7929 struct audio_device *adev = my_data->adev;
7930 int hw_fd = -1;
7931 char dev_name[128];
7932 struct snd_pcm_mmap_fd mmap_fd;
7933 memset(&mmap_fd, 0, sizeof(mmap_fd));
7934 mmap_fd.dir = dir;
7935 snprintf(dev_name, sizeof(dev_name), "/dev/snd/hwC%uD%u",
7936 adev->snd_card, HWDEP_FE_BASE+fe_dev);
7937 hw_fd = open(dev_name, O_RDONLY);
7938 if (hw_fd < 0) {
7939 ALOGE("fe hw dep node open %d/%d failed", adev->snd_card, fe_dev);
7940 return -1;
7941 }
7942 if (ioctl(hw_fd, SNDRV_PCM_IOCTL_MMAP_DATA_FD, &mmap_fd) < 0) {
7943 ALOGE("fe hw dep node ioctl failed");
7944 close(hw_fd);
7945 return -1;
7946 }
7947 *fd = mmap_fd.fd;
7948 *size = mmap_fd.size;
7949 close(hw_fd); // mmap_fd should still be valid
7950 return 0;
7951}
7952#else
7953int platform_get_mmap_data_fd(void *platform __unused, int fe_dev __unused,
7954 int dir __unused, int *fd __unused,
7955 uint32_t *size __unused)
7956{
7957 return -1;
7958}
7959#endif
`Deeraj Soman676c2702017-09-18 19:25:53 +05307960
7961static const char *platform_get_mixer_control(struct mixer_ctl *ctl)
7962{
7963 int id = -1;
7964 const char *id_string = NULL;
7965
7966 if (!ctl) {
7967 ALOGD("%s: mixer ctl not obtained", __func__);
7968 } else {
7969 id = mixer_ctl_get_value(ctl, 0);
7970 if (id >= 0) {
7971 id_string = mixer_ctl_get_enum_string(ctl, id);
7972 }
7973 }
7974
7975 return id_string;
7976}