0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【RTT設(shè)計(jì)大賽】音樂(lè)播放器設(shè)計(jì)完成

RT_THREAD ? 2021-11-30 15:19 ? 次閱讀

無(wú)意中看大官方一個(gè)demo,關(guān)于audio功能的設(shè)計(jì),現(xiàn)在學(xué)習(xí)一下。
從內(nèi)部Flash讀取WAV音頻播放
主要的工作是安裝播放器,通過(guò)按鍵控制播放和停止。

1.使能相關(guān)組件
需要使用到 Audio 和 dfs 相關(guān)的組件

poYBAGGlsHiARX7zAABgA-MjRW0971.pngpYYBAGGlsIqAIH6vAAAjkTyQ7T8342.png

開啟 dfs 的時(shí)候會(huì)默認(rèn)開啟 posix 的使能,需要關(guān)閉 posix 的使能,否則終端的輸入會(huì)有問(wèn)題。

pYYBAGGlsKOAe6KSAAB-AwiKAJ8060.png

軟件包安裝
本次實(shí)驗(yàn)實(shí)現(xiàn)音樂(lè)播放功能,單擊按鍵進(jìn)行音樂(lè)切換。需要安裝的軟件包有 wavplayer/optparse/multibutton 三個(gè)軟件包。其中 optparse 在 wavplayer 勾選后,自動(dòng)選擇。
進(jìn)入軟件包選擇界面。

poYBAGGlsLSAF666AAD5Ap6kKNg960.pngpoYBAGGlsLyAcQ1mAADeuD1G2rM809.png

也可以通過(guò)`更多配置`查看所有軟件包來(lái)選擇個(gè)軟件包:
wavplayer 軟件包安裝

pYYBAGGlsNOAMDDDAAEaGd2dXkk369.png

multibutton 軟件包安裝

pYYBAGGlsOSAHACkAABW-otjzFs259.png

