ESP32移植音频编码协议,支持蓝牙aptX/aptX HD/aptX LL/LDAC编码格式,涉及到需要改动的地方主要是蓝牙协议栈和协议栈A2DP部分
一、目前ESP32 IDF 蓝牙AUDIO只支持经典蓝牙,且编码格式为SBC,不支持APTX和LDAC等高清HiFi编码音频传输。
二、为了克服ESP32蓝牙音频传输格式限制,增加APTX和LDAC音频编码传输,做了IDF 蓝牙协议栈A2DP编码协议移植,在网上找了很多资料,借鉴外国友人的魔改IDF和工程(项目链接: https://github.com/cfint/esp32-a2dp-sink,需要使用魔改版ESP-IDF: https://github.com/cfint/esp-idf/tree/v4.4-a2dp-sink-codecs, 注意使用v4.4-a2dp-sink-codecs分支),在移植过程中需要注意一下几点:
1、原作者是在IDF v4.4版本的基础上做的移植和修改,为此特意使用beyond compare工具对比了魔改IDF v4.4和乐鑫官方IDF v4.4之间的差别,主要修改点集中在components/bt文件夹内,bt文件夹内的CMakelists.txt文件有新增编译项:

 "host/bluedroid/stack/a2dp/a2d_sbc_decoder.c" "host/bluedroid/stack/a2dp/a2dp_codec_config.c" "host/bluedroid/stack/a2dp/a2dp_vendor.c"if(CONFIG_BT_A2DP_APTX_DECODER)list(APPEND srcs "host/bluedroid/stack/a2dp/a2dp_vendor_aptx.c" "host/bluedroid/stack/a2dp/a2dp_vendor_aptx_hd.c" "host/bluedroid/stack/a2dp/a2dp_vendor_aptx_ll.c" "host/bluedroid/stack/a2dp/a2dp_vendor_aptx_decoder.c")endif()/if(CONFIG_BT_A2DP_LDAC_DECODER)list(APPEND priv_include_dirs host/bluedroid/external/libldacdec)list(APPEND ldac_dec_srcs "host/bluedroid/external/libldacdec/bit_allocation.c" "host/bluedroid/external/libldacdec/bit_reader.c" "host/bluedroid/external/libldacdec/huffCodes.c" "host/bluedroid/external/libldacdec/imdct.c" "host/bluedroid/external/libldacdec/libldacdec.c" "host/bluedroid/external/libldacdec/spectrum.c" "host/bluedroid/external/libldacdec/utility.c")list(APPEND srcs ${ldac_dec_srcs})list(APPEND srcs "host/bluedroid/stack/a2dp/a2dp_vendor_ldac.c" "host/bluedroid/stack/a2dp/a2dp_vendor_ldac_decoder.c")endif()

///

if(CONFIG_BT_A2DP_APTX_DECODER)add_prebuilt_library(libfreeaptx "${CMAKE_CURRENT_SOURCE_DIR}/host/bluedroid/external/libfreeaptx/libfreeaptx.a")target_link_libraries(${COMPONENT_LIB} PUBLIC libfreeaptx)endif()bt/bluedroid内的Kconfig.in配置文件内有新增内容:choice BT_BTC_TASK_PINNED_TO_CORE_CHOICEprompt "The cpu core which BTC task run"depends on BT_BLUEDROID_ENABLED && !FREERTOS_UNICOREhelpWhich the cpu core to run BTC tasks. Can choose core0 and core1.Can not specify no-affinity.config BT_BTC_TASK_PINNED_TO_CORE_0bool "Core 0 (PRO CPU)"config BT_BTC_TASK_PINNED_TO_CORE_1bool "Core 1 (APP CPU)"depends on !FREERTOS_UNICOREendchoiceconfig BT_BTC_TASK_PINNED_TO_COREintdepends on BT_BLUEDROID_ENABLEDdefault 0 if BT_BTC_TASK_PINNED_TO_CORE_0default 1 if BT_BTC_TASK_PINNED_TO_CORE_1default 0

/

config BT_A2DP_APTX_DECODERbool "aptX decoder"depends on BT_A2DP_ENABLEdefault nhelpA2DP aptX decoderconfig BT_A2DP_LDAC_DECODERbool "LDAC decoder"depends on BT_A2DP_ENABLEdefault nhelpA2DP LDAC decoder

2、bt/host/bluedroid/external 文件夹内新增libfreeaptx、libldacdec文件夹,bt/host/stack/a2dp文件夹内有新增和修改,bt/host/bluedroid/stack/include/stack文件夹内有新增和修改,bt/host/stack/avdt/avdt_scb_act.c文件内有新增和修改,bt/host/bluedroid/common/include/common/bluedroid_user_config.h、bt/host/bluedroid/common/include/common/bt_target.h、…

主要需要修改和新增文件已经单独拎出来了,需要注意的是components\bt\common\btc\core\btc_task.c只需要修改#define BTC_TASK_PINNED_TO_CORE (BT_BTC_TASK_PINNED_TO_CORE)//(TASK_PINNED_TO_CORE),其他不需要改,防止改到蓝牙协议栈其他内容,编译遇到btc_transfer_context报错,是由于最新IDF版本中btc_task.c文件的btc_transfer_context新增了一个参数,只需要在应用层调用到btc_transfer_context的位置,将最后一个参数设置为NULL即可
bt\host\bluedroid\api\include\api\esp_a2dp_api.h、
三、移植方法:bt文件夹内的CMakelists.txt、bt/bluedroid内的Kconfig.in配置文件、bt/host/bluedroid/common/include/common/bluedroid_user_config.h、bt/host/bluedroid/common/include/common/bt_target.h等所有.h文件最好与最新IDF版本源文件做对比,把魔改IDF新增内容从魔改IDF导入到最新官方IDF版本,对比替换的好处是防止全部替换改动到最新IDF更新的内容,其他文件可以通过复制粘贴直接覆盖。
需要移植的IDF文件和项目工程文件已经上传到:移植文件连接ESP32 LDAC
或者直接烧录移植成功编译好的ESP32 bin文件,I2S配置为: I2S LRCK (WS) GPIO (25脚)、 I2S BCK GPIO(26脚)、 I2S DATA GPIO (22脚),资源链接:ESP32 LDAC固件链接,烧录成功后可发现蓝牙名称为:ESP32-AUDIO蓝牙设备,带LDAC标识,烧录工具见乐鑫官方网站 ;