【RTT设计大赛】音乐播放器设计完成

无意中看大官方一个demo,关于audio功能的设计,现在学习一下。
从内部flash读取wav音频播放
主要的工作是安装播放器,通过按键控制播放和停止。
1.使能相关组件
需要使用到 audio 和 dfs 相关的组件
开启 dfs 的时候会默认开启 posix 的使能,需要 关闭 posix 的使能 ,否则终端的输入会有问题。
软件包安装
本次实验实现音乐播放功能,单击按键进行音乐切换。需要安装的软件包有 wavplayer/optparse/multibutton 三个软件包。其中 optparse 在 wavplayer 勾选后,自动选择。
进入软件包选择界面。
也可以通过`更多配置`查看所有软件包来选择个软件包:
wavplayer 软件包安装
multibutton 软件包安装
demo编写
安装完 wavplayer/optparse/multibutton 三个软件包之后,就完成此次试验所需要的依赖的软件包。接下来开始编写demo。
下载 romfs.c(本文件包含了两个音频文件用于demo播放) 放置到 applications 下
romfs.c
下载 mnt.c 替换 applications 下原有的文件,从而挂载 romfs,主要代码在下方
mnt.c
#include #include dfs_romfs.h
int ab32_romfs_mount(void){
   if (dfs_mount(rt_null, /, rom, 0, &(romfs_root)) == 0)
   {
       rt_kprintf(rom file system initializated!\n);
   }
   else
   {
       rt_kprintf(rom file system initializate failed!\n);
   }
   return 0;}init_env_export(ab32_romfs_mount);
然后在 applications 下新建 event_async.c 文件,复制以下代码
#include #include #include board.h#include #include wavplayer.h
#define button_pin_0 rt_pin_get(pf.0)#define button_pin_1 rt_pin_get(pf.1)
#define num_of_songs    (2u)
static struct button btn_0;static struct button btn_1;
static uint32_t cnt_0 = 0;static uint32_t cnt_1 = 0;
static char *table[2] ={
   wav_1.wav,
   wav_2.wav,};
void saia_channels_set(uint8_t channels);void saia_volume_set(rt_uint8_t volume);uint8_t saia_volume_get(void);
static uint8_t button_read_pin_0(void){
   return rt_pin_read(button_pin_0);}
static uint8_t button_read_pin_1(void){
   return rt_pin_read(button_pin_1);}
static void button_0_callback(void *btn){
   uint32_t btn_event_val;
   btn_event_val = get_button_event((struct button *)btn);
   switch(btn_event_val)
   {
   case single_click:
       if (cnt_0 == 1) {
           saia_volume_set(30);
       }else if (cnt_0 == 2) {
           saia_volume_set(50);
       }else {
           saia_volume_set(100);
           cnt_0 = 0;
       }
       cnt_0++;
       rt_kprintf(vol=%d\n, saia_volume_get());
       rt_kprintf(button 0 single click\n);
   break;
   case double_click:
       if (cnt_0 == 1) {
           saia_channels_set(1);
       }else {
           saia_channels_set(2);
           cnt_0 = 0;
       }
       cnt_0++;
       rt_kprintf(button 0 double click\n);
   break;
   case long_press_start:
       rt_kprintf(button 0 long press start\n);
   break;
   case long_press_hold:
       rt_kprintf(button 0 long press hold\n);
   break;
   }}
static void button_1_callback(void *btn){
   uint32_t btn_event_val;
   btn_event_val = get_button_event((struct button *)btn);
   switch(btn_event_val)
   {
   case single_click:
       wavplayer_play(table[(cnt_1++) % num_of_songs]);
       rt_kprintf(button 1 single click\n);
   break;
   case double_click:
       rt_kprintf(button 1 double click\n);
   break;
   case long_press_start:
       rt_kprintf(button 1 long press start\n);
   break;
   case long_press_hold:
       rt_kprintf(button 1 long press hold\n);
   break;
   }}
static void btn_thread_entry(void* p){
   while(1)
   {
       /* 5ms */
       rt_thread_delay(rt_tick_per_second/200);
       button_ticks();
   }}
static int multi_button_test(void){
   rt_thread_t thread = rt_null;
   /* create background ticks thread */
   thread = rt_thread_create(btn, btn_thread_entry, rt_null, 1024, 10, 10);
   if(thread == rt_null)
   {
       return rt_error;
   }
   rt_thread_startup(thread);
   /* low level drive */
   rt_pin_mode  (button_pin_0, pin_mode_input_pullup);
   button_init  (&btn_0, button_read_pin_0, pin_low);
   button_attach(&btn_0, single_click,     button_0_callback);
   button_attach(&btn_0, double_click,     button_0_callback);
   button_attach(&btn_0, long_press_start, button_0_callback);
   button_attach(&btn_0, long_press_hold,  button_0_callback);
   button_start (&btn_0);
   rt_pin_mode  (button_pin_1, pin_mode_input_pullup);
   button_init  (&btn_1, button_read_pin_1, pin_low);
   button_attach(&btn_1, single_click,     button_1_callback);
   button_attach(&btn_1, double_click,     button_1_callback);
   button_attach(&btn_1, long_press_start, button_1_callback);
   button_attach(&btn_1, long_press_hold,  button_1_callback);
   button_start (&btn_1);
   return rt_eok;}init_app_export(multi_button_test);
程序下载
demo编写完成后,单击编译按钮开始编译,编译成功后下载编译后生成的 .dcf 固件到芯片;
双击打开 downloader  
下载成功后会在串口界面打印hello world, 并会有led灯闪烁
思考:在这个demo学习过程中,发现了这样几个问题,一些函数看不懂,不知道参数代表的是什么意思。
对于需要配置什么也不是很明白,应该是对thread还不是很明白,不知道哪里有相关的资料可以学习下。
还有就是安装的这些软件包是如何开发的。
因为电脑比较卡,图片使用的是原demo的。实际工程已经测试完。

如何实现PXIe/PXI机箱的散热设计
区块链技术可以让公众更好地控制他们的个人数据
电信运营商鼓励用户尽早换成4G手机的最有效办法就是回收旧手机
对称多谐振荡器负电源解决方案
橙群微电子在Sensors Converge 2023 show大放异彩
【RTT设计大赛】音乐播放器设计完成
华为MateXs全面评测:屏幕外翻折设计新体验
灵动微电子生态系统入选“Top 50国产MCU厂商”榜单
中国新能源大会暨产业博览会倒计时4天!长沙 ,我们来了!
防晒遮阳哪家强,快来看看遮阳帽品牌排行榜
浪潮信息以存储筑基 释放数据之力 提速智慧医疗
基于STM32单片机的行李箱系统设计
联想“端-边-云-网-智”技术架构推动经济转型升级和高质量发展
地下室新风除湿一体机怎么选?松下新风空气消毒机功能更全面
汽油动力土壤采样器的用途、特点及参数
智能手机的“退化”背后是何逻辑?
智能单品并不是智能家居,智能家居为何会“智能”
流媒体音乐将给索尼带来创纪录收入,仅次于核心 PS 游戏业务
提高电路板EMC能力PCB设计和布线方法
2022深圳国际全触与显示展锚定行业新未来,与市场同频共振