2015/03/19

LinkIt ONE:播放MP3

LinkIt ONE可播放MP3/AAC/AMR格式的音訊檔,這篇要把MP3檔放在Micro SD卡裡,撰寫簡易的播放功能,透過序列埠控制。

首先準備幾支MP3歌曲檔,放進Micro SD卡裡,可直接使用一般的讀卡機,或是把LinkIt ONE板子上的三個指撥開關切換到正確位置,便可作為類似於隨身碟/記憶卡的裝置使用,請把1切到SD,2切到MS,連接電腦後,可看到兩台可卸除式磁碟機,其中一台代表板子內部Flash,另一台就是Micro SD記憶卡。各指撥開關的意義請參閱「LinkIt ONE:安裝軟體開發環境

我在Micro SD卡中新增目錄mp3,並把歌曲放進去。此篇只使用英文檔名。
然後把指撥開關2撥回UART,而1維持SD不變。程式碼如下:

#include <LSD.h>
#include <LAudio.h>
#define BAUDRATE 19200

LFile dir; // 此物件代表子目錄mp3

unsigned char vol = 6; // 音量,0到6(最大聲)

// 此函式可取得下一首歌曲的路徑,如果副檔名是.mp3的話
String get_next(){
  LFile f = dir.openNextFile(FILE_READ);
  String song = String("\\mp3\\") + f.name();
  while(!song.endsWith(String(".mp3"))){
    f.close();
    f = dir.openNextFile(FILE_READ);
    song = String("\\mp3\\") + f.name();
  }
  f.close();
  return song;
}


void setup(){
  Serial.begin(BAUDRATE);
 
  LAudio.begin(); // 初始化
  LAudio.setVolume(vol); // 設定音量
 
  LSD.begin();
  dir = LSD.open("mp3", FILE_READ);
  String song = get_next();

  // 取得第一首歌,並播放
  LAudio.playFile(storageSD, (char *)song.c_str());
  Serial.println(song.c_str());
}

// 增減音量,界限是0~6
void vol_inc(unsigned char n){
  vol += n;
  if(vol > 6){
    vol = 6;
  }
  if(vol < 0){
    vol = 0;
  }
  LAudio.setVolume(vol);
}


void loop(){
  String song;
  while(Serial.available()){
    char c = Serial.read();
// 從序列埠接收控制字元,
    switch(c){
      case 'p': // p代表播放下一首
        song = get_next();
        LAudio.playFile(storageSD, (char *)song.c_str());
        Serial.println(song.c_str());
      break;
      case 's': // s代表停止
        LAudio.stop();
      break;
      case 'r': // r代表重置
        LAudio.stop();
        dir.rewindDirectory();
      break;
      case '+': // +代表增大音量
        vol_inc(1);
      break;
      case '-': // -代表減小音量
        vol_inc(-1);
      break;
    }
  }
}


然後便可從板子的耳機插槽聆聽音樂,開啟序列埠監控視窗,傳出p、s、r、+、-來控制。

3 comments:

  1. 發現一個小小的問題,一直按-降低音量,但降到0以後又會變大聲:
    好像是因為n定義為unsigned,所以if(vol < 0)永不成立。

    ReplyDelete
    Replies
    1. 啊,被你發現了。:D
      謝謝。

      Delete