blob: 4434ee79d14c9fa47f8e341310919a4fc1b24200 [file] [log] [blame]
Eric Laurentb23d5282013-05-14 15:27:20 -07001/*
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07002 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
3 * Not a Contribution.
4 *
Eric Laurentb23d5282013-05-14 15:27:20 -07005 * 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
20#define LOG_TAG "msm8974_platform"
21/*#define LOG_NDEBUG 0*/
22#define LOG_NDDEBUG 0
23
24#include <stdlib.h>
25#include <dlfcn.h>
26#include <cutils/log.h>
27#include <cutils/properties.h>
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -070028#include <cutils/str_parms.h>
Eric Laurentb23d5282013-05-14 15:27:20 -070029#include <audio_hw.h>
30#include <platform_api.h>
31#include "platform.h"
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -070032#include "audio_extn.h"
Narsinga Rao Chella05573b72013-11-15 15:21:40 -080033#include "voice_extn.h"
Eric Laurentb23d5282013-05-14 15:27:20 -070034
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -070035#define MIXER_XML_PATH "/system/etc/mixer_paths.xml"
Damir Didjustof1d46c72013-11-06 17:59:04 -080036#define MIXER_XML_PATH_AUXPCM "/system/etc/mixer_paths_auxpcm.xml"
Eric Laurentb23d5282013-05-14 15:27:20 -070037#define LIB_ACDB_LOADER "libacdbloader.so"
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -070038#define AUDIO_DATA_BLOCK_MIXER_CTL "HDMI EDID"
Eric Laurentb23d5282013-05-14 15:27:20 -070039
Eric Laurentb23d5282013-05-14 15:27:20 -070040/*
Eric Laurentb23d5282013-05-14 15:27:20 -070041 * This file will have a maximum of 38 bytes:
42 *
43 * 4 bytes: number of audio blocks
44 * 4 bytes: total length of Short Audio Descriptor (SAD) blocks
45 * Maximum 10 * 3 bytes: SAD blocks
46 */
47#define MAX_SAD_BLOCKS 10
48#define SAD_BLOCK_SIZE 3
49
50/* EDID format ID for LPCM audio */
51#define EDID_FORMAT_LPCM 1
52
sangwoo1b9f4b32013-06-21 18:22:55 -070053/* Retry for delay in FW loading*/
54#define RETRY_NUMBER 10
55#define RETRY_US 500000
56
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -070057#define SAMPLE_RATE_8KHZ 8000
58#define SAMPLE_RATE_16KHZ 16000
59
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -070060#define AUDIO_PARAMETER_KEY_FLUENCE_TYPE "fluence"
61#define AUDIO_PARAMETER_KEY_BTSCO "bt_samplerate"
62#define AUDIO_PARAMETER_KEY_SLOWTALK "st_enable"
sangwoo53b2cf02013-07-25 19:18:44 -070063
Eric Laurentb23d5282013-05-14 15:27:20 -070064struct audio_block_header
65{
66 int reserved;
67 int length;
68};
69
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -080070/* Audio calibration related functions */
Eric Laurentb23d5282013-05-14 15:27:20 -070071typedef void (*acdb_deallocate_t)();
72typedef int (*acdb_init_t)();
73typedef void (*acdb_send_audio_cal_t)(int, int);
74typedef void (*acdb_send_voice_cal_t)(int, int);
75
Eric Laurentb23d5282013-05-14 15:27:20 -070076struct platform_data {
77 struct audio_device *adev;
78 bool fluence_in_spkr_mode;
79 bool fluence_in_voice_call;
80 bool fluence_in_voice_rec;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -080081 bool fluence_in_audio_rec;
Mingming Yin8e5a4f62013-10-07 15:23:41 -070082 int fluence_type;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -070083 int btsco_sample_rate;
84 bool slowtalk;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -070085 /* Audio calibration related functions */
Eric Laurentb23d5282013-05-14 15:27:20 -070086 void *acdb_handle;
87 acdb_init_t acdb_init;
88 acdb_deallocate_t acdb_deallocate;
89 acdb_send_audio_cal_t acdb_send_audio_cal;
90 acdb_send_voice_cal_t acdb_send_voice_cal;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -070091
92 void *hw_info;
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -080093 struct csd_data *csd;
Eric Laurentb23d5282013-05-14 15:27:20 -070094};
95
96static const int pcm_device_table[AUDIO_USECASE_MAX][2] = {
Mingming Yin8e5a4f62013-10-07 15:23:41 -070097 [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE,
98 DEEP_BUFFER_PCM_DEVICE},
99 [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700100 LOWLATENCY_PCM_DEVICE},
101 [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE,
102 MULTIMEDIA2_PCM_DEVICE},
Krishnankutty Kolathappillya43f96e2013-11-01 12:17:53 -0700103 [USECASE_AUDIO_PLAYBACK_OFFLOAD] =
104 {PLAYBACK_OFFLOAD_DEVICE, PLAYBACK_OFFLOAD_DEVICE},
Shiv Maliyappanahallida107642013-10-17 11:16:13 -0700105 [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
Mingming Yine62d7842013-10-25 16:26:03 -0700106 [USECASE_AUDIO_RECORD_COMPRESS] = {COMPRESS_CAPTURE_DEVICE, COMPRESS_CAPTURE_DEVICE},
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700107 [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
108 LOWLATENCY_PCM_DEVICE},
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700109 [USECASE_AUDIO_RECORD_FM_VIRTUAL] = {MULTIMEDIA2_PCM_DEVICE,
110 MULTIMEDIA2_PCM_DEVICE},
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700111 [USECASE_AUDIO_PLAYBACK_FM] = {FM_PLAYBACK_PCM_DEVICE, FM_CAPTURE_PCM_DEVICE},
Vimal Puthanveed5b4d3f12013-11-05 15:57:39 -0800112 [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700113 [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE, VOICE_CALL_PCM_DEVICE},
114 [USECASE_VOICE2_CALL] = {VOICE2_CALL_PCM_DEVICE, VOICE2_CALL_PCM_DEVICE},
115 [USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE},
116 [USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE},
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800117 [USECASE_COMPRESS_VOIP_CALL] = {COMPRESS_VOIP_CALL_PCM_DEVICE, COMPRESS_VOIP_CALL_PCM_DEVICE},
Shiv Maliyappanahallida107642013-10-17 11:16:13 -0700118 [USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE,
119 AUDIO_RECORD_PCM_DEVICE},
120 [USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
121 AUDIO_RECORD_PCM_DEVICE},
122 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
123 AUDIO_RECORD_PCM_DEVICE},
Helen Zenge56b4852013-12-03 16:54:40 -0800124 [USECASE_INCALL_REC_UPLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
125 COMPRESS_CAPTURE_DEVICE},
126 [USECASE_INCALL_REC_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
127 COMPRESS_CAPTURE_DEVICE},
128 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
129 COMPRESS_CAPTURE_DEVICE},
Shiv Maliyappanahallif3b9a422013-10-22 16:38:08 -0700130 [USECASE_INCALL_MUSIC_UPLINK] = {INCALL_MUSIC_UPLINK_PCM_DEVICE,
131 INCALL_MUSIC_UPLINK_PCM_DEVICE},
132 [USECASE_INCALL_MUSIC_UPLINK2] = {INCALL_MUSIC_UPLINK2_PCM_DEVICE,
133 INCALL_MUSIC_UPLINK2_PCM_DEVICE},
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700134 [USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1},
135 [USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE},
Eric Laurentb23d5282013-05-14 15:27:20 -0700136};
137
138/* Array to store sound devices */
139static const char * const device_table[SND_DEVICE_MAX] = {
140 [SND_DEVICE_NONE] = "none",
141 /* Playback sound devices */
142 [SND_DEVICE_OUT_HANDSET] = "handset",
143 [SND_DEVICE_OUT_SPEAKER] = "speaker",
144 [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse",
145 [SND_DEVICE_OUT_HEADPHONES] = "headphones",
146 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
147 [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
148 [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
149 [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
150 [SND_DEVICE_OUT_HDMI] = "hdmi",
151 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
152 [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700153 [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
Eric Laurentb23d5282013-05-14 15:27:20 -0700154 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
155 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
156 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700157 [SND_DEVICE_OUT_AFE_PROXY] = "afe-proxy",
158 [SND_DEVICE_OUT_USB_HEADSET] = "usb-headphones",
159 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = "speaker-and-usb-headphones",
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700160 [SND_DEVICE_OUT_TRANSMISSION_FM] = "transmission-fm",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700161 [SND_DEVICE_OUT_ANC_HEADSET] = "anc-headphones",
162 [SND_DEVICE_OUT_ANC_FB_HEADSET] = "anc-fb-headphones",
163 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = "voice-anc-headphones",
164 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = "voice-anc-fb-headphones",
165 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
166 [SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700167 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
Eric Laurentb23d5282013-05-14 15:27:20 -0700168
169 /* Capture sound devices */
170 [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700171 [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800172 [SND_DEVICE_IN_HANDSET_MIC_NS] = "handset-mic",
173 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = "handset-mic",
174 [SND_DEVICE_IN_HANDSET_DMIC] = "dmic-endfire",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800175 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = "dmic-endfire",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800176 [SND_DEVICE_IN_HANDSET_DMIC_NS] = "dmic-endfire",
177 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = "dmic-endfire",
178 [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800179 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800180 [SND_DEVICE_IN_SPEAKER_MIC_NS] = "speaker-mic",
181 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = "speaker-mic",
182 [SND_DEVICE_IN_SPEAKER_DMIC] = "speaker-dmic-endfire",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800183 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = "speaker-dmic-endfire",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800184 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = "speaker-dmic-endfire",
185 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = "speaker-dmic-endfire",
186 [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic",
187 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = "headset-mic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700188 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
189 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
190 [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
191 [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700192 [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
Eric Laurentb23d5282013-05-14 15:27:20 -0700193 [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700194 [SND_DEVICE_IN_VOICE_DMIC] = "voice-dmic-ef",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700195 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = "voice-speaker-dmic-ef",
Vidyakumar Athotaadfe4e32013-12-13 14:51:26 -0800196 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = "voice-speaker-qmic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700197 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
198 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
199 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
200 [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800201 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800202 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700203 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700204 [SND_DEVICE_IN_USB_HEADSET_MIC] = "usb-headset-mic",
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700205 [SND_DEVICE_IN_CAPTURE_FM] = "capture-fm",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700206 [SND_DEVICE_IN_AANC_HANDSET_MIC] = "aanc-handset-mic",
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700207 [SND_DEVICE_IN_QUAD_MIC] = "quad-mic",
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -0700208 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
209 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700210 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
Eric Laurentb23d5282013-05-14 15:27:20 -0700211};
212
213/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
214static const int acdb_device_table[SND_DEVICE_MAX] = {
215 [SND_DEVICE_NONE] = -1,
216 [SND_DEVICE_OUT_HANDSET] = 7,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800217 [SND_DEVICE_OUT_SPEAKER] = 14,
218 [SND_DEVICE_OUT_SPEAKER_REVERSE] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700219 [SND_DEVICE_OUT_HEADPHONES] = 10,
220 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10,
221 [SND_DEVICE_OUT_VOICE_HANDSET] = 7,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800222 [SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700223 [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
224 [SND_DEVICE_OUT_HDMI] = 18,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800225 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700226 [SND_DEVICE_OUT_BT_SCO] = 22,
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700227 [SND_DEVICE_OUT_BT_SCO_WB] = 39,
Eric Laurentb23d5282013-05-14 15:27:20 -0700228 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
229 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
230 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700231 [SND_DEVICE_OUT_AFE_PROXY] = 0,
232 [SND_DEVICE_OUT_USB_HEADSET] = 0,
233 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 14,
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700234 [SND_DEVICE_OUT_TRANSMISSION_FM] = 0,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700235 [SND_DEVICE_OUT_ANC_HEADSET] = 26,
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700236 [SND_DEVICE_OUT_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700237 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = 26,
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700238 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700239 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26,
240 [SND_DEVICE_OUT_ANC_HANDSET] = 103,
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700241 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 101,
Eric Laurentb23d5282013-05-14 15:27:20 -0700242
243 [SND_DEVICE_IN_HANDSET_MIC] = 4,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800244 [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106,
245 [SND_DEVICE_IN_HANDSET_MIC_NS] = 107,
246 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = 108,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800247 [SND_DEVICE_IN_HANDSET_DMIC] = 41,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800248 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = 109,
249 [SND_DEVICE_IN_HANDSET_DMIC_NS] = 110,
250 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = 111,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800251 [SND_DEVICE_IN_SPEAKER_MIC] = 11,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800252 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 112,
253 [SND_DEVICE_IN_SPEAKER_MIC_NS] = 113,
254 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = 114,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800255 [SND_DEVICE_IN_SPEAKER_DMIC] = 43,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800256 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = 115,
257 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = 116,
258 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117,
Eric Laurentb23d5282013-05-14 15:27:20 -0700259 [SND_DEVICE_IN_HEADSET_MIC] = 8,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800260 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = 47,
Eric Laurentb23d5282013-05-14 15:27:20 -0700261 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
262 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
263 [SND_DEVICE_IN_HDMI_MIC] = 4,
264 [SND_DEVICE_IN_BT_SCO_MIC] = 21,
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700265 [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800266 [SND_DEVICE_IN_CAMCORDER_MIC] = 4,
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700267 [SND_DEVICE_IN_VOICE_DMIC] = 41,
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700268 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43,
Vidyakumar Athotaadfe4e32013-12-13 14:51:26 -0800269 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = 19,
Eric Laurentb23d5282013-05-14 15:27:20 -0700270 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
271 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
272 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800273 [SND_DEVICE_IN_VOICE_REC_MIC] = 4,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800274 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = 107,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800275 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 34,
276 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 41,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700277 [SND_DEVICE_IN_USB_HEADSET_MIC] = 44,
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700278 [SND_DEVICE_IN_CAPTURE_FM] = 0,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700279 [SND_DEVICE_IN_AANC_HANDSET_MIC] = 104,
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700280 [SND_DEVICE_IN_QUAD_MIC] = 46,
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -0700281 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
282 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700283 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
Eric Laurentb23d5282013-05-14 15:27:20 -0700284};
285
Haynes Mathew George7ff216f2013-09-11 19:51:41 -0700286#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL)
287#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
288
Eric Laurentb23d5282013-05-14 15:27:20 -0700289static int set_echo_reference(struct mixer *mixer, const char* ec_ref)
290{
291 struct mixer_ctl *ctl;
292 const char *mixer_ctl_name = "EC_REF_RX";
293
294 ctl = mixer_get_ctl_by_name(mixer, mixer_ctl_name);
295 if (!ctl) {
296 ALOGE("%s: Could not get ctl for mixer cmd - %s",
297 __func__, mixer_ctl_name);
298 return -EINVAL;
299 }
300 ALOGV("Setting EC Reference: %s", ec_ref);
301 mixer_ctl_set_enum_by_string(ctl, ec_ref);
302 return 0;
303}
304
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800305static struct csd_data *open_csd_client()
306{
307 struct csd_data *csd = calloc(1, sizeof(struct csd_data));
308
309 csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW);
310 if (csd->csd_client == NULL) {
311 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT);
312 goto error;
313 } else {
314 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT);
315
316 csd->deinit = (deinit_t)dlsym(csd->csd_client,
317 "csd_client_deinit");
318 if (csd->deinit == NULL) {
319 ALOGE("%s: dlsym error %s for csd_client_deinit", __func__,
320 dlerror());
321 goto error;
322 }
323 csd->disable_device = (disable_device_t)dlsym(csd->csd_client,
324 "csd_client_disable_device");
325 if (csd->disable_device == NULL) {
326 ALOGE("%s: dlsym error %s for csd_client_disable_device",
327 __func__, dlerror());
328 goto error;
329 }
330 csd->enable_device = (enable_device_t)dlsym(csd->csd_client,
331 "csd_client_enable_device");
332 if (csd->enable_device == NULL) {
333 ALOGE("%s: dlsym error %s for csd_client_enable_device",
334 __func__, dlerror());
335 goto error;
336 }
337 csd->start_voice = (start_voice_t)dlsym(csd->csd_client,
338 "csd_client_start_voice");
339 if (csd->start_voice == NULL) {
340 ALOGE("%s: dlsym error %s for csd_client_start_voice",
341 __func__, dlerror());
342 goto error;
343 }
344 csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client,
345 "csd_client_stop_voice");
346 if (csd->stop_voice == NULL) {
347 ALOGE("%s: dlsym error %s for csd_client_stop_voice",
348 __func__, dlerror());
349 goto error;
350 }
351 csd->volume = (volume_t)dlsym(csd->csd_client,
352 "csd_client_volume");
353 if (csd->volume == NULL) {
354 ALOGE("%s: dlsym error %s for csd_client_volume",
355 __func__, dlerror());
356 goto error;
357 }
358 csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client,
359 "csd_client_mic_mute");
360 if (csd->mic_mute == NULL) {
361 ALOGE("%s: dlsym error %s for csd_client_mic_mute",
362 __func__, dlerror());
363 goto error;
364 }
365 csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client,
366 "csd_client_slow_talk");
367 if (csd->slow_talk == NULL) {
368 ALOGE("%s: dlsym error %s for csd_client_slow_talk",
369 __func__, dlerror());
370 goto error;
371 }
372 csd->start_playback = (start_playback_t)dlsym(csd->csd_client,
373 "csd_client_start_playback");
374 if (csd->start_playback == NULL) {
375 ALOGE("%s: dlsym error %s for csd_client_start_playback",
376 __func__, dlerror());
377 goto error;
378 }
379 csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client,
380 "csd_client_stop_playback");
381 if (csd->stop_playback == NULL) {
382 ALOGE("%s: dlsym error %s for csd_client_stop_playback",
383 __func__, dlerror());
384 goto error;
385 }
386 csd->start_record = (start_record_t)dlsym(csd->csd_client,
387 "csd_client_start_record");
388 if (csd->start_record == NULL) {
389 ALOGE("%s: dlsym error %s for csd_client_start_record",
390 __func__, dlerror());
391 goto error;
392 }
393 csd->stop_record = (stop_record_t)dlsym(csd->csd_client,
394 "csd_client_stop_record");
395 if (csd->stop_record == NULL) {
396 ALOGE("%s: dlsym error %s for csd_client_stop_record",
397 __func__, dlerror());
398 goto error;
399 }
400 csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init");
401
402 if (csd->init == NULL) {
403 ALOGE("%s: dlsym error %s for csd_client_init",
404 __func__, dlerror());
405 goto error;
406 } else {
407 csd->init();
408 }
409 }
410 return csd;
411
412error:
413 free(csd);
414 csd = NULL;
415 return csd;
416}
417
418void close_csd_client(struct csd_data *csd)
419{
420 if (csd != NULL) {
421 csd->deinit();
422 dlclose(csd->csd_client);
423 free(csd);
424 csd = NULL;
425 }
426}
427
Eric Laurentb23d5282013-05-14 15:27:20 -0700428void *platform_init(struct audio_device *adev)
429{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800430 char platform[PROPERTY_VALUE_MAX];
431 char baseband[PROPERTY_VALUE_MAX];
Eric Laurentb23d5282013-05-14 15:27:20 -0700432 char value[PROPERTY_VALUE_MAX];
433 struct platform_data *my_data;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700434 int retry_num = 0;
435 const char *snd_card_name;
sangwoo1b9f4b32013-06-21 18:22:55 -0700436
437 adev->mixer = mixer_open(MIXER_CARD);
438
439 while (!adev->mixer && retry_num < RETRY_NUMBER) {
440 usleep(RETRY_US);
441 adev->mixer = mixer_open(MIXER_CARD);
442 retry_num++;
443 }
444
445 if (!adev->mixer) {
446 ALOGE("Unable to open the mixer, aborting.");
447 return NULL;
448 }
449
Damir Didjustof1d46c72013-11-06 17:59:04 -0800450 if (audio_extn_read_xml(adev, MIXER_CARD, MIXER_XML_PATH,
451 MIXER_XML_PATH_AUXPCM) == -ENOSYS)
452 adev->audio_route = audio_route_init(MIXER_CARD, MIXER_XML_PATH);
453
sangwoo1b9f4b32013-06-21 18:22:55 -0700454 if (!adev->audio_route) {
455 ALOGE("%s: Failed to init audio route controls, aborting.", __func__);
456 return NULL;
457 }
Eric Laurentb23d5282013-05-14 15:27:20 -0700458
459 my_data = calloc(1, sizeof(struct platform_data));
460
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700461 snd_card_name = mixer_get_name(adev->mixer);
462 my_data->hw_info = hw_info_init(snd_card_name);
463 if (!my_data->hw_info) {
464 ALOGE("%s: Failed to init hardware info", __func__);
465 }
466
Eric Laurentb23d5282013-05-14 15:27:20 -0700467 my_data->adev = adev;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700468 my_data->btsco_sample_rate = SAMPLE_RATE_8KHZ;
Eric Laurentb23d5282013-05-14 15:27:20 -0700469 my_data->fluence_in_spkr_mode = false;
470 my_data->fluence_in_voice_call = false;
471 my_data->fluence_in_voice_rec = false;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800472 my_data->fluence_in_audio_rec = false;
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700473 my_data->fluence_type = FLUENCE_NONE;
Eric Laurentb23d5282013-05-14 15:27:20 -0700474
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700475 property_get("ro.qc.sdk.audio.fluencetype", value, "");
476 if (!strncmp("fluencepro", value, sizeof("fluencepro"))) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800477 my_data->fluence_type = FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC;
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700478 } else if (!strncmp("fluence", value, sizeof("fluence"))) {
479 my_data->fluence_type = FLUENCE_DUAL_MIC;
480 } else {
481 my_data->fluence_type = FLUENCE_NONE;
Eric Laurentb23d5282013-05-14 15:27:20 -0700482 }
483
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700484 if (my_data->fluence_type != FLUENCE_NONE) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700485 property_get("persist.audio.fluence.voicecall",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700486 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700487 my_data->fluence_in_voice_call = true;
488 }
489
490 property_get("persist.audio.fluence.voicerec",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700491 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700492 my_data->fluence_in_voice_rec = true;
493 }
494
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800495 property_get("persist.audio.fluence.audiorec",value,"");
496 if (!strncmp("true", value, sizeof("true"))) {
497 my_data->fluence_in_audio_rec = true;
498 }
499
Eric Laurentb23d5282013-05-14 15:27:20 -0700500 property_get("persist.audio.fluence.speaker",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700501 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700502 my_data->fluence_in_spkr_mode = true;
503 }
504 }
505
506 my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
507 if (my_data->acdb_handle == NULL) {
508 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
509 } else {
510 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
511 my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle,
512 "acdb_loader_deallocate_ACDB");
513 my_data->acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(my_data->acdb_handle,
514 "acdb_loader_send_audio_cal");
515 if (!my_data->acdb_send_audio_cal)
516 ALOGW("%s: Could not find the symbol acdb_send_audio_cal from %s",
517 __func__, LIB_ACDB_LOADER);
518 my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle,
519 "acdb_loader_send_voice_cal");
520 my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
521 "acdb_loader_init_ACDB");
522 if (my_data->acdb_init == NULL)
523 ALOGE("%s: dlsym error %s for acdb_loader_init_ACDB", __func__, dlerror());
524 else
525 my_data->acdb_init();
526 }
527
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800528 /* If platform is apq8084 and baseband is MDM, load CSD Client specific
529 * symbols. Voice call is handled by MDM and apps processor talks to
530 * MDM through CSD Client
531 */
532 property_get("ro.board.platform", platform, "");
533 property_get("ro.baseband", baseband, "");
534 if (!strncmp("apq8084", platform, sizeof("apq8084")) &&
535 !strncmp("mdm", baseband, sizeof("mdm"))) {
536 my_data->csd = open_csd_client();
537 }
538
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700539 /* init usb */
540 audio_extn_usb_init(adev);
541
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700542 /* Read one time ssr property */
543 audio_extn_ssr_update_enabled(adev);
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700544 audio_extn_spkr_prot_init(adev);
Eric Laurentb23d5282013-05-14 15:27:20 -0700545 return my_data;
546}
547
548void platform_deinit(void *platform)
549{
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700550 struct platform_data *my_data = (struct platform_data *)platform;
551
552 hw_info_deinit(my_data->hw_info);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800553 close_csd_client(my_data->csd);
554
Eric Laurentb23d5282013-05-14 15:27:20 -0700555 free(platform);
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700556 /* deinit usb */
557 audio_extn_usb_deinit();
Eric Laurentb23d5282013-05-14 15:27:20 -0700558}
559
560const char *platform_get_snd_device_name(snd_device_t snd_device)
561{
562 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
563 return device_table[snd_device];
564 else
565 return "";
566}
567
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700568int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
569 char *device_name)
570{
571 struct platform_data *my_data = (struct platform_data *)platform;
572
573 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
574 strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
575 hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
576 } else {
577 strlcpy(device_name, "", DEVICE_NAME_MAX_SIZE);
578 return -EINVAL;
579 }
580
581 return 0;
582}
583
Eric Laurentb23d5282013-05-14 15:27:20 -0700584void platform_add_backend_name(char *mixer_path, snd_device_t snd_device)
585{
586 if (snd_device == SND_DEVICE_IN_BT_SCO_MIC)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700587 strlcat(mixer_path, " bt-sco", MIXER_PATH_MAX_LENGTH);
588 else if (snd_device == SND_DEVICE_IN_BT_SCO_MIC_WB)
589 strlcat(mixer_path, " bt-sco-wb", MIXER_PATH_MAX_LENGTH);
Eric Laurentb23d5282013-05-14 15:27:20 -0700590 else if(snd_device == SND_DEVICE_OUT_BT_SCO)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700591 strlcat(mixer_path, " bt-sco", MIXER_PATH_MAX_LENGTH);
592 else if(snd_device == SND_DEVICE_OUT_BT_SCO_WB)
593 strlcat(mixer_path, " bt-sco-wb", MIXER_PATH_MAX_LENGTH);
Eric Laurentb23d5282013-05-14 15:27:20 -0700594 else if (snd_device == SND_DEVICE_OUT_HDMI)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700595 strlcat(mixer_path, " hdmi", MIXER_PATH_MAX_LENGTH);
Eric Laurentb23d5282013-05-14 15:27:20 -0700596 else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI)
597 strcat(mixer_path, " speaker-and-hdmi");
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700598 else if (snd_device == SND_DEVICE_OUT_AFE_PROXY)
599 strlcat(mixer_path, " afe-proxy", MIXER_PATH_MAX_LENGTH);
600 else if (snd_device == SND_DEVICE_OUT_USB_HEADSET)
601 strlcat(mixer_path, " usb-headphones", MIXER_PATH_MAX_LENGTH);
602 else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET)
603 strlcat(mixer_path, " speaker-and-usb-headphones",
604 MIXER_PATH_MAX_LENGTH);
605 else if (snd_device == SND_DEVICE_IN_USB_HEADSET_MIC)
606 strlcat(mixer_path, " usb-headset-mic", MIXER_PATH_MAX_LENGTH);
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700607 else if (snd_device == SND_DEVICE_IN_CAPTURE_FM)
608 strlcat(mixer_path, " capture-fm", MIXER_PATH_MAX_LENGTH);
609 else if (snd_device == SND_DEVICE_OUT_TRANSMISSION_FM)
610 strlcat(mixer_path, " transmission-fm", MIXER_PATH_MAX_LENGTH);
Eric Laurentb23d5282013-05-14 15:27:20 -0700611}
612
613int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
614{
615 int device_id;
616 if (device_type == PCM_PLAYBACK)
617 device_id = pcm_device_table[usecase][0];
618 else
619 device_id = pcm_device_table[usecase][1];
620 return device_id;
621}
622
623int platform_send_audio_calibration(void *platform, snd_device_t snd_device)
624{
625 struct platform_data *my_data = (struct platform_data *)platform;
626 int acdb_dev_id, acdb_dev_type;
627
628 acdb_dev_id = acdb_device_table[snd_device];
629 if (acdb_dev_id < 0) {
630 ALOGE("%s: Could not find acdb id for device(%d)",
631 __func__, snd_device);
632 return -EINVAL;
633 }
634 if (my_data->acdb_send_audio_cal) {
Eric Laurent994a6932013-07-17 11:51:42 -0700635 ("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
Eric Laurentb23d5282013-05-14 15:27:20 -0700636 __func__, snd_device, acdb_dev_id);
637 if (snd_device >= SND_DEVICE_OUT_BEGIN &&
638 snd_device < SND_DEVICE_OUT_END)
639 acdb_dev_type = ACDB_DEV_TYPE_OUT;
640 else
641 acdb_dev_type = ACDB_DEV_TYPE_IN;
642 my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type);
643 }
644 return 0;
645}
646
647int platform_switch_voice_call_device_pre(void *platform)
648{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800649 struct platform_data *my_data = (struct platform_data *)platform;
650 int ret = 0;
651
Vidyakumar Athota1fd21792013-11-15 14:50:57 -0800652 if (my_data->csd != NULL &&
653 my_data->adev->mode == AUDIO_MODE_IN_CALL) {
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800654 /* This must be called before disabling mixer controls on APQ side */
655 ret = my_data->csd->disable_device();
656 if (ret < 0) {
657 ALOGE("%s: csd_client_disable_device, failed, error %d",
658 __func__, ret);
659 }
660 }
661 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700662}
663
664int platform_switch_voice_call_device_post(void *platform,
665 snd_device_t out_snd_device,
666 snd_device_t in_snd_device)
667{
668 struct platform_data *my_data = (struct platform_data *)platform;
669 int acdb_rx_id, acdb_tx_id;
670
671 if (my_data->acdb_send_voice_cal == NULL) {
672 ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
673 } else {
Vidyakumar Athota1fd21792013-11-15 14:50:57 -0800674 acdb_rx_id = acdb_device_table[out_snd_device];
675 acdb_tx_id = acdb_device_table[in_snd_device];
676
Eric Laurentb23d5282013-05-14 15:27:20 -0700677 if (acdb_rx_id > 0 && acdb_tx_id > 0)
678 my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id);
679 else
680 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
681 acdb_rx_id, acdb_tx_id);
682 }
683
Vidyakumar Athota1fd21792013-11-15 14:50:57 -0800684 return 0;
685}
686
687int platform_switch_voice_call_usecase_route_post(void *platform,
688 snd_device_t out_snd_device,
689 snd_device_t in_snd_device)
690{
691 struct platform_data *my_data = (struct platform_data *)platform;
692 int acdb_rx_id, acdb_tx_id;
693 int ret = 0;
694
695 acdb_rx_id = acdb_device_table[out_snd_device];
696 acdb_tx_id = acdb_device_table[in_snd_device];
697
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800698 if (my_data->csd != NULL) {
Vidyakumar Athota1fd21792013-11-15 14:50:57 -0800699 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800700 ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id,
701 my_data->adev->acdb_settings);
702 if (ret < 0) {
703 ALOGE("%s: csd_enable_device, failed, error %d",
704 __func__, ret);
705 }
706 } else {
707 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
708 acdb_rx_id, acdb_tx_id);
709 }
710 }
711 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700712}
713
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800714int platform_start_voice_call(void *platform, uint32_t vsid)
Eric Laurentb23d5282013-05-14 15:27:20 -0700715{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800716 struct platform_data *my_data = (struct platform_data *)platform;
717 int ret = 0;
718
719 if (my_data->csd != NULL) {
720 ret = my_data->csd->start_voice(vsid);
721 if (ret < 0) {
722 ALOGE("%s: csd_start_voice error %d\n", __func__, ret);
723 }
724 }
725 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700726}
727
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800728int platform_stop_voice_call(void *platform, uint32_t vsid)
Eric Laurentb23d5282013-05-14 15:27:20 -0700729{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800730 struct platform_data *my_data = (struct platform_data *)platform;
731 int ret = 0;
732
733 if (my_data->csd != NULL) {
734 ret = my_data->csd->stop_voice(vsid);
735 if (ret < 0) {
736 ALOGE("%s: csd_stop_voice error %d\n", __func__, ret);
737 }
738 }
739 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700740}
741
742int platform_set_voice_volume(void *platform, int volume)
743{
744 struct platform_data *my_data = (struct platform_data *)platform;
745 struct audio_device *adev = my_data->adev;
746 struct mixer_ctl *ctl;
sangwoo53b2cf02013-07-25 19:18:44 -0700747 const char *mixer_ctl_name = "Voice Rx Gain";
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800748 int vol_index = 0, ret = 0;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700749 uint32_t set_values[ ] = {0,
750 ALL_SESSION_VSID,
751 DEFAULT_VOLUME_RAMP_DURATION_MS};
Eric Laurentb23d5282013-05-14 15:27:20 -0700752
753 // Voice volume levels are mapped to adsp volume levels as follows.
754 // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1 0 -> 0
755 // But this values don't changed in kernel. So, below change is need.
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700756 vol_index = (int)percent_to_index(volume, MIN_VOL_INDEX, MAX_VOL_INDEX);
757 set_values[0] = vol_index;
Eric Laurentb23d5282013-05-14 15:27:20 -0700758
759 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
760 if (!ctl) {
761 ALOGE("%s: Could not get ctl for mixer cmd - %s",
762 __func__, mixer_ctl_name);
763 return -EINVAL;
764 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700765 ALOGV("Setting voice volume index: %d", set_values[0]);
766 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Eric Laurentb23d5282013-05-14 15:27:20 -0700767
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800768 if (my_data->csd != NULL) {
769 ret = my_data->csd->volume(ALL_SESSION_VSID, volume);
770 if (ret < 0) {
771 ALOGE("%s: csd_volume error %d", __func__, ret);
772 }
773 }
774 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700775}
776
777int platform_set_mic_mute(void *platform, bool state)
778{
779 struct platform_data *my_data = (struct platform_data *)platform;
780 struct audio_device *adev = my_data->adev;
781 struct mixer_ctl *ctl;
782 const char *mixer_ctl_name = "Voice Tx Mute";
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800783 int ret = 0;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700784 uint32_t set_values[ ] = {0,
785 ALL_SESSION_VSID,
786 DEFAULT_VOLUME_RAMP_DURATION_MS};
Eric Laurentb23d5282013-05-14 15:27:20 -0700787
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800788 set_values[0] = state;
789 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
790 if (!ctl) {
791 ALOGE("%s: Could not get ctl for mixer cmd - %s",
792 __func__, mixer_ctl_name);
793 return -EINVAL;
794 }
795 ALOGV("Setting voice mute state: %d", state);
796 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Eric Laurentb23d5282013-05-14 15:27:20 -0700797
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800798 if (my_data->csd != NULL) {
799 ret = my_data->csd->mic_mute(ALL_SESSION_VSID, state);
800 if (ret < 0) {
801 ALOGE("%s: csd_mic_mute error %d", __func__, ret);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800802 }
803 }
804 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700805}
806
807snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devices)
808{
809 struct platform_data *my_data = (struct platform_data *)platform;
810 struct audio_device *adev = my_data->adev;
811 audio_mode_t mode = adev->mode;
812 snd_device_t snd_device = SND_DEVICE_NONE;
813
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700814 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
815 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
816 int channel_count = popcount(channel_mask);
817
Eric Laurentb23d5282013-05-14 15:27:20 -0700818 ALOGV("%s: enter: output devices(%#x)", __func__, devices);
819 if (devices == AUDIO_DEVICE_NONE ||
820 devices & AUDIO_DEVICE_BIT_IN) {
821 ALOGV("%s: Invalid output devices (%#x)", __func__, devices);
822 goto exit;
823 }
824
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800825 if ((mode == AUDIO_MODE_IN_CALL) ||
826 voice_extn_compress_voip_is_active(adev)) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700827 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
828 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800829 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
830 !voice_extn_compress_voip_is_active(adev)) {
831 switch (adev->voice.tty_mode) {
832 case TTY_MODE_FULL:
833 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
834 break;
835 case TTY_MODE_VCO:
836 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
837 break;
838 case TTY_MODE_HCO:
839 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
840 break;
841 default:
842 ALOGE("%s: Invalid TTY mode (%#x)",
843 __func__, adev->voice.tty_mode);
844 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700845 } else if (audio_extn_get_anc_enabled()) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700846 if (audio_extn_should_use_fb_anc())
847 snd_device = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
848 else
849 snd_device = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700850 } else {
Eric Laurentb23d5282013-05-14 15:27:20 -0700851 snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700852 }
Eric Laurentb23d5282013-05-14 15:27:20 -0700853 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700854 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
855 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
856 else
857 snd_device = SND_DEVICE_OUT_BT_SCO;
Eric Laurentb23d5282013-05-14 15:27:20 -0700858 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
859 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700860 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
861 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
862 snd_device = SND_DEVICE_OUT_USB_HEADSET;
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700863 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
864 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -0700865 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
Ravi Kumar Alamandaceb40822013-11-06 11:01:47 -0800866 if (audio_extn_should_use_handset_anc(channel_count))
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700867 snd_device = SND_DEVICE_OUT_ANC_HANDSET;
Eric Laurentb23d5282013-05-14 15:27:20 -0700868 else
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700869 snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
Eric Laurentb23d5282013-05-14 15:27:20 -0700870 }
871 if (snd_device != SND_DEVICE_NONE) {
872 goto exit;
873 }
874 }
875
876 if (popcount(devices) == 2) {
877 if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
878 AUDIO_DEVICE_OUT_SPEAKER)) {
879 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
880 } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
881 AUDIO_DEVICE_OUT_SPEAKER)) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700882 if (audio_extn_get_anc_enabled())
883 snd_device = SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET;
884 else
885 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
Eric Laurentb23d5282013-05-14 15:27:20 -0700886 } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL |
887 AUDIO_DEVICE_OUT_SPEAKER)) {
888 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700889 } else if (devices == (AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
890 AUDIO_DEVICE_OUT_SPEAKER)) {
891 snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
Eric Laurentb23d5282013-05-14 15:27:20 -0700892 } else {
893 ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
894 goto exit;
895 }
896 if (snd_device != SND_DEVICE_NONE) {
897 goto exit;
898 }
899 }
900
901 if (popcount(devices) != 1) {
902 ALOGE("%s: Invalid output devices(%#x)", __func__, devices);
903 goto exit;
904 }
905
906 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
907 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700908 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADSET
909 && audio_extn_get_anc_enabled()) {
910 if (audio_extn_should_use_fb_anc())
911 snd_device = SND_DEVICE_OUT_ANC_FB_HEADSET;
912 else
913 snd_device = SND_DEVICE_OUT_ANC_HEADSET;
914 }
915 else
916 snd_device = SND_DEVICE_OUT_HEADPHONES;
Eric Laurentb23d5282013-05-14 15:27:20 -0700917 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
918 if (adev->speaker_lr_swap)
919 snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
920 else
921 snd_device = SND_DEVICE_OUT_SPEAKER;
922 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700923 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
924 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
925 else
926 snd_device = SND_DEVICE_OUT_BT_SCO;
Eric Laurentb23d5282013-05-14 15:27:20 -0700927 } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
928 snd_device = SND_DEVICE_OUT_HDMI ;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700929 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
930 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
931 snd_device = SND_DEVICE_OUT_USB_HEADSET;
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700932 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
933 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -0700934 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
935 snd_device = SND_DEVICE_OUT_HANDSET;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700936 } else if (devices & AUDIO_DEVICE_OUT_PROXY) {
937 ALOGD("%s: setting sink capability for Proxy", __func__);
938 audio_extn_set_afe_proxy_channel_mixer(adev);
939 snd_device = SND_DEVICE_OUT_AFE_PROXY;
Eric Laurentb23d5282013-05-14 15:27:20 -0700940 } else {
941 ALOGE("%s: Unknown device(s) %#x", __func__, devices);
942 }
943exit:
944 ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]);
945 return snd_device;
946}
947
948snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device)
949{
950 struct platform_data *my_data = (struct platform_data *)platform;
951 struct audio_device *adev = my_data->adev;
952 audio_source_t source = (adev->active_input == NULL) ?
953 AUDIO_SOURCE_DEFAULT : adev->active_input->source;
954
955 audio_mode_t mode = adev->mode;
956 audio_devices_t in_device = ((adev->active_input == NULL) ?
957 AUDIO_DEVICE_NONE : adev->active_input->device)
958 & ~AUDIO_DEVICE_BIT_IN;
959 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
960 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
961 snd_device_t snd_device = SND_DEVICE_NONE;
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700962 int channel_count = popcount(channel_mask);
Eric Laurentb23d5282013-05-14 15:27:20 -0700963
964 ALOGV("%s: enter: out_device(%#x) in_device(%#x)",
965 __func__, out_device, in_device);
Helen Zeng067b96b2013-11-26 12:10:29 -0800966 if ((out_device != AUDIO_DEVICE_NONE) && ((mode == AUDIO_MODE_IN_CALL) ||
967 voice_extn_compress_voip_is_active(adev))) {
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800968 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
969 !voice_extn_compress_voip_is_active(adev)) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700970 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
971 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700972 switch (adev->voice.tty_mode) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700973 case TTY_MODE_FULL:
974 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC;
975 break;
976 case TTY_MODE_VCO:
977 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
978 break;
979 case TTY_MODE_HCO:
980 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC;
981 break;
982 default:
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700983 ALOGE("%s: Invalid TTY mode (%#x)",
984 __func__, adev->voice.tty_mode);
Eric Laurentb23d5282013-05-14 15:27:20 -0700985 }
986 goto exit;
987 }
988 }
989 if (out_device & AUDIO_DEVICE_OUT_EARPIECE ||
990 out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700991 if (out_device & AUDIO_DEVICE_OUT_EARPIECE &&
992 audio_extn_should_use_handset_anc(channel_count)) {
993 snd_device = SND_DEVICE_IN_AANC_HANDSET_MIC;
994 } else if (my_data->fluence_type == FLUENCE_NONE ||
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700995 my_data->fluence_in_voice_call == false) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700996 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Vimal Puthanveed5b4d3f12013-11-05 15:57:39 -0800997 set_echo_reference(adev->mixer, "SLIM_RX");
Eric Laurentb23d5282013-05-14 15:27:20 -0700998 } else {
Ravi Kumar Alamandaceb40822013-11-06 11:01:47 -0800999 snd_device = SND_DEVICE_IN_VOICE_DMIC;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001000 adev->acdb_settings |= DMIC_FLAG;
Eric Laurentb23d5282013-05-14 15:27:20 -07001001 }
1002 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
1003 snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
1004 } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001005 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
1006 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
1007 else
1008 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001009 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001010 if (my_data->fluence_type != FLUENCE_NONE &&
1011 my_data->fluence_in_voice_call &&
1012 my_data->fluence_in_spkr_mode) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001013 if(my_data->fluence_type & FLUENCE_QUAD_MIC) {
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001014 adev->acdb_settings |= QMIC_FLAG;
1015 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_QMIC;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001016 } else {
1017 adev->acdb_settings |= DMIC_FLAG;
1018 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001019 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001020 } else {
1021 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
1022 }
1023 }
1024 } else if (source == AUDIO_SOURCE_CAMCORDER) {
1025 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
1026 in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1027 snd_device = SND_DEVICE_IN_CAMCORDER_MIC;
1028 }
1029 } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) {
1030 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001031 if (channel_count == 2) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001032 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_STEREO;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001033 adev->acdb_settings |= DMIC_FLAG;
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001034 } else if (adev->active_input->enable_ns)
1035 snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS;
1036 else if (my_data->fluence_type != FLUENCE_NONE &&
1037 my_data->fluence_in_voice_rec) {
1038 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
1039 adev->acdb_settings |= DMIC_FLAG;
1040 } else {
1041 snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
1042 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001043 }
1044 } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
1045 if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
1046 in_device = AUDIO_DEVICE_IN_BACK_MIC;
1047 if (adev->active_input) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001048 if (adev->active_input->enable_aec &&
1049 adev->active_input->enable_ns) {
Eric Laurentb23d5282013-05-14 15:27:20 -07001050 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001051 if (my_data->fluence_type & FLUENCE_DUAL_MIC &&
1052 my_data->fluence_in_spkr_mode) {
1053 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
1054 adev->acdb_settings |= DMIC_FLAG;
1055 } else
1056 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
Eric Laurentb23d5282013-05-14 15:27:20 -07001057 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001058 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1059 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
1060 adev->acdb_settings |= DMIC_FLAG;
1061 } else
1062 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
Eric Laurentb23d5282013-05-14 15:27:20 -07001063 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001064 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
Eric Laurentb23d5282013-05-14 15:27:20 -07001065 }
1066 set_echo_reference(adev->mixer, "SLIM_RX");
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001067 } else if (adev->active_input->enable_aec) {
1068 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1069 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1070 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
1071 adev->acdb_settings |= DMIC_FLAG;
1072 } else
1073 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
1074 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
1075 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1076 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
1077 adev->acdb_settings |= DMIC_FLAG;
1078 } else
1079 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC;
1080 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1081 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
1082 }
1083 set_echo_reference(adev->mixer, "SLIM_RX");
1084 } else if (adev->active_input->enable_ns) {
1085 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1086 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1087 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
1088 adev->acdb_settings |= DMIC_FLAG;
1089 } else
1090 snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS;
1091 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
1092 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1093 snd_device = SND_DEVICE_IN_HANDSET_DMIC_NS;
1094 adev->acdb_settings |= DMIC_FLAG;
1095 } else
1096 snd_device = SND_DEVICE_IN_HANDSET_MIC_NS;
1097 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1098 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
1099 }
1100 set_echo_reference(adev->mixer, "NONE");
Eric Laurentb23d5282013-05-14 15:27:20 -07001101 } else
1102 set_echo_reference(adev->mixer, "NONE");
1103 }
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001104 } else if (source == AUDIO_SOURCE_MIC) {
Apoorv Raghuvanshic0536542013-11-14 16:25:59 -08001105 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC &&
1106 channel_count == 1 ) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001107 if(my_data->fluence_type & FLUENCE_DUAL_MIC &&
1108 my_data->fluence_in_audio_rec)
1109 snd_device = SND_DEVICE_IN_HANDSET_DMIC;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001110 }
Mingming Yinab429782013-11-07 11:16:55 -08001111 } else if (source == AUDIO_SOURCE_FM_RX ||
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001112 source == AUDIO_SOURCE_FM_RX_A2DP) {
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07001113 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07001114 } else if (source == AUDIO_SOURCE_DEFAULT) {
1115 goto exit;
1116 }
1117
1118
1119 if (snd_device != SND_DEVICE_NONE) {
1120 goto exit;
1121 }
1122
1123 if (in_device != AUDIO_DEVICE_NONE &&
1124 !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) &&
1125 !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) {
1126 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07001127 if (audio_extn_ssr_get_enabled() && channel_count == 6)
1128 snd_device = SND_DEVICE_IN_QUAD_MIC;
Ravi Kumar Alamandafae42112013-11-07 23:31:54 -08001129 else if (channel_count == 2)
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07001130 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07001131 else
1132 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001133 } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1134 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
1135 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1136 snd_device = SND_DEVICE_IN_HEADSET_MIC;
1137 } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001138 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
1139 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
1140 else
1141 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001142 } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
1143 snd_device = SND_DEVICE_IN_HDMI_MIC;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07001144 } else if (in_device & AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET ||
1145 in_device & AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET) {
1146 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -07001147 } else if (in_device & AUDIO_DEVICE_IN_FM_RX) {
1148 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07001149 } else {
1150 ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
1151 ALOGW("%s: Using default handset-mic", __func__);
1152 snd_device = SND_DEVICE_IN_HANDSET_MIC;
1153 }
1154 } else {
1155 if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
1156 snd_device = SND_DEVICE_IN_HANDSET_MIC;
1157 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
1158 snd_device = SND_DEVICE_IN_HEADSET_MIC;
1159 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07001160 if (channel_count > 1)
1161 snd_device = SND_DEVICE_IN_SPEAKER_STEREO_DMIC;
1162 else
1163 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001164 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
1165 snd_device = SND_DEVICE_IN_HANDSET_MIC;
1166 } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001167 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
1168 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
1169 else
1170 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001171 } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
1172 snd_device = SND_DEVICE_IN_HDMI_MIC;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07001173 } else if (out_device & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
1174 out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
1175 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001176 } else {
1177 ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
1178 ALOGW("%s: Using default handset-mic", __func__);
1179 snd_device = SND_DEVICE_IN_HANDSET_MIC;
1180 }
1181 }
1182exit:
1183 ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
1184 return snd_device;
1185}
1186
1187int platform_set_hdmi_channels(void *platform, int channel_count)
1188{
1189 struct platform_data *my_data = (struct platform_data *)platform;
1190 struct audio_device *adev = my_data->adev;
1191 struct mixer_ctl *ctl;
1192 const char *channel_cnt_str = NULL;
1193 const char *mixer_ctl_name = "HDMI_RX Channels";
1194 switch (channel_count) {
1195 case 8:
1196 channel_cnt_str = "Eight"; break;
1197 case 7:
1198 channel_cnt_str = "Seven"; break;
1199 case 6:
1200 channel_cnt_str = "Six"; break;
1201 case 5:
1202 channel_cnt_str = "Five"; break;
1203 case 4:
1204 channel_cnt_str = "Four"; break;
1205 case 3:
1206 channel_cnt_str = "Three"; break;
1207 default:
1208 channel_cnt_str = "Two"; break;
1209 }
1210 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1211 if (!ctl) {
1212 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1213 __func__, mixer_ctl_name);
1214 return -EINVAL;
1215 }
1216 ALOGV("HDMI channel count: %s", channel_cnt_str);
1217 mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
1218 return 0;
1219}
1220
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001221int platform_edid_get_max_channels(void *platform)
Eric Laurentb23d5282013-05-14 15:27:20 -07001222{
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001223 struct platform_data *my_data = (struct platform_data *)platform;
1224 struct audio_device *adev = my_data->adev;
Eric Laurentb23d5282013-05-14 15:27:20 -07001225 char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE];
1226 char *sad = block;
1227 int num_audio_blocks;
1228 int channel_count;
1229 int max_channels = 0;
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001230 int i, ret, count;
Eric Laurentb23d5282013-05-14 15:27:20 -07001231
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001232 struct mixer_ctl *ctl;
1233
1234 ctl = mixer_get_ctl_by_name(adev->mixer, AUDIO_DATA_BLOCK_MIXER_CTL);
1235 if (!ctl) {
1236 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1237 __func__, AUDIO_DATA_BLOCK_MIXER_CTL);
Eric Laurentb23d5282013-05-14 15:27:20 -07001238 return 0;
1239 }
1240
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001241 mixer_ctl_update(ctl);
1242
1243 count = mixer_ctl_get_num_values(ctl);
Eric Laurentb23d5282013-05-14 15:27:20 -07001244
1245 /* Read SAD blocks, clamping the maximum size for safety */
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001246 if (count > (int)sizeof(block))
1247 count = (int)sizeof(block);
Eric Laurentb23d5282013-05-14 15:27:20 -07001248
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001249 ret = mixer_ctl_get_array(ctl, block, count);
1250 if (ret != 0) {
1251 ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__);
1252 return 0;
1253 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001254
1255 /* Calculate the number of SAD blocks */
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001256 num_audio_blocks = count / SAD_BLOCK_SIZE;
Eric Laurentb23d5282013-05-14 15:27:20 -07001257
1258 for (i = 0; i < num_audio_blocks; i++) {
1259 /* Only consider LPCM blocks */
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001260 if ((sad[0] >> 3) != EDID_FORMAT_LPCM) {
1261 sad += 3;
Eric Laurentb23d5282013-05-14 15:27:20 -07001262 continue;
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001263 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001264
1265 channel_count = (sad[0] & 0x7) + 1;
1266 if (channel_count > max_channels)
1267 max_channels = channel_count;
1268
1269 /* Advance to next block */
1270 sad += 3;
1271 }
1272
1273 return max_channels;
1274}
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001275
1276static int platform_set_slowtalk(struct platform_data *my_data, bool state)
1277{
1278 int ret = 0;
1279 struct audio_device *adev = my_data->adev;
1280 struct mixer_ctl *ctl;
1281 const char *mixer_ctl_name = "Slowtalk Enable";
1282 uint32_t set_values[ ] = {0,
1283 ALL_SESSION_VSID};
1284
1285 set_values[0] = state;
1286 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1287 if (!ctl) {
1288 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1289 __func__, mixer_ctl_name);
1290 ret = -EINVAL;
1291 } else {
1292 ALOGV("Setting slowtalk state: %d", state);
1293 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
1294 my_data->slowtalk = state;
1295 }
1296
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001297 if (my_data->csd != NULL) {
1298 ret = my_data->csd->slow_talk(ALL_SESSION_VSID, state);
1299 if (ret < 0) {
1300 ALOGE("%s: csd_client_disable_device, failed, error %d",
1301 __func__, ret);
1302 }
1303 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001304 return ret;
1305}
1306
1307int platform_set_parameters(void *platform, struct str_parms *parms)
1308{
1309 struct platform_data *my_data = (struct platform_data *)platform;
1310 char *str;
1311 char value[32];
1312 int val;
1313 int ret = 0;
1314
1315 ALOGV("%s: enter: %s", __func__, str_parms_to_str(parms));
1316
1317 ret = str_parms_get_int(parms, AUDIO_PARAMETER_KEY_BTSCO, &val);
1318 if (ret >= 0) {
1319 str_parms_del(parms, AUDIO_PARAMETER_KEY_BTSCO);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001320 my_data->btsco_sample_rate = val;
Vidyakumar Athota67c42712013-12-04 14:03:06 -08001321 if (val == SAMPLE_RATE_16KHZ) {
1322 audio_route_apply_path(my_data->adev->audio_route,
1323 "bt-sco-wb-samplerate");
1324 audio_route_update_mixer(my_data->adev->audio_route);
1325 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001326 }
1327
1328 ret = str_parms_get_int(parms, AUDIO_PARAMETER_KEY_SLOWTALK, &val);
1329 if (ret >= 0) {
1330 str_parms_del(parms, AUDIO_PARAMETER_KEY_SLOWTALK);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001331 ret = platform_set_slowtalk(my_data, val);
1332 if (ret)
1333 ALOGE("%s: Failed to set slow talk err: %d", __func__, ret);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001334 }
1335
1336 ALOGV("%s: exit with code(%d)", __func__, ret);
1337 return ret;
1338}
1339
Vidyakumar Athota2850d532013-11-19 16:02:12 -08001340int platform_set_incall_recording_session_id(void *platform,
1341 uint32_t session_id, int rec_mode)
Shiv Maliyappanahallida107642013-10-17 11:16:13 -07001342{
1343 int ret = 0;
1344 struct platform_data *my_data = (struct platform_data *)platform;
1345 struct audio_device *adev = my_data->adev;
1346 struct mixer_ctl *ctl;
1347 const char *mixer_ctl_name = "Voc VSID";
1348 int num_ctl_values;
1349 int i;
1350
1351 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1352 if (!ctl) {
1353 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1354 __func__, mixer_ctl_name);
1355 ret = -EINVAL;
1356 } else {
1357 num_ctl_values = mixer_ctl_get_num_values(ctl);
1358 for (i = 0; i < num_ctl_values; i++) {
1359 if (mixer_ctl_set_value(ctl, i, session_id)) {
1360 ALOGV("Error: invalid session_id: %x", session_id);
1361 ret = -EINVAL;
1362 break;
1363 }
1364 }
1365 }
1366
Vidyakumar Athota2850d532013-11-19 16:02:12 -08001367 if (my_data->csd != NULL) {
1368 ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode);
1369 if (ret < 0) {
1370 ALOGE("%s: csd_client_start_record failed, error %d",
1371 __func__, ret);
1372 }
1373 }
1374
1375 return ret;
1376}
1377
1378int platform_stop_incall_recording_usecase(void *platform)
1379{
1380 int ret = 0;
1381 struct platform_data *my_data = (struct platform_data *)platform;
1382
1383 if (my_data->csd != NULL) {
1384 ret = my_data->csd->stop_record(ALL_SESSION_VSID);
1385 if (ret < 0) {
1386 ALOGE("%s: csd_client_stop_record failed, error %d",
1387 __func__, ret);
1388 }
1389 }
1390
1391 return ret;
1392}
1393
1394int platform_start_incall_music_usecase(void *platform)
1395{
1396 int ret = 0;
1397 struct platform_data *my_data = (struct platform_data *)platform;
1398
1399 if (my_data->csd != NULL) {
1400 ret = my_data->csd->start_playback(ALL_SESSION_VSID);
1401 if (ret < 0) {
1402 ALOGE("%s: csd_client_start_playback failed, error %d",
1403 __func__, ret);
1404 }
1405 }
1406
1407 return ret;
1408}
1409
1410int platform_stop_incall_music_usecase(void *platform)
1411{
1412 int ret = 0;
1413 struct platform_data *my_data = (struct platform_data *)platform;
1414
1415 if (my_data->csd != NULL) {
1416 ret = my_data->csd->stop_playback(ALL_SESSION_VSID);
1417 if (ret < 0) {
1418 ALOGE("%s: csd_client_stop_playback failed, error %d",
1419 __func__, ret);
1420 }
1421 }
1422
Shiv Maliyappanahallida107642013-10-17 11:16:13 -07001423 return ret;
1424}
1425
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001426void platform_get_parameters(void *platform,
1427 struct str_parms *query,
1428 struct str_parms *reply)
1429{
1430 struct platform_data *my_data = (struct platform_data *)platform;
1431 char *str = NULL;
1432 char value[256] = {0};
1433 int ret;
1434 int fluence_type;
1435
1436 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_FLUENCE_TYPE,
1437 value, sizeof(value));
1438 if (ret >= 0) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001439 if (my_data->fluence_type & FLUENCE_QUAD_MIC) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001440 strlcpy(value, "fluencepro", sizeof(value));
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001441 } else if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001442 strlcpy(value, "fluence", sizeof(value));
1443 } else {
1444 strlcpy(value, "none", sizeof(value));
1445 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001446
1447 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_FLUENCE_TYPE, value);
1448 }
1449
Shiv Maliyappanahalli9d899292013-11-20 14:43:01 -08001450 memset(value, 0, sizeof(value));
1451 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_SLOWTALK,
1452 value, sizeof(value));
1453 if (ret >= 0) {
1454 str_parms_add_int(reply, AUDIO_PARAMETER_KEY_SLOWTALK,
1455 my_data->slowtalk);
1456 }
1457
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001458 ALOGV("%s: exit: returns - %s", __func__, str_parms_to_str(reply));
1459}
1460
Haynes Mathew George7ff216f2013-09-11 19:51:41 -07001461/* Delay in Us */
1462int64_t platform_render_latency(audio_usecase_t usecase)
1463{
1464 switch (usecase) {
1465 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
1466 return DEEP_BUFFER_PLATFORM_DELAY;
1467 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
1468 return LOW_LATENCY_PLATFORM_DELAY;
1469 default:
1470 return 0;
1471 }
1472}
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07001473
Mingming Yine62d7842013-10-25 16:26:03 -07001474int platform_update_usecase_from_source(int source, int usecase)
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07001475{
Mingming Yinab429782013-11-07 11:16:55 -08001476 ALOGV("%s: input source :%d", __func__, source);
1477 if(source == AUDIO_SOURCE_FM_RX_A2DP)
Mingming Yine62d7842013-10-25 16:26:03 -07001478 usecase = USECASE_AUDIO_RECORD_FM_VIRTUAL;
1479 return usecase;
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07001480}
Kiran Kandide144c82013-11-20 15:58:32 -08001481
1482bool platform_listen_update_status(snd_device_t snd_device)
1483{
1484 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
1485 (snd_device < SND_DEVICE_IN_END) &&
1486 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
1487 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
1488 return true;
1489 else
1490 return false;
1491}