diff src/cue/cuesheet.c @ 860:cafc7d5769f9 trunk

[svn] - support "Repeat". - fill index of last_cue_tack before activate watchdog thread. - improve handling of last track.
author yaz
date Thu, 15 Mar 2007 04:43:58 -0700
parents 301d03667d2f
children 59a876be8550
line wrap: on
line diff
--- a/src/cue/cuesheet.c	Wed Mar 14 23:50:12 2007 -0700
+++ b/src/cue/cuesheet.c	Thu Mar 15 04:43:58 2007 -0700
@@ -452,6 +452,11 @@
 		else
 			real_ip->plugin->seek(real_ip, finetune_seek ? finetune_seek / 1000 : cue_tracks[track].index / 1000 + 1);
 
+		// in some plugins, NULL as 2nd arg causes crash.
+		real_ip->plugin->get_song_info(cue_file, &dummy, &file_length);
+		g_free(dummy);
+		cue_tracks[last_cue_track].index = file_length;
+
         /* kick watchdog thread */
         g_usleep(TRANSITION_GUARD_TIME);
         g_mutex_lock(cue_mutex);
@@ -461,10 +466,6 @@
 #ifdef DEBUG
         g_print("watchdog activated\n");
 #endif
-		// in some plugins, NULL as 2nd arg causes crash.
-		real_ip->plugin->get_song_info(cue_file, &dummy, &file_length);
-		g_free(dummy);
-		cue_tracks[last_cue_track].index = file_length;
 	}
 
 	finetune_seek = 0;
@@ -578,14 +579,14 @@
             guint pos;
 #ifdef DEBUG
             g_print("i: watchdog next\n");
-            g_print("time = %d cur = %d cidx = %d nidx = %d last = %d\n", time, cur_cue_track,
+            g_print("time = %d cur = %d cidx = %d nidx = %d last = %d lidx = %d\n", time, cur_cue_track,
                     cue_tracks[cur_cue_track].index,
                     cue_tracks[cur_cue_track+1].index,
-                    last_cue_track);
+                    last_cue_track, cue_tracks[last_cue_track].index);
 #endif
             while(time > cue_tracks[cur_cue_track + 1].index) {
                 if(cur_cue_track + 1 == last_cue_track) {
-                    break;
+                    goto END_OF_CUE;
                 }
                 cur_cue_track++;
                 pos = cur_cue_track;
@@ -602,21 +603,29 @@
             }
         }
 
+    END_OF_CUE:
         // end of file
         if (cur_cue_track + 1 == last_cue_track &&
-            cue_tracks[cur_cue_track + 1].index - time < 500) { // difference < 500ms
+            abs(cue_tracks[cur_cue_track + 1].index - time) < 500) { // difference < 500ms
             if(!real_ip->output->buffer_playing()) {
 #ifdef DEBUG
-            g_print("i: watchdog eof reached\n");
+                g_print("i: watchdog eof reached\n");
 #endif
-                exec_thread = g_thread_create(do_stop, (void *)real_ip, FALSE, NULL);
+                if(cfg.repeat) {
+                    guint pos = 0;
+#ifdef DEBUG
+                    g_print("i: watchdog repeat\n");
+#endif
+                    exec_thread = g_thread_create(do_setpos, &pos, FALSE, NULL);
+                }
+                else {
+                    exec_thread = g_thread_create(do_stop, (void *)real_ip, FALSE, NULL);
+                }
             }
         }
-
     }
-
 #ifdef DEBUG
-    g_print("e: watchdog\n");    
+    g_print("e: watchdog\n");
 #endif
     return NULL; // dummy.
 }
@@ -639,7 +648,7 @@
 		cue_tracks[last_cue_track-1].title = NULL;
 	}
 #ifdef DEBUG
-	g_print("last_cue_track = %d\n", last_cue_track);
+	g_print("free_cue_info: last_cue_track = %d\n", last_cue_track);
 #endif
 	last_cue_track = 0;
 }
@@ -659,7 +668,7 @@
 		if (vfs_fgets(line, MAX_CUE_LINE_LENGTH+1, file) == NULL) {
 			vfs_fclose(file);
 			return;
-                }
+        }
 
 		for (p = 0; line[p] && isspace((int) line[p]); p++);
 		if (!line[p])