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