HTTP Stream 文件位置在:
/esp-adf/components/audio_steam/http_stream.c
/esp-adf/components/audio_steam/include/http_stream.c
typedef enum {
HTTP_STREAM_PRE_REQUEST = 0x01, //将在HTTP客户端与服务器建立连接之前调用事件处理程序
/*
* 当HTTP Client请求数据时,将调用事件处理程序。
* 如果fucntion返回值(-1:ESP_FAIL),则HTTP Client将停止.
* 如果fucntion返回值> 0,则HTTP Stream将忽略post_field
* 如果fucntion返回值= 0,HTTP流继续从post_field发送数据(如果有)
*/
HTTP_STREAM_ON_REQUEST,
/*
* 当HTTP客户端接收数据时,将调用事件处理程序。
* 如果fucntion返回值(-1:ESP_FAIL),则HTTP Client将停止.
* 如果fucntion返回值> 0,则HTTP Stream将忽略读取函数。
* 如果fucntion返回值= 0, HTTP流继续从HTTP Server读取数据
*/
HTTP_STREAM_ON_RESPONSE,
/*
* 在HTTP客户端将标头和正文发送到服务器之后,在获取标头之前,将调用事件处理程序
*/
HTTP_STREAM_POST_REQUEST,
/*
* 在HTTP客户端获取标头并准备读取HTTP正文之后,将调用事件处理程序
*/
HTTP_STREAM_FINISH_REQUEST,
HTTP_STREAM_RESOLVE_ALL_TRACKS,
HTTP_STREAM_FINISH_TRACK,
HTTP_STREAM_FINISH_PLAYLIST,
} http_stream_event_id_t;
/**
* @brief http stream 事件处理消息
*/
typedef struct {
http_stream_event_id_t event_id; /*!< 事件 ID */
void *http_client; /*!< 通过这个http stream 指针可以引用整个http client */
void *buffer; /*!< 通过这个指针可以获得http stream 缓冲区 */
int buffer_len; /*!< 缓冲区长度 */
void *user_data; /*!< 用户指针,在http_stream_cfg_t中设置 */
audio_element_handle_t el; /*!< 音频元素上下文 */
} http_stream_event_msg_t;
/*事件回调函数*/
typedef int (*http_stream_event_handle_t)(http_stream_event_msg_t *msg);
typedef struct {
audio_stream_type_t type; /*!< 流类型 */
int out_rb_size; /*!< 输出环形缓冲区的大小 */
int task_stack; /*!< 任务堆栈大小 */
int task_core; /*!< 任务所在内核(0或1)*/
int task_prio; /*!< 任务优先级 */
http_stream_event_handle_t event_handle; /*!< HTTP Stream 的回调函数 */
void *user_data; /*!< 用户数据 */
bool auto_connect_next_track;/*!< 无需打开/关闭即可连接下一首曲目 */
bool enable_playlist_parser; /*!< 启用播放列表解析器*/
int multi_out_num; /*!< 倍数输出*/
} http_stream_cfg_t;
/**
* @brief 创建音频元素的句柄,以将数据从HTTP流传输到另一个元素,或从发送到HTTP的其他元素获取数据,
* 具体取决于流类型(AUDIO_STREAM_READER或AUDIO_STREAM_WRITER)的配置。
*
* @param 配置选项
*
* @return 音频元素手柄
*/
audio_element_handle_t http_stream_init(http_stream_cfg_t *config);
#define AAC_STREAM_URI "http://open.ls.qingting.fm/live/274/64k.m3u8?format=aac"
/*定义回调函数*/
int _http_stream_event_handle(http_stream_event_msg_t *msg)
{
if (msg->event_id == HTTP_STREAM_RESOLVE_ALL_TRACKS) {
return ESP_OK;
}
if (msg->event_id == HTTP_STREAM_FINISH_TRACK) {
return http_stream_next_track(msg->el);
}
if (msg->event_id == HTTP_STREAM_FINISH_PLAYLIST) {
return http_stream_restart(msg->el);
}
return ESP_OK;
}
/*初始化*/
http_stream_cfg_t http_cfg = HTTP_STREAM_CFG_DEFAULT();
http_cfg.event_handle = _http_stream_event_handle;
http_cfg.type = AUDIO_STREAM_READER;
http_cfg.enable_playlist_parser = true;
http_stream_reader = http_stream_init(&http_cfg);
/*将元素注册到管道中*/
audio_pipeline_register(pipeline, http_stream_reader, "http");
/*链接管道中的各个元素*/
audio_pipeline_link(pipeline, (const char *[]) {"http", "aac", "i2s"}, 3);
/*设置http 服务器路径*/
audio_element_set_uri(http_stream_reader, AAC_STREAM_URI);
/*运行管道*/
audio_pipeline_run(pipeline);
欢迎关注我的个人网站:zwww.zcxbb.com
知乎专栏:物联网开发入门 - 知乎 (zhihu.com)