Compare commits
5 Commits
fbb800c472
...
63eb980c32
| Author | SHA1 | Date | |
|---|---|---|---|
| 63eb980c32 | |||
| a8837a4598 | |||
| 97c52fe8f3 | |||
| e8550cc2a5 | |||
| c6134af272 |
@ -36,7 +36,7 @@ MP3DecoderHelix mp3Decoder;
|
|||||||
|
|
||||||
EncodedAudioStream mp3Stream(&board, &mp3Decoder);
|
EncodedAudioStream mp3Stream(&board, &mp3Decoder);
|
||||||
|
|
||||||
StreamCopy copier;
|
StreamCopy mp3Copier;
|
||||||
|
|
||||||
bool running = false;
|
bool running = false;
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ void audioStop() {
|
|||||||
Serial.println("[AUDIO ] STOP");
|
Serial.println("[AUDIO ] STOP");
|
||||||
}
|
}
|
||||||
copyErrors = 0;
|
copyErrors = 0;
|
||||||
copier.end();
|
mp3Copier.end();
|
||||||
mp3Stream.end();
|
mp3Stream.end();
|
||||||
mp3Decoder.end();
|
mp3Decoder.end();
|
||||||
opusDecoder.end();
|
opusDecoder.end();
|
||||||
@ -58,12 +58,12 @@ void audioStop() {
|
|||||||
bool audioPlayInit(const Entry &entry) {
|
bool audioPlayInit(const Entry &entry) {
|
||||||
audioStop();
|
audioStop();
|
||||||
|
|
||||||
Serial.printf("[AUDIO ] [%-4s] Start: %s\n", entry.type.c_str(), entry.url.c_str());
|
Serial.printf("[AUDIO ] [%s] Opening: %s\n", entry.type.c_str(), entry.url.c_str());
|
||||||
running = true;
|
running = true;
|
||||||
|
|
||||||
if (entry.type == "ICY" || entry.type == "SNAP") {
|
if (entry.type == "ICY" || entry.type == "SNAP") {
|
||||||
if (!isWifiConnected()) {
|
if (!isWifiConnected()) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] WiFi not connected.\n", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] WiFi not connected.\n", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -71,7 +71,7 @@ bool audioPlayInit(const Entry &entry) {
|
|||||||
|
|
||||||
if (entry.type == "SD") {
|
if (entry.type == "SD") {
|
||||||
if (!SD.begin(PIN_AUDIO_KIT_SD_CARD_CS)) {
|
if (!SD.begin(PIN_AUDIO_KIT_SD_CARD_CS)) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to mount SD-card.\n", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to mount SD-card.\n", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -82,25 +82,26 @@ bool audioPlayInit(const Entry &entry) {
|
|||||||
|
|
||||||
bool audioBeginMP3Stream(const Entry &entry, Stream &source) {
|
bool audioBeginMP3Stream(const Entry &entry, Stream &source) {
|
||||||
if (!mp3Decoder.begin()) {
|
if (!mp3Decoder.begin()) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to start MP3DecoderHelix.", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to start MP3DecoderHelix.", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mp3Stream.begin()) {
|
if (!mp3Stream.begin()) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to start EncodedAudioStream.", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to start EncodedAudioStream.", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
copier.begin(mp3Stream, source);
|
mp3Copier.begin(mp3Stream, source);
|
||||||
|
|
||||||
if (copier.copy() == 0) {
|
if (mp3Copier.copy() == 0) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to copy initial data.", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to copy initial data.", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Serial.printf("[AUDIO ] [%s] Stream running.\n", entry.type.c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +111,7 @@ bool audioPlayICY(const Entry &entry) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!icy.begin(entry.url.c_str())) {
|
if (!icy.begin(entry.url.c_str())) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to start ICYStream.\n", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to start ICYStream.\n", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -125,30 +126,31 @@ bool audioPlaySNAP(const Entry &entry) {
|
|||||||
|
|
||||||
IPAddress ip;
|
IPAddress ip;
|
||||||
if (!WiFiClass::hostByName(entry.url.c_str(), ip)) {
|
if (!WiFiClass::hostByName(entry.url.c_str(), ip)) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to resolve host.\n", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to resolve host.\n", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
snap.setServerIP(ip);
|
snap.setServerIP(ip);
|
||||||
if (!snap.begin()) {
|
if (!snap.begin()) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to connect.\n", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to connect.\n", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!opusDecoder.begin()) {
|
if (!opusDecoder.begin()) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to start OpusAudioDecoder.\n", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to start OpusAudioDecoder.\n", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!snap.doLoop()) {
|
if (!snap.doLoop()) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to copy initial data.\n", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to copy initial data.\n", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Serial.printf("[AUDIO ] [%s] Stream running.\n", entry.type.c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,14 +160,14 @@ bool audioPlaySD(const Entry &entry) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!SD.exists(entry.url.c_str())) {
|
if (!SD.exists(entry.url.c_str())) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] File not found.\n", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] File not found.\n", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
file = SD.open(entry.url.c_str(), FILE_READ);
|
file = SD.open(entry.url.c_str(), FILE_READ);
|
||||||
if (!file) {
|
if (!file) {
|
||||||
Serial.printf("[AUDIO ] [%-4s] Failed to open file.\n", entry.type.c_str());
|
Serial.printf("[AUDIO ] [%s] Failed to open file.\n", entry.type.c_str());
|
||||||
audioStop();
|
audioStop();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -210,12 +212,15 @@ bool audioLoop() {
|
|||||||
board.setMute(audioMute);
|
board.setMute(audioMute);
|
||||||
stateBufferUpdateRequest();
|
stateBufferUpdateRequest();
|
||||||
}
|
}
|
||||||
if (copier.copy() > 0) {
|
|
||||||
|
// TODO check snap too
|
||||||
|
if (mp3Copier.copy() > 0 || mp3Stream.availableForWrite() > 0) {
|
||||||
copyErrors = 0;
|
copyErrors = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (running) {
|
if (running) {
|
||||||
copyErrors++;
|
copyErrors = 100;
|
||||||
if (copyErrors < 100) {
|
if (copyErrors < 100) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
18
src/http.cpp
18
src/http.cpp
@ -79,6 +79,24 @@ void httpSetup() {
|
|||||||
playerSkip -= 1;
|
playerSkip -= 1;
|
||||||
request->send(200);
|
request->send(200);
|
||||||
});
|
});
|
||||||
|
server.on("/repeatOne", [](AsyncWebServerRequest *request) {
|
||||||
|
Serial.println("[HTTP ] " + request->url());
|
||||||
|
playlistRepeatOne = !playlistRepeatOne;
|
||||||
|
stateBufferUpdateRequest();
|
||||||
|
request->send(200);
|
||||||
|
});
|
||||||
|
server.on("/repeatAll", [](AsyncWebServerRequest *request) {
|
||||||
|
Serial.println("[HTTP ] " + request->url());
|
||||||
|
playlistRepeatAll = !playlistRepeatAll;
|
||||||
|
stateBufferUpdateRequest();
|
||||||
|
request->send(200);
|
||||||
|
});
|
||||||
|
server.on("/random", [](AsyncWebServerRequest *request) {
|
||||||
|
Serial.println("[HTTP ] " + request->url());
|
||||||
|
playlistRandom = !playlistRandom;
|
||||||
|
stateBufferUpdateRequest();
|
||||||
|
request->send(200);
|
||||||
|
});
|
||||||
ws.onEvent(onWebSocketEvent);
|
ws.onEvent(onWebSocketEvent);
|
||||||
server.addHandler(&ws);
|
server.addHandler(&ws);
|
||||||
server.begin();
|
server.begin();
|
||||||
|
|||||||
@ -105,6 +105,9 @@ Entry playlistCurrent() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Entry playlistNext(const int amount) {
|
Entry playlistNext(const int amount) {
|
||||||
|
if (playlistRandom) {
|
||||||
|
return playlistSet(random(static_cast<long>(playlistEntries.size())));
|
||||||
|
}
|
||||||
if (amount < 0 && playlistIndex <= 0 && !playlistRepeatAll) {
|
if (amount < 0 && playlistIndex <= 0 && !playlistRepeatAll) {
|
||||||
return Entry();
|
return Entry();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,12 @@
|
|||||||
|
|
||||||
#include "Entry.h"
|
#include "Entry.h"
|
||||||
|
|
||||||
|
extern bool playlistRepeatOne;
|
||||||
|
|
||||||
|
extern bool playlistRepeatAll;
|
||||||
|
|
||||||
|
extern bool playlistRandom;
|
||||||
|
|
||||||
void playlistClear();
|
void playlistClear();
|
||||||
|
|
||||||
void playlistAdd(String entry);
|
void playlistAdd(String entry);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user