【esp32-adf】pipeline源码分析
创始人
2024-02-29 14:01:41
0

文章目录

  • 一、pipeline介绍
    • 1.1 介绍
    • 1.2 代码结构
  • 二、pipleline源码分析
    • 2.1 audio_element
      • 2.1.1 数据结构
      • 2.1.2 api
        • 2.1.2.1 audio_element_init
        • 2.1.2.2 audio_element_setdata
        • 2.1.2.3 audio_element_run
        • 2.1.2.4 audio_element_task
        • 2.1.2.5 audio_element_input
        • 2.1.2.6 audio_element_output
        • 2.1.2.7 audio_element_cmd_send
    • 2.2 audio_pipeline
      • 2.2.1 数据结构
      • 2.2.2 api
        • 2.2.2.1 audio_pipeline_register
        • 2.2.2.2 audio_pipeline_link
        • 2.2.2.3 audio_pipeline_run
    • 2.3 audio_event_iface
      • 2.3.1 数据结构
      • 2.3.2 api
        • 2.3.2.1 audio_event_iface_waiting_cmd_msg
        • 2.3.2.2 audio_event_iface_cmd
    • 2.4 主要的数据处理流程
      • 2.4.1
    • 2.5 pipeline处理流程--以play_bt_music_example举例
  • 三、参考

一、pipeline介绍

1.1 介绍

1.2 代码结构

二、pipleline源码分析

2.1 audio_element

2.1.1 数据结构

struct audio_element {/* Functions/RingBuffers */el_io_func                  open;ctrl_func                   seek;process_func                process;el_io_func                  close;el_io_func                  destroy;io_type_t                   read_type;union {ringbuf_handle_t        input_rb;io_callback_t           read_cb;} in;io_type_t                   write_type;union {ringbuf_handle_t        output_rb;io_callback_t           write_cb;} out;audio_multi_rb_t            multi_in;audio_multi_rb_t            multi_out;/* Properties */volatile bool               is_open;audio_element_state_t       state;events_type_t               events_type;audio_event_iface_handle_t  iface_event;audio_callback_t            callback_event;int                         buf_size;char                        *buf;char                        *tag;int                         task_stack;int                         task_prio;int                         task_core;xSemaphoreHandle            lock;audio_element_info_t        info;audio_element_info_t        *report_info;bool                        stack_in_ext;audio_thread_t              audio_thread;/* PrivateData */void                        *data;EventGroupHandle_t          state_event;int                         input_wait_time;int                         output_wait_time;int                         out_buf_size_expect;int                         out_rb_size;volatile bool               is_running;volatile bool               task_run;volatile bool               stopping;
};

2.1.2 api

2.1.2.1 audio_element_init

audio_element_handle_t audio_element_init(audio_element_cfg_t *config)

audio_element_init用上层传入的audio_element_cfg_t去初始化audio_element的成员变量,包括audio_element的open、process、close、destroy、seek方法,audio_element任务的属性。

2.1.2.2 audio_element_setdata

esp_err_t audio_element_setdata(audio_element_handle_t el, void *data)

audio_element_setdata用于将对象存入audio_element的私有数据,用作对象的上下文。

2.1.2.3 audio_element_run

esp_err_t audio_element_run(audio_element_handle_t el)

audio_element_run创建一个Task用来处理audio_element的专有任务。

2.1.2.4 audio_element_task

void audio_element_task(void *pv)

audio_element_task是audio_element_run创建的audio_element的处理专有业务的专有任务。调用audio_event_iface_waiting_cmd_msg等待命令,接受到命令后通过audio_element_process_running调用注册的process做element的业务处理。

2.1.2.5 audio_element_input

audio_element_err_t audio_element_input(audio_element_handle_t el, char *buffer, int wanted_size)

2.1.2.6 audio_element_output

audio_element_err_t audio_element_output(audio_element_handle_t el, char *buffer, int write_size)

audio_element_output将audio_element的输出放入输出ringbuffer。

2.1.2.7 audio_element_cmd_send

esp_err_t audio_element_cmd_send(audio_element_handle_t el, audio_element_msg_cmd_t cmd)

audio_element_cmd_send通过audio_element的iface_event向audio_elment_task发送命令,支持的命令的如下:

typedef enum {AEL_MSG_CMD_NONE                = 0,// AEL_MSG_CMD_ERROR               = 1,AEL_MSG_CMD_FINISH              = 2,AEL_MSG_CMD_STOP                = 3,AEL_MSG_CMD_PAUSE               = 4,AEL_MSG_CMD_RESUME              = 5,AEL_MSG_CMD_DESTROY             = 6,// AEL_MSG_CMD_CHANGE_STATE        = 7,AEL_MSG_CMD_REPORT_STATUS       = 8,AEL_MSG_CMD_REPORT_MUSIC_INFO   = 9,AEL_MSG_CMD_REPORT_CODEC_FMT    = 10,AEL_MSG_CMD_REPORT_POSITION     = 11,
} audio_element_msg_cmd_t;

2.2 audio_pipeline

2.2.1 数据结构

2.2.2 api

2.2.2.1 audio_pipeline_register

esp_err_t audio_pipeline_register(audio_pipeline_handle_t pipeline, audio_element_handle_t el, const char *name)

audio_pipeline_register将audio_element注册到pipeline,底层通过STAILQ_INSERT_TAIL向el_list插入链表元素。

2.2.2.2 audio_pipeline_link

esp_err_t audio_pipeline_link(audio_pipeline_handle_t pipeline, const char *link_tag[], int link_num)

