blob: 081651b8181642f3745da404366f3d279cc3cf26 [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
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -080056#define MAX_SND_CARD 8
sangwoo1b9f4b32013-06-21 18:22:55 -070057
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -070058#define SAMPLE_RATE_8KHZ 8000
59#define SAMPLE_RATE_16KHZ 16000
60
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -070061#define AUDIO_PARAMETER_KEY_FLUENCE_TYPE "fluence"
62#define AUDIO_PARAMETER_KEY_BTSCO "bt_samplerate"
63#define AUDIO_PARAMETER_KEY_SLOWTALK "st_enable"
sangwoo53b2cf02013-07-25 19:18:44 -070064
Eric Laurentb23d5282013-05-14 15:27:20 -070065struct audio_block_header
66{
67 int reserved;
68 int length;
69};
70
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -080071/* Audio calibration related functions */
Eric Laurentb23d5282013-05-14 15:27:20 -070072typedef void (*acdb_deallocate_t)();
73typedef int (*acdb_init_t)();
74typedef void (*acdb_send_audio_cal_t)(int, int);
75typedef void (*acdb_send_voice_cal_t)(int, int);
76
Eric Laurentb23d5282013-05-14 15:27:20 -070077struct platform_data {
78 struct audio_device *adev;
79 bool fluence_in_spkr_mode;
80 bool fluence_in_voice_call;
81 bool fluence_in_voice_rec;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -080082 bool fluence_in_audio_rec;
Mingming Yin8e5a4f62013-10-07 15:23:41 -070083 int fluence_type;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -070084 int btsco_sample_rate;
85 bool slowtalk;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -070086 /* Audio calibration related functions */
Eric Laurentb23d5282013-05-14 15:27:20 -070087 void *acdb_handle;
88 acdb_init_t acdb_init;
89 acdb_deallocate_t acdb_deallocate;
90 acdb_send_audio_cal_t acdb_send_audio_cal;
91 acdb_send_voice_cal_t acdb_send_voice_cal;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -070092
93 void *hw_info;
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -080094 struct csd_data *csd;
Eric Laurentb23d5282013-05-14 15:27:20 -070095};
96
97static const int pcm_device_table[AUDIO_USECASE_MAX][2] = {
Mingming Yin8e5a4f62013-10-07 15:23:41 -070098 [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE,
99 DEEP_BUFFER_PCM_DEVICE},
100 [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700101 LOWLATENCY_PCM_DEVICE},
102 [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE,
103 MULTIMEDIA2_PCM_DEVICE},
Krishnankutty Kolathappillya43f96e2013-11-01 12:17:53 -0700104 [USECASE_AUDIO_PLAYBACK_OFFLOAD] =
105 {PLAYBACK_OFFLOAD_DEVICE, PLAYBACK_OFFLOAD_DEVICE},
Shiv Maliyappanahallida107642013-10-17 11:16:13 -0700106 [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
Mingming Yine62d7842013-10-25 16:26:03 -0700107 [USECASE_AUDIO_RECORD_COMPRESS] = {COMPRESS_CAPTURE_DEVICE, COMPRESS_CAPTURE_DEVICE},
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700108 [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
109 LOWLATENCY_PCM_DEVICE},
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -0700110 [USECASE_AUDIO_RECORD_FM_VIRTUAL] = {MULTIMEDIA2_PCM_DEVICE,
111 MULTIMEDIA2_PCM_DEVICE},
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700112 [USECASE_AUDIO_PLAYBACK_FM] = {FM_PLAYBACK_PCM_DEVICE, FM_CAPTURE_PCM_DEVICE},
Vimal Puthanveed5b4d3f12013-11-05 15:57:39 -0800113 [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700114 [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE, VOICE_CALL_PCM_DEVICE},
115 [USECASE_VOICE2_CALL] = {VOICE2_CALL_PCM_DEVICE, VOICE2_CALL_PCM_DEVICE},
116 [USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE},
117 [USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE},
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800118 [USECASE_COMPRESS_VOIP_CALL] = {COMPRESS_VOIP_CALL_PCM_DEVICE, COMPRESS_VOIP_CALL_PCM_DEVICE},
Shiv Maliyappanahallida107642013-10-17 11:16:13 -0700119 [USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE,
120 AUDIO_RECORD_PCM_DEVICE},
121 [USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
122 AUDIO_RECORD_PCM_DEVICE},
123 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
124 AUDIO_RECORD_PCM_DEVICE},
Helen Zenge56b4852013-12-03 16:54:40 -0800125 [USECASE_INCALL_REC_UPLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
126 COMPRESS_CAPTURE_DEVICE},
127 [USECASE_INCALL_REC_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
128 COMPRESS_CAPTURE_DEVICE},
129 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
130 COMPRESS_CAPTURE_DEVICE},
Shiv Maliyappanahallif3b9a422013-10-22 16:38:08 -0700131 [USECASE_INCALL_MUSIC_UPLINK] = {INCALL_MUSIC_UPLINK_PCM_DEVICE,
132 INCALL_MUSIC_UPLINK_PCM_DEVICE},
133 [USECASE_INCALL_MUSIC_UPLINK2] = {INCALL_MUSIC_UPLINK2_PCM_DEVICE,
134 INCALL_MUSIC_UPLINK2_PCM_DEVICE},
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700135 [USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1},
136 [USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE},
Eric Laurentb23d5282013-05-14 15:27:20 -0700137};
138
139/* Array to store sound devices */
140static const char * const device_table[SND_DEVICE_MAX] = {
141 [SND_DEVICE_NONE] = "none",
142 /* Playback sound devices */
143 [SND_DEVICE_OUT_HANDSET] = "handset",
144 [SND_DEVICE_OUT_SPEAKER] = "speaker",
145 [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse",
146 [SND_DEVICE_OUT_HEADPHONES] = "headphones",
147 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
148 [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
149 [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
150 [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
151 [SND_DEVICE_OUT_HDMI] = "hdmi",
152 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
153 [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700154 [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
Eric Laurentb23d5282013-05-14 15:27:20 -0700155 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
156 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
157 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700158 [SND_DEVICE_OUT_AFE_PROXY] = "afe-proxy",
159 [SND_DEVICE_OUT_USB_HEADSET] = "usb-headphones",
160 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = "speaker-and-usb-headphones",
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700161 [SND_DEVICE_OUT_TRANSMISSION_FM] = "transmission-fm",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700162 [SND_DEVICE_OUT_ANC_HEADSET] = "anc-headphones",
163 [SND_DEVICE_OUT_ANC_FB_HEADSET] = "anc-fb-headphones",
164 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = "voice-anc-headphones",
165 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = "voice-anc-fb-headphones",
166 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
167 [SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700168 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
Eric Laurentb23d5282013-05-14 15:27:20 -0700169
170 /* Capture sound devices */
171 [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700172 [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800173 [SND_DEVICE_IN_HANDSET_MIC_NS] = "handset-mic",
174 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = "handset-mic",
175 [SND_DEVICE_IN_HANDSET_DMIC] = "dmic-endfire",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800176 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = "dmic-endfire",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800177 [SND_DEVICE_IN_HANDSET_DMIC_NS] = "dmic-endfire",
178 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = "dmic-endfire",
179 [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800180 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800181 [SND_DEVICE_IN_SPEAKER_MIC_NS] = "speaker-mic",
182 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = "speaker-mic",
183 [SND_DEVICE_IN_SPEAKER_DMIC] = "speaker-dmic-endfire",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800184 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = "speaker-dmic-endfire",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800185 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = "speaker-dmic-endfire",
186 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = "speaker-dmic-endfire",
187 [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic",
188 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = "headset-mic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700189 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
190 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
191 [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
192 [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700193 [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
Eric Laurentb23d5282013-05-14 15:27:20 -0700194 [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700195 [SND_DEVICE_IN_VOICE_DMIC] = "voice-dmic-ef",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700196 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = "voice-speaker-dmic-ef",
Vidyakumar Athotaadfe4e32013-12-13 14:51:26 -0800197 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = "voice-speaker-qmic",
Eric Laurentb23d5282013-05-14 15:27:20 -0700198 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
199 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
200 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
201 [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800202 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800203 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700204 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700205 [SND_DEVICE_IN_USB_HEADSET_MIC] = "usb-headset-mic",
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700206 [SND_DEVICE_IN_CAPTURE_FM] = "capture-fm",
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700207 [SND_DEVICE_IN_AANC_HANDSET_MIC] = "aanc-handset-mic",
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700208 [SND_DEVICE_IN_QUAD_MIC] = "quad-mic",
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -0700209 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
210 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700211 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
Eric Laurentb23d5282013-05-14 15:27:20 -0700212};
213
214/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
215static const int acdb_device_table[SND_DEVICE_MAX] = {
216 [SND_DEVICE_NONE] = -1,
217 [SND_DEVICE_OUT_HANDSET] = 7,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800218 [SND_DEVICE_OUT_SPEAKER] = 14,
219 [SND_DEVICE_OUT_SPEAKER_REVERSE] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700220 [SND_DEVICE_OUT_HEADPHONES] = 10,
221 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10,
222 [SND_DEVICE_OUT_VOICE_HANDSET] = 7,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800223 [SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700224 [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
225 [SND_DEVICE_OUT_HDMI] = 18,
Vidyakumar Athotac29d4ab2013-11-14 16:58:02 -0800226 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
Eric Laurentb23d5282013-05-14 15:27:20 -0700227 [SND_DEVICE_OUT_BT_SCO] = 22,
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700228 [SND_DEVICE_OUT_BT_SCO_WB] = 39,
Eric Laurentb23d5282013-05-14 15:27:20 -0700229 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
230 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
231 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700232 [SND_DEVICE_OUT_AFE_PROXY] = 0,
233 [SND_DEVICE_OUT_USB_HEADSET] = 0,
234 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 14,
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700235 [SND_DEVICE_OUT_TRANSMISSION_FM] = 0,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700236 [SND_DEVICE_OUT_ANC_HEADSET] = 26,
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700237 [SND_DEVICE_OUT_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700238 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = 26,
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700239 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = 27,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700240 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26,
241 [SND_DEVICE_OUT_ANC_HANDSET] = 103,
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700242 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 101,
Eric Laurentb23d5282013-05-14 15:27:20 -0700243
244 [SND_DEVICE_IN_HANDSET_MIC] = 4,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800245 [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106,
246 [SND_DEVICE_IN_HANDSET_MIC_NS] = 107,
247 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = 108,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800248 [SND_DEVICE_IN_HANDSET_DMIC] = 41,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800249 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = 109,
250 [SND_DEVICE_IN_HANDSET_DMIC_NS] = 110,
251 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = 111,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800252 [SND_DEVICE_IN_SPEAKER_MIC] = 11,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800253 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 112,
254 [SND_DEVICE_IN_SPEAKER_MIC_NS] = 113,
255 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = 114,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800256 [SND_DEVICE_IN_SPEAKER_DMIC] = 43,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800257 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = 115,
258 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = 116,
259 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117,
Eric Laurentb23d5282013-05-14 15:27:20 -0700260 [SND_DEVICE_IN_HEADSET_MIC] = 8,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800261 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = 47,
Eric Laurentb23d5282013-05-14 15:27:20 -0700262 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
263 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
264 [SND_DEVICE_IN_HDMI_MIC] = 4,
265 [SND_DEVICE_IN_BT_SCO_MIC] = 21,
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700266 [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800267 [SND_DEVICE_IN_CAMCORDER_MIC] = 4,
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700268 [SND_DEVICE_IN_VOICE_DMIC] = 41,
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700269 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43,
Vidyakumar Athotaadfe4e32013-12-13 14:51:26 -0800270 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = 19,
Eric Laurentb23d5282013-05-14 15:27:20 -0700271 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
272 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
273 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800274 [SND_DEVICE_IN_VOICE_REC_MIC] = 4,
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -0800275 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = 107,
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800276 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 34,
277 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 41,
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700278 [SND_DEVICE_IN_USB_HEADSET_MIC] = 44,
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700279 [SND_DEVICE_IN_CAPTURE_FM] = 0,
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700280 [SND_DEVICE_IN_AANC_HANDSET_MIC] = 104,
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700281 [SND_DEVICE_IN_QUAD_MIC] = 46,
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -0700282 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
283 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700284 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
Eric Laurentb23d5282013-05-14 15:27:20 -0700285};
286
Haynes Mathew George7ff216f2013-09-11 19:51:41 -0700287#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL)
288#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
289
Eric Laurentb23d5282013-05-14 15:27:20 -0700290static int set_echo_reference(struct mixer *mixer, const char* ec_ref)
291{
292 struct mixer_ctl *ctl;
293 const char *mixer_ctl_name = "EC_REF_RX";
294
295 ctl = mixer_get_ctl_by_name(mixer, mixer_ctl_name);
296 if (!ctl) {
297 ALOGE("%s: Could not get ctl for mixer cmd - %s",
298 __func__, mixer_ctl_name);
299 return -EINVAL;
300 }
301 ALOGV("Setting EC Reference: %s", ec_ref);
302 mixer_ctl_set_enum_by_string(ctl, ec_ref);
303 return 0;
304}
305
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800306static struct csd_data *open_csd_client()
307{
308 struct csd_data *csd = calloc(1, sizeof(struct csd_data));
309
310 csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW);
311 if (csd->csd_client == NULL) {
312 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT);
313 goto error;
314 } else {
315 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT);
316
317 csd->deinit = (deinit_t)dlsym(csd->csd_client,
318 "csd_client_deinit");
319 if (csd->deinit == NULL) {
320 ALOGE("%s: dlsym error %s for csd_client_deinit", __func__,
321 dlerror());
322 goto error;
323 }
324 csd->disable_device = (disable_device_t)dlsym(csd->csd_client,
325 "csd_client_disable_device");
326 if (csd->disable_device == NULL) {
327 ALOGE("%s: dlsym error %s for csd_client_disable_device",
328 __func__, dlerror());
329 goto error;
330 }
331 csd->enable_device = (enable_device_t)dlsym(csd->csd_client,
332 "csd_client_enable_device");
333 if (csd->enable_device == NULL) {
334 ALOGE("%s: dlsym error %s for csd_client_enable_device",
335 __func__, dlerror());
336 goto error;
337 }
338 csd->start_voice = (start_voice_t)dlsym(csd->csd_client,
339 "csd_client_start_voice");
340 if (csd->start_voice == NULL) {
341 ALOGE("%s: dlsym error %s for csd_client_start_voice",
342 __func__, dlerror());
343 goto error;
344 }
345 csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client,
346 "csd_client_stop_voice");
347 if (csd->stop_voice == NULL) {
348 ALOGE("%s: dlsym error %s for csd_client_stop_voice",
349 __func__, dlerror());
350 goto error;
351 }
352 csd->volume = (volume_t)dlsym(csd->csd_client,
353 "csd_client_volume");
354 if (csd->volume == NULL) {
355 ALOGE("%s: dlsym error %s for csd_client_volume",
356 __func__, dlerror());
357 goto error;
358 }
359 csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client,
360 "csd_client_mic_mute");
361 if (csd->mic_mute == NULL) {
362 ALOGE("%s: dlsym error %s for csd_client_mic_mute",
363 __func__, dlerror());
364 goto error;
365 }
366 csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client,
367 "csd_client_slow_talk");
368 if (csd->slow_talk == NULL) {
369 ALOGE("%s: dlsym error %s for csd_client_slow_talk",
370 __func__, dlerror());
371 goto error;
372 }
373 csd->start_playback = (start_playback_t)dlsym(csd->csd_client,
374 "csd_client_start_playback");
375 if (csd->start_playback == NULL) {
376 ALOGE("%s: dlsym error %s for csd_client_start_playback",
377 __func__, dlerror());
378 goto error;
379 }
380 csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client,
381 "csd_client_stop_playback");
382 if (csd->stop_playback == NULL) {
383 ALOGE("%s: dlsym error %s for csd_client_stop_playback",
384 __func__, dlerror());
385 goto error;
386 }
387 csd->start_record = (start_record_t)dlsym(csd->csd_client,
388 "csd_client_start_record");
389 if (csd->start_record == NULL) {
390 ALOGE("%s: dlsym error %s for csd_client_start_record",
391 __func__, dlerror());
392 goto error;
393 }
394 csd->stop_record = (stop_record_t)dlsym(csd->csd_client,
395 "csd_client_stop_record");
396 if (csd->stop_record == NULL) {
397 ALOGE("%s: dlsym error %s for csd_client_stop_record",
398 __func__, dlerror());
399 goto error;
400 }
401 csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init");
402
403 if (csd->init == NULL) {
404 ALOGE("%s: dlsym error %s for csd_client_init",
405 __func__, dlerror());
406 goto error;
407 } else {
408 csd->init();
409 }
410 }
411 return csd;
412
413error:
414 free(csd);
415 csd = NULL;
416 return csd;
417}
418
419void close_csd_client(struct csd_data *csd)
420{
421 if (csd != NULL) {
422 csd->deinit();
423 dlclose(csd->csd_client);
424 free(csd);
425 csd = NULL;
426 }
427}
428
Eric Laurentb23d5282013-05-14 15:27:20 -0700429void *platform_init(struct audio_device *adev)
430{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800431 char platform[PROPERTY_VALUE_MAX];
432 char baseband[PROPERTY_VALUE_MAX];
Eric Laurentb23d5282013-05-14 15:27:20 -0700433 char value[PROPERTY_VALUE_MAX];
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -0800434 struct platform_data *my_data = NULL;
435 int retry_num = 0, snd_card_num = 0;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700436 const char *snd_card_name;
sangwoo1b9f4b32013-06-21 18:22:55 -0700437
Eric Laurentb23d5282013-05-14 15:27:20 -0700438 my_data = calloc(1, sizeof(struct platform_data));
439
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -0800440 while (snd_card_num < MAX_SND_CARD) {
441 adev->mixer = mixer_open(snd_card_num);
442
443 while (!adev->mixer && retry_num < RETRY_NUMBER) {
444 usleep(RETRY_US);
445 adev->mixer = mixer_open(snd_card_num);
446 retry_num++;
447 }
448
449 if (!adev->mixer) {
450 ALOGE("%s: Unable to open the mixer card: %d", __func__,
451 snd_card_num);
452 retry_num = 0;
453 snd_card_num++;
454 continue;
455 }
456
457 snd_card_name = mixer_get_name(adev->mixer);
458 ALOGV("%s: snd_card_name: %s", __func__, snd_card_name);
459
460 my_data->hw_info = hw_info_init(snd_card_name);
461 if (!my_data->hw_info) {
462 ALOGE("%s: Failed to init hardware info", __func__);
463 } else {
464 if (audio_extn_read_xml(adev, snd_card_num, MIXER_XML_PATH,
465 MIXER_XML_PATH_AUXPCM) == -ENOSYS)
466 adev->audio_route = audio_route_init(snd_card_num,
467 MIXER_XML_PATH);
468 if (!adev->audio_route) {
469 ALOGE("%s: Failed to init audio route controls, aborting.",
470 __func__);
471 free(my_data);
472 return NULL;
473 }
474 adev->snd_card = snd_card_num;
475 ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
476 break;
477 }
478 retry_num = 0;
479 snd_card_num++;
480 }
481
482 if (snd_card_num >= MAX_SND_CARD) {
483 ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
484 free(my_data);
485 return NULL;
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700486 }
487
Eric Laurentb23d5282013-05-14 15:27:20 -0700488 my_data->adev = adev;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700489 my_data->btsco_sample_rate = SAMPLE_RATE_8KHZ;
Eric Laurentb23d5282013-05-14 15:27:20 -0700490 my_data->fluence_in_spkr_mode = false;
491 my_data->fluence_in_voice_call = false;
492 my_data->fluence_in_voice_rec = false;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800493 my_data->fluence_in_audio_rec = false;
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700494 my_data->fluence_type = FLUENCE_NONE;
Eric Laurentb23d5282013-05-14 15:27:20 -0700495
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700496 property_get("ro.qc.sdk.audio.fluencetype", value, "");
497 if (!strncmp("fluencepro", value, sizeof("fluencepro"))) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800498 my_data->fluence_type = FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC;
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700499 } else if (!strncmp("fluence", value, sizeof("fluence"))) {
500 my_data->fluence_type = FLUENCE_DUAL_MIC;
501 } else {
502 my_data->fluence_type = FLUENCE_NONE;
Eric Laurentb23d5282013-05-14 15:27:20 -0700503 }
504
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700505 if (my_data->fluence_type != FLUENCE_NONE) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700506 property_get("persist.audio.fluence.voicecall",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700507 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700508 my_data->fluence_in_voice_call = true;
509 }
510
511 property_get("persist.audio.fluence.voicerec",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700512 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700513 my_data->fluence_in_voice_rec = true;
514 }
515
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -0800516 property_get("persist.audio.fluence.audiorec",value,"");
517 if (!strncmp("true", value, sizeof("true"))) {
518 my_data->fluence_in_audio_rec = true;
519 }
520
Eric Laurentb23d5282013-05-14 15:27:20 -0700521 property_get("persist.audio.fluence.speaker",value,"");
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700522 if (!strncmp("true", value, sizeof("true"))) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700523 my_data->fluence_in_spkr_mode = true;
524 }
525 }
526
527 my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
528 if (my_data->acdb_handle == NULL) {
529 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
530 } else {
531 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
532 my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle,
533 "acdb_loader_deallocate_ACDB");
534 my_data->acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(my_data->acdb_handle,
535 "acdb_loader_send_audio_cal");
536 if (!my_data->acdb_send_audio_cal)
537 ALOGW("%s: Could not find the symbol acdb_send_audio_cal from %s",
538 __func__, LIB_ACDB_LOADER);
539 my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle,
540 "acdb_loader_send_voice_cal");
541 my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
542 "acdb_loader_init_ACDB");
543 if (my_data->acdb_init == NULL)
544 ALOGE("%s: dlsym error %s for acdb_loader_init_ACDB", __func__, dlerror());
545 else
546 my_data->acdb_init();
547 }
548
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800549 /* If platform is apq8084 and baseband is MDM, load CSD Client specific
550 * symbols. Voice call is handled by MDM and apps processor talks to
551 * MDM through CSD Client
552 */
553 property_get("ro.board.platform", platform, "");
554 property_get("ro.baseband", baseband, "");
555 if (!strncmp("apq8084", platform, sizeof("apq8084")) &&
556 !strncmp("mdm", baseband, sizeof("mdm"))) {
557 my_data->csd = open_csd_client();
558 }
559
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700560 /* init usb */
561 audio_extn_usb_init(adev);
Apoorv Raghuvanshi84fa2fe2013-12-04 11:57:47 -0800562 /* update sound cards appropriately */
563 audio_extn_usb_set_proxy_sound_card(adev->snd_card);
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700564
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -0700565 /* Read one time ssr property */
Mingming Yin49be8032013-12-19 12:51:25 -0800566 audio_extn_ssr_update_enabled();
Gopikrishnaiah Anandanf538cef2013-10-28 14:06:03 -0700567 audio_extn_spkr_prot_init(adev);
Eric Laurentb23d5282013-05-14 15:27:20 -0700568 return my_data;
569}
570
571void platform_deinit(void *platform)
572{
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700573 struct platform_data *my_data = (struct platform_data *)platform;
574
575 hw_info_deinit(my_data->hw_info);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800576 close_csd_client(my_data->csd);
577
Eric Laurentb23d5282013-05-14 15:27:20 -0700578 free(platform);
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700579 /* deinit usb */
580 audio_extn_usb_deinit();
Eric Laurentb23d5282013-05-14 15:27:20 -0700581}
582
583const char *platform_get_snd_device_name(snd_device_t snd_device)
584{
585 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
586 return device_table[snd_device];
587 else
588 return "";
589}
590
Ravi Kumar Alamanda48c921d2013-10-29 06:07:44 -0700591int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
592 char *device_name)
593{
594 struct platform_data *my_data = (struct platform_data *)platform;
595
596 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
597 strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
598 hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
599 } else {
600 strlcpy(device_name, "", DEVICE_NAME_MAX_SIZE);
601 return -EINVAL;
602 }
603
604 return 0;
605}
606
Eric Laurentb23d5282013-05-14 15:27:20 -0700607void platform_add_backend_name(char *mixer_path, snd_device_t snd_device)
608{
609 if (snd_device == SND_DEVICE_IN_BT_SCO_MIC)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700610 strlcat(mixer_path, " bt-sco", MIXER_PATH_MAX_LENGTH);
611 else if (snd_device == SND_DEVICE_IN_BT_SCO_MIC_WB)
612 strlcat(mixer_path, " bt-sco-wb", MIXER_PATH_MAX_LENGTH);
Eric Laurentb23d5282013-05-14 15:27:20 -0700613 else if(snd_device == SND_DEVICE_OUT_BT_SCO)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700614 strlcat(mixer_path, " bt-sco", MIXER_PATH_MAX_LENGTH);
615 else if(snd_device == SND_DEVICE_OUT_BT_SCO_WB)
616 strlcat(mixer_path, " bt-sco-wb", MIXER_PATH_MAX_LENGTH);
Eric Laurentb23d5282013-05-14 15:27:20 -0700617 else if (snd_device == SND_DEVICE_OUT_HDMI)
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700618 strlcat(mixer_path, " hdmi", MIXER_PATH_MAX_LENGTH);
Eric Laurentb23d5282013-05-14 15:27:20 -0700619 else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI)
620 strcat(mixer_path, " speaker-and-hdmi");
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700621 else if (snd_device == SND_DEVICE_OUT_AFE_PROXY)
622 strlcat(mixer_path, " afe-proxy", MIXER_PATH_MAX_LENGTH);
623 else if (snd_device == SND_DEVICE_OUT_USB_HEADSET)
624 strlcat(mixer_path, " usb-headphones", MIXER_PATH_MAX_LENGTH);
625 else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET)
626 strlcat(mixer_path, " speaker-and-usb-headphones",
627 MIXER_PATH_MAX_LENGTH);
628 else if (snd_device == SND_DEVICE_IN_USB_HEADSET_MIC)
629 strlcat(mixer_path, " usb-headset-mic", MIXER_PATH_MAX_LENGTH);
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700630 else if (snd_device == SND_DEVICE_IN_CAPTURE_FM)
631 strlcat(mixer_path, " capture-fm", MIXER_PATH_MAX_LENGTH);
632 else if (snd_device == SND_DEVICE_OUT_TRANSMISSION_FM)
633 strlcat(mixer_path, " transmission-fm", MIXER_PATH_MAX_LENGTH);
Eric Laurentb23d5282013-05-14 15:27:20 -0700634}
635
636int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
637{
638 int device_id;
639 if (device_type == PCM_PLAYBACK)
640 device_id = pcm_device_table[usecase][0];
641 else
642 device_id = pcm_device_table[usecase][1];
643 return device_id;
644}
645
646int platform_send_audio_calibration(void *platform, snd_device_t snd_device)
647{
648 struct platform_data *my_data = (struct platform_data *)platform;
649 int acdb_dev_id, acdb_dev_type;
650
651 acdb_dev_id = acdb_device_table[snd_device];
652 if (acdb_dev_id < 0) {
653 ALOGE("%s: Could not find acdb id for device(%d)",
654 __func__, snd_device);
655 return -EINVAL;
656 }
657 if (my_data->acdb_send_audio_cal) {
Eric Laurent994a6932013-07-17 11:51:42 -0700658 ("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
Eric Laurentb23d5282013-05-14 15:27:20 -0700659 __func__, snd_device, acdb_dev_id);
660 if (snd_device >= SND_DEVICE_OUT_BEGIN &&
661 snd_device < SND_DEVICE_OUT_END)
662 acdb_dev_type = ACDB_DEV_TYPE_OUT;
663 else
664 acdb_dev_type = ACDB_DEV_TYPE_IN;
665 my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type);
666 }
667 return 0;
668}
669
670int platform_switch_voice_call_device_pre(void *platform)
671{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800672 struct platform_data *my_data = (struct platform_data *)platform;
673 int ret = 0;
674
Vidyakumar Athota1fd21792013-11-15 14:50:57 -0800675 if (my_data->csd != NULL &&
676 my_data->adev->mode == AUDIO_MODE_IN_CALL) {
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800677 /* This must be called before disabling mixer controls on APQ side */
678 ret = my_data->csd->disable_device();
679 if (ret < 0) {
680 ALOGE("%s: csd_client_disable_device, failed, error %d",
681 __func__, ret);
682 }
683 }
684 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700685}
686
687int platform_switch_voice_call_device_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
694 if (my_data->acdb_send_voice_cal == NULL) {
695 ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
696 } else {
Vidyakumar Athota1fd21792013-11-15 14:50:57 -0800697 acdb_rx_id = acdb_device_table[out_snd_device];
698 acdb_tx_id = acdb_device_table[in_snd_device];
699
Eric Laurentb23d5282013-05-14 15:27:20 -0700700 if (acdb_rx_id > 0 && acdb_tx_id > 0)
701 my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id);
702 else
703 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
704 acdb_rx_id, acdb_tx_id);
705 }
706
Vidyakumar Athota1fd21792013-11-15 14:50:57 -0800707 return 0;
708}
709
710int platform_switch_voice_call_usecase_route_post(void *platform,
711 snd_device_t out_snd_device,
712 snd_device_t in_snd_device)
713{
714 struct platform_data *my_data = (struct platform_data *)platform;
715 int acdb_rx_id, acdb_tx_id;
716 int ret = 0;
717
718 acdb_rx_id = acdb_device_table[out_snd_device];
719 acdb_tx_id = acdb_device_table[in_snd_device];
720
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800721 if (my_data->csd != NULL) {
Vidyakumar Athota1fd21792013-11-15 14:50:57 -0800722 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800723 ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id,
724 my_data->adev->acdb_settings);
725 if (ret < 0) {
726 ALOGE("%s: csd_enable_device, failed, error %d",
727 __func__, ret);
728 }
729 } else {
730 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
731 acdb_rx_id, acdb_tx_id);
732 }
733 }
734 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700735}
736
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800737int platform_start_voice_call(void *platform, uint32_t vsid)
Eric Laurentb23d5282013-05-14 15:27:20 -0700738{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800739 struct platform_data *my_data = (struct platform_data *)platform;
740 int ret = 0;
741
742 if (my_data->csd != NULL) {
743 ret = my_data->csd->start_voice(vsid);
744 if (ret < 0) {
745 ALOGE("%s: csd_start_voice error %d\n", __func__, ret);
746 }
747 }
748 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700749}
750
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800751int platform_stop_voice_call(void *platform, uint32_t vsid)
Eric Laurentb23d5282013-05-14 15:27:20 -0700752{
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800753 struct platform_data *my_data = (struct platform_data *)platform;
754 int ret = 0;
755
756 if (my_data->csd != NULL) {
757 ret = my_data->csd->stop_voice(vsid);
758 if (ret < 0) {
759 ALOGE("%s: csd_stop_voice error %d\n", __func__, ret);
760 }
761 }
762 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700763}
764
765int platform_set_voice_volume(void *platform, int volume)
766{
767 struct platform_data *my_data = (struct platform_data *)platform;
768 struct audio_device *adev = my_data->adev;
769 struct mixer_ctl *ctl;
sangwoo53b2cf02013-07-25 19:18:44 -0700770 const char *mixer_ctl_name = "Voice Rx Gain";
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800771 int vol_index = 0, ret = 0;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700772 uint32_t set_values[ ] = {0,
773 ALL_SESSION_VSID,
774 DEFAULT_VOLUME_RAMP_DURATION_MS};
Eric Laurentb23d5282013-05-14 15:27:20 -0700775
776 // Voice volume levels are mapped to adsp volume levels as follows.
777 // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1 0 -> 0
778 // But this values don't changed in kernel. So, below change is need.
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700779 vol_index = (int)percent_to_index(volume, MIN_VOL_INDEX, MAX_VOL_INDEX);
780 set_values[0] = vol_index;
Eric Laurentb23d5282013-05-14 15:27:20 -0700781
782 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
783 if (!ctl) {
784 ALOGE("%s: Could not get ctl for mixer cmd - %s",
785 __func__, mixer_ctl_name);
786 return -EINVAL;
787 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700788 ALOGV("Setting voice volume index: %d", set_values[0]);
789 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Eric Laurentb23d5282013-05-14 15:27:20 -0700790
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800791 if (my_data->csd != NULL) {
792 ret = my_data->csd->volume(ALL_SESSION_VSID, volume);
793 if (ret < 0) {
794 ALOGE("%s: csd_volume error %d", __func__, ret);
795 }
796 }
797 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700798}
799
800int platform_set_mic_mute(void *platform, bool state)
801{
802 struct platform_data *my_data = (struct platform_data *)platform;
803 struct audio_device *adev = my_data->adev;
804 struct mixer_ctl *ctl;
805 const char *mixer_ctl_name = "Voice Tx Mute";
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800806 int ret = 0;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700807 uint32_t set_values[ ] = {0,
808 ALL_SESSION_VSID,
809 DEFAULT_VOLUME_RAMP_DURATION_MS};
Eric Laurentb23d5282013-05-14 15:27:20 -0700810
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800811 set_values[0] = state;
812 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
813 if (!ctl) {
814 ALOGE("%s: Could not get ctl for mixer cmd - %s",
815 __func__, mixer_ctl_name);
816 return -EINVAL;
817 }
818 ALOGV("Setting voice mute state: %d", state);
819 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Eric Laurentb23d5282013-05-14 15:27:20 -0700820
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800821 if (my_data->csd != NULL) {
822 ret = my_data->csd->mic_mute(ALL_SESSION_VSID, state);
823 if (ret < 0) {
824 ALOGE("%s: csd_mic_mute error %d", __func__, ret);
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -0800825 }
826 }
827 return ret;
Eric Laurentb23d5282013-05-14 15:27:20 -0700828}
829
830snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devices)
831{
832 struct platform_data *my_data = (struct platform_data *)platform;
833 struct audio_device *adev = my_data->adev;
834 audio_mode_t mode = adev->mode;
835 snd_device_t snd_device = SND_DEVICE_NONE;
836
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700837 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
838 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
839 int channel_count = popcount(channel_mask);
840
Eric Laurentb23d5282013-05-14 15:27:20 -0700841 ALOGV("%s: enter: output devices(%#x)", __func__, devices);
842 if (devices == AUDIO_DEVICE_NONE ||
843 devices & AUDIO_DEVICE_BIT_IN) {
844 ALOGV("%s: Invalid output devices (%#x)", __func__, devices);
845 goto exit;
846 }
847
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800848 if ((mode == AUDIO_MODE_IN_CALL) ||
849 voice_extn_compress_voip_is_active(adev)) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700850 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
851 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800852 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
853 !voice_extn_compress_voip_is_active(adev)) {
854 switch (adev->voice.tty_mode) {
855 case TTY_MODE_FULL:
856 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
857 break;
858 case TTY_MODE_VCO:
859 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
860 break;
861 case TTY_MODE_HCO:
862 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
863 break;
864 default:
865 ALOGE("%s: Invalid TTY mode (%#x)",
866 __func__, adev->voice.tty_mode);
867 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700868 } else if (audio_extn_get_anc_enabled()) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700869 if (audio_extn_should_use_fb_anc())
870 snd_device = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
871 else
872 snd_device = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700873 } else {
Eric Laurentb23d5282013-05-14 15:27:20 -0700874 snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700875 }
Eric Laurentb23d5282013-05-14 15:27:20 -0700876 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700877 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
878 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
879 else
880 snd_device = SND_DEVICE_OUT_BT_SCO;
Eric Laurentb23d5282013-05-14 15:27:20 -0700881 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
882 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700883 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
884 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
885 snd_device = SND_DEVICE_OUT_USB_HEADSET;
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700886 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
887 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -0700888 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
Ravi Kumar Alamandaceb40822013-11-06 11:01:47 -0800889 if (audio_extn_should_use_handset_anc(channel_count))
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700890 snd_device = SND_DEVICE_OUT_ANC_HANDSET;
Eric Laurentb23d5282013-05-14 15:27:20 -0700891 else
Mingming Yin8e5a4f62013-10-07 15:23:41 -0700892 snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
Eric Laurentb23d5282013-05-14 15:27:20 -0700893 }
894 if (snd_device != SND_DEVICE_NONE) {
895 goto exit;
896 }
897 }
898
899 if (popcount(devices) == 2) {
900 if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
901 AUDIO_DEVICE_OUT_SPEAKER)) {
902 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
903 } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
904 AUDIO_DEVICE_OUT_SPEAKER)) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700905 if (audio_extn_get_anc_enabled())
906 snd_device = SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET;
907 else
908 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
Eric Laurentb23d5282013-05-14 15:27:20 -0700909 } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL |
910 AUDIO_DEVICE_OUT_SPEAKER)) {
911 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700912 } else if (devices == (AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
913 AUDIO_DEVICE_OUT_SPEAKER)) {
914 snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
Eric Laurentb23d5282013-05-14 15:27:20 -0700915 } else {
916 ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
917 goto exit;
918 }
919 if (snd_device != SND_DEVICE_NONE) {
920 goto exit;
921 }
922 }
923
924 if (popcount(devices) != 1) {
925 ALOGE("%s: Invalid output devices(%#x)", __func__, devices);
926 goto exit;
927 }
928
929 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
930 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700931 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADSET
932 && audio_extn_get_anc_enabled()) {
933 if (audio_extn_should_use_fb_anc())
934 snd_device = SND_DEVICE_OUT_ANC_FB_HEADSET;
935 else
936 snd_device = SND_DEVICE_OUT_ANC_HEADSET;
937 }
938 else
939 snd_device = SND_DEVICE_OUT_HEADPHONES;
Eric Laurentb23d5282013-05-14 15:27:20 -0700940 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
941 if (adev->speaker_lr_swap)
942 snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
943 else
944 snd_device = SND_DEVICE_OUT_SPEAKER;
945 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700946 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
947 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
948 else
949 snd_device = SND_DEVICE_OUT_BT_SCO;
Eric Laurentb23d5282013-05-14 15:27:20 -0700950 } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
951 snd_device = SND_DEVICE_OUT_HDMI ;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700952 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
953 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
954 snd_device = SND_DEVICE_OUT_USB_HEADSET;
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -0700955 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
956 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -0700957 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
958 snd_device = SND_DEVICE_OUT_HANDSET;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -0700959 } else if (devices & AUDIO_DEVICE_OUT_PROXY) {
960 ALOGD("%s: setting sink capability for Proxy", __func__);
961 audio_extn_set_afe_proxy_channel_mixer(adev);
962 snd_device = SND_DEVICE_OUT_AFE_PROXY;
Eric Laurentb23d5282013-05-14 15:27:20 -0700963 } else {
964 ALOGE("%s: Unknown device(s) %#x", __func__, devices);
965 }
966exit:
967 ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]);
968 return snd_device;
969}
970
971snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device)
972{
973 struct platform_data *my_data = (struct platform_data *)platform;
974 struct audio_device *adev = my_data->adev;
975 audio_source_t source = (adev->active_input == NULL) ?
976 AUDIO_SOURCE_DEFAULT : adev->active_input->source;
977
978 audio_mode_t mode = adev->mode;
979 audio_devices_t in_device = ((adev->active_input == NULL) ?
980 AUDIO_DEVICE_NONE : adev->active_input->device)
981 & ~AUDIO_DEVICE_BIT_IN;
982 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
983 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
984 snd_device_t snd_device = SND_DEVICE_NONE;
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -0700985 int channel_count = popcount(channel_mask);
Eric Laurentb23d5282013-05-14 15:27:20 -0700986
987 ALOGV("%s: enter: out_device(%#x) in_device(%#x)",
988 __func__, out_device, in_device);
Helen Zeng067b96b2013-11-26 12:10:29 -0800989 if ((out_device != AUDIO_DEVICE_NONE) && ((mode == AUDIO_MODE_IN_CALL) ||
990 voice_extn_compress_voip_is_active(adev))) {
Narsinga Rao Chella05573b72013-11-15 15:21:40 -0800991 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
992 !voice_extn_compress_voip_is_active(adev)) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700993 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
994 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -0700995 switch (adev->voice.tty_mode) {
Eric Laurentb23d5282013-05-14 15:27:20 -0700996 case TTY_MODE_FULL:
997 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC;
998 break;
999 case TTY_MODE_VCO:
1000 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
1001 break;
1002 case TTY_MODE_HCO:
1003 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC;
1004 break;
1005 default:
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001006 ALOGE("%s: Invalid TTY mode (%#x)",
1007 __func__, adev->voice.tty_mode);
Eric Laurentb23d5282013-05-14 15:27:20 -07001008 }
1009 goto exit;
1010 }
1011 }
1012 if (out_device & AUDIO_DEVICE_OUT_EARPIECE ||
1013 out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
Apoorv Raghuvanshi9eaf94e2013-10-04 16:13:44 -07001014 if (out_device & AUDIO_DEVICE_OUT_EARPIECE &&
1015 audio_extn_should_use_handset_anc(channel_count)) {
1016 snd_device = SND_DEVICE_IN_AANC_HANDSET_MIC;
1017 } else if (my_data->fluence_type == FLUENCE_NONE ||
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001018 my_data->fluence_in_voice_call == false) {
Eric Laurentb23d5282013-05-14 15:27:20 -07001019 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Laxminath Kasam7294f522013-12-11 05:07:00 +05301020 set_echo_reference(adev->mixer, EC_REF_RX);
Eric Laurentb23d5282013-05-14 15:27:20 -07001021 } else {
Ravi Kumar Alamandaceb40822013-11-06 11:01:47 -08001022 snd_device = SND_DEVICE_IN_VOICE_DMIC;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001023 adev->acdb_settings |= DMIC_FLAG;
Eric Laurentb23d5282013-05-14 15:27:20 -07001024 }
1025 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
1026 snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
1027 } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001028 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
1029 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
1030 else
1031 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001032 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001033 if (my_data->fluence_type != FLUENCE_NONE &&
1034 my_data->fluence_in_voice_call &&
1035 my_data->fluence_in_spkr_mode) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001036 if(my_data->fluence_type & FLUENCE_QUAD_MIC) {
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001037 adev->acdb_settings |= QMIC_FLAG;
1038 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_QMIC;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001039 } else {
1040 adev->acdb_settings |= DMIC_FLAG;
1041 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001042 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001043 } else {
1044 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
1045 }
1046 }
1047 } else if (source == AUDIO_SOURCE_CAMCORDER) {
1048 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
1049 in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1050 snd_device = SND_DEVICE_IN_CAMCORDER_MIC;
1051 }
1052 } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) {
1053 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001054 if (channel_count == 2) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001055 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_STEREO;
Mingming Yin8e5a4f62013-10-07 15:23:41 -07001056 adev->acdb_settings |= DMIC_FLAG;
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001057 } else if (adev->active_input->enable_ns)
1058 snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS;
1059 else if (my_data->fluence_type != FLUENCE_NONE &&
1060 my_data->fluence_in_voice_rec) {
1061 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
1062 adev->acdb_settings |= DMIC_FLAG;
1063 } else {
1064 snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
1065 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001066 }
1067 } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
1068 if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
1069 in_device = AUDIO_DEVICE_IN_BACK_MIC;
1070 if (adev->active_input) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001071 if (adev->active_input->enable_aec &&
1072 adev->active_input->enable_ns) {
Eric Laurentb23d5282013-05-14 15:27:20 -07001073 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001074 if (my_data->fluence_type & FLUENCE_DUAL_MIC &&
1075 my_data->fluence_in_spkr_mode) {
1076 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
1077 adev->acdb_settings |= DMIC_FLAG;
1078 } else
1079 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
Eric Laurentb23d5282013-05-14 15:27:20 -07001080 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001081 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1082 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
1083 adev->acdb_settings |= DMIC_FLAG;
1084 } else
1085 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
Eric Laurentb23d5282013-05-14 15:27:20 -07001086 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001087 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
Eric Laurentb23d5282013-05-14 15:27:20 -07001088 }
Laxminath Kasam7294f522013-12-11 05:07:00 +05301089 set_echo_reference(adev->mixer, EC_REF_RX);
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001090 } else if (adev->active_input->enable_aec) {
1091 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1092 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1093 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
1094 adev->acdb_settings |= DMIC_FLAG;
1095 } else
1096 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
1097 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
1098 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1099 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
1100 adev->acdb_settings |= DMIC_FLAG;
1101 } else
1102 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC;
1103 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1104 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
1105 }
Laxminath Kasam7294f522013-12-11 05:07:00 +05301106 set_echo_reference(adev->mixer, EC_REF_RX);
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001107 } else if (adev->active_input->enable_ns) {
1108 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1109 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1110 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
1111 adev->acdb_settings |= DMIC_FLAG;
1112 } else
1113 snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS;
1114 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
1115 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1116 snd_device = SND_DEVICE_IN_HANDSET_DMIC_NS;
1117 adev->acdb_settings |= DMIC_FLAG;
1118 } else
1119 snd_device = SND_DEVICE_IN_HANDSET_MIC_NS;
1120 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1121 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
1122 }
1123 set_echo_reference(adev->mixer, "NONE");
Eric Laurentb23d5282013-05-14 15:27:20 -07001124 } else
1125 set_echo_reference(adev->mixer, "NONE");
1126 }
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001127 } else if (source == AUDIO_SOURCE_MIC) {
Apoorv Raghuvanshic0536542013-11-14 16:25:59 -08001128 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC &&
1129 channel_count == 1 ) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001130 if(my_data->fluence_type & FLUENCE_DUAL_MIC &&
1131 my_data->fluence_in_audio_rec)
1132 snd_device = SND_DEVICE_IN_HANDSET_DMIC;
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001133 }
Mingming Yinab429782013-11-07 11:16:55 -08001134 } else if (source == AUDIO_SOURCE_FM_RX ||
Ravi Kumar Alamanda198185e2013-11-07 15:42:19 -08001135 source == AUDIO_SOURCE_FM_RX_A2DP) {
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07001136 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07001137 } else if (source == AUDIO_SOURCE_DEFAULT) {
1138 goto exit;
1139 }
1140
1141
1142 if (snd_device != SND_DEVICE_NONE) {
1143 goto exit;
1144 }
1145
1146 if (in_device != AUDIO_DEVICE_NONE &&
1147 !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) &&
1148 !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) {
1149 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07001150 if (audio_extn_ssr_get_enabled() && channel_count == 6)
1151 snd_device = SND_DEVICE_IN_QUAD_MIC;
Ravi Kumar Alamandafae42112013-11-07 23:31:54 -08001152 else if (channel_count == 2)
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07001153 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
Apoorv Raghuvanshi6178a3f2013-10-19 12:38:54 -07001154 else
1155 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001156 } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1157 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
1158 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1159 snd_device = SND_DEVICE_IN_HEADSET_MIC;
1160 } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001161 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
1162 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
1163 else
1164 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001165 } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
1166 snd_device = SND_DEVICE_IN_HDMI_MIC;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07001167 } else if (in_device & AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET ||
1168 in_device & AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET) {
1169 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Apoorv Raghuvanshi6e262842013-10-06 14:39:35 -07001170 } else if (in_device & AUDIO_DEVICE_IN_FM_RX) {
1171 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Eric Laurentb23d5282013-05-14 15:27:20 -07001172 } else {
1173 ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
1174 ALOGW("%s: Using default handset-mic", __func__);
1175 snd_device = SND_DEVICE_IN_HANDSET_MIC;
1176 }
1177 } else {
1178 if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
1179 snd_device = SND_DEVICE_IN_HANDSET_MIC;
1180 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
1181 snd_device = SND_DEVICE_IN_HEADSET_MIC;
1182 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Apoorv Raghuvanshi6bd8dbf2013-10-19 18:37:52 -07001183 if (channel_count > 1)
1184 snd_device = SND_DEVICE_IN_SPEAKER_STEREO_DMIC;
1185 else
1186 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001187 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
1188 snd_device = SND_DEVICE_IN_HANDSET_MIC;
1189 } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001190 if (my_data->btsco_sample_rate == SAMPLE_RATE_16KHZ)
1191 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
1192 else
1193 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001194 } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
1195 snd_device = SND_DEVICE_IN_HDMI_MIC;
Apoorv Raghuvanshi5792d4b2013-10-07 18:40:05 -07001196 } else if (out_device & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
1197 out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
1198 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Eric Laurentb23d5282013-05-14 15:27:20 -07001199 } else {
1200 ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
1201 ALOGW("%s: Using default handset-mic", __func__);
1202 snd_device = SND_DEVICE_IN_HANDSET_MIC;
1203 }
1204 }
1205exit:
1206 ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
1207 return snd_device;
1208}
1209
1210int platform_set_hdmi_channels(void *platform, int channel_count)
1211{
1212 struct platform_data *my_data = (struct platform_data *)platform;
1213 struct audio_device *adev = my_data->adev;
1214 struct mixer_ctl *ctl;
1215 const char *channel_cnt_str = NULL;
1216 const char *mixer_ctl_name = "HDMI_RX Channels";
1217 switch (channel_count) {
1218 case 8:
1219 channel_cnt_str = "Eight"; break;
1220 case 7:
1221 channel_cnt_str = "Seven"; break;
1222 case 6:
1223 channel_cnt_str = "Six"; break;
1224 case 5:
1225 channel_cnt_str = "Five"; break;
1226 case 4:
1227 channel_cnt_str = "Four"; break;
1228 case 3:
1229 channel_cnt_str = "Three"; break;
1230 default:
1231 channel_cnt_str = "Two"; break;
1232 }
1233 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1234 if (!ctl) {
1235 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1236 __func__, mixer_ctl_name);
1237 return -EINVAL;
1238 }
1239 ALOGV("HDMI channel count: %s", channel_cnt_str);
1240 mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
1241 return 0;
1242}
1243
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001244int platform_edid_get_max_channels(void *platform)
Eric Laurentb23d5282013-05-14 15:27:20 -07001245{
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001246 struct platform_data *my_data = (struct platform_data *)platform;
1247 struct audio_device *adev = my_data->adev;
Eric Laurentb23d5282013-05-14 15:27:20 -07001248 char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE];
1249 char *sad = block;
1250 int num_audio_blocks;
1251 int channel_count;
1252 int max_channels = 0;
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001253 int i, ret, count;
Eric Laurentb23d5282013-05-14 15:27:20 -07001254
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001255 struct mixer_ctl *ctl;
1256
1257 ctl = mixer_get_ctl_by_name(adev->mixer, AUDIO_DATA_BLOCK_MIXER_CTL);
1258 if (!ctl) {
1259 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1260 __func__, AUDIO_DATA_BLOCK_MIXER_CTL);
Eric Laurentb23d5282013-05-14 15:27:20 -07001261 return 0;
1262 }
1263
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001264 mixer_ctl_update(ctl);
1265
1266 count = mixer_ctl_get_num_values(ctl);
Eric Laurentb23d5282013-05-14 15:27:20 -07001267
1268 /* Read SAD blocks, clamping the maximum size for safety */
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001269 if (count > (int)sizeof(block))
1270 count = (int)sizeof(block);
Eric Laurentb23d5282013-05-14 15:27:20 -07001271
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001272 ret = mixer_ctl_get_array(ctl, block, count);
1273 if (ret != 0) {
1274 ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__);
1275 return 0;
1276 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001277
1278 /* Calculate the number of SAD blocks */
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001279 num_audio_blocks = count / SAD_BLOCK_SIZE;
Eric Laurentb23d5282013-05-14 15:27:20 -07001280
1281 for (i = 0; i < num_audio_blocks; i++) {
1282 /* Only consider LPCM blocks */
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001283 if ((sad[0] >> 3) != EDID_FORMAT_LPCM) {
1284 sad += 3;
Eric Laurentb23d5282013-05-14 15:27:20 -07001285 continue;
Haynes Mathew George47cd4cb2013-07-19 11:58:50 -07001286 }
Eric Laurentb23d5282013-05-14 15:27:20 -07001287
1288 channel_count = (sad[0] & 0x7) + 1;
1289 if (channel_count > max_channels)
1290 max_channels = channel_count;
1291
1292 /* Advance to next block */
1293 sad += 3;
1294 }
1295
1296 return max_channels;
1297}
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001298
1299static int platform_set_slowtalk(struct platform_data *my_data, bool state)
1300{
1301 int ret = 0;
1302 struct audio_device *adev = my_data->adev;
1303 struct mixer_ctl *ctl;
1304 const char *mixer_ctl_name = "Slowtalk Enable";
1305 uint32_t set_values[ ] = {0,
1306 ALL_SESSION_VSID};
1307
1308 set_values[0] = state;
1309 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1310 if (!ctl) {
1311 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1312 __func__, mixer_ctl_name);
1313 ret = -EINVAL;
1314 } else {
1315 ALOGV("Setting slowtalk state: %d", state);
1316 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
1317 my_data->slowtalk = state;
1318 }
1319
Vidyakumar Athotad9d9ff32013-11-13 11:46:52 -08001320 if (my_data->csd != NULL) {
1321 ret = my_data->csd->slow_talk(ALL_SESSION_VSID, state);
1322 if (ret < 0) {
1323 ALOGE("%s: csd_client_disable_device, failed, error %d",
1324 __func__, ret);
1325 }
1326 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001327 return ret;
1328}
1329
1330int platform_set_parameters(void *platform, struct str_parms *parms)
1331{
1332 struct platform_data *my_data = (struct platform_data *)platform;
1333 char *str;
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08001334 char value[256] = {0};
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001335 int val;
1336 int ret = 0;
1337
1338 ALOGV("%s: enter: %s", __func__, str_parms_to_str(parms));
1339
1340 ret = str_parms_get_int(parms, AUDIO_PARAMETER_KEY_BTSCO, &val);
1341 if (ret >= 0) {
1342 str_parms_del(parms, AUDIO_PARAMETER_KEY_BTSCO);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001343 my_data->btsco_sample_rate = val;
Vidyakumar Athota67c42712013-12-04 14:03:06 -08001344 if (val == SAMPLE_RATE_16KHZ) {
1345 audio_route_apply_path(my_data->adev->audio_route,
1346 "bt-sco-wb-samplerate");
1347 audio_route_update_mixer(my_data->adev->audio_route);
1348 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001349 }
1350
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08001351 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_SLOWTALK, value, sizeof(value));
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001352 if (ret >= 0) {
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08001353 bool state = false;
1354 if (!strncmp("true", value, sizeof("true"))) {
1355 state = true;
1356 }
1357
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001358 str_parms_del(parms, AUDIO_PARAMETER_KEY_SLOWTALK);
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08001359 ret = platform_set_slowtalk(my_data, state);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001360 if (ret)
1361 ALOGE("%s: Failed to set slow talk err: %d", __func__, ret);
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001362 }
1363
1364 ALOGV("%s: exit with code(%d)", __func__, ret);
1365 return ret;
1366}
1367
Vidyakumar Athota2850d532013-11-19 16:02:12 -08001368int platform_set_incall_recording_session_id(void *platform,
1369 uint32_t session_id, int rec_mode)
Shiv Maliyappanahallida107642013-10-17 11:16:13 -07001370{
1371 int ret = 0;
1372 struct platform_data *my_data = (struct platform_data *)platform;
1373 struct audio_device *adev = my_data->adev;
1374 struct mixer_ctl *ctl;
1375 const char *mixer_ctl_name = "Voc VSID";
1376 int num_ctl_values;
1377 int i;
1378
1379 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1380 if (!ctl) {
1381 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1382 __func__, mixer_ctl_name);
1383 ret = -EINVAL;
1384 } else {
1385 num_ctl_values = mixer_ctl_get_num_values(ctl);
1386 for (i = 0; i < num_ctl_values; i++) {
1387 if (mixer_ctl_set_value(ctl, i, session_id)) {
1388 ALOGV("Error: invalid session_id: %x", session_id);
1389 ret = -EINVAL;
1390 break;
1391 }
1392 }
1393 }
1394
Vidyakumar Athota2850d532013-11-19 16:02:12 -08001395 if (my_data->csd != NULL) {
1396 ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode);
1397 if (ret < 0) {
1398 ALOGE("%s: csd_client_start_record failed, error %d",
1399 __func__, ret);
1400 }
1401 }
1402
1403 return ret;
1404}
1405
1406int platform_stop_incall_recording_usecase(void *platform)
1407{
1408 int ret = 0;
1409 struct platform_data *my_data = (struct platform_data *)platform;
1410
1411 if (my_data->csd != NULL) {
1412 ret = my_data->csd->stop_record(ALL_SESSION_VSID);
1413 if (ret < 0) {
1414 ALOGE("%s: csd_client_stop_record failed, error %d",
1415 __func__, ret);
1416 }
1417 }
1418
1419 return ret;
1420}
1421
1422int platform_start_incall_music_usecase(void *platform)
1423{
1424 int ret = 0;
1425 struct platform_data *my_data = (struct platform_data *)platform;
1426
1427 if (my_data->csd != NULL) {
1428 ret = my_data->csd->start_playback(ALL_SESSION_VSID);
1429 if (ret < 0) {
1430 ALOGE("%s: csd_client_start_playback failed, error %d",
1431 __func__, ret);
1432 }
1433 }
1434
1435 return ret;
1436}
1437
1438int platform_stop_incall_music_usecase(void *platform)
1439{
1440 int ret = 0;
1441 struct platform_data *my_data = (struct platform_data *)platform;
1442
1443 if (my_data->csd != NULL) {
1444 ret = my_data->csd->stop_playback(ALL_SESSION_VSID);
1445 if (ret < 0) {
1446 ALOGE("%s: csd_client_stop_playback failed, error %d",
1447 __func__, ret);
1448 }
1449 }
1450
Shiv Maliyappanahallida107642013-10-17 11:16:13 -07001451 return ret;
1452}
1453
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001454void platform_get_parameters(void *platform,
1455 struct str_parms *query,
1456 struct str_parms *reply)
1457{
1458 struct platform_data *my_data = (struct platform_data *)platform;
1459 char *str = NULL;
1460 char value[256] = {0};
1461 int ret;
1462 int fluence_type;
1463
1464 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_FLUENCE_TYPE,
1465 value, sizeof(value));
1466 if (ret >= 0) {
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001467 if (my_data->fluence_type & FLUENCE_QUAD_MIC) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001468 strlcpy(value, "fluencepro", sizeof(value));
Ravi Kumar Alamandab034ddb2013-11-06 15:52:18 -08001469 } else if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001470 strlcpy(value, "fluence", sizeof(value));
1471 } else {
1472 strlcpy(value, "none", sizeof(value));
1473 }
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001474
1475 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_FLUENCE_TYPE, value);
1476 }
1477
Shiv Maliyappanahalli9d899292013-11-20 14:43:01 -08001478 memset(value, 0, sizeof(value));
1479 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_SLOWTALK,
1480 value, sizeof(value));
1481 if (ret >= 0) {
Vidyakumar Athota3ade2792013-12-02 11:02:20 -08001482 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_SLOWTALK,
1483 my_data->slowtalk?"true":"false");
Shiv Maliyappanahalli9d899292013-11-20 14:43:01 -08001484 }
1485
Shiv Maliyappanahalli34b585f2013-10-01 15:49:05 -07001486 ALOGV("%s: exit: returns - %s", __func__, str_parms_to_str(reply));
1487}
1488
Haynes Mathew George7ff216f2013-09-11 19:51:41 -07001489/* Delay in Us */
1490int64_t platform_render_latency(audio_usecase_t usecase)
1491{
1492 switch (usecase) {
1493 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
1494 return DEEP_BUFFER_PLATFORM_DELAY;
1495 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
1496 return LOW_LATENCY_PLATFORM_DELAY;
1497 default:
1498 return 0;
1499 }
1500}
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07001501
Mingming Yine62d7842013-10-25 16:26:03 -07001502int platform_update_usecase_from_source(int source, int usecase)
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07001503{
Mingming Yinab429782013-11-07 11:16:55 -08001504 ALOGV("%s: input source :%d", __func__, source);
1505 if(source == AUDIO_SOURCE_FM_RX_A2DP)
Mingming Yine62d7842013-10-25 16:26:03 -07001506 usecase = USECASE_AUDIO_RECORD_FM_VIRTUAL;
1507 return usecase;
Preetam Singh Ranawatde84f1a2013-11-01 14:58:16 -07001508}
Kiran Kandide144c82013-11-20 15:58:32 -08001509
1510bool platform_listen_update_status(snd_device_t snd_device)
1511{
1512 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
1513 (snd_device < SND_DEVICE_IN_END) &&
1514 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
1515 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
1516 return true;
1517 else
1518 return false;
1519}