blob: 23c278ed089fdc915f89a47aa32ab161f1cf1428 [file] [log] [blame]
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301/*
sriram kumarcd549b02021-02-12 14:27:17 +05302* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303*
4* Redistribution and use in source and binary forms, with or without
5* modification, are permitted provided that the following conditions are
6* met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above
10* copyright notice, this list of conditions and the following
11* disclaimer in the documentation and/or other materials provided
12* with the distribution.
13* * Neither the name of The Linux Foundation nor the names of its
14* contributors may be used to endorse or promote products derived
15* from this software without specific prior written permission.
16*
17* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
Aalique Grahame22e49102018-12-18 14:23:57 -080029#define LOG_TAG "a2dp_offload"
Naresh Tanniru9d027a62015-03-13 01:32:10 +053030/*#define LOG_NDEBUG 0*/
31#define LOG_NDDEBUG 0
32#include <errno.h>
Aalique Grahame22e49102018-12-18 14:23:57 -080033#include <log/log.h>
Naresh Tanniru9d027a62015-03-13 01:32:10 +053034#include <dlfcn.h>
Aalique Grahame22e49102018-12-18 14:23:57 -080035#include <pthread.h>
Naresh Tanniru9d027a62015-03-13 01:32:10 +053036#include "audio_hw.h"
37#include "platform.h"
38#include "platform_api.h"
Manish Dewangan6a252632017-12-04 17:27:44 +053039#include "audio_extn.h"
Naresh Tanniru9d027a62015-03-13 01:32:10 +053040#include <stdlib.h>
41#include <cutils/str_parms.h>
42#include <hardware/audio.h>
43#include <hardware/hardware.h>
44#include <cutils/properties.h>
45
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +053046#ifdef DYNAMIC_LOG_ENABLED
47#include <log_xml_parser.h>
48#define LOG_MASK HAL_MOD_FILE_A2DP
49#include <log_utils.h>
50#endif
51
Naresh Tanniru66cf06c2019-03-20 19:30:37 +053052#define BT_IPC_SOURCE_LIB_NAME "btaudio_offload_if.so"
Florian Pfister1a84f312018-07-19 14:38:18 +020053#define BT_IPC_SINK_LIB_NAME "libbthost_if_sink.so"
54#define MEDIA_FMT_NONE 0
55#define MEDIA_FMT_AAC 0x00010DA6
56#define MEDIA_FMT_APTX 0x000131ff
57#define MEDIA_FMT_APTX_HD 0x00013200
Surendar Karka2febd452018-12-13 17:56:43 +053058#define MEDIA_FMT_APTX_AD 0x00013204
Florian Pfister1a84f312018-07-19 14:38:18 +020059#define MEDIA_FMT_SBC 0x00010BF2
60#define MEDIA_FMT_CELT 0x00013221
61#define MEDIA_FMT_LDAC 0x00013224
62#define MEDIA_FMT_MP3 0x00010BE9
63#define MEDIA_FMT_APTX_ADAPTIVE 0x00013204
Zhou Song12c29502019-03-16 10:37:18 +080064#define MEDIA_FMT_APTX_AD_SPEECH 0x00013208
Manisha Agarwald45632b2019-10-17 18:14:28 +080065#define MEDIA_FMT_LC3 0x0001337E
Naresh Tanniru9d027a62015-03-13 01:32:10 +053066#define MEDIA_FMT_AAC_AOT_LC 2
67#define MEDIA_FMT_AAC_AOT_SBR 5
68#define MEDIA_FMT_AAC_AOT_PS 29
Naresh Tanniru9d027a62015-03-13 01:32:10 +053069#define PCM_CHANNEL_L 1
70#define PCM_CHANNEL_R 2
71#define PCM_CHANNEL_C 3
72#define MEDIA_FMT_SBC_CHANNEL_MODE_MONO 1
73#define MEDIA_FMT_SBC_CHANNEL_MODE_STEREO 2
74#define MEDIA_FMT_SBC_CHANNEL_MODE_DUAL_MONO 8
75#define MEDIA_FMT_SBC_CHANNEL_MODE_JOINT_STEREO 9
76#define MEDIA_FMT_SBC_ALLOCATION_METHOD_LOUDNESS 0
77#define MEDIA_FMT_SBC_ALLOCATION_METHOD_SNR 1
Surendar Karka2febd452018-12-13 17:56:43 +053078#define MIXER_ENC_CONFIG_BLOCK "SLIM_7_RX Encoder Config"
Zhou Song8fccbb62019-03-20 01:08:19 +080079#define MIXER_ENC_APTX_AD_CONFIG_BLOCK "SLIM_7_RX APTX_AD Enc Cfg"
Surendar Karka2febd452018-12-13 17:56:43 +053080#define MIXER_SOURCE_DEC_CONFIG_BLOCK "SLIM_7_TX Decoder Config"
81#define MIXER_SINK_DEC_CONFIG_BLOCK "SLIM_9_TX Decoder Config"
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +053082#define MIXER_ENC_BIT_FORMAT "AFE Input Bit Format"
Florian Pfister1a84f312018-07-19 14:38:18 +020083#define MIXER_DEC_BIT_FORMAT "AFE Output Bit Format"
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +053084#define MIXER_SCRAMBLER_MODE "AFE Scrambler Mode"
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -080085#define MIXER_SAMPLE_RATE_RX "BT SampleRate RX"
Surendar Karka2febd452018-12-13 17:56:43 +053086#define MIXER_SOURCE_SAMPLE_RATE_TX "BT SampleRate TX"
Samyak Jainf69e9ef2018-06-12 12:26:37 +053087#define MIXER_SAMPLE_RATE_DEFAULT "BT SampleRate"
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +053088#define MIXER_AFE_IN_CHANNELS "AFE Input Channels"
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -080089#define MIXER_ABR_TX_FEEDBACK_PATH "A2DP_SLIM7_UL_HL Switch"
Zhou Song12c29502019-03-16 10:37:18 +080090#define MIXER_ABR_RX_FEEDBACK_PATH "SCO_SLIM7_DL_HL Switch"
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -080091#define MIXER_SET_FEEDBACK_CHANNEL "BT set feedback channel"
Surendar Karka2febd452018-12-13 17:56:43 +053092#define MIXER_SINK_SAMPLE_RATE "BT_TX SampleRate"
Florian Pfister1a84f312018-07-19 14:38:18 +020093#define MIXER_AFE_SINK_CHANNELS "AFE Output Channels"
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +053094#define MIXER_AFE_SINK_CHANNELS_SLIM7 "AFE Output Channels SLIM7"
Manisha Agarwala51768b2018-11-01 16:30:52 +053095#define MIXER_FMT_TWS_CHANNEL_MODE "TWS Channel Mode"
Manisha Agarwald45632b2019-10-17 18:14:28 +080096#define MIXER_FMT_LC3_CHANNEL_MODE "LC3 Channel Mode"
Zhou Songab94f062021-05-12 13:11:17 +080097#define MIXER_SLIM7_TX_ADM_CHANNEL "SLIM7_TX ADM Channels"
yidongh0515e042017-07-06 15:00:34 +080098#define ENCODER_LATENCY_SBC 10
99#define ENCODER_LATENCY_APTX 40
100#define ENCODER_LATENCY_APTX_HD 20
101#define ENCODER_LATENCY_AAC 70
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +0530102//To Do: Fine Tune Encoder CELT/LDAC latency.
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530103#define ENCODER_LATENCY_CELT 40
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +0530104#define ENCODER_LATENCY_LDAC 40
Aalique Grahame22e49102018-12-18 14:23:57 -0800105#define ENCODER_LATENCY_PCM 50
yidongh0515e042017-07-06 15:00:34 +0800106#define DEFAULT_SINK_LATENCY_SBC 140
107#define DEFAULT_SINK_LATENCY_APTX 160
108#define DEFAULT_SINK_LATENCY_APTX_HD 180
109#define DEFAULT_SINK_LATENCY_AAC 180
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +0530110//To Do: Fine Tune Default CELT/LDAC Latency.
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530111#define DEFAULT_SINK_LATENCY_CELT 180
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +0530112#define DEFAULT_SINK_LATENCY_LDAC 180
Aalique Grahame22e49102018-12-18 14:23:57 -0800113#define DEFAULT_SINK_LATENCY_PCM 140
114
Manisha Agarwald45632b2019-10-17 18:14:28 +0800115// decoder structure is considered.
116#define BAP_UNICAST 1
117// decoder structure is ignored.
118#define BAP_BROADCAST 2
119// decoder structure is treated as second toAirConfig.
120#define BAP_BA_SIMULCAST 3
121
Aalique Grahame22e49102018-12-18 14:23:57 -0800122#define SYSPROP_A2DP_OFFLOAD_SUPPORTED "ro.bluetooth.a2dp_offload.supported"
123#define SYSPROP_A2DP_OFFLOAD_DISABLED "persist.bluetooth.a2dp_offload.disabled"
124#define SYSPROP_A2DP_CODEC_LATENCIES "vendor.audio.a2dp.codec.latency"
125
126// Default encoder bit width
127#define DEFAULT_ENCODER_BIT_FORMAT 16
128
Manisha Agarwald45632b2019-10-17 18:14:28 +0800129// PCM_24 encoder bit width
130#define ENCODER_BIT_FORMAT_PCM_24 24
131
Aalique Grahame22e49102018-12-18 14:23:57 -0800132// Default encoder latency
133#define DEFAULT_ENCODER_LATENCY 200
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530134
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800135// Slimbus Tx sample rate for ABR feedback channel
136#define ABR_TX_SAMPLE_RATE "KHZ_8"
137
Zhou Song12c29502019-03-16 10:37:18 +0800138// Slimbus Tx sample rate for APTX AD SPEECH
139#define SPEECH_TX_SAMPLE_RATE "KHZ_96"
140
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800141// Purpose ID for Inter Module Communication (IMC) in AFE
142#define IMC_PURPOSE_ID_BT_INFO 0x000132E2
143
144// Maximum quality levels for ABR
145#define MAX_ABR_QUALITY_LEVELS 5
146
147// Instance identifier for A2DP
148#define MAX_INSTANCE_ID (UINT32_MAX / 2)
149
Zhou Song12c29502019-03-16 10:37:18 +0800150// Instance identifier for SWB
151#define APTX_AD_SPEECH_INSTANCE_ID 37
152
153#define SAMPLING_RATE_96K 96000
Sharad Sangle95d451b2018-06-19 12:24:20 +0530154#define SAMPLING_RATE_48K 48000
155#define SAMPLING_RATE_441K 44100
Zhou Song12c29502019-03-16 10:37:18 +0800156#define SAMPLING_RATE_32K 32000
Sharad Sangle95d451b2018-06-19 12:24:20 +0530157#define CH_STEREO 2
158#define CH_MONO 1
Florian Pfister1a84f312018-07-19 14:38:18 +0200159#define SOURCE 0
160#define SINK 1
Arun Mirpuri5dc77802019-02-26 16:32:42 -0800161#define UNINITIALIZED -1
162
163#ifdef __LP64__
164#define VNDK_FWK_LIB_PATH "/vendor/lib64/libqti_vndfwk_detect.so"
165#else
166#define VNDK_FWK_LIB_PATH "/vendor/lib/libqti_vndfwk_detect.so"
167#endif
168
Manisha Agarwald45632b2019-10-17 18:14:28 +0800169#define AUDIO_LOCATION_MAX 28
170
171uint32_t audio_location_map_array[] = { AUDIO_LOCATION_FRONT_LEFT, AUDIO_LOCATION_FRONT_RIGHT, AUDIO_LOCATION_FRONT_CENTER, AUDIO_LOCATION_LOW_FREQUENCY,
172 AUDIO_LOCATION_BACK_LEFT, AUDIO_LOCATION_BACK_RIGHT, AUDIO_LOCATION_FRONT_LEFT_OF_CENTER,
173 AUDIO_LOCATION_FRONT_RIGHT_OF_CENTER, AUDIO_LOCATION_BACK_CENTER, AUDIO_LOCATION_LOW_FREQUENCY_2,
174 AUDIO_LOCATION_SIDE_LEFT, AUDIO_LOCATION_SIDE_RIGHT, AUDIO_LOCATION_TOP_FRONT_LEFT, AUDIO_LOCATION_TOP_FRONT_RIGHT,
175 AUDIO_LOCATION_TOP_FRONT_CENTER, AUDIO_LOCATION_TOP_CENTER, AUDIO_LOCATION_TOP_BACK_LEFT, AUDIO_LOCATION_TOP_BACK_RIGHT,
176 AUDIO_LOCATION_TOP_SIDE_LEFT, AUDIO_LOCATION_TOP_SIDE_RIGHT, AUDIO_LOCATION_TOP_BACK_CENTER,
177 AUDIO_LOCATION_BOTTOM_FRONT_CENTER, AUDIO_LOCATION_BOTTOM_FRONT_LEFT, AUDIO_LOCATION_BOTTOM_FRONT_RIGHT,
178 AUDIO_LOCATION_FRONT_LEFT_WIDE, AUDIO_LOCATION_FRONT_RIGHT_WIDE, AUDIO_LOCATION_LEFT_SURROUND,
179 AUDIO_LOCATION_RIGHT_SURROUND };
180
181int channel_map_array[] = { PCM_CHANNEL_L, PCM_CHANNEL_R, PCM_CHANNEL_C, PCM_CHANNEL_LFE, PCM_CHANNEL_LB, PCM_CHANNEL_RB, PCM_CHANNEL_FLC,
182 PCM_CHANNEL_FRC, PCM_CHANNEL_CB, PCM_CHANNEL_RS, PCM_CHANNEL_SL, PCM_CHANNEL_SR, PCM_CHANNEL_TFL,
183 PCM_CHANNEL_TFR, PCM_CHANNEL_TFC, PCM_CHANNEL_TC, PCM_CHANNEL_TBL, PCM_CHANNEL_TBR, PCM_CHANNEL_TSL,
184 PCM_CHANNEL_TSR, PCM_CHANNEL_TBC, PCM_CHANNEL_BFC, PCM_CHANNEL_BFL, PCM_CHANNEL_BFR, PCM_CHANNEL_LW,
185 PCM_CHANNEL_RW, PCM_CHANNEL_LS, PCM_CHANNEL_RS };
186
Arun Mirpuri5dc77802019-02-26 16:32:42 -0800187static void *vndk_fwk_lib_handle = NULL;
188static int is_running_with_enhanced_fwk = UNINITIALIZED;
189
190typedef int (*vndk_fwk_isVendorEnhancedFwk_t)();
191static vndk_fwk_isVendorEnhancedFwk_t vndk_fwk_isVendorEnhancedFwk;
Florian Pfister1a84f312018-07-19 14:38:18 +0200192
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530193/*
194 * Below enum values are extended from audio_base.h to
Florian Pfister1a84f312018-07-19 14:38:18 +0200195 * to keep encoder and decoder type local to bthost_ipc
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530196 * and audio_hal as these are intended only for handshake
197 * between IPC lib and Audio HAL.
198 */
199typedef enum {
Florian Pfister1a84f312018-07-19 14:38:18 +0200200 CODEC_TYPE_INVALID = AUDIO_FORMAT_INVALID, // 0xFFFFFFFFUL
201 CODEC_TYPE_AAC = AUDIO_FORMAT_AAC, // 0x04000000UL
202 CODEC_TYPE_SBC = AUDIO_FORMAT_SBC, // 0x1F000000UL
203 CODEC_TYPE_APTX = AUDIO_FORMAT_APTX, // 0x20000000UL
204 CODEC_TYPE_APTX_HD = AUDIO_FORMAT_APTX_HD, // 0x21000000UL
Manish Dewangan6a252632017-12-04 17:27:44 +0530205#ifndef LINUX_ENABLED
Florian Pfister1a84f312018-07-19 14:38:18 +0200206 CODEC_TYPE_APTX_DUAL_MONO = 570425344u, // 0x22000000UL
Manish Dewangan6a252632017-12-04 17:27:44 +0530207#endif
Florian Pfister1a84f312018-07-19 14:38:18 +0200208 CODEC_TYPE_LDAC = AUDIO_FORMAT_LDAC, // 0x23000000UL
209 CODEC_TYPE_CELT = 603979776u, // 0x24000000UL
Surendar Karka2febd452018-12-13 17:56:43 +0530210 CODEC_TYPE_APTX_AD = 620756992u, // 0x25000000UL
Zhou Song12c29502019-03-16 10:37:18 +0800211 CODEC_TYPE_APTX_AD_SPEECH = 637534208u, //0x26000000UL
Manisha Agarwald45632b2019-10-17 18:14:28 +0800212 CODEC_TYPE_LC3 = 721420288u, //0x2B000000UL
Aalique Grahame22e49102018-12-18 14:23:57 -0800213 CODEC_TYPE_PCM = AUDIO_FORMAT_PCM_16_BIT, // 0x1u
Florian Pfister1a84f312018-07-19 14:38:18 +0200214}codec_t;
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530215
Sharad Sangle95d451b2018-06-19 12:24:20 +0530216/*
217 * enums which describes the APTX Adaptive
218 * channel mode, these values are used by encoder
219 */
220 typedef enum {
221 APTX_AD_CHANNEL_UNCHANGED = -1,
222 APTX_AD_CHANNEL_JOINT_STEREO = 0, // default
223 APTX_AD_CHANNEL_MONO = 1,
224 APTX_AD_CHANNEL_DUAL_MONO = 2,
225 APTX_AD_CHANNEL_STEREO_TWS = 4,
226 APTX_AD_CHANNEL_EARBUD = 8,
227} enc_aptx_ad_channel_mode;
228
229/*
230 * enums which describes the APTX Adaptive
231 * sampling frequency, these values are used
232 * by encoder
233 */
234typedef enum {
235 APTX_AD_SR_UNCHANGED = 0x0,
236 APTX_AD_48 = 0x1, // 48 KHz default
237 APTX_AD_44_1 = 0x2, // 44.1kHz
Zhou Song30e8cea2019-10-22 23:39:25 +0800238 APTX_AD_96 = 0x3, // 96KHz
Sharad Sangle95d451b2018-06-19 12:24:20 +0530239} enc_aptx_ad_s_rate;
240
Naresh Tanniru66cf06c2019-03-20 19:30:37 +0530241typedef void (*bt_audio_pre_init_t)(void);
Florian Pfister1a84f312018-07-19 14:38:18 +0200242typedef int (*audio_source_open_t)(void);
243typedef int (*audio_source_close_t)(void);
244typedef int (*audio_source_start_t)(void);
245typedef int (*audio_source_stop_t)(void);
246typedef int (*audio_source_suspend_t)(void);
247typedef void (*audio_source_handoff_triggered_t)(void);
248typedef void (*clear_source_a2dpsuspend_flag_t)(void);
249typedef void * (*audio_get_enc_config_t)(uint8_t *multicast_status,
250 uint8_t *num_dev, codec_t *codec_type);
251typedef int (*audio_source_check_a2dp_ready_t)(void);
252typedef int (*audio_is_source_scrambling_enabled_t)(void);
Manisha Agarwala51768b2018-11-01 16:30:52 +0530253typedef bool (*audio_is_tws_mono_mode_enable_t)(void);
Florian Pfister1a84f312018-07-19 14:38:18 +0200254typedef int (*audio_sink_start_t)(void);
255typedef int (*audio_sink_stop_t)(void);
256typedef void * (*audio_get_dec_config_t)(codec_t *codec_type);
257typedef void * (*audio_sink_session_setup_complete_t)(uint64_t system_latency);
258typedef int (*audio_sink_check_a2dp_ready_t)(void);
259typedef uint16_t (*audio_sink_get_a2dp_latency_t)(void);
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530260
261enum A2DP_STATE {
262 A2DP_STATE_CONNECTED,
263 A2DP_STATE_STARTED,
264 A2DP_STATE_STOPPED,
265 A2DP_STATE_DISCONNECTED,
266};
267
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800268typedef enum {
269 IMC_TRANSMIT,
270 IMC_RECEIVE,
271} imc_direction_t;
272
273typedef enum {
274 IMC_DISABLE,
275 IMC_ENABLE,
276} imc_status_t;
277
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -0700278typedef enum {
Zhou Song12c29502019-03-16 10:37:18 +0800279 SWAP_DISABLE,
280 SWAP_ENABLE,
281} swap_status_t;
282
283typedef enum {
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -0700284 MTU_SIZE,
285 PEAK_BIT_RATE,
Manisha Agarwalabb536a2020-01-30 16:12:44 +0530286 BIT_RATE_MODE,
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -0700287} frame_control_type_t;
288
Arun Mirpurib1bec9c2019-01-29 16:42:45 -0800289// --- external function dependency ---
290fp_platform_get_pcm_device_id_t fp_platform_get_pcm_device_id;
Weiyin Jiang280ea742020-09-08 20:28:22 +0800291fp_check_a2dp_restore_t fp_check_a2dp_restore_l;
Gautam Manamfbb3ebc2020-10-08 18:06:45 +0530292fp_platform_switch_voice_call_device_post_t fp_platform_switch_voice_call_device_post;
Arun Mirpurib1bec9c2019-01-29 16:42:45 -0800293
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800294/* PCM config for ABR Feedback hostless front end */
295static struct pcm_config pcm_config_abr = {
296 .channels = 1,
297 .rate = 8000,
298 .period_size = 240,
299 .period_count = 2,
300 .format = PCM_FORMAT_S16_LE,
301 .start_threshold = 0,
302 .stop_threshold = INT_MAX,
303 .avail_min = 0,
304};
305
306/* Adaptive bitrate config for A2DP codecs */
307struct a2dp_abr_config {
308 /* Flag to denote whether Adaptive bitrate is enabled for codec */
309 bool is_abr_enabled;
310 /* Flag to denote whether front end has been opened for ABR */
311 bool abr_started;
312 /* ABR Tx path pcm handle */
313 struct pcm *abr_tx_handle;
Zhou Song12c29502019-03-16 10:37:18 +0800314 /* ABR Rx path pcm handle */
315 struct pcm *abr_rx_handle;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800316 /* ABR Inter Module Communication (IMC) instance ID */
317 uint32_t imc_instance;
318};
319
320static uint32_t instance_id = MAX_INSTANCE_ID;
321
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530322/* structure used to update a2dp state machine
323 * to communicate IPC library
324 * to store DSP encoder configuration information
325 */
326struct a2dp_data {
327 struct audio_device *adev;
Florian Pfister1a84f312018-07-19 14:38:18 +0200328 void *bt_lib_source_handle;
Naresh Tanniru66cf06c2019-03-20 19:30:37 +0530329 bt_audio_pre_init_t bt_audio_pre_init;
Florian Pfister1a84f312018-07-19 14:38:18 +0200330 audio_source_open_t audio_source_open;
331 audio_source_close_t audio_source_close;
332 audio_source_start_t audio_source_start;
333 audio_source_stop_t audio_source_stop;
334 audio_source_suspend_t audio_source_suspend;
335 audio_source_handoff_triggered_t audio_source_handoff_triggered;
336 clear_source_a2dpsuspend_flag_t clear_source_a2dpsuspend_flag;
337 audio_get_enc_config_t audio_get_enc_config;
338 audio_source_check_a2dp_ready_t audio_source_check_a2dp_ready;
Manisha Agarwala51768b2018-11-01 16:30:52 +0530339 audio_is_tws_mono_mode_enable_t audio_is_tws_mono_mode_enable;
Florian Pfister1a84f312018-07-19 14:38:18 +0200340 audio_is_source_scrambling_enabled_t audio_is_source_scrambling_enabled;
341 enum A2DP_STATE bt_state_source;
342 codec_t bt_encoder_format;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +0530343 uint32_t enc_sampling_rate;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +0530344 uint32_t enc_channels;
Florian Pfister1a84f312018-07-19 14:38:18 +0200345 bool a2dp_source_started;
346 bool a2dp_source_suspended;
347 int a2dp_source_total_active_session_requests;
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530348 bool is_a2dp_offload_supported;
349 bool is_handoff_in_progress;
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700350 bool is_aptx_dual_mono_supported;
Manisha Agarwala51768b2018-11-01 16:30:52 +0530351 /* Mono Mode support for TWS+ */
352 bool is_tws_mono_mode_on;
Manisha Agarwald45632b2019-10-17 18:14:28 +0800353 /* Mono Mode support for LC3 */
354 bool is_lc3_mono_mode_on;
Sharad Sangle95d451b2018-06-19 12:24:20 +0530355 bool is_aptx_adaptive;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800356 /* Adaptive bitrate config for A2DP codecs */
357 struct a2dp_abr_config abr_config;
Florian Pfister1a84f312018-07-19 14:38:18 +0200358
359 void *bt_lib_sink_handle;
360 audio_sink_start_t audio_sink_start;
361 audio_sink_stop_t audio_sink_stop;
362 audio_get_dec_config_t audio_get_dec_config;
363 audio_sink_session_setup_complete_t audio_sink_session_setup_complete;
364 audio_sink_check_a2dp_ready_t audio_sink_check_a2dp_ready;
365 audio_sink_get_a2dp_latency_t audio_sink_get_a2dp_latency;
366 enum A2DP_STATE bt_state_sink;
367 codec_t bt_decoder_format;
368 uint32_t dec_sampling_rate;
369 uint32_t dec_channels;
370 bool a2dp_sink_started;
371 int a2dp_sink_total_active_session_requests;
Zhou Song12c29502019-03-16 10:37:18 +0800372 bool swb_configured;
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530373};
374
375struct a2dp_data a2dp;
376
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800377/* Adaptive bitrate (ABR) is supported by certain Bluetooth codecs.
378 * Structures sent to configure DSP for ABR are defined below.
379 * This data helps DSP configure feedback path (BTSoC to LPASS)
380 * for link quality levels and mapping quality levels to codec
381 * specific bitrate.
382 */
383
384/* Key value pair for link quality level to bitrate mapping. */
385struct bit_rate_level_map_t {
386 uint32_t link_quality_level;
387 uint32_t bitrate;
388};
389
390/* Link quality level to bitrate mapping info sent to DSP. */
391struct quality_level_to_bitrate_info {
392 /* Number of quality levels being mapped.
393 * This will be equal to the size of mapping table.
394 */
395 uint32_t num_levels;
396 /* Quality level to bitrate mapping table */
397 struct bit_rate_level_map_t bit_rate_level_map[MAX_ABR_QUALITY_LEVELS];
398};
399
400/* Structure to set up Inter Module Communication (IMC) between
401 * AFE Decoder and Encoder.
402 */
403struct imc_dec_enc_info {
404 /* Decoder to encoder communication direction.
405 * Transmit = 0 / Receive = 1
406 */
407 uint32_t direction;
408 /* Enable / disable IMC between decoder and encoder */
409 uint32_t enable;
410 /* Purpose of IMC being set up between decoder and encoder.
411 * IMC_PURPOSE_ID_BT_INFO defined for link quality feedback
412 * is the default value to be sent as purpose.
413 */
414 uint32_t purpose;
415 /* Unique communication instance ID.
416 * purpose and comm_instance together form the actual key
417 * used in IMC registration, which must be the same for
418 * encoder and decoder for which IMC is being set up.
419 */
420 uint32_t comm_instance;
421};
422
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -0700423/* Structure to control frame size of AAC encoded frames. */
424struct aac_frame_size_control_t {
425 /* Type of frame size control: MTU_SIZE / PEAK_BIT_RATE*/
426 uint32_t ctl_type;
427 /* Control value
428 * MTU_SIZE: MTU size in bytes
429 * PEAK_BIT_RATE: Peak bitrate in bits per second.
Manisha Agarwalabb536a2020-01-30 16:12:44 +0530430 * BIT_RATE_MODE: Variable bitrate
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -0700431 */
432 uint32_t ctl_value;
433};
434
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800435/* Structure used for ABR config of AFE encoder and decoder. */
436struct abr_enc_cfg_t {
437 /* Link quality level to bitrate mapping info sent to DSP. */
438 struct quality_level_to_bitrate_info mapping_info;
439 /* Information to set up IMC between decoder and encoder */
440 struct imc_dec_enc_info imc_info;
Aniket Kumar Lata8c884eb2018-08-06 15:30:50 -0700441 /* Flag to indicate whether ABR is enabled */
442 bool is_abr_enabled;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800443} __attribute__ ((packed));
444
445/* Structure to send configuration for decoder introduced
446 * on AFE Tx path for ABR link quality feedback to BT encoder.
447 */
448struct abr_dec_cfg_t {
449 /* Decoder media format */
450 uint32_t dec_format;
451 /* Information to set up IMC between decoder and encoder */
452 struct imc_dec_enc_info imc_info;
453} __attribute__ ((packed));
454
Zhou Song12c29502019-03-16 10:37:18 +0800455struct aptx_ad_speech_mode_cfg_t
456{
457 uint32_t mode;
458 uint32_t swapping;
459} __attribute__ ((packed));
460
461/* Structure for SWB voice dec config */
462struct aptx_ad_speech_dec_cfg_t {
463 struct abr_dec_cfg_t abr_cfg;
464 struct aptx_ad_speech_mode_cfg_t speech_mode;
465} __attribute__ ((packed));
466
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530467/* START of DSP configurable structures
468 * These values should match with DSP interface defintion
469 */
470
471/* AAC encoder configuration structure. */
472typedef struct aac_enc_cfg_t aac_enc_cfg_t;
473
474/* supported enc_mode are AAC_LC, AAC_SBR, AAC_PS
475 * supported aac_fmt_flag are ADTS/RAW
476 * supported channel_cfg are Native mode, Mono , Stereo
477 */
478struct aac_enc_cfg_t {
479 uint32_t enc_format;
480 uint32_t bit_rate;
481 uint32_t enc_mode;
482 uint16_t aac_fmt_flag;
Naresh Tannirua42d0bd2016-09-21 15:30:46 +0530483 uint16_t channel_cfg;
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530484 uint32_t sample_rate;
Manish Dewangan6a252632017-12-04 17:27:44 +0530485} __attribute__ ((packed));
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530486
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -0700487struct aac_enc_cfg_v2_t {
488 struct aac_enc_cfg_t aac_enc_cfg;
489 struct aac_frame_size_control_t frame_ctl;
490} __attribute__ ((packed));
491
Manisha Agarwalabb536a2020-01-30 16:12:44 +0530492struct aac_enc_cfg_v3_t {
493 struct aac_enc_cfg_t aac_enc_cfg;
494 struct aac_frame_size_control_t frame_ctl;
495 struct aac_frame_size_control_t aac_key_value_ctl;
496} __attribute__ ((packed));
497
Surendar Karkabbb3c822018-11-12 13:00:38 +0530498typedef struct audio_aac_decoder_config_t audio_aac_decoder_config_t;
499struct audio_aac_decoder_config_t {
Florian Pfister1a84f312018-07-19 14:38:18 +0200500 uint16_t aac_fmt_flag; /* LATM*/
501 uint16_t audio_object_type; /* LC */
502 uint16_t channels; /* Stereo */
503 uint16_t total_size_of_pce_bits; /* 0 - only for channel conf PCE */
504 uint32_t sampling_rate; /* 8k, 11.025k, 12k, 16k, 22.05k, 24k, 32k,
505 44.1k, 48k, 64k, 88.2k, 96k */
Surendar Karkabbb3c822018-11-12 13:00:38 +0530506} __attribute__ ((packed));
Florian Pfister1a84f312018-07-19 14:38:18 +0200507
Surendar Karkabbb3c822018-11-12 13:00:38 +0530508typedef struct audio_sbc_decoder_config_t audio_sbc_decoder_config_t;
509struct audio_sbc_decoder_config_t {
Florian Pfister1a84f312018-07-19 14:38:18 +0200510 uint16_t channels; /* Mono, Stereo */
511 uint32_t sampling_rate; /* 8k, 11.025k, 12k, 16k, 22.05k, 24k, 32k,
512 44.1k, 48k, 64k, 88.2k, 96k */
Surendar Karkabbb3c822018-11-12 13:00:38 +0530513} __attribute__ ((packed));
Florian Pfister1a84f312018-07-19 14:38:18 +0200514
515/* AAC decoder configuration structure. */
516typedef struct aac_dec_cfg_t aac_dec_cfg_t;
517struct aac_dec_cfg_t {
518 uint32_t dec_format;
519 audio_aac_decoder_config_t data;
520} __attribute__ ((packed));
521
522/* SBC decoder configuration structure. */
523typedef struct sbc_dec_cfg_t sbc_dec_cfg_t;
524struct sbc_dec_cfg_t {
525 uint32_t dec_format;
526 audio_sbc_decoder_config_t data;
527} __attribute__ ((packed));
528
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530529/* SBC encoder configuration structure. */
530typedef struct sbc_enc_cfg_t sbc_enc_cfg_t;
531
532/* supported num_subbands are 4/8
533 * supported blk_len are 4, 8, 12, 16
534 * supported channel_mode are MONO, STEREO, DUAL_MONO, JOINT_STEREO
535 * supported alloc_method are LOUNDNESS/SNR
536 * supported bit_rate for mono channel is max 320kbps
537 * supported bit rate for stereo channel is max 512 kbps
538 */
539struct sbc_enc_cfg_t{
540 uint32_t enc_format;
541 uint32_t num_subbands;
542 uint32_t blk_len;
543 uint32_t channel_mode;
544 uint32_t alloc_method;
545 uint32_t bit_rate;
546 uint32_t sample_rate;
Manish Dewangan6a252632017-12-04 17:27:44 +0530547} __attribute__ ((packed));
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530548
549
550/* supported num_channels are Mono/Stereo
551 * supported channel_mapping for mono is CHANNEL_C
552 * supported channel mapping for stereo is CHANNEL_L and CHANNEL_R
553 * custom size and reserved are not used(for future enhancement)
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700554 */
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530555struct custom_enc_cfg_t
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530556{
557 uint32_t enc_format;
558 uint32_t sample_rate;
559 uint16_t num_channels;
560 uint16_t reserved;
561 uint8_t channel_mapping[8];
562 uint32_t custom_size;
Manish Dewangan6a252632017-12-04 17:27:44 +0530563} __attribute__ ((packed));
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530564
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530565struct celt_specific_enc_cfg_t
566{
567 uint32_t bit_rate;
568 uint16_t frame_size;
569 uint16_t complexity;
570 uint16_t prediction_mode;
571 uint16_t vbr_flag;
Manish Dewangan6a252632017-12-04 17:27:44 +0530572} __attribute__ ((packed));
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530573
574struct celt_enc_cfg_t
575{
576 struct custom_enc_cfg_t custom_cfg;
577 struct celt_specific_enc_cfg_t celt_cfg;
Manish Dewangan6a252632017-12-04 17:27:44 +0530578} __attribute__ ((packed));
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700579
580/* sync_mode introduced with APTX V2 libraries
581 * sync mode: 0x0 = stereo sync mode
582 * 0x01 = dual mono sync mode
583 * 0x02 = dual mono with no sync on either L or R codewords
584 */
585struct aptx_v2_enc_cfg_ext_t
586{
587 uint32_t sync_mode;
Manish Dewangan6a252632017-12-04 17:27:44 +0530588} __attribute__ ((packed));
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700589
590/* APTX struct for combining custom enc and V2 fields */
591struct aptx_enc_cfg_t
592{
593 struct custom_enc_cfg_t custom_cfg;
594 struct aptx_v2_enc_cfg_ext_t aptx_v2_cfg;
Manish Dewangan6a252632017-12-04 17:27:44 +0530595} __attribute__ ((packed));
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700596
Sharad Sangle95d451b2018-06-19 12:24:20 +0530597/* APTX AD structure */
598struct aptx_ad_enc_cfg_ext_t
599{
600 uint32_t sampling_freq;
601 uint32_t mtu;
602 uint32_t channel_mode;
603 uint32_t min_sink_modeA;
604 uint32_t max_sink_modeA;
605 uint32_t min_sink_modeB;
606 uint32_t max_sink_modeB;
607 uint32_t min_sink_modeC;
608 uint32_t max_sink_modeC;
Sharad Sanglee378afe2018-09-03 20:04:17 +0530609 uint32_t mode;
Sharad Sangle95d451b2018-06-19 12:24:20 +0530610} __attribute__ ((packed));
611
612struct aptx_ad_enc_cfg_t
613{
614 struct custom_enc_cfg_t custom_cfg;
615 struct aptx_ad_enc_cfg_ext_t aptx_ad_cfg;
616 struct abr_enc_cfg_t abr_cfg;
617} __attribute__ ((packed));
618
Zhou Song8fccbb62019-03-20 01:08:19 +0800619struct aptx_ad_enc_cfg_ext_r2_t
620{
621 uint32_t sampling_freq;
622 uint32_t mtu;
623 uint32_t channel_mode;
624 uint32_t min_sink_modeA;
625 uint32_t max_sink_modeA;
626 uint32_t min_sink_modeB;
627 uint32_t max_sink_modeB;
628 uint32_t min_sink_modeC;
629 uint32_t max_sink_modeC;
630 uint32_t mode;
631 uint32_t input_mode;
632 uint32_t fade_duration;
633 uint8_t sink_cap[11];
634} __attribute__ ((packed));
635
636struct aptx_ad_enc_cfg_r2_t
637{
638 struct custom_enc_cfg_t custom_cfg;
639 struct aptx_ad_enc_cfg_ext_r2_t aptx_ad_cfg;
640 struct abr_enc_cfg_t abr_cfg;
641} __attribute__ ((packed));
642
Zhou Song12c29502019-03-16 10:37:18 +0800643/* APTX AD SPEECH structure */
644struct aptx_ad_speech_enc_cfg_t
645{
646 struct custom_enc_cfg_t custom_cfg;
647 /* Information to set up IMC between decoder and encoder */
648 struct imc_dec_enc_info imc_info;
649 struct aptx_ad_speech_mode_cfg_t speech_mode;
650} __attribute__ ((packed));
651
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +0530652struct ldac_specific_enc_cfg_t
653{
654 uint32_t bit_rate;
655 uint16_t channel_mode;
656 uint16_t mtu;
Manish Dewangan6a252632017-12-04 17:27:44 +0530657} __attribute__ ((packed));
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +0530658
659struct ldac_enc_cfg_t
660{
661 struct custom_enc_cfg_t custom_cfg;
662 struct ldac_specific_enc_cfg_t ldac_cfg;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800663 struct abr_enc_cfg_t abr_cfg;
Manish Dewangan6a252632017-12-04 17:27:44 +0530664} __attribute__ ((packed));
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +0530665
Manisha Agarwald45632b2019-10-17 18:14:28 +0800666/* LC3 structure */
667struct lc3_stream_info_t
668{
669 uint32_t stream_id;
670 uint32_t direction;
671 uint32_t channel_mask_lsw;
672 uint32_t channel_mask_msw;
673} __attribute__ ((packed));
674
675struct lc3_stream_map_info_t
676{
677 uint32_t stream_map_size;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +0530678 struct lc3_stream_info_t streamMap[2];
Manisha Agarwald45632b2019-10-17 18:14:28 +0800679} __attribute__ ((packed));
680
681struct lc3_stream_map_ext_t
682{
683 uint32_t audio_location;
684 uint8_t stream_id;
685 uint8_t direction;
686} __attribute__ ((packed));
687
688struct lc3_config_ext_t
689{
690 uint32_t api_version;
691 uint32_t sampling_freq;
692 uint32_t max_octets_per_frame;
693 uint32_t frame_duration;//7.5msec, 10msec
694 uint32_t bit_depth;
695 uint32_t num_blocks;
696 uint8_t default_q_level;
697 uint8_t vendor_specific[16]; // this indicates LC3/LC3Q. 0 => LC3 1.0 , 1 => LC3 1.1
698 uint32_t mode;
699} __attribute__ ((packed));
700
701struct lc3_dec_cfg_ext_t
702{
703 struct lc3_config_ext_t fromAirConfig;
704 uint32_t decoder_output_channel;
705 uint32_t stream_map_size;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +0530706 struct lc3_stream_map_ext_t streamMapIn[2];
Manisha Agarwald45632b2019-10-17 18:14:28 +0800707} __attribute__ ((packed));
708
709struct lc3_enc_cfg_ext_t
710{
711 struct lc3_config_ext_t toAirConfig;
712 uint32_t stream_map_size;
713 struct lc3_stream_map_ext_t streamMapOut[16];
714} __attribute__ ((packed));
715
716struct lc3_dec_codec_cfg_t
717{
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +0530718 struct lc3_dec_cfg_ext_t from_Air_cfg;
Manisha Agarwald45632b2019-10-17 18:14:28 +0800719 struct lc3_stream_map_info_t streamMapToAir;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +0530720 struct lc3_stream_map_info_t streamMapFromAir;
Manisha Agarwald45632b2019-10-17 18:14:28 +0800721} __attribute__ ((packed));
722
723struct lc3_dec_cfg_t
724{
725 struct abr_dec_cfg_t abr_cfg;
726 struct lc3_dec_codec_cfg_t dec_codec;
727} __attribute__ ((packed));
728
729struct lc3_enc_codec_cfg_t
730{
731 struct lc3_enc_cfg_ext_t to_Air_cfg;
732 struct lc3_stream_map_info_t streamMapToAir;
733} __attribute__ ((packed));
734
735struct lc3_enc_cfg_t
736{
737 uint32_t enc_format;
738 struct imc_dec_enc_info imc_info;
739 struct lc3_enc_codec_cfg_t enc_codec;
740} __attribute__ ((packed));
741
Sachin Mohan Gadag1657c052017-09-13 16:00:27 +0530742/* In LE BT source code uses system/audio.h for below
743 * structure definition. To avoid multiple definition
744 * compilation error for audiohal in LE , masking structure
745 * definition under "LINUX_ENABLED" which is defined only
746 * in LE
747 */
748#ifndef LINUX_ENABLED
Satya Krishna Pindiprolif7d65712017-04-26 14:24:53 +0530749/* TODO: Define the following structures only for O using PLATFORM_VERSION */
750/* Information about BT SBC encoder configuration
751 * This data is used between audio HAL module and
752 * BT IPC library to configure DSP encoder
753 */
754typedef struct {
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530755 uint32_t subband; /* 4, 8 */
756 uint32_t blk_len; /* 4, 8, 12, 16 */
757 uint16_t sampling_rate; /*44.1khz,48khz*/
758 uint8_t channels; /*0(Mono),1(Dual_mono),2(Stereo),3(JS)*/
759 uint8_t alloc; /*0(Loudness),1(SNR)*/
760 uint8_t min_bitpool; /* 2 */
761 uint8_t max_bitpool; /*53(44.1khz),51 (48khz) */
762 uint32_t bitrate; /* 320kbps to 512kbps */
Samyak Jain2cddc0e2018-07-18 15:22:27 +0530763 uint32_t bits_per_sample;
Satya Krishna Pindiprolif7d65712017-04-26 14:24:53 +0530764} audio_sbc_encoder_config;
765
Satya Krishna Pindiprolif7d65712017-04-26 14:24:53 +0530766/* Information about BT APTX encoder configuration
767 * This data is used between audio HAL module and
768 * BT IPC library to configure DSP encoder
769 */
770typedef struct {
771 uint16_t sampling_rate;
772 uint8_t channels;
773 uint32_t bitrate;
Samyak Jain2cddc0e2018-07-18 15:22:27 +0530774 uint32_t bits_per_sample;
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700775} audio_aptx_default_config;
Satya Krishna Pindiprolif7d65712017-04-26 14:24:53 +0530776
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700777typedef struct {
Zhou Song8fccbb62019-03-20 01:08:19 +0800778 uint32_t sampling_rate;
779 uint32_t mtu;
780 int32_t channel_mode;
781 uint32_t min_sink_modeA;
782 uint32_t max_sink_modeA;
783 uint32_t min_sink_modeB;
784 uint32_t max_sink_modeB;
785 uint32_t min_sink_modeC;
786 uint32_t max_sink_modeC;
787 uint32_t encoder_mode;
Sharad Sangle95d451b2018-06-19 12:24:20 +0530788 uint8_t TTP_modeA_low;
789 uint8_t TTP_modeA_high;
790 uint8_t TTP_modeB_low;
791 uint8_t TTP_modeB_high;
Zhou Song8fccbb62019-03-20 01:08:19 +0800792 uint8_t TTP_TWS_low;
793 uint8_t TTP_TWS_high;
Samyak Jain2cddc0e2018-07-18 15:22:27 +0530794 uint32_t bits_per_sample;
Zhou Song8fccbb62019-03-20 01:08:19 +0800795 uint32_t input_mode;
796 uint32_t fade_duration;
797 uint8_t sink_cap[11];
Sharad Sangle95d451b2018-06-19 12:24:20 +0530798} audio_aptx_ad_config;
799
800typedef struct {
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700801 uint16_t sampling_rate;
802 uint8_t channels;
803 uint32_t bitrate;
804 uint32_t sync_mode;
Samyak Jain2cddc0e2018-07-18 15:22:27 +0530805 uint32_t bits_per_sample;
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700806} audio_aptx_dual_mono_config;
807
808typedef union {
809 audio_aptx_default_config *default_cfg;
810 audio_aptx_dual_mono_config *dual_mono_cfg;
Sharad Sangle95d451b2018-06-19 12:24:20 +0530811 audio_aptx_ad_config *ad_cfg;
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -0700812} audio_aptx_encoder_config;
Satya Krishna Pindiprolif7d65712017-04-26 14:24:53 +0530813
814/* Information about BT AAC encoder configuration
815 * This data is used between audio HAL module and
816 * BT IPC library to configure DSP encoder
817 */
818typedef struct {
819 uint32_t enc_mode; /* LC, SBR, PS */
820 uint16_t format_flag; /* RAW, ADTS */
821 uint16_t channels; /* 1-Mono, 2-Stereo */
822 uint32_t sampling_rate;
823 uint32_t bitrate;
Samyak Jain2cddc0e2018-07-18 15:22:27 +0530824 uint32_t bits_per_sample;
Satya Krishna Pindiprolif7d65712017-04-26 14:24:53 +0530825} audio_aac_encoder_config;
Ramu Gottipati08d82e72018-12-17 11:52:14 +0530826#endif
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -0700827
828typedef struct {
829 audio_aac_encoder_config audio_aac_enc_cfg;
830 struct aac_frame_size_control_t frame_ctl;
831} audio_aac_encoder_config_v2;
Satya Krishna Pindiprolif7d65712017-04-26 14:24:53 +0530832
Manisha Agarwalabb536a2020-01-30 16:12:44 +0530833typedef struct {
834 audio_aac_encoder_config audio_aac_enc_cfg;
835 struct aac_frame_size_control_t frame_ctl;
836 uint8_t size_control_struct;
837 struct aac_frame_size_control_t* frame_ptr_ctl;
838} audio_aac_encoder_config_v3;
839
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530840/* Information about BT CELT encoder configuration
841 * This data is used between audio HAL module and
842 * BT IPC library to configure DSP encoder
843 */
844typedef struct {
845 uint32_t sampling_rate; /* 32000 - 48000, 48000 */
846 uint16_t channels; /* 1-Mono, 2-Stereo, 2*/
847 uint16_t frame_size; /* 64-128-256-512, 512 */
848 uint16_t complexity; /* 0-10, 1 */
849 uint16_t prediction_mode; /* 0-1-2, 0 */
850 uint16_t vbr_flag; /* 0-1, 0*/
851 uint32_t bitrate; /*32000 - 1536000, 139500*/
Samyak Jain2cddc0e2018-07-18 15:22:27 +0530852 uint32_t bits_per_sample;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +0530853} audio_celt_encoder_config;
854
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +0530855/* Information about BT LDAC encoder configuration
856 * This data is used between audio HAL module and
857 * BT IPC library to configure DSP encoder
858 */
859typedef struct {
860 uint32_t sampling_rate; /*44100,48000,88200,96000*/
861 uint32_t bit_rate; /*303000,606000,909000(in bits per second)*/
862 uint16_t channel_mode; /* 0, 4, 2, 1*/
863 uint16_t mtu; /*679*/
Aniket Kumar Latad0196282019-05-09 14:24:17 -0700864 uint32_t bits_per_sample;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800865 bool is_abr_enabled;
866 struct quality_level_to_bitrate_info level_to_bitrate_map;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +0530867} audio_ldac_encoder_config;
868
Surendar Karkabbb3c822018-11-12 13:00:38 +0530869/* Information about BT AAC decoder configuration
870 * This data is used between audio HAL module and
871 * BT IPC library to configure DSP decoder
872 */
873typedef struct {
874 uint16_t aac_fmt_flag; /* LATM*/
875 uint16_t audio_object_type; /* LC */
876 uint16_t channels; /* Stereo */
877 uint16_t total_size_of_pce_bits; /* 0 - only for channel conf PCE */
878 uint32_t sampling_rate; /* 8k, 11.025k, 12k, 16k, 22.05k, 24k, 32k,
879 44.1k, 48k, 64k, 88.2k, 96k */
880} audio_aac_dec_config_t;
881
882/* Information about BT SBC decoder configuration
883 * This data is used between audio HAL module and
884 * BT IPC library to configure DSP decoder
885 */
886typedef struct {
887 uint16_t channels; /* Mono, Stereo */
888 uint32_t sampling_rate; /* 8k, 11.025k, 12k, 16k, 22.05k, 24k, 32k,
889 44.1k, 48k, 64k, 88.2k, 96k */
890}audio_sbc_dec_config_t;
891
Manisha Agarwald45632b2019-10-17 18:14:28 +0800892/* Information about BT LC3 encoder configuration
893 * This data is used between audio HAL module and
894 * BT IPC library to configure DSP encoder
895 */
896typedef struct {
897 uint32_t api_version;
898 uint32_t sampling_freq;
899 uint32_t max_octets_per_frame;
900 uint32_t frame_duration;//7.5msec, 10msec
901 uint32_t bit_depth;
902 uint32_t num_blocks;
903 uint8_t default_q_level;
904 uint8_t vendor_specific[16]; // this indicates LC3/LC3Q. 0 => LC3 1.0 , 1 => LC3 1.1
905 uint32_t mode;
906} lc3_config_t;
907
908typedef struct {
909 uint32_t audio_location;
910 uint8_t stream_id;
911 uint8_t direction;
912} lc3_stream_map_t;
913
914typedef struct {
915 lc3_config_t toAirConfig;
916 uint8_t stream_map_size;
917 lc3_stream_map_t* streamMapOut;
918} lc3_encoder_config_t;
919
920typedef struct {
921 lc3_config_t fromAirConfig;
922 uint32_t decoder_output_channel;
923 uint8_t stream_map_size;
924 lc3_stream_map_t* streamMapIn;
925} lc3_decoder_config_t;
926
927typedef struct {
928 lc3_encoder_config_t enc_config;
929 lc3_decoder_config_t dec_config;
930} audio_lc3_codec_config_t;
931
932
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530933/*********** END of DSP configurable structures ********************/
934
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530935static void update_offload_codec_capabilities()
936{
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530937
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530938 a2dp.is_a2dp_offload_supported =
Aalique Grahame22e49102018-12-18 14:23:57 -0800939 property_get_bool(SYSPROP_A2DP_OFFLOAD_SUPPORTED, false) &&
940 !property_get_bool(SYSPROP_A2DP_OFFLOAD_DISABLED, false);
941
942 ALOGD("%s: A2DP offload supported = %d",__func__,
943 a2dp.is_a2dp_offload_supported);
Naresh Tanniru9d027a62015-03-13 01:32:10 +0530944}
945
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800946static int stop_abr()
947{
948 struct mixer_ctl *ctl_abr_tx_path = NULL;
Zhou Song12c29502019-03-16 10:37:18 +0800949 struct mixer_ctl *ctl_abr_rx_path = NULL;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800950 struct mixer_ctl *ctl_set_bt_feedback_channel = NULL;
Zhou Song12c29502019-03-16 10:37:18 +0800951 int ret = 0;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800952
953 /* This function can be used if !abr_started for clean up */
954 ALOGV("%s: enter", __func__);
955
956 // Close hostless front end
957 if (a2dp.abr_config.abr_tx_handle != NULL) {
958 pcm_close(a2dp.abr_config.abr_tx_handle);
959 a2dp.abr_config.abr_tx_handle = NULL;
960 }
Zhou Song12c29502019-03-16 10:37:18 +0800961 if (a2dp.abr_config.abr_rx_handle != NULL) {
962 pcm_close(a2dp.abr_config.abr_rx_handle);
963 a2dp.abr_config.abr_rx_handle = NULL;
964 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800965 a2dp.abr_config.abr_started = false;
966 a2dp.abr_config.imc_instance = 0;
967
968 // Reset BT driver mixer control for ABR usecase
969 ctl_set_bt_feedback_channel = mixer_get_ctl_by_name(a2dp.adev->mixer,
970 MIXER_SET_FEEDBACK_CHANNEL);
971 if (!ctl_set_bt_feedback_channel) {
972 ALOGE("%s: ERROR Set usecase mixer control not identifed", __func__);
Zhou Song12c29502019-03-16 10:37:18 +0800973 ret = -ENOSYS;
974 } else if (mixer_ctl_set_value(ctl_set_bt_feedback_channel, 0, 0) != 0) {
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800975 ALOGE("%s: Failed to set BT usecase", __func__);
Zhou Song12c29502019-03-16 10:37:18 +0800976 ret = -ENOSYS;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800977 }
978
979 // Reset ABR Tx feedback path
980 ALOGV("%s: Disable ABR Tx feedback path", __func__);
981 ctl_abr_tx_path = mixer_get_ctl_by_name(a2dp.adev->mixer,
982 MIXER_ABR_TX_FEEDBACK_PATH);
983 if (!ctl_abr_tx_path) {
984 ALOGE("%s: ERROR ABR Tx feedback path mixer control not identifed", __func__);
Zhou Song12c29502019-03-16 10:37:18 +0800985 ret = -ENOSYS;
986 } else if (mixer_ctl_set_value(ctl_abr_tx_path, 0, 0) != 0) {
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800987 ALOGE("%s: Failed to set ABR Tx feedback path", __func__);
Zhou Song12c29502019-03-16 10:37:18 +0800988 ret = -ENOSYS;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -0800989 }
990
Zhou Song12c29502019-03-16 10:37:18 +0800991 // Reset ABR Rx feedback path
992 ALOGV("%s: Disable ABR Rx feedback path", __func__);
993 ctl_abr_rx_path = mixer_get_ctl_by_name(a2dp.adev->mixer,
994 MIXER_ABR_RX_FEEDBACK_PATH);
995 if (!ctl_abr_rx_path) {
996 ALOGE("%s: ERROR ABR Rx feedback path mixer control not identifed", __func__);
997 ret = -ENOSYS;
998 } else if (mixer_ctl_set_value(ctl_abr_rx_path, 0, 0) != 0) {
999 ALOGE("%s: Failed to set ABR Rx feedback path", __func__);
1000 ret = -ENOSYS;
1001 }
1002
1003 return ret;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001004}
1005
1006static int start_abr()
1007{
1008 struct mixer_ctl *ctl_abr_tx_path = NULL;
Zhou Song12c29502019-03-16 10:37:18 +08001009 struct mixer_ctl *ctl_abr_rx_path = NULL;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001010 struct mixer_ctl *ctl_set_bt_feedback_channel = NULL;
1011 int abr_device_id;
1012 int ret = 0;
1013
1014 if (!a2dp.abr_config.is_abr_enabled) {
1015 ALOGE("%s: Cannot start if ABR is not enabled", __func__);
1016 return -ENOSYS;
1017 }
1018
1019 if (a2dp.abr_config.abr_started) {
1020 ALOGI("%s: ABR has already started", __func__);
1021 return ret;
1022 }
1023
1024 // Enable Slimbus 7 Tx feedback path
1025 ALOGV("%s: Enable ABR Tx feedback path", __func__);
1026 ctl_abr_tx_path = mixer_get_ctl_by_name(a2dp.adev->mixer,
1027 MIXER_ABR_TX_FEEDBACK_PATH);
1028 if (!ctl_abr_tx_path) {
1029 ALOGE("%s: ERROR ABR Tx feedback path mixer control not identifed", __func__);
1030 return -ENOSYS;
1031 }
1032 if (mixer_ctl_set_value(ctl_abr_tx_path, 0, 1) != 0) {
1033 ALOGE("%s: Failed to set ABR Tx feedback path", __func__);
1034 return -ENOSYS;
1035 }
1036
1037 // Notify ABR usecase information to BT driver to distinguish
1038 // between SCO and feedback usecase
1039 ctl_set_bt_feedback_channel = mixer_get_ctl_by_name(a2dp.adev->mixer,
1040 MIXER_SET_FEEDBACK_CHANNEL);
1041 if (!ctl_set_bt_feedback_channel) {
1042 ALOGE("%s: ERROR Set usecase mixer control not identifed", __func__);
Zhou Song12c29502019-03-16 10:37:18 +08001043 goto fail;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001044 }
1045 if (mixer_ctl_set_value(ctl_set_bt_feedback_channel, 0, 1) != 0) {
1046 ALOGE("%s: Failed to set BT usecase", __func__);
Zhou Song12c29502019-03-16 10:37:18 +08001047 goto fail;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001048 }
1049
1050 // Open hostless front end and prepare ABR Tx path
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08001051 abr_device_id = fp_platform_get_pcm_device_id(USECASE_AUDIO_A2DP_ABR_FEEDBACK,
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001052 PCM_CAPTURE);
1053 if (!a2dp.abr_config.abr_tx_handle) {
1054 a2dp.abr_config.abr_tx_handle = pcm_open(a2dp.adev->snd_card,
1055 abr_device_id, PCM_IN,
1056 &pcm_config_abr);
Zhou Song12c29502019-03-16 10:37:18 +08001057 if (a2dp.abr_config.abr_tx_handle == NULL) {
1058 ALOGE("%s: Can't open abr tx device", __func__);
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001059 goto fail;
Zhou Song12c29502019-03-16 10:37:18 +08001060 }
1061 if (!(pcm_is_ready(a2dp.abr_config.abr_tx_handle) &&
1062 !pcm_start(a2dp.abr_config.abr_tx_handle))) {
1063 ALOGE("%s: tx: %s", __func__, pcm_get_error(a2dp.abr_config.abr_tx_handle));
1064 goto fail;
1065 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001066 }
Zhou Song12c29502019-03-16 10:37:18 +08001067
1068 // Enable Slimbus 7 Rx feedback path for HD Voice use case
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301069 if ((a2dp.bt_encoder_format == CODEC_TYPE_APTX_AD_SPEECH)
1070 || ((a2dp.a2dp_sink_started == true) && (a2dp.bt_decoder_format == CODEC_TYPE_LC3))) {
Zhou Song12c29502019-03-16 10:37:18 +08001071 ALOGV("%s: Enable ABR Rx feedback path", __func__);
1072 ctl_abr_rx_path = mixer_get_ctl_by_name(a2dp.adev->mixer,
1073 MIXER_ABR_RX_FEEDBACK_PATH);
1074 if (!ctl_abr_rx_path) {
1075 ALOGE("%s: ERROR ABR Rx feedback path mixer control not identifed", __func__);
1076 goto fail;
1077 }
1078 if (mixer_ctl_set_value(ctl_abr_rx_path, 0, 1) != 0) {
1079 ALOGE("%s: Failed to set ABR Rx feedback path", __func__);
1080 goto fail;
1081 }
1082
1083 if (mixer_ctl_set_value(ctl_set_bt_feedback_channel, 0, 1) != 0) {
1084 ALOGE("%s: Failed to set BT usecase", __func__);
1085 goto fail;
1086 }
1087
1088 // Open hostless front end and prepare ABR Rx path
1089 abr_device_id = fp_platform_get_pcm_device_id(USECASE_AUDIO_A2DP_ABR_FEEDBACK,
1090 PCM_PLAYBACK);
1091 if (!a2dp.abr_config.abr_rx_handle) {
1092 a2dp.abr_config.abr_rx_handle = pcm_open(a2dp.adev->snd_card,
1093 abr_device_id, PCM_OUT,
1094 &pcm_config_abr);
1095 if (a2dp.abr_config.abr_rx_handle == NULL) {
1096 ALOGE("%s: Can't open abr rx device", __func__);
1097 goto fail;
1098 }
1099 if (!(pcm_is_ready(a2dp.abr_config.abr_rx_handle) &&
1100 !pcm_start(a2dp.abr_config.abr_rx_handle))) {
1101 ALOGE("%s: rx: %s", __func__, pcm_get_error(a2dp.abr_config.abr_rx_handle));
1102 goto fail;
1103 }
1104 }
1105 }
1106
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001107 a2dp.abr_config.abr_started = true;
1108
1109 return ret;
1110
1111fail:
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001112 stop_abr();
1113 return -ENOSYS;
1114}
1115
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001116static int check_if_enhanced_fwk() {
1117
1118 int is_enhanced_fwk = 1;
1119 //dlopen lib
1120 vndk_fwk_lib_handle = dlopen(VNDK_FWK_LIB_PATH, RTLD_NOW);
1121 if (vndk_fwk_lib_handle != NULL) {
1122 vndk_fwk_isVendorEnhancedFwk = (vndk_fwk_isVendorEnhancedFwk_t)
1123 dlsym(vndk_fwk_lib_handle, "isRunningWithVendorEnhancedFramework");
1124 if (vndk_fwk_isVendorEnhancedFwk == NULL) {
1125 ALOGW("%s: VNDK_FWK_LIB not found, defaulting to enhanced_fwk configuration",
1126 __func__);
1127 is_enhanced_fwk = 1;
1128 } else {
1129 is_enhanced_fwk = vndk_fwk_isVendorEnhancedFwk();
1130 }
1131 }
1132 ALOGV("%s: vndk_fwk_isVendorEnhancedFwk=%d", __func__, is_enhanced_fwk);
1133 return is_enhanced_fwk;
1134}
1135
Naresh Tanniru66cf06c2019-03-20 19:30:37 +05301136static void open_a2dp_source() {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301137 int ret = 0;
1138
Florian Pfister1a84f312018-07-19 14:38:18 +02001139 ALOGD(" Open A2DP source start ");
Naresh Tanniru66cf06c2019-03-20 19:30:37 +05301140
1141 if (a2dp.bt_lib_source_handle && a2dp.audio_source_open) {
1142 if (a2dp.bt_state_source == A2DP_STATE_DISCONNECTED) {
1143 ALOGD("calling BT stream open");
1144 ret = a2dp.audio_source_open();
1145 if(ret != 0) {
1146 ALOGE("Failed to open source stream for a2dp: status %d", ret);
Srinu Jellada99a592019-01-25 16:50:52 +05301147 }
Naresh Tanniru66cf06c2019-03-20 19:30:37 +05301148 a2dp.bt_state_source = A2DP_STATE_CONNECTED;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301149 } else {
Naresh Tanniru66cf06c2019-03-20 19:30:37 +05301150 ALOGD("Called a2dp open with improper state %d", a2dp.bt_state_source);
1151 }
1152 } else {
1153 ALOGE("a2dp handle is not identified, Ignoring open request");
1154 a2dp.bt_state_source = A2DP_STATE_DISCONNECTED;
1155 }
1156}
1157/* API to open BT IPC library to start IPC communication for BT Source*/
1158static void a2dp_source_init()
1159{
1160 ALOGD("a2dp_source_init START");
1161 if (a2dp.bt_lib_source_handle == NULL) {
1162 ALOGD("Requesting for BT lib handle");
1163 a2dp.bt_lib_source_handle = dlopen(BT_IPC_SOURCE_LIB_NAME, RTLD_NOW);
1164 if (a2dp.bt_lib_source_handle == NULL) {
1165 ALOGE("%s: dlopen failed for %s", __func__, BT_IPC_SOURCE_LIB_NAME);
1166 return;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301167 }
1168 }
1169
Naresh Tanniru66cf06c2019-03-20 19:30:37 +05301170 a2dp.bt_audio_pre_init = (bt_audio_pre_init_t)
1171 dlsym(a2dp.bt_lib_source_handle, "bt_audio_pre_init");
Srinu Jellada99a592019-01-25 16:50:52 +05301172 a2dp.audio_source_open = (audio_source_open_t)
1173 dlsym(a2dp.bt_lib_source_handle, "audio_stream_open");
1174 a2dp.audio_source_start = (audio_source_start_t)
1175 dlsym(a2dp.bt_lib_source_handle, "audio_start_stream");
sriram kumarcd549b02021-02-12 14:27:17 +05301176 if (a2dp.audio_source_start == NULL) {
1177 a2dp.audio_source_start = (audio_source_start_t)
1178 dlsym(a2dp.bt_lib_source_handle, "audio_stream_start");
1179 }
Srinu Jellada99a592019-01-25 16:50:52 +05301180 a2dp.audio_get_enc_config = (audio_get_enc_config_t)
1181 dlsym(a2dp.bt_lib_source_handle, "audio_get_codec_config");
1182 a2dp.audio_source_suspend = (audio_source_suspend_t)
1183 dlsym(a2dp.bt_lib_source_handle, "audio_suspend_stream");
sriram kumarcd549b02021-02-12 14:27:17 +05301184 if (a2dp.audio_source_suspend == NULL) {
1185 a2dp.audio_source_suspend = (audio_source_suspend_t)
1186 dlsym(a2dp.bt_lib_source_handle, "audio_stream_suspend");
1187 }
Srinu Jellada99a592019-01-25 16:50:52 +05301188 a2dp.audio_source_handoff_triggered = (audio_source_handoff_triggered_t)
1189 dlsym(a2dp.bt_lib_source_handle, "audio_handoff_triggered");
1190 a2dp.clear_source_a2dpsuspend_flag = (clear_source_a2dpsuspend_flag_t)
1191 dlsym(a2dp.bt_lib_source_handle, "clear_a2dpsuspend_flag");
sriram kumarcd549b02021-02-12 14:27:17 +05301192 if (a2dp.clear_source_a2dpsuspend_flag == NULL) {
1193 a2dp.clear_source_a2dpsuspend_flag = (clear_source_a2dpsuspend_flag_t)
1194 dlsym(a2dp.bt_lib_source_handle, "clear_a2dp_suspend_flag");
1195 }
Srinu Jellada99a592019-01-25 16:50:52 +05301196 a2dp.audio_source_stop = (audio_source_stop_t)
1197 dlsym(a2dp.bt_lib_source_handle, "audio_stop_stream");
sriram kumarcd549b02021-02-12 14:27:17 +05301198 if (a2dp.audio_source_stop == NULL) {
1199 a2dp.audio_source_stop = (audio_source_stop_t)
1200 dlsym(a2dp.bt_lib_source_handle, "audio_stream_stop");
1201 }
Srinu Jellada99a592019-01-25 16:50:52 +05301202 a2dp.audio_source_close = (audio_source_close_t)
1203 dlsym(a2dp.bt_lib_source_handle, "audio_stream_close");
1204 a2dp.audio_source_check_a2dp_ready = (audio_source_check_a2dp_ready_t)
1205 dlsym(a2dp.bt_lib_source_handle,"audio_check_a2dp_ready");
1206 a2dp.audio_sink_get_a2dp_latency = (audio_sink_get_a2dp_latency_t)
1207 dlsym(a2dp.bt_lib_source_handle,"audio_sink_get_a2dp_latency");
1208 a2dp.audio_is_source_scrambling_enabled = (audio_is_source_scrambling_enabled_t)
1209 dlsym(a2dp.bt_lib_source_handle,"audio_is_scrambling_enabled");
1210 a2dp.audio_is_tws_mono_mode_enable = (audio_is_tws_mono_mode_enable_t)
1211 dlsym(a2dp.bt_lib_source_handle,"isTwsMonomodeEnable");
1212
Srinu Jella793f5302019-07-19 15:53:55 +05301213 if (a2dp.bt_lib_source_handle && a2dp.bt_audio_pre_init) {
1214 ALOGD("calling BT module preinit");
1215 // fwk related check's will be done in the BT layer
1216 a2dp.bt_audio_pre_init();
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001217 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001218}
1219
1220/* API to open BT IPC library to start IPC communication for BT Sink*/
1221static void open_a2dp_sink()
1222{
1223 ALOGD(" Open A2DP input start ");
1224 if (a2dp.bt_lib_sink_handle == NULL){
1225 ALOGD(" Requesting for BT lib handle");
1226 a2dp.bt_lib_sink_handle = dlopen(BT_IPC_SINK_LIB_NAME, RTLD_NOW);
1227
1228 if (a2dp.bt_lib_sink_handle == NULL) {
1229 ALOGE("%s: DLOPEN failed for %s", __func__, BT_IPC_SINK_LIB_NAME);
1230 } else {
1231 a2dp.audio_sink_start = (audio_sink_start_t)
1232 dlsym(a2dp.bt_lib_sink_handle, "audio_sink_start_capture");
1233 a2dp.audio_get_dec_config = (audio_get_dec_config_t)
1234 dlsym(a2dp.bt_lib_sink_handle, "audio_get_decoder_config");
1235 a2dp.audio_sink_stop = (audio_sink_stop_t)
1236 dlsym(a2dp.bt_lib_sink_handle, "audio_sink_stop_capture");
1237 a2dp.audio_sink_check_a2dp_ready = (audio_sink_check_a2dp_ready_t)
1238 dlsym(a2dp.bt_lib_sink_handle,"audio_sink_check_a2dp_ready");
1239 a2dp.audio_sink_session_setup_complete = (audio_sink_session_setup_complete_t)
1240 dlsym(a2dp.bt_lib_sink_handle, "audio_sink_session_setup_complete");
1241 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301242 }
1243}
1244
1245static int close_a2dp_output()
1246{
1247 ALOGV("%s\n",__func__);
Florian Pfister1a84f312018-07-19 14:38:18 +02001248
1249 if (!(a2dp.bt_lib_source_handle && a2dp.audio_source_close)) {
1250 ALOGE("a2dp source handle is not identified, Ignoring close request");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301251 return -ENOSYS;
1252 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001253
1254 if (a2dp.bt_state_source != A2DP_STATE_DISCONNECTED) {
1255 ALOGD("calling BT source stream close");
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001256 if (a2dp.audio_source_close() == false)
Florian Pfister1a84f312018-07-19 14:38:18 +02001257 ALOGE("failed close a2dp source control path from BT library");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301258 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001259 a2dp.a2dp_source_started = false;
1260 a2dp.a2dp_source_total_active_session_requests = 0;
1261 a2dp.a2dp_source_suspended = false;
1262 a2dp.bt_encoder_format = CODEC_TYPE_INVALID;
Preetam Singh Ranawata1849ba2017-02-06 14:10:11 +05301263 a2dp.enc_sampling_rate = 48000;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301264 a2dp.enc_channels = 2;
Florian Pfister1a84f312018-07-19 14:38:18 +02001265 a2dp.bt_state_source = A2DP_STATE_DISCONNECTED;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001266 if (a2dp.abr_config.is_abr_enabled && a2dp.abr_config.abr_started)
1267 stop_abr();
1268 a2dp.abr_config.is_abr_enabled = false;
1269 a2dp.abr_config.abr_started = false;
1270 a2dp.abr_config.imc_instance = 0;
1271 a2dp.abr_config.abr_tx_handle = NULL;
Zhou Song12c29502019-03-16 10:37:18 +08001272 a2dp.abr_config.abr_rx_handle = NULL;
Surendar Karka2febd452018-12-13 17:56:43 +05301273 a2dp.bt_state_source = A2DP_STATE_DISCONNECTED;
Florian Pfister1a84f312018-07-19 14:38:18 +02001274
1275 return 0;
1276}
1277
1278static int close_a2dp_input()
1279{
1280 ALOGV("%s\n",__func__);
1281
1282 if (!(a2dp.bt_lib_sink_handle && a2dp.audio_source_close)) {
1283 ALOGE("a2dp sink handle is not identified, Ignoring close request");
1284 return -ENOSYS;
1285 }
1286
1287 if (a2dp.bt_state_sink != A2DP_STATE_DISCONNECTED) {
1288 ALOGD("calling BT sink stream close");
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001289 if (a2dp.audio_source_close() == false)
Florian Pfister1a84f312018-07-19 14:38:18 +02001290 ALOGE("failed close a2dp sink control path from BT library");
1291 }
1292 a2dp.a2dp_sink_started = false;
1293 a2dp.a2dp_sink_total_active_session_requests = 0;
1294 a2dp.bt_decoder_format = CODEC_TYPE_INVALID;
1295 a2dp.dec_sampling_rate = 48000;
1296 a2dp.dec_channels = 2;
1297 a2dp.bt_state_sink = A2DP_STATE_DISCONNECTED;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301298
1299 return 0;
1300}
1301
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301302static void a2dp_check_and_set_scrambler()
1303{
1304 bool scrambler_mode = false;
1305 struct mixer_ctl *ctrl_scrambler_mode = NULL;
Florian Pfister1a84f312018-07-19 14:38:18 +02001306 if (a2dp.audio_is_source_scrambling_enabled && (a2dp.bt_state_source != A2DP_STATE_DISCONNECTED))
1307 scrambler_mode = a2dp.audio_is_source_scrambling_enabled();
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301308
1309 if (scrambler_mode) {
1310 //enable scrambler in dsp
1311 ctrl_scrambler_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,
1312 MIXER_SCRAMBLER_MODE);
1313 if (!ctrl_scrambler_mode) {
Florian Pfister1a84f312018-07-19 14:38:18 +02001314 ALOGE(" ERROR scrambler mode mixer control not identified");
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301315 return;
1316 } else {
1317 if (mixer_ctl_set_value(ctrl_scrambler_mode, 0, true) != 0) {
1318 ALOGE("%s: Could not set scrambler mode", __func__);
1319 return;
1320 }
1321 }
1322 }
1323}
1324
Florian Pfister1a84f312018-07-19 14:38:18 +02001325static bool a2dp_set_backend_cfg(uint8_t direction)
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301326{
Florian Pfister1a84f312018-07-19 14:38:18 +02001327 char *rate_str = NULL, *channels = NULL;
1328 uint32_t sampling_rate;
1329 struct mixer_ctl *ctl_sample_rate = NULL, *ctrl_channels = NULL;
Zhou Songab94f062021-05-12 13:11:17 +08001330 struct mixer_ctl *adm_ctrl_channels = NULL;
Florian Pfister1a84f312018-07-19 14:38:18 +02001331 bool is_configured = false;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05301332
Florian Pfister1a84f312018-07-19 14:38:18 +02001333 if (direction == SINK) {
1334 sampling_rate = a2dp.dec_sampling_rate;
1335 } else {
1336 sampling_rate = a2dp.enc_sampling_rate;
1337 }
Zhou Song7d7ca8b2019-05-23 22:38:25 +08001338 /*
1339 * For LDAC encoder and AAC decoder open slimbus port at
1340 * 96Khz for 48Khz input and 88.2Khz for 44.1Khz input.
1341 * For APTX AD encoder, open slimbus port at 96Khz for 48Khz input.
1342 */
Florian Pfister1a84f312018-07-19 14:38:18 +02001343 if (((a2dp.bt_encoder_format == CODEC_TYPE_LDAC) ||
Surendar Karkabbb3c822018-11-12 13:00:38 +05301344 (a2dp.bt_decoder_format == CODEC_TYPE_SBC) ||
Zhou Song7d7ca8b2019-05-23 22:38:25 +08001345 (a2dp.bt_decoder_format == AUDIO_FORMAT_AAC) ||
1346 (a2dp.bt_encoder_format == CODEC_TYPE_APTX_AD)) &&
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05301347 (sampling_rate == 48000 || sampling_rate == 44100 )) {
1348 sampling_rate = sampling_rate *2;
1349 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001350
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301351 if (a2dp.bt_encoder_format == CODEC_TYPE_LC3 ||
1352 a2dp.bt_decoder_format == CODEC_TYPE_LC3)
Manisha Agarwald45632b2019-10-17 18:14:28 +08001353 sampling_rate = SAMPLING_RATE_96K;
1354
Aalique Grahame22e49102018-12-18 14:23:57 -08001355 // No need to configure backend for PCM format.
1356 if (a2dp.bt_encoder_format == CODEC_TYPE_PCM) {
1357 return 0;
1358 }
1359
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301360 //Configure backend sampling rate
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05301361 switch (sampling_rate) {
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301362 case 44100:
1363 rate_str = "KHZ_44P1";
1364 break;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301365 case 88200:
1366 rate_str = "KHZ_88P2";
1367 break;
1368 case 96000:
1369 rate_str = "KHZ_96";
1370 break;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001371 case 48000:
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301372 default:
1373 rate_str = "KHZ_48";
1374 break;
1375 }
1376
Florian Pfister1a84f312018-07-19 14:38:18 +02001377 if (direction == SINK) {
1378 ALOGD("%s: set sink backend sample rate =%s", __func__, rate_str);
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301379 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3)
1380 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1381 MIXER_SOURCE_SAMPLE_RATE_TX);
1382 else
1383 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1384 MIXER_SINK_SAMPLE_RATE);
Florian Pfister1a84f312018-07-19 14:38:18 +02001385 } else {
1386 ALOGD("%s: set source backend sample rate =%s", __func__, rate_str);
1387 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
Surendar Karka2febd452018-12-13 17:56:43 +05301388 MIXER_SAMPLE_RATE_RX);
Florian Pfister1a84f312018-07-19 14:38:18 +02001389 }
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301390 if (ctl_sample_rate) {
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001391
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301392 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1393 ALOGE("%s: Failed to set backend sample rate = %s", __func__, rate_str);
Surendar Karka2febd452018-12-13 17:56:43 +05301394 is_configured = false;
1395 goto fail;
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301396 }
1397
Surendar Karka2febd452018-12-13 17:56:43 +05301398 if (direction == SOURCE) {
1399 /* Set Tx backend sample rate */
Zhou Song12c29502019-03-16 10:37:18 +08001400 if (a2dp.abr_config.is_abr_enabled) {
Manisha Agarwald45632b2019-10-17 18:14:28 +08001401 if (a2dp.bt_encoder_format == CODEC_TYPE_APTX_AD_SPEECH ||
1402 a2dp.bt_encoder_format == CODEC_TYPE_LC3)
Zhou Song12c29502019-03-16 10:37:18 +08001403 rate_str = SPEECH_TX_SAMPLE_RATE;
1404 else
1405 rate_str = ABR_TX_SAMPLE_RATE;
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301406
Preetam Singh Ranawat225e13c2019-05-16 17:31:02 +05301407 ALOGD("%s: set backend tx sample rate = %s", __func__, rate_str);
1408 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1409 MIXER_SOURCE_SAMPLE_RATE_TX);
1410 if (!ctl_sample_rate) {
1411 ALOGE("%s: ERROR backend sample rate mixer control not identifed", __func__);
1412 is_configured = false;
1413 goto fail;
1414 }
1415
1416 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1417 ALOGE("%s: Failed to set backend sample rate = %s", __func__, rate_str);
1418 is_configured = false;
1419 goto fail;
1420 }
Surendar Karka2febd452018-12-13 17:56:43 +05301421 }
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301422 } else {
1423 /* LC3 needs to set RX sample rate as well */
1424 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3) {
1425 ALOGD("%s: set rx backend sample rate =%s", __func__, rate_str);
1426 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1427 MIXER_SAMPLE_RATE_RX);
1428 if (!ctl_sample_rate) {
1429 ALOGE("%s: ERROR backend sample rate mixer control not identifed", __func__);
1430 is_configured = false;
1431 goto fail;
1432 }
1433
1434 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1435 ALOGE("%s: Failed to set backend sample rate = %s", __func__, rate_str);
1436 is_configured = false;
1437 goto fail;
1438 }
1439 }
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301440 }
1441 } else {
1442 /* Fallback to legacy approch if MIXER_SAMPLE_RATE_RX and
1443 MIXER_SAMPLE_RATE_TX is not supported */
1444 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1445 MIXER_SAMPLE_RATE_DEFAULT);
1446 if (!ctl_sample_rate) {
1447 ALOGE("%s: ERROR backend sample rate mixer control not identifed", __func__);
Surendar Karka2febd452018-12-13 17:56:43 +05301448 is_configured = false;
1449 goto fail;
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301450 }
1451
1452 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1453 ALOGE("%s: Failed to set backend sample rate = %s", __func__, rate_str);
Florian Pfister1a84f312018-07-19 14:38:18 +02001454 is_configured = false;
1455 goto fail;
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301456 }
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301457 }
1458
Florian Pfister1a84f312018-07-19 14:38:18 +02001459 if (direction == SINK) {
1460 switch (a2dp.dec_channels) {
1461 case 1:
1462 channels = "One";
1463 break;
1464 case 2:
1465 default:
1466 channels = "Two";
1467 break;
1468 }
1469
Ramu Gottipati02809682018-12-19 16:46:12 +05301470 ALOGD("%s: set afe dec channels =%s", __func__, channels);
Zhou Songab94f062021-05-12 13:11:17 +08001471 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3) {
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301472 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1473 MIXER_AFE_SINK_CHANNELS_SLIM7);
Zhou Songab94f062021-05-12 13:11:17 +08001474 adm_ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1475 MIXER_SLIM7_TX_ADM_CHANNEL);
1476 } else {
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301477 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1478 MIXER_AFE_SINK_CHANNELS);
Zhou Songab94f062021-05-12 13:11:17 +08001479 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001480 } else {
1481 //Configure AFE enc channels
1482 switch (a2dp.enc_channels) {
1483 case 1:
1484 channels = "One";
1485 break;
1486 case 2:
1487 default:
1488 channels = "Two";
1489 break;
1490 }
1491
Ramu Gottipati02809682018-12-19 16:46:12 +05301492 ALOGD("%s: set afe enc channels =%s", __func__, channels);
Florian Pfister1a84f312018-07-19 14:38:18 +02001493 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1494 MIXER_AFE_IN_CHANNELS);
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301495 }
1496
Florian Pfister1a84f312018-07-19 14:38:18 +02001497 if (!ctrl_channels) {
1498 ALOGE(" ERROR AFE channels mixer control not identified");
1499 } else {
1500 if (mixer_ctl_set_enum_by_string(ctrl_channels, channels) != 0) {
Ramu Gottipati02809682018-12-19 16:46:12 +05301501 ALOGE("%s: Failed to set AFE channels =%s", __func__, channels);
Florian Pfister1a84f312018-07-19 14:38:18 +02001502 is_configured = false;
1503 goto fail;
1504 }
1505 }
Zhou Songab94f062021-05-12 13:11:17 +08001506 // need to set adm channel for LC3 decoder
1507 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3) {
1508 if (!adm_ctrl_channels) {
1509 ALOGE(" ERROR ADM channels mixer control not identified");
1510 } else {
1511 if (mixer_ctl_set_enum_by_string(adm_ctrl_channels, channels) != 0) {
1512 ALOGE("%s: Failed to set ADM channels =%s", __func__, channels);
1513 is_configured = false;
1514 goto fail;
1515 }
1516 }
1517 }
1518
Florian Pfister1a84f312018-07-19 14:38:18 +02001519 is_configured = true;
1520fail:
1521 return is_configured;
1522}
1523
Aniket Kumar Lata990de552019-07-11 14:20:23 -07001524bool a2dp_set_source_backend_cfg()
1525{
1526 if (a2dp.a2dp_source_started && !a2dp.a2dp_source_suspended)
1527 return a2dp_set_backend_cfg(SOURCE);
1528
1529 return false;
1530}
1531
Surendar Karkabbb3c822018-11-12 13:00:38 +05301532bool configure_aac_dec_format(audio_aac_dec_config_t *aac_bt_cfg)
Florian Pfister1a84f312018-07-19 14:38:18 +02001533{
1534 struct mixer_ctl *ctl_dec_data = NULL, *ctrl_bit_format = NULL;
1535 struct aac_dec_cfg_t aac_dsp_cfg;
1536 bool is_configured = false;
1537 int ret = 0;
1538
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001539 if (aac_bt_cfg == NULL)
Florian Pfister1a84f312018-07-19 14:38:18 +02001540 return false;
1541
Surendar Karka2febd452018-12-13 17:56:43 +05301542 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SINK_DEC_CONFIG_BLOCK);
Florian Pfister1a84f312018-07-19 14:38:18 +02001543 if (!ctl_dec_data) {
1544 ALOGE(" ERROR a2dp decoder CONFIG data mixer control not identified");
1545 is_configured = false;
1546 goto fail;
1547 }
1548
1549 memset(&aac_dsp_cfg, 0x0, sizeof(struct aac_dec_cfg_t));
1550 aac_dsp_cfg.dec_format = MEDIA_FMT_AAC;
1551 aac_dsp_cfg.data.aac_fmt_flag = aac_bt_cfg->aac_fmt_flag;
1552 aac_dsp_cfg.data.channels = aac_bt_cfg->channels;
1553 switch(aac_bt_cfg->audio_object_type) {
1554 case 0:
1555 aac_dsp_cfg.data.audio_object_type = MEDIA_FMT_AAC_AOT_LC;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301556 break;
1557 case 2:
Florian Pfister1a84f312018-07-19 14:38:18 +02001558 aac_dsp_cfg.data.audio_object_type = MEDIA_FMT_AAC_AOT_PS;
1559 break;
1560 case 1:
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301561 default:
Florian Pfister1a84f312018-07-19 14:38:18 +02001562 aac_dsp_cfg.data.audio_object_type = MEDIA_FMT_AAC_AOT_SBR;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301563 break;
1564 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001565 aac_dsp_cfg.data.total_size_of_pce_bits = aac_bt_cfg->total_size_of_pce_bits;
1566 aac_dsp_cfg.data.sampling_rate = aac_bt_cfg->sampling_rate;
1567 ret = mixer_ctl_set_array(ctl_dec_data, (void *)&aac_dsp_cfg,
1568 sizeof(struct aac_dec_cfg_t));
1569 if (ret != 0) {
1570 ALOGE("%s: failed to set AAC decoder config", __func__);
1571 is_configured = false;
1572 goto fail;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001573 }
1574
Florian Pfister1a84f312018-07-19 14:38:18 +02001575 ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
1576 MIXER_DEC_BIT_FORMAT);
1577 if (!ctrl_bit_format) {
1578 ALOGE(" ERROR Dec bit format mixer control not identified");
1579 is_configured = false;
1580 goto fail;
1581 }
1582 ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
1583 if (ret != 0) {
1584 ALOGE("%s: Failed to set bit format to decoder", __func__);
1585 is_configured = false;
1586 goto fail;
1587 }
1588
1589 is_configured = true;
1590 a2dp.bt_decoder_format = CODEC_TYPE_AAC;
1591 a2dp.dec_channels = aac_dsp_cfg.data.channels;
1592 a2dp.dec_sampling_rate = aac_dsp_cfg.data.sampling_rate;
1593 ALOGV("Successfully updated AAC dec format with sampling_rate: %d channels:%d",
1594 aac_dsp_cfg.data.sampling_rate, aac_dsp_cfg.data.channels);
1595fail:
1596 return is_configured;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301597}
1598
Samyak Jain2cddc0e2018-07-18 15:22:27 +05301599static int a2dp_set_bit_format(uint32_t enc_bit_format)
1600{
1601 const char *bit_format = NULL;
1602 struct mixer_ctl *ctrl_bit_format = NULL;
1603
1604 // Configure AFE Input Bit Format
1605 switch (enc_bit_format) {
1606 case 32:
1607 bit_format = "S32_LE";
1608 break;
1609 case 24:
1610 bit_format = "S24_LE";
1611 break;
1612 case 16:
1613 default:
1614 bit_format = "S16_LE";
1615 break;
1616 }
1617
1618 ALOGD("%s: set AFE input bit format = %d", __func__, enc_bit_format);
1619 ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
1620 MIXER_ENC_BIT_FORMAT);
1621 if (!ctrl_bit_format) {
1622 ALOGE("%s: ERROR AFE input bit format mixer control not identifed", __func__);
1623 return -ENOSYS;
1624 }
1625 if (mixer_ctl_set_enum_by_string(ctrl_bit_format, bit_format) != 0) {
1626 ALOGE("%s: Failed to set AFE input bit format = %d", __func__, enc_bit_format);
1627 return -ENOSYS;
1628 }
1629 return 0;
1630}
1631
Surendar Karka2febd452018-12-13 17:56:43 +05301632static int a2dp_reset_backend_cfg(uint8_t direction)
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301633{
Surendar Karka2febd452018-12-13 17:56:43 +05301634 const char *rate_str = "KHZ_8", *channels = "Zero";
1635 struct mixer_ctl *ctl_sample_rate = NULL, *ctl_sample_rate_tx = NULL;
Zhou Songab94f062021-05-12 13:11:17 +08001636 struct mixer_ctl *ctrl_channels = NULL, *adm_ctrl_channels = NULL;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301637
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001638 // Reset backend sampling rate
Surendar Karka2febd452018-12-13 17:56:43 +05301639 if (direction == SINK) {
1640 ALOGD("%s: reset sink backend sample rate =%s", __func__, rate_str);
1641 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1642 MIXER_SINK_SAMPLE_RATE);
1643 } else {
1644 ALOGD("%s: reset source backend sample rate =%s", __func__, rate_str);
1645 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1646 MIXER_SAMPLE_RATE_RX);
1647 }
1648 if (ctl_sample_rate) {
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301649
Surendar Karka2febd452018-12-13 17:56:43 +05301650 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1651 ALOGE("%s: Failed to reset backend sample rate = %s", __func__, rate_str);
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301652 return -ENOSYS;
1653 }
Zhou Song12c29502019-03-16 10:37:18 +08001654 if (a2dp.abr_config.is_abr_enabled) {
1655 ctl_sample_rate_tx = mixer_get_ctl_by_name(a2dp.adev->mixer,
1656 MIXER_SOURCE_SAMPLE_RATE_TX);
1657 if (!ctl_sample_rate_tx) {
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301658 ALOGE("%s: ERROR Tx backend sample rate mixer control not identifed", __func__);
1659 return -ENOSYS;
Zhou Song12c29502019-03-16 10:37:18 +08001660 }
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301661
Zhou Song12c29502019-03-16 10:37:18 +08001662 if (mixer_ctl_set_enum_by_string(ctl_sample_rate_tx, rate_str) != 0) {
1663 ALOGE("%s: Failed to reset Tx backend sample rate = %s", __func__, rate_str);
1664 return -ENOSYS;
1665 }
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301666 }
1667 } else {
Surendar Karka2febd452018-12-13 17:56:43 +05301668 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301669 MIXER_SAMPLE_RATE_DEFAULT);
Surendar Karka2febd452018-12-13 17:56:43 +05301670 if (!ctl_sample_rate) {
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301671 ALOGE("%s: ERROR backend sample rate mixer control not identifed", __func__);
1672 return -ENOSYS;
1673 }
1674
Surendar Karka2febd452018-12-13 17:56:43 +05301675 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301676 ALOGE("%s: Failed to reset backend sample rate = %s", __func__, rate_str);
1677 return -ENOSYS;
1678 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001679 }
1680
1681 // Reset AFE input channels
Surendar Karka2febd452018-12-13 17:56:43 +05301682 if (direction == SINK) {
1683 ALOGD("%s: reset afe sink channels =%s", __func__, channels);
1684 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1685 MIXER_AFE_SINK_CHANNELS);
1686 } else {
1687 ALOGD("%s: reset afe source channels =%s", __func__, channels);
1688 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1689 MIXER_AFE_IN_CHANNELS);
1690 }
1691 if (!ctrl_channels) {
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001692 ALOGE("%s: ERROR AFE input channels mixer control not identifed", __func__);
1693 return -ENOSYS;
1694 }
Surendar Karka2febd452018-12-13 17:56:43 +05301695 if (mixer_ctl_set_enum_by_string(ctrl_channels, channels) != 0) {
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001696 ALOGE("%s: Failed to reset AFE in channels = %d", __func__, a2dp.enc_channels);
1697 return -ENOSYS;
1698 }
Zhou Songab94f062021-05-12 13:11:17 +08001699 // Reset adm channels for slim7 tx if available
1700 adm_ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1701 MIXER_SLIM7_TX_ADM_CHANNEL);
1702 if (adm_ctrl_channels) {
1703 if (mixer_ctl_set_enum_by_string(adm_ctrl_channels, channels) != 0)
1704 ALOGE("%s: Failed to reset ADM in channels = %d", __func__, a2dp.dec_channels);
1705 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001706
1707 return 0;
1708}
1709
1710/* API to configure AFE decoder in DSP */
Surendar Karka2febd452018-12-13 17:56:43 +05301711static bool configure_a2dp_source_decoder_format(int dec_format)
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001712{
1713 struct mixer_ctl *ctl_dec_data = NULL;
1714 struct abr_dec_cfg_t dec_cfg;
1715 int ret = 0;
1716
1717 if (a2dp.abr_config.is_abr_enabled) {
Surendar Karka2febd452018-12-13 17:56:43 +05301718 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SOURCE_DEC_CONFIG_BLOCK);
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001719 if (!ctl_dec_data) {
1720 ALOGE("%s: ERROR A2DP codec config data mixer control not identifed", __func__);
1721 return false;
1722 }
1723 memset(&dec_cfg, 0x0, sizeof(dec_cfg));
1724 dec_cfg.dec_format = dec_format;
1725 dec_cfg.imc_info.direction = IMC_TRANSMIT;
1726 dec_cfg.imc_info.enable = IMC_ENABLE;
1727 dec_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
1728 dec_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
1729
1730 ret = mixer_ctl_set_array(ctl_dec_data, &dec_cfg,
1731 sizeof(dec_cfg));
1732 if (ret != 0) {
1733 ALOGE("%s: Failed to set decoder config", __func__);
1734 return false;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301735 }
Surendar Karka2febd452018-12-13 17:56:43 +05301736 }
1737
1738 return true;
1739}
1740
Surendar Karkabbb3c822018-11-12 13:00:38 +05301741bool configure_sbc_dec_format(audio_sbc_dec_config_t *sbc_bt_cfg)
Florian Pfister1a84f312018-07-19 14:38:18 +02001742{
1743 struct mixer_ctl *ctl_dec_data = NULL, *ctrl_bit_format = NULL;
1744 struct sbc_dec_cfg_t sbc_dsp_cfg;
1745 bool is_configured = false;
1746 int ret = 0;
1747
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001748 if (sbc_bt_cfg == NULL)
Florian Pfister1a84f312018-07-19 14:38:18 +02001749 goto fail;
1750
Surendar Karka2febd452018-12-13 17:56:43 +05301751 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SINK_DEC_CONFIG_BLOCK);
Florian Pfister1a84f312018-07-19 14:38:18 +02001752 if (!ctl_dec_data) {
1753 ALOGE(" ERROR a2dp decoder CONFIG data mixer control not identified");
1754 is_configured = false;
1755 goto fail;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301756 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001757
Florian Pfister1a84f312018-07-19 14:38:18 +02001758 memset(&sbc_dsp_cfg, 0x0, sizeof(struct sbc_dec_cfg_t));
1759 sbc_dsp_cfg.dec_format = MEDIA_FMT_SBC;
1760 sbc_dsp_cfg.data.channels = sbc_bt_cfg->channels;
1761 sbc_dsp_cfg.data.sampling_rate = sbc_bt_cfg->sampling_rate;
1762 ret = mixer_ctl_set_array(ctl_dec_data, (void *)&sbc_dsp_cfg,
1763 sizeof(struct sbc_dec_cfg_t));
Surendar Karkabbb3c822018-11-12 13:00:38 +05301764
Florian Pfister1a84f312018-07-19 14:38:18 +02001765 if (ret != 0) {
1766 ALOGE("%s: failed to set SBC decoder config", __func__);
1767 is_configured = false;
1768 goto fail;
1769 }
1770
1771 ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
1772 MIXER_DEC_BIT_FORMAT);
1773 if (!ctrl_bit_format) {
1774 ALOGE(" ERROR Dec bit format mixer control not identified");
1775 is_configured = false;
1776 goto fail;
1777 }
1778 ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
1779 if (ret != 0) {
1780 ALOGE("%s: Failed to set bit format to decoder", __func__);
1781 is_configured = false;
1782 goto fail;
1783 }
1784
1785 is_configured = true;
1786 a2dp.bt_decoder_format = CODEC_TYPE_SBC;
1787 if (sbc_dsp_cfg.data.channels == MEDIA_FMT_SBC_CHANNEL_MODE_MONO)
1788 a2dp.dec_channels = 1;
1789 else
1790 a2dp.dec_channels = 2;
1791 a2dp.dec_sampling_rate = sbc_dsp_cfg.data.sampling_rate;
1792 ALOGV("Successfully updated SBC dec format");
1793fail:
1794 return is_configured;
1795}
1796
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301797uint64_t convert_channel_map(uint32_t audio_location)
1798{
1799 int i;
1800 uint64_t channel_mask = (uint64_t) 0x00000000;
1801
1802 if (!audio_location) {
1803 channel_mask |= 1ULL << PCM_CHANNEL_C;
1804 return channel_mask;
1805 }
1806
1807 for (i = 0; i < AUDIO_LOCATION_MAX; i++) {
1808 if (audio_location & audio_location_map_array[i])
1809 channel_mask |= 1ULL << channel_map_array[i];
1810 }
1811
1812 return channel_mask;
1813}
1814
1815bool configure_lc3_enc_format(audio_lc3_codec_config_t *lc3_bt_cfg) {
1816 struct mixer_ctl *ctl_enc_data = NULL;
1817 int mixer_size = 0;
1818 int ret = 0;
1819 int i;
1820 bool is_configured = false;
1821 struct lc3_enc_cfg_t lc3_dsp_cfg;
1822 uint64_t channel_mask;
1823
1824 if (lc3_bt_cfg == NULL)
1825 return false;
1826
1827 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
1828 if (!ctl_enc_data) {
1829 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
1830 return false;
1831 }
1832
1833 /* Initialize dsp configuration params */
1834 memset(&lc3_dsp_cfg, 0x0, sizeof(struct lc3_enc_cfg_t));
1835
1836 lc3_dsp_cfg.enc_format = MEDIA_FMT_LC3;
1837 //encoder structure
1838
1839 if (lc3_bt_cfg->enc_config.stream_map_size != 0) {
1840 if (!lc3_bt_cfg->enc_config.streamMapOut[0].audio_location)
1841 a2dp.enc_channels = CH_MONO;
1842 else
1843 a2dp.enc_channels = CH_STEREO;
1844 }
1845
1846 lc3_dsp_cfg.imc_info.direction = IMC_RECEIVE;
1847 lc3_dsp_cfg.imc_info.enable = IMC_ENABLE;
1848 lc3_dsp_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
1849 lc3_dsp_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
1850 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.api_version = lc3_bt_cfg->enc_config.toAirConfig.api_version;
1851 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.sampling_freq = lc3_bt_cfg->enc_config.toAirConfig.sampling_freq;
1852 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.max_octets_per_frame = lc3_bt_cfg->enc_config.toAirConfig.max_octets_per_frame;
1853 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.frame_duration = lc3_bt_cfg->enc_config.toAirConfig.frame_duration;
1854 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.bit_depth = lc3_bt_cfg->enc_config.toAirConfig.bit_depth;
1855 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.num_blocks = lc3_bt_cfg->enc_config.toAirConfig.num_blocks;
1856 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.default_q_level = lc3_bt_cfg->enc_config.toAirConfig.default_q_level;
1857 for (i = 0; i < 16; i++)
1858 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.vendor_specific[i] = lc3_bt_cfg->enc_config.toAirConfig.vendor_specific[i];
1859 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.mode = lc3_bt_cfg->enc_config.toAirConfig.mode;
1860 lc3_dsp_cfg.enc_codec.to_Air_cfg.stream_map_size = lc3_bt_cfg->enc_config.stream_map_size;
1861 lc3_dsp_cfg.enc_codec.streamMapToAir.stream_map_size = lc3_bt_cfg->enc_config.stream_map_size;
1862
1863 for (i = 0; i < lc3_dsp_cfg.enc_codec.to_Air_cfg.stream_map_size; i++) {
1864 // for encoder stream map info
1865 lc3_dsp_cfg.enc_codec.to_Air_cfg.streamMapOut[i].audio_location = lc3_bt_cfg->enc_config.streamMapOut[i].audio_location;
1866 lc3_dsp_cfg.enc_codec.to_Air_cfg.streamMapOut[i].stream_id = lc3_bt_cfg->enc_config.streamMapOut[i].stream_id;
1867 lc3_dsp_cfg.enc_codec.to_Air_cfg.streamMapOut[i].direction = lc3_bt_cfg->enc_config.streamMapOut[i].direction;
1868 // for packetizer stream map info
1869 channel_mask = convert_channel_map(lc3_bt_cfg->enc_config.streamMapOut[i].audio_location);
1870 lc3_dsp_cfg.enc_codec.streamMapToAir.streamMap[i].stream_id = lc3_bt_cfg->enc_config.streamMapOut[i].stream_id;
1871 lc3_dsp_cfg.enc_codec.streamMapToAir.streamMap[i].direction = lc3_bt_cfg->enc_config.streamMapOut[i].direction;
1872 lc3_dsp_cfg.enc_codec.streamMapToAir.streamMap[i].channel_mask_lsw = channel_mask & 0x00000000FFFFFFFF;
1873 lc3_dsp_cfg.enc_codec.streamMapToAir.streamMap[i].channel_mask_msw = (channel_mask & 0xFFFFFFFF00000000) >> 32;
1874 }
1875
1876 /* Configure AFE DSP configuration */
1877 mixer_size = sizeof(struct lc3_enc_cfg_t);
1878 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&lc3_dsp_cfg,
1879 mixer_size);
1880 if (ret != 0) {
1881 ALOGE("%s: Failed to set lc3 encoder config", __func__);
1882 is_configured = false;
1883 goto fail;
1884 }
1885
1886 ret = a2dp_set_bit_format(ENCODER_BIT_FORMAT_PCM_24);
1887 if (ret != 0) {
1888 ALOGE("%s: Failed to set lc3 bit format", __func__);
1889 is_configured = false;
1890 goto fail;
1891 }
1892
1893 is_configured = true;
1894 a2dp.bt_encoder_format = CODEC_TYPE_LC3;
1895
1896fail:
1897 return is_configured;
1898}
1899
1900bool configure_lc3_dec_format(audio_lc3_codec_config_t *lc3_bt_cfg)
1901{
1902 struct mixer_ctl *ctl_dec_data = NULL;
1903 struct lc3_dec_cfg_t lc3_dsp_cfg;
1904 uint64_t channel_mask;
1905 bool is_configured = false;
1906 int ret = 0;
1907 int i;
1908
1909 if (lc3_bt_cfg == NULL)
1910 return false;
1911
1912 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SOURCE_DEC_CONFIG_BLOCK);
1913 if (!ctl_dec_data) {
1914 ALOGE(" ERROR a2dp decoder CONFIG data mixer control not identified");
1915 return false;
1916 }
1917
1918 memset(&lc3_dsp_cfg, 0x0, sizeof(struct lc3_dec_cfg_t));
1919
1920 lc3_dsp_cfg.abr_cfg.dec_format = MEDIA_FMT_LC3;
1921 lc3_dsp_cfg.abr_cfg.imc_info.direction = IMC_TRANSMIT;
1922 lc3_dsp_cfg.abr_cfg.imc_info.enable = IMC_ENABLE;
1923 lc3_dsp_cfg.abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
1924
1925 lc3_dsp_cfg.abr_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
1926
1927 /* To check whether decoder configuration is present or not*/
1928 if (lc3_bt_cfg->dec_config.stream_map_size != 0) {
1929 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.api_version = lc3_bt_cfg->dec_config.fromAirConfig.api_version;
1930 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.sampling_freq = lc3_bt_cfg->dec_config.fromAirConfig.sampling_freq;
1931 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.max_octets_per_frame = lc3_bt_cfg->dec_config.fromAirConfig.max_octets_per_frame;
1932 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.frame_duration = lc3_bt_cfg->dec_config.fromAirConfig.frame_duration;
1933 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.bit_depth = lc3_bt_cfg->dec_config.fromAirConfig.bit_depth;
1934 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.num_blocks = lc3_bt_cfg->dec_config.fromAirConfig.num_blocks;
1935 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.default_q_level = lc3_bt_cfg->dec_config.fromAirConfig.default_q_level;
1936 for (i = 0; i < 16; i++)
1937 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.vendor_specific[i] = lc3_bt_cfg->dec_config.fromAirConfig.vendor_specific[i];
1938 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.mode = lc3_bt_cfg->dec_config.fromAirConfig.mode;
1939 lc3_dsp_cfg.dec_codec.from_Air_cfg.decoder_output_channel = lc3_bt_cfg->dec_config.decoder_output_channel;
1940 lc3_dsp_cfg.dec_codec.from_Air_cfg.stream_map_size = lc3_bt_cfg->dec_config.stream_map_size;
1941 lc3_dsp_cfg.dec_codec.streamMapFromAir.stream_map_size = lc3_bt_cfg->dec_config.stream_map_size;
1942
1943 //for depacketizer both fromAir and toAir streamMap needs to be sent.
1944 for (i = 0; i < lc3_dsp_cfg.dec_codec.from_Air_cfg.stream_map_size; i++) {
1945 // for decoder stream map info
1946 lc3_dsp_cfg.dec_codec.from_Air_cfg.streamMapIn[i].audio_location = lc3_bt_cfg->dec_config.streamMapIn[i].audio_location;
1947 lc3_dsp_cfg.dec_codec.from_Air_cfg.streamMapIn[i].stream_id = lc3_bt_cfg->dec_config.streamMapIn[i].stream_id;
1948 lc3_dsp_cfg.dec_codec.from_Air_cfg.streamMapIn[i].direction = lc3_bt_cfg->dec_config.streamMapIn[i].direction;
1949 // for depacketizer stream map fromAir info
1950 channel_mask = convert_channel_map(lc3_bt_cfg->dec_config.streamMapIn[i].audio_location);
1951 lc3_dsp_cfg.dec_codec.streamMapFromAir.streamMap[i].stream_id = lc3_bt_cfg->dec_config.streamMapIn[i].stream_id;
1952 lc3_dsp_cfg.dec_codec.streamMapFromAir.streamMap[i].direction = lc3_bt_cfg->dec_config.streamMapIn[i].direction;
1953 lc3_dsp_cfg.dec_codec.streamMapFromAir.streamMap[i].channel_mask_lsw = channel_mask & 0x00000000FFFFFFFF;
1954 lc3_dsp_cfg.dec_codec.streamMapFromAir.streamMap[i].channel_mask_msw = (channel_mask & 0xFFFFFFFF00000000) >> 32;
1955 }
1956 }
1957
1958 lc3_dsp_cfg.dec_codec.streamMapToAir.stream_map_size = lc3_bt_cfg->enc_config.stream_map_size;
1959
1960 for (i = 0; i < lc3_bt_cfg->enc_config.stream_map_size; i++) {
1961 // for depacketizer stream map toAir info
1962 channel_mask = convert_channel_map(lc3_bt_cfg->enc_config.streamMapOut[i].audio_location);
1963 lc3_dsp_cfg.dec_codec.streamMapToAir.streamMap[i].stream_id = lc3_bt_cfg->enc_config.streamMapOut[i].stream_id;
1964 lc3_dsp_cfg.dec_codec.streamMapToAir.streamMap[i].direction = lc3_bt_cfg->enc_config.streamMapOut[i].direction;
1965 lc3_dsp_cfg.dec_codec.streamMapToAir.streamMap[i].channel_mask_lsw = channel_mask & 0x00000000FFFFFFFF;
1966 lc3_dsp_cfg.dec_codec.streamMapToAir.streamMap[i].channel_mask_msw = (channel_mask & 0xFFFFFFFF00000000) >> 32;
1967 }
1968
1969 ret = mixer_ctl_set_array(ctl_dec_data, (void *)&lc3_dsp_cfg,
1970 sizeof(struct lc3_dec_cfg_t));
1971 if (ret != 0) {
1972 ALOGE("%s: failed to set LC3 decoder config", __func__);
1973 is_configured = false;
1974 goto fail;
1975 }
1976
1977 is_configured = true;
1978 a2dp.bt_decoder_format = CODEC_TYPE_LC3;
1979 a2dp.dec_channels = CH_STEREO;
Zhou Songab94f062021-05-12 13:11:17 +08001980 a2dp.dec_sampling_rate =
1981 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.sampling_freq;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301982
1983fail:
1984 return is_configured;
1985}
1986
Florian Pfister1a84f312018-07-19 14:38:18 +02001987/* API to configure AFE decoder in DSP */
Surendar Karka2febd452018-12-13 17:56:43 +05301988static bool configure_a2dp_sink_decoder_format()
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301989{
Florian Pfister1a84f312018-07-19 14:38:18 +02001990 void *codec_info = NULL;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301991 uint8_t multi_cast = 0, num_dev = 1;
Florian Pfister1a84f312018-07-19 14:38:18 +02001992 codec_t codec_type = CODEC_TYPE_INVALID;
1993 bool is_configured = false;
1994 struct mixer_ctl *ctl_dec_data = NULL;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301995
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301996 if (a2dp.audio_get_dec_config) {
1997 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SINK_DEC_CONFIG_BLOCK);
1998 if (!ctl_dec_data) {
1999 ALOGE(" ERROR a2dp decoder CONFIG data mixer control not identified");
2000 is_configured = false;
2001 return false;
2002 }
2003 codec_info = a2dp.audio_get_dec_config(&codec_type);
2004 } else if (a2dp.audio_get_enc_config) {
2005 codec_info = a2dp.audio_get_enc_config(&multi_cast, &num_dev, &codec_type);
2006 } else {
Florian Pfister1a84f312018-07-19 14:38:18 +02002007 ALOGE(" a2dp handle is not identified, ignoring a2dp decoder config");
2008 return false;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302009 }
2010
Florian Pfister1a84f312018-07-19 14:38:18 +02002011 switch(codec_type) {
2012 case CODEC_TYPE_SBC:
2013 ALOGD(" SBC decoder supported BT device");
Surendar Karkabbb3c822018-11-12 13:00:38 +05302014 is_configured = configure_sbc_dec_format((audio_sbc_dec_config_t *)codec_info);
Florian Pfister1a84f312018-07-19 14:38:18 +02002015 break;
2016 case CODEC_TYPE_AAC:
2017 ALOGD(" AAC decoder supported BT device");
2018 is_configured =
Surendar Karkabbb3c822018-11-12 13:00:38 +05302019 configure_aac_dec_format((audio_aac_dec_config_t *)codec_info);
Florian Pfister1a84f312018-07-19 14:38:18 +02002020 break;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05302021 case CODEC_TYPE_LC3:
2022 ALOGD(" LC3 decoder supported BT device");
2023 is_configured =
2024 (configure_lc3_enc_format((audio_lc3_codec_config_t *)codec_info) &&
2025 configure_lc3_dec_format((audio_lc3_codec_config_t *)codec_info));
2026 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002027 default:
2028 ALOGD(" Received Unsupported decoder format");
2029 is_configured = false;
2030 break;
2031 }
2032 return is_configured;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302033}
2034
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302035/* API to configure SBC DSP encoder */
2036bool configure_sbc_enc_format(audio_sbc_encoder_config *sbc_bt_cfg)
2037{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302038 struct mixer_ctl *ctl_enc_data = NULL;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302039 struct sbc_enc_cfg_t sbc_dsp_cfg;
2040 bool is_configured = false;
2041 int ret = 0;
2042
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002043 if (sbc_bt_cfg == NULL)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302044 return false;
2045
2046 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2047 if (!ctl_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002048 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302049 is_configured = false;
2050 goto fail;
2051 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302052 memset(&sbc_dsp_cfg, 0x0, sizeof(struct sbc_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002053 sbc_dsp_cfg.enc_format = MEDIA_FMT_SBC;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302054 sbc_dsp_cfg.num_subbands = sbc_bt_cfg->subband;
2055 sbc_dsp_cfg.blk_len = sbc_bt_cfg->blk_len;
2056 switch(sbc_bt_cfg->channels) {
2057 case 0:
2058 sbc_dsp_cfg.channel_mode = MEDIA_FMT_SBC_CHANNEL_MODE_MONO;
2059 break;
2060 case 1:
2061 sbc_dsp_cfg.channel_mode = MEDIA_FMT_SBC_CHANNEL_MODE_DUAL_MONO;
2062 break;
2063 case 3:
2064 sbc_dsp_cfg.channel_mode = MEDIA_FMT_SBC_CHANNEL_MODE_JOINT_STEREO;
2065 break;
2066 case 2:
2067 default:
2068 sbc_dsp_cfg.channel_mode = MEDIA_FMT_SBC_CHANNEL_MODE_STEREO;
2069 break;
2070 }
2071 if (sbc_bt_cfg->alloc)
2072 sbc_dsp_cfg.alloc_method = MEDIA_FMT_SBC_ALLOCATION_METHOD_LOUDNESS;
2073 else
2074 sbc_dsp_cfg.alloc_method = MEDIA_FMT_SBC_ALLOCATION_METHOD_SNR;
2075 sbc_dsp_cfg.bit_rate = sbc_bt_cfg->bitrate;
2076 sbc_dsp_cfg.sample_rate = sbc_bt_cfg->sampling_rate;
2077 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&sbc_dsp_cfg,
2078 sizeof(struct sbc_enc_cfg_t));
2079 if (ret != 0) {
2080 ALOGE("%s: failed to set SBC encoder config", __func__);
2081 is_configured = false;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302082 goto fail;
2083 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302084 ret = a2dp_set_bit_format(sbc_bt_cfg->bits_per_sample);
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302085 if (ret != 0) {
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302086 is_configured = false;
2087 goto fail;
2088 }
2089 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002090 a2dp.bt_encoder_format = CODEC_TYPE_SBC;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302091 a2dp.enc_sampling_rate = sbc_bt_cfg->sampling_rate;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302092
2093 if (sbc_dsp_cfg.channel_mode == MEDIA_FMT_SBC_CHANNEL_MODE_MONO)
2094 a2dp.enc_channels = 1;
2095 else
2096 a2dp.enc_channels = 2;
2097
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302098 ALOGV("Successfully updated SBC enc format with samplingrate: %d channelmode:%d",
2099 sbc_dsp_cfg.sample_rate, sbc_dsp_cfg.channel_mode);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302100fail:
2101 return is_configured;
2102}
2103
Manish Dewangan6a252632017-12-04 17:27:44 +05302104#ifndef LINUX_ENABLED
Sharad Sangle95d451b2018-06-19 12:24:20 +05302105static int update_aptx_ad_dsp_config(struct aptx_ad_enc_cfg_t *aptx_dsp_cfg,
2106 audio_aptx_encoder_config *aptx_bt_cfg)
2107{
2108 int ret = 0;
2109
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002110 if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
Sharad Sangle95d451b2018-06-19 12:24:20 +05302111 ALOGE("Invalid param, aptx_dsp_cfg %p aptx_bt_cfg %p",
2112 aptx_dsp_cfg, aptx_bt_cfg);
2113 return -EINVAL;
2114 }
2115
2116 memset(aptx_dsp_cfg, 0x0, sizeof(struct aptx_ad_enc_cfg_t));
Ramu Gottipati02809682018-12-19 16:46:12 +05302117 aptx_dsp_cfg->custom_cfg.enc_format = MEDIA_FMT_APTX_AD;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302118
2119
2120 aptx_dsp_cfg->aptx_ad_cfg.sampling_freq = aptx_bt_cfg->ad_cfg->sampling_rate;
2121 aptx_dsp_cfg->aptx_ad_cfg.mtu = aptx_bt_cfg->ad_cfg->mtu;
2122 aptx_dsp_cfg->aptx_ad_cfg.channel_mode = aptx_bt_cfg->ad_cfg->channel_mode;
2123 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeA = aptx_bt_cfg->ad_cfg->min_sink_modeA;
2124 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeA = aptx_bt_cfg->ad_cfg->max_sink_modeA;
2125 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeB = aptx_bt_cfg->ad_cfg->min_sink_modeB;
2126 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeB = aptx_bt_cfg->ad_cfg->max_sink_modeB;
2127 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeC = aptx_bt_cfg->ad_cfg->min_sink_modeC;
2128 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeC = aptx_bt_cfg->ad_cfg->max_sink_modeC;
Sharad Sanglee378afe2018-09-03 20:04:17 +05302129 aptx_dsp_cfg->aptx_ad_cfg.mode = aptx_bt_cfg->ad_cfg->encoder_mode;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302130 aptx_dsp_cfg->abr_cfg.imc_info.direction = IMC_RECEIVE;
2131 aptx_dsp_cfg->abr_cfg.imc_info.enable = IMC_ENABLE;
2132 aptx_dsp_cfg->abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
2133 aptx_dsp_cfg->abr_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
2134
2135
2136 switch(aptx_dsp_cfg->aptx_ad_cfg.channel_mode) {
2137 case APTX_AD_CHANNEL_UNCHANGED:
2138 case APTX_AD_CHANNEL_JOINT_STEREO:
2139 case APTX_AD_CHANNEL_DUAL_MONO:
2140 case APTX_AD_CHANNEL_STEREO_TWS:
2141 case APTX_AD_CHANNEL_EARBUD:
2142 default:
2143 a2dp.enc_channels = CH_STEREO;
2144 aptx_dsp_cfg->custom_cfg.num_channels = CH_STEREO;
2145 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2146 aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2147 break;
2148 case APTX_AD_CHANNEL_MONO:
2149 a2dp.enc_channels = CH_MONO;
2150 aptx_dsp_cfg->custom_cfg.num_channels = CH_MONO;
2151 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
Zhou Song30e8cea2019-10-22 23:39:25 +08002152 break;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302153 }
2154 switch(aptx_dsp_cfg->aptx_ad_cfg.sampling_freq) {
2155 case APTX_AD_SR_UNCHANGED:
2156 case APTX_AD_48:
2157 default:
2158 a2dp.enc_sampling_rate = SAMPLING_RATE_48K;
2159 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_48K;
2160 break;
2161 case APTX_AD_44_1:
2162 a2dp.enc_sampling_rate = SAMPLING_RATE_441K;
2163 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_441K;
Zhou Song30e8cea2019-10-22 23:39:25 +08002164 break;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302165 }
2166 ALOGV("Successfully updated APTX AD enc format with \
2167 samplingrate: %d channels:%d",
2168 aptx_dsp_cfg->custom_cfg.sample_rate,
2169 aptx_dsp_cfg->custom_cfg.num_channels);
2170
2171 return ret;
2172}
Manisha Agarwala51768b2018-11-01 16:30:52 +05302173
Zhou Song8fccbb62019-03-20 01:08:19 +08002174static int update_aptx_ad_dsp_config_r2(struct aptx_ad_enc_cfg_r2_t *aptx_dsp_cfg,
2175 audio_aptx_encoder_config *aptx_bt_cfg)
2176{
2177 int ret = 0;
2178
2179 if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
Mingshu Pangaa429f72019-06-10 17:25:00 +08002180 ALOGE("Invalid param, aptx_dsp_cfg %pK aptx_bt_cfg %pK",
Zhou Song8fccbb62019-03-20 01:08:19 +08002181 aptx_dsp_cfg, aptx_bt_cfg);
2182 return -EINVAL;
2183 }
2184
2185 memset(aptx_dsp_cfg, 0x0, sizeof(struct aptx_ad_enc_cfg_r2_t));
2186 aptx_dsp_cfg->custom_cfg.enc_format = MEDIA_FMT_APTX_AD;
2187
2188
2189 aptx_dsp_cfg->aptx_ad_cfg.sampling_freq = aptx_bt_cfg->ad_cfg->sampling_rate;
2190 aptx_dsp_cfg->aptx_ad_cfg.mtu = aptx_bt_cfg->ad_cfg->mtu;
2191 aptx_dsp_cfg->aptx_ad_cfg.channel_mode = aptx_bt_cfg->ad_cfg->channel_mode;
2192 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeA = aptx_bt_cfg->ad_cfg->min_sink_modeA;
2193 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeA = aptx_bt_cfg->ad_cfg->max_sink_modeA;
2194 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeB = aptx_bt_cfg->ad_cfg->min_sink_modeB;
2195 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeB = aptx_bt_cfg->ad_cfg->max_sink_modeB;
2196 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeC = aptx_bt_cfg->ad_cfg->min_sink_modeC;
2197 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeC = aptx_bt_cfg->ad_cfg->max_sink_modeC;
2198 aptx_dsp_cfg->aptx_ad_cfg.mode = aptx_bt_cfg->ad_cfg->encoder_mode;
2199 aptx_dsp_cfg->aptx_ad_cfg.input_mode = aptx_bt_cfg->ad_cfg->input_mode;
2200 aptx_dsp_cfg->aptx_ad_cfg.fade_duration = aptx_bt_cfg->ad_cfg->fade_duration;
2201 for (int i = 0; i < sizeof(aptx_dsp_cfg->aptx_ad_cfg.sink_cap); i ++)
2202 aptx_dsp_cfg->aptx_ad_cfg.sink_cap[i] = aptx_bt_cfg->ad_cfg->sink_cap[i];
2203 aptx_dsp_cfg->abr_cfg.imc_info.direction = IMC_RECEIVE;
2204 aptx_dsp_cfg->abr_cfg.imc_info.enable = IMC_ENABLE;
2205 aptx_dsp_cfg->abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
2206 aptx_dsp_cfg->abr_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
2207
2208
2209 switch(aptx_dsp_cfg->aptx_ad_cfg.channel_mode) {
2210 case APTX_AD_CHANNEL_UNCHANGED:
2211 case APTX_AD_CHANNEL_JOINT_STEREO:
2212 case APTX_AD_CHANNEL_DUAL_MONO:
2213 case APTX_AD_CHANNEL_STEREO_TWS:
2214 case APTX_AD_CHANNEL_EARBUD:
2215 default:
2216 a2dp.enc_channels = CH_STEREO;
2217 aptx_dsp_cfg->custom_cfg.num_channels = CH_STEREO;
2218 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2219 aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2220 break;
2221 case APTX_AD_CHANNEL_MONO:
2222 a2dp.enc_channels = CH_MONO;
2223 aptx_dsp_cfg->custom_cfg.num_channels = CH_MONO;
2224 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
Zhou Song30e8cea2019-10-22 23:39:25 +08002225 break;
Zhou Song8fccbb62019-03-20 01:08:19 +08002226 }
2227 switch(aptx_dsp_cfg->aptx_ad_cfg.sampling_freq) {
2228 case APTX_AD_SR_UNCHANGED:
2229 case APTX_AD_48:
2230 default:
2231 a2dp.enc_sampling_rate = SAMPLING_RATE_48K;
2232 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_48K;
2233 break;
2234 case APTX_AD_44_1:
2235 a2dp.enc_sampling_rate = SAMPLING_RATE_441K;
2236 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_441K;
Zhou Song30e8cea2019-10-22 23:39:25 +08002237 break;
2238 case APTX_AD_96:
2239 a2dp.enc_sampling_rate = SAMPLING_RATE_96K;
2240 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_96K;
2241 break;
Zhou Song8fccbb62019-03-20 01:08:19 +08002242 }
2243 ALOGV("Successfully updated APTX AD enc format with \
2244 samplingrate: %d channels:%d",
2245 aptx_dsp_cfg->custom_cfg.sample_rate,
2246 aptx_dsp_cfg->custom_cfg.num_channels);
2247
2248 return ret;
2249}
2250
Manisha Agarwala51768b2018-11-01 16:30:52 +05302251static void audio_a2dp_update_tws_channel_mode()
2252{
2253 char* channel_mode;
2254 struct mixer_ctl *ctl_channel_mode;
Manisha Agarwal5bb881e2019-09-20 14:03:57 +05302255
2256 ALOGD("Update tws for mono_mode on=%d",a2dp.is_tws_mono_mode_on);
2257
Manisha Agarwala51768b2018-11-01 16:30:52 +05302258 if (a2dp.is_tws_mono_mode_on)
2259 channel_mode = "One";
2260 else
2261 channel_mode = "Two";
Manisha Agarwal5bb881e2019-09-20 14:03:57 +05302262
Manisha Agarwala51768b2018-11-01 16:30:52 +05302263 ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_TWS_CHANNEL_MODE);
2264 if (!ctl_channel_mode) {
2265 ALOGE("failed to get tws mixer ctl");
2266 return;
2267 }
2268 if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
2269 ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
2270 return;
2271 }
2272}
2273
Manisha Agarwald45632b2019-10-17 18:14:28 +08002274static void audio_a2dp_update_lc3_channel_mode()
2275{
2276 char* channel_mode;
2277 struct mixer_ctl *ctl_channel_mode;
2278
2279 ALOGD("Update lc3 for mono_mode on=%d",a2dp.is_lc3_mono_mode_on);
2280
2281 if (a2dp.is_lc3_mono_mode_on)
2282 channel_mode = "One";
2283 else
2284 channel_mode = "Two";
2285
2286 ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_LC3_CHANNEL_MODE);
2287 if (!ctl_channel_mode) {
2288 ALOGE("failed to get lc3 mixer ctl");
2289 return;
2290 }
2291 if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
2292 ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
2293 return;
2294 }
2295}
2296
Manish Dewangan6a252632017-12-04 17:27:44 +05302297static int update_aptx_dsp_config_v2(struct aptx_enc_cfg_t *aptx_dsp_cfg,
2298 audio_aptx_encoder_config *aptx_bt_cfg)
2299{
2300 int ret = 0;
2301
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002302 if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
Manish Dewangan6a252632017-12-04 17:27:44 +05302303 ALOGE("Invalid param, aptx_dsp_cfg %p aptx_bt_cfg %p",
2304 aptx_dsp_cfg, aptx_bt_cfg);
2305 return -EINVAL;
2306 }
2307
2308 memset(aptx_dsp_cfg, 0x0, sizeof(struct aptx_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002309 aptx_dsp_cfg->custom_cfg.enc_format = MEDIA_FMT_APTX;
Manish Dewangan6a252632017-12-04 17:27:44 +05302310
2311 if (!a2dp.is_aptx_dual_mono_supported) {
2312 aptx_dsp_cfg->custom_cfg.sample_rate = aptx_bt_cfg->default_cfg->sampling_rate;
2313 aptx_dsp_cfg->custom_cfg.num_channels = aptx_bt_cfg->default_cfg->channels;
2314 } else {
2315 aptx_dsp_cfg->custom_cfg.sample_rate = aptx_bt_cfg->dual_mono_cfg->sampling_rate;
2316 aptx_dsp_cfg->custom_cfg.num_channels = aptx_bt_cfg->dual_mono_cfg->channels;
2317 aptx_dsp_cfg->aptx_v2_cfg.sync_mode = aptx_bt_cfg->dual_mono_cfg->sync_mode;
2318 }
2319
2320 switch(aptx_dsp_cfg->custom_cfg.num_channels) {
2321 case 1:
2322 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
2323 break;
2324 case 2:
2325 default:
Manisha Agarwala51768b2018-11-01 16:30:52 +05302326 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2327 aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
Manish Dewangan6a252632017-12-04 17:27:44 +05302328 break;
2329 }
2330 a2dp.enc_channels = aptx_dsp_cfg->custom_cfg.num_channels;
2331 if (!a2dp.is_aptx_dual_mono_supported) {
2332 a2dp.enc_sampling_rate = aptx_bt_cfg->default_cfg->sampling_rate;
2333 ALOGV("Successfully updated APTX enc format with samplingrate: %d \
2334 channels:%d", aptx_dsp_cfg->custom_cfg.sample_rate,
2335 aptx_dsp_cfg->custom_cfg.num_channels);
2336 } else {
2337 a2dp.enc_sampling_rate = aptx_bt_cfg->dual_mono_cfg->sampling_rate;
2338 ALOGV("Successfully updated APTX dual mono enc format with \
2339 samplingrate: %d channels:%d syncmode %d",
2340 aptx_dsp_cfg->custom_cfg.sample_rate,
2341 aptx_dsp_cfg->custom_cfg.num_channels,
2342 aptx_dsp_cfg->aptx_v2_cfg.sync_mode);
2343 }
2344 return ret;
2345}
2346#else
2347static int update_aptx_dsp_config_v1(struct custom_enc_cfg_t *aptx_dsp_cfg,
2348 audio_aptx_encoder_config *aptx_bt_cfg)
2349{
2350 int ret = 0;
2351
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002352 if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
Manish Dewangan6a252632017-12-04 17:27:44 +05302353 ALOGE("Invalid param, aptx_dsp_cfg %p aptx_bt_cfg %p",
2354 aptx_dsp_cfg, aptx_bt_cfg);
2355 return -EINVAL;
2356 }
2357
2358 memset(&aptx_dsp_cfg, 0x0, sizeof(struct custom_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002359 aptx_dsp_cfg->enc_format = MEDIA_FMT_APTX;
Manish Dewangan6a252632017-12-04 17:27:44 +05302360 aptx_dsp_cfg->sample_rate = aptx_bt_cfg->sampling_rate;
2361 aptx_dsp_cfg->num_channels = aptx_bt_cfg->channels;
2362 switch(aptx_dsp_cfg->num_channels) {
2363 case 1:
2364 aptx_dsp_cfg->channel_mapping[0] = PCM_CHANNEL_C;
2365 break;
2366 case 2:
2367 default:
2368 aptx_dsp_cfg->channel_mapping[0] = PCM_CHANNEL_L;
2369 aptx_dsp_cfg->channel_mapping[1] = PCM_CHANNEL_R;
2370 break;
2371 }
2372
2373 ALOGV("Updated APTX enc format with samplingrate: %d channels:%d",
2374 aptx_dsp_cfg->sample_rate, aptx_dsp_cfg->num_channels);
2375
2376 return ret;
2377}
2378#endif
2379
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302380/* API to configure APTX DSP encoder */
2381bool configure_aptx_enc_format(audio_aptx_encoder_config *aptx_bt_cfg)
2382{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302383 struct mixer_ctl *ctl_enc_data = NULL;
Zhou Song8fccbb62019-03-20 01:08:19 +08002384 struct mixer_ctl *aptx_ad_ctl = NULL;
Zhou Song12c29502019-03-16 10:37:18 +08002385 int mixer_size = 0;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302386 bool is_configured = false;
2387 int ret = 0;
Mingshu Pangaa429f72019-06-10 17:25:00 +08002388 int sample_rate_backup = SAMPLING_RATE_48K;
Preetam Singh Ranawat109bb3c2018-01-30 12:12:02 +05302389
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002390 if (aptx_bt_cfg == NULL)
Preetam Singh Ranawat109bb3c2018-01-30 12:12:02 +05302391 return false;
2392
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002393 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2394 if (!ctl_enc_data) {
2395 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identifed");
2396 return false;
2397 }
2398
Manish Dewangan6a252632017-12-04 17:27:44 +05302399#ifndef LINUX_ENABLED
2400 struct aptx_enc_cfg_t aptx_dsp_cfg;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302401 struct aptx_ad_enc_cfg_t aptx_ad_dsp_cfg;
Zhou Song8fccbb62019-03-20 01:08:19 +08002402 struct aptx_ad_enc_cfg_r2_t aptx_ad_dsp_cfg_r2;
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002403 if (a2dp.is_aptx_adaptive) {
Zhou Song8fccbb62019-03-20 01:08:19 +08002404 aptx_ad_ctl = mixer_get_ctl_by_name(a2dp.adev->mixer,
2405 MIXER_ENC_APTX_AD_CONFIG_BLOCK);
Mingshu Pangaa429f72019-06-10 17:25:00 +08002406 if (aptx_ad_ctl)
Zhou Song8fccbb62019-03-20 01:08:19 +08002407 ret = update_aptx_ad_dsp_config_r2(&aptx_ad_dsp_cfg_r2, aptx_bt_cfg);
Mingshu Pangaa429f72019-06-10 17:25:00 +08002408 else
Zhou Song8fccbb62019-03-20 01:08:19 +08002409 ret = update_aptx_ad_dsp_config(&aptx_ad_dsp_cfg, aptx_bt_cfg);
Mingshu Pangaa429f72019-06-10 17:25:00 +08002410 } else
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002411 ret = update_aptx_dsp_config_v2(&aptx_dsp_cfg, aptx_bt_cfg);
Mingshu Pangaa429f72019-06-10 17:25:00 +08002412
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002413 if (ret) {
2414 is_configured = false;
2415 goto fail;
2416 }
2417
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002418 if (a2dp.is_aptx_adaptive) {
Zhou Song8fccbb62019-03-20 01:08:19 +08002419 if (aptx_ad_ctl)
2420 ret = mixer_ctl_set_array(aptx_ad_ctl, (void *)&aptx_ad_dsp_cfg_r2,
Mingshu Pangaa429f72019-06-10 17:25:00 +08002421 sizeof(struct aptx_ad_enc_cfg_r2_t));
Zhou Song8fccbb62019-03-20 01:08:19 +08002422 else
2423 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_ad_dsp_cfg,
Mingshu Pangaa429f72019-06-10 17:25:00 +08002424 sizeof(struct aptx_ad_enc_cfg_t));
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002425 } else {
2426 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_dsp_cfg,
Mingshu Pangaa429f72019-06-10 17:25:00 +08002427 sizeof(struct aptx_enc_cfg_t));
Sharad Sangle95d451b2018-06-19 12:24:20 +05302428 }
Manish Dewangan6a252632017-12-04 17:27:44 +05302429#else
2430 struct custom_enc_cfg_t aptx_dsp_cfg;
2431 mixer_size = sizeof(struct custom_enc_cfg_t);
2432 sample_rate_backup = aptx_bt_cfg->sampling_rate;
Manish Dewangan6a252632017-12-04 17:27:44 +05302433 ret = update_aptx_dsp_config_v1(&aptx_dsp_cfg, aptx_bt_cfg);
Manish Dewangan6a252632017-12-04 17:27:44 +05302434 if (ret) {
2435 is_configured = false;
2436 goto fail;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302437 }
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002438 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_dsp_cfg,
2439 mixer_size);
2440#endif
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302441 if (ret != 0) {
2442 ALOGE("%s: Failed to set APTX encoder config", __func__);
2443 is_configured = false;
2444 goto fail;
2445 }
Ramu Gottipati3e0d4c32018-11-05 15:57:28 +05302446#ifndef LINUX_ENABLED //Temporarily disabled for LE, need to take care while doing VT FR
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002447 if (a2dp.is_aptx_adaptive)
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302448 ret = a2dp_set_bit_format(aptx_bt_cfg->ad_cfg->bits_per_sample);
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002449 else if (a2dp.is_aptx_dual_mono_supported)
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302450 ret = a2dp_set_bit_format(aptx_bt_cfg->dual_mono_cfg->bits_per_sample);
2451 else
2452 ret = a2dp_set_bit_format(aptx_bt_cfg->default_cfg->bits_per_sample);
Ramu Gottipati3e0d4c32018-11-05 15:57:28 +05302453#endif
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302454 if (ret != 0) {
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302455 is_configured = false;
2456 goto fail;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302457 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302458 is_configured = true;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302459 if (a2dp.is_aptx_adaptive)
Surendar Karka2febd452018-12-13 17:56:43 +05302460 a2dp.bt_encoder_format = CODEC_TYPE_APTX_AD;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302461 else
Surendar Karka2febd452018-12-13 17:56:43 +05302462 a2dp.bt_encoder_format = CODEC_TYPE_APTX;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302463fail:
Manish Dewangan6a252632017-12-04 17:27:44 +05302464 /*restore sample rate */
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002465 if (!is_configured)
Manish Dewangan6a252632017-12-04 17:27:44 +05302466 a2dp.enc_sampling_rate = sample_rate_backup;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302467 return is_configured;
2468}
2469
2470/* API to configure APTX HD DSP encoder
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302471 */
Manish Dewangan6a252632017-12-04 17:27:44 +05302472#ifndef LINUX_ENABLED
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002473bool configure_aptx_hd_enc_format(audio_aptx_default_config *aptx_bt_cfg)
Manish Dewangan6a252632017-12-04 17:27:44 +05302474#else
2475bool configure_aptx_hd_enc_format(audio_aptx_encoder_config *aptx_bt_cfg)
2476#endif
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302477{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302478 struct mixer_ctl *ctl_enc_data = NULL;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302479 struct custom_enc_cfg_t aptx_dsp_cfg;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302480 bool is_configured = false;
2481 int ret = 0;
2482
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002483 if (aptx_bt_cfg == NULL)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302484 return false;
2485
2486 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2487 if (!ctl_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002488 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302489 is_configured = false;
2490 goto fail;
2491 }
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302492
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302493 memset(&aptx_dsp_cfg, 0x0, sizeof(struct custom_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002494 aptx_dsp_cfg.enc_format = MEDIA_FMT_APTX_HD;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302495 aptx_dsp_cfg.sample_rate = aptx_bt_cfg->sampling_rate;
2496 aptx_dsp_cfg.num_channels = aptx_bt_cfg->channels;
2497 switch(aptx_dsp_cfg.num_channels) {
2498 case 1:
2499 aptx_dsp_cfg.channel_mapping[0] = PCM_CHANNEL_C;
2500 break;
2501 case 2:
2502 default:
2503 aptx_dsp_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2504 aptx_dsp_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2505 break;
2506 }
2507 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_dsp_cfg,
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302508 sizeof(struct custom_enc_cfg_t));
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302509 if (ret != 0) {
2510 ALOGE("%s: Failed to set APTX HD encoder config", __func__);
2511 is_configured = false;
2512 goto fail;
2513 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302514 ret = a2dp_set_bit_format(aptx_bt_cfg->bits_per_sample);
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302515 if (ret != 0) {
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302516 is_configured = false;
2517 goto fail;
2518 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302519 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002520 a2dp.bt_encoder_format = CODEC_TYPE_APTX_HD;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302521 a2dp.enc_sampling_rate = aptx_bt_cfg->sampling_rate;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302522 a2dp.enc_channels = aptx_bt_cfg->channels;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302523 ALOGV("Successfully updated APTX HD encformat with samplingrate: %d channels:%d",
2524 aptx_dsp_cfg.sample_rate, aptx_dsp_cfg.num_channels);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302525fail:
2526 return is_configured;
2527}
2528
2529/* API to configure AAC DSP encoder */
2530bool configure_aac_enc_format(audio_aac_encoder_config *aac_bt_cfg)
2531{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302532 struct mixer_ctl *ctl_enc_data = NULL;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302533 struct aac_enc_cfg_t aac_dsp_cfg;
2534 bool is_configured = false;
2535 int ret = 0;
2536
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002537 if (aac_bt_cfg == NULL)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302538 return false;
2539
2540 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2541 if (!ctl_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002542 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302543 is_configured = false;
2544 goto fail;
2545 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302546 memset(&aac_dsp_cfg, 0x0, sizeof(struct aac_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002547 aac_dsp_cfg.enc_format = MEDIA_FMT_AAC;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302548 aac_dsp_cfg.bit_rate = aac_bt_cfg->bitrate;
Naresh Tannirua42d0bd2016-09-21 15:30:46 +05302549 aac_dsp_cfg.sample_rate = aac_bt_cfg->sampling_rate;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002550 switch (aac_bt_cfg->enc_mode) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302551 case 0:
2552 aac_dsp_cfg.enc_mode = MEDIA_FMT_AAC_AOT_LC;
2553 break;
2554 case 2:
2555 aac_dsp_cfg.enc_mode = MEDIA_FMT_AAC_AOT_PS;
2556 break;
2557 case 1:
2558 default:
2559 aac_dsp_cfg.enc_mode = MEDIA_FMT_AAC_AOT_SBR;
2560 break;
2561 }
Naresh Tannirua42d0bd2016-09-21 15:30:46 +05302562 aac_dsp_cfg.aac_fmt_flag = aac_bt_cfg->format_flag;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302563 aac_dsp_cfg.channel_cfg = aac_bt_cfg->channels;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002564
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302565 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aac_dsp_cfg,
2566 sizeof(struct aac_enc_cfg_t));
2567 if (ret != 0) {
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002568 ALOGE("%s: Failed to set AAC encoder config", __func__);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302569 is_configured = false;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302570 goto fail;
2571 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302572 ret = a2dp_set_bit_format(aac_bt_cfg->bits_per_sample);
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302573 if (ret != 0) {
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302574 is_configured = false;
2575 goto fail;
2576 }
2577 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002578 a2dp.bt_encoder_format = CODEC_TYPE_AAC;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302579 a2dp.enc_sampling_rate = aac_bt_cfg->sampling_rate;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002580 a2dp.enc_channels = aac_bt_cfg->channels;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002581 ALOGV("%s: Successfully updated AAC enc format with sampling rate: %d channels:%d",
2582 __func__, aac_dsp_cfg.sample_rate, aac_dsp_cfg.channel_cfg);
2583fail:
2584 return is_configured;
2585}
2586
2587bool configure_aac_enc_format_v2(audio_aac_encoder_config_v2 *aac_bt_cfg)
2588{
2589 struct mixer_ctl *ctl_enc_data = NULL;
2590 struct aac_enc_cfg_v2_t aac_dsp_cfg;
2591 bool is_configured = false;
2592 int ret = 0;
2593
2594 if (aac_bt_cfg == NULL)
2595 return false;
2596
2597 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2598 if (!ctl_enc_data) {
2599 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identifed");
2600 is_configured = false;
2601 goto fail;
2602 }
2603 memset(&aac_dsp_cfg, 0x0, sizeof(struct aac_enc_cfg_v2_t));
Ramu Gottipati08d82e72018-12-17 11:52:14 +05302604 aac_dsp_cfg.aac_enc_cfg.enc_format = MEDIA_FMT_AAC;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002605 aac_dsp_cfg.aac_enc_cfg.bit_rate = aac_bt_cfg->audio_aac_enc_cfg.bitrate;
2606 aac_dsp_cfg.aac_enc_cfg.sample_rate = aac_bt_cfg->audio_aac_enc_cfg.sampling_rate;
2607 switch (aac_bt_cfg->audio_aac_enc_cfg.enc_mode) {
2608 case 0:
2609 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_LC;
2610 break;
2611 case 2:
2612 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_PS;
2613 break;
2614 case 1:
2615 default:
2616 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_SBR;
2617 break;
2618 }
2619 aac_dsp_cfg.aac_enc_cfg.aac_fmt_flag = aac_bt_cfg->audio_aac_enc_cfg.format_flag;
2620 aac_dsp_cfg.aac_enc_cfg.channel_cfg = aac_bt_cfg->audio_aac_enc_cfg.channels;
2621 aac_dsp_cfg.frame_ctl.ctl_type = aac_bt_cfg->frame_ctl.ctl_type;
2622 aac_dsp_cfg.frame_ctl.ctl_value = aac_bt_cfg->frame_ctl.ctl_value;
2623
2624 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aac_dsp_cfg,
2625 sizeof(struct aac_enc_cfg_v2_t));
2626 if (ret != 0) {
2627 ALOGE("%s: Failed to set AAC encoder config", __func__);
2628 is_configured = false;
2629 goto fail;
2630 }
2631 ret = a2dp_set_bit_format(aac_bt_cfg->audio_aac_enc_cfg.bits_per_sample);
2632 if (ret != 0) {
2633 is_configured = false;
2634 goto fail;
2635 }
2636 is_configured = true;
Ramu Gottipati08d82e72018-12-17 11:52:14 +05302637 a2dp.bt_encoder_format = CODEC_TYPE_AAC;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002638 a2dp.enc_sampling_rate = aac_bt_cfg->audio_aac_enc_cfg.sampling_rate;
2639 a2dp.enc_channels = aac_bt_cfg->audio_aac_enc_cfg.channels;
2640 ALOGV("%s: Successfully updated AAC enc format with sampling rate: %d channels:%d",
2641 __func__, aac_dsp_cfg.aac_enc_cfg.sample_rate, aac_dsp_cfg.aac_enc_cfg.channel_cfg);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302642fail:
2643 return is_configured;
2644}
2645
Manisha Agarwalabb536a2020-01-30 16:12:44 +05302646bool configure_aac_enc_format_v3(audio_aac_encoder_config_v3 *aac_bt_cfg)
2647{
2648 struct mixer_ctl *ctl_enc_data = NULL;
2649 struct aac_enc_cfg_v3_t aac_dsp_cfg;
2650 struct aac_frame_size_control_t* frame_vbr_ctl = NULL;
2651 bool is_configured = false;
2652 int ret = 0;
2653
2654 if (aac_bt_cfg == NULL)
2655 return false;
2656
2657 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2658 if (!ctl_enc_data) {
2659 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identifed");
2660 is_configured = false;
2661 goto fail;
2662 }
2663 memset(&aac_dsp_cfg, 0x0, sizeof(struct aac_enc_cfg_v3_t));
2664 aac_dsp_cfg.aac_enc_cfg.enc_format = MEDIA_FMT_AAC;
2665 aac_dsp_cfg.aac_enc_cfg.bit_rate = aac_bt_cfg->audio_aac_enc_cfg.bitrate;
2666 aac_dsp_cfg.aac_enc_cfg.sample_rate = aac_bt_cfg->audio_aac_enc_cfg.sampling_rate;
2667 switch (aac_bt_cfg->audio_aac_enc_cfg.enc_mode) {
2668 case 0:
2669 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_LC;
2670 break;
2671 case 2:
2672 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_PS;
2673 break;
2674 case 1:
2675 default:
2676 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_SBR;
2677 break;
2678 }
2679 aac_dsp_cfg.aac_enc_cfg.aac_fmt_flag = aac_bt_cfg->audio_aac_enc_cfg.format_flag;
2680 aac_dsp_cfg.aac_enc_cfg.channel_cfg = aac_bt_cfg->audio_aac_enc_cfg.channels;
2681 aac_dsp_cfg.frame_ctl.ctl_type = aac_bt_cfg->frame_ctl.ctl_type;
2682 aac_dsp_cfg.frame_ctl.ctl_value = aac_bt_cfg->frame_ctl.ctl_value;
2683 frame_vbr_ctl = aac_bt_cfg->frame_ptr_ctl;
2684
2685 if (frame_vbr_ctl != NULL) {
2686 aac_dsp_cfg.aac_key_value_ctl.ctl_type = frame_vbr_ctl->ctl_type;
2687 aac_dsp_cfg.aac_key_value_ctl.ctl_value = frame_vbr_ctl->ctl_value;
2688 } else {
2689 ALOGE("%s: VBR cannot be enabled, fall back to default",__func__);
2690 aac_dsp_cfg.aac_key_value_ctl.ctl_type = 0;
2691 aac_dsp_cfg.aac_key_value_ctl.ctl_value = 0;
2692 }
2693
2694 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aac_dsp_cfg,
2695 sizeof(struct aac_enc_cfg_v3_t));
2696 if (ret != 0) {
2697 ALOGE("%s: Failed to set AAC encoder config", __func__);
2698 is_configured = false;
2699 goto fail;
2700 }
2701 ret = a2dp_set_bit_format(aac_bt_cfg->audio_aac_enc_cfg.bits_per_sample);
2702 if (ret != 0) {
2703 is_configured = false;
2704 goto fail;
2705 }
2706 is_configured = true;
2707 a2dp.bt_encoder_format = CODEC_TYPE_AAC;
2708 a2dp.enc_sampling_rate = aac_bt_cfg->audio_aac_enc_cfg.sampling_rate;
2709 a2dp.enc_channels = aac_bt_cfg->audio_aac_enc_cfg.channels;
2710 ALOGV("%s: Successfully updated AAC enc format with sampling rate: %d channels:%d",
2711 __func__, aac_dsp_cfg.aac_enc_cfg.sample_rate, aac_dsp_cfg.aac_enc_cfg.channel_cfg);
2712fail:
2713 return is_configured;
2714}
2715
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302716bool configure_celt_enc_format(audio_celt_encoder_config *celt_bt_cfg)
2717{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302718 struct mixer_ctl *ctl_enc_data = NULL;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302719 struct celt_enc_cfg_t celt_dsp_cfg;
2720 bool is_configured = false;
2721 int ret = 0;
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002722 if (celt_bt_cfg == NULL)
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302723 return false;
2724
2725 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2726 if (!ctl_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002727 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302728 is_configured = false;
2729 goto fail;
2730 }
2731 memset(&celt_dsp_cfg, 0x0, sizeof(struct celt_enc_cfg_t));
2732
Florian Pfister1a84f312018-07-19 14:38:18 +02002733 celt_dsp_cfg.custom_cfg.enc_format = MEDIA_FMT_CELT;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302734 celt_dsp_cfg.custom_cfg.sample_rate = celt_bt_cfg->sampling_rate;
2735 celt_dsp_cfg.custom_cfg.num_channels = celt_bt_cfg->channels;
2736 switch(celt_dsp_cfg.custom_cfg.num_channels) {
2737 case 1:
2738 celt_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
2739 break;
2740 case 2:
2741 default:
2742 celt_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2743 celt_dsp_cfg.custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2744 break;
2745 }
2746
2747 celt_dsp_cfg.custom_cfg.custom_size = sizeof(struct celt_enc_cfg_t);
2748
2749 celt_dsp_cfg.celt_cfg.frame_size = celt_bt_cfg->frame_size;
2750 celt_dsp_cfg.celt_cfg.complexity = celt_bt_cfg->complexity;
2751 celt_dsp_cfg.celt_cfg.prediction_mode = celt_bt_cfg->prediction_mode;
2752 celt_dsp_cfg.celt_cfg.vbr_flag = celt_bt_cfg->vbr_flag;
2753 celt_dsp_cfg.celt_cfg.bit_rate = celt_bt_cfg->bitrate;
2754
2755 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&celt_dsp_cfg,
2756 sizeof(struct celt_enc_cfg_t));
2757 if (ret != 0) {
2758 ALOGE("%s: Failed to set CELT encoder config", __func__);
2759 is_configured = false;
2760 goto fail;
2761 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302762 ret = a2dp_set_bit_format(celt_bt_cfg->bits_per_sample);
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302763 if (ret != 0) {
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302764 is_configured = false;
2765 goto fail;
2766 }
2767 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002768 a2dp.bt_encoder_format = CODEC_TYPE_CELT;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302769 a2dp.enc_sampling_rate = celt_bt_cfg->sampling_rate;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302770 a2dp.enc_channels = celt_bt_cfg->channels;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302771 ALOGV("Successfully updated CELT encformat with samplingrate: %d channels:%d",
2772 celt_dsp_cfg.custom_cfg.sample_rate, celt_dsp_cfg.custom_cfg.num_channels);
2773fail:
2774 return is_configured;
2775}
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302776
2777bool configure_ldac_enc_format(audio_ldac_encoder_config *ldac_bt_cfg)
2778{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302779 struct mixer_ctl *ldac_enc_data = NULL;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302780 struct ldac_enc_cfg_t ldac_dsp_cfg;
2781 bool is_configured = false;
2782 int ret = 0;
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002783 if (ldac_bt_cfg == NULL)
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302784 return false;
2785
2786 ldac_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2787 if (!ldac_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002788 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302789 is_configured = false;
2790 goto fail;
2791 }
2792 memset(&ldac_dsp_cfg, 0x0, sizeof(struct ldac_enc_cfg_t));
2793
Florian Pfister1a84f312018-07-19 14:38:18 +02002794 ldac_dsp_cfg.custom_cfg.enc_format = MEDIA_FMT_LDAC;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302795 ldac_dsp_cfg.custom_cfg.sample_rate = ldac_bt_cfg->sampling_rate;
2796 ldac_dsp_cfg.ldac_cfg.channel_mode = ldac_bt_cfg->channel_mode;
2797 switch(ldac_dsp_cfg.ldac_cfg.channel_mode) {
2798 case 4:
2799 ldac_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
2800 ldac_dsp_cfg.custom_cfg.num_channels = 1;
2801 break;
2802 case 2:
2803 case 1:
2804 default:
2805 ldac_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2806 ldac_dsp_cfg.custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2807 ldac_dsp_cfg.custom_cfg.num_channels = 2;
2808 break;
2809 }
2810
2811 ldac_dsp_cfg.custom_cfg.custom_size = sizeof(struct ldac_enc_cfg_t);
2812 ldac_dsp_cfg.ldac_cfg.mtu = ldac_bt_cfg->mtu;
2813 ldac_dsp_cfg.ldac_cfg.bit_rate = ldac_bt_cfg->bit_rate;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002814 if (ldac_bt_cfg->is_abr_enabled) {
2815 ldac_dsp_cfg.abr_cfg.mapping_info = ldac_bt_cfg->level_to_bitrate_map;
2816 ldac_dsp_cfg.abr_cfg.imc_info.direction = IMC_RECEIVE;
2817 ldac_dsp_cfg.abr_cfg.imc_info.enable = IMC_ENABLE;
2818 ldac_dsp_cfg.abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
2819 ldac_dsp_cfg.abr_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
Aniket Kumar Lata8c884eb2018-08-06 15:30:50 -07002820 ldac_dsp_cfg.abr_cfg.is_abr_enabled = ldac_bt_cfg->is_abr_enabled;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002821 }
2822
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302823 ret = mixer_ctl_set_array(ldac_enc_data, (void *)&ldac_dsp_cfg,
2824 sizeof(struct ldac_enc_cfg_t));
2825 if (ret != 0) {
2826 ALOGE("%s: Failed to set LDAC encoder config", __func__);
2827 is_configured = false;
2828 goto fail;
2829 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302830 ret = a2dp_set_bit_format(ldac_bt_cfg->bits_per_sample);
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302831 if (ret != 0) {
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302832 is_configured = false;
2833 goto fail;
2834 }
2835 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002836 a2dp.bt_encoder_format = CODEC_TYPE_LDAC;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302837 a2dp.enc_sampling_rate = ldac_bt_cfg->sampling_rate;
2838 a2dp.enc_channels = ldac_dsp_cfg.custom_cfg.num_channels;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002839 a2dp.abr_config.is_abr_enabled = ldac_bt_cfg->is_abr_enabled;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302840 ALOGV("Successfully updated LDAC encformat with samplingrate: %d channels:%d",
2841 ldac_dsp_cfg.custom_cfg.sample_rate, ldac_dsp_cfg.custom_cfg.num_channels);
2842fail:
2843 return is_configured;
2844}
2845
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302846bool configure_a2dp_encoder_format()
2847{
2848 void *codec_info = NULL;
2849 uint8_t multi_cast = 0, num_dev = 1;
Florian Pfister1a84f312018-07-19 14:38:18 +02002850 codec_t codec_type = CODEC_TYPE_INVALID;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302851 bool is_configured = false;
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002852 audio_aptx_encoder_config aptx_encoder_cfg;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302853
Florian Pfister1a84f312018-07-19 14:38:18 +02002854 if (!a2dp.audio_get_enc_config) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302855 ALOGE(" a2dp handle is not identified, ignoring a2dp encoder config");
2856 return false;
2857 }
2858 ALOGD("configure_a2dp_encoder_format start");
Florian Pfister1a84f312018-07-19 14:38:18 +02002859 codec_info = a2dp.audio_get_enc_config(&multi_cast, &num_dev,
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302860 &codec_type);
2861
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002862 // ABR disabled by default for all codecs
2863 a2dp.abr_config.is_abr_enabled = false;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302864 a2dp.is_aptx_adaptive = false;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002865
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302866 switch(codec_type) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002867 case CODEC_TYPE_SBC:
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302868 ALOGD(" Received SBC encoder supported BT device");
2869 is_configured =
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002870 configure_sbc_enc_format((audio_sbc_encoder_config *)codec_info);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302871 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002872 case CODEC_TYPE_APTX:
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302873 ALOGD(" Received APTX encoder supported BT device");
Manish Dewangan6a252632017-12-04 17:27:44 +05302874#ifndef LINUX_ENABLED
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002875 a2dp.is_aptx_dual_mono_supported = false;
2876 aptx_encoder_cfg.default_cfg = (audio_aptx_default_config *)codec_info;
Manish Dewangan6a252632017-12-04 17:27:44 +05302877#endif
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302878 is_configured =
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002879 configure_aptx_enc_format(&aptx_encoder_cfg);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302880 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002881 case CODEC_TYPE_APTX_HD:
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302882 ALOGD(" Received APTX HD encoder supported BT device");
Manish Dewangan6a252632017-12-04 17:27:44 +05302883#ifndef LINUX_ENABLED
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302884 is_configured =
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002885 configure_aptx_hd_enc_format((audio_aptx_default_config *)codec_info);
Manish Dewangan6a252632017-12-04 17:27:44 +05302886#else
2887 is_configured =
2888 configure_aptx_hd_enc_format((audio_aptx_encoder_config *)codec_info);
2889#endif
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002890 break;
Manish Dewangan6a252632017-12-04 17:27:44 +05302891#ifndef LINUX_ENABLED
Florian Pfister1a84f312018-07-19 14:38:18 +02002892 case CODEC_TYPE_APTX_DUAL_MONO:
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002893 ALOGD(" Received APTX dual mono encoder supported BT device");
2894 a2dp.is_aptx_dual_mono_supported = true;
Manisha Agarwala51768b2018-11-01 16:30:52 +05302895 if (a2dp.audio_is_tws_mono_mode_enable != NULL)
2896 a2dp.is_tws_mono_mode_on = a2dp.audio_is_tws_mono_mode_enable();
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002897 aptx_encoder_cfg.dual_mono_cfg = (audio_aptx_dual_mono_config *)codec_info;
2898 is_configured =
2899 configure_aptx_enc_format(&aptx_encoder_cfg);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302900 break;
Manish Dewangan6a252632017-12-04 17:27:44 +05302901#endif
Florian Pfister1a84f312018-07-19 14:38:18 +02002902 case CODEC_TYPE_AAC:
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302903 ALOGD(" Received AAC encoder supported BT device");
Manisha Agarwalabb536a2020-01-30 16:12:44 +05302904 bool is_aac_vbr_enabled =
2905 property_get_bool("persist.vendor.bt.aac_vbr_frm_ctl.enabled", false);
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002906 bool is_aac_frame_ctl_enabled =
2907 property_get_bool("persist.vendor.bt.aac_frm_ctl.enabled", false);
Manisha Agarwalabb536a2020-01-30 16:12:44 +05302908 if (is_aac_vbr_enabled)
2909 is_configured = configure_aac_enc_format_v3((audio_aac_encoder_config_v3 *) codec_info);
2910 else
2911 is_configured = is_aac_frame_ctl_enabled ?
2912 configure_aac_enc_format_v2((audio_aac_encoder_config_v2 *) codec_info) :
2913 configure_aac_enc_format((audio_aac_encoder_config *) codec_info);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302914 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002915 case CODEC_TYPE_CELT:
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302916 ALOGD(" Received CELT encoder supported BT device");
2917 is_configured =
2918 configure_celt_enc_format((audio_celt_encoder_config *)codec_info);
2919 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002920 case CODEC_TYPE_LDAC:
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302921 ALOGD(" Received LDAC encoder supported BT device");
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002922 if (!instance_id || instance_id > MAX_INSTANCE_ID)
2923 instance_id = MAX_INSTANCE_ID;
2924 a2dp.abr_config.imc_instance = instance_id--;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302925 is_configured =
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002926 (configure_ldac_enc_format((audio_ldac_encoder_config *)codec_info) &&
Surendar Karka2febd452018-12-13 17:56:43 +05302927 configure_a2dp_source_decoder_format(CODEC_TYPE_LDAC));
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302928 break;
Ramu Gottipati3e0d4c32018-11-05 15:57:28 +05302929#ifndef LINUX_ENABLED //Temporarily disabled for LE, need to take care while doing VT FR
Surendar Karka2febd452018-12-13 17:56:43 +05302930 case CODEC_TYPE_APTX_AD:
Sharad Sangle95d451b2018-06-19 12:24:20 +05302931 ALOGD(" Received APTX AD encoder supported BT device");
2932 if (!instance_id || instance_id > MAX_INSTANCE_ID)
2933 instance_id = MAX_INSTANCE_ID;
2934 a2dp.abr_config.imc_instance = instance_id--;
2935 a2dp.abr_config.is_abr_enabled = true; // for APTX Adaptive ABR is Always on
2936 a2dp.is_aptx_adaptive = true;
2937 aptx_encoder_cfg.ad_cfg = (audio_aptx_ad_config *)codec_info;
2938 is_configured =
2939 (configure_aptx_enc_format(&aptx_encoder_cfg) &&
Ramu Gottipati02809682018-12-19 16:46:12 +05302940 configure_a2dp_source_decoder_format(MEDIA_FMT_APTX_AD));
Sharad Sangle95d451b2018-06-19 12:24:20 +05302941 break;
Ramu Gottipati3e0d4c32018-11-05 15:57:28 +05302942#endif
Aalique Grahame22e49102018-12-18 14:23:57 -08002943 case CODEC_TYPE_PCM:
2944 ALOGD("Received PCM format for BT device");
2945 a2dp.bt_encoder_format = CODEC_TYPE_PCM;
2946 is_configured = true;
2947 break;
Manisha Agarwald45632b2019-10-17 18:14:28 +08002948 case CODEC_TYPE_LC3:
2949 ALOGD("Received LC3 encoder supported BT device");
2950 a2dp.bt_encoder_format = CODEC_TYPE_LC3;
2951 if (!instance_id || instance_id > MAX_INSTANCE_ID)
2952 instance_id = MAX_INSTANCE_ID;
2953 a2dp.abr_config.imc_instance = instance_id--;
2954 a2dp.abr_config.is_abr_enabled = true;
2955 is_configured =
2956 (configure_lc3_enc_format((audio_lc3_codec_config_t *)codec_info) &&
2957 configure_lc3_dec_format((audio_lc3_codec_config_t *)codec_info));
2958 break;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302959 default:
2960 ALOGD(" Received Unsupported encoder formar");
2961 is_configured = false;
2962 break;
2963 }
2964 return is_configured;
2965}
2966
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08002967int a2dp_start_playback()
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302968{
2969 int ret = 0;
2970
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08002971 ALOGD("a2dp_start_playback start");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302972
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002973 if (!(a2dp.bt_lib_source_handle && a2dp.audio_source_start
Florian Pfister1a84f312018-07-19 14:38:18 +02002974 && a2dp.audio_get_enc_config)) {
2975 ALOGE("a2dp handle is not identified, Ignoring start playback request");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302976 return -ENOSYS;
2977 }
2978
Zhou Song12c29502019-03-16 10:37:18 +08002979 if (a2dp.a2dp_source_suspended || a2dp.swb_configured) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302980 //session will be restarted after suspend completion
2981 ALOGD("a2dp start requested during suspend state");
Naresh Tannirucd2353e2016-08-19 00:37:25 +05302982 return -ENOSYS;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302983 }
2984
Florian Pfister1a84f312018-07-19 14:38:18 +02002985 if (!a2dp.a2dp_source_started && !a2dp.a2dp_source_total_active_session_requests) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302986 ALOGD("calling BT module stream start");
2987 /* This call indicates BT IPC lib to start playback */
Florian Pfister1a84f312018-07-19 14:38:18 +02002988 ret = a2dp.audio_source_start();
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302989 ALOGE("BT controller start return = %d",ret);
2990 if (ret != 0 ) {
2991 ALOGE("BT controller start failed");
Florian Pfister1a84f312018-07-19 14:38:18 +02002992 a2dp.a2dp_source_started = false;
Revathi Uddarajub26e3932020-06-10 14:51:02 +05302993 ret = -ETIMEDOUT;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302994 } else {
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002995 if (configure_a2dp_encoder_format() == true) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002996 a2dp.a2dp_source_started = true;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302997 ret = 0;
2998 ALOGD("Start playback successful to BT library");
2999 } else {
3000 ALOGD(" unable to configure DSP encoder");
Florian Pfister1a84f312018-07-19 14:38:18 +02003001 a2dp.a2dp_source_started = false;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303002 ret = -ETIMEDOUT;
3003 }
3004 }
3005 }
3006
Florian Pfister1a84f312018-07-19 14:38:18 +02003007 if (a2dp.a2dp_source_started) {
3008 a2dp.a2dp_source_total_active_session_requests++;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05303009 a2dp_check_and_set_scrambler();
Manisha Agarwal02a0b7f2019-02-06 19:24:46 +05303010 audio_a2dp_update_tws_channel_mode();
Manisha Agarwald45632b2019-10-17 18:14:28 +08003011 audio_a2dp_update_lc3_channel_mode();
Florian Pfister1a84f312018-07-19 14:38:18 +02003012 a2dp_set_backend_cfg(SOURCE);
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08003013 if (a2dp.abr_config.is_abr_enabled)
3014 start_abr();
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05303015 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303016
3017 ALOGD("start A2DP playback total active sessions :%d",
Florian Pfister1a84f312018-07-19 14:38:18 +02003018 a2dp.a2dp_source_total_active_session_requests);
3019 return ret;
3020}
3021
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003022uint64_t a2dp_get_decoder_latency()
Florian Pfister1a84f312018-07-19 14:38:18 +02003023{
3024 uint32_t latency = 0;
3025
3026 switch(a2dp.bt_decoder_format) {
3027 case CODEC_TYPE_SBC:
3028 latency = DEFAULT_SINK_LATENCY_SBC;
3029 break;
3030 case CODEC_TYPE_AAC:
3031 latency = DEFAULT_SINK_LATENCY_AAC;
3032 break;
3033 default:
3034 latency = 200;
3035 ALOGD("No valid decoder defined, setting latency to %dms", latency);
3036 break;
3037 }
3038 return (uint64_t)latency;
3039}
3040
3041bool a2dp_send_sink_setup_complete(void) {
3042 uint64_t system_latency = 0;
3043 bool is_complete = false;
3044
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003045 system_latency = a2dp_get_decoder_latency();
Florian Pfister1a84f312018-07-19 14:38:18 +02003046
3047 if (a2dp.audio_sink_session_setup_complete(system_latency) == 0) {
3048 is_complete = true;
3049 }
3050 return is_complete;
3051}
3052
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003053bool a2dp_sink_is_ready()
3054{
3055 bool ret = false;
3056
3057 if ((a2dp.bt_state_sink != A2DP_STATE_DISCONNECTED) &&
3058 (a2dp.is_a2dp_offload_supported) &&
3059 (a2dp.audio_sink_check_a2dp_ready))
3060 ret = a2dp.audio_sink_check_a2dp_ready();
3061 return ret;
3062}
3063
3064int a2dp_start_capture()
Florian Pfister1a84f312018-07-19 14:38:18 +02003065{
3066 int ret = 0;
3067
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003068 ALOGD("a2dp_start_capture start");
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303069 /* checking for sink lib for mobile platform not available then using source lib */
3070 if ((!(a2dp.bt_lib_sink_handle && a2dp.audio_sink_start
3071 && a2dp.audio_get_dec_config)) && (!(a2dp.bt_lib_source_handle && a2dp.audio_source_start
3072 && a2dp.audio_get_enc_config))) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003073 ALOGE("a2dp handle is not identified, Ignoring start capture request");
3074 return -ENOSYS;
3075 }
3076
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303077 if (a2dp.bt_lib_sink_handle && !a2dp.a2dp_sink_started
Zhou Songf7a2fdf2021-05-07 09:14:21 +08003078 && !a2dp.a2dp_sink_total_active_session_requests && a2dp.audio_sink_start) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003079 ALOGD("calling BT module stream start");
3080 /* This call indicates BT IPC lib to start capture */
3081 ret = a2dp.audio_sink_start();
3082 ALOGE("BT controller start capture return = %d",ret);
3083 if (ret != 0 ) {
3084 ALOGE("BT controller start capture failed");
3085 a2dp.a2dp_sink_started = false;
3086 } else {
3087
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003088 if (!a2dp_sink_is_ready()) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003089 ALOGD("Wait for capture ready not successful");
3090 ret = -ETIMEDOUT;
3091 }
3092
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003093 if (configure_a2dp_sink_decoder_format() == true) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003094 a2dp.a2dp_sink_started = true;
3095 ret = 0;
3096 ALOGD("Start capture successful to BT library");
3097 } else {
3098 ALOGD(" unable to configure DSP decoder");
3099 a2dp.a2dp_sink_started = false;
3100 ret = -ETIMEDOUT;
3101 }
3102
3103 if (!a2dp_send_sink_setup_complete()) {
3104 ALOGD("sink_setup_complete not successful");
3105 ret = -ETIMEDOUT;
3106 }
3107 }
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303108 } else if ((a2dp.bt_lib_source_handle) && (configure_a2dp_sink_decoder_format())) {
3109 if (a2dp.audio_source_start) {
3110 ret = a2dp.audio_source_start();
3111 if (ret == 0) {
3112 a2dp.a2dp_sink_started = true;
3113 ALOGD("Start capture successful to BT library");
3114 } else {
3115 ALOGE("BT controller start failed");
3116 }
3117 }
3118 } else {
3119 ALOGD(" unable to configure DSP decoder");
3120 a2dp.a2dp_sink_started = false;
3121 ret = -ETIMEDOUT;
Florian Pfister1a84f312018-07-19 14:38:18 +02003122 }
3123
3124 if (a2dp.a2dp_sink_started) {
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303125 if (a2dp_set_backend_cfg(SINK) == true)
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003126 a2dp.a2dp_sink_total_active_session_requests++;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303127 /* Start abr for LC3 decoder*/
3128 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3) {
3129 a2dp.abr_config.is_abr_enabled = true;
3130 start_abr();
Florian Pfister1a84f312018-07-19 14:38:18 +02003131 }
3132 }
3133
3134 ALOGD("start A2DP sink total active sessions :%d",
3135 a2dp.a2dp_sink_total_active_session_requests);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303136 return ret;
3137}
3138
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303139static void reset_a2dp_enc_config_params()
3140{
3141 int ret =0;
3142
Aalique Grahame22e49102018-12-18 14:23:57 -08003143 struct mixer_ctl *ctl_enc_config, *ctl_channel_mode;
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303144 struct sbc_enc_cfg_t dummy_reset_config;
Manisha Agarwala51768b2018-11-01 16:30:52 +05303145 char* channel_mode;
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303146
3147 memset(&dummy_reset_config, 0x0, sizeof(struct sbc_enc_cfg_t));
3148 ctl_enc_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
3149 MIXER_ENC_CONFIG_BLOCK);
3150 if (!ctl_enc_config) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003151 ALOGE(" ERROR a2dp encoder format mixer control not identified");
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303152 } else {
3153 ret = mixer_ctl_set_array(ctl_enc_config, (void *)&dummy_reset_config,
3154 sizeof(struct sbc_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02003155 a2dp.bt_encoder_format = MEDIA_FMT_NONE;
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303156 }
Aalique Grahame22e49102018-12-18 14:23:57 -08003157
3158 a2dp_set_bit_format(DEFAULT_ENCODER_BIT_FORMAT);
3159
Manisha Agarwala51768b2018-11-01 16:30:52 +05303160 ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_TWS_CHANNEL_MODE);
3161
3162 if (!ctl_channel_mode) {
3163 ALOGE("failed to get tws mixer ctl");
3164 } else {
3165 channel_mode = "Two";
3166 if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
3167 ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
3168 }
3169 a2dp.is_tws_mono_mode_on = false;
3170 }
Manisha Agarwald45632b2019-10-17 18:14:28 +08003171
3172 ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_LC3_CHANNEL_MODE);
3173
3174 if (!ctl_channel_mode) {
3175 ALOGE("failed to get lc3 mixer ctl");
3176 } else {
3177 channel_mode = "Two";
3178 if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0)
3179 ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
3180 a2dp.is_lc3_mono_mode_on = false;
3181 }
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303182}
3183
Surendar Karka2febd452018-12-13 17:56:43 +05303184static int reset_a2dp_source_dec_config_params()
Aniket Kumar Latae1220c32018-05-29 14:55:47 -07003185{
3186 struct mixer_ctl *ctl_dec_data = NULL;
3187 struct abr_dec_cfg_t dummy_reset_cfg;
3188 int ret = 0;
3189
Zhou Songf7a2fdf2021-05-07 09:14:21 +08003190 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3)
3191 a2dp.bt_decoder_format = CODEC_TYPE_INVALID;
3192
Preetam Singh Ranawat25780e42019-07-31 18:15:57 +05303193 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SOURCE_DEC_CONFIG_BLOCK);
3194 if (!ctl_dec_data) {
3195 ALOGE("%s: ERROR A2DP decoder config mixer control not identifed", __func__);
3196 return -EINVAL;
3197 }
3198 memset(&dummy_reset_cfg, 0x0, sizeof(dummy_reset_cfg));
3199 ret = mixer_ctl_set_array(ctl_dec_data, (void *)&dummy_reset_cfg,
3200 sizeof(dummy_reset_cfg));
3201 if (ret != 0) {
3202 ALOGE("%s: Failed to set dummy decoder config", __func__);
3203 return ret;
Aniket Kumar Latae1220c32018-05-29 14:55:47 -07003204 }
3205
3206 return ret;
3207}
3208
Surendar Karka2febd452018-12-13 17:56:43 +05303209static void reset_a2dp_sink_dec_config_params()
Florian Pfister1a84f312018-07-19 14:38:18 +02003210{
3211 int ret =0;
3212
3213 struct mixer_ctl *ctl_dec_config, *ctrl_bit_format;
3214 struct aac_dec_cfg_t dummy_reset_config;
3215
3216 memset(&dummy_reset_config, 0x0, sizeof(struct aac_dec_cfg_t));
3217 ctl_dec_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
Surendar Karka2febd452018-12-13 17:56:43 +05303218 MIXER_SINK_DEC_CONFIG_BLOCK);
Florian Pfister1a84f312018-07-19 14:38:18 +02003219 if (!ctl_dec_config) {
3220 ALOGE(" ERROR a2dp decoder format mixer control not identified");
3221 } else {
3222 ret = mixer_ctl_set_array(ctl_dec_config, (void *)&dummy_reset_config,
3223 sizeof(struct aac_dec_cfg_t));
3224 a2dp.bt_decoder_format = MEDIA_FMT_NONE;
3225 }
3226 ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
3227 MIXER_DEC_BIT_FORMAT);
3228 if (!ctrl_bit_format) {
3229 ALOGE(" ERROR bit format CONFIG data mixer control not identified");
3230 } else {
3231 ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
3232 if (ret != 0) {
3233 ALOGE("%s: Failed to set bit format to decoder", __func__);
3234 }
3235 }
3236}
3237
Zhou Song12c29502019-03-16 10:37:18 +08003238static void reset_codec_config()
3239{
3240 reset_a2dp_enc_config_params();
3241 reset_a2dp_source_dec_config_params();
3242 a2dp_reset_backend_cfg(SOURCE);
3243 if (a2dp.abr_config.is_abr_enabled && a2dp.abr_config.abr_started)
3244 stop_abr();
3245 a2dp.abr_config.is_abr_enabled = false;
3246}
3247
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003248int a2dp_stop_playback()
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303249{
3250 int ret =0;
3251
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003252 ALOGV("a2dp_stop_playback start");
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003253 if (!(a2dp.bt_lib_source_handle && a2dp.audio_source_stop)) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003254 ALOGE("a2dp handle is not identified, Ignoring stop request");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303255 return -ENOSYS;
3256 }
3257
Florian Pfister1a84f312018-07-19 14:38:18 +02003258 if (a2dp.a2dp_source_total_active_session_requests > 0)
3259 a2dp.a2dp_source_total_active_session_requests--;
Aalique Grahame22e49102018-12-18 14:23:57 -08003260 else
3261 ALOGE("%s: No active playback session requests on A2DP", __func__);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303262
Florian Pfister1a84f312018-07-19 14:38:18 +02003263 if ( a2dp.a2dp_source_started && !a2dp.a2dp_source_total_active_session_requests) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303264 ALOGV("calling BT module stream stop");
Florian Pfister1a84f312018-07-19 14:38:18 +02003265 ret = a2dp.audio_source_stop();
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303266 if (ret < 0)
3267 ALOGE("stop stream to BT IPC lib failed");
3268 else
3269 ALOGV("stop steam to BT IPC lib successful");
Zhou Song12c29502019-03-16 10:37:18 +08003270 if (!a2dp.a2dp_source_suspended && !a2dp.swb_configured)
3271 reset_codec_config();
Surendar Karka2febd452018-12-13 17:56:43 +05303272 a2dp.a2dp_source_started = false;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303273 }
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003274 if (!a2dp.a2dp_source_total_active_session_requests)
Florian Pfister1a84f312018-07-19 14:38:18 +02003275 a2dp.a2dp_source_started = false;
3276 ALOGD("Stop A2DP playback, total active sessions :%d",
3277 a2dp.a2dp_source_total_active_session_requests);
3278 return 0;
3279}
3280
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003281int a2dp_stop_capture()
Florian Pfister1a84f312018-07-19 14:38:18 +02003282{
3283 int ret =0;
3284
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003285 ALOGV("a2dp_stop_capture start");
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303286 if ((!(a2dp.bt_lib_sink_handle && a2dp.audio_sink_stop))
3287 && (!(a2dp.bt_lib_source_handle && a2dp.audio_source_stop))) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003288 ALOGE("a2dp handle is not identified, Ignoring stop request");
3289 return -ENOSYS;
3290 }
3291
3292 if (a2dp.a2dp_sink_total_active_session_requests > 0)
3293 a2dp.a2dp_sink_total_active_session_requests--;
3294
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303295 if (a2dp.bt_lib_sink_handle && a2dp.a2dp_sink_started
Zhou Songf7a2fdf2021-05-07 09:14:21 +08003296 && !a2dp.a2dp_sink_total_active_session_requests && a2dp.audio_sink_stop) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003297 ALOGV("calling BT module stream stop");
3298 ret = a2dp.audio_sink_stop();
3299 if (ret < 0)
3300 ALOGE("stop stream to BT IPC lib failed");
3301 else
3302 ALOGV("stop steam to BT IPC lib successful");
Surendar Karka2febd452018-12-13 17:56:43 +05303303 reset_a2dp_sink_dec_config_params();
Florian Pfister1a84f312018-07-19 14:38:18 +02003304 a2dp_reset_backend_cfg(SINK);
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303305 } else if (a2dp.bt_lib_source_handle) {
3306 ret = a2dp.audio_source_stop();
3307 if (ret < 0)
3308 ALOGE("stop stream to BT IPC lib failed");
3309 else
3310 ALOGV("stop steam to BT IPC lib successful");
Zhou Songf7a2fdf2021-05-07 09:14:21 +08003311 a2dp.bt_decoder_format = CODEC_TYPE_INVALID;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303312 reset_codec_config();
3313 a2dp.a2dp_sink_started = false;
Florian Pfister1a84f312018-07-19 14:38:18 +02003314 }
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303315
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003316 if (!a2dp.a2dp_sink_total_active_session_requests)
Florian Pfister1a84f312018-07-19 14:38:18 +02003317 a2dp.a2dp_source_started = false;
3318 ALOGD("Stop A2DP capture, total active sessions :%d",
3319 a2dp.a2dp_sink_total_active_session_requests);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303320 return 0;
3321}
3322
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003323int a2dp_set_parameters(struct str_parms *parms, bool *reconfig)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303324{
Weiyin Jiang280ea742020-09-08 20:28:22 +08003325 int ret = 0, val, status = 0;
3326 char value[32] = {0};
3327 struct audio_usecase *uc_info;
3328 struct listnode *node;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303329
Weiyin Jiang280ea742020-09-08 20:28:22 +08003330 if (a2dp.is_a2dp_offload_supported == false) {
Aalique Grahame22e49102018-12-18 14:23:57 -08003331 ALOGV("no supported encoders identified,ignoring a2dp setparam");
3332 status = -EINVAL;
3333 goto param_handled;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003334 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303335
Weiyin Jiang280ea742020-09-08 20:28:22 +08003336 ret = str_parms_get_str(parms, AUDIO_PARAMETER_DEVICE_CONNECT, value,
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303337 sizeof(value));
Weiyin Jiang280ea742020-09-08 20:28:22 +08003338 if (ret >= 0) {
3339 val = atoi(value);
3340 if (audio_is_a2dp_out_device(val)) {
3341 ALOGV("Received device connect request for A2DP source");
3342 open_a2dp_source();
3343 }
3344 goto param_handled;
3345 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303346
Weiyin Jiang280ea742020-09-08 20:28:22 +08003347 ret = str_parms_get_str(parms, AUDIO_PARAMETER_DEVICE_DISCONNECT, value,
3348 sizeof(value));
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303349
Weiyin Jiang280ea742020-09-08 20:28:22 +08003350 if (ret >= 0) {
3351 val = atoi(value);
3352 if (audio_is_a2dp_out_device(val)) {
3353 ALOGV("Received source device dis- connect request");
3354 close_a2dp_output();
3355 reset_a2dp_enc_config_params();
3356 reset_a2dp_source_dec_config_params();
3357 a2dp_reset_backend_cfg(SOURCE);
3358 } else if (audio_is_a2dp_in_device(val)) {
3359 ALOGV("Received sink device dis- connect request");
3360 close_a2dp_input();
3361 reset_a2dp_sink_dec_config_params();
3362 a2dp_reset_backend_cfg(SINK);
3363 }
3364 goto param_handled;
3365 }
Surendar Karka2febd452018-12-13 17:56:43 +05303366#ifndef LINUX_ENABLED
Weiyin Jiang280ea742020-09-08 20:28:22 +08003367 ret = str_parms_get_str(parms, "TwsChannelConfig", value, sizeof(value));
3368 if (ret >= 0) {
3369 ALOGD("Setting tws channel mode to %s",value);
3370 if (!(strncmp(value, "mono", strlen(value))))
Manisha Agarwala51768b2018-11-01 16:30:52 +05303371 a2dp.is_tws_mono_mode_on = true;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003372 else if (!(strncmp(value, "dual-mono", strlen(value))))
Manisha Agarwala51768b2018-11-01 16:30:52 +05303373 a2dp.is_tws_mono_mode_on = false;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003374 audio_a2dp_update_tws_channel_mode();
3375 goto param_handled;
3376 }
Manisha Agarwald45632b2019-10-17 18:14:28 +08003377
3378 ret = str_parms_get_str(parms, "LEAMono", value, sizeof(value));
3379 if (ret>=0) {
3380 ALOGD("Setting LC3 channel mode to %s",value);
3381 if (!(strncmp(value,"true",strlen(value))))
3382 a2dp.is_lc3_mono_mode_on = true;
3383 else
3384 a2dp.is_lc3_mono_mode_on = false;
3385 audio_a2dp_update_lc3_channel_mode();
3386 goto param_handled;
3387 }
Surendar Karka2febd452018-12-13 17:56:43 +05303388#endif
Weiyin Jiang280ea742020-09-08 20:28:22 +08003389 ret = str_parms_get_str(parms, "A2dpSuspended", value, sizeof(value));
3390 if (ret >= 0) {
3391 if (a2dp.bt_lib_source_handle == NULL)
3392 goto param_handled;
3393
3394 if ((!strncmp(value, "true", sizeof(value)))) {
3395 if (a2dp.a2dp_source_suspended) {
3396 ALOGD("%s: A2DP is already suspended", __func__);
3397 goto param_handled;
3398 }
3399 ALOGD("Setting a2dp to suspend state");
3400 a2dp.a2dp_source_suspended = true;
3401 if (a2dp.bt_state_source == A2DP_STATE_DISCONNECTED)
3402 goto param_handled;
3403 list_for_each(node, &a2dp.adev->usecase_list) {
3404 uc_info = node_to_item(node, struct audio_usecase, list);
3405 if (uc_info->type == PCM_PLAYBACK &&
3406 (uc_info->out_snd_device == SND_DEVICE_OUT_BT_A2DP ||
3407 uc_info->out_snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP ||
3408 uc_info->out_snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP)) {
3409 fp_check_a2dp_restore_l(a2dp.adev, uc_info->stream.out, false);
Aalique Grahame22e49102018-12-18 14:23:57 -08003410 }
Weiyin Jiang280ea742020-09-08 20:28:22 +08003411 }
3412 if (!a2dp.swb_configured)
3413 reset_codec_config();
3414 if (a2dp.audio_source_suspend)
3415 a2dp.audio_source_suspend();
3416 } else if (a2dp.a2dp_source_suspended == true) {
3417 ALOGD("Resetting a2dp suspend state");
3418 struct audio_usecase *uc_info;
3419 struct listnode *node;
3420 if (a2dp.clear_source_a2dpsuspend_flag)
3421 a2dp.clear_source_a2dpsuspend_flag();
3422 a2dp.a2dp_source_suspended = false;
3423 /*
3424 * It is possible that before suspend,a2dp sessions can be active
3425 * for example during music + voice activation concurrency
3426 * a2dp suspend will be called & BT will change to sco mode
3427 * though music is paused as a part of voice activation
3428 * compress session close happens only after pause timeout(10secs)
3429 * so if resume request comes before pause timeout as a2dp session
3430 * is already active IPC start will not be called from APM/audio_hw
3431 * Fix is to call a2dp start for IPC library post suspend
3432 * based on number of active session count
3433 */
3434 if (a2dp.a2dp_source_total_active_session_requests > 0) {
3435 ALOGD(" Calling IPC lib start post suspend state");
3436 if (a2dp.audio_source_start) {
3437 ret = a2dp.audio_source_start();
3438 if (ret != 0) {
3439 ALOGE("BT controller start failed");
3440 a2dp.a2dp_source_started = false;
Chaithanya Krishna Bacharaju69d2e4c2017-05-26 18:22:46 +05303441 }
3442 }
Weiyin Jiang280ea742020-09-08 20:28:22 +08003443 }
3444 list_for_each(node, &a2dp.adev->usecase_list) {
3445 uc_info = node_to_item(node, struct audio_usecase, list);
3446 if (uc_info->stream.out && uc_info->type == PCM_PLAYBACK &&
3447 is_a2dp_out_device_type(&uc_info->stream.out->device_list)) {
3448 fp_check_a2dp_restore_l(a2dp.adev, uc_info->stream.out, true);
Zhou Song10617ed2017-05-26 13:28:48 +08003449 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303450 }
3451 }
3452 goto param_handled;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003453 }
Aalique Grahame22e49102018-12-18 14:23:57 -08003454
Weiyin Jiang280ea742020-09-08 20:28:22 +08003455 ret = str_parms_get_str(parms, AUDIO_PARAMETER_RECONFIG_A2DP, value,
3456 sizeof(value));
3457 if (ret >= 0) {
3458 if (a2dp.is_a2dp_offload_supported &&
3459 a2dp.bt_state_source != A2DP_STATE_DISCONNECTED) {
3460 *reconfig = true;
3461 }
3462 goto param_handled;
3463 }
Aalique Grahame22e49102018-12-18 14:23:57 -08003464
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303465param_handled:
Weiyin Jiang280ea742020-09-08 20:28:22 +08003466 ALOGV("end of a2dp setparam");
3467 return status;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303468}
3469
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003470void a2dp_set_handoff_mode(bool is_on)
Naresh Tannirucd2353e2016-08-19 00:37:25 +05303471{
3472 a2dp.is_handoff_in_progress = is_on;
3473}
3474
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003475bool a2dp_is_force_device_switch()
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303476{
3477 //During encoder reconfiguration mode, force a2dp device switch
Ashish Jainc597d102016-12-12 10:31:34 +05303478 // Or if a2dp device is selected but earlier start failed ( as a2dp
3479 // was suspended, force retry.
Florian Pfister1a84f312018-07-19 14:38:18 +02003480 return a2dp.is_handoff_in_progress || !a2dp.a2dp_source_started;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303481}
3482
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003483void a2dp_get_enc_sample_rate(int *sample_rate)
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05303484{
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05303485 *sample_rate = a2dp.enc_sampling_rate;
3486}
Preetam Singh Ranawata1849ba2017-02-06 14:10:11 +05303487
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003488void a2dp_get_dec_sample_rate(int *sample_rate)
Florian Pfister1a84f312018-07-19 14:38:18 +02003489{
3490 *sample_rate = a2dp.dec_sampling_rate;
3491}
3492
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003493bool a2dp_source_is_ready()
Preetam Singh Ranawata1849ba2017-02-06 14:10:11 +05303494{
3495 bool ret = false;
3496
Florian Pfister1a84f312018-07-19 14:38:18 +02003497 if (a2dp.a2dp_source_suspended)
Chaithanya Krishna Bacharaju69d2e4c2017-05-26 18:22:46 +05303498 return ret;
3499
Florian Pfister1a84f312018-07-19 14:38:18 +02003500 if ((a2dp.bt_state_source != A2DP_STATE_DISCONNECTED) &&
Aniket Kumar Lata901bcb82017-03-10 15:42:46 -08003501 (a2dp.is_a2dp_offload_supported) &&
Florian Pfister1a84f312018-07-19 14:38:18 +02003502 (a2dp.audio_source_check_a2dp_ready))
3503 ret = a2dp.audio_source_check_a2dp_ready();
Preetam Singh Ranawata1849ba2017-02-06 14:10:11 +05303504 return ret;
3505}
3506
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003507bool a2dp_source_is_suspended()
Florian Pfister1a84f312018-07-19 14:38:18 +02003508{
3509 return a2dp.a2dp_source_suspended;
Chaithanya Krishna Bacharaju69d2e4c2017-05-26 18:22:46 +05303510}
3511
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003512void a2dp_init(void *adev,
Aalique Grahame6e763712019-01-31 16:18:17 -08003513 a2dp_offload_init_config_t init_config)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303514{
3515 a2dp.adev = (struct audio_device*)adev;
Florian Pfister1a84f312018-07-19 14:38:18 +02003516 a2dp.bt_lib_source_handle = NULL;
3517 a2dp.a2dp_source_started = false;
3518 a2dp.bt_state_source = A2DP_STATE_DISCONNECTED;
3519 a2dp.a2dp_source_total_active_session_requests = 0;
3520 a2dp.a2dp_source_suspended = false;
3521 a2dp.bt_encoder_format = CODEC_TYPE_INVALID;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05303522 a2dp.enc_sampling_rate = 48000;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303523 a2dp.is_handoff_in_progress = false;
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07003524 a2dp.is_aptx_dual_mono_supported = false;
Sharad Sangle95d451b2018-06-19 12:24:20 +05303525 a2dp.is_aptx_adaptive = false;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08003526 a2dp.abr_config.is_abr_enabled = false;
3527 a2dp.abr_config.abr_started = false;
3528 a2dp.abr_config.imc_instance = 0;
3529 a2dp.abr_config.abr_tx_handle = NULL;
Zhou Song12c29502019-03-16 10:37:18 +08003530 a2dp.abr_config.abr_rx_handle = NULL;
Manisha Agarwala51768b2018-11-01 16:30:52 +05303531 a2dp.is_tws_mono_mode_on = false;
Manisha Agarwald45632b2019-10-17 18:14:28 +08003532 a2dp.is_lc3_mono_mode_on = false;
Naresh Tanniru66cf06c2019-03-20 19:30:37 +05303533 a2dp_source_init();
Zhou Song12c29502019-03-16 10:37:18 +08003534 a2dp.swb_configured = false;
3535
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003536 // init function pointers
3537 fp_platform_get_pcm_device_id =
Aalique Grahame6e763712019-01-31 16:18:17 -08003538 init_config.fp_platform_get_pcm_device_id;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003539 fp_check_a2dp_restore_l = init_config.fp_check_a2dp_restore_l;
Gautam Manamfbb3ebc2020-10-08 18:06:45 +05303540 fp_platform_switch_voice_call_device_post =
3541 init_config.fp_platform_switch_voice_call_device_post;
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003542
kunleiz5a127262017-09-08 14:47:48 +08003543 reset_a2dp_enc_config_params();
Surendar Karka2febd452018-12-13 17:56:43 +05303544 reset_a2dp_source_dec_config_params();
3545 reset_a2dp_sink_dec_config_params();
Florian Pfister1a84f312018-07-19 14:38:18 +02003546
3547 a2dp.bt_lib_sink_handle = NULL;
3548 a2dp.a2dp_sink_started = false;
3549 a2dp.bt_state_sink = A2DP_STATE_DISCONNECTED;
3550 a2dp.a2dp_sink_total_active_session_requests = 0;
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003551
3552 if (is_running_with_enhanced_fwk == UNINITIALIZED)
3553 is_running_with_enhanced_fwk = check_if_enhanced_fwk();
3554 if (is_running_with_enhanced_fwk)
Aalique Grahame6e763712019-01-31 16:18:17 -08003555 open_a2dp_sink();
Florian Pfister1a84f312018-07-19 14:38:18 +02003556
3557 a2dp.is_a2dp_offload_supported = false;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303558 update_offload_codec_capabilities();
3559}
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003560
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003561uint32_t a2dp_get_encoder_latency()
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003562{
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003563 uint32_t latency = 0;
3564 int avsync_runtime_prop = 0;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05303565 int sbc_offset = 0, aptx_offset = 0, aptxhd_offset = 0,
3566 aac_offset = 0, celt_offset = 0, ldac_offset = 0;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003567 char value[PROPERTY_VALUE_MAX];
3568
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003569 memset(value, '\0', sizeof(char)*PROPERTY_VALUE_MAX);
Aalique Grahame22e49102018-12-18 14:23:57 -08003570 avsync_runtime_prop = property_get(SYSPROP_A2DP_CODEC_LATENCIES, value, NULL);
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003571 if (avsync_runtime_prop > 0) {
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05303572 if (sscanf(value, "%d/%d/%d/%d/%d%d",
3573 &sbc_offset, &aptx_offset, &aptxhd_offset, &aac_offset, &celt_offset, &ldac_offset) != 6) {
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003574 ALOGI("Failed to parse avsync offset params from '%s'.", value);
3575 avsync_runtime_prop = 0;
3576 }
3577 }
3578
yidongh0515e042017-07-06 15:00:34 +08003579 uint32_t slatency = 0;
Florian Pfister1a84f312018-07-19 14:38:18 +02003580 if (a2dp.audio_sink_get_a2dp_latency && a2dp.bt_state_source != A2DP_STATE_DISCONNECTED) {
3581 slatency = a2dp.audio_sink_get_a2dp_latency();
yidongh0515e042017-07-06 15:00:34 +08003582 }
3583
Aniket Kumar Latafaaffde2017-03-22 19:18:15 -07003584 switch(a2dp.bt_encoder_format) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003585 case CODEC_TYPE_SBC:
yidongh0515e042017-07-06 15:00:34 +08003586 latency = (avsync_runtime_prop > 0) ? sbc_offset : ENCODER_LATENCY_SBC;
3587 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_SBC : slatency;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003588 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003589 case CODEC_TYPE_APTX:
yidongh0515e042017-07-06 15:00:34 +08003590 latency = (avsync_runtime_prop > 0) ? aptx_offset : ENCODER_LATENCY_APTX;
3591 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_APTX : slatency;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003592 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003593 case CODEC_TYPE_APTX_HD:
yidongh0515e042017-07-06 15:00:34 +08003594 latency = (avsync_runtime_prop > 0) ? aptxhd_offset : ENCODER_LATENCY_APTX_HD;
3595 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_APTX_HD : slatency;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003596 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003597 case CODEC_TYPE_AAC:
yidongh0515e042017-07-06 15:00:34 +08003598 latency = (avsync_runtime_prop > 0) ? aac_offset : ENCODER_LATENCY_AAC;
3599 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_AAC : slatency;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003600 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003601 case CODEC_TYPE_CELT:
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05303602 latency = (avsync_runtime_prop > 0) ? celt_offset : ENCODER_LATENCY_CELT;
3603 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_CELT : slatency;
3604 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003605 case CODEC_TYPE_LDAC:
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05303606 latency = (avsync_runtime_prop > 0) ? ldac_offset : ENCODER_LATENCY_LDAC;
3607 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_LDAC : slatency;
3608 break;
Ramu Gottipatib729cf82018-12-20 15:36:46 +05303609 case CODEC_TYPE_APTX_AD: // for aptx adaptive the latency depends on the mode (HQ/LL) and
Sharad Sanglee378afe2018-09-03 20:04:17 +05303610 latency = slatency; // BT IPC will take care of accomodating the mode factor and return latency
Preetam Singh Ranawat79c514e2018-12-16 18:49:34 +05303611 break;
Manisha Agarwald45632b2019-10-17 18:14:28 +08003612 case CODEC_TYPE_LC3:
3613 latency = slatency;
3614 break;
Aalique Grahame22e49102018-12-18 14:23:57 -08003615 case CODEC_TYPE_PCM:
3616 latency = ENCODER_LATENCY_PCM;
3617 latency += DEFAULT_SINK_LATENCY_PCM;
3618 break;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003619 default:
3620 latency = 200;
3621 break;
3622 }
3623 return latency;
3624}
Aalique Grahame22e49102018-12-18 14:23:57 -08003625
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003626int a2dp_get_parameters(struct str_parms *query,
Aalique Grahame22e49102018-12-18 14:23:57 -08003627 struct str_parms *reply)
3628{
3629 int ret, val = 0;
3630 char value[32]={0};
3631
3632 ret = str_parms_get_str(query, AUDIO_PARAMETER_A2DP_RECONFIG_SUPPORTED,
3633 value, sizeof(value));
3634 if (ret >= 0) {
3635 val = a2dp.is_a2dp_offload_supported;
3636 str_parms_add_int(reply, AUDIO_PARAMETER_A2DP_RECONFIG_SUPPORTED, val);
3637 ALOGV("%s: called ... isReconfigA2dpSupported %d", __func__, val);
3638 }
3639
3640 return 0;
3641}
Zhou Song12c29502019-03-16 10:37:18 +08003642
3643
3644bool configure_aptx_ad_speech_enc_fmt() {
3645 struct mixer_ctl *ctl_enc_data = NULL;
3646 int mixer_size = 0;
3647 int ret = 0;
3648 struct aptx_ad_speech_enc_cfg_t aptx_dsp_cfg;
3649
3650 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
3651 if (!ctl_enc_data) {
3652 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identifed");
3653 return false;
3654 }
3655
3656 /* Initialize dsp configuration params */
3657 memset(&aptx_dsp_cfg, 0x0, sizeof(struct aptx_ad_speech_enc_cfg_t));
3658 aptx_dsp_cfg.custom_cfg.enc_format = MEDIA_FMT_APTX_AD_SPEECH;
3659 aptx_dsp_cfg.custom_cfg.sample_rate = SAMPLING_RATE_32K;
3660 aptx_dsp_cfg.custom_cfg.num_channels = CH_MONO;
3661 aptx_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
3662 aptx_dsp_cfg.imc_info.direction = IMC_RECEIVE;
3663 aptx_dsp_cfg.imc_info.enable = IMC_ENABLE;
3664 aptx_dsp_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
3665 aptx_dsp_cfg.imc_info.comm_instance = APTX_AD_SPEECH_INSTANCE_ID;
3666 aptx_dsp_cfg.speech_mode.mode = a2dp.adev->swb_speech_mode;
3667 aptx_dsp_cfg.speech_mode.swapping = SWAP_ENABLE;
3668
3669 /* Configure AFE DSP configuration */
3670 mixer_size = sizeof(struct aptx_ad_speech_enc_cfg_t);
3671 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_dsp_cfg,
3672 mixer_size);
3673 if (ret != 0) {
3674 ALOGE("%s: Failed to set SWB encoder config", __func__);
3675 return false;
3676 }
3677
3678 /* Configure AFE Input Bit Format as PCM_16 */
3679 ret = a2dp_set_bit_format(DEFAULT_ENCODER_BIT_FORMAT);
3680 if (ret != 0) {
3681 ALOGE("%s: Failed to set SWB bit format", __func__);
3682 return false;
3683 }
3684
3685 return true;
3686}
3687
3688bool configure_aptx_ad_speech_dec_fmt()
3689{
3690 struct mixer_ctl *ctl_dec_data = NULL;
3691 struct aptx_ad_speech_dec_cfg_t dec_cfg;
3692 int ret = 0;
3693
3694 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SOURCE_DEC_CONFIG_BLOCK);
3695 if (!ctl_dec_data) {
3696 ALOGE("%s: ERROR codec config data mixer control not identifed", __func__);
3697 return false;
3698 }
3699 memset(&dec_cfg, 0x0, sizeof(dec_cfg));
3700 dec_cfg.abr_cfg.dec_format = MEDIA_FMT_APTX_AD_SPEECH;
3701 dec_cfg.abr_cfg.imc_info.direction = IMC_TRANSMIT;
3702 dec_cfg.abr_cfg.imc_info.enable = IMC_ENABLE;
3703 dec_cfg.abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
3704 dec_cfg.abr_cfg.imc_info.comm_instance = APTX_AD_SPEECH_INSTANCE_ID;
3705 dec_cfg.speech_mode.mode = a2dp.adev->swb_speech_mode;
3706 dec_cfg.speech_mode.swapping = SWAP_ENABLE;
3707
3708 ret = mixer_ctl_set_array(ctl_dec_data, &dec_cfg,
3709 sizeof(dec_cfg));
3710 if (ret != 0) {
3711 ALOGE("%s: Failed to set decoder config", __func__);
3712 return false;
3713 }
3714 return true;
3715}
3716
3717int sco_start_configuration()
3718{
3719 ALOGD("sco_start_configuration start");
3720
3721 if (!a2dp.swb_configured) {
Gautam Manamfbb3ebc2020-10-08 18:06:45 +05303722 /*Before starting sco config, we must ensure to set correct acdb id
3723 because sco cofiguration will trigger port open which needs acdb_id*/
3724 fp_platform_switch_voice_call_device_post(a2dp.adev->platform,
3725 SND_DEVICE_OUT_BT_SCO_SWB,
3726 SND_DEVICE_IN_BT_SCO_MIC_SWB);
3727
Zhou Song12c29502019-03-16 10:37:18 +08003728 a2dp.bt_encoder_format = CODEC_TYPE_APTX_AD_SPEECH;
3729 /* Configure AFE codec*/
3730 if (configure_aptx_ad_speech_enc_fmt() &&
3731 configure_aptx_ad_speech_dec_fmt()) {
3732 ALOGD("%s: SCO enc/dec configured successfully", __func__);
3733 } else {
3734 ALOGE("%s: failed to send SCO configuration", __func__);
3735 return -ETIMEDOUT;
3736 }
3737 /* Configure backend*/
3738 a2dp.enc_sampling_rate = SAMPLING_RATE_96K;
3739 a2dp.enc_channels = CH_MONO;
3740 a2dp.abr_config.is_abr_enabled = true;
3741 a2dp_set_backend_cfg(SOURCE);
3742 /* Start abr*/
3743 start_abr();
3744 a2dp.swb_configured = true;
3745 }
3746 return 0;
3747}
3748
3749void sco_reset_configuration()
3750{
Zhou Songd6d71752019-05-21 18:08:51 +08003751 if (a2dp.swb_configured) {
3752 ALOGD("sco_reset_configuration start");
Zhou Song12c29502019-03-16 10:37:18 +08003753
Zhou Songd6d71752019-05-21 18:08:51 +08003754 reset_codec_config();
3755 a2dp.bt_encoder_format = CODEC_TYPE_INVALID;
3756 a2dp.swb_configured = false;
3757 }
Zhou Song12c29502019-03-16 10:37:18 +08003758}