0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

RT_THREAD 2021-11-30 15:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

无意中看大官方一个demo,关于audio功能的设计,现在学习一下。
从内部Flash读取WAV音频播放
主要的工作是安装播放器,通过按键控制播放和停止。

1.使能相关组件
需要使用到 Audio 和 dfs 相关的组件

poYBAGGlsHiARX7zAABgA-MjRW0971.pngpYYBAGGlsIqAIH6vAAAjkTyQ7T8342.png

开启 dfs 的时候会默认开启 posix 的使能,需要关闭 posix 的使能,否则终端的输入会有问题。

pYYBAGGlsKOAe6KSAAB-AwiKAJ8060.png

软件包安装
本次实验实现音乐播放功能,单击按键进行音乐切换。需要安装的软件包有 wavplayer/optparse/multibutton 三个软件包。其中 optparse 在 wavplayer 勾选后,自动选择。
进入软件包选择界面。

poYBAGGlsLSAF666AAD5Ap6kKNg960.pngpoYBAGGlsLyAcQ1mAADeuD1G2rM809.png

也可以通过`更多配置`查看所有软件包来选择个软件包:
wavplayer 软件包安装

pYYBAGGlsNOAMDDDAAEaGd2dXkk369.png

multibutton 软件包安装

pYYBAGGlsOSAHACkAABW-otjzFs259.png

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

poYBAGGlsP6AGRjDAAMH157mP-I474.png

下载成功后会在串口界面打印"Hello World", 并会有led灯闪烁

pYYBAGGlsRSAHhcOAAgHXsnHPt8509.png

