70 lines
1.7 KiB
C++
70 lines
1.7 KiB
C++
#pragma once
|
|
|
|
extern Player 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)) {
|
|
player.stop();
|
|
} else if (timeToPause(now)) {
|
|
player.pause();
|
|
} else if (timeToResume(now)) {
|
|
player.unpause();
|
|
}
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(1000)); // Check every 100ms
|
|
}
|
|
}
|
|
|
|
// Check if it's time to stop playback
|
|
bool timeToStop(unsigned long now) {
|
|
if (player.isPlaying) {
|
|
uint64_t stopTime = player.startTime + player.duration;
|
|
if (now >= stopTime) {
|
|
LOG_DEBUG("TIMER: Total Duration Reached");
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Check if it's time to pause playback
|
|
bool timeToPause(unsigned long now) {
|
|
if (player.isPlaying && player.loop_duration > 0) {
|
|
uint64_t pauseTimeLimit = player.loopStartTime + player.loop_duration;
|
|
LOG_DEBUG("PTL: %lu // NOW: %d",pauseTimeLimit, now);
|
|
if (now >= pauseTimeLimit && !player.isPaused) {
|
|
LOG_DEBUG("TIMER: Segment Duration Reached");
|
|
player.pauseTime = now;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Check if it's time to resume playback
|
|
bool timeToResume(unsigned long now) {
|
|
if (player.isPaused) {
|
|
uint64_t resumeTime = player.pauseTime + player.interval;
|
|
if (now >= resumeTime) {
|
|
LOG_DEBUG("TIMER: Pause Duration Reached");
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|