1 /* 2 * Copyright 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "a2dp_vendor_ldac_encoder" 18 #define ATRACE_TAG ATRACE_TAG_AUDIO 19 20 #include "a2dp_vendor_ldac_encoder.h" 21 22 #ifndef OS_GENERIC 23 #include <cutils/trace.h> 24 #endif 25 #include <dlfcn.h> 26 #include <inttypes.h> 27 #include <stdio.h> 28 #include <string.h> 29 30 #include <ldacBT.h> 31 32 #include "a2dp_vendor.h" 33 #include "a2dp_vendor_ldac.h" 34 #include "a2dp_vendor_ldac_abr.h" 35 #include "bt_common.h" 36 #include "osi/include/log.h" 37 #include "osi/include/osi.h" 38 39 // 40 // Encoder for LDAC Source Codec 41 // 42 43 // 44 // The LDAC encoder shared library, and the functions to use 45 // 46 static const char* LDAC_ENCODER_LIB_NAME = "libldacBT_enc.so"; 47 static void* ldac_encoder_lib_handle = NULL; 48 49 static const char* LDAC_GET_HANDLE_NAME = "ldacBT_get_handle"; 50 typedef HANDLE_LDAC_BT (*tLDAC_GET_HANDLE)(void); 51 52 static const char* LDAC_FREE_HANDLE_NAME = "ldacBT_free_handle"; 53 typedef void (*tLDAC_FREE_HANDLE)(HANDLE_LDAC_BT hLdacParam); 54 55 static const char* LDAC_CLOSE_HANDLE_NAME = "ldacBT_close_handle"; 56 typedef void (*tLDAC_CLOSE_HANDLE)(HANDLE_LDAC_BT hLdacParam); 57 58 static const char* LDAC_GET_VERSION_NAME = "ldacBT_get_version"; 59 typedef int (*tLDAC_GET_VERSION)(void); 60 61 static const char* LDAC_GET_BITRATE_NAME = "ldacBT_get_bitrate"; 62 typedef int (*tLDAC_GET_BITRATE)(HANDLE_LDAC_BT hLdacParam); 63 64 static const char* LDAC_GET_SAMPLING_FREQ_NAME = "ldacBT_get_sampling_freq"; 65 typedef int (*tLDAC_GET_SAMPLING_FREQ)(HANDLE_LDAC_BT hLdacParam); 66 67 static const char* LDAC_INIT_HANDLE_ENCODE_NAME = "ldacBT_init_handle_encode"; 68 typedef int (*tLDAC_INIT_HANDLE_ENCODE)(HANDLE_LDAC_BT hLdacParam, int mtu, 69 int eqmid, int channel_mode, 70 LDACBT_SMPL_FMT_T fmt, 71 int sampling_freq); 72 73 static const char* LDAC_ENCODE_NAME = "ldacBT_encode"; 74 typedef int (*tLDAC_ENCODE)(HANDLE_LDAC_BT hLdacParam, void* p_pcm, 75 int* p_pcm_encoded_byte, unsigned char* p_stream, 76 int* pframe_length_wrote, int* pframe_num); 77 78 static const char* LDAC_SET_EQMID_NAME = "ldacBT_set_eqmid"; 79 typedef int (*tLDAC_SET_EQMID)(HANDLE_LDAC_BT hLdacParam, int eqmid); 80 81 static const char* LDAC_ALTER_EQMID_PRIORITY_NAME = 82 "ldacBT_alter_eqmid_priority"; 83 typedef int (*tLDAC_ALTER_EQMID_PRIORITY)(HANDLE_LDAC_BT hLdacParam, 84 int priority); 85 86 static const char* LDAC_GET_EQMID_NAME = "ldacBT_get_eqmid"; 87 typedef int (*tLDAC_GET_EQMID)(HANDLE_LDAC_BT hLdacParam); 88 89 static const char* LDAC_GET_ERROR_CODE_NAME = "ldacBT_get_error_code"; 90 typedef int (*tLDAC_GET_ERROR_CODE)(HANDLE_LDAC_BT hLdacParam); 91 92 static tLDAC_GET_HANDLE ldac_get_handle_func; 93 static tLDAC_FREE_HANDLE ldac_free_handle_func; 94 static tLDAC_CLOSE_HANDLE ldac_close_handle_func; 95 static tLDAC_GET_VERSION ldac_get_version_func; 96 static tLDAC_GET_BITRATE ldac_get_bitrate_func; 97 static tLDAC_GET_SAMPLING_FREQ ldac_get_sampling_freq_func; 98 static tLDAC_INIT_HANDLE_ENCODE ldac_init_handle_encode_func; 99 static tLDAC_ENCODE ldac_encode_func; 100 static tLDAC_SET_EQMID ldac_set_eqmid_func; 101 static tLDAC_ALTER_EQMID_PRIORITY ldac_alter_eqmid_priority_func; 102 static tLDAC_GET_EQMID ldac_get_eqmid_func; 103 static tLDAC_GET_ERROR_CODE ldac_get_error_code_func; 104 105 // A2DP LDAC encoder interval in milliseconds 106 #define A2DP_LDAC_ENCODER_INTERVAL_MS 20 107 #define A2DP_LDAC_MEDIA_BYTES_PER_FRAME 128 108 109 // offset 110 #if (BTA_AV_CO_CP_SCMS_T == TRUE) 111 #define A2DP_LDAC_OFFSET (AVDT_MEDIA_OFFSET + A2DP_LDAC_MPL_HDR_LEN + 1) 112 #else 113 #define A2DP_LDAC_OFFSET (AVDT_MEDIA_OFFSET + A2DP_LDAC_MPL_HDR_LEN) 114 #endif 115 116 typedef struct { 117 uint32_t sample_rate; 118 uint8_t channel_mode; 119 uint8_t bits_per_sample; 120 int quality_mode_index; 121 int pcm_wlength; 122 LDACBT_SMPL_FMT_T pcm_fmt; 123 } tA2DP_LDAC_ENCODER_PARAMS; 124 125 typedef struct { 126 uint32_t counter; 127 uint32_t bytes_per_tick; /* pcm bytes read each media task tick */ 128 uint64_t last_frame_us; 129 } tA2DP_LDAC_FEEDING_STATE; 130 131 typedef struct { 132 uint64_t session_start_us; 133 134 size_t media_read_total_expected_packets; 135 size_t media_read_total_expected_reads_count; 136 size_t media_read_total_expected_read_bytes; 137 138 size_t media_read_total_dropped_packets; 139 size_t media_read_total_actual_reads_count; 140 size_t media_read_total_actual_read_bytes; 141 } a2dp_ldac_encoder_stats_t; 142 143 typedef struct { 144 a2dp_source_read_callback_t read_callback; 145 a2dp_source_enqueue_callback_t enqueue_callback; 146 uint16_t TxAaMtuSize; 147 size_t TxQueueLength; 148 149 bool use_SCMS_T; 150 bool is_peer_edr; // True if the peer device supports EDR 151 bool peer_supports_3mbps; // True if the peer device supports 3Mbps EDR 152 uint16_t peer_mtu; // MTU of the A2DP peer 153 uint32_t timestamp; // Timestamp for the A2DP frames 154 155 HANDLE_LDAC_BT ldac_handle; 156 bool has_ldac_handle; // True if ldac_handle is valid 157 158 HANDLE_LDAC_ABR ldac_abr_handle; 159 bool has_ldac_abr_handle; 160 int last_ldac_abr_eqmid; 161 size_t ldac_abr_adjustments; 162 163 tA2DP_FEEDING_PARAMS feeding_params; 164 tA2DP_LDAC_ENCODER_PARAMS ldac_encoder_params; 165 tA2DP_LDAC_FEEDING_STATE ldac_feeding_state; 166 167 a2dp_ldac_encoder_stats_t stats; 168 } tA2DP_LDAC_ENCODER_CB; 169 170 static bool ldac_abr_loaded = false; 171 172 static tA2DP_LDAC_ENCODER_CB a2dp_ldac_encoder_cb; 173 174 static void a2dp_vendor_ldac_encoder_update(uint16_t peer_mtu, 175 A2dpCodecConfig* a2dp_codec_config, 176 bool* p_restart_input, 177 bool* p_restart_output, 178 bool* p_config_updated); 179 static void a2dp_ldac_get_num_frame_iteration(uint8_t* num_of_iterations, 180 uint8_t* num_of_frames, 181 uint64_t timestamp_us); 182 static void a2dp_ldac_encode_frames(uint8_t nb_frame); 183 static bool a2dp_ldac_read_feeding(uint8_t* read_buffer, uint32_t* bytes_read); 184 static std::string quality_mode_index_to_name(int quality_mode_index); 185 186 static void* load_func(const char* func_name) { 187 void* func_ptr = dlsym(ldac_encoder_lib_handle, func_name); 188 if (func_ptr == NULL) { 189 LOG_ERROR(LOG_TAG, 190 "%s: cannot find function '%s' in the encoder library: %s", 191 __func__, func_name, dlerror()); 192 A2DP_VendorUnloadEncoderLdac(); 193 return NULL; 194 } 195 return func_ptr; 196 } 197 198 bool A2DP_VendorLoadEncoderLdac(void) { 199 if (ldac_encoder_lib_handle != NULL) return true; // Already loaded 200 201 // Initialize the control block 202 memset(&a2dp_ldac_encoder_cb, 0, sizeof(a2dp_ldac_encoder_cb)); 203 204 // Open the encoder library 205 ldac_encoder_lib_handle = dlopen(LDAC_ENCODER_LIB_NAME, RTLD_NOW); 206 if (ldac_encoder_lib_handle == NULL) { 207 LOG_ERROR(LOG_TAG, "%s: cannot open LDAC encoder library %s: %s", __func__, 208 LDAC_ENCODER_LIB_NAME, dlerror()); 209 return false; 210 } 211 212 // Load all functions 213 ldac_get_handle_func = (tLDAC_GET_HANDLE)load_func(LDAC_GET_HANDLE_NAME); 214 if (ldac_get_handle_func == NULL) return false; 215 ldac_free_handle_func = (tLDAC_FREE_HANDLE)load_func(LDAC_FREE_HANDLE_NAME); 216 if (ldac_free_handle_func == NULL) return false; 217 ldac_close_handle_func = 218 (tLDAC_CLOSE_HANDLE)load_func(LDAC_CLOSE_HANDLE_NAME); 219 if (ldac_close_handle_func == NULL) return false; 220 ldac_get_version_func = (tLDAC_GET_VERSION)load_func(LDAC_GET_VERSION_NAME); 221 if (ldac_get_version_func == NULL) return false; 222 ldac_get_bitrate_func = (tLDAC_GET_BITRATE)load_func(LDAC_GET_BITRATE_NAME); 223 if (ldac_get_bitrate_func == NULL) return false; 224 ldac_get_sampling_freq_func = 225 (tLDAC_GET_SAMPLING_FREQ)load_func(LDAC_GET_SAMPLING_FREQ_NAME); 226 if (ldac_get_sampling_freq_func == NULL) return false; 227 ldac_init_handle_encode_func = 228 (tLDAC_INIT_HANDLE_ENCODE)load_func(LDAC_INIT_HANDLE_ENCODE_NAME); 229 if (ldac_init_handle_encode_func == NULL) return false; 230 ldac_encode_func = (tLDAC_ENCODE)load_func(LDAC_ENCODE_NAME); 231 if (ldac_encode_func == NULL) return false; 232 ldac_set_eqmid_func = (tLDAC_SET_EQMID)load_func(LDAC_SET_EQMID_NAME); 233 if (ldac_set_eqmid_func == NULL) return false; 234 ldac_alter_eqmid_priority_func = 235 (tLDAC_ALTER_EQMID_PRIORITY)load_func(LDAC_ALTER_EQMID_PRIORITY_NAME); 236 if (ldac_alter_eqmid_priority_func == NULL) return false; 237 ldac_get_eqmid_func = (tLDAC_GET_EQMID)load_func(LDAC_GET_EQMID_NAME); 238 if (ldac_get_eqmid_func == NULL) return false; 239 ldac_get_error_code_func = 240 (tLDAC_GET_ERROR_CODE)load_func(LDAC_GET_ERROR_CODE_NAME); 241 if (ldac_get_error_code_func == NULL) return false; 242 243 if (!A2DP_VendorLoadLdacAbr()) { 244 LOG_WARN(LOG_TAG, "%s: cannot load the LDAC ABR library", __func__); 245 ldac_abr_loaded = false; 246 } else { 247 ldac_abr_loaded = true; 248 } 249 return true; 250 } 251 252 void A2DP_VendorUnloadEncoderLdac(void) { 253 // Cleanup any LDAC-related state 254 if (a2dp_ldac_encoder_cb.has_ldac_handle && ldac_free_handle_func != NULL) 255 ldac_free_handle_func(a2dp_ldac_encoder_cb.ldac_handle); 256 memset(&a2dp_ldac_encoder_cb, 0, sizeof(a2dp_ldac_encoder_cb)); 257 258 ldac_get_handle_func = NULL; 259 ldac_free_handle_func = NULL; 260 ldac_close_handle_func = NULL; 261 ldac_get_version_func = NULL; 262 ldac_get_bitrate_func = NULL; 263 ldac_get_sampling_freq_func = NULL; 264 ldac_init_handle_encode_func = NULL; 265 ldac_encode_func = NULL; 266 ldac_set_eqmid_func = NULL; 267 ldac_alter_eqmid_priority_func = NULL; 268 ldac_get_eqmid_func = NULL; 269 ldac_get_error_code_func = NULL; 270 271 if (ldac_encoder_lib_handle != NULL) { 272 dlclose(ldac_encoder_lib_handle); 273 ldac_encoder_lib_handle = NULL; 274 } 275 } 276 277 void a2dp_vendor_ldac_encoder_init( 278 const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 279 A2dpCodecConfig* a2dp_codec_config, 280 a2dp_source_read_callback_t read_callback, 281 a2dp_source_enqueue_callback_t enqueue_callback) { 282 if (a2dp_ldac_encoder_cb.has_ldac_handle) 283 ldac_free_handle_func(a2dp_ldac_encoder_cb.ldac_handle); 284 if (a2dp_ldac_encoder_cb.has_ldac_abr_handle) 285 a2dp_ldac_abr_free_handle(a2dp_ldac_encoder_cb.ldac_abr_handle); 286 memset(&a2dp_ldac_encoder_cb, 0, sizeof(a2dp_ldac_encoder_cb)); 287 288 a2dp_ldac_encoder_cb.stats.session_start_us = time_get_os_boottime_us(); 289 290 a2dp_ldac_encoder_cb.read_callback = read_callback; 291 a2dp_ldac_encoder_cb.enqueue_callback = enqueue_callback; 292 a2dp_ldac_encoder_cb.is_peer_edr = p_peer_params->is_peer_edr; 293 a2dp_ldac_encoder_cb.peer_supports_3mbps = p_peer_params->peer_supports_3mbps; 294 a2dp_ldac_encoder_cb.peer_mtu = p_peer_params->peer_mtu; 295 a2dp_ldac_encoder_cb.timestamp = 0; 296 a2dp_ldac_encoder_cb.ldac_abr_handle = NULL; 297 a2dp_ldac_encoder_cb.has_ldac_abr_handle = false; 298 a2dp_ldac_encoder_cb.last_ldac_abr_eqmid = -1; 299 a2dp_ldac_encoder_cb.ldac_abr_adjustments = 0; 300 301 a2dp_ldac_encoder_cb.use_SCMS_T = false; // TODO: should be a parameter 302 #if (BTA_AV_CO_CP_SCMS_T == TRUE) 303 a2dp_ldac_encoder_cb.use_SCMS_T = true; 304 #endif 305 306 // NOTE: Ignore the restart_input / restart_output flags - this initization 307 // happens when the connection is (re)started. 308 bool restart_input = false; 309 bool restart_output = false; 310 bool config_updated = false; 311 a2dp_vendor_ldac_encoder_update(a2dp_ldac_encoder_cb.peer_mtu, 312 a2dp_codec_config, &restart_input, 313 &restart_output, &config_updated); 314 } 315 316 bool A2dpCodecConfigLdac::updateEncoderUserConfig( 317 const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, bool* p_restart_input, 318 bool* p_restart_output, bool* p_config_updated) { 319 a2dp_ldac_encoder_cb.is_peer_edr = p_peer_params->is_peer_edr; 320 a2dp_ldac_encoder_cb.peer_supports_3mbps = p_peer_params->peer_supports_3mbps; 321 a2dp_ldac_encoder_cb.peer_mtu = p_peer_params->peer_mtu; 322 a2dp_ldac_encoder_cb.timestamp = 0; 323 324 if (a2dp_ldac_encoder_cb.peer_mtu == 0) { 325 LOG_ERROR(LOG_TAG, 326 "%s: Cannot update the codec encoder for %s: " 327 "invalid peer MTU", 328 __func__, name().c_str()); 329 return false; 330 } 331 332 a2dp_vendor_ldac_encoder_update(a2dp_ldac_encoder_cb.peer_mtu, this, 333 p_restart_input, p_restart_output, 334 p_config_updated); 335 return true; 336 } 337 338 // Update the A2DP LDAC encoder. 339 // |peer_mtu| is the peer MTU. 340 // |a2dp_codec_config| is the A2DP codec to use for the update. 341 static void a2dp_vendor_ldac_encoder_update(uint16_t peer_mtu, 342 A2dpCodecConfig* a2dp_codec_config, 343 bool* p_restart_input, 344 bool* p_restart_output, 345 bool* p_config_updated) { 346 tA2DP_LDAC_ENCODER_PARAMS* p_encoder_params = 347 &a2dp_ldac_encoder_cb.ldac_encoder_params; 348 uint8_t codec_info[AVDT_CODEC_SIZE]; 349 350 *p_restart_input = false; 351 *p_restart_output = false; 352 *p_config_updated = false; 353 354 if (!a2dp_ldac_encoder_cb.has_ldac_handle) { 355 a2dp_ldac_encoder_cb.ldac_handle = ldac_get_handle_func(); 356 if (a2dp_ldac_encoder_cb.ldac_handle == NULL) { 357 LOG_ERROR(LOG_TAG, "%s: Cannot get LDAC encoder handle", __func__); 358 return; // TODO: Return an error? 359 } 360 a2dp_ldac_encoder_cb.has_ldac_handle = true; 361 } 362 CHECK(a2dp_ldac_encoder_cb.ldac_handle != nullptr); 363 364 if (!a2dp_codec_config->copyOutOtaCodecConfig(codec_info)) { 365 LOG_ERROR(LOG_TAG, 366 "%s: Cannot update the codec encoder for %s: " 367 "invalid codec config", 368 __func__, a2dp_codec_config->name().c_str()); 369 return; 370 } 371 const uint8_t* p_codec_info = codec_info; 372 btav_a2dp_codec_config_t codec_config = a2dp_codec_config->getCodecConfig(); 373 374 // The feeding parameters 375 tA2DP_FEEDING_PARAMS* p_feeding_params = &a2dp_ldac_encoder_cb.feeding_params; 376 p_feeding_params->sample_rate = 377 A2DP_VendorGetTrackSampleRateLdac(p_codec_info); 378 p_feeding_params->bits_per_sample = 379 a2dp_codec_config->getAudioBitsPerSample(); 380 p_feeding_params->channel_count = 381 A2DP_VendorGetTrackChannelCountLdac(p_codec_info); 382 LOG_DEBUG(LOG_TAG, "%s: sample_rate=%u bits_per_sample=%u channel_count=%u", 383 __func__, p_feeding_params->sample_rate, 384 p_feeding_params->bits_per_sample, p_feeding_params->channel_count); 385 a2dp_vendor_ldac_feeding_reset(); 386 387 // The codec parameters 388 p_encoder_params->sample_rate = 389 a2dp_ldac_encoder_cb.feeding_params.sample_rate; 390 p_encoder_params->channel_mode = 391 A2DP_VendorGetChannelModeCodeLdac(p_codec_info); 392 393 uint16_t mtu_size = 394 BT_DEFAULT_BUFFER_SIZE - A2DP_LDAC_OFFSET - sizeof(BT_HDR); 395 if (mtu_size < peer_mtu) { 396 a2dp_ldac_encoder_cb.TxAaMtuSize = mtu_size; 397 } else { 398 a2dp_ldac_encoder_cb.TxAaMtuSize = peer_mtu; 399 } 400 401 // Set the quality mode index 402 int old_quality_mode_index = p_encoder_params->quality_mode_index; 403 if (codec_config.codec_specific_1 != 0) { 404 p_encoder_params->quality_mode_index = codec_config.codec_specific_1 % 10; 405 LOG_DEBUG(LOG_TAG, "%s: setting quality mode to %s", __func__, 406 quality_mode_index_to_name(p_encoder_params->quality_mode_index) 407 .c_str()); 408 } else { 409 p_encoder_params->quality_mode_index = A2DP_LDAC_QUALITY_ABR; 410 LOG_DEBUG(LOG_TAG, "%s: setting quality mode to default %s", __func__, 411 quality_mode_index_to_name(p_encoder_params->quality_mode_index) 412 .c_str()); 413 } 414 415 int ldac_eqmid = LDAC_ABR_MODE_EQMID; 416 if (p_encoder_params->quality_mode_index == A2DP_LDAC_QUALITY_ABR) { 417 if (!ldac_abr_loaded) { 418 p_encoder_params->quality_mode_index = A2DP_LDAC_QUALITY_MID; 419 LOG_WARN( 420 LOG_TAG, 421 "%s: LDAC ABR library is not loaded, resetting quality mode to %s", 422 __func__, 423 quality_mode_index_to_name(p_encoder_params->quality_mode_index) 424 .c_str()); 425 } else { 426 LOG_DEBUG(LOG_TAG, "%s: changing mode from %s to %s", __func__, 427 quality_mode_index_to_name(old_quality_mode_index).c_str(), 428 quality_mode_index_to_name(p_encoder_params->quality_mode_index) 429 .c_str()); 430 if (a2dp_ldac_encoder_cb.ldac_abr_handle != NULL) { 431 LOG_DEBUG(LOG_TAG, "%s: already in LDAC ABR mode, do nothing.", 432 __func__); 433 } else { 434 LOG_DEBUG(LOG_TAG, "%s: get and init LDAC ABR handle.", __func__); 435 a2dp_ldac_encoder_cb.ldac_abr_handle = a2dp_ldac_abr_get_handle(); 436 if (a2dp_ldac_encoder_cb.ldac_abr_handle != NULL) { 437 a2dp_ldac_encoder_cb.has_ldac_abr_handle = true; 438 a2dp_ldac_encoder_cb.last_ldac_abr_eqmid = -1; 439 a2dp_ldac_encoder_cb.ldac_abr_adjustments = 0; 440 a2dp_ldac_abr_init(a2dp_ldac_encoder_cb.ldac_abr_handle, 441 A2DP_LDAC_ENCODER_INTERVAL_MS); 442 } else { 443 p_encoder_params->quality_mode_index = A2DP_LDAC_QUALITY_MID; 444 LOG_DEBUG( 445 LOG_TAG, 446 "%s: get LDAC ABR handle failed, resetting quality mode to %s.", 447 __func__, 448 quality_mode_index_to_name(p_encoder_params->quality_mode_index) 449 .c_str()); 450 } 451 } 452 } 453 } else { 454 ldac_eqmid = p_encoder_params->quality_mode_index; 455 LOG_DEBUG(LOG_TAG, "%s: in %s mode, free LDAC ABR handle.", __func__, 456 quality_mode_index_to_name(ldac_eqmid).c_str()); 457 if (a2dp_ldac_encoder_cb.has_ldac_abr_handle) { 458 a2dp_ldac_abr_free_handle(a2dp_ldac_encoder_cb.ldac_abr_handle); 459 a2dp_ldac_encoder_cb.ldac_abr_handle = NULL; 460 a2dp_ldac_encoder_cb.has_ldac_abr_handle = false; 461 a2dp_ldac_encoder_cb.last_ldac_abr_eqmid = -1; 462 a2dp_ldac_encoder_cb.ldac_abr_adjustments = 0; 463 } 464 } 465 466 if (p_encoder_params->quality_mode_index != old_quality_mode_index) 467 *p_config_updated = true; 468 469 p_encoder_params->pcm_wlength = 470 a2dp_ldac_encoder_cb.feeding_params.bits_per_sample >> 3; 471 // Set the Audio format from pcm_wlength 472 p_encoder_params->pcm_fmt = LDACBT_SMPL_FMT_S16; 473 if (p_encoder_params->pcm_wlength == 2) 474 p_encoder_params->pcm_fmt = LDACBT_SMPL_FMT_S16; 475 else if (p_encoder_params->pcm_wlength == 3) 476 p_encoder_params->pcm_fmt = LDACBT_SMPL_FMT_S24; 477 else if (p_encoder_params->pcm_wlength == 4) 478 p_encoder_params->pcm_fmt = LDACBT_SMPL_FMT_S32; 479 480 LOG_DEBUG(LOG_TAG, "%s: MTU=%d, peer_mtu=%d", __func__, 481 a2dp_ldac_encoder_cb.TxAaMtuSize, peer_mtu); 482 LOG_DEBUG(LOG_TAG, 483 "%s: sample_rate: %d channel_mode: %d " 484 "quality_mode_index: %d pcm_wlength: %d pcm_fmt: %d", 485 __func__, p_encoder_params->sample_rate, 486 p_encoder_params->channel_mode, 487 p_encoder_params->quality_mode_index, p_encoder_params->pcm_wlength, 488 p_encoder_params->pcm_fmt); 489 490 // Initialize the encoder. 491 // NOTE: MTU in the initialization must include the AVDT media header size. 492 int result = ldac_init_handle_encode_func( 493 a2dp_ldac_encoder_cb.ldac_handle, 494 a2dp_ldac_encoder_cb.TxAaMtuSize + AVDT_MEDIA_HDR_SIZE, ldac_eqmid, 495 p_encoder_params->channel_mode, p_encoder_params->pcm_fmt, 496 p_encoder_params->sample_rate); 497 if (result != 0) { 498 int err_code = ldac_get_error_code_func(a2dp_ldac_encoder_cb.ldac_handle); 499 LOG_ERROR(LOG_TAG, 500 "%s: error initializing the LDAC encoder: %d api_error = %d " 501 "handle_error = %d block_error = %d error_code = 0x%x", 502 __func__, result, LDACBT_API_ERR(err_code), 503 LDACBT_HANDLE_ERR(err_code), LDACBT_BLOCK_ERR(err_code), 504 err_code); 505 } 506 } 507 508 void a2dp_vendor_ldac_encoder_cleanup(void) { 509 if (a2dp_ldac_encoder_cb.has_ldac_abr_handle) 510 a2dp_ldac_abr_free_handle(a2dp_ldac_encoder_cb.ldac_abr_handle); 511 if (a2dp_ldac_encoder_cb.has_ldac_handle) 512 ldac_free_handle_func(a2dp_ldac_encoder_cb.ldac_handle); 513 memset(&a2dp_ldac_encoder_cb, 0, sizeof(a2dp_ldac_encoder_cb)); 514 } 515 516 void a2dp_vendor_ldac_feeding_reset(void) { 517 /* By default, just clear the entire state */ 518 memset(&a2dp_ldac_encoder_cb.ldac_feeding_state, 0, 519 sizeof(a2dp_ldac_encoder_cb.ldac_feeding_state)); 520 521 a2dp_ldac_encoder_cb.ldac_feeding_state.bytes_per_tick = 522 (a2dp_ldac_encoder_cb.feeding_params.sample_rate * 523 a2dp_ldac_encoder_cb.feeding_params.bits_per_sample / 8 * 524 a2dp_ldac_encoder_cb.feeding_params.channel_count * 525 A2DP_LDAC_ENCODER_INTERVAL_MS) / 526 1000; 527 528 LOG_DEBUG(LOG_TAG, "%s: PCM bytes per tick %u", __func__, 529 a2dp_ldac_encoder_cb.ldac_feeding_state.bytes_per_tick); 530 } 531 532 void a2dp_vendor_ldac_feeding_flush(void) { 533 a2dp_ldac_encoder_cb.ldac_feeding_state.counter = 0; 534 } 535 536 period_ms_t a2dp_vendor_ldac_get_encoder_interval_ms(void) { 537 return A2DP_LDAC_ENCODER_INTERVAL_MS; 538 } 539 540 void a2dp_vendor_ldac_send_frames(uint64_t timestamp_us) { 541 uint8_t nb_frame = 0; 542 uint8_t nb_iterations = 0; 543 544 a2dp_ldac_get_num_frame_iteration(&nb_iterations, &nb_frame, timestamp_us); 545 LOG_VERBOSE(LOG_TAG, "%s: Sending %d frames per iteration, %d iterations", 546 __func__, nb_frame, nb_iterations); 547 if (nb_frame == 0) return; 548 549 for (uint8_t counter = 0; counter < nb_iterations; counter++) { 550 if (a2dp_ldac_encoder_cb.has_ldac_abr_handle) { 551 int flag_enable = 1; 552 int prev_eqmid = a2dp_ldac_encoder_cb.last_ldac_abr_eqmid; 553 a2dp_ldac_encoder_cb.last_ldac_abr_eqmid = 554 a2dp_ldac_abr_proc(a2dp_ldac_encoder_cb.ldac_handle, 555 a2dp_ldac_encoder_cb.ldac_abr_handle, 556 a2dp_ldac_encoder_cb.TxQueueLength, flag_enable); 557 if (prev_eqmid != a2dp_ldac_encoder_cb.last_ldac_abr_eqmid) 558 a2dp_ldac_encoder_cb.ldac_abr_adjustments++; 559 #ifndef OS_GENERIC 560 ATRACE_INT("LDAC ABR level", a2dp_ldac_encoder_cb.last_ldac_abr_eqmid); 561 #endif 562 } 563 // Transcode frame and enqueue 564 a2dp_ldac_encode_frames(nb_frame); 565 } 566 } 567 568 // Obtains the number of frames to send and number of iterations 569 // to be used. |num_of_iterations| and |num_of_frames| parameters 570 // are used as output param for returning the respective values. 571 static void a2dp_ldac_get_num_frame_iteration(uint8_t* num_of_iterations, 572 uint8_t* num_of_frames, 573 uint64_t timestamp_us) { 574 uint32_t result = 0; 575 uint8_t nof = 0; 576 uint8_t noi = 1; 577 578 uint32_t pcm_bytes_per_frame = 579 A2DP_LDAC_MEDIA_BYTES_PER_FRAME * 580 a2dp_ldac_encoder_cb.feeding_params.channel_count * 581 a2dp_ldac_encoder_cb.feeding_params.bits_per_sample / 8; 582 LOG_VERBOSE(LOG_TAG, "%s: pcm_bytes_per_frame %u", __func__, 583 pcm_bytes_per_frame); 584 585 uint32_t us_this_tick = A2DP_LDAC_ENCODER_INTERVAL_MS * 1000; 586 uint64_t now_us = timestamp_us; 587 if (a2dp_ldac_encoder_cb.ldac_feeding_state.last_frame_us != 0) 588 us_this_tick = 589 (now_us - a2dp_ldac_encoder_cb.ldac_feeding_state.last_frame_us); 590 a2dp_ldac_encoder_cb.ldac_feeding_state.last_frame_us = now_us; 591 592 a2dp_ldac_encoder_cb.ldac_feeding_state.counter += 593 a2dp_ldac_encoder_cb.ldac_feeding_state.bytes_per_tick * us_this_tick / 594 (A2DP_LDAC_ENCODER_INTERVAL_MS * 1000); 595 596 result = 597 a2dp_ldac_encoder_cb.ldac_feeding_state.counter / pcm_bytes_per_frame; 598 a2dp_ldac_encoder_cb.ldac_feeding_state.counter -= 599 result * pcm_bytes_per_frame; 600 nof = result; 601 602 LOG_VERBOSE(LOG_TAG, "%s: effective num of frames %u, iterations %u", 603 __func__, nof, noi); 604 605 *num_of_frames = nof; 606 *num_of_iterations = noi; 607 } 608 609 static void a2dp_ldac_encode_frames(uint8_t nb_frame) { 610 tA2DP_LDAC_ENCODER_PARAMS* p_encoder_params = 611 &a2dp_ldac_encoder_cb.ldac_encoder_params; 612 uint8_t remain_nb_frame = nb_frame; 613 uint16_t ldac_frame_size; 614 uint8_t read_buffer[LDACBT_MAX_LSU * 4 /* byte/sample */ * 2 /* ch */]; 615 616 switch (p_encoder_params->sample_rate) { 617 case 176400: 618 case 192000: 619 ldac_frame_size = 512; // sample/ch 620 break; 621 case 88200: 622 case 96000: 623 ldac_frame_size = 256; // sample/ch 624 break; 625 case 44100: 626 case 48000: 627 default: 628 ldac_frame_size = 128; // sample/ch 629 break; 630 } 631 632 uint32_t count; 633 int32_t encode_count = 0; 634 int32_t out_frames = 0; 635 int written = 0; 636 637 uint32_t bytes_read = 0; 638 while (nb_frame) { 639 BT_HDR* p_buf = (BT_HDR*)osi_malloc(BT_DEFAULT_BUFFER_SIZE); 640 p_buf->offset = A2DP_LDAC_OFFSET; 641 p_buf->len = 0; 642 p_buf->layer_specific = 0; 643 a2dp_ldac_encoder_cb.stats.media_read_total_expected_packets++; 644 645 count = 0; 646 do { 647 // 648 // Read the PCM data and encode it 649 // 650 uint32_t temp_bytes_read = 0; 651 if (a2dp_ldac_read_feeding(read_buffer, &temp_bytes_read)) { 652 bytes_read += temp_bytes_read; 653 uint8_t* packet = (uint8_t*)(p_buf + 1) + p_buf->offset + p_buf->len; 654 if (a2dp_ldac_encoder_cb.ldac_handle == NULL) { 655 LOG_ERROR(LOG_TAG, "%s: invalid LDAC handle", __func__); 656 a2dp_ldac_encoder_cb.stats.media_read_total_dropped_packets++; 657 osi_free(p_buf); 658 return; 659 } 660 int result = ldac_encode_func( 661 a2dp_ldac_encoder_cb.ldac_handle, read_buffer, (int*)&encode_count, 662 packet + count, (int*)&written, (int*)&out_frames); 663 if (result != 0) { 664 int err_code = 665 ldac_get_error_code_func(a2dp_ldac_encoder_cb.ldac_handle); 666 LOG_ERROR(LOG_TAG, 667 "%s: LDAC encoding error: %d api_error = %d " 668 "handle_error = %d block_error = %d error_code = 0x%x", 669 __func__, result, LDACBT_API_ERR(err_code), 670 LDACBT_HANDLE_ERR(err_code), LDACBT_BLOCK_ERR(err_code), 671 err_code); 672 a2dp_ldac_encoder_cb.stats.media_read_total_dropped_packets++; 673 osi_free(p_buf); 674 return; 675 } 676 count += written; 677 p_buf->len += written; 678 nb_frame--; 679 p_buf->layer_specific += out_frames; // added a frame to the buffer 680 } else { 681 LOG_WARN(LOG_TAG, "%s: underflow %d", __func__, nb_frame); 682 a2dp_ldac_encoder_cb.ldac_feeding_state.counter += 683 nb_frame * LDACBT_ENC_LSU * 684 a2dp_ldac_encoder_cb.feeding_params.channel_count * 685 a2dp_ldac_encoder_cb.feeding_params.bits_per_sample / 8; 686 687 // no more pcm to read 688 nb_frame = 0; 689 } 690 } while ((written == 0) && nb_frame); 691 692 if (p_buf->len) { 693 /* 694 * Timestamp of the media packet header represent the TS of the 695 * first frame, i.e the timestamp before including this frame. 696 */ 697 *((uint32_t*)(p_buf + 1)) = a2dp_ldac_encoder_cb.timestamp; 698 699 a2dp_ldac_encoder_cb.timestamp += p_buf->layer_specific * ldac_frame_size; 700 701 uint8_t done_nb_frame = remain_nb_frame - nb_frame; 702 remain_nb_frame = nb_frame; 703 if (!a2dp_ldac_encoder_cb.enqueue_callback(p_buf, done_nb_frame, 704 bytes_read)) 705 return; 706 } else { 707 // NOTE: Unlike the execution path for other codecs, it is normal for 708 // LDAC to NOT write encoded data to the last buffer if there wasn't 709 // enough data to write to. That data is accumulated internally by 710 // the codec and included in the next iteration. Therefore, here we 711 // don't increment the "media_read_total_dropped_packets" counter. 712 osi_free(p_buf); 713 } 714 } 715 } 716 717 static bool a2dp_ldac_read_feeding(uint8_t* read_buffer, uint32_t* bytes_read) { 718 uint32_t read_size = LDACBT_ENC_LSU * 719 a2dp_ldac_encoder_cb.feeding_params.channel_count * 720 a2dp_ldac_encoder_cb.feeding_params.bits_per_sample / 8; 721 722 a2dp_ldac_encoder_cb.stats.media_read_total_expected_reads_count++; 723 a2dp_ldac_encoder_cb.stats.media_read_total_expected_read_bytes += read_size; 724 725 /* Read Data from UIPC channel */ 726 uint32_t nb_byte_read = 727 a2dp_ldac_encoder_cb.read_callback(read_buffer, read_size); 728 a2dp_ldac_encoder_cb.stats.media_read_total_actual_read_bytes += nb_byte_read; 729 730 if (nb_byte_read < read_size) { 731 if (nb_byte_read == 0) return false; 732 733 /* Fill the unfilled part of the read buffer with silence (0) */ 734 memset(((uint8_t*)read_buffer) + nb_byte_read, 0, read_size - nb_byte_read); 735 nb_byte_read = read_size; 736 } 737 a2dp_ldac_encoder_cb.stats.media_read_total_actual_reads_count++; 738 739 *bytes_read = nb_byte_read; 740 return true; 741 } 742 743 static std::string quality_mode_index_to_name(int quality_mode_index) { 744 switch (quality_mode_index) { 745 case A2DP_LDAC_QUALITY_HIGH: 746 return "HIGH"; 747 case A2DP_LDAC_QUALITY_MID: 748 return "MID"; 749 case A2DP_LDAC_QUALITY_LOW: 750 return "LOW"; 751 case A2DP_LDAC_QUALITY_ABR: 752 return "ABR"; 753 default: 754 return "Unknown"; 755 } 756 } 757 758 void a2dp_vendor_ldac_set_transmit_queue_length(size_t transmit_queue_length) { 759 a2dp_ldac_encoder_cb.TxQueueLength = transmit_queue_length; 760 } 761 762 period_ms_t A2dpCodecConfigLdac::encoderIntervalMs() const { 763 return a2dp_vendor_ldac_get_encoder_interval_ms(); 764 } 765 766 int A2dpCodecConfigLdac::getEffectiveMtu() const { 767 return a2dp_ldac_encoder_cb.TxAaMtuSize; 768 } 769 770 void A2dpCodecConfigLdac::debug_codec_dump(int fd) { 771 a2dp_ldac_encoder_stats_t* stats = &a2dp_ldac_encoder_cb.stats; 772 tA2DP_LDAC_ENCODER_PARAMS* p_encoder_params = 773 &a2dp_ldac_encoder_cb.ldac_encoder_params; 774 775 A2dpCodecConfig::debug_codec_dump(fd); 776 777 dprintf(fd, 778 " Packet counts (expected/dropped) : %zu / " 779 "%zu\n", 780 stats->media_read_total_expected_packets, 781 stats->media_read_total_dropped_packets); 782 783 dprintf(fd, 784 " PCM read counts (expected/actual) : %zu / " 785 "%zu\n", 786 stats->media_read_total_expected_reads_count, 787 stats->media_read_total_actual_reads_count); 788 789 dprintf(fd, 790 " PCM read bytes (expected/actual) : %zu / " 791 "%zu\n", 792 stats->media_read_total_expected_read_bytes, 793 stats->media_read_total_actual_read_bytes); 794 795 dprintf( 796 fd, " LDAC quality mode : %s\n", 797 quality_mode_index_to_name(p_encoder_params->quality_mode_index).c_str()); 798 799 dprintf(fd, 800 " LDAC transmission bitrate (Kbps) : %d\n", 801 ldac_get_bitrate_func(a2dp_ldac_encoder_cb.ldac_handle)); 802 803 dprintf(fd, 804 " LDAC saved transmit queue length : %zu\n", 805 a2dp_ldac_encoder_cb.TxQueueLength); 806 if (a2dp_ldac_encoder_cb.has_ldac_abr_handle) { 807 dprintf(fd, 808 " LDAC adaptive bit rate encode quality mode index : %d\n", 809 a2dp_ldac_encoder_cb.last_ldac_abr_eqmid); 810 dprintf(fd, 811 " LDAC adaptive bit rate adjustments : %zu\n", 812 a2dp_ldac_encoder_cb.ldac_abr_adjustments); 813 } 814 } 815