# HG changeset patch # User nenolod # Date 1154589176 25200 # Node ID 825349772a96cfaf60d40a3e4688a81093e0477f # Parent b5318012eb1bc50865f6b08634d39842abfc3d75 [svn] - a little more fault tolerance (stick a fork in it, it's done) diff -r b5318012eb1b -r 825349772a96 ChangeLog --- a/ChangeLog Wed Aug 02 23:44:16 2006 -0700 +++ b/ChangeLog Thu Aug 03 00:12:56 2006 -0700 @@ -1,3 +1,12 @@ +2006-08-03 06:44:16 +0000 William Pitcock + revision [1870] + - well not exactly, but this is :) + + + Changes: Modified: + +2 -2 trunk/Plugins/Input/cue/cuesheet.c + + 2006-08-03 06:42:10 +0000 William Pitcock revision [1868] - the other half of the equasion wrt seeking diff -r b5318012eb1b -r 825349772a96 Plugins/Input/cue/cuesheet.c --- a/Plugins/Input/cue/cuesheet.c Wed Aug 02 23:44:16 2006 -0700 +++ b/Plugins/Input/cue/cuesheet.c Thu Aug 03 00:12:56 2006 -0700 @@ -51,6 +51,7 @@ } cue_tracks[MAX_CUE_TRACKS]; static gint timeout_tag = 0; static gint finetune_seek = 0; +static gint pl_seek = 0; static InputPlugin *real_ip = NULL; @@ -197,6 +198,8 @@ { if (real_ip != NULL) real_ip->seek(time); + + pl_seek = time; } static void stop(void) @@ -256,7 +259,6 @@ else { real_ip->seek(finetune_seek / 1000); - finetune_seek = 0; } } @@ -273,26 +275,55 @@ /******************************************************* watchdog */ +/* + * This is fairly hard to explain. + * + * Basically we loop until we have reached the correct track. + * Then we set a finetune adjustment to make sure we stay in the + * right place. + * + * I used to recurse here (it was prettier), but that didn't work + * as well as I was hoping. + * + * Anyhow, yeah. The logic here isn't great, but it works, so I'm + * cool with it. + * + * - nenolod + */ static gint watchdog_func(gpointer unused) { gint time = get_output_time(); + gboolean dir = FALSE; - /* recurse until we're in the basically right place. */ - if (time < cue_tracks[cur_cue_track].index) + if (finetune_seek != 0) + { + if (real_ip != NULL) + real_ip->seek(finetune_seek / 1000); + + finetune_seek = 0; + } + + while (time < cue_tracks[cur_cue_track].index) { cur_cue_track--; playlist_prev(); - watchdog_func(NULL); finetune_seek = time; + dir = TRUE; + time = get_output_time() - 1000; + g_usleep(10000); } - else if (cur_cue_track != last_cue_track && (time > cue_tracks[cur_cue_track + 1].index)) + + while (dir == FALSE && cur_cue_track != last_cue_track && (time > cue_tracks[cur_cue_track + 1].index)) { cur_cue_track++; playlist_next(); - watchdog_func(NULL); finetune_seek = time; + time = get_output_time() + 1000; + g_usleep(10000); } + pl_seek = 0; + return TRUE; }