RT-Thread Audio Framework API调用关系图
2019-12-06 15:11:25 5 举报
RT-Thread Audio框架调用关系图
作者其他创作
大纲/内容
判断mp是否还有不满一块的数据?write_index != 0
_audio_dev_write
replay->pos += remain_bytes
_aduio_replay_stop
_audio_dev_control
AUDIO_CTL_STOP
_audio_dev_close
内存池节点,用于写音频数据临时缓存,主要用与缓存不到 RT_AUDIO_REPLAY_MP_BLOCK_COUNT 字节大小的数据,驱动框架中的mp只有满块大小后才会 push 到数据队列中
sound_init
文件是否读取完毕?
AUDIO_CTL_GETCAPS
int stream = *(int *) args
互斥锁
分配 replay 结构体
remain_bytes计算最小拷贝数据量(字节)
struct rt_data_queue queue
判断mp是否写满?write_index == 0?
return
info->buffer = 地址
开mute
下一次循环
将事件标志位STOP等待STOP事件响应
RT_DEVICE_OFLAG_WRONLY写打开
创建 adu_mp 静态内存池
音频框架层API
write_index = 0
snd_dev = rt_device_find(\"sound0\")
sound_transmit
同一层次API调用
ops->start?
rt_uint16_t read_index
result = _aduio_replay_stop
判断 FIFO 块大小是否写满?index < dst_size?
sound_stop
拷贝 buffer -> mp中
音频驱动API
配置硬件接口,IO口,时钟,默认DSP参数
replay->read_index += remain_bytes
没有完毕
重新分配mp(可能会阻塞)
node#1ptr+size
已经启动
节点数:CFG_AUDIO_REPLAY_QUEUE_COUNT 4
没有数据时,将该帧 tx_fifo 的块清空
ops->transmit != RT_NULL?
判断 该节点的数据队列是否已经拷贝完毕replay->read_index == src_size
永久等待,阻塞
将 dataqueue 中一个节点 按照一帧(tx_fifo一块的大小)向 tx_fifo 中拷贝
API内部逻辑调用顺序
rt_uint8_t *write_data
node#2ptr+size
块数量:RT_AUDIO_REPLAY_MP_BLOCK_COUNT 2块大小:RT_AUDIO_REPLAY_MP_BLOCK_SIZE 4096
rt_uint32_t pos
index 数据队列中的一个节点的音频数据,拷贝的数据的字节数
rt_bool_t activated
tx_fifo为循环buffer将指针又转回0地址
rt_hw_sound_init初始化 sound 驱动
配置 DMA,中断
dataqueue
硬件驱动中fifo写指针位置
_audio_send_replay_frame
ops->stop(AUDIO_STREAM_REPLAY)
层间逻辑
判断 replay->activated 标志位
replay->activated = RT_TRUE
判断驱动是否激活replay->activated == RT_TRUE?
index += remain_bytes
AUDIO_STREAM_RECORD
AUDIO_STREAM_REPLAY
mute脚初始化,默认开 mute
struct rt_audio_replay *replay
RT_DEVICE_FLAG_WRONLY(放音驱动)
指针变量:write_index 继承read_index 继承pos 继承event 继承buf_info = replay->buf_info 驱动中 buffer(DMA或者发送buffer)position = replay->posdst_size = buf_info->block_size 块大小 4096字节src_size = 数据队列中的音频数据长度index 已经写入的数据量
RT-Thread Audio 框架层
写满mp
struct rt_mutex lock
数据队列 push 不涉及到数据 copy
rt_audio_register注册音频驱动
初始化 replay 互斥锁
判断dataqueue中是否有数据?
result =_audio_record_stop
if ops->buffer_info()
rt_uint16_t write_index
return result
ops->stop?
event & REPLAY_EVT_STOP?判断是否收到了停止事件
rt_device_open(snd_dev)
result = -RT_EEMPTY
Version 1.0Author liu2guang
_audio_flush_replay_frame
内存池
caps = (struct rt_audio_caps *) args
B1024
index += remain_bytes buffer当前读指针write_index += remain_bytes mp写指针write_index %= block_size 指针纠正(超过循环)
struct rt_mempool *mp
write_index % block_size == 0?判断是否写完一块mp?
MP#2(4096)
_aduio_replay_stop()
MP#x4096
没有数据
数据队列
驱动中存在start函数
if ops->init(audio)
replay->activated = RT_FALSE
RT-Thread 音频应用层代码
判断驱动打开方式RT_DEVICE_OFLAG_WRONLY?
ops->start(AUDIO_STREAM_REPLAY)
read_index = 0
replay->pos %= buf_info->total_size
驱动中存在stop函数
未启动
MP#1(4096)
audio->parent.tx_complete(data) 指向驱动中的发送完成回调
rt_audio_register
激活
tx_fifo当前位置,为块的起始地址,因为每一次都是整块拷贝
_audio_dev_init
RT-Thread Audio Framework
AUDIO_CTL_CONFIGURE
_audio_dev_open
result = _audio_record_stop
replay:write_index = 0read_index = 0pos = 0event = REPLAY_EVT_NONE
tx_fifo
释放掉节点,其实就是mprt_mp_free(data);
数据队列节点当前读指针
sound_buffer_info
pos -= remain_bytes
node#3ptr+size
将mp中不满一块的数据 push 到数据队列中
index < size?是否音频数据写入完毕
读取 WAV 文件的容器头用于获取:采样率,采样深度,通道数
指针变量:write_index 继承read_index 继承pos 继承event 继承ptr = (rt_uint8_t *)bufferblock_size = RT_AUDIO_REPLAY_MP_BLOCK_SIZEindex:buffer读指针,指向当前的音频数据的位置
rt_device_close
pos %= buf_info->total_size
node#4ptr+size
rt_uint8_t event
驱动有transmit ops函数
A1024
BSP Audio 驱动
_aduio_replay_start
有不满一块的数据
RT_FALSE
清空 FIFO 块大小的缓冲区
AUDIO_CTL_START
静态内存池
struct rt_completion cmp
判断打开的标志位
读取一帧 pcm 数据
cmd?
有数据
将1帧(tx_fifo块大小)音频数据传输硬件(DMA循环模式不需要,单次DMA可以用到,中断模式需要靠这个搬运数据,EQ可以在这里处理)
不同层次之间的API调用
return index
replay->activated == RT_TRUE?
replay->read_index = 0;
参数pos:没有用buffer:音频数据buffersize:音频数据大小(字节)
关 mute
stream
初始化数据队列
所有数据写入完毕
没有写满
发送STOP的ACK(数据传送到底层才发)
启动 DMA 传输(循环模式)
重复调用
sound_getcaps
音频应用层API
sound_configure
struct rt_audio_buf_info buf_info
内存池节点写指针
没有写完
replay->pos += dst_size
info->block_size = 块大小
pos += dst_size
拷贝数据到tx_fifo中(可能不满一帧数据)
计算最小拷贝数据量(字节)
info->block_count = 块数量
sound_start
判断注册的标志位
当前数据队列节点的读指针偏移量
0 条评论
回复 删除
下一页