Added initial Melody Playback Ability
Now, controlled via MQTT a Playback of a melody can Start, Stop, Pause etc. Settings like speed, total duration, pauses etc can be set.
This commit is contained in:
84
PlaybackControls.hpp
Normal file
84
PlaybackControls.hpp
Normal file
@@ -0,0 +1,84 @@
|
||||
#pragma once
|
||||
|
||||
extern melody_attributes melody;
|
||||
|
||||
bool timeToStop(unsigned long now);
|
||||
bool timeToPause(unsigned long now);
|
||||
bool timeToResume(unsigned long now);
|
||||
void durationTimer(void *param);
|
||||
|
||||
// Timer task to control playback state
|
||||
void durationTimer(void *param) {
|
||||
|
||||
// Task Setup
|
||||
|
||||
|
||||
// Task Loop
|
||||
while (true) {
|
||||
|
||||
unsigned long now = millis();
|
||||
|
||||
if (timeToStop(now)) {
|
||||
melody.stop();
|
||||
} else if (timeToPause(now)) {
|
||||
melody.pause();
|
||||
} else if (timeToResume(now)) {
|
||||
melody.unpause();
|
||||
}
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(1000)); // Check every 100ms
|
||||
}
|
||||
}
|
||||
|
||||
// Check if it's time to stop playback
|
||||
bool timeToStop(unsigned long now) {
|
||||
if (melody.isPlaying) {
|
||||
uint64_t stopTime = melody.startTime + melody.duration;
|
||||
if (now >= stopTime) {
|
||||
Serial.println("TIMER: Total Duration Reached");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if it's time to pause playback
|
||||
bool timeToPause(unsigned long now) {
|
||||
if (melody.isPlaying && melody.loop_duration > 0) {
|
||||
uint64_t pauseTimeLimit = melody.loopStartTime + melody.loop_duration;
|
||||
Serial.printf("PTL: %lu // NOW: ",pauseTimeLimit);
|
||||
Serial.println(now);
|
||||
if (now >= pauseTimeLimit && !melody.isPaused) {
|
||||
Serial.println("TIMER: Segment Duration Reached");
|
||||
melody.pauseTime = now;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if it's time to resume playback
|
||||
bool timeToResume(unsigned long now) {
|
||||
if (melody.isPaused) {
|
||||
uint64_t resumeTime = melody.pauseTime + melody.interval;
|
||||
if (now >= resumeTime) {
|
||||
Serial.println("TIMER: Pause Duration Reached");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void handlePlaybackCommands(char * command){
|
||||
Serial.print("INCOMING COMMAND: ");
|
||||
Serial.println(command);
|
||||
if (command[0] == '1') {
|
||||
melody.play();
|
||||
PublishMqtt("OK - PLAY");
|
||||
} else if (command[0] == '0') {
|
||||
melody.forceStop();
|
||||
PublishMqtt("OK - STOP");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user