@@ -90,10 +90,13 @@ void FSEQPlayer::processFrameData() {
9090bool FSEQPlayer::stopBecauseAtTheEnd () {
9191 if (!recordingFile.available ()) {
9292 if (recordingRepeats == RECORDING_REPEAT_LOOP) {
93+ // Reset file pointer and frame counter for continuous loop
9394 recordingFile.seek (0 );
95+ frame = 0 ;
9496 } else if (recordingRepeats > 0 ) {
9597 recordingFile.seek (0 );
9698 recordingRepeats--;
99+ frame = 0 ;
97100 DEBUG_PRINTF (" Repeat recording again for: %d\n " , recordingRepeats);
98101 } else {
99102 DEBUG_PRINTLN (" Finished playing recording, disabling realtime mode" );
@@ -187,7 +190,12 @@ void FSEQPlayer::loadRecording(const char* filepath, uint16_t startLed, uint16_t
187190 if (frame >= file_header.frame_count ) {
188191 frame = file_header.frame_count - 1 ;
189192 }
190- recordingRepeats = RECORDING_REPEAT_DEFAULT;
193+ // Set loop mode if secondsElapsed is exactly 1.0f
194+ if (secondsElapsed == 1 .0f ) {
195+ recordingRepeats = RECORDING_REPEAT_LOOP;
196+ } else {
197+ recordingRepeats = RECORDING_REPEAT_DEFAULT;
198+ }
191199 playNextRecordingFrame ();
192200}
193201
@@ -198,29 +206,28 @@ void FSEQPlayer::clearLastPlayback() {
198206 frame = 0 ;
199207}
200208
209+ bool FSEQPlayer::isPlaying () {
210+ return recordingFile && recordingFile.available ();
211+ }
201212
202- bool FSEQPlayer::isPlaying () {
203- return recordingFile && recordingFile.available ();
213+ void FSEQPlayer::syncPlayback (float secondsElapsed) {
214+ if (!isPlaying ()) {
215+ DEBUG_PRINTLN (" [FSEQ] Sync: Playback not active, cannot sync." );
216+ return ;
204217 }
205218
206- void FSEQPlayer::syncPlayback (float secondsElapsed) {
207- if (!isPlaying ()) {
208- DEBUG_PRINTLN (" [FSEQ] Sync: Playback not active, cannot sync." );
209- return ;
210- }
211-
212- uint32_t expectedFrame = (uint32_t )((secondsElapsed * 1000 .0f ) / file_header.step_time );
213- int32_t diff = (int32_t )expectedFrame - (int32_t )frame;
214-
215- if (abs (diff) > 2 ) {
216- frame = expectedFrame;
217- uint32_t offset = file_header.channel_data_offset + file_header.channel_count * frame;
218- if (recordingFile.seek (offset)) {
219- DEBUG_PRINTF (" [FSEQ] Sync: Adjusted frame to %lu (diff=%ld)\n " , expectedFrame, diff);
220- } else {
221- DEBUG_PRINTLN (" [FSEQ] Sync: Failed to seek to new frame" );
222- }
219+ uint32_t expectedFrame = (uint32_t )((secondsElapsed * 1000 .0f ) / file_header.step_time );
220+ int32_t diff = (int32_t )expectedFrame - (int32_t )frame;
221+
222+ if (abs (diff) > 2 ) {
223+ frame = expectedFrame;
224+ uint32_t offset = file_header.channel_data_offset + file_header.channel_count * frame;
225+ if (recordingFile.seek (offset)) {
226+ DEBUG_PRINTF (" [FSEQ] Sync: Adjusted frame to %lu (diff=%ld)\n " , expectedFrame, diff);
223227 } else {
224- DEBUG_PRINTF (" [FSEQ] Sync: No adjustment needed (current frame: %lu, expected: %lu) \n " , frame, expectedFrame );
228+ DEBUG_PRINTLN (" [FSEQ] Sync: Failed to seek to new frame" );
225229 }
226- }
230+ } else {
231+ DEBUG_PRINTF (" [FSEQ] Sync: No adjustment needed (current frame: %lu, expected: %lu)\n " , frame, expectedFrame);
232+ }
233+ }
0 commit comments