在audio_pipeline_link中,遍历pipeline的el_list链表,将el_list链表上的audio_element的输入和输出的ringbuffer连接在一起。

2.2.2.3 audio_pipeline_run

esp_err_t audio_pipeline_run(audio_pipeline_handle_t pipeline)

audio_pipeline_run调用audio_element_run将el_list链表上的audio_element运行起来,这些audio_element是在audio_pipeline_register时插入el_list链表的元素,audio_element_run的底层是创建freeRTOS的Task,各个audio_element独立的在自己的Task里处理业务。

2.3 audio_event_iface

2.3.1 数据结构

struct audio_event_iface {QueueHandle_t               internal_queue;QueueHandle_t               external_queue;QueueSetHandle_t            queue_set;int                         internal_queue_size;int                         external_queue_size;int                         queue_set_size;audio_event_iface_list_t    listening_queues;void                        *context;on_event_iface_func         on_cmd;int                         wait_time;int                         type;
};

2.3.2 api

2.3.2.1 audio_event_iface_waiting_cmd_msg

esp_err_t audio_event_iface_waiting_cmd_msg(audio_event_iface_handle_t evt)

audio_event_iface_waiting_cmd_msg通过等待audio_event_iface_handle_t的internal_queue来处理事件。

2.3.2.2 audio_event_iface_cmd

esp_err_t audio_event_iface_cmd(audio_event_iface_handle_t evt, audio_event_iface_msg_t *msg)

audio_event_iface_cmd通过发送internal_queue触发等待internal_queue的任务。

2.4 主要的数据处理流程

2.4.1

2.5 pipeline处理流程–以play_bt_music_example举例

三、参考

相关内容

热门资讯

开晨会需要说什么内容 开晨会需要说什么内容晨会说的内容可以很多呀,可以说接下来的工作安排,也可以说,前期工作中的一些总结,...
有谁知道在鬼吹灯有声小说中前面... 有谁知道在鬼吹灯有声小说中前面有一段小女孩的声音念:人点烛 鬼吹灯... 这个版本的故事是谁讲的?周...
小蒂皮出自哪本书 小蒂皮出自哪本书小蒂皮出自哪本书我的野生动物朋友(蒂皮·本杰明·奥康迪·德格雷著图书)《我的野生动物...
盘古开天辟地的故事 盘古开天辟地的故事很久很久以前,天和地还没有分开,宇宙混沌一片。有个叫盘古的巨人一直睡在这混沌之中。...
英雄联盟中 赏金猎人怎么样? ... 英雄联盟中 赏金猎人怎么样? 多少钱 金币3150的ADC。入手的话不会吃亏,基本不会压箱底,很热门...
寻找一部累死何以笙箫默之类的小... 寻找一部累死何以笙箫默之类的小说也是辛夷坞的,叫山月不知心底事那就它的作者顾漫的其他小说呗 微微一...
大家谈谈对洪荒小说之中圣人的看... 大家谈谈对洪荒小说之中圣人的看法圣人不死,大盗不止都是人 人有的情绪他们都有 就是拳头大些对...
单位体检,自己一个人去害怕撞到... 单位体检,自己一个人去害怕撞到同事怎么办,不想别人看到观察我,漏出我不成熟样子,显出我的丑态。这让单...
鱼在天上飞? 鱼在天上飞?“鱼在天上飞,鸟在水里游”这句话的意思是鸟儿在水中的倒影就像是在水里游,天空在水中的倒影...
我想复婚,前夫说以后再,我改变... 我想复婚,前夫说以后再,我改变好了,他有可能追我,现在不想复婚,他有喜欢的女人了,我们就不可能了吗感...
原神草神什么时候复刻 原神草神什么时候复刻原神草神复刻是在3.6版本以后。草神纳西妲首次登场是逗腊3.2版本,新角色想要等...
网络拽姐语录小学生? 网络拽姐语录小学生?无论谁离开了你,请你别忘了,他没来之前,你本就是一个人生活。
有一部小说,女主小时候被男主收... 有一部小说,女主小时候被男主收养了,女主叫男主哥哥,男主对女主的我也在找这个小说我之前也看了,好像叫...
高层建筑立面大面积粉刷需要设伸... 高层建筑立面大面积粉刷需要设伸缩缝吗?高层建筑立面大面积粉刷需要设伸缩缝需要的,无正举论地面或立念清...
低头思故乡,为什么把杯思在长,... 低头思故乡,为什么把杯思在长,情愿何处在方歌曲叫什么名字“李白的歌”离开了家乡 背着沉沉的行囊开始了...
李白的诗有多少 李白的诗有多少典故中大多说是三千至四千首,现存不足一千首很多,总之不少~李白一生留下了九百六十多首诗...
怎么才可以学会拿得起放得下……... 怎么才可以学会拿得起放得下…… 有一段感情,正整3年了,可是我还是觉得分手那天就好像昨天发生的一样替...
为什么官方直播间买手机送耳机 为什么官方直播间买手机送耳机吸引消费者,增加销售量。官方直播间作为官方的直播平台,买手机送耳机是为了...
自考通还是一考通好?该选哪个? 自考通还是一考通好?该选哪个?我现在自考行政管理专科。专业课程我应该选自考通好还是一考通好呢?这个很...
淘宝实际付款价格为什么与订单价... 淘宝实际付款价格为什么与订单价格不符是这样的,我买了一双鞋,当时限价160我拍了下来,当时没付款,后...