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.