無意中看大官方一個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的。實際工程已經測試完。
-
音樂播放器
+關注
關注
0文章
68瀏覽量
15803
發布評論請先 登錄
相關推薦
評論