# Audio ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # 功能概述 本文档描述音频功能的接口定义、使用流程及示例代码。音频模块支持WAV、MP3、AMR-NB、PCM等格式,提供统一的流式API用于音频数据的写入(播放)和读取(录制)。 ## 使用流程 ### 初始化与打开音频流 播放或录制音频前,应用层需要先调用 *qcm_aud_stream_open()* 函数来初始化音频流管理器。通过配置结构体 *qosa_aud_stream_cfg_t* 中的 *is_record* 字段区分播放模式和录制模式: - *is_record* = *QOSA_FALSE*:播放模式 - *is_record* = *QOSA_TRUE*:录制模式 #### 播放流程 ##### 向流中写入数据 调用 *qcm_aud_stream_write()* 函数将音频数据写入播放流。 ##### 播放回调函数 - 当底层驱动需要更多音频数据时,会触发 *QOSA_AUD_STREAM_RX_LOW* 事件,通过 *qosa_aud_stream_cfg_t* 中注册的 *callback* 回调函数通知应用层。此时应调用 *qcm_aud_stream_write()*,该函数为 **非阻塞** 调用,它会尽可能多地将音频数据写入内部缓冲区后立即返回。 - 随着数据不断写入,当缓冲区空间已满时,系统会触发 *QOSA_AUD_STREAM_RX_HIGH* 事件,通过 *qosa_aud_stream_cfg_t* 中注册的 *callback* 回调函数(类型为 *qosa_aud_callback_t*)通知应用层。 #### 录制流程 ##### 录制回调函数 当音频硬件缓冲区中有足够多的数据时,系统会触发 *QOSA_AUD_DRIVER_RX_HIGH* 事件,并调用您在 *qosa_aud_stream_cfg_t* 中注册的类型为 *qosa_aud_callback_t* 的回调函数通知应用层。 ##### 从流中读取数据 收到 *QOSA_AUD_DRIVER_RX_HIGH* 事件通知后,调用 *qcm_aud_stream_read()* 获取录制的音频数据。 #### 关闭音频流 播放或录制完成后,必须调用 *qcm_aud_stream_close()* 来释放资源。 # Audio API ## 头文件 *qcm_audio.h* ## 函数概览 | **函数** | **说明** | | --- | --- | | *qcm_aud_stream_open()* | 初始化音频流管理器 | | *qcm_aud_stream_write()* | 向播放流写入音频数据 | | *qcm_aud_stream_read()* | 从录制流读取音频数据 | | *qcm_aud_stream_close()* | 关闭音频流并释放资源 | | *qosa_aud_callback_t()* | 处理音频事件通知 | ## 函数详解 ### qcm_aud_stream_open - **功能描述** 初始化音频流管理器,支持格式:WAV、MP3、AMR-NB、PCM。 - **函数原型** ```c qosa_aud_errcode_e qcm_aud_stream_open(qosa_aud_stream_cfg_t *config, qosa_aud_handle_t *handle) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *config* | 输入 | *qosa_aud_stream_cfg_t** | 音频流配置结构体指针,用于设置音频流的各项参数;详见 [*qosa_aud_stream_cfg_t*](#qosaaudstreamcfgt) | | *handle* | 输出 | qosa_aud_handle_t * | 返回创建的音频流句柄 | - **返回值说明** *QOSA_AUD_SUCCESS*:函数执行成功 错误码(详见 [*qosa_aud_errcode_e*](#qosaauderrcode_e)):函数执行失败 ### qcm_aud_stream_write - **功能描述** 向播放流写入音频数据。 - **函数原型** ```c qosa_int32_t qcm_aud_stream_write(qosa_aud_handle_t handle, qosa_uint8_t *data, qosa_uint32_t size) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *handle* | 输入 | qosa_aud_handle_t | 由 *qcm_aud_stream_open()* 返回的播放流句柄 | | *data* | 输入 | qosa_uint8_t * | 指向待播放音频数据的缓冲区 | | *size* | 输入 | qosa_uint32_t | 待写入数据的字节数;单位:字节 | - **返回值说明** 实际写入的字节数:函数执行成功 错误码(详见 [*qosa_aud_errcode_e*](#qosaauderrcode_e)):函数执行失败 ### qcm_aud_stream_read - **功能描述** 从录制流读取音频数据。此函数仅当 *sync_mode*= *QOSA_FALSE*,即异步模式下有效。 - **函数原型** ```c qosa_int32_t qcm_aud_stream_read(qosa_aud_handle_t handle, qosa_uint8_t *data, qosa_uint32_t size) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *handle* | 输入 | qosa_aud_handle_t | 由 *qcm_aud_stream_open()* 返回的录制流句柄 | | *data* | 输出 | qosa_uint8_t * | 存储读取数据的缓冲区 | | *size* | 输入 | qosa_uint32_t | 要读取数据的字节数;单位:字节 | - **返回值说明** 实际读取的字节数:函数执行成功 错误码(详见 [*qosa_aud_errcode_e*](#qosaauderrcode_e)):函数执行失败 ### qcm_aud_stream_close - **功能描述** 关闭音频流并释放资源。 - **函数原型** ```c qosa_int32_t qcm_aud_stream_close(qosa_aud_handle_t handle, qosa_bool_t force) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *handle* | 输入 | qosa_aud_handle_t | 要关闭的音频流句柄 | | *force* | 输入 | qosa_bool_t | 是否强制关闭(当前未使用,保留参数) | - **返回值说明** *0*:函数执行成功 错误码(详见 [*qosa_aud_errcode_e*](#qosaauderrcode_e)):函数执行失败 ### qosa_aud_callback_t - **功能描述** 处理音频事件通知。 - **函数原型** ```c typedef void (*qosa_aud_callback_t)(qosa_aud_cb_param_t *param); ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *param* | 输入 | *qosa_aud_cb_param_t** | 回调参数结构体指针;详见 [*qosa_aud_cb_param_t*](#qosaaudcbparamt) | ## 结构体定义 ### qosa_aud_stream_cfg_t 音频流配置结构体定义如下: ```c typedef struct { qosa_bool_t is_record; qosa_uint16_t samprate; qosa_uint8_t channels; qosa_bool_t sync_mode; qosa_aud_fmt_e format; qosa_aud_callback_t callback; qosa_uint8_t *ctx; qosa_uint64_t options; } qosa_aud_stream_cfg_t; ``` | **参数** | **类型** | **说明** | | --- | --- | --- | | *is_record* | qosa_bool_t | 是否为录音模式
*QOSA_FALSE*:播放模式
*QOSA_TRUE*:录制模式 | | *samprate* | qosa_uint16_t | 音频采样率;取值范围:8000、16000、22050、32000、44100和48000,单位:Hz。 | | *channels* | qosa_uint8_t | 音频通道数
*1*:单声道(mono)
*2*:立体声(stereo) | | *sync_mode* | qosa_bool_t | 同步/异步模式标志
*QOSA_TRUE*:同步模式
*QOSA_FALSE*:异步模式 | | *format* | *qosa_aud_fmt_e* | 音频格式枚举类型;详见 [*qosa_aud_fmt_e*](#qosaaudfmt_e) | | *callback* | *qosa_aud_callback_t* | 回调函数指针,用于接收音频事件通知;详见 [*qosa_aud_callback_t*](#qosaaudcallback_t) | | *ctx* | qosa_uint8_t * | 用户上下文指针,传递给回调函数 | | *options* | qosa_uint64_t | 保留字段,用于扩展功能 | ### qosa_aud_cb_param_t 回调参数结构体定义如下: ```c typedef struct { qosa_aud_handle_t handle; qosa_int32_t event_id; qosa_uint32_t size; qosa_uint8_t *ctx; } qosa_aud_cb_param_t; ``` | **参数** | **类型** | **说明** | | --- | --- | --- | | *handle* | qosa_aud_handle_t | 音频流句柄 | | *event_id* | qosa_int32_t | 事件ID,标识触发回调的具体事件;详见 [*qosa_stream_evt_e*](#qosastreamevt_e) | | *size* | qosa_uint32_t | 数据大小字节数;单位:字节 | | *ctx* | qosa_uint8_t * | 用户上下文指针,对应 *qosa_aud_stream_cfg_t* 中配置的 *ctx* | ## 枚举定义 ### qosa_aud_errcode_e 音频流操作结果码枚举定义如下: ```c typedef enum { QOSA_AUD_SUCCESS, QOSA_AUD_INVALID_PARAM = 1 | (QOSA_COMPONENT_AUDIO << 16), QOSA_AUD_MUTEX_ERR, QOSA_AUD_NO_MEMORY_ERR, QOSA_AUD_SYSTEM_ERR, QOSA_AUD_REOPEN_ERR, QOSA_AUD_FILE_OPEN_ERR, QOSA_AUD_FILE_WRITE_ERR, } qosa_aud_errcode_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_AUD_SUCCESS* | 函数执行成功 | | *QOSA_AUD_INVALID_PARAM* | 输入参数错误 | | *QOSA_AUD_MUTEX_ERR* | 互斥锁获取失败 | | *QOSA_AUD_NO_MEMORY_ERR* | 内存分配失败 | | *QOSA_AUD_SYSTEM_ERR* | 系统或驱动层错误 | | *QOSA_AUD_REOPEN_ERR* | 禁止重复打开音频流 | | *QOSA_AUD_FILE_OPEN_ERR* | 音频文件打开失败 | | *QOSA_AUD_FILE_WRITE_ERR* | 音频文件写入失败 | ### qosa_aud_fmt_e 音频数据格式枚举定义如下: ```c typedef enum { QOSA_AUD_FMT_UNKNOWN, QOSA_AUD_FMT_PCM, QOSA_AUD_FMT_WAV, QOSA_AUD_FMT_MP3, QOSA_AUD_FMT_AMRNB, QOSA_AUD_FMT_AMRWB, } qosa_aud_fmt_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_AUD_FMT_UNKNOWN* | 未知/未指定格式 | | *QOSA_AUD_FMT_PCM* | PCM | | *QOSA_AUD_FMT_WAV* | WAV | | *QOSA_AUD_FMT_MP3* | MP3 | | *QOSA_AUD_FMT_AMRNB* | AMR-NB;采样率:8 kHz | | *QOSA_AUD_FMT_AMRWB* | AMR-WB;采样率:16 kHz | ### qosa_stream_evt_e 回调事件类型枚举定义如下: ```c typedef enum { QOSA_AUD_STREAM_RX_ARRIVE = 100, QOSA_AUD_STREAM_RX_START, QOSA_AUD_STREAM_RX_LOW, QOSA_AUD_STREAM_RX_HIGH, QOSA_AUD_DECODE_COMPLETE = 200, QOSA_AUD_DECODE_START, QOSA_AUD_DECODE_LOW_LEVEL, QOSA_AUD_DECODE_ERROR, QOSA_AUD_DRIVER_TX_COMPLETE = 300, QOSA_AUD_DRIVER_TX_LOW, QOSA_AUD_DRIVER_TX_START, QOSA_AUD_DRIVER_RX_OVERFLOW, QOSA_AUD_DRIVER_RX_HIGH, } qosa_stream_evt_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_AUD_STREAM_RX_ARRIVE* | 收到数据 | | *QOSA_AUD_STREAM_RX_START* | 开始接收数据 | | *QOSA_AUD_STREAM_RX_LOW* | 接收缓冲区数据不足,通知上层提供更多数据 | | *QOSA_AUD_STREAM_RX_HIGH* | 接收缓冲区数据充足,通知上层暂停数据传输 | | *QOSA_AUD_DECODE_COMPLETE* | 解码完成 | | *QOSA_AUD_DECODE_START* | 开始解码 | | *QOSA_AUD_DECODE_LOW_LEVEL* | 解码缓冲区数据不足,通知上层提供更多数据 | | *QOSA_AUD_DECODE_ERROR* | 解码错误 | | *QOSA_AUD_DRIVER_TX_COMPLETE* | 驱动发送完成 | | *QOSA_AUD_DRIVER_TX_LOW* | 驱动发送缓冲区数据不足,通知上层提供更多数据 | | *QOSA_AUD_DRIVER_TX_START* | 驱动开始发送 | | *QOSA_AUD_DRIVER_RX_OVERFLOW* | 驱动接收溢出 | | *QOSA_AUD_DRIVER_RX_HIGH* | 驱动接收缓冲区数据充足,通知上层及时读取数据,防止缓冲区溢出 | # 应用逻辑流程图 ## 播放流程图 ```{figure} images/board_JiNowZ1X2h8hneboZMRc308InKx.jpg :align: center :alt: image ``` ## 录制流程图 ```{figure} images/board_RLO6wjwUUhl6Nobz0kvcxcuznF7.jpg :align: center :alt: image ``` # 示例代码 播放流程完整示例代码请查看: https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/peripheral/audio/audio_play.c 录制流程完整示例代码请查看: https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/peripheral/audio/audio_recording.c