demo編寫
安裝完 wavplayer/optparse/multibutton 三個(gè)軟件包之后,就完成此次試驗(yàn)所需要的依賴的軟件包。接下來(lái)開始編寫demo。
下載 romfs.c(本文件包含了兩個(gè)音頻文件用于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 文件,復(fù)制以下代碼
#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

下載成功后會(huì)在串口界面打印"Hello World", 并會(huì)有l(wèi)ed燈閃爍

pYYBAGGlsRSAHhcOAAgHXsnHPt8509.png

思考:在這個(gè)demo學(xué)習(xí)過(guò)程中,發(fā)現(xiàn)了這樣幾個(gè)問(wèn)題,一些函數(shù)看不懂,不知道參數(shù)代表的是什么意思。
對(duì)于需要配置什么也不是很明白,應(yīng)該是對(duì)thread還不是很明白,不知道哪里有相關(guān)的資料可以學(xué)習(xí)下。
還有就是安裝的這些軟件包是如何開發(fā)的。
因?yàn)?a href="http://www.ttokpm.com/v/tag/1247/" target="_blank">電腦比較卡,圖片使用的是原demo的。實(shí)際工程已經(jīng)測(cè)試完。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 音樂(lè)播放器
    +關(guān)注

    關(guān)注

    0

    文章

    67

    瀏覽量

    15733
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)字播放器和解碼

    數(shù)字播放器和解碼的組合能夠提供更優(yōu)質(zhì)的音頻體驗(yàn)。數(shù)字播放器負(fù)責(zé)處理和傳輸音頻數(shù)據(jù),而解碼則負(fù)責(zé)將這些數(shù)據(jù)轉(zhuǎn)換為高質(zhì)量的模擬信號(hào)。它們的配合可以確保你聽到的音頻既清晰又真實(shí)。
    的頭像 發(fā)表于 09-06 17:35 ?201次閱讀
    數(shù)字<b class='flag-5'>播放器</b>和解碼<b class='flag-5'>器</b>

    串口音樂(lè)播放IC:音樂(lè)播放的新革命

    播放IC是一種集成電路,它能夠通過(guò)串口接口接收音頻數(shù)據(jù),然后通過(guò)內(nèi)部的解碼將數(shù)字音頻信號(hào)轉(zhuǎn)換為模擬音頻信號(hào),從而驅(qū)動(dòng)揚(yáng)聲發(fā)出聲音。這種技術(shù)相較于傳統(tǒng)的音樂(lè)
    的頭像 發(fā)表于 05-06 14:32 ?406次閱讀

    HarmonyOS開發(fā)案例:【視頻播放器

    使用ArkTS語(yǔ)言實(shí)現(xiàn)視頻播放器,主要包括主頁(yè)面和視頻播放頁(yè)面
    的頭像 發(fā)表于 04-24 14:52 ?648次閱讀
    HarmonyOS開發(fā)案例:【視頻<b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【視頻播放器

    使用ArkTS語(yǔ)言實(shí)現(xiàn)視頻播放器,主要包括主界面和視頻播放界面,
    的頭像 發(fā)表于 04-23 17:25 ?472次閱讀
    HarmonyOS開發(fā)案例:【視頻<b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【音樂(lè)播放器

    使用ArkTS語(yǔ)言實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的音樂(lè)播放器應(yīng)用
    的頭像 發(fā)表于 04-23 15:44 ?679次閱讀
    HarmonyOS開發(fā)案例:【<b class='flag-5'>音樂(lè)</b><b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【視頻播放器

    基于video、swiper和slider組件,實(shí)現(xiàn)簡(jiǎn)單的視頻播放器,可支持海報(bào)輪播、視頻播放等功能。
    的頭像 發(fā)表于 04-22 21:06 ?315次閱讀
    HarmonyOS開發(fā)案例:【視頻<b class='flag-5'>播放器</b>】

    鴻蒙HarmonyOS開發(fā)實(shí)戰(zhàn):【分布式音樂(lè)播放

    本示例使用fileIo獲取指定音頻文件,并通過(guò)AudioPlayer完成音樂(lè)播放完成了基本的音樂(lè)播放、暫停、上一曲、下一曲功能;并使用D
    的頭像 發(fā)表于 04-10 17:51 ?686次閱讀
    鴻蒙HarmonyOS開發(fā)實(shí)戰(zhàn):【分布式<b class='flag-5'>音樂(lè)</b><b class='flag-5'>播放</b>】

    用STM32F105的USB做了一個(gè)讀U盤MP3的播放器,為什么聽到的音樂(lè)播放速度很快?

    最近用STM32F105的USB做了一個(gè)讀U盤MP3的播放器,使用I2S2_DMA輸出音頻數(shù)據(jù),再使用TAS5711數(shù)字功放進(jìn)行輸出聲音。讀出文件的采樣為44.1khz, I2S也設(shè)置為此采樣率。不知為何,聽到的音樂(lè)播放速度很快
    發(fā)表于 04-02 06:52

    車載播放器怎么選擇格式

    :MP3是目前最常見和廣泛支持的音頻格式之一。它可以提供良好的音質(zhì),并且具有較小的文件大小。由于大多數(shù)音樂(lè)都是以MP3格式存儲(chǔ)在設(shè)備中的,所以選擇支持MP3格式的車載播放器是首選。 AAC:AAC是一種高級(jí)音頻編碼格式,也是用于音頻傳輸和
    的頭像 發(fā)表于 01-05 16:36 ?1354次閱讀

    基于FPGA的音頻播放器設(shè)計(jì)

    主要是音頻播放器設(shè)計(jì)不太會(huì),想問(wèn)各位大神怎么樣可以實(shí)現(xiàn)用verilog語(yǔ)言實(shí)現(xiàn)音頻播放,通過(guò)串口輸出
    發(fā)表于 01-03 13:54

    Arduino做個(gè)觸摸屏音樂(lè)播放器使用什么解碼模塊支持格式多?

    Arduino做個(gè)觸摸屏音樂(lè)播放器使用什么解碼模塊支持格式多
    發(fā)表于 11-10 07:10

    基于Cortex M3的音頻播放器的設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于Cortex M3的音頻播放器的設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 11-07 08:31 ?0次下載
    基于Cortex M3的音頻<b class='flag-5'>播放器</b>的設(shè)計(jì)

    音樂(lè)播放芯片的聲音原理

    聲音的質(zhì)量和效果不僅僅取決于音樂(lè)播放芯片的性能,還受到其他因素的影響,如揚(yáng)聲的品質(zhì)、音頻放大器的能力、播放環(huán)境等。因此,在設(shè)計(jì)和選擇音樂(lè)
    的頭像 發(fā)表于 10-30 16:10 ?843次閱讀

    MP3播放器解碼功能的實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《MP3播放器解碼功能的實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 10-25 11:01 ?0次下載
    MP3<b class='flag-5'>播放器</b>解碼功能的實(shí)現(xiàn)

    基于51單片機(jī)音樂(lè)噴泉設(shè)計(jì)頻譜彩燈音樂(lè)播放器源代碼分享

    基于51單片機(jī)音樂(lè)噴泉設(shè)計(jì)頻譜彩燈音樂(lè)播放器源代碼
    發(fā)表于 09-26 07:16