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_CHOICE
prompt "The cpu core which BTC task run"
depends on BT_BLUEDROID_ENABLED && !FREERTOS_UNICORE
help
Which the cpu core to run BTC tasks. Can choose core0 and core1.
Can not specify no-affinity.
config BT_BTC_TASK_PINNED_TO_CORE_0
bool "Core 0 (PRO CPU)"
config BT_BTC_TASK_PINNED_TO_CORE_1
bool "Core 1 (APP CPU)"
depends on !FREERTOS_UNICORE
endchoice
config BT_BTC_TASK_PINNED_TO_CORE
int
depends on BT_BLUEDROID_ENABLED
default 0 if BT_BTC_TASK_PINNED_TO_CORE_0
default 1 if BT_BTC_TASK_PINNED_TO_CORE_1
default 0
/
config BT_A2DP_APTX_DECODER
bool "aptX decoder"
depends on BT_A2DP_ENABLE
default n
help
A2DP aptX decoder
config BT_A2DP_LDAC_DECODER
bool "LDAC decoder"
depends on BT_A2DP_ENABLE
default n
help
A2DP 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标识,烧录工具见乐鑫官方网站 ;