思考:在这个demo学习过程中,发现了这样几个问题,一些函数看不懂,不知道参数代表的是什么意思。
对于需要配置什么也不是很明白,应该是对thread还不是很明白,不知道哪里有相关的资料可以学习下。
还有就是安装的这些软件包是如何开发的。
因为电脑比较卡,图片使用的是原demo的。实际工程已经测试完。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 音乐播放器
    +关注

    关注

    0

    文章

    71

    浏览量

    16084
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    花椒直播开源鸿蒙专属直播播放器 助力高效开发高性能直播应用

    近日,花椒直播开源了专注于直播场景的播放器“HJPlayer”。它基于自研的通用多媒体框架“HJMedia”打造,与早前开源的推流“HJPusher”共同构成了覆盖主播推流到观众播放的完整客户端
    的头像 发表于 10-22 11:20 196次阅读
    花椒直播开源鸿蒙专属直播<b class='flag-5'>播放器</b> 助力高效开发高性能直播应用

    创通联达助力飞傲M27革新便携HiFi播放器体验

    2025年8月15日,飞傲在第19届深圳国际音频展(SIAS)正式发布年度旗舰播放器FIIO M27。作为基于创通联达TurboX C6490 SOM打造的标杆产品,M27凭借该模块的卓越性能与飞傲自研声学技术形成协同突破,为用户带来全方位、全场景的优秀音频体验,全面革新便携HiFi
    的头像 发表于 08-19 16:15 1576次阅读

    2222#RTT设计大赛 #眼图

    RTT
    jf_34552825
    发布于 :2025年08月11日 11:43:45

    Made with KiCad(135):Echo - 开源的音乐播放器

    “  Echo 是一个开源硬件平台,专为音乐播放器设计。该项目的目标是开发一款基于开源软件并采用开源设计的高品质音乐播放器。 ”   Made with KiCad 系列将支持新的展示
    的头像 发表于 07-16 11:17 2727次阅读
    Made with KiCad(135):Echo - 开源的<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>

    基于STM32的音乐播放器电路+PCB源文件+源码+论文等打包下载

    基于STM32的音乐播放器电路+PCB源文件+源码+论文等打包,推荐下载!
    发表于 05-29 21:37

    dfd#电路知识 #RTT设计大赛

    RTT
    jf_34552825
    发布于 :2025年05月08日 19:50:18

    【开源获奖案例】基于T5L智能屏的音乐播放与歌词显示方案

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的音乐播放与歌词显示方案。该方案通过T5L串口与通用开发板、解码板进行数据交互,将解析完成的音频和歌词通过串口发送给智能屏,实现
    的头像 发表于 05-08 09:52 607次阅读
    【开源获奖案例】基于T5L智能屏的<b class='flag-5'>音乐</b><b class='flag-5'>播放</b>与歌词显示方案

    【开源分享】用ESP32复刻一个iPod :便携式音乐播放器Tangara

    Tangara是一款便携式开源音乐播放器,硬件电路使用KiCad设计,而且它的外壳和固件也是100%开源,点击阅读原文或下载链接可跳转下载。它通过3.5毫米耳机插孔或蓝牙输出高品质声音,电池续航
    的头像 发表于 04-22 08:05 1725次阅读
    【开源分享】用ESP32复刻一个iPod :便携式<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>Tangara

    Made with KiCad:Tangara 便携式音乐播放器

    在操作时提供细腻精准的触感反馈。 若对触摸轮操作存疑,我们的固件支持将其转换为方向键模式:通过长按触发快捷指令实现高效导航。您甚至可完全禁用电容传感功能,仅通过侧边按键完成所有交互操作。 不止于音乐播放器
    发表于 04-16 14:01

    Made with KiCad(120):Tangara 便携式音乐播放器

    “  Tangara 是一款便携式音乐播放器。它可通过 3.5 毫米耳机插孔或蓝牙输出高品质音质,电池续航时间长。 ” Made with KiCad 系列将支持新的展示方式。直接将以下链接复制到
    的头像 发表于 03-21 11:17 953次阅读
    Made with KiCad(120):Tangara 便携式<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>

    海贝HiBy R1播放器体验

    之前分享过用接入便携耳放来提升音质,让手机端也能享受HiFi级的听感体验。这个方案对于没有数码播放器的初烧用户来说,确实是种非常高效的方法。 但缺点也是有的,比如歌曲存放需要占用手机存储空间,手机
    的头像 发表于 01-24 11:27 4674次阅读
    海贝HiBy R1<b class='flag-5'>播放器</b>体验

    云服务 Flexus X 实例,Docker 集成搭建 YesPlayMusic 网易云音乐播放器

    YesPlayMusic 是一款基于 Electron 的开源网易云音乐桌面播放器,以简洁的界面和丰富的功能受到了许多用户的喜爱,特别是对于希望在桌面上享受网易云音乐服务的用户 Docker 安装并
    的头像 发表于 01-13 18:17 1067次阅读
    云服务<b class='flag-5'>器</b> Flexus X 实例,Docker 集成搭建 YesPlayMusic 网易云<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>

    索尼发布空间现实显示播放器新版本

    索尼于2024年12月发布适用于空间现实显示屏ELF-SR1和ELF-SR2的空间现实显示播放器新版本。
    的头像 发表于 12-24 15:19 945次阅读

    毕业设计竞赛选题推荐 | 嵌入式Linux应用之音乐播放器项目实战(含文档及源码)

    01引言随着数字化娱乐日益普及,音乐播放器作为人们生活中不可或缺的一部分,扮演着重要的角色。无论是通勤途中、健身锻炼还是工作学习,一个好用的音乐播放器都能为用户提供愉悦的音频体验,丰富
    的头像 发表于 12-23 16:50 1348次阅读
    毕业设计竞赛选题推荐 | 嵌入式Linux应用之<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>项目实战(含文档及源码)

    海贝R1便携音乐播放器开箱

    作为一个爱听音乐打发时间的玩家,我已经习惯随身携带一款小巧轻便的音乐播放器,从早期的CD播放器到现在的数码播放器,它总能在不经意间中给我带来
    的头像 发表于 12-09 09:40 1979次阅读
    海贝R1便携<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>开箱