5. 音频传输管理模块说明
5.1. 简介
- 本章主要介绍audio_rf音频传输模块,用户可以基于该模块实现:
实现ADC采集数据并启动编码输出;
实现接收数据进行解码并输出到DAC;
实现数据流简易管理;
- 模块层次划分:
图1.1 模块层次划分
- 相关文件:
apps/app/bsp/common/audio_rf_trans/audio_rf_mge.c
apps/app/bsp/common/audio_rf_trans/audio2rf_send.c
apps/app/bsp/common/audio_rf_trans/rf2audio_recv.c
apps/app/bsp/common/audio_rf_trans/trans_packet.c
apps/app/bsp/common/audio_rf_trans/trans_unpacket.c
apps/app/bsp/common/audio_rf_trans/rf_send_queue.c
apps/app/bsp/common/encoder/encoder_stream.c
5.2. 音频发送相关接口
5.2.1. 函数void audio2rf_encoder_io(u32(*enc_fun)(void *, void *, void *), AUDIO_FORMAT enc_type)
备注
该函数实现发送编码信息给远端并启动编码器;
初始化编码器后会将编码信息发送给远端,再将编码链路挂载到AUDIO_ADC中断;
调用该函数前需确保AUDIO_ADC已工作
- enc_fun:编码器选择,可传入ump2或者opus等编码器初始化接口;
ump3_encode_api:ump2编码器初始化api;
opus_encode_api:opus编码器初始化api;
enc_type:编码对应的解码类型选择
返回值:无
5.2.2. 函数u32 audio2rf_start_cmd(u32 sr, u32 br, AUDIO_FORMAT enc_type)
备注
该函数实现发送编码头信息包给远端;远端接收编码信息包后启动解码;
sr:编码采样率;
br:编码码率;
enc_type:编码对应的解码类型;
返回值:0:成功 非0:失败;
5.2.3. 函数u32 audio2rf_stop_cmd(void)
备注
该函数实现发送停止包给远端;远端接收停止包后停止解码;
返回值:0:成功 非0:失败;
5.2.4. 函数u32 audio2rf_ack_cmd(u8 ack_cmd, u8 *data, u16 len)
备注
该函数实现发送停止包给远端;远端接收停止包后停止解码;
ack_cmd:需要回复ack的命令包;
data:ack参数buff;
len:ack参数长度;
返回值:0:成功 非0:失败;
5.2.5. 函数u32 audio2rf_send_packet(RADIO_PACKET_TYPE type, u8 *data, u16 data_len)
备注
该函数实现发送cmd或者数据包;
type:包类型;
data:发送数据buff;
data_len:发送数据长度;
返回值:成功:0 失败:请查看errno-base.h
5.2.6. 函数u32 rf_enc_output(void *priv, u8 *data, u16 len)
备注
该函数实现编码器输出数据并进行无线传输,由编码器回调;
无线传输模块出错导致无法正常发送时停止编码,发送繁忙时等待下次编码输出
该函数在启动编码器时传入编码器output参数;
priv:私有结构体,此处为编码句柄;
data:输出数据buff;
len:输出数据长度;
返回值:本次消耗的编码数据字节长度;
5.2.7. 函数void audio2rf_encoder_stop(ENC_STOP_WAIT wait)
备注
该函数实现停止编码和数据发送,并发送停止包给远端;
wait:是否等待编码数据消耗完成;
返回值:无
5.3. 音频接收相关接口
5.3.1. 结构体变量struct if_decoder_io dec_io_for_rf
备注
该结构体变量为解码输入输出管理句柄,解码器通过input接口获取数据,解码完成后通过output接口输出数据;
5.3.2. 函数dec_obj *rf2audio_decoder_start(RF_RADIO_ENC_HEAD *p_enc_head, sound_stream_obj *p_rf_stream, u32 output_sr)
备注
该函数实现音频传输接收开始,启动解码器;
音频传输接收到编码头信息后,启动相应解码器开始解码;
p_enc_head:编码头信息,依据该信息初始化解码器;
p_rf_stream:音频数据源句柄;
output_sr:解码后的pcm数据输出采样率;
返回值:成功返回解码句柄;失败返回NULL
5.3.3. 函数void rf2audio_decoder_stop(dec_obj *p_recv_dec_obj, bool(*unregist_func)(void *))
备注
该函数实现音频传输接收停止,关闭解码器;
p_recv_dec_obj:解码句柄;
unregist_func:后级注销接口;可选择注销DAC或USB_MIC;
返回值:无
5.3.4. 函数u32 rf2audio_receiver_write_data(dec_obj *p_recv_dec_obj, u8 *data, u32 data_len)
备注
该函数实现将接收的音频数据写入接收缓存buff;
p_recv_dec_obj:解码句柄;
data:写入的数据buff;
data_len:写入的数据长度;
返回值:本次已成功写入的数据长度;
5.3.5. 函数int rf2audio_receiver_mp_input(void *priv, u32 addr, void *buf, int len, u8 type)
备注
该函数实现读取缓存中的音频数据;
音频接收缓存cbuf为rf_data_buff,由cbuf_rf_data管理,解码器启动后读取;
priv:私有参数,此处透传解码句柄;
addr:解码输入偏移,此处未用上;
buf:读取的数据buff;
len:读取的数据长度;
type:解码输入类型,此处未用上;
返回值:本次已成功读取的数据长度;
5.3.6. 函数void rf2audio_receiver_kick_decoder(void *p_stream_in, void *psound)
备注
该函数实现kick解码器启动一次解码;
接收数据并写入缓存后,启动解码器去缓存中读取数据;
启动前会判断缓存数据是否满足一帧,满足则启动解码,不满足则退出
p_stream_in:数据流管理句柄,该参数为空强制启动一次解码;
psound:音频数据句柄
返回值:无;
5.4. 数据封包/解包相关接口
5.4.1. 函数u32 ar_trans_pack(RADIO_PACKET_TYPE type, u8 *data, u16 data_len)
备注
该函数实现音频传输封包发送接口;
发送前会查询发送状态和可发送长度,条件未满足退出发送;
- type:发送的数据类型;
AUDIO2RF_START_PACKET:音频起始包,包含编码信息;
AUDIO2RF_DATA_PACKET:音频数据包;
AUDIO2RF_STOP_PACKET:音频停止包;
data:发送的数据buff;
data_len:发送的数据长度;
psound:音频数据句柄
返回值:0:成功 非0:失败;
5.4.2. 函数bool ar_trans_unpack(rev_fsm_mge *ops, u8 *buff, u16 len, u32 *pcnt)
备注
该函数实现音频传输接收拆包;
状态机解析封包的数据头,并分发给下一级;
ops:状态机管理句柄;
buff:接收数据buff;
len:接收数据长度;
pcnt:有效数据偏移指针;
返回值:true:找到有效数据 false:未找到有效数据;
5.4.3. 函数int unpack_data_deal(rev_fsm_mge *ops, u8 *buff, u16 packet_len)
备注
该函数实现音频传输接收拆包并分发给应用层;
调用状态机解析封包函数ar_trans_unpack进行拆包,并分发给应用层;
ops:状态机管理句柄;
buff:接收数据buff;
len:接收数据长度;
返回值:true:找到有效数据 false:未找到有效数据;
5.4.4. 函数s32 packet_cmd_post(void *p_pool, RADIO_PACKET_TYPE cmd, u8 *data, u16 data_len)
备注
该函数实现将解析出的cmd包及其所带参数post到缓存中;
调用状态机解析封包函数ar_trans_unpack进行拆包,并分发给应用层;
p_pool:cmd缓存池;
cmd:cmd命令包;
data:cmd命令包所带参数;
data_len:cmd命令包所带参数长度;
返回值:成功:0 失败:错误值请查看errno-base.h;
5.4.5. 函数u32 packet_cmd_get(void *p_pool, u8 *packet, u8 packet_len)
备注
该函数实现从缓存池中获取cmd包及其所带参数;
调用状态机解析封包函数ar_trans_unpack进行拆包,并分发给应用层;
p_pool:cmd缓存池;
packet:应用保存cmd及其参数的缓存;
packet_len:应用保存cmd及其参数的缓存长度;
返回值:成功:读出的cmd包长度 失败:0;
5.5. rf相关接口
5.5.1. 函数void audio2rf_send_register(void *ops)
备注
该函数实现音频无线传输接口注册;
- ops:发送相关接口注册,结构体原型为audio2rf_send_mge_ops,其成员如下:
send:发送接口;
check_status:状态检查,0:异常,1:正常;
get_valid_len:获取本次可发送的字节长度;
返回值:无
5.5.2. 函数void rf_send_soft_isr_init(void *p_cbuf, u8 use_queue_isr)
备注
该函数实现初始化发送队列和软中断;
p_cbuf:发送队列环形buff管理句柄;
use_queue_isr:是否使用队列发送中断,主动向蓝牙推数据
返回值:无
5.5.3. 函数u32 rf_send_push2queue(u8 *packet_data, u16 packet_len)
备注
该函数实现将发送给蓝牙的数据压入队列,并启动中断发送;
packet_data:发送数据buff;
packet_len:发送数据长度;
返回值:成功:0 失败:请查看errno-base.h
5.5.4. 函数void rf_send_queue_isr(void)
备注
该中断函数实现将发送队列中的数据主动推给蓝牙,蓝牙底层会定时起中断发送给远端;
返回值:无
5.5.5. 函数u32 read_data_from_queue(u8 *buf, u32 len)
备注
该函数实现用户从发送队列读取数据,与rf_send_queue_isr不同的是,read_data_from_queue函数是后级主动从队列取数;
返回值:从队列读取到的数据长度