C
Hi @Dimi, thanks for the amazing tutorial.
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 of your code.
But when I sent the trigger, the mp3 only played the first second 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 1024
bool 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();
}
Thank you in advance.