How to stop MP3 file from playing (pause / rewind button)?
-
Hi,
Can I ask a question?
I want to make an m5stack program that would play an mp3 file if I send a trigger via UDP, and would stop if I send a different trigger via UDP.
I followed some code from:
http://forum.m5stack.com/topic/143/lesson-6-1-speaker-mp3-player/9But when I sent the trigger, the mp3 only played the first second (1s) and kept repeating the same time position. It wouldn't play the entire mp3 song.
This is the code that I used:
#include <M5Stack.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#include "AudioFileSourceSD.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
#define N 1024bool playing = true;
AudioGeneratorMP3 *mp3;
AudioFileSourceSD *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;const char* ssid = "wifiname";
const char* password = "wifipassword";
const int port = 5555;// The udp library class
WiFiUDP udp;void print_wifi_state(){
M5.Lcd.clear(BLACK); // clear LCD
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setCursor(3, 3);
M5.Lcd.println("");
M5.Lcd.println("WiFi connected.");
M5.Lcd.print("IP address: ");
M5.Lcd.println(WiFi.localIP());
M5.Lcd.print("Port: ");
M5.Lcd.println(port);
}void setup_wifi(){
M5.Lcd.setTextColor(RED);
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(3, 10);
M5.Lcd.print("Connecting to ");
M5.Lcd.println(ssid);// setup wifi
WiFi.mode(WIFI_STA); // WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
WiFi.begin(ssid, password);
// WiFi.begin();// Connecting ..
while (WiFi.status() != WL_CONNECTED) {
delay(100);
M5.Lcd.print(".");
}// print state
print_wifi_state();udp.begin(port);
}
void setup() {
M5.begin();
M5.Speaker.setVolume(5);
play('m');
// setup wifi
setup_wifi();}
bool play(char dir){
switch(dir)
{
case 'm':
delete file;
delete out;
delete mp3;
mp3 = NULL;
file = NULL;
out = NULL;
file = new AudioFileSourceSD("/");
id3 = new AudioFileSourceID3(file);
out = new AudioOutputI2S(0, 1);
out->SetOutputModeMono(true);
mp3 = new AudioGeneratorMP3();
mp3->begin(id3, out);
playing = false;
return true;
default:
if(playing){
play('m');
return true;
}
break;
}
mp3->stop();
delete file;
delete out;
delete mp3;
mp3 = NULL;
file = NULL;
out = NULL;
file = new AudioFileSourceSD("/RainDrizzle.mp3");
id3 = new AudioFileSourceID3(file);
id3->seek(trackList->timePos, 1);
out = new AudioOutputI2S(0, 1);
out->SetOutputModeMono(true);
mp3 = new AudioGeneratorMP3();
mp3->begin(id3, out);
playing = true;return true;
}void loop() {
char packetBuffer[N];
int packetSize = udp.parsePacket();// get packet
if (packetSize){int len = udp.read(packetBuffer, packetSize); if (len > 0){ packetBuffer[len] = '\0'; // end }
}
if(strcmp(packetBuffer,"start")==0){ // print param M5.Lcd.clear(BLACK); M5.Lcd.setCursor(3, 3); M5.Lcd.setTextColor(GREEN); M5.Lcd.println(packetBuffer); play('t'); } if(strcmp(packetBuffer,"stop")==0){ M5.Lcd.clear(BLACK); M5.Lcd.setCursor(3, 3); M5.Lcd.setTextColor(GREEN); M5.Lcd.println(packetBuffer); play('m'); } if(playing){ if(mp3->isRunning()){ if(!mp3->loop()){ mp3->stop(); playing = false; } } else{ delay(1000); }
}
M5.update();
}
Please advise if anything's wrong in the code.
Thank you in advance.