本文内容参考:
从ESP32看ES8388低功耗音频芯片_es8388 芯片手册-优快云博客
ESP-ADF入门——从play_mp3_control入门adf-优快云博客
[005] [ESP32开发笔记] ADF基本框架_esp32 adf-优快云博客
ESP32学习笔记(38)——播放MP3文件(外部Codec方式)_esp32 音乐转码-优快云博客
esp-adf框架笔记 1 概述_esp adf-优快云博客
特此致谢!
一、ESP-ADF介绍
要想使用ESP32-S3驱动ES8388、并在此基础上做应用,就绕不过去ESP-ASF。对此,其实笔者是持否定和鄙夷态度的,不知乐鑫是出于何种考虑,在ESP-IDF之外又单做了一个ESP-ADF。按照camera sensor那样直接放到IDF中不好吗,干嘛非得像Linux内核似的,把sound单独拎到driver目录之外。为此也咨询过乐鑫技术支持,他们答复说:“有一些音频组件已经有了,有些可能耦合比较多,就还没有”。
其实技术上是完全可以做到的。不过不管怎样,至少目前为止,(要玩ES8388)还是得用这个ADF框架和组件,那么就来了解一下ADF具体能干什么、又是怎么用的。
1. ESP-ADF是什么
ESP-ADF是乐鑫基于自家的ESP-IDF(乐鑫物联网开发框架,广泛运用于ESP32的SDK)开发的音频开发框架。IDF的英文全称是IoT Development Framework,而ADF的英文全称为Audio Development Framework。
ESP-ADF在ESP-IDF的基础上开发而成,具有高度的灵活性,既可作为一整套应用方案,面向配网、OTA(Over The Air)等各类应用场景,亦可作为开发平台,供开发人员搭建各类定制化应用场景。
ESP-ADF具有一系列丰富的功能特色,涵盖编解码器、发送端和接收端音频流、管线化支持、唤醒词引擎、以及其它各类服务和控制等。
ESP-ADF的整体框架如下:
乐鑫音频开发框架特性:
- 支持音频编解码格式:MP3、AAC、WAV、OGG、AMR、TS、OPUS等
- 支持EQ、Mixer、Resample等音效处理功能
- 多音频流来源:HTTP、HLS(HTTP Live)、SD卡、Bluetooth A2DP/HFP
- 支持多媒体交互:DLNA、Airplay、微信和Internet radio等
- 云端语音接入:Alexa、DuerOS、Turing、IFLYTEK、TmallGenie、RooBo等
- 应用场景:智能音箱、语音对讲机、语音播报机,以及其它音频类解决方案,如语音故事机和点读机。
2. ESP-ADF机制
由ESP-ADF框架图可以看出,ESP-ADF底层是基于ESP-IDF框架的。在此之上就是element(元素)、stream(数据流)、pipeline(管道)。再之上就是软件层具体的协议实现了,包括baidu DueroOS、Amazon Alexa等。
ESP-ADF是使用面向对象思想实现的,整个框架分层处理,保证每层都有相对的独立性。每个具体功能都定义成一个模块,最后为上层应用提供统一的接口。
在ESP-ADF中最底层应该是硬件的驱动和功能的实现,包括:音频编解码器芯片驱动(ESP8388、ES8374、ZL38063等)。然后就是诸如SD卡、LED、Wi-Fi等软件的基于ESP-IDF的重新封装。 在此之上则是软件个功能的实现(软件编解码MP3、WAV、AMR等,DLNA的协议,Recorder、Player)等。
ESP-ADF主要基于pipeline运行。pipeline是ADF实现音频处理的基础。可以将pipeline看作是流水线。音频数据从一头进、从另一头出。
每个pipeline中最基本的运行单元就是element。element就好比流水线上的工人,负责加工音频数据。每个element都由一个ringbuffer连接,每个element之间靠stream传送音频数据。
event监听流水线上所有工人的情况,用户可以通过msg得知。每个element都是一个任务。
pipeline通过链表管理,即每个元素通过链表连接在一起,element和stream基于FreeRTOS的任务实现,即运行pipeline的同时会启动几个任务,基于队列、信号量、互斥体等机制实现数据的传输和消息的传递。
举例:
将MP3解码器和I2S流两个元素(element)添加进管道(pipeline)。解码器的输入是MP3文件数据流,I2S流将解码后的音频输出到音频解码器芯片。如下图所示:
ESP-ADF支持的elements和stream如下:
3. ES-IDF中如何添加ESP-ADF
这部分内容不是本系列的重点,在此不作详述,只把大体步骤贴出来。细节请参见以下文章,步骤写得比较详细:
本回就讲到这里,下一回开始讲解ESP32-S3如何驱动和操作ES8388。