Files
project-vesper/PlaybackControls.hpp
bonamin a33f626dde 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.
2025-01-19 21:15:07 +02:00

85 lines
2.0 KiB
C++

#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");
}
}