168 lines
3.6 KiB
C++
168 lines
3.6 KiB
C++
#ifndef __mp3_H__
|
|
#define __mp3_H__
|
|
|
|
#include "SerialMP3Player.h"
|
|
|
|
class mp3
|
|
{
|
|
private:
|
|
const byte FADESTEP_WITH = 5;
|
|
const char* STARTED_STRING = "Status: playing";
|
|
const char* STOPPED_STRING = "Status: stopped";
|
|
|
|
SerialMP3Player *player;
|
|
size_t _rx_pin,_tx_pin;
|
|
unsigned long _play_since_ms = 0;
|
|
|
|
const byte _MAX_FADE_STEP = 255;
|
|
const byte _MIN_FADE_STEP = 0;
|
|
byte _current_max_fade_step;
|
|
byte _current_min_fade_step;
|
|
static const unsigned long _FADE_DELAY_MS = 10;
|
|
|
|
byte _fade_step;
|
|
unsigned long _last_faded_ms;
|
|
unsigned long _delay_ms;
|
|
|
|
bool _fade(bool fade_up);
|
|
void _vol(byte val);
|
|
|
|
public:
|
|
mp3(size_t rx_pin, size_t tx_pin);
|
|
~mp3();
|
|
void stop();
|
|
bool fade_out();
|
|
bool fade_in();
|
|
void play(size_t nr);
|
|
unsigned long is_playing();
|
|
void begin(byte vol=30);
|
|
void play_vol(size_t nr, byte vol);
|
|
void vol(byte val);
|
|
};
|
|
|
|
mp3::mp3(size_t rx_pin, size_t tx_pin)
|
|
{
|
|
_rx_pin = rx_pin;
|
|
_tx_pin = tx_pin;
|
|
player = new SerialMP3Player(_rx_pin, _tx_pin);
|
|
_fade_step = 0;
|
|
_last_faded_ms = 0;
|
|
_delay_ms = _FADE_DELAY_MS;
|
|
_current_max_fade_step = _MAX_FADE_STEP;
|
|
_current_min_fade_step = _MIN_FADE_STEP;
|
|
}
|
|
|
|
mp3::~mp3()
|
|
{
|
|
}
|
|
|
|
void mp3::begin(byte vol)
|
|
{
|
|
_current_max_fade_step = vol;
|
|
player->begin(9600);
|
|
delay(500);
|
|
player->sendCommand(CMD_SEL_DEV, 0, 2); //select sd-card
|
|
delay(500);
|
|
player->setVol(vol);
|
|
}
|
|
|
|
void mp3::play_vol(size_t nr, byte vol)
|
|
{
|
|
_current_max_fade_step = vol;
|
|
_vol(vol);
|
|
player->play(nr);
|
|
_play_since_ms = millis();
|
|
}
|
|
|
|
|
|
void mp3::play(size_t nr)
|
|
{
|
|
player->playSL(nr);
|
|
_play_since_ms = millis();
|
|
}
|
|
|
|
void mp3::vol(byte val)
|
|
{
|
|
_current_max_fade_step = val;
|
|
_vol(val);
|
|
}
|
|
|
|
void mp3::_vol(byte val)
|
|
{
|
|
_fade_step = val;
|
|
Serial.printf("MP3 players volume set to %d.\n", val);
|
|
player->setVol(val);
|
|
}
|
|
|
|
|
|
unsigned long mp3::is_playing()
|
|
{
|
|
player->qStatus();
|
|
if (player->available()){
|
|
String answer = player->decodeMP3Answer();
|
|
if(answer.indexOf(STARTED_STRING) > -1)
|
|
{
|
|
//return(millis() - _play_since_ms);
|
|
return 1;
|
|
}
|
|
}
|
|
Serial.printf("MP3 Player is not playing\n");
|
|
return 0;
|
|
}
|
|
|
|
void mp3::stop()
|
|
{
|
|
player->stop();
|
|
}
|
|
|
|
|
|
bool mp3::_fade(bool fade_up)
|
|
{
|
|
if(millis() - _last_faded_ms > _delay_ms)
|
|
{
|
|
_last_faded_ms = millis();
|
|
if(true == fade_up)
|
|
{
|
|
if(_current_max_fade_step > _fade_step)
|
|
{
|
|
if(_fade_step + FADESTEP_WITH > _current_max_fade_step)
|
|
_fade_step = _current_max_fade_step;
|
|
else
|
|
_fade_step = FADESTEP_WITH + _fade_step;
|
|
_fade_step = _fade_step + FADESTEP_WITH;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
if(_current_min_fade_step < _fade_step)
|
|
if(_fade_step - FADESTEP_WITH < _current_min_fade_step)
|
|
_fade_step = _current_min_fade_step;
|
|
else
|
|
_fade_step = _fade_step - FADESTEP_WITH;
|
|
else
|
|
return false;
|
|
}
|
|
_vol(_fade_step);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool mp3::fade_out()
|
|
{
|
|
if(_fade(false) == true)
|
|
return(true);
|
|
else
|
|
{
|
|
player->stop();
|
|
return(false);
|
|
}
|
|
}
|
|
|
|
bool mp3::fade_in()
|
|
{
|
|
return(_fade(true));
|
|
}
|
|
|
|
#endif
|