Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Devices
AUDIO
RT-Thread Audio - 1. 音频框架的分析
发布于 2019-11-09 13:42:58 浏览:5050
订阅该版
[tocm] Github 上 RT-Thread 源码最新更新了关于 Audio 驱动相关的部分,让上层和底层都开发和编程简单了,不过对于大部分的开发者来说还不太熟悉这套框架的,那么笔者就这次编写音频驱动给大家分析下代码框架。 这里会先贴一张框架图,整个帖子都是笔者在编写开发过程中写的,可能有格式和错误,最终全部更新完毕后会整理整个系列的帖子。 ## 1. RT-Thread 音频架构图 ![RT-Thread Audio Framework 架构图.png](/uploads/201911/09/133407sreiwa3e2e4a202g.png) ## 2. RT-Thread 音频框架的调用逻辑关系图(建议右键大图) https://note.youdao.com/yws/public/resource/7fdf0aa9ba116fe167f67b7b50cc7cb1/684B2A300C59405985F62FC1EE621905?ynotemdtimestamp=1573277165267 ## 3. RT-Thread 音频应用代码模板(以wavplay为例) [https://github.com/RT-Thread-packages/wavplayer](https://github.com/RT-Thread-packages/wavplayer) ## 4. RT-Thread 音频驱动代码模板 ```c #include "drv_sound.h" #include "drv_tina.h" #include "drivers/audio.h" #define DBG_TAG "drv_sound" #define DBG_LVL DBG_LOG #define DBG_COLOR #include
#define TX_DMA_FIFO_SIZE (2048) struct temp_sound { struct rt_audio_device device; struct rt_audio_configure replay_config; int volume; rt_uint8_t *tx_fifo; }; static rt_err_t getcaps(struct rt_audio_device *audio, struct rt_audio_caps *caps) { struct temp_sound *sound = RT_NULL; RT_ASSERT(audio != RT_NULL); sound = (struct temp_sound *)audio->parent.user_data; (void)sound; return RT_EOK; } static rt_err_t configure(struct rt_audio_device *audio, struct rt_audio_caps *caps) { struct temp_sound *sound = RT_NULL; RT_ASSERT(audio != RT_NULL); sound = (struct temp_sound *)audio->parent.user_data; (void)sound; return RT_EOK; } static rt_err_t init(struct rt_audio_device *audio) { struct temp_sound *sound = RT_NULL; RT_ASSERT(audio != RT_NULL); sound = (struct temp_sound *)audio->parent.user_data; (void)sound; return RT_EOK; } static rt_err_t start(struct rt_audio_device *audio, int stream) { struct temp_sound *sound = RT_NULL; RT_ASSERT(audio != RT_NULL); sound = (struct temp_sound *)audio->parent.user_data; (void)sound; return RT_EOK; } static rt_err_t stop(struct rt_audio_device *audio, int stream) { struct temp_sound *sound = RT_NULL; RT_ASSERT(audio != RT_NULL); sound = (struct temp_sound *)audio->parent.user_data; (void)sound; return RT_EOK; } rt_size_t transmit(struct rt_audio_device *audio, const void *writeBuf, void *readBuf, rt_size_t size) { struct temp_sound *sound = RT_NULL; RT_ASSERT(audio != RT_NULL); sound = (struct temp_sound *)audio->parent.user_data; (void)sound; return size; } static void buffer_info(struct rt_audio_device *audio, struct rt_audio_buf_info *info) { struct temp_sound *sound = RT_NULL; RT_ASSERT(audio != RT_NULL); sound = (struct temp_sound *)audio->parent.user_data; /** * TX_FIFO * +----------------+----------------+ * | block1 | block2 | * +----------------+----------------+ * \ block_size / */ info->buffer = sound->tx_fifo; info->total_size = TX_DMA_FIFO_SIZE; info->block_size = TX_DMA_FIFO_SIZE / 2; info->block_count = 2; } static struct rt_audio_ops ops = { .getcaps = getcaps, .configure = configure, .init = init, .start = start, .stop = stop, .transmit = transmit, .buffer_info = buffer_info, }; static int rt_hw_sound_init(void) { rt_uint8_t *tx_fifo = RT_NULL; static struct temp_sound sound = {0}; /* 分配 DMA 搬运 buffer */ tx_fifo = rt_calloc(1, TX_DMA_FIFO_SIZE); if(tx_fifo == RT_NULL) { return -RT_ENOMEM; } sound.tx_fifo = tx_fifo; /* 注册声卡放音驱动 */ sound.device.ops = &ops; rt_audio_register(&sound.device, "sound0", RT_DEVICE_FLAG_WRONLY, &sound); return RT_EOK; } INIT_DEVICE_EXPORT(rt_hw_sound_init); ``` ## 5. 代码分析 **待后续补充。。。** - [sound_temp.7z](/uploads/201911/09/133726eld2666cpql6d66h.attach)
查看更多
11
个回答
默认排序
按发布时间排序
来一颗糖
2019-11-09
这家伙很懒,什么也没写!
前排围观 9 层音频驱动框架。。。:lol
whj467467222
认证专家
2019-11-09
开源,分享,交流,共同进步
前排围观 9 层音频驱动框架。。。
charlown.cai
2019-11-10
这家伙很懒,什么也没写!
第二张逻辑关系图显示不出来,一直在打转
liu2guang
认证专家
2019-11-11
这家伙很懒,什么也没写!
>第二张逻辑关系图显示不出来,一直在打转 直接点击这个图片链接试试,图片比较大 https://note.youdao.com/yws/public/resource/7fdf0aa9ba116fe167f67b7b50cc7cb1/684B2A300C59405985F62FC1EE621905?ynotemdtimestamp=1573277165267
XQQ
2019-11-19
这家伙很懒,什么也没写!
啥时候继续更新
liu2guang
认证专家
2019-11-19
这家伙很懒,什么也没写!
>啥时候继续更新 周末更新,最近事情比较多,会更新一个系列的,这个帖子比较笔记,写的比较水
qz_rtt
2019-11-26
这家伙很懒,什么也没写!
不赖,加油,加点文字说明一下,不然新手可能比较迷惑。
liuduanfei
2020-05-03
这家伙很懒,什么也没写!
>直接点击这个图片链接试试,图片比较大 https://note.youdao.com/yws/public/resource/7fdf0aa9ba116fe1 ... 链接也不好使了。。。
老菜鸟222
2023-05-16
这家伙很懒,什么也没写!
说真的,rt的auduo用ring buffer是失败的,太浪费内存,看看nuttx里和android那中dequeue和enqueue buffer更省内存,而且减少数据复制
Lrain
2023-09-12
这家伙很懒,什么也没写!
硬件I2S的代码要怎么添加进来呢?
撰写答案
登录
注册新账号
关注者
0
被浏览
5.1k
关于作者
liu2guang
这家伙很懒,什么也没写!
提问
14
回答
100
被采纳
4
关注TA
发私信
相关问题
1
问个问题,ili9320驱动里面rt_hw_lcd_draw_blit_line 这个函数是干什么用的
2
LCD双缓冲有什么好的办法实现
3
LCD NT35510 驱动代码
4
io设备驱动的疑惑与建议
5
液晶屏驱动 U8g2 移植
6
求助:在模板上添加LCD模块出现L6406E错误
7
hwtimer硬件定时器驱动和使用经验
8
硬件定时器超时时间计算问题
9
请教spi驱动lcd显示屏问题
10
rtt-master(3.1.1)bsp—armfly中drv_lcd.c中是不是错了啊?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
简单两步配置RTT源码阅读环境 vsc+clangd
2
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
3
LVGL使用字库IC芯片显示中文
4
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
5
freemodbus主机在freertos的适配,参考rtthread例程
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部