blob: 8665d88bac8b63f4d0af73420a452fac985bfb62 [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
Sujin Panicker90f923d2021-07-14 15:04:43 +0530190typedef int (*vndk_fwk_isVendorEnhancedFwk_t)(void);
Arun Mirpuri5dc77802019-02-26 16:32:42 -0800191static 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;
Lakshman Chaluvarajuefecf102021-06-18 14:32:41 +05301149 if (!a2dp.adev->bt_sco_on)
1150 a2dp.a2dp_source_suspended = false;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301151 } else {
Naresh Tanniru66cf06c2019-03-20 19:30:37 +05301152 ALOGD("Called a2dp open with improper state %d", a2dp.bt_state_source);
1153 }
1154 } else {
1155 ALOGE("a2dp handle is not identified, Ignoring open request");
1156 a2dp.bt_state_source = A2DP_STATE_DISCONNECTED;
1157 }
1158}
1159/* API to open BT IPC library to start IPC communication for BT Source*/
1160static void a2dp_source_init()
1161{
1162 ALOGD("a2dp_source_init START");
1163 if (a2dp.bt_lib_source_handle == NULL) {
1164 ALOGD("Requesting for BT lib handle");
1165 a2dp.bt_lib_source_handle = dlopen(BT_IPC_SOURCE_LIB_NAME, RTLD_NOW);
1166 if (a2dp.bt_lib_source_handle == NULL) {
1167 ALOGE("%s: dlopen failed for %s", __func__, BT_IPC_SOURCE_LIB_NAME);
1168 return;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301169 }
1170 }
1171
Naresh Tanniru66cf06c2019-03-20 19:30:37 +05301172 a2dp.bt_audio_pre_init = (bt_audio_pre_init_t)
1173 dlsym(a2dp.bt_lib_source_handle, "bt_audio_pre_init");
Srinu Jellada99a592019-01-25 16:50:52 +05301174 a2dp.audio_source_open = (audio_source_open_t)
1175 dlsym(a2dp.bt_lib_source_handle, "audio_stream_open");
1176 a2dp.audio_source_start = (audio_source_start_t)
1177 dlsym(a2dp.bt_lib_source_handle, "audio_start_stream");
sriram kumarcd549b02021-02-12 14:27:17 +05301178 if (a2dp.audio_source_start == NULL) {
1179 a2dp.audio_source_start = (audio_source_start_t)
1180 dlsym(a2dp.bt_lib_source_handle, "audio_stream_start");
1181 }
Srinu Jellada99a592019-01-25 16:50:52 +05301182 a2dp.audio_get_enc_config = (audio_get_enc_config_t)
1183 dlsym(a2dp.bt_lib_source_handle, "audio_get_codec_config");
1184 a2dp.audio_source_suspend = (audio_source_suspend_t)
1185 dlsym(a2dp.bt_lib_source_handle, "audio_suspend_stream");
sriram kumarcd549b02021-02-12 14:27:17 +05301186 if (a2dp.audio_source_suspend == NULL) {
1187 a2dp.audio_source_suspend = (audio_source_suspend_t)
1188 dlsym(a2dp.bt_lib_source_handle, "audio_stream_suspend");
1189 }
Srinu Jellada99a592019-01-25 16:50:52 +05301190 a2dp.audio_source_handoff_triggered = (audio_source_handoff_triggered_t)
1191 dlsym(a2dp.bt_lib_source_handle, "audio_handoff_triggered");
1192 a2dp.clear_source_a2dpsuspend_flag = (clear_source_a2dpsuspend_flag_t)
1193 dlsym(a2dp.bt_lib_source_handle, "clear_a2dpsuspend_flag");
sriram kumarcd549b02021-02-12 14:27:17 +05301194 if (a2dp.clear_source_a2dpsuspend_flag == NULL) {
1195 a2dp.clear_source_a2dpsuspend_flag = (clear_source_a2dpsuspend_flag_t)
1196 dlsym(a2dp.bt_lib_source_handle, "clear_a2dp_suspend_flag");
1197 }
Srinu Jellada99a592019-01-25 16:50:52 +05301198 a2dp.audio_source_stop = (audio_source_stop_t)
1199 dlsym(a2dp.bt_lib_source_handle, "audio_stop_stream");
sriram kumarcd549b02021-02-12 14:27:17 +05301200 if (a2dp.audio_source_stop == NULL) {
1201 a2dp.audio_source_stop = (audio_source_stop_t)
1202 dlsym(a2dp.bt_lib_source_handle, "audio_stream_stop");
1203 }
Srinu Jellada99a592019-01-25 16:50:52 +05301204 a2dp.audio_source_close = (audio_source_close_t)
1205 dlsym(a2dp.bt_lib_source_handle, "audio_stream_close");
1206 a2dp.audio_source_check_a2dp_ready = (audio_source_check_a2dp_ready_t)
1207 dlsym(a2dp.bt_lib_source_handle,"audio_check_a2dp_ready");
1208 a2dp.audio_sink_get_a2dp_latency = (audio_sink_get_a2dp_latency_t)
1209 dlsym(a2dp.bt_lib_source_handle,"audio_sink_get_a2dp_latency");
1210 a2dp.audio_is_source_scrambling_enabled = (audio_is_source_scrambling_enabled_t)
1211 dlsym(a2dp.bt_lib_source_handle,"audio_is_scrambling_enabled");
1212 a2dp.audio_is_tws_mono_mode_enable = (audio_is_tws_mono_mode_enable_t)
1213 dlsym(a2dp.bt_lib_source_handle,"isTwsMonomodeEnable");
1214
Srinu Jella793f5302019-07-19 15:53:55 +05301215 if (a2dp.bt_lib_source_handle && a2dp.bt_audio_pre_init) {
1216 ALOGD("calling BT module preinit");
1217 // fwk related check's will be done in the BT layer
1218 a2dp.bt_audio_pre_init();
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001219 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001220}
1221
1222/* API to open BT IPC library to start IPC communication for BT Sink*/
1223static void open_a2dp_sink()
1224{
1225 ALOGD(" Open A2DP input start ");
1226 if (a2dp.bt_lib_sink_handle == NULL){
1227 ALOGD(" Requesting for BT lib handle");
1228 a2dp.bt_lib_sink_handle = dlopen(BT_IPC_SINK_LIB_NAME, RTLD_NOW);
1229
1230 if (a2dp.bt_lib_sink_handle == NULL) {
1231 ALOGE("%s: DLOPEN failed for %s", __func__, BT_IPC_SINK_LIB_NAME);
1232 } else {
1233 a2dp.audio_sink_start = (audio_sink_start_t)
1234 dlsym(a2dp.bt_lib_sink_handle, "audio_sink_start_capture");
1235 a2dp.audio_get_dec_config = (audio_get_dec_config_t)
1236 dlsym(a2dp.bt_lib_sink_handle, "audio_get_decoder_config");
1237 a2dp.audio_sink_stop = (audio_sink_stop_t)
1238 dlsym(a2dp.bt_lib_sink_handle, "audio_sink_stop_capture");
1239 a2dp.audio_sink_check_a2dp_ready = (audio_sink_check_a2dp_ready_t)
1240 dlsym(a2dp.bt_lib_sink_handle,"audio_sink_check_a2dp_ready");
1241 a2dp.audio_sink_session_setup_complete = (audio_sink_session_setup_complete_t)
1242 dlsym(a2dp.bt_lib_sink_handle, "audio_sink_session_setup_complete");
1243 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301244 }
1245}
1246
1247static int close_a2dp_output()
1248{
1249 ALOGV("%s\n",__func__);
Florian Pfister1a84f312018-07-19 14:38:18 +02001250
1251 if (!(a2dp.bt_lib_source_handle && a2dp.audio_source_close)) {
1252 ALOGE("a2dp source handle is not identified, Ignoring close request");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301253 return -ENOSYS;
1254 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001255
1256 if (a2dp.bt_state_source != A2DP_STATE_DISCONNECTED) {
1257 ALOGD("calling BT source stream close");
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001258 if (a2dp.audio_source_close() == false)
Florian Pfister1a84f312018-07-19 14:38:18 +02001259 ALOGE("failed close a2dp source control path from BT library");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301260 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001261 a2dp.a2dp_source_started = false;
1262 a2dp.a2dp_source_total_active_session_requests = 0;
Lakshman Chaluvarajuefecf102021-06-18 14:32:41 +05301263 if (!a2dp.adev->bt_sco_on)
1264 a2dp.a2dp_source_suspended = false;
Florian Pfister1a84f312018-07-19 14:38:18 +02001265 a2dp.bt_encoder_format = CODEC_TYPE_INVALID;
Preetam Singh Ranawata1849ba2017-02-06 14:10:11 +05301266 a2dp.enc_sampling_rate = 48000;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301267 a2dp.enc_channels = 2;
Florian Pfister1a84f312018-07-19 14:38:18 +02001268 a2dp.bt_state_source = A2DP_STATE_DISCONNECTED;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001269 if (a2dp.abr_config.is_abr_enabled && a2dp.abr_config.abr_started)
1270 stop_abr();
1271 a2dp.abr_config.is_abr_enabled = false;
1272 a2dp.abr_config.abr_started = false;
1273 a2dp.abr_config.imc_instance = 0;
1274 a2dp.abr_config.abr_tx_handle = NULL;
Zhou Song12c29502019-03-16 10:37:18 +08001275 a2dp.abr_config.abr_rx_handle = NULL;
Surendar Karka2febd452018-12-13 17:56:43 +05301276 a2dp.bt_state_source = A2DP_STATE_DISCONNECTED;
Florian Pfister1a84f312018-07-19 14:38:18 +02001277
1278 return 0;
1279}
1280
1281static int close_a2dp_input()
1282{
1283 ALOGV("%s\n",__func__);
1284
1285 if (!(a2dp.bt_lib_sink_handle && a2dp.audio_source_close)) {
1286 ALOGE("a2dp sink handle is not identified, Ignoring close request");
1287 return -ENOSYS;
1288 }
1289
1290 if (a2dp.bt_state_sink != A2DP_STATE_DISCONNECTED) {
1291 ALOGD("calling BT sink stream close");
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001292 if (a2dp.audio_source_close() == false)
Florian Pfister1a84f312018-07-19 14:38:18 +02001293 ALOGE("failed close a2dp sink control path from BT library");
1294 }
1295 a2dp.a2dp_sink_started = false;
1296 a2dp.a2dp_sink_total_active_session_requests = 0;
1297 a2dp.bt_decoder_format = CODEC_TYPE_INVALID;
1298 a2dp.dec_sampling_rate = 48000;
1299 a2dp.dec_channels = 2;
1300 a2dp.bt_state_sink = A2DP_STATE_DISCONNECTED;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05301301
1302 return 0;
1303}
1304
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301305static void a2dp_check_and_set_scrambler()
1306{
1307 bool scrambler_mode = false;
1308 struct mixer_ctl *ctrl_scrambler_mode = NULL;
Florian Pfister1a84f312018-07-19 14:38:18 +02001309 if (a2dp.audio_is_source_scrambling_enabled && (a2dp.bt_state_source != A2DP_STATE_DISCONNECTED))
1310 scrambler_mode = a2dp.audio_is_source_scrambling_enabled();
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301311
1312 if (scrambler_mode) {
1313 //enable scrambler in dsp
1314 ctrl_scrambler_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,
1315 MIXER_SCRAMBLER_MODE);
1316 if (!ctrl_scrambler_mode) {
Florian Pfister1a84f312018-07-19 14:38:18 +02001317 ALOGE(" ERROR scrambler mode mixer control not identified");
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301318 return;
1319 } else {
1320 if (mixer_ctl_set_value(ctrl_scrambler_mode, 0, true) != 0) {
1321 ALOGE("%s: Could not set scrambler mode", __func__);
1322 return;
1323 }
1324 }
1325 }
1326}
1327
Florian Pfister1a84f312018-07-19 14:38:18 +02001328static bool a2dp_set_backend_cfg(uint8_t direction)
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301329{
Florian Pfister1a84f312018-07-19 14:38:18 +02001330 char *rate_str = NULL, *channels = NULL;
1331 uint32_t sampling_rate;
1332 struct mixer_ctl *ctl_sample_rate = NULL, *ctrl_channels = NULL;
Zhou Songab94f062021-05-12 13:11:17 +08001333 struct mixer_ctl *adm_ctrl_channels = NULL;
Florian Pfister1a84f312018-07-19 14:38:18 +02001334 bool is_configured = false;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05301335
Florian Pfister1a84f312018-07-19 14:38:18 +02001336 if (direction == SINK) {
1337 sampling_rate = a2dp.dec_sampling_rate;
1338 } else {
1339 sampling_rate = a2dp.enc_sampling_rate;
1340 }
Zhou Song7d7ca8b2019-05-23 22:38:25 +08001341 /*
1342 * For LDAC encoder and AAC decoder open slimbus port at
1343 * 96Khz for 48Khz input and 88.2Khz for 44.1Khz input.
1344 * For APTX AD encoder, open slimbus port at 96Khz for 48Khz input.
1345 */
Florian Pfister1a84f312018-07-19 14:38:18 +02001346 if (((a2dp.bt_encoder_format == CODEC_TYPE_LDAC) ||
Surendar Karkabbb3c822018-11-12 13:00:38 +05301347 (a2dp.bt_decoder_format == CODEC_TYPE_SBC) ||
Zhou Song7d7ca8b2019-05-23 22:38:25 +08001348 (a2dp.bt_decoder_format == AUDIO_FORMAT_AAC) ||
1349 (a2dp.bt_encoder_format == CODEC_TYPE_APTX_AD)) &&
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05301350 (sampling_rate == 48000 || sampling_rate == 44100 )) {
1351 sampling_rate = sampling_rate *2;
1352 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001353
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301354 if (a2dp.bt_encoder_format == CODEC_TYPE_LC3 ||
1355 a2dp.bt_decoder_format == CODEC_TYPE_LC3)
Manisha Agarwald45632b2019-10-17 18:14:28 +08001356 sampling_rate = SAMPLING_RATE_96K;
1357
Aalique Grahame22e49102018-12-18 14:23:57 -08001358 // No need to configure backend for PCM format.
1359 if (a2dp.bt_encoder_format == CODEC_TYPE_PCM) {
1360 return 0;
1361 }
1362
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301363 //Configure backend sampling rate
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05301364 switch (sampling_rate) {
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301365 case 44100:
1366 rate_str = "KHZ_44P1";
1367 break;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301368 case 88200:
1369 rate_str = "KHZ_88P2";
1370 break;
1371 case 96000:
1372 rate_str = "KHZ_96";
1373 break;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001374 case 48000:
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301375 default:
1376 rate_str = "KHZ_48";
1377 break;
1378 }
1379
Florian Pfister1a84f312018-07-19 14:38:18 +02001380 if (direction == SINK) {
1381 ALOGD("%s: set sink backend sample rate =%s", __func__, rate_str);
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301382 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3)
1383 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1384 MIXER_SOURCE_SAMPLE_RATE_TX);
1385 else
1386 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1387 MIXER_SINK_SAMPLE_RATE);
Florian Pfister1a84f312018-07-19 14:38:18 +02001388 } else {
1389 ALOGD("%s: set source backend sample rate =%s", __func__, rate_str);
1390 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
Surendar Karka2febd452018-12-13 17:56:43 +05301391 MIXER_SAMPLE_RATE_RX);
Florian Pfister1a84f312018-07-19 14:38:18 +02001392 }
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301393 if (ctl_sample_rate) {
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001394
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301395 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1396 ALOGE("%s: Failed to set backend sample rate = %s", __func__, rate_str);
Surendar Karka2febd452018-12-13 17:56:43 +05301397 is_configured = false;
1398 goto fail;
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301399 }
1400
Surendar Karka2febd452018-12-13 17:56:43 +05301401 if (direction == SOURCE) {
1402 /* Set Tx backend sample rate */
Zhou Song12c29502019-03-16 10:37:18 +08001403 if (a2dp.abr_config.is_abr_enabled) {
Manisha Agarwald45632b2019-10-17 18:14:28 +08001404 if (a2dp.bt_encoder_format == CODEC_TYPE_APTX_AD_SPEECH ||
1405 a2dp.bt_encoder_format == CODEC_TYPE_LC3)
Zhou Song12c29502019-03-16 10:37:18 +08001406 rate_str = SPEECH_TX_SAMPLE_RATE;
1407 else
1408 rate_str = ABR_TX_SAMPLE_RATE;
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301409
Preetam Singh Ranawat225e13c2019-05-16 17:31:02 +05301410 ALOGD("%s: set backend tx sample rate = %s", __func__, rate_str);
1411 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1412 MIXER_SOURCE_SAMPLE_RATE_TX);
1413 if (!ctl_sample_rate) {
1414 ALOGE("%s: ERROR backend sample rate mixer control not identifed", __func__);
1415 is_configured = false;
1416 goto fail;
1417 }
1418
1419 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1420 ALOGE("%s: Failed to set backend sample rate = %s", __func__, rate_str);
1421 is_configured = false;
1422 goto fail;
1423 }
Surendar Karka2febd452018-12-13 17:56:43 +05301424 }
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301425 } else {
1426 /* LC3 needs to set RX sample rate as well */
1427 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3) {
1428 ALOGD("%s: set rx backend sample rate =%s", __func__, rate_str);
1429 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1430 MIXER_SAMPLE_RATE_RX);
1431 if (!ctl_sample_rate) {
1432 ALOGE("%s: ERROR backend sample rate mixer control not identifed", __func__);
1433 is_configured = false;
1434 goto fail;
1435 }
1436
1437 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1438 ALOGE("%s: Failed to set backend sample rate = %s", __func__, rate_str);
1439 is_configured = false;
1440 goto fail;
1441 }
1442 }
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301443 }
1444 } else {
1445 /* Fallback to legacy approch if MIXER_SAMPLE_RATE_RX and
1446 MIXER_SAMPLE_RATE_TX is not supported */
1447 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1448 MIXER_SAMPLE_RATE_DEFAULT);
1449 if (!ctl_sample_rate) {
1450 ALOGE("%s: ERROR backend sample rate mixer control not identifed", __func__);
Surendar Karka2febd452018-12-13 17:56:43 +05301451 is_configured = false;
1452 goto fail;
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301453 }
1454
1455 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1456 ALOGE("%s: Failed to set backend sample rate = %s", __func__, rate_str);
Florian Pfister1a84f312018-07-19 14:38:18 +02001457 is_configured = false;
1458 goto fail;
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301459 }
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301460 }
1461
Florian Pfister1a84f312018-07-19 14:38:18 +02001462 if (direction == SINK) {
1463 switch (a2dp.dec_channels) {
1464 case 1:
1465 channels = "One";
1466 break;
1467 case 2:
1468 default:
1469 channels = "Two";
1470 break;
1471 }
1472
Ramu Gottipati02809682018-12-19 16:46:12 +05301473 ALOGD("%s: set afe dec channels =%s", __func__, channels);
Zhou Songab94f062021-05-12 13:11:17 +08001474 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3) {
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301475 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1476 MIXER_AFE_SINK_CHANNELS_SLIM7);
Zhou Songab94f062021-05-12 13:11:17 +08001477 adm_ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1478 MIXER_SLIM7_TX_ADM_CHANNEL);
1479 } else {
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301480 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1481 MIXER_AFE_SINK_CHANNELS);
Zhou Songab94f062021-05-12 13:11:17 +08001482 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001483 } else {
1484 //Configure AFE enc channels
1485 switch (a2dp.enc_channels) {
1486 case 1:
1487 channels = "One";
1488 break;
1489 case 2:
1490 default:
1491 channels = "Two";
1492 break;
1493 }
1494
Ramu Gottipati02809682018-12-19 16:46:12 +05301495 ALOGD("%s: set afe enc channels =%s", __func__, channels);
Florian Pfister1a84f312018-07-19 14:38:18 +02001496 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1497 MIXER_AFE_IN_CHANNELS);
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301498 }
1499
Florian Pfister1a84f312018-07-19 14:38:18 +02001500 if (!ctrl_channels) {
1501 ALOGE(" ERROR AFE channels mixer control not identified");
1502 } else {
1503 if (mixer_ctl_set_enum_by_string(ctrl_channels, channels) != 0) {
Ramu Gottipati02809682018-12-19 16:46:12 +05301504 ALOGE("%s: Failed to set AFE channels =%s", __func__, channels);
Florian Pfister1a84f312018-07-19 14:38:18 +02001505 is_configured = false;
1506 goto fail;
1507 }
1508 }
Zhou Songab94f062021-05-12 13:11:17 +08001509 // need to set adm channel for LC3 decoder
Zhou Song8d7ba052021-05-17 00:40:35 +08001510 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3 &&
1511 direction == SINK) {
Zhou Songab94f062021-05-12 13:11:17 +08001512 if (!adm_ctrl_channels) {
1513 ALOGE(" ERROR ADM channels mixer control not identified");
1514 } else {
1515 if (mixer_ctl_set_enum_by_string(adm_ctrl_channels, channels) != 0) {
1516 ALOGE("%s: Failed to set ADM channels =%s", __func__, channels);
1517 is_configured = false;
1518 goto fail;
1519 }
1520 }
1521 }
1522
Florian Pfister1a84f312018-07-19 14:38:18 +02001523 is_configured = true;
1524fail:
1525 return is_configured;
1526}
1527
Aniket Kumar Lata990de552019-07-11 14:20:23 -07001528bool a2dp_set_source_backend_cfg()
1529{
1530 if (a2dp.a2dp_source_started && !a2dp.a2dp_source_suspended)
1531 return a2dp_set_backend_cfg(SOURCE);
1532
1533 return false;
1534}
1535
Surendar Karkabbb3c822018-11-12 13:00:38 +05301536bool configure_aac_dec_format(audio_aac_dec_config_t *aac_bt_cfg)
Florian Pfister1a84f312018-07-19 14:38:18 +02001537{
1538 struct mixer_ctl *ctl_dec_data = NULL, *ctrl_bit_format = NULL;
1539 struct aac_dec_cfg_t aac_dsp_cfg;
1540 bool is_configured = false;
1541 int ret = 0;
1542
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001543 if (aac_bt_cfg == NULL)
Florian Pfister1a84f312018-07-19 14:38:18 +02001544 return false;
1545
Surendar Karka2febd452018-12-13 17:56:43 +05301546 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SINK_DEC_CONFIG_BLOCK);
Florian Pfister1a84f312018-07-19 14:38:18 +02001547 if (!ctl_dec_data) {
1548 ALOGE(" ERROR a2dp decoder CONFIG data mixer control not identified");
1549 is_configured = false;
1550 goto fail;
1551 }
1552
1553 memset(&aac_dsp_cfg, 0x0, sizeof(struct aac_dec_cfg_t));
1554 aac_dsp_cfg.dec_format = MEDIA_FMT_AAC;
1555 aac_dsp_cfg.data.aac_fmt_flag = aac_bt_cfg->aac_fmt_flag;
1556 aac_dsp_cfg.data.channels = aac_bt_cfg->channels;
1557 switch(aac_bt_cfg->audio_object_type) {
1558 case 0:
1559 aac_dsp_cfg.data.audio_object_type = MEDIA_FMT_AAC_AOT_LC;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301560 break;
1561 case 2:
Florian Pfister1a84f312018-07-19 14:38:18 +02001562 aac_dsp_cfg.data.audio_object_type = MEDIA_FMT_AAC_AOT_PS;
1563 break;
1564 case 1:
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301565 default:
Florian Pfister1a84f312018-07-19 14:38:18 +02001566 aac_dsp_cfg.data.audio_object_type = MEDIA_FMT_AAC_AOT_SBR;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301567 break;
1568 }
Florian Pfister1a84f312018-07-19 14:38:18 +02001569 aac_dsp_cfg.data.total_size_of_pce_bits = aac_bt_cfg->total_size_of_pce_bits;
1570 aac_dsp_cfg.data.sampling_rate = aac_bt_cfg->sampling_rate;
1571 ret = mixer_ctl_set_array(ctl_dec_data, (void *)&aac_dsp_cfg,
1572 sizeof(struct aac_dec_cfg_t));
1573 if (ret != 0) {
1574 ALOGE("%s: failed to set AAC decoder config", __func__);
1575 is_configured = false;
1576 goto fail;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001577 }
1578
Florian Pfister1a84f312018-07-19 14:38:18 +02001579 ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
1580 MIXER_DEC_BIT_FORMAT);
1581 if (!ctrl_bit_format) {
1582 ALOGE(" ERROR Dec bit format mixer control not identified");
1583 is_configured = false;
1584 goto fail;
1585 }
1586 ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
1587 if (ret != 0) {
1588 ALOGE("%s: Failed to set bit format to decoder", __func__);
1589 is_configured = false;
1590 goto fail;
1591 }
1592
1593 is_configured = true;
1594 a2dp.bt_decoder_format = CODEC_TYPE_AAC;
1595 a2dp.dec_channels = aac_dsp_cfg.data.channels;
1596 a2dp.dec_sampling_rate = aac_dsp_cfg.data.sampling_rate;
1597 ALOGV("Successfully updated AAC dec format with sampling_rate: %d channels:%d",
1598 aac_dsp_cfg.data.sampling_rate, aac_dsp_cfg.data.channels);
1599fail:
1600 return is_configured;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301601}
1602
Samyak Jain2cddc0e2018-07-18 15:22:27 +05301603static int a2dp_set_bit_format(uint32_t enc_bit_format)
1604{
1605 const char *bit_format = NULL;
1606 struct mixer_ctl *ctrl_bit_format = NULL;
1607
1608 // Configure AFE Input Bit Format
1609 switch (enc_bit_format) {
1610 case 32:
1611 bit_format = "S32_LE";
1612 break;
1613 case 24:
1614 bit_format = "S24_LE";
1615 break;
1616 case 16:
1617 default:
1618 bit_format = "S16_LE";
1619 break;
1620 }
1621
1622 ALOGD("%s: set AFE input bit format = %d", __func__, enc_bit_format);
1623 ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
1624 MIXER_ENC_BIT_FORMAT);
1625 if (!ctrl_bit_format) {
1626 ALOGE("%s: ERROR AFE input bit format mixer control not identifed", __func__);
1627 return -ENOSYS;
1628 }
1629 if (mixer_ctl_set_enum_by_string(ctrl_bit_format, bit_format) != 0) {
1630 ALOGE("%s: Failed to set AFE input bit format = %d", __func__, enc_bit_format);
1631 return -ENOSYS;
1632 }
1633 return 0;
1634}
1635
Surendar Karka2febd452018-12-13 17:56:43 +05301636static int a2dp_reset_backend_cfg(uint8_t direction)
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301637{
Surendar Karka2febd452018-12-13 17:56:43 +05301638 const char *rate_str = "KHZ_8", *channels = "Zero";
1639 struct mixer_ctl *ctl_sample_rate = NULL, *ctl_sample_rate_tx = NULL;
Zhou Songab94f062021-05-12 13:11:17 +08001640 struct mixer_ctl *ctrl_channels = NULL, *adm_ctrl_channels = NULL;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301641
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001642 // Reset backend sampling rate
Surendar Karka2febd452018-12-13 17:56:43 +05301643 if (direction == SINK) {
1644 ALOGD("%s: reset sink backend sample rate =%s", __func__, rate_str);
1645 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1646 MIXER_SINK_SAMPLE_RATE);
1647 } else {
1648 ALOGD("%s: reset source backend sample rate =%s", __func__, rate_str);
1649 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
1650 MIXER_SAMPLE_RATE_RX);
1651 }
1652 if (ctl_sample_rate) {
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301653
Surendar Karka2febd452018-12-13 17:56:43 +05301654 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
1655 ALOGE("%s: Failed to reset backend sample rate = %s", __func__, rate_str);
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301656 return -ENOSYS;
1657 }
Zhou Song12c29502019-03-16 10:37:18 +08001658 if (a2dp.abr_config.is_abr_enabled) {
1659 ctl_sample_rate_tx = mixer_get_ctl_by_name(a2dp.adev->mixer,
1660 MIXER_SOURCE_SAMPLE_RATE_TX);
1661 if (!ctl_sample_rate_tx) {
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301662 ALOGE("%s: ERROR Tx backend sample rate mixer control not identifed", __func__);
1663 return -ENOSYS;
Zhou Song12c29502019-03-16 10:37:18 +08001664 }
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301665
Zhou Song12c29502019-03-16 10:37:18 +08001666 if (mixer_ctl_set_enum_by_string(ctl_sample_rate_tx, rate_str) != 0) {
1667 ALOGE("%s: Failed to reset Tx backend sample rate = %s", __func__, rate_str);
1668 return -ENOSYS;
1669 }
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301670 }
1671 } else {
Surendar Karka2febd452018-12-13 17:56:43 +05301672 ctl_sample_rate = mixer_get_ctl_by_name(a2dp.adev->mixer,
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301673 MIXER_SAMPLE_RATE_DEFAULT);
Surendar Karka2febd452018-12-13 17:56:43 +05301674 if (!ctl_sample_rate) {
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301675 ALOGE("%s: ERROR backend sample rate mixer control not identifed", __func__);
1676 return -ENOSYS;
1677 }
1678
Surendar Karka2febd452018-12-13 17:56:43 +05301679 if (mixer_ctl_set_enum_by_string(ctl_sample_rate, rate_str) != 0) {
Samyak Jainf69e9ef2018-06-12 12:26:37 +05301680 ALOGE("%s: Failed to reset backend sample rate = %s", __func__, rate_str);
1681 return -ENOSYS;
1682 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001683 }
1684
1685 // Reset AFE input channels
Surendar Karka2febd452018-12-13 17:56:43 +05301686 if (direction == SINK) {
1687 ALOGD("%s: reset afe sink channels =%s", __func__, channels);
1688 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1689 MIXER_AFE_SINK_CHANNELS);
1690 } else {
1691 ALOGD("%s: reset afe source channels =%s", __func__, channels);
1692 ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1693 MIXER_AFE_IN_CHANNELS);
1694 }
1695 if (!ctrl_channels) {
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001696 ALOGE("%s: ERROR AFE input channels mixer control not identifed", __func__);
1697 return -ENOSYS;
1698 }
Surendar Karka2febd452018-12-13 17:56:43 +05301699 if (mixer_ctl_set_enum_by_string(ctrl_channels, channels) != 0) {
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001700 ALOGE("%s: Failed to reset AFE in channels = %d", __func__, a2dp.enc_channels);
1701 return -ENOSYS;
1702 }
Zhou Songab94f062021-05-12 13:11:17 +08001703 // Reset adm channels for slim7 tx if available
1704 adm_ctrl_channels = mixer_get_ctl_by_name(a2dp.adev->mixer,
1705 MIXER_SLIM7_TX_ADM_CHANNEL);
1706 if (adm_ctrl_channels) {
1707 if (mixer_ctl_set_enum_by_string(adm_ctrl_channels, channels) != 0)
1708 ALOGE("%s: Failed to reset ADM in channels = %d", __func__, a2dp.dec_channels);
1709 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001710
1711 return 0;
1712}
1713
1714/* API to configure AFE decoder in DSP */
Surendar Karka2febd452018-12-13 17:56:43 +05301715static bool configure_a2dp_source_decoder_format(int dec_format)
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001716{
1717 struct mixer_ctl *ctl_dec_data = NULL;
1718 struct abr_dec_cfg_t dec_cfg;
1719 int ret = 0;
1720
1721 if (a2dp.abr_config.is_abr_enabled) {
Surendar Karka2febd452018-12-13 17:56:43 +05301722 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SOURCE_DEC_CONFIG_BLOCK);
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001723 if (!ctl_dec_data) {
1724 ALOGE("%s: ERROR A2DP codec config data mixer control not identifed", __func__);
1725 return false;
1726 }
1727 memset(&dec_cfg, 0x0, sizeof(dec_cfg));
1728 dec_cfg.dec_format = dec_format;
1729 dec_cfg.imc_info.direction = IMC_TRANSMIT;
1730 dec_cfg.imc_info.enable = IMC_ENABLE;
1731 dec_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
1732 dec_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
1733
1734 ret = mixer_ctl_set_array(ctl_dec_data, &dec_cfg,
1735 sizeof(dec_cfg));
1736 if (ret != 0) {
1737 ALOGE("%s: Failed to set decoder config", __func__);
1738 return false;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301739 }
Surendar Karka2febd452018-12-13 17:56:43 +05301740 }
1741
1742 return true;
1743}
1744
Surendar Karkabbb3c822018-11-12 13:00:38 +05301745bool configure_sbc_dec_format(audio_sbc_dec_config_t *sbc_bt_cfg)
Florian Pfister1a84f312018-07-19 14:38:18 +02001746{
1747 struct mixer_ctl *ctl_dec_data = NULL, *ctrl_bit_format = NULL;
1748 struct sbc_dec_cfg_t sbc_dsp_cfg;
1749 bool is_configured = false;
1750 int ret = 0;
1751
Arun Mirpuri5dc77802019-02-26 16:32:42 -08001752 if (sbc_bt_cfg == NULL)
Florian Pfister1a84f312018-07-19 14:38:18 +02001753 goto fail;
1754
Surendar Karka2febd452018-12-13 17:56:43 +05301755 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SINK_DEC_CONFIG_BLOCK);
Florian Pfister1a84f312018-07-19 14:38:18 +02001756 if (!ctl_dec_data) {
1757 ALOGE(" ERROR a2dp decoder CONFIG data mixer control not identified");
1758 is_configured = false;
1759 goto fail;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301760 }
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08001761
Florian Pfister1a84f312018-07-19 14:38:18 +02001762 memset(&sbc_dsp_cfg, 0x0, sizeof(struct sbc_dec_cfg_t));
1763 sbc_dsp_cfg.dec_format = MEDIA_FMT_SBC;
1764 sbc_dsp_cfg.data.channels = sbc_bt_cfg->channels;
1765 sbc_dsp_cfg.data.sampling_rate = sbc_bt_cfg->sampling_rate;
1766 ret = mixer_ctl_set_array(ctl_dec_data, (void *)&sbc_dsp_cfg,
1767 sizeof(struct sbc_dec_cfg_t));
Surendar Karkabbb3c822018-11-12 13:00:38 +05301768
Florian Pfister1a84f312018-07-19 14:38:18 +02001769 if (ret != 0) {
1770 ALOGE("%s: failed to set SBC decoder config", __func__);
1771 is_configured = false;
1772 goto fail;
1773 }
1774
1775 ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
1776 MIXER_DEC_BIT_FORMAT);
1777 if (!ctrl_bit_format) {
1778 ALOGE(" ERROR Dec bit format mixer control not identified");
1779 is_configured = false;
1780 goto fail;
1781 }
1782 ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
1783 if (ret != 0) {
1784 ALOGE("%s: Failed to set bit format to decoder", __func__);
1785 is_configured = false;
1786 goto fail;
1787 }
1788
1789 is_configured = true;
1790 a2dp.bt_decoder_format = CODEC_TYPE_SBC;
1791 if (sbc_dsp_cfg.data.channels == MEDIA_FMT_SBC_CHANNEL_MODE_MONO)
1792 a2dp.dec_channels = 1;
1793 else
1794 a2dp.dec_channels = 2;
1795 a2dp.dec_sampling_rate = sbc_dsp_cfg.data.sampling_rate;
1796 ALOGV("Successfully updated SBC dec format");
1797fail:
1798 return is_configured;
1799}
1800
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301801uint64_t convert_channel_map(uint32_t audio_location)
1802{
1803 int i;
1804 uint64_t channel_mask = (uint64_t) 0x00000000;
1805
1806 if (!audio_location) {
1807 channel_mask |= 1ULL << PCM_CHANNEL_C;
1808 return channel_mask;
1809 }
1810
1811 for (i = 0; i < AUDIO_LOCATION_MAX; i++) {
1812 if (audio_location & audio_location_map_array[i])
1813 channel_mask |= 1ULL << channel_map_array[i];
1814 }
1815
1816 return channel_mask;
1817}
1818
1819bool configure_lc3_enc_format(audio_lc3_codec_config_t *lc3_bt_cfg) {
1820 struct mixer_ctl *ctl_enc_data = NULL;
1821 int mixer_size = 0;
1822 int ret = 0;
1823 int i;
1824 bool is_configured = false;
1825 struct lc3_enc_cfg_t lc3_dsp_cfg;
1826 uint64_t channel_mask;
1827
1828 if (lc3_bt_cfg == NULL)
1829 return false;
1830
1831 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
1832 if (!ctl_enc_data) {
1833 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
1834 return false;
1835 }
1836
1837 /* Initialize dsp configuration params */
1838 memset(&lc3_dsp_cfg, 0x0, sizeof(struct lc3_enc_cfg_t));
1839
1840 lc3_dsp_cfg.enc_format = MEDIA_FMT_LC3;
1841 //encoder structure
1842
1843 if (lc3_bt_cfg->enc_config.stream_map_size != 0) {
1844 if (!lc3_bt_cfg->enc_config.streamMapOut[0].audio_location)
1845 a2dp.enc_channels = CH_MONO;
1846 else
1847 a2dp.enc_channels = CH_STEREO;
1848 }
1849
1850 lc3_dsp_cfg.imc_info.direction = IMC_RECEIVE;
1851 lc3_dsp_cfg.imc_info.enable = IMC_ENABLE;
1852 lc3_dsp_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
1853 lc3_dsp_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
1854 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.api_version = lc3_bt_cfg->enc_config.toAirConfig.api_version;
1855 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.sampling_freq = lc3_bt_cfg->enc_config.toAirConfig.sampling_freq;
1856 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.max_octets_per_frame = lc3_bt_cfg->enc_config.toAirConfig.max_octets_per_frame;
1857 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.frame_duration = lc3_bt_cfg->enc_config.toAirConfig.frame_duration;
1858 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.bit_depth = lc3_bt_cfg->enc_config.toAirConfig.bit_depth;
1859 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.num_blocks = lc3_bt_cfg->enc_config.toAirConfig.num_blocks;
1860 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.default_q_level = lc3_bt_cfg->enc_config.toAirConfig.default_q_level;
1861 for (i = 0; i < 16; i++)
1862 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.vendor_specific[i] = lc3_bt_cfg->enc_config.toAirConfig.vendor_specific[i];
1863 lc3_dsp_cfg.enc_codec.to_Air_cfg.toAirConfig.mode = lc3_bt_cfg->enc_config.toAirConfig.mode;
1864 lc3_dsp_cfg.enc_codec.to_Air_cfg.stream_map_size = lc3_bt_cfg->enc_config.stream_map_size;
1865 lc3_dsp_cfg.enc_codec.streamMapToAir.stream_map_size = lc3_bt_cfg->enc_config.stream_map_size;
1866
1867 for (i = 0; i < lc3_dsp_cfg.enc_codec.to_Air_cfg.stream_map_size; i++) {
1868 // for encoder stream map info
1869 lc3_dsp_cfg.enc_codec.to_Air_cfg.streamMapOut[i].audio_location = lc3_bt_cfg->enc_config.streamMapOut[i].audio_location;
1870 lc3_dsp_cfg.enc_codec.to_Air_cfg.streamMapOut[i].stream_id = lc3_bt_cfg->enc_config.streamMapOut[i].stream_id;
1871 lc3_dsp_cfg.enc_codec.to_Air_cfg.streamMapOut[i].direction = lc3_bt_cfg->enc_config.streamMapOut[i].direction;
1872 // for packetizer stream map info
1873 channel_mask = convert_channel_map(lc3_bt_cfg->enc_config.streamMapOut[i].audio_location);
1874 lc3_dsp_cfg.enc_codec.streamMapToAir.streamMap[i].stream_id = lc3_bt_cfg->enc_config.streamMapOut[i].stream_id;
1875 lc3_dsp_cfg.enc_codec.streamMapToAir.streamMap[i].direction = lc3_bt_cfg->enc_config.streamMapOut[i].direction;
1876 lc3_dsp_cfg.enc_codec.streamMapToAir.streamMap[i].channel_mask_lsw = channel_mask & 0x00000000FFFFFFFF;
1877 lc3_dsp_cfg.enc_codec.streamMapToAir.streamMap[i].channel_mask_msw = (channel_mask & 0xFFFFFFFF00000000) >> 32;
1878 }
1879
1880 /* Configure AFE DSP configuration */
1881 mixer_size = sizeof(struct lc3_enc_cfg_t);
1882 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&lc3_dsp_cfg,
1883 mixer_size);
1884 if (ret != 0) {
1885 ALOGE("%s: Failed to set lc3 encoder config", __func__);
1886 is_configured = false;
1887 goto fail;
1888 }
1889
1890 ret = a2dp_set_bit_format(ENCODER_BIT_FORMAT_PCM_24);
1891 if (ret != 0) {
1892 ALOGE("%s: Failed to set lc3 bit format", __func__);
1893 is_configured = false;
1894 goto fail;
1895 }
1896
1897 is_configured = true;
1898 a2dp.bt_encoder_format = CODEC_TYPE_LC3;
1899
1900fail:
1901 return is_configured;
1902}
1903
1904bool configure_lc3_dec_format(audio_lc3_codec_config_t *lc3_bt_cfg)
1905{
1906 struct mixer_ctl *ctl_dec_data = NULL;
1907 struct lc3_dec_cfg_t lc3_dsp_cfg;
1908 uint64_t channel_mask;
1909 bool is_configured = false;
1910 int ret = 0;
1911 int i;
1912
1913 if (lc3_bt_cfg == NULL)
1914 return false;
1915
1916 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SOURCE_DEC_CONFIG_BLOCK);
1917 if (!ctl_dec_data) {
1918 ALOGE(" ERROR a2dp decoder CONFIG data mixer control not identified");
1919 return false;
1920 }
1921
1922 memset(&lc3_dsp_cfg, 0x0, sizeof(struct lc3_dec_cfg_t));
1923
1924 lc3_dsp_cfg.abr_cfg.dec_format = MEDIA_FMT_LC3;
1925 lc3_dsp_cfg.abr_cfg.imc_info.direction = IMC_TRANSMIT;
1926 lc3_dsp_cfg.abr_cfg.imc_info.enable = IMC_ENABLE;
1927 lc3_dsp_cfg.abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
1928
1929 lc3_dsp_cfg.abr_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
1930
1931 /* To check whether decoder configuration is present or not*/
1932 if (lc3_bt_cfg->dec_config.stream_map_size != 0) {
1933 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.api_version = lc3_bt_cfg->dec_config.fromAirConfig.api_version;
1934 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.sampling_freq = lc3_bt_cfg->dec_config.fromAirConfig.sampling_freq;
1935 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.max_octets_per_frame = lc3_bt_cfg->dec_config.fromAirConfig.max_octets_per_frame;
1936 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.frame_duration = lc3_bt_cfg->dec_config.fromAirConfig.frame_duration;
1937 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.bit_depth = lc3_bt_cfg->dec_config.fromAirConfig.bit_depth;
1938 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.num_blocks = lc3_bt_cfg->dec_config.fromAirConfig.num_blocks;
1939 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.default_q_level = lc3_bt_cfg->dec_config.fromAirConfig.default_q_level;
1940 for (i = 0; i < 16; i++)
1941 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.vendor_specific[i] = lc3_bt_cfg->dec_config.fromAirConfig.vendor_specific[i];
1942 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.mode = lc3_bt_cfg->dec_config.fromAirConfig.mode;
1943 lc3_dsp_cfg.dec_codec.from_Air_cfg.decoder_output_channel = lc3_bt_cfg->dec_config.decoder_output_channel;
1944 lc3_dsp_cfg.dec_codec.from_Air_cfg.stream_map_size = lc3_bt_cfg->dec_config.stream_map_size;
1945 lc3_dsp_cfg.dec_codec.streamMapFromAir.stream_map_size = lc3_bt_cfg->dec_config.stream_map_size;
1946
1947 //for depacketizer both fromAir and toAir streamMap needs to be sent.
1948 for (i = 0; i < lc3_dsp_cfg.dec_codec.from_Air_cfg.stream_map_size; i++) {
1949 // for decoder stream map info
1950 lc3_dsp_cfg.dec_codec.from_Air_cfg.streamMapIn[i].audio_location = lc3_bt_cfg->dec_config.streamMapIn[i].audio_location;
1951 lc3_dsp_cfg.dec_codec.from_Air_cfg.streamMapIn[i].stream_id = lc3_bt_cfg->dec_config.streamMapIn[i].stream_id;
1952 lc3_dsp_cfg.dec_codec.from_Air_cfg.streamMapIn[i].direction = lc3_bt_cfg->dec_config.streamMapIn[i].direction;
1953 // for depacketizer stream map fromAir info
1954 channel_mask = convert_channel_map(lc3_bt_cfg->dec_config.streamMapIn[i].audio_location);
1955 lc3_dsp_cfg.dec_codec.streamMapFromAir.streamMap[i].stream_id = lc3_bt_cfg->dec_config.streamMapIn[i].stream_id;
1956 lc3_dsp_cfg.dec_codec.streamMapFromAir.streamMap[i].direction = lc3_bt_cfg->dec_config.streamMapIn[i].direction;
1957 lc3_dsp_cfg.dec_codec.streamMapFromAir.streamMap[i].channel_mask_lsw = channel_mask & 0x00000000FFFFFFFF;
1958 lc3_dsp_cfg.dec_codec.streamMapFromAir.streamMap[i].channel_mask_msw = (channel_mask & 0xFFFFFFFF00000000) >> 32;
1959 }
1960 }
1961
1962 lc3_dsp_cfg.dec_codec.streamMapToAir.stream_map_size = lc3_bt_cfg->enc_config.stream_map_size;
1963
1964 for (i = 0; i < lc3_bt_cfg->enc_config.stream_map_size; i++) {
1965 // for depacketizer stream map toAir info
1966 channel_mask = convert_channel_map(lc3_bt_cfg->enc_config.streamMapOut[i].audio_location);
1967 lc3_dsp_cfg.dec_codec.streamMapToAir.streamMap[i].stream_id = lc3_bt_cfg->enc_config.streamMapOut[i].stream_id;
1968 lc3_dsp_cfg.dec_codec.streamMapToAir.streamMap[i].direction = lc3_bt_cfg->enc_config.streamMapOut[i].direction;
1969 lc3_dsp_cfg.dec_codec.streamMapToAir.streamMap[i].channel_mask_lsw = channel_mask & 0x00000000FFFFFFFF;
1970 lc3_dsp_cfg.dec_codec.streamMapToAir.streamMap[i].channel_mask_msw = (channel_mask & 0xFFFFFFFF00000000) >> 32;
1971 }
1972
1973 ret = mixer_ctl_set_array(ctl_dec_data, (void *)&lc3_dsp_cfg,
1974 sizeof(struct lc3_dec_cfg_t));
1975 if (ret != 0) {
1976 ALOGE("%s: failed to set LC3 decoder config", __func__);
1977 is_configured = false;
1978 goto fail;
1979 }
1980
1981 is_configured = true;
1982 a2dp.bt_decoder_format = CODEC_TYPE_LC3;
1983 a2dp.dec_channels = CH_STEREO;
Zhou Songab94f062021-05-12 13:11:17 +08001984 a2dp.dec_sampling_rate =
1985 lc3_dsp_cfg.dec_codec.from_Air_cfg.fromAirConfig.sampling_freq;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301986
1987fail:
1988 return is_configured;
1989}
1990
Florian Pfister1a84f312018-07-19 14:38:18 +02001991/* API to configure AFE decoder in DSP */
Surendar Karka2febd452018-12-13 17:56:43 +05301992static bool configure_a2dp_sink_decoder_format()
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301993{
Florian Pfister1a84f312018-07-19 14:38:18 +02001994 void *codec_info = NULL;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05301995 uint8_t multi_cast = 0, num_dev = 1;
Florian Pfister1a84f312018-07-19 14:38:18 +02001996 codec_t codec_type = CODEC_TYPE_INVALID;
1997 bool is_configured = false;
1998 struct mixer_ctl *ctl_dec_data = NULL;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05301999
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05302000 if (a2dp.audio_get_dec_config) {
2001 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SINK_DEC_CONFIG_BLOCK);
2002 if (!ctl_dec_data) {
2003 ALOGE(" ERROR a2dp decoder CONFIG data mixer control not identified");
2004 is_configured = false;
2005 return false;
2006 }
2007 codec_info = a2dp.audio_get_dec_config(&codec_type);
2008 } else if (a2dp.audio_get_enc_config) {
2009 codec_info = a2dp.audio_get_enc_config(&multi_cast, &num_dev, &codec_type);
2010 } else {
Florian Pfister1a84f312018-07-19 14:38:18 +02002011 ALOGE(" a2dp handle is not identified, ignoring a2dp decoder config");
2012 return false;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302013 }
2014
Florian Pfister1a84f312018-07-19 14:38:18 +02002015 switch(codec_type) {
2016 case CODEC_TYPE_SBC:
2017 ALOGD(" SBC decoder supported BT device");
Surendar Karkabbb3c822018-11-12 13:00:38 +05302018 is_configured = configure_sbc_dec_format((audio_sbc_dec_config_t *)codec_info);
Florian Pfister1a84f312018-07-19 14:38:18 +02002019 break;
2020 case CODEC_TYPE_AAC:
2021 ALOGD(" AAC decoder supported BT device");
2022 is_configured =
Surendar Karkabbb3c822018-11-12 13:00:38 +05302023 configure_aac_dec_format((audio_aac_dec_config_t *)codec_info);
Florian Pfister1a84f312018-07-19 14:38:18 +02002024 break;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05302025 case CODEC_TYPE_LC3:
2026 ALOGD(" LC3 decoder supported BT device");
2027 is_configured =
2028 (configure_lc3_enc_format((audio_lc3_codec_config_t *)codec_info) &&
2029 configure_lc3_dec_format((audio_lc3_codec_config_t *)codec_info));
2030 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002031 default:
2032 ALOGD(" Received Unsupported decoder format");
2033 is_configured = false;
2034 break;
2035 }
2036 return is_configured;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302037}
2038
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302039/* API to configure SBC DSP encoder */
2040bool configure_sbc_enc_format(audio_sbc_encoder_config *sbc_bt_cfg)
2041{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302042 struct mixer_ctl *ctl_enc_data = NULL;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302043 struct sbc_enc_cfg_t sbc_dsp_cfg;
2044 bool is_configured = false;
2045 int ret = 0;
2046
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002047 if (sbc_bt_cfg == NULL)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302048 return false;
2049
2050 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2051 if (!ctl_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002052 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302053 is_configured = false;
2054 goto fail;
2055 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302056 memset(&sbc_dsp_cfg, 0x0, sizeof(struct sbc_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002057 sbc_dsp_cfg.enc_format = MEDIA_FMT_SBC;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302058 sbc_dsp_cfg.num_subbands = sbc_bt_cfg->subband;
2059 sbc_dsp_cfg.blk_len = sbc_bt_cfg->blk_len;
2060 switch(sbc_bt_cfg->channels) {
2061 case 0:
2062 sbc_dsp_cfg.channel_mode = MEDIA_FMT_SBC_CHANNEL_MODE_MONO;
2063 break;
2064 case 1:
2065 sbc_dsp_cfg.channel_mode = MEDIA_FMT_SBC_CHANNEL_MODE_DUAL_MONO;
2066 break;
2067 case 3:
2068 sbc_dsp_cfg.channel_mode = MEDIA_FMT_SBC_CHANNEL_MODE_JOINT_STEREO;
2069 break;
2070 case 2:
2071 default:
2072 sbc_dsp_cfg.channel_mode = MEDIA_FMT_SBC_CHANNEL_MODE_STEREO;
2073 break;
2074 }
2075 if (sbc_bt_cfg->alloc)
2076 sbc_dsp_cfg.alloc_method = MEDIA_FMT_SBC_ALLOCATION_METHOD_LOUDNESS;
2077 else
2078 sbc_dsp_cfg.alloc_method = MEDIA_FMT_SBC_ALLOCATION_METHOD_SNR;
2079 sbc_dsp_cfg.bit_rate = sbc_bt_cfg->bitrate;
2080 sbc_dsp_cfg.sample_rate = sbc_bt_cfg->sampling_rate;
2081 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&sbc_dsp_cfg,
2082 sizeof(struct sbc_enc_cfg_t));
2083 if (ret != 0) {
2084 ALOGE("%s: failed to set SBC encoder config", __func__);
2085 is_configured = false;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302086 goto fail;
2087 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302088 ret = a2dp_set_bit_format(sbc_bt_cfg->bits_per_sample);
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302089 if (ret != 0) {
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302090 is_configured = false;
2091 goto fail;
2092 }
2093 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002094 a2dp.bt_encoder_format = CODEC_TYPE_SBC;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302095 a2dp.enc_sampling_rate = sbc_bt_cfg->sampling_rate;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302096
2097 if (sbc_dsp_cfg.channel_mode == MEDIA_FMT_SBC_CHANNEL_MODE_MONO)
2098 a2dp.enc_channels = 1;
2099 else
2100 a2dp.enc_channels = 2;
2101
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302102 ALOGV("Successfully updated SBC enc format with samplingrate: %d channelmode:%d",
2103 sbc_dsp_cfg.sample_rate, sbc_dsp_cfg.channel_mode);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302104fail:
2105 return is_configured;
2106}
2107
Manish Dewangan6a252632017-12-04 17:27:44 +05302108#ifndef LINUX_ENABLED
Sharad Sangle95d451b2018-06-19 12:24:20 +05302109static int update_aptx_ad_dsp_config(struct aptx_ad_enc_cfg_t *aptx_dsp_cfg,
2110 audio_aptx_encoder_config *aptx_bt_cfg)
2111{
2112 int ret = 0;
2113
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002114 if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
Sharad Sangle95d451b2018-06-19 12:24:20 +05302115 ALOGE("Invalid param, aptx_dsp_cfg %p aptx_bt_cfg %p",
2116 aptx_dsp_cfg, aptx_bt_cfg);
2117 return -EINVAL;
2118 }
2119
2120 memset(aptx_dsp_cfg, 0x0, sizeof(struct aptx_ad_enc_cfg_t));
Ramu Gottipati02809682018-12-19 16:46:12 +05302121 aptx_dsp_cfg->custom_cfg.enc_format = MEDIA_FMT_APTX_AD;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302122
2123
2124 aptx_dsp_cfg->aptx_ad_cfg.sampling_freq = aptx_bt_cfg->ad_cfg->sampling_rate;
2125 aptx_dsp_cfg->aptx_ad_cfg.mtu = aptx_bt_cfg->ad_cfg->mtu;
2126 aptx_dsp_cfg->aptx_ad_cfg.channel_mode = aptx_bt_cfg->ad_cfg->channel_mode;
2127 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeA = aptx_bt_cfg->ad_cfg->min_sink_modeA;
2128 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeA = aptx_bt_cfg->ad_cfg->max_sink_modeA;
2129 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeB = aptx_bt_cfg->ad_cfg->min_sink_modeB;
2130 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeB = aptx_bt_cfg->ad_cfg->max_sink_modeB;
2131 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeC = aptx_bt_cfg->ad_cfg->min_sink_modeC;
2132 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeC = aptx_bt_cfg->ad_cfg->max_sink_modeC;
Sharad Sanglee378afe2018-09-03 20:04:17 +05302133 aptx_dsp_cfg->aptx_ad_cfg.mode = aptx_bt_cfg->ad_cfg->encoder_mode;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302134 aptx_dsp_cfg->abr_cfg.imc_info.direction = IMC_RECEIVE;
2135 aptx_dsp_cfg->abr_cfg.imc_info.enable = IMC_ENABLE;
2136 aptx_dsp_cfg->abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
2137 aptx_dsp_cfg->abr_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
2138
2139
2140 switch(aptx_dsp_cfg->aptx_ad_cfg.channel_mode) {
2141 case APTX_AD_CHANNEL_UNCHANGED:
2142 case APTX_AD_CHANNEL_JOINT_STEREO:
2143 case APTX_AD_CHANNEL_DUAL_MONO:
2144 case APTX_AD_CHANNEL_STEREO_TWS:
2145 case APTX_AD_CHANNEL_EARBUD:
2146 default:
2147 a2dp.enc_channels = CH_STEREO;
2148 aptx_dsp_cfg->custom_cfg.num_channels = CH_STEREO;
2149 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2150 aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2151 break;
2152 case APTX_AD_CHANNEL_MONO:
2153 a2dp.enc_channels = CH_MONO;
2154 aptx_dsp_cfg->custom_cfg.num_channels = CH_MONO;
2155 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
Zhou Song30e8cea2019-10-22 23:39:25 +08002156 break;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302157 }
2158 switch(aptx_dsp_cfg->aptx_ad_cfg.sampling_freq) {
2159 case APTX_AD_SR_UNCHANGED:
2160 case APTX_AD_48:
2161 default:
2162 a2dp.enc_sampling_rate = SAMPLING_RATE_48K;
2163 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_48K;
2164 break;
2165 case APTX_AD_44_1:
2166 a2dp.enc_sampling_rate = SAMPLING_RATE_441K;
2167 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_441K;
Zhou Song30e8cea2019-10-22 23:39:25 +08002168 break;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302169 }
2170 ALOGV("Successfully updated APTX AD enc format with \
2171 samplingrate: %d channels:%d",
2172 aptx_dsp_cfg->custom_cfg.sample_rate,
2173 aptx_dsp_cfg->custom_cfg.num_channels);
2174
2175 return ret;
2176}
Manisha Agarwala51768b2018-11-01 16:30:52 +05302177
Zhou Song8fccbb62019-03-20 01:08:19 +08002178static int update_aptx_ad_dsp_config_r2(struct aptx_ad_enc_cfg_r2_t *aptx_dsp_cfg,
2179 audio_aptx_encoder_config *aptx_bt_cfg)
2180{
2181 int ret = 0;
2182
2183 if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
Mingshu Pangaa429f72019-06-10 17:25:00 +08002184 ALOGE("Invalid param, aptx_dsp_cfg %pK aptx_bt_cfg %pK",
Zhou Song8fccbb62019-03-20 01:08:19 +08002185 aptx_dsp_cfg, aptx_bt_cfg);
2186 return -EINVAL;
2187 }
2188
2189 memset(aptx_dsp_cfg, 0x0, sizeof(struct aptx_ad_enc_cfg_r2_t));
2190 aptx_dsp_cfg->custom_cfg.enc_format = MEDIA_FMT_APTX_AD;
2191
2192
2193 aptx_dsp_cfg->aptx_ad_cfg.sampling_freq = aptx_bt_cfg->ad_cfg->sampling_rate;
2194 aptx_dsp_cfg->aptx_ad_cfg.mtu = aptx_bt_cfg->ad_cfg->mtu;
2195 aptx_dsp_cfg->aptx_ad_cfg.channel_mode = aptx_bt_cfg->ad_cfg->channel_mode;
2196 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeA = aptx_bt_cfg->ad_cfg->min_sink_modeA;
2197 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeA = aptx_bt_cfg->ad_cfg->max_sink_modeA;
2198 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeB = aptx_bt_cfg->ad_cfg->min_sink_modeB;
2199 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeB = aptx_bt_cfg->ad_cfg->max_sink_modeB;
2200 aptx_dsp_cfg->aptx_ad_cfg.min_sink_modeC = aptx_bt_cfg->ad_cfg->min_sink_modeC;
2201 aptx_dsp_cfg->aptx_ad_cfg.max_sink_modeC = aptx_bt_cfg->ad_cfg->max_sink_modeC;
2202 aptx_dsp_cfg->aptx_ad_cfg.mode = aptx_bt_cfg->ad_cfg->encoder_mode;
2203 aptx_dsp_cfg->aptx_ad_cfg.input_mode = aptx_bt_cfg->ad_cfg->input_mode;
2204 aptx_dsp_cfg->aptx_ad_cfg.fade_duration = aptx_bt_cfg->ad_cfg->fade_duration;
2205 for (int i = 0; i < sizeof(aptx_dsp_cfg->aptx_ad_cfg.sink_cap); i ++)
2206 aptx_dsp_cfg->aptx_ad_cfg.sink_cap[i] = aptx_bt_cfg->ad_cfg->sink_cap[i];
2207 aptx_dsp_cfg->abr_cfg.imc_info.direction = IMC_RECEIVE;
2208 aptx_dsp_cfg->abr_cfg.imc_info.enable = IMC_ENABLE;
2209 aptx_dsp_cfg->abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
2210 aptx_dsp_cfg->abr_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
2211
2212
2213 switch(aptx_dsp_cfg->aptx_ad_cfg.channel_mode) {
2214 case APTX_AD_CHANNEL_UNCHANGED:
2215 case APTX_AD_CHANNEL_JOINT_STEREO:
2216 case APTX_AD_CHANNEL_DUAL_MONO:
2217 case APTX_AD_CHANNEL_STEREO_TWS:
2218 case APTX_AD_CHANNEL_EARBUD:
2219 default:
2220 a2dp.enc_channels = CH_STEREO;
2221 aptx_dsp_cfg->custom_cfg.num_channels = CH_STEREO;
2222 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2223 aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2224 break;
2225 case APTX_AD_CHANNEL_MONO:
2226 a2dp.enc_channels = CH_MONO;
2227 aptx_dsp_cfg->custom_cfg.num_channels = CH_MONO;
2228 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
Zhou Song30e8cea2019-10-22 23:39:25 +08002229 break;
Zhou Song8fccbb62019-03-20 01:08:19 +08002230 }
2231 switch(aptx_dsp_cfg->aptx_ad_cfg.sampling_freq) {
2232 case APTX_AD_SR_UNCHANGED:
2233 case APTX_AD_48:
2234 default:
2235 a2dp.enc_sampling_rate = SAMPLING_RATE_48K;
2236 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_48K;
2237 break;
2238 case APTX_AD_44_1:
2239 a2dp.enc_sampling_rate = SAMPLING_RATE_441K;
2240 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_441K;
Zhou Song30e8cea2019-10-22 23:39:25 +08002241 break;
2242 case APTX_AD_96:
2243 a2dp.enc_sampling_rate = SAMPLING_RATE_96K;
2244 aptx_dsp_cfg->custom_cfg.sample_rate = SAMPLING_RATE_96K;
2245 break;
Zhou Song8fccbb62019-03-20 01:08:19 +08002246 }
2247 ALOGV("Successfully updated APTX AD enc format with \
2248 samplingrate: %d channels:%d",
2249 aptx_dsp_cfg->custom_cfg.sample_rate,
2250 aptx_dsp_cfg->custom_cfg.num_channels);
2251
2252 return ret;
2253}
2254
Manisha Agarwala51768b2018-11-01 16:30:52 +05302255static void audio_a2dp_update_tws_channel_mode()
2256{
2257 char* channel_mode;
2258 struct mixer_ctl *ctl_channel_mode;
Manisha Agarwal5bb881e2019-09-20 14:03:57 +05302259
2260 ALOGD("Update tws for mono_mode on=%d",a2dp.is_tws_mono_mode_on);
2261
Manisha Agarwala51768b2018-11-01 16:30:52 +05302262 if (a2dp.is_tws_mono_mode_on)
2263 channel_mode = "One";
2264 else
2265 channel_mode = "Two";
Manisha Agarwal5bb881e2019-09-20 14:03:57 +05302266
Manisha Agarwala51768b2018-11-01 16:30:52 +05302267 ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_TWS_CHANNEL_MODE);
2268 if (!ctl_channel_mode) {
2269 ALOGE("failed to get tws mixer ctl");
2270 return;
2271 }
2272 if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
2273 ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
2274 return;
2275 }
2276}
2277
Manisha Agarwald45632b2019-10-17 18:14:28 +08002278static void audio_a2dp_update_lc3_channel_mode()
2279{
2280 char* channel_mode;
2281 struct mixer_ctl *ctl_channel_mode;
2282
2283 ALOGD("Update lc3 for mono_mode on=%d",a2dp.is_lc3_mono_mode_on);
2284
2285 if (a2dp.is_lc3_mono_mode_on)
2286 channel_mode = "One";
2287 else
2288 channel_mode = "Two";
2289
2290 ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_LC3_CHANNEL_MODE);
2291 if (!ctl_channel_mode) {
2292 ALOGE("failed to get lc3 mixer ctl");
2293 return;
2294 }
2295 if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
2296 ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
2297 return;
2298 }
2299}
2300
Manish Dewangan6a252632017-12-04 17:27:44 +05302301static int update_aptx_dsp_config_v2(struct aptx_enc_cfg_t *aptx_dsp_cfg,
2302 audio_aptx_encoder_config *aptx_bt_cfg)
2303{
2304 int ret = 0;
2305
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002306 if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
Manish Dewangan6a252632017-12-04 17:27:44 +05302307 ALOGE("Invalid param, aptx_dsp_cfg %p aptx_bt_cfg %p",
2308 aptx_dsp_cfg, aptx_bt_cfg);
2309 return -EINVAL;
2310 }
2311
2312 memset(aptx_dsp_cfg, 0x0, sizeof(struct aptx_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002313 aptx_dsp_cfg->custom_cfg.enc_format = MEDIA_FMT_APTX;
Manish Dewangan6a252632017-12-04 17:27:44 +05302314
2315 if (!a2dp.is_aptx_dual_mono_supported) {
2316 aptx_dsp_cfg->custom_cfg.sample_rate = aptx_bt_cfg->default_cfg->sampling_rate;
2317 aptx_dsp_cfg->custom_cfg.num_channels = aptx_bt_cfg->default_cfg->channels;
2318 } else {
2319 aptx_dsp_cfg->custom_cfg.sample_rate = aptx_bt_cfg->dual_mono_cfg->sampling_rate;
2320 aptx_dsp_cfg->custom_cfg.num_channels = aptx_bt_cfg->dual_mono_cfg->channels;
2321 aptx_dsp_cfg->aptx_v2_cfg.sync_mode = aptx_bt_cfg->dual_mono_cfg->sync_mode;
2322 }
2323
2324 switch(aptx_dsp_cfg->custom_cfg.num_channels) {
2325 case 1:
2326 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
2327 break;
2328 case 2:
2329 default:
Manisha Agarwala51768b2018-11-01 16:30:52 +05302330 aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2331 aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
Manish Dewangan6a252632017-12-04 17:27:44 +05302332 break;
2333 }
2334 a2dp.enc_channels = aptx_dsp_cfg->custom_cfg.num_channels;
2335 if (!a2dp.is_aptx_dual_mono_supported) {
2336 a2dp.enc_sampling_rate = aptx_bt_cfg->default_cfg->sampling_rate;
2337 ALOGV("Successfully updated APTX enc format with samplingrate: %d \
2338 channels:%d", aptx_dsp_cfg->custom_cfg.sample_rate,
2339 aptx_dsp_cfg->custom_cfg.num_channels);
2340 } else {
2341 a2dp.enc_sampling_rate = aptx_bt_cfg->dual_mono_cfg->sampling_rate;
2342 ALOGV("Successfully updated APTX dual mono enc format with \
2343 samplingrate: %d channels:%d syncmode %d",
2344 aptx_dsp_cfg->custom_cfg.sample_rate,
2345 aptx_dsp_cfg->custom_cfg.num_channels,
2346 aptx_dsp_cfg->aptx_v2_cfg.sync_mode);
2347 }
2348 return ret;
2349}
2350#else
2351static int update_aptx_dsp_config_v1(struct custom_enc_cfg_t *aptx_dsp_cfg,
2352 audio_aptx_encoder_config *aptx_bt_cfg)
2353{
2354 int ret = 0;
2355
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002356 if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
Manish Dewangan6a252632017-12-04 17:27:44 +05302357 ALOGE("Invalid param, aptx_dsp_cfg %p aptx_bt_cfg %p",
2358 aptx_dsp_cfg, aptx_bt_cfg);
2359 return -EINVAL;
2360 }
2361
2362 memset(&aptx_dsp_cfg, 0x0, sizeof(struct custom_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002363 aptx_dsp_cfg->enc_format = MEDIA_FMT_APTX;
Manish Dewangan6a252632017-12-04 17:27:44 +05302364 aptx_dsp_cfg->sample_rate = aptx_bt_cfg->sampling_rate;
2365 aptx_dsp_cfg->num_channels = aptx_bt_cfg->channels;
2366 switch(aptx_dsp_cfg->num_channels) {
2367 case 1:
2368 aptx_dsp_cfg->channel_mapping[0] = PCM_CHANNEL_C;
2369 break;
2370 case 2:
2371 default:
2372 aptx_dsp_cfg->channel_mapping[0] = PCM_CHANNEL_L;
2373 aptx_dsp_cfg->channel_mapping[1] = PCM_CHANNEL_R;
2374 break;
2375 }
2376
2377 ALOGV("Updated APTX enc format with samplingrate: %d channels:%d",
2378 aptx_dsp_cfg->sample_rate, aptx_dsp_cfg->num_channels);
2379
2380 return ret;
2381}
2382#endif
2383
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302384/* API to configure APTX DSP encoder */
2385bool configure_aptx_enc_format(audio_aptx_encoder_config *aptx_bt_cfg)
2386{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302387 struct mixer_ctl *ctl_enc_data = NULL;
Zhou Song8fccbb62019-03-20 01:08:19 +08002388 struct mixer_ctl *aptx_ad_ctl = NULL;
Zhou Song12c29502019-03-16 10:37:18 +08002389 int mixer_size = 0;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302390 bool is_configured = false;
2391 int ret = 0;
Mingshu Pangaa429f72019-06-10 17:25:00 +08002392 int sample_rate_backup = SAMPLING_RATE_48K;
Preetam Singh Ranawat109bb3c2018-01-30 12:12:02 +05302393
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002394 if (aptx_bt_cfg == NULL)
Preetam Singh Ranawat109bb3c2018-01-30 12:12:02 +05302395 return false;
2396
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002397 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2398 if (!ctl_enc_data) {
2399 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identifed");
2400 return false;
2401 }
2402
Manish Dewangan6a252632017-12-04 17:27:44 +05302403#ifndef LINUX_ENABLED
2404 struct aptx_enc_cfg_t aptx_dsp_cfg;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302405 struct aptx_ad_enc_cfg_t aptx_ad_dsp_cfg;
Zhou Song8fccbb62019-03-20 01:08:19 +08002406 struct aptx_ad_enc_cfg_r2_t aptx_ad_dsp_cfg_r2;
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002407 if (a2dp.is_aptx_adaptive) {
Zhou Song8fccbb62019-03-20 01:08:19 +08002408 aptx_ad_ctl = mixer_get_ctl_by_name(a2dp.adev->mixer,
2409 MIXER_ENC_APTX_AD_CONFIG_BLOCK);
Mingshu Pangaa429f72019-06-10 17:25:00 +08002410 if (aptx_ad_ctl)
Zhou Song8fccbb62019-03-20 01:08:19 +08002411 ret = update_aptx_ad_dsp_config_r2(&aptx_ad_dsp_cfg_r2, aptx_bt_cfg);
Mingshu Pangaa429f72019-06-10 17:25:00 +08002412 else
Zhou Song8fccbb62019-03-20 01:08:19 +08002413 ret = update_aptx_ad_dsp_config(&aptx_ad_dsp_cfg, aptx_bt_cfg);
Mingshu Pangaa429f72019-06-10 17:25:00 +08002414 } else
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002415 ret = update_aptx_dsp_config_v2(&aptx_dsp_cfg, aptx_bt_cfg);
Mingshu Pangaa429f72019-06-10 17:25:00 +08002416
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002417 if (ret) {
2418 is_configured = false;
2419 goto fail;
2420 }
2421
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002422 if (a2dp.is_aptx_adaptive) {
Zhou Song8fccbb62019-03-20 01:08:19 +08002423 if (aptx_ad_ctl)
2424 ret = mixer_ctl_set_array(aptx_ad_ctl, (void *)&aptx_ad_dsp_cfg_r2,
Mingshu Pangaa429f72019-06-10 17:25:00 +08002425 sizeof(struct aptx_ad_enc_cfg_r2_t));
Zhou Song8fccbb62019-03-20 01:08:19 +08002426 else
2427 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_ad_dsp_cfg,
Mingshu Pangaa429f72019-06-10 17:25:00 +08002428 sizeof(struct aptx_ad_enc_cfg_t));
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002429 } else {
2430 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_dsp_cfg,
Mingshu Pangaa429f72019-06-10 17:25:00 +08002431 sizeof(struct aptx_enc_cfg_t));
Sharad Sangle95d451b2018-06-19 12:24:20 +05302432 }
Manish Dewangan6a252632017-12-04 17:27:44 +05302433#else
2434 struct custom_enc_cfg_t aptx_dsp_cfg;
2435 mixer_size = sizeof(struct custom_enc_cfg_t);
2436 sample_rate_backup = aptx_bt_cfg->sampling_rate;
Manish Dewangan6a252632017-12-04 17:27:44 +05302437 ret = update_aptx_dsp_config_v1(&aptx_dsp_cfg, aptx_bt_cfg);
Manish Dewangan6a252632017-12-04 17:27:44 +05302438 if (ret) {
2439 is_configured = false;
2440 goto fail;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302441 }
Weiyin Jiang20d3fa62018-08-01 18:06:27 +08002442 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_dsp_cfg,
2443 mixer_size);
2444#endif
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302445 if (ret != 0) {
2446 ALOGE("%s: Failed to set APTX encoder config", __func__);
2447 is_configured = false;
2448 goto fail;
2449 }
Ramu Gottipati3e0d4c32018-11-05 15:57:28 +05302450#ifndef LINUX_ENABLED //Temporarily disabled for LE, need to take care while doing VT FR
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002451 if (a2dp.is_aptx_adaptive)
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302452 ret = a2dp_set_bit_format(aptx_bt_cfg->ad_cfg->bits_per_sample);
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002453 else if (a2dp.is_aptx_dual_mono_supported)
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302454 ret = a2dp_set_bit_format(aptx_bt_cfg->dual_mono_cfg->bits_per_sample);
2455 else
2456 ret = a2dp_set_bit_format(aptx_bt_cfg->default_cfg->bits_per_sample);
Ramu Gottipati3e0d4c32018-11-05 15:57:28 +05302457#endif
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302458 if (ret != 0) {
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302459 is_configured = false;
2460 goto fail;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302461 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302462 is_configured = true;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302463 if (a2dp.is_aptx_adaptive)
Surendar Karka2febd452018-12-13 17:56:43 +05302464 a2dp.bt_encoder_format = CODEC_TYPE_APTX_AD;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302465 else
Surendar Karka2febd452018-12-13 17:56:43 +05302466 a2dp.bt_encoder_format = CODEC_TYPE_APTX;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302467fail:
Manish Dewangan6a252632017-12-04 17:27:44 +05302468 /*restore sample rate */
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002469 if (!is_configured)
Manish Dewangan6a252632017-12-04 17:27:44 +05302470 a2dp.enc_sampling_rate = sample_rate_backup;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302471 return is_configured;
2472}
2473
2474/* API to configure APTX HD DSP encoder
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302475 */
Manish Dewangan6a252632017-12-04 17:27:44 +05302476#ifndef LINUX_ENABLED
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002477bool configure_aptx_hd_enc_format(audio_aptx_default_config *aptx_bt_cfg)
Manish Dewangan6a252632017-12-04 17:27:44 +05302478#else
2479bool configure_aptx_hd_enc_format(audio_aptx_encoder_config *aptx_bt_cfg)
2480#endif
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302481{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302482 struct mixer_ctl *ctl_enc_data = NULL;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302483 struct custom_enc_cfg_t aptx_dsp_cfg;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302484 bool is_configured = false;
2485 int ret = 0;
2486
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002487 if (aptx_bt_cfg == NULL)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302488 return false;
2489
2490 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2491 if (!ctl_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002492 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302493 is_configured = false;
2494 goto fail;
2495 }
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302496
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302497 memset(&aptx_dsp_cfg, 0x0, sizeof(struct custom_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002498 aptx_dsp_cfg.enc_format = MEDIA_FMT_APTX_HD;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302499 aptx_dsp_cfg.sample_rate = aptx_bt_cfg->sampling_rate;
2500 aptx_dsp_cfg.num_channels = aptx_bt_cfg->channels;
2501 switch(aptx_dsp_cfg.num_channels) {
2502 case 1:
2503 aptx_dsp_cfg.channel_mapping[0] = PCM_CHANNEL_C;
2504 break;
2505 case 2:
2506 default:
2507 aptx_dsp_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2508 aptx_dsp_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2509 break;
2510 }
2511 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_dsp_cfg,
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302512 sizeof(struct custom_enc_cfg_t));
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302513 if (ret != 0) {
2514 ALOGE("%s: Failed to set APTX HD encoder config", __func__);
2515 is_configured = false;
2516 goto fail;
2517 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302518 ret = a2dp_set_bit_format(aptx_bt_cfg->bits_per_sample);
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302519 if (ret != 0) {
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302520 is_configured = false;
2521 goto fail;
2522 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302523 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002524 a2dp.bt_encoder_format = CODEC_TYPE_APTX_HD;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302525 a2dp.enc_sampling_rate = aptx_bt_cfg->sampling_rate;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302526 a2dp.enc_channels = aptx_bt_cfg->channels;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302527 ALOGV("Successfully updated APTX HD encformat with samplingrate: %d channels:%d",
2528 aptx_dsp_cfg.sample_rate, aptx_dsp_cfg.num_channels);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302529fail:
2530 return is_configured;
2531}
2532
2533/* API to configure AAC DSP encoder */
2534bool configure_aac_enc_format(audio_aac_encoder_config *aac_bt_cfg)
2535{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302536 struct mixer_ctl *ctl_enc_data = NULL;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302537 struct aac_enc_cfg_t aac_dsp_cfg;
2538 bool is_configured = false;
2539 int ret = 0;
2540
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002541 if (aac_bt_cfg == NULL)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302542 return false;
2543
2544 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2545 if (!ctl_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002546 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302547 is_configured = false;
2548 goto fail;
2549 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302550 memset(&aac_dsp_cfg, 0x0, sizeof(struct aac_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02002551 aac_dsp_cfg.enc_format = MEDIA_FMT_AAC;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302552 aac_dsp_cfg.bit_rate = aac_bt_cfg->bitrate;
Naresh Tannirua42d0bd2016-09-21 15:30:46 +05302553 aac_dsp_cfg.sample_rate = aac_bt_cfg->sampling_rate;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002554 switch (aac_bt_cfg->enc_mode) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302555 case 0:
2556 aac_dsp_cfg.enc_mode = MEDIA_FMT_AAC_AOT_LC;
2557 break;
2558 case 2:
2559 aac_dsp_cfg.enc_mode = MEDIA_FMT_AAC_AOT_PS;
2560 break;
2561 case 1:
2562 default:
2563 aac_dsp_cfg.enc_mode = MEDIA_FMT_AAC_AOT_SBR;
2564 break;
2565 }
Naresh Tannirua42d0bd2016-09-21 15:30:46 +05302566 aac_dsp_cfg.aac_fmt_flag = aac_bt_cfg->format_flag;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302567 aac_dsp_cfg.channel_cfg = aac_bt_cfg->channels;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002568
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302569 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aac_dsp_cfg,
2570 sizeof(struct aac_enc_cfg_t));
2571 if (ret != 0) {
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002572 ALOGE("%s: Failed to set AAC encoder config", __func__);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302573 is_configured = false;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302574 goto fail;
2575 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302576 ret = a2dp_set_bit_format(aac_bt_cfg->bits_per_sample);
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302577 if (ret != 0) {
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302578 is_configured = false;
2579 goto fail;
2580 }
2581 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002582 a2dp.bt_encoder_format = CODEC_TYPE_AAC;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05302583 a2dp.enc_sampling_rate = aac_bt_cfg->sampling_rate;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002584 a2dp.enc_channels = aac_bt_cfg->channels;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002585 ALOGV("%s: Successfully updated AAC enc format with sampling rate: %d channels:%d",
2586 __func__, aac_dsp_cfg.sample_rate, aac_dsp_cfg.channel_cfg);
2587fail:
2588 return is_configured;
2589}
2590
2591bool configure_aac_enc_format_v2(audio_aac_encoder_config_v2 *aac_bt_cfg)
2592{
2593 struct mixer_ctl *ctl_enc_data = NULL;
2594 struct aac_enc_cfg_v2_t aac_dsp_cfg;
2595 bool is_configured = false;
2596 int ret = 0;
2597
2598 if (aac_bt_cfg == NULL)
2599 return false;
2600
2601 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2602 if (!ctl_enc_data) {
2603 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identifed");
2604 is_configured = false;
2605 goto fail;
2606 }
2607 memset(&aac_dsp_cfg, 0x0, sizeof(struct aac_enc_cfg_v2_t));
Ramu Gottipati08d82e72018-12-17 11:52:14 +05302608 aac_dsp_cfg.aac_enc_cfg.enc_format = MEDIA_FMT_AAC;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002609 aac_dsp_cfg.aac_enc_cfg.bit_rate = aac_bt_cfg->audio_aac_enc_cfg.bitrate;
2610 aac_dsp_cfg.aac_enc_cfg.sample_rate = aac_bt_cfg->audio_aac_enc_cfg.sampling_rate;
2611 switch (aac_bt_cfg->audio_aac_enc_cfg.enc_mode) {
2612 case 0:
2613 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_LC;
2614 break;
2615 case 2:
2616 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_PS;
2617 break;
2618 case 1:
2619 default:
2620 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_SBR;
2621 break;
2622 }
2623 aac_dsp_cfg.aac_enc_cfg.aac_fmt_flag = aac_bt_cfg->audio_aac_enc_cfg.format_flag;
2624 aac_dsp_cfg.aac_enc_cfg.channel_cfg = aac_bt_cfg->audio_aac_enc_cfg.channels;
2625 aac_dsp_cfg.frame_ctl.ctl_type = aac_bt_cfg->frame_ctl.ctl_type;
2626 aac_dsp_cfg.frame_ctl.ctl_value = aac_bt_cfg->frame_ctl.ctl_value;
2627
2628 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aac_dsp_cfg,
2629 sizeof(struct aac_enc_cfg_v2_t));
2630 if (ret != 0) {
2631 ALOGE("%s: Failed to set AAC encoder config", __func__);
2632 is_configured = false;
2633 goto fail;
2634 }
2635 ret = a2dp_set_bit_format(aac_bt_cfg->audio_aac_enc_cfg.bits_per_sample);
2636 if (ret != 0) {
2637 is_configured = false;
2638 goto fail;
2639 }
2640 is_configured = true;
Ramu Gottipati08d82e72018-12-17 11:52:14 +05302641 a2dp.bt_encoder_format = CODEC_TYPE_AAC;
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002642 a2dp.enc_sampling_rate = aac_bt_cfg->audio_aac_enc_cfg.sampling_rate;
2643 a2dp.enc_channels = aac_bt_cfg->audio_aac_enc_cfg.channels;
2644 ALOGV("%s: Successfully updated AAC enc format with sampling rate: %d channels:%d",
2645 __func__, aac_dsp_cfg.aac_enc_cfg.sample_rate, aac_dsp_cfg.aac_enc_cfg.channel_cfg);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302646fail:
2647 return is_configured;
2648}
2649
Manisha Agarwalabb536a2020-01-30 16:12:44 +05302650bool configure_aac_enc_format_v3(audio_aac_encoder_config_v3 *aac_bt_cfg)
2651{
2652 struct mixer_ctl *ctl_enc_data = NULL;
2653 struct aac_enc_cfg_v3_t aac_dsp_cfg;
2654 struct aac_frame_size_control_t* frame_vbr_ctl = NULL;
2655 bool is_configured = false;
2656 int ret = 0;
2657
2658 if (aac_bt_cfg == NULL)
2659 return false;
2660
2661 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2662 if (!ctl_enc_data) {
2663 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identifed");
2664 is_configured = false;
2665 goto fail;
2666 }
2667 memset(&aac_dsp_cfg, 0x0, sizeof(struct aac_enc_cfg_v3_t));
2668 aac_dsp_cfg.aac_enc_cfg.enc_format = MEDIA_FMT_AAC;
2669 aac_dsp_cfg.aac_enc_cfg.bit_rate = aac_bt_cfg->audio_aac_enc_cfg.bitrate;
2670 aac_dsp_cfg.aac_enc_cfg.sample_rate = aac_bt_cfg->audio_aac_enc_cfg.sampling_rate;
2671 switch (aac_bt_cfg->audio_aac_enc_cfg.enc_mode) {
2672 case 0:
2673 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_LC;
2674 break;
2675 case 2:
2676 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_PS;
2677 break;
2678 case 1:
2679 default:
2680 aac_dsp_cfg.aac_enc_cfg.enc_mode = MEDIA_FMT_AAC_AOT_SBR;
2681 break;
2682 }
2683 aac_dsp_cfg.aac_enc_cfg.aac_fmt_flag = aac_bt_cfg->audio_aac_enc_cfg.format_flag;
2684 aac_dsp_cfg.aac_enc_cfg.channel_cfg = aac_bt_cfg->audio_aac_enc_cfg.channels;
2685 aac_dsp_cfg.frame_ctl.ctl_type = aac_bt_cfg->frame_ctl.ctl_type;
2686 aac_dsp_cfg.frame_ctl.ctl_value = aac_bt_cfg->frame_ctl.ctl_value;
2687 frame_vbr_ctl = aac_bt_cfg->frame_ptr_ctl;
2688
2689 if (frame_vbr_ctl != NULL) {
2690 aac_dsp_cfg.aac_key_value_ctl.ctl_type = frame_vbr_ctl->ctl_type;
2691 aac_dsp_cfg.aac_key_value_ctl.ctl_value = frame_vbr_ctl->ctl_value;
2692 } else {
2693 ALOGE("%s: VBR cannot be enabled, fall back to default",__func__);
2694 aac_dsp_cfg.aac_key_value_ctl.ctl_type = 0;
2695 aac_dsp_cfg.aac_key_value_ctl.ctl_value = 0;
2696 }
2697
2698 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aac_dsp_cfg,
2699 sizeof(struct aac_enc_cfg_v3_t));
2700 if (ret != 0) {
2701 ALOGE("%s: Failed to set AAC encoder config", __func__);
2702 is_configured = false;
2703 goto fail;
2704 }
2705 ret = a2dp_set_bit_format(aac_bt_cfg->audio_aac_enc_cfg.bits_per_sample);
2706 if (ret != 0) {
2707 is_configured = false;
2708 goto fail;
2709 }
2710 is_configured = true;
2711 a2dp.bt_encoder_format = CODEC_TYPE_AAC;
2712 a2dp.enc_sampling_rate = aac_bt_cfg->audio_aac_enc_cfg.sampling_rate;
2713 a2dp.enc_channels = aac_bt_cfg->audio_aac_enc_cfg.channels;
2714 ALOGV("%s: Successfully updated AAC enc format with sampling rate: %d channels:%d",
2715 __func__, aac_dsp_cfg.aac_enc_cfg.sample_rate, aac_dsp_cfg.aac_enc_cfg.channel_cfg);
2716fail:
2717 return is_configured;
2718}
2719
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302720bool configure_celt_enc_format(audio_celt_encoder_config *celt_bt_cfg)
2721{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302722 struct mixer_ctl *ctl_enc_data = NULL;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302723 struct celt_enc_cfg_t celt_dsp_cfg;
2724 bool is_configured = false;
2725 int ret = 0;
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002726 if (celt_bt_cfg == NULL)
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302727 return false;
2728
2729 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2730 if (!ctl_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002731 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302732 is_configured = false;
2733 goto fail;
2734 }
2735 memset(&celt_dsp_cfg, 0x0, sizeof(struct celt_enc_cfg_t));
2736
Florian Pfister1a84f312018-07-19 14:38:18 +02002737 celt_dsp_cfg.custom_cfg.enc_format = MEDIA_FMT_CELT;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302738 celt_dsp_cfg.custom_cfg.sample_rate = celt_bt_cfg->sampling_rate;
2739 celt_dsp_cfg.custom_cfg.num_channels = celt_bt_cfg->channels;
2740 switch(celt_dsp_cfg.custom_cfg.num_channels) {
2741 case 1:
2742 celt_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
2743 break;
2744 case 2:
2745 default:
2746 celt_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2747 celt_dsp_cfg.custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2748 break;
2749 }
2750
2751 celt_dsp_cfg.custom_cfg.custom_size = sizeof(struct celt_enc_cfg_t);
2752
2753 celt_dsp_cfg.celt_cfg.frame_size = celt_bt_cfg->frame_size;
2754 celt_dsp_cfg.celt_cfg.complexity = celt_bt_cfg->complexity;
2755 celt_dsp_cfg.celt_cfg.prediction_mode = celt_bt_cfg->prediction_mode;
2756 celt_dsp_cfg.celt_cfg.vbr_flag = celt_bt_cfg->vbr_flag;
2757 celt_dsp_cfg.celt_cfg.bit_rate = celt_bt_cfg->bitrate;
2758
2759 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&celt_dsp_cfg,
2760 sizeof(struct celt_enc_cfg_t));
2761 if (ret != 0) {
2762 ALOGE("%s: Failed to set CELT encoder config", __func__);
2763 is_configured = false;
2764 goto fail;
2765 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302766 ret = a2dp_set_bit_format(celt_bt_cfg->bits_per_sample);
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302767 if (ret != 0) {
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302768 is_configured = false;
2769 goto fail;
2770 }
2771 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002772 a2dp.bt_encoder_format = CODEC_TYPE_CELT;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302773 a2dp.enc_sampling_rate = celt_bt_cfg->sampling_rate;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05302774 a2dp.enc_channels = celt_bt_cfg->channels;
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302775 ALOGV("Successfully updated CELT encformat with samplingrate: %d channels:%d",
2776 celt_dsp_cfg.custom_cfg.sample_rate, celt_dsp_cfg.custom_cfg.num_channels);
2777fail:
2778 return is_configured;
2779}
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302780
2781bool configure_ldac_enc_format(audio_ldac_encoder_config *ldac_bt_cfg)
2782{
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302783 struct mixer_ctl *ldac_enc_data = NULL;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302784 struct ldac_enc_cfg_t ldac_dsp_cfg;
2785 bool is_configured = false;
2786 int ret = 0;
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002787 if (ldac_bt_cfg == NULL)
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302788 return false;
2789
2790 ldac_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
2791 if (!ldac_enc_data) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002792 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identified");
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302793 is_configured = false;
2794 goto fail;
2795 }
2796 memset(&ldac_dsp_cfg, 0x0, sizeof(struct ldac_enc_cfg_t));
2797
Florian Pfister1a84f312018-07-19 14:38:18 +02002798 ldac_dsp_cfg.custom_cfg.enc_format = MEDIA_FMT_LDAC;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302799 ldac_dsp_cfg.custom_cfg.sample_rate = ldac_bt_cfg->sampling_rate;
2800 ldac_dsp_cfg.ldac_cfg.channel_mode = ldac_bt_cfg->channel_mode;
2801 switch(ldac_dsp_cfg.ldac_cfg.channel_mode) {
2802 case 4:
2803 ldac_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_C;
2804 ldac_dsp_cfg.custom_cfg.num_channels = 1;
2805 break;
2806 case 2:
2807 case 1:
2808 default:
2809 ldac_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
2810 ldac_dsp_cfg.custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
2811 ldac_dsp_cfg.custom_cfg.num_channels = 2;
2812 break;
2813 }
2814
2815 ldac_dsp_cfg.custom_cfg.custom_size = sizeof(struct ldac_enc_cfg_t);
2816 ldac_dsp_cfg.ldac_cfg.mtu = ldac_bt_cfg->mtu;
2817 ldac_dsp_cfg.ldac_cfg.bit_rate = ldac_bt_cfg->bit_rate;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002818 if (ldac_bt_cfg->is_abr_enabled) {
2819 ldac_dsp_cfg.abr_cfg.mapping_info = ldac_bt_cfg->level_to_bitrate_map;
2820 ldac_dsp_cfg.abr_cfg.imc_info.direction = IMC_RECEIVE;
2821 ldac_dsp_cfg.abr_cfg.imc_info.enable = IMC_ENABLE;
2822 ldac_dsp_cfg.abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
2823 ldac_dsp_cfg.abr_cfg.imc_info.comm_instance = a2dp.abr_config.imc_instance;
Aniket Kumar Lata8c884eb2018-08-06 15:30:50 -07002824 ldac_dsp_cfg.abr_cfg.is_abr_enabled = ldac_bt_cfg->is_abr_enabled;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002825 }
2826
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302827 ret = mixer_ctl_set_array(ldac_enc_data, (void *)&ldac_dsp_cfg,
2828 sizeof(struct ldac_enc_cfg_t));
2829 if (ret != 0) {
2830 ALOGE("%s: Failed to set LDAC encoder config", __func__);
2831 is_configured = false;
2832 goto fail;
2833 }
Samyak Jain2cddc0e2018-07-18 15:22:27 +05302834 ret = a2dp_set_bit_format(ldac_bt_cfg->bits_per_sample);
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302835 if (ret != 0) {
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302836 is_configured = false;
2837 goto fail;
2838 }
2839 is_configured = true;
Florian Pfister1a84f312018-07-19 14:38:18 +02002840 a2dp.bt_encoder_format = CODEC_TYPE_LDAC;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302841 a2dp.enc_sampling_rate = ldac_bt_cfg->sampling_rate;
2842 a2dp.enc_channels = ldac_dsp_cfg.custom_cfg.num_channels;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002843 a2dp.abr_config.is_abr_enabled = ldac_bt_cfg->is_abr_enabled;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302844 ALOGV("Successfully updated LDAC encformat with samplingrate: %d channels:%d",
2845 ldac_dsp_cfg.custom_cfg.sample_rate, ldac_dsp_cfg.custom_cfg.num_channels);
2846fail:
2847 return is_configured;
2848}
2849
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302850bool configure_a2dp_encoder_format()
2851{
2852 void *codec_info = NULL;
2853 uint8_t multi_cast = 0, num_dev = 1;
Florian Pfister1a84f312018-07-19 14:38:18 +02002854 codec_t codec_type = CODEC_TYPE_INVALID;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302855 bool is_configured = false;
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002856 audio_aptx_encoder_config aptx_encoder_cfg;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302857
Florian Pfister1a84f312018-07-19 14:38:18 +02002858 if (!a2dp.audio_get_enc_config) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302859 ALOGE(" a2dp handle is not identified, ignoring a2dp encoder config");
2860 return false;
2861 }
2862 ALOGD("configure_a2dp_encoder_format start");
Florian Pfister1a84f312018-07-19 14:38:18 +02002863 codec_info = a2dp.audio_get_enc_config(&multi_cast, &num_dev,
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302864 &codec_type);
2865
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002866 // ABR disabled by default for all codecs
2867 a2dp.abr_config.is_abr_enabled = false;
Sharad Sangle95d451b2018-06-19 12:24:20 +05302868 a2dp.is_aptx_adaptive = false;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002869
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302870 switch(codec_type) {
Florian Pfister1a84f312018-07-19 14:38:18 +02002871 case CODEC_TYPE_SBC:
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302872 ALOGD(" Received SBC encoder supported BT device");
2873 is_configured =
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002874 configure_sbc_enc_format((audio_sbc_encoder_config *)codec_info);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302875 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002876 case CODEC_TYPE_APTX:
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302877 ALOGD(" Received APTX encoder supported BT device");
Manish Dewangan6a252632017-12-04 17:27:44 +05302878#ifndef LINUX_ENABLED
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002879 a2dp.is_aptx_dual_mono_supported = false;
2880 aptx_encoder_cfg.default_cfg = (audio_aptx_default_config *)codec_info;
Manish Dewangan6a252632017-12-04 17:27:44 +05302881#endif
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302882 is_configured =
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002883 configure_aptx_enc_format(&aptx_encoder_cfg);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302884 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002885 case CODEC_TYPE_APTX_HD:
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302886 ALOGD(" Received APTX HD encoder supported BT device");
Manish Dewangan6a252632017-12-04 17:27:44 +05302887#ifndef LINUX_ENABLED
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302888 is_configured =
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002889 configure_aptx_hd_enc_format((audio_aptx_default_config *)codec_info);
Manish Dewangan6a252632017-12-04 17:27:44 +05302890#else
2891 is_configured =
2892 configure_aptx_hd_enc_format((audio_aptx_encoder_config *)codec_info);
2893#endif
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002894 break;
Manish Dewangan6a252632017-12-04 17:27:44 +05302895#ifndef LINUX_ENABLED
Florian Pfister1a84f312018-07-19 14:38:18 +02002896 case CODEC_TYPE_APTX_DUAL_MONO:
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002897 ALOGD(" Received APTX dual mono encoder supported BT device");
2898 a2dp.is_aptx_dual_mono_supported = true;
Manisha Agarwala51768b2018-11-01 16:30:52 +05302899 if (a2dp.audio_is_tws_mono_mode_enable != NULL)
2900 a2dp.is_tws_mono_mode_on = a2dp.audio_is_tws_mono_mode_enable();
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07002901 aptx_encoder_cfg.dual_mono_cfg = (audio_aptx_dual_mono_config *)codec_info;
2902 is_configured =
2903 configure_aptx_enc_format(&aptx_encoder_cfg);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302904 break;
Manish Dewangan6a252632017-12-04 17:27:44 +05302905#endif
Florian Pfister1a84f312018-07-19 14:38:18 +02002906 case CODEC_TYPE_AAC:
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302907 ALOGD(" Received AAC encoder supported BT device");
Manisha Agarwalabb536a2020-01-30 16:12:44 +05302908 bool is_aac_vbr_enabled =
2909 property_get_bool("persist.vendor.bt.aac_vbr_frm_ctl.enabled", false);
Preetam Singh Ranawat3d78f522018-06-20 14:41:26 -07002910 bool is_aac_frame_ctl_enabled =
2911 property_get_bool("persist.vendor.bt.aac_frm_ctl.enabled", false);
Manisha Agarwalabb536a2020-01-30 16:12:44 +05302912 if (is_aac_vbr_enabled)
2913 is_configured = configure_aac_enc_format_v3((audio_aac_encoder_config_v3 *) codec_info);
2914 else
2915 is_configured = is_aac_frame_ctl_enabled ?
2916 configure_aac_enc_format_v2((audio_aac_encoder_config_v2 *) codec_info) :
2917 configure_aac_enc_format((audio_aac_encoder_config *) codec_info);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302918 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002919 case CODEC_TYPE_CELT:
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05302920 ALOGD(" Received CELT encoder supported BT device");
2921 is_configured =
2922 configure_celt_enc_format((audio_celt_encoder_config *)codec_info);
2923 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02002924 case CODEC_TYPE_LDAC:
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302925 ALOGD(" Received LDAC encoder supported BT device");
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002926 if (!instance_id || instance_id > MAX_INSTANCE_ID)
2927 instance_id = MAX_INSTANCE_ID;
2928 a2dp.abr_config.imc_instance = instance_id--;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302929 is_configured =
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08002930 (configure_ldac_enc_format((audio_ldac_encoder_config *)codec_info) &&
Surendar Karka2febd452018-12-13 17:56:43 +05302931 configure_a2dp_source_decoder_format(CODEC_TYPE_LDAC));
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05302932 break;
Ramu Gottipati3e0d4c32018-11-05 15:57:28 +05302933#ifndef LINUX_ENABLED //Temporarily disabled for LE, need to take care while doing VT FR
Surendar Karka2febd452018-12-13 17:56:43 +05302934 case CODEC_TYPE_APTX_AD:
Sharad Sangle95d451b2018-06-19 12:24:20 +05302935 ALOGD(" Received APTX AD encoder supported BT device");
2936 if (!instance_id || instance_id > MAX_INSTANCE_ID)
2937 instance_id = MAX_INSTANCE_ID;
2938 a2dp.abr_config.imc_instance = instance_id--;
2939 a2dp.abr_config.is_abr_enabled = true; // for APTX Adaptive ABR is Always on
2940 a2dp.is_aptx_adaptive = true;
2941 aptx_encoder_cfg.ad_cfg = (audio_aptx_ad_config *)codec_info;
2942 is_configured =
2943 (configure_aptx_enc_format(&aptx_encoder_cfg) &&
Ramu Gottipati02809682018-12-19 16:46:12 +05302944 configure_a2dp_source_decoder_format(MEDIA_FMT_APTX_AD));
Sharad Sangle95d451b2018-06-19 12:24:20 +05302945 break;
Ramu Gottipati3e0d4c32018-11-05 15:57:28 +05302946#endif
Aalique Grahame22e49102018-12-18 14:23:57 -08002947 case CODEC_TYPE_PCM:
2948 ALOGD("Received PCM format for BT device");
2949 a2dp.bt_encoder_format = CODEC_TYPE_PCM;
2950 is_configured = true;
2951 break;
Manisha Agarwald45632b2019-10-17 18:14:28 +08002952 case CODEC_TYPE_LC3:
2953 ALOGD("Received LC3 encoder supported BT device");
2954 a2dp.bt_encoder_format = CODEC_TYPE_LC3;
2955 if (!instance_id || instance_id > MAX_INSTANCE_ID)
2956 instance_id = MAX_INSTANCE_ID;
2957 a2dp.abr_config.imc_instance = instance_id--;
2958 a2dp.abr_config.is_abr_enabled = true;
2959 is_configured =
2960 (configure_lc3_enc_format((audio_lc3_codec_config_t *)codec_info) &&
2961 configure_lc3_dec_format((audio_lc3_codec_config_t *)codec_info));
2962 break;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302963 default:
2964 ALOGD(" Received Unsupported encoder formar");
2965 is_configured = false;
2966 break;
2967 }
2968 return is_configured;
2969}
2970
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08002971int a2dp_start_playback()
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302972{
2973 int ret = 0;
2974
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08002975 ALOGD("a2dp_start_playback start");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302976
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002977 if (!(a2dp.bt_lib_source_handle && a2dp.audio_source_start
Florian Pfister1a84f312018-07-19 14:38:18 +02002978 && a2dp.audio_get_enc_config)) {
2979 ALOGE("a2dp handle is not identified, Ignoring start playback request");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302980 return -ENOSYS;
2981 }
2982
Zhou Song12c29502019-03-16 10:37:18 +08002983 if (a2dp.a2dp_source_suspended || a2dp.swb_configured) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302984 //session will be restarted after suspend completion
2985 ALOGD("a2dp start requested during suspend state");
Naresh Tannirucd2353e2016-08-19 00:37:25 +05302986 return -ENOSYS;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302987 }
2988
Florian Pfister1a84f312018-07-19 14:38:18 +02002989 if (!a2dp.a2dp_source_started && !a2dp.a2dp_source_total_active_session_requests) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302990 ALOGD("calling BT module stream start");
2991 /* This call indicates BT IPC lib to start playback */
Florian Pfister1a84f312018-07-19 14:38:18 +02002992 ret = a2dp.audio_source_start();
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302993 ALOGE("BT controller start return = %d",ret);
2994 if (ret != 0 ) {
2995 ALOGE("BT controller start failed");
Florian Pfister1a84f312018-07-19 14:38:18 +02002996 a2dp.a2dp_source_started = false;
Revathi Uddarajub26e3932020-06-10 14:51:02 +05302997 ret = -ETIMEDOUT;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05302998 } else {
Arun Mirpuri5dc77802019-02-26 16:32:42 -08002999 if (configure_a2dp_encoder_format() == true) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003000 a2dp.a2dp_source_started = true;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303001 ret = 0;
3002 ALOGD("Start playback successful to BT library");
3003 } else {
3004 ALOGD(" unable to configure DSP encoder");
Florian Pfister1a84f312018-07-19 14:38:18 +02003005 a2dp.a2dp_source_started = false;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303006 ret = -ETIMEDOUT;
3007 }
3008 }
3009 }
3010
Florian Pfister1a84f312018-07-19 14:38:18 +02003011 if (a2dp.a2dp_source_started) {
3012 a2dp.a2dp_source_total_active_session_requests++;
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05303013 a2dp_check_and_set_scrambler();
Manisha Agarwal02a0b7f2019-02-06 19:24:46 +05303014 audio_a2dp_update_tws_channel_mode();
Manisha Agarwald45632b2019-10-17 18:14:28 +08003015 audio_a2dp_update_lc3_channel_mode();
Florian Pfister1a84f312018-07-19 14:38:18 +02003016 a2dp_set_backend_cfg(SOURCE);
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08003017 if (a2dp.abr_config.is_abr_enabled)
3018 start_abr();
Preetam Singh Ranawatc2bef792017-11-22 10:59:15 +05303019 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303020
3021 ALOGD("start A2DP playback total active sessions :%d",
Florian Pfister1a84f312018-07-19 14:38:18 +02003022 a2dp.a2dp_source_total_active_session_requests);
3023 return ret;
3024}
3025
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003026uint64_t a2dp_get_decoder_latency()
Florian Pfister1a84f312018-07-19 14:38:18 +02003027{
3028 uint32_t latency = 0;
3029
3030 switch(a2dp.bt_decoder_format) {
3031 case CODEC_TYPE_SBC:
3032 latency = DEFAULT_SINK_LATENCY_SBC;
3033 break;
3034 case CODEC_TYPE_AAC:
3035 latency = DEFAULT_SINK_LATENCY_AAC;
3036 break;
3037 default:
3038 latency = 200;
3039 ALOGD("No valid decoder defined, setting latency to %dms", latency);
3040 break;
3041 }
3042 return (uint64_t)latency;
3043}
3044
3045bool a2dp_send_sink_setup_complete(void) {
3046 uint64_t system_latency = 0;
3047 bool is_complete = false;
3048
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003049 system_latency = a2dp_get_decoder_latency();
Florian Pfister1a84f312018-07-19 14:38:18 +02003050
3051 if (a2dp.audio_sink_session_setup_complete(system_latency) == 0) {
3052 is_complete = true;
3053 }
3054 return is_complete;
3055}
3056
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003057bool a2dp_sink_is_ready()
3058{
3059 bool ret = false;
3060
3061 if ((a2dp.bt_state_sink != A2DP_STATE_DISCONNECTED) &&
3062 (a2dp.is_a2dp_offload_supported) &&
3063 (a2dp.audio_sink_check_a2dp_ready))
3064 ret = a2dp.audio_sink_check_a2dp_ready();
3065 return ret;
3066}
3067
3068int a2dp_start_capture()
Florian Pfister1a84f312018-07-19 14:38:18 +02003069{
3070 int ret = 0;
3071
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003072 ALOGD("a2dp_start_capture start");
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303073 /* checking for sink lib for mobile platform not available then using source lib */
3074 if ((!(a2dp.bt_lib_sink_handle && a2dp.audio_sink_start
3075 && a2dp.audio_get_dec_config)) && (!(a2dp.bt_lib_source_handle && a2dp.audio_source_start
3076 && a2dp.audio_get_enc_config))) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003077 ALOGE("a2dp handle is not identified, Ignoring start capture request");
3078 return -ENOSYS;
3079 }
3080
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303081 if (a2dp.bt_lib_sink_handle && !a2dp.a2dp_sink_started
Zhou Songf7a2fdf2021-05-07 09:14:21 +08003082 && !a2dp.a2dp_sink_total_active_session_requests && a2dp.audio_sink_start) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003083 ALOGD("calling BT module stream start");
3084 /* This call indicates BT IPC lib to start capture */
3085 ret = a2dp.audio_sink_start();
3086 ALOGE("BT controller start capture return = %d",ret);
3087 if (ret != 0 ) {
3088 ALOGE("BT controller start capture failed");
3089 a2dp.a2dp_sink_started = false;
3090 } else {
3091
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003092 if (!a2dp_sink_is_ready()) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003093 ALOGD("Wait for capture ready not successful");
3094 ret = -ETIMEDOUT;
3095 }
3096
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003097 if (configure_a2dp_sink_decoder_format() == true) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003098 a2dp.a2dp_sink_started = true;
3099 ret = 0;
3100 ALOGD("Start capture successful to BT library");
3101 } else {
3102 ALOGD(" unable to configure DSP decoder");
3103 a2dp.a2dp_sink_started = false;
3104 ret = -ETIMEDOUT;
3105 }
3106
3107 if (!a2dp_send_sink_setup_complete()) {
3108 ALOGD("sink_setup_complete not successful");
3109 ret = -ETIMEDOUT;
3110 }
3111 }
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303112 } else if ((a2dp.bt_lib_source_handle) && (configure_a2dp_sink_decoder_format())) {
3113 if (a2dp.audio_source_start) {
3114 ret = a2dp.audio_source_start();
3115 if (ret == 0) {
3116 a2dp.a2dp_sink_started = true;
3117 ALOGD("Start capture successful to BT library");
3118 } else {
3119 ALOGE("BT controller start failed");
3120 }
3121 }
3122 } else {
3123 ALOGD(" unable to configure DSP decoder");
3124 a2dp.a2dp_sink_started = false;
3125 ret = -ETIMEDOUT;
Florian Pfister1a84f312018-07-19 14:38:18 +02003126 }
3127
3128 if (a2dp.a2dp_sink_started) {
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303129 if (a2dp_set_backend_cfg(SINK) == true)
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003130 a2dp.a2dp_sink_total_active_session_requests++;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303131 /* Start abr for LC3 decoder*/
3132 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3) {
3133 a2dp.abr_config.is_abr_enabled = true;
Zhou Song8d7ba052021-05-17 00:40:35 +08003134 /*
3135 * Before starting abr, we must ensure to set correct acdb id
3136 * because abr will trigger port open which needs acdb_id
3137 */
3138 fp_platform_switch_voice_call_device_post(a2dp.adev->platform,
3139 SND_DEVICE_OUT_BT_SCO_WB,
3140 SND_DEVICE_IN_BT_SCO_MIC_WB);
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303141 start_abr();
Florian Pfister1a84f312018-07-19 14:38:18 +02003142 }
3143 }
3144
3145 ALOGD("start A2DP sink total active sessions :%d",
3146 a2dp.a2dp_sink_total_active_session_requests);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303147 return ret;
3148}
3149
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303150static void reset_a2dp_enc_config_params()
3151{
3152 int ret =0;
3153
Aalique Grahame22e49102018-12-18 14:23:57 -08003154 struct mixer_ctl *ctl_enc_config, *ctl_channel_mode;
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303155 struct sbc_enc_cfg_t dummy_reset_config;
Manisha Agarwala51768b2018-11-01 16:30:52 +05303156 char* channel_mode;
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303157
3158 memset(&dummy_reset_config, 0x0, sizeof(struct sbc_enc_cfg_t));
3159 ctl_enc_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
3160 MIXER_ENC_CONFIG_BLOCK);
3161 if (!ctl_enc_config) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003162 ALOGE(" ERROR a2dp encoder format mixer control not identified");
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303163 } else {
3164 ret = mixer_ctl_set_array(ctl_enc_config, (void *)&dummy_reset_config,
3165 sizeof(struct sbc_enc_cfg_t));
Florian Pfister1a84f312018-07-19 14:38:18 +02003166 a2dp.bt_encoder_format = MEDIA_FMT_NONE;
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303167 }
Aalique Grahame22e49102018-12-18 14:23:57 -08003168
3169 a2dp_set_bit_format(DEFAULT_ENCODER_BIT_FORMAT);
3170
Manisha Agarwala51768b2018-11-01 16:30:52 +05303171 ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_TWS_CHANNEL_MODE);
3172
3173 if (!ctl_channel_mode) {
3174 ALOGE("failed to get tws mixer ctl");
3175 } else {
3176 channel_mode = "Two";
3177 if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
3178 ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
3179 }
3180 a2dp.is_tws_mono_mode_on = false;
3181 }
Manisha Agarwald45632b2019-10-17 18:14:28 +08003182
3183 ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_LC3_CHANNEL_MODE);
3184
3185 if (!ctl_channel_mode) {
3186 ALOGE("failed to get lc3 mixer ctl");
3187 } else {
3188 channel_mode = "Two";
3189 if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0)
3190 ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
3191 a2dp.is_lc3_mono_mode_on = false;
3192 }
Naresh Tanniru03f9dd52016-10-19 18:46:22 +05303193}
3194
Surendar Karka2febd452018-12-13 17:56:43 +05303195static int reset_a2dp_source_dec_config_params()
Aniket Kumar Latae1220c32018-05-29 14:55:47 -07003196{
3197 struct mixer_ctl *ctl_dec_data = NULL;
3198 struct abr_dec_cfg_t dummy_reset_cfg;
3199 int ret = 0;
3200
Zhou Songf7a2fdf2021-05-07 09:14:21 +08003201 if (a2dp.bt_decoder_format == CODEC_TYPE_LC3)
3202 a2dp.bt_decoder_format = CODEC_TYPE_INVALID;
3203
Preetam Singh Ranawat25780e42019-07-31 18:15:57 +05303204 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SOURCE_DEC_CONFIG_BLOCK);
3205 if (!ctl_dec_data) {
3206 ALOGE("%s: ERROR A2DP decoder config mixer control not identifed", __func__);
3207 return -EINVAL;
3208 }
3209 memset(&dummy_reset_cfg, 0x0, sizeof(dummy_reset_cfg));
3210 ret = mixer_ctl_set_array(ctl_dec_data, (void *)&dummy_reset_cfg,
3211 sizeof(dummy_reset_cfg));
3212 if (ret != 0) {
3213 ALOGE("%s: Failed to set dummy decoder config", __func__);
3214 return ret;
Aniket Kumar Latae1220c32018-05-29 14:55:47 -07003215 }
3216
3217 return ret;
3218}
3219
Surendar Karka2febd452018-12-13 17:56:43 +05303220static void reset_a2dp_sink_dec_config_params()
Florian Pfister1a84f312018-07-19 14:38:18 +02003221{
3222 int ret =0;
3223
3224 struct mixer_ctl *ctl_dec_config, *ctrl_bit_format;
3225 struct aac_dec_cfg_t dummy_reset_config;
3226
3227 memset(&dummy_reset_config, 0x0, sizeof(struct aac_dec_cfg_t));
3228 ctl_dec_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
Surendar Karka2febd452018-12-13 17:56:43 +05303229 MIXER_SINK_DEC_CONFIG_BLOCK);
Florian Pfister1a84f312018-07-19 14:38:18 +02003230 if (!ctl_dec_config) {
3231 ALOGE(" ERROR a2dp decoder format mixer control not identified");
3232 } else {
3233 ret = mixer_ctl_set_array(ctl_dec_config, (void *)&dummy_reset_config,
3234 sizeof(struct aac_dec_cfg_t));
3235 a2dp.bt_decoder_format = MEDIA_FMT_NONE;
3236 }
3237 ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
3238 MIXER_DEC_BIT_FORMAT);
3239 if (!ctrl_bit_format) {
3240 ALOGE(" ERROR bit format CONFIG data mixer control not identified");
3241 } else {
3242 ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
3243 if (ret != 0) {
3244 ALOGE("%s: Failed to set bit format to decoder", __func__);
3245 }
3246 }
3247}
3248
Zhou Song12c29502019-03-16 10:37:18 +08003249static void reset_codec_config()
3250{
3251 reset_a2dp_enc_config_params();
3252 reset_a2dp_source_dec_config_params();
3253 a2dp_reset_backend_cfg(SOURCE);
3254 if (a2dp.abr_config.is_abr_enabled && a2dp.abr_config.abr_started)
3255 stop_abr();
3256 a2dp.abr_config.is_abr_enabled = false;
3257}
3258
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003259int a2dp_stop_playback()
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303260{
3261 int ret =0;
3262
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003263 ALOGV("a2dp_stop_playback start");
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003264 if (!(a2dp.bt_lib_source_handle && a2dp.audio_source_stop)) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003265 ALOGE("a2dp handle is not identified, Ignoring stop request");
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303266 return -ENOSYS;
3267 }
3268
Florian Pfister1a84f312018-07-19 14:38:18 +02003269 if (a2dp.a2dp_source_total_active_session_requests > 0)
3270 a2dp.a2dp_source_total_active_session_requests--;
Aalique Grahame22e49102018-12-18 14:23:57 -08003271 else
3272 ALOGE("%s: No active playback session requests on A2DP", __func__);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303273
Florian Pfister1a84f312018-07-19 14:38:18 +02003274 if ( a2dp.a2dp_source_started && !a2dp.a2dp_source_total_active_session_requests) {
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303275 ALOGV("calling BT module stream stop");
Florian Pfister1a84f312018-07-19 14:38:18 +02003276 ret = a2dp.audio_source_stop();
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303277 if (ret < 0)
3278 ALOGE("stop stream to BT IPC lib failed");
3279 else
3280 ALOGV("stop steam to BT IPC lib successful");
Zhou Song12c29502019-03-16 10:37:18 +08003281 if (!a2dp.a2dp_source_suspended && !a2dp.swb_configured)
3282 reset_codec_config();
Surendar Karka2febd452018-12-13 17:56:43 +05303283 a2dp.a2dp_source_started = false;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303284 }
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003285 if (!a2dp.a2dp_source_total_active_session_requests)
Florian Pfister1a84f312018-07-19 14:38:18 +02003286 a2dp.a2dp_source_started = false;
3287 ALOGD("Stop A2DP playback, total active sessions :%d",
3288 a2dp.a2dp_source_total_active_session_requests);
3289 return 0;
3290}
3291
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003292int a2dp_stop_capture()
Florian Pfister1a84f312018-07-19 14:38:18 +02003293{
3294 int ret =0;
3295
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003296 ALOGV("a2dp_stop_capture start");
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303297 if ((!(a2dp.bt_lib_sink_handle && a2dp.audio_sink_stop))
3298 && (!(a2dp.bt_lib_source_handle && a2dp.audio_source_stop))) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003299 ALOGE("a2dp handle is not identified, Ignoring stop request");
3300 return -ENOSYS;
3301 }
3302
3303 if (a2dp.a2dp_sink_total_active_session_requests > 0)
3304 a2dp.a2dp_sink_total_active_session_requests--;
3305
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303306 if (a2dp.bt_lib_sink_handle && a2dp.a2dp_sink_started
Zhou Songf7a2fdf2021-05-07 09:14:21 +08003307 && !a2dp.a2dp_sink_total_active_session_requests && a2dp.audio_sink_stop) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003308 ALOGV("calling BT module stream stop");
3309 ret = a2dp.audio_sink_stop();
3310 if (ret < 0)
3311 ALOGE("stop stream to BT IPC lib failed");
3312 else
3313 ALOGV("stop steam to BT IPC lib successful");
Surendar Karka2febd452018-12-13 17:56:43 +05303314 reset_a2dp_sink_dec_config_params();
Florian Pfister1a84f312018-07-19 14:38:18 +02003315 a2dp_reset_backend_cfg(SINK);
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303316 } else if (a2dp.bt_lib_source_handle) {
3317 ret = a2dp.audio_source_stop();
3318 if (ret < 0)
3319 ALOGE("stop stream to BT IPC lib failed");
3320 else
3321 ALOGV("stop steam to BT IPC lib successful");
Zhou Songf7a2fdf2021-05-07 09:14:21 +08003322 a2dp.bt_decoder_format = CODEC_TYPE_INVALID;
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303323 reset_codec_config();
3324 a2dp.a2dp_sink_started = false;
Florian Pfister1a84f312018-07-19 14:38:18 +02003325 }
Kakanaboina Ramanjaneyulu8cedb092021-03-15 15:55:29 +05303326
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003327 if (!a2dp.a2dp_sink_total_active_session_requests)
Florian Pfister1a84f312018-07-19 14:38:18 +02003328 a2dp.a2dp_source_started = false;
3329 ALOGD("Stop A2DP capture, total active sessions :%d",
3330 a2dp.a2dp_sink_total_active_session_requests);
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303331 return 0;
3332}
3333
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003334int a2dp_set_parameters(struct str_parms *parms, bool *reconfig)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303335{
Weiyin Jiang280ea742020-09-08 20:28:22 +08003336 int ret = 0, val, status = 0;
3337 char value[32] = {0};
3338 struct audio_usecase *uc_info;
3339 struct listnode *node;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303340
Weiyin Jiang280ea742020-09-08 20:28:22 +08003341 if (a2dp.is_a2dp_offload_supported == false) {
Aalique Grahame22e49102018-12-18 14:23:57 -08003342 ALOGV("no supported encoders identified,ignoring a2dp setparam");
3343 status = -EINVAL;
3344 goto param_handled;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003345 }
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_CONNECT, value,
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303348 sizeof(value));
Weiyin Jiang280ea742020-09-08 20:28:22 +08003349 if (ret >= 0) {
3350 val = atoi(value);
3351 if (audio_is_a2dp_out_device(val)) {
3352 ALOGV("Received device connect request for A2DP source");
3353 open_a2dp_source();
3354 }
3355 goto param_handled;
3356 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303357
Weiyin Jiang280ea742020-09-08 20:28:22 +08003358 ret = str_parms_get_str(parms, AUDIO_PARAMETER_DEVICE_DISCONNECT, value,
3359 sizeof(value));
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303360
Weiyin Jiang280ea742020-09-08 20:28:22 +08003361 if (ret >= 0) {
3362 val = atoi(value);
3363 if (audio_is_a2dp_out_device(val)) {
3364 ALOGV("Received source device dis- connect request");
3365 close_a2dp_output();
3366 reset_a2dp_enc_config_params();
3367 reset_a2dp_source_dec_config_params();
3368 a2dp_reset_backend_cfg(SOURCE);
3369 } else if (audio_is_a2dp_in_device(val)) {
3370 ALOGV("Received sink device dis- connect request");
3371 close_a2dp_input();
3372 reset_a2dp_sink_dec_config_params();
3373 a2dp_reset_backend_cfg(SINK);
3374 }
3375 goto param_handled;
3376 }
Surendar Karka2febd452018-12-13 17:56:43 +05303377#ifndef LINUX_ENABLED
Weiyin Jiang280ea742020-09-08 20:28:22 +08003378 ret = str_parms_get_str(parms, "TwsChannelConfig", value, sizeof(value));
3379 if (ret >= 0) {
3380 ALOGD("Setting tws channel mode to %s",value);
3381 if (!(strncmp(value, "mono", strlen(value))))
Manisha Agarwala51768b2018-11-01 16:30:52 +05303382 a2dp.is_tws_mono_mode_on = true;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003383 else if (!(strncmp(value, "dual-mono", strlen(value))))
Manisha Agarwala51768b2018-11-01 16:30:52 +05303384 a2dp.is_tws_mono_mode_on = false;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003385 audio_a2dp_update_tws_channel_mode();
3386 goto param_handled;
3387 }
Manisha Agarwald45632b2019-10-17 18:14:28 +08003388
3389 ret = str_parms_get_str(parms, "LEAMono", value, sizeof(value));
3390 if (ret>=0) {
3391 ALOGD("Setting LC3 channel mode to %s",value);
3392 if (!(strncmp(value,"true",strlen(value))))
3393 a2dp.is_lc3_mono_mode_on = true;
3394 else
3395 a2dp.is_lc3_mono_mode_on = false;
3396 audio_a2dp_update_lc3_channel_mode();
3397 goto param_handled;
3398 }
Surendar Karka2febd452018-12-13 17:56:43 +05303399#endif
Weiyin Jiang280ea742020-09-08 20:28:22 +08003400 ret = str_parms_get_str(parms, "A2dpSuspended", value, sizeof(value));
3401 if (ret >= 0) {
3402 if (a2dp.bt_lib_source_handle == NULL)
3403 goto param_handled;
3404
3405 if ((!strncmp(value, "true", sizeof(value)))) {
3406 if (a2dp.a2dp_source_suspended) {
3407 ALOGD("%s: A2DP is already suspended", __func__);
3408 goto param_handled;
3409 }
3410 ALOGD("Setting a2dp to suspend state");
3411 a2dp.a2dp_source_suspended = true;
3412 if (a2dp.bt_state_source == A2DP_STATE_DISCONNECTED)
3413 goto param_handled;
3414 list_for_each(node, &a2dp.adev->usecase_list) {
3415 uc_info = node_to_item(node, struct audio_usecase, list);
3416 if (uc_info->type == PCM_PLAYBACK &&
3417 (uc_info->out_snd_device == SND_DEVICE_OUT_BT_A2DP ||
3418 uc_info->out_snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP ||
3419 uc_info->out_snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP)) {
3420 fp_check_a2dp_restore_l(a2dp.adev, uc_info->stream.out, false);
Aalique Grahame22e49102018-12-18 14:23:57 -08003421 }
Weiyin Jiang280ea742020-09-08 20:28:22 +08003422 }
3423 if (!a2dp.swb_configured)
3424 reset_codec_config();
3425 if (a2dp.audio_source_suspend)
3426 a2dp.audio_source_suspend();
3427 } else if (a2dp.a2dp_source_suspended == true) {
3428 ALOGD("Resetting a2dp suspend state");
3429 struct audio_usecase *uc_info;
3430 struct listnode *node;
3431 if (a2dp.clear_source_a2dpsuspend_flag)
3432 a2dp.clear_source_a2dpsuspend_flag();
3433 a2dp.a2dp_source_suspended = false;
3434 /*
3435 * It is possible that before suspend,a2dp sessions can be active
3436 * for example during music + voice activation concurrency
3437 * a2dp suspend will be called & BT will change to sco mode
3438 * though music is paused as a part of voice activation
3439 * compress session close happens only after pause timeout(10secs)
3440 * so if resume request comes before pause timeout as a2dp session
3441 * is already active IPC start will not be called from APM/audio_hw
3442 * Fix is to call a2dp start for IPC library post suspend
3443 * based on number of active session count
3444 */
3445 if (a2dp.a2dp_source_total_active_session_requests > 0) {
3446 ALOGD(" Calling IPC lib start post suspend state");
3447 if (a2dp.audio_source_start) {
3448 ret = a2dp.audio_source_start();
3449 if (ret != 0) {
3450 ALOGE("BT controller start failed");
3451 a2dp.a2dp_source_started = false;
Chaithanya Krishna Bacharaju69d2e4c2017-05-26 18:22:46 +05303452 }
3453 }
Weiyin Jiang280ea742020-09-08 20:28:22 +08003454 }
3455 list_for_each(node, &a2dp.adev->usecase_list) {
3456 uc_info = node_to_item(node, struct audio_usecase, list);
3457 if (uc_info->stream.out && uc_info->type == PCM_PLAYBACK &&
3458 is_a2dp_out_device_type(&uc_info->stream.out->device_list)) {
3459 fp_check_a2dp_restore_l(a2dp.adev, uc_info->stream.out, true);
Zhou Song10617ed2017-05-26 13:28:48 +08003460 }
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303461 }
3462 }
3463 goto param_handled;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003464 }
Aalique Grahame22e49102018-12-18 14:23:57 -08003465
Weiyin Jiang280ea742020-09-08 20:28:22 +08003466 ret = str_parms_get_str(parms, AUDIO_PARAMETER_RECONFIG_A2DP, value,
3467 sizeof(value));
3468 if (ret >= 0) {
3469 if (a2dp.is_a2dp_offload_supported &&
3470 a2dp.bt_state_source != A2DP_STATE_DISCONNECTED) {
3471 *reconfig = true;
3472 }
3473 goto param_handled;
3474 }
Aalique Grahame22e49102018-12-18 14:23:57 -08003475
Lakshman Chaluvarajuefecf102021-06-18 14:32:41 +05303476 ret = str_parms_get_str(parms, "BT_SCO", value, sizeof(value));
3477 if (ret >= 0) {
3478 if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0) {
3479 a2dp.a2dp_source_suspended = true;
3480 }
3481 }
3482
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303483param_handled:
Weiyin Jiang280ea742020-09-08 20:28:22 +08003484 ALOGV("end of a2dp setparam");
3485 return status;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303486}
3487
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003488void a2dp_set_handoff_mode(bool is_on)
Naresh Tannirucd2353e2016-08-19 00:37:25 +05303489{
3490 a2dp.is_handoff_in_progress = is_on;
3491}
3492
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003493bool a2dp_is_force_device_switch()
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303494{
3495 //During encoder reconfiguration mode, force a2dp device switch
Ashish Jainc597d102016-12-12 10:31:34 +05303496 // Or if a2dp device is selected but earlier start failed ( as a2dp
3497 // was suspended, force retry.
Florian Pfister1a84f312018-07-19 14:38:18 +02003498 return a2dp.is_handoff_in_progress || !a2dp.a2dp_source_started;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303499}
3500
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003501void a2dp_get_enc_sample_rate(int *sample_rate)
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05303502{
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05303503 *sample_rate = a2dp.enc_sampling_rate;
3504}
Preetam Singh Ranawata1849ba2017-02-06 14:10:11 +05303505
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003506void a2dp_get_dec_sample_rate(int *sample_rate)
Florian Pfister1a84f312018-07-19 14:38:18 +02003507{
3508 *sample_rate = a2dp.dec_sampling_rate;
3509}
3510
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003511bool a2dp_source_is_ready()
Preetam Singh Ranawata1849ba2017-02-06 14:10:11 +05303512{
3513 bool ret = false;
3514
Florian Pfister1a84f312018-07-19 14:38:18 +02003515 if (a2dp.a2dp_source_suspended)
Chaithanya Krishna Bacharaju69d2e4c2017-05-26 18:22:46 +05303516 return ret;
3517
Florian Pfister1a84f312018-07-19 14:38:18 +02003518 if ((a2dp.bt_state_source != A2DP_STATE_DISCONNECTED) &&
Aniket Kumar Lata901bcb82017-03-10 15:42:46 -08003519 (a2dp.is_a2dp_offload_supported) &&
Florian Pfister1a84f312018-07-19 14:38:18 +02003520 (a2dp.audio_source_check_a2dp_ready))
3521 ret = a2dp.audio_source_check_a2dp_ready();
Preetam Singh Ranawata1849ba2017-02-06 14:10:11 +05303522 return ret;
3523}
3524
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003525bool a2dp_source_is_suspended()
Florian Pfister1a84f312018-07-19 14:38:18 +02003526{
3527 return a2dp.a2dp_source_suspended;
Chaithanya Krishna Bacharaju69d2e4c2017-05-26 18:22:46 +05303528}
3529
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003530void a2dp_init(void *adev,
Aalique Grahame6e763712019-01-31 16:18:17 -08003531 a2dp_offload_init_config_t init_config)
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303532{
3533 a2dp.adev = (struct audio_device*)adev;
Florian Pfister1a84f312018-07-19 14:38:18 +02003534 a2dp.bt_lib_source_handle = NULL;
3535 a2dp.a2dp_source_started = false;
3536 a2dp.bt_state_source = A2DP_STATE_DISCONNECTED;
3537 a2dp.a2dp_source_total_active_session_requests = 0;
3538 a2dp.a2dp_source_suspended = false;
3539 a2dp.bt_encoder_format = CODEC_TYPE_INVALID;
Naresh Tanniruf5ba8d02016-09-29 18:06:37 +05303540 a2dp.enc_sampling_rate = 48000;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303541 a2dp.is_handoff_in_progress = false;
Aniket Kumar Lata53e54b12017-08-24 17:45:38 -07003542 a2dp.is_aptx_dual_mono_supported = false;
Sharad Sangle95d451b2018-06-19 12:24:20 +05303543 a2dp.is_aptx_adaptive = false;
Aniket Kumar Lata7fd86e12018-02-20 19:26:10 -08003544 a2dp.abr_config.is_abr_enabled = false;
3545 a2dp.abr_config.abr_started = false;
3546 a2dp.abr_config.imc_instance = 0;
3547 a2dp.abr_config.abr_tx_handle = NULL;
Zhou Song12c29502019-03-16 10:37:18 +08003548 a2dp.abr_config.abr_rx_handle = NULL;
Manisha Agarwala51768b2018-11-01 16:30:52 +05303549 a2dp.is_tws_mono_mode_on = false;
Manisha Agarwald45632b2019-10-17 18:14:28 +08003550 a2dp.is_lc3_mono_mode_on = false;
Naresh Tanniru66cf06c2019-03-20 19:30:37 +05303551 a2dp_source_init();
Zhou Song12c29502019-03-16 10:37:18 +08003552 a2dp.swb_configured = false;
3553
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003554 // init function pointers
3555 fp_platform_get_pcm_device_id =
Aalique Grahame6e763712019-01-31 16:18:17 -08003556 init_config.fp_platform_get_pcm_device_id;
Weiyin Jiang280ea742020-09-08 20:28:22 +08003557 fp_check_a2dp_restore_l = init_config.fp_check_a2dp_restore_l;
Gautam Manamfbb3ebc2020-10-08 18:06:45 +05303558 fp_platform_switch_voice_call_device_post =
3559 init_config.fp_platform_switch_voice_call_device_post;
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003560
kunleiz5a127262017-09-08 14:47:48 +08003561 reset_a2dp_enc_config_params();
Surendar Karka2febd452018-12-13 17:56:43 +05303562 reset_a2dp_source_dec_config_params();
3563 reset_a2dp_sink_dec_config_params();
Florian Pfister1a84f312018-07-19 14:38:18 +02003564
3565 a2dp.bt_lib_sink_handle = NULL;
3566 a2dp.a2dp_sink_started = false;
3567 a2dp.bt_state_sink = A2DP_STATE_DISCONNECTED;
3568 a2dp.a2dp_sink_total_active_session_requests = 0;
Arun Mirpuri5dc77802019-02-26 16:32:42 -08003569
3570 if (is_running_with_enhanced_fwk == UNINITIALIZED)
3571 is_running_with_enhanced_fwk = check_if_enhanced_fwk();
3572 if (is_running_with_enhanced_fwk)
Aalique Grahame6e763712019-01-31 16:18:17 -08003573 open_a2dp_sink();
Florian Pfister1a84f312018-07-19 14:38:18 +02003574
3575 a2dp.is_a2dp_offload_supported = false;
Naresh Tanniru9d027a62015-03-13 01:32:10 +05303576 update_offload_codec_capabilities();
3577}
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003578
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003579uint32_t a2dp_get_encoder_latency()
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003580{
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003581 uint32_t latency = 0;
3582 int avsync_runtime_prop = 0;
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05303583 int sbc_offset = 0, aptx_offset = 0, aptxhd_offset = 0,
3584 aac_offset = 0, celt_offset = 0, ldac_offset = 0;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003585 char value[PROPERTY_VALUE_MAX];
3586
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003587 memset(value, '\0', sizeof(char)*PROPERTY_VALUE_MAX);
Aalique Grahame22e49102018-12-18 14:23:57 -08003588 avsync_runtime_prop = property_get(SYSPROP_A2DP_CODEC_LATENCIES, value, NULL);
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003589 if (avsync_runtime_prop > 0) {
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05303590 if (sscanf(value, "%d/%d/%d/%d/%d%d",
3591 &sbc_offset, &aptx_offset, &aptxhd_offset, &aac_offset, &celt_offset, &ldac_offset) != 6) {
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003592 ALOGI("Failed to parse avsync offset params from '%s'.", value);
3593 avsync_runtime_prop = 0;
3594 }
3595 }
3596
yidongh0515e042017-07-06 15:00:34 +08003597 uint32_t slatency = 0;
Florian Pfister1a84f312018-07-19 14:38:18 +02003598 if (a2dp.audio_sink_get_a2dp_latency && a2dp.bt_state_source != A2DP_STATE_DISCONNECTED) {
3599 slatency = a2dp.audio_sink_get_a2dp_latency();
yidongh0515e042017-07-06 15:00:34 +08003600 }
3601
Aniket Kumar Latafaaffde2017-03-22 19:18:15 -07003602 switch(a2dp.bt_encoder_format) {
Florian Pfister1a84f312018-07-19 14:38:18 +02003603 case CODEC_TYPE_SBC:
yidongh0515e042017-07-06 15:00:34 +08003604 latency = (avsync_runtime_prop > 0) ? sbc_offset : ENCODER_LATENCY_SBC;
3605 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_SBC : slatency;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003606 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003607 case CODEC_TYPE_APTX:
yidongh0515e042017-07-06 15:00:34 +08003608 latency = (avsync_runtime_prop > 0) ? aptx_offset : ENCODER_LATENCY_APTX;
3609 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_APTX : slatency;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003610 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003611 case CODEC_TYPE_APTX_HD:
yidongh0515e042017-07-06 15:00:34 +08003612 latency = (avsync_runtime_prop > 0) ? aptxhd_offset : ENCODER_LATENCY_APTX_HD;
3613 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_APTX_HD : slatency;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003614 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003615 case CODEC_TYPE_AAC:
yidongh0515e042017-07-06 15:00:34 +08003616 latency = (avsync_runtime_prop > 0) ? aac_offset : ENCODER_LATENCY_AAC;
3617 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_AAC : slatency;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003618 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003619 case CODEC_TYPE_CELT:
Preetam Singh Ranawat0d645ea2017-08-07 18:12:07 +05303620 latency = (avsync_runtime_prop > 0) ? celt_offset : ENCODER_LATENCY_CELT;
3621 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_CELT : slatency;
3622 break;
Florian Pfister1a84f312018-07-19 14:38:18 +02003623 case CODEC_TYPE_LDAC:
Preetam Singh Ranawatd058a3d2017-10-25 17:31:37 +05303624 latency = (avsync_runtime_prop > 0) ? ldac_offset : ENCODER_LATENCY_LDAC;
3625 latency += (slatency <= 0) ? DEFAULT_SINK_LATENCY_LDAC : slatency;
3626 break;
Ramu Gottipatib729cf82018-12-20 15:36:46 +05303627 case CODEC_TYPE_APTX_AD: // for aptx adaptive the latency depends on the mode (HQ/LL) and
Sharad Sanglee378afe2018-09-03 20:04:17 +05303628 latency = slatency; // BT IPC will take care of accomodating the mode factor and return latency
Preetam Singh Ranawat79c514e2018-12-16 18:49:34 +05303629 break;
Manisha Agarwald45632b2019-10-17 18:14:28 +08003630 case CODEC_TYPE_LC3:
3631 latency = slatency;
3632 break;
Aalique Grahame22e49102018-12-18 14:23:57 -08003633 case CODEC_TYPE_PCM:
3634 latency = ENCODER_LATENCY_PCM;
3635 latency += DEFAULT_SINK_LATENCY_PCM;
3636 break;
Aniket Kumar Latad5972fa2017-02-08 13:53:48 -08003637 default:
3638 latency = 200;
3639 break;
3640 }
3641 return latency;
3642}
Aalique Grahame22e49102018-12-18 14:23:57 -08003643
Arun Mirpurib1bec9c2019-01-29 16:42:45 -08003644int a2dp_get_parameters(struct str_parms *query,
Aalique Grahame22e49102018-12-18 14:23:57 -08003645 struct str_parms *reply)
3646{
3647 int ret, val = 0;
3648 char value[32]={0};
3649
3650 ret = str_parms_get_str(query, AUDIO_PARAMETER_A2DP_RECONFIG_SUPPORTED,
3651 value, sizeof(value));
3652 if (ret >= 0) {
3653 val = a2dp.is_a2dp_offload_supported;
3654 str_parms_add_int(reply, AUDIO_PARAMETER_A2DP_RECONFIG_SUPPORTED, val);
3655 ALOGV("%s: called ... isReconfigA2dpSupported %d", __func__, val);
3656 }
3657
3658 return 0;
3659}
Zhou Song12c29502019-03-16 10:37:18 +08003660
3661
3662bool configure_aptx_ad_speech_enc_fmt() {
3663 struct mixer_ctl *ctl_enc_data = NULL;
3664 int mixer_size = 0;
3665 int ret = 0;
3666 struct aptx_ad_speech_enc_cfg_t aptx_dsp_cfg;
3667
3668 ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
3669 if (!ctl_enc_data) {
3670 ALOGE(" ERROR a2dp encoder CONFIG data mixer control not identifed");
3671 return false;
3672 }
3673
3674 /* Initialize dsp configuration params */
3675 memset(&aptx_dsp_cfg, 0x0, sizeof(struct aptx_ad_speech_enc_cfg_t));
3676 aptx_dsp_cfg.custom_cfg.enc_format = MEDIA_FMT_APTX_AD_SPEECH;
3677 aptx_dsp_cfg.custom_cfg.sample_rate = SAMPLING_RATE_32K;
3678 aptx_dsp_cfg.custom_cfg.num_channels = CH_MONO;
3679 aptx_dsp_cfg.custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
3680 aptx_dsp_cfg.imc_info.direction = IMC_RECEIVE;
3681 aptx_dsp_cfg.imc_info.enable = IMC_ENABLE;
3682 aptx_dsp_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
3683 aptx_dsp_cfg.imc_info.comm_instance = APTX_AD_SPEECH_INSTANCE_ID;
3684 aptx_dsp_cfg.speech_mode.mode = a2dp.adev->swb_speech_mode;
3685 aptx_dsp_cfg.speech_mode.swapping = SWAP_ENABLE;
3686
3687 /* Configure AFE DSP configuration */
3688 mixer_size = sizeof(struct aptx_ad_speech_enc_cfg_t);
3689 ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_dsp_cfg,
3690 mixer_size);
3691 if (ret != 0) {
3692 ALOGE("%s: Failed to set SWB encoder config", __func__);
3693 return false;
3694 }
3695
3696 /* Configure AFE Input Bit Format as PCM_16 */
3697 ret = a2dp_set_bit_format(DEFAULT_ENCODER_BIT_FORMAT);
3698 if (ret != 0) {
3699 ALOGE("%s: Failed to set SWB bit format", __func__);
3700 return false;
3701 }
3702
3703 return true;
3704}
3705
3706bool configure_aptx_ad_speech_dec_fmt()
3707{
3708 struct mixer_ctl *ctl_dec_data = NULL;
3709 struct aptx_ad_speech_dec_cfg_t dec_cfg;
3710 int ret = 0;
3711
3712 ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SOURCE_DEC_CONFIG_BLOCK);
3713 if (!ctl_dec_data) {
3714 ALOGE("%s: ERROR codec config data mixer control not identifed", __func__);
3715 return false;
3716 }
3717 memset(&dec_cfg, 0x0, sizeof(dec_cfg));
3718 dec_cfg.abr_cfg.dec_format = MEDIA_FMT_APTX_AD_SPEECH;
3719 dec_cfg.abr_cfg.imc_info.direction = IMC_TRANSMIT;
3720 dec_cfg.abr_cfg.imc_info.enable = IMC_ENABLE;
3721 dec_cfg.abr_cfg.imc_info.purpose = IMC_PURPOSE_ID_BT_INFO;
3722 dec_cfg.abr_cfg.imc_info.comm_instance = APTX_AD_SPEECH_INSTANCE_ID;
3723 dec_cfg.speech_mode.mode = a2dp.adev->swb_speech_mode;
3724 dec_cfg.speech_mode.swapping = SWAP_ENABLE;
3725
3726 ret = mixer_ctl_set_array(ctl_dec_data, &dec_cfg,
3727 sizeof(dec_cfg));
3728 if (ret != 0) {
3729 ALOGE("%s: Failed to set decoder config", __func__);
3730 return false;
3731 }
3732 return true;
3733}
3734
3735int sco_start_configuration()
3736{
3737 ALOGD("sco_start_configuration start");
3738
3739 if (!a2dp.swb_configured) {
Gautam Manamfbb3ebc2020-10-08 18:06:45 +05303740 /*Before starting sco config, we must ensure to set correct acdb id
3741 because sco cofiguration will trigger port open which needs acdb_id*/
3742 fp_platform_switch_voice_call_device_post(a2dp.adev->platform,
3743 SND_DEVICE_OUT_BT_SCO_SWB,
3744 SND_DEVICE_IN_BT_SCO_MIC_SWB);
3745
Zhou Song12c29502019-03-16 10:37:18 +08003746 a2dp.bt_encoder_format = CODEC_TYPE_APTX_AD_SPEECH;
3747 /* Configure AFE codec*/
3748 if (configure_aptx_ad_speech_enc_fmt() &&
3749 configure_aptx_ad_speech_dec_fmt()) {
3750 ALOGD("%s: SCO enc/dec configured successfully", __func__);
3751 } else {
3752 ALOGE("%s: failed to send SCO configuration", __func__);
3753 return -ETIMEDOUT;
3754 }
3755 /* Configure backend*/
3756 a2dp.enc_sampling_rate = SAMPLING_RATE_96K;
3757 a2dp.enc_channels = CH_MONO;
3758 a2dp.abr_config.is_abr_enabled = true;
3759 a2dp_set_backend_cfg(SOURCE);
3760 /* Start abr*/
3761 start_abr();
3762 a2dp.swb_configured = true;
3763 }
3764 return 0;
3765}
3766
3767void sco_reset_configuration()
3768{
Zhou Songd6d71752019-05-21 18:08:51 +08003769 if (a2dp.swb_configured) {
3770 ALOGD("sco_reset_configuration start");
Zhou Song12c29502019-03-16 10:37:18 +08003771
Zhou Songd6d71752019-05-21 18:08:51 +08003772 reset_codec_config();
3773 a2dp.bt_encoder_format = CODEC_TYPE_INVALID;
3774 a2dp.swb_configured = false;
3775 }
Zhou Song12c29502019-03-16 10:37:18 +08003776}