ESP32移植音频编码协议,支持蓝牙aptX/aptX HD/aptX LL/LDAC编码格式

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标识,烧录工具见乐鑫官方网站 ;
ESP32蓝牙设备发现

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值