# HG changeset patch # User yaz # Date 1173941412 25200 # Node ID 301d03667d2fc0a64d9decd81cd5c53e044460d1 # Parent 9429121d61ecd94a2600a5b1f93555bf9f24bce9 [svn] - make use of playlist_set_position() instead of playlist_prev/next(). now cuesheet directly jumps to the objective track. - now eof handling code checks output->buffer_playing(). - revise guard time logic and reduce the amount of time to 500msec. diff -r 9429121d61ec -r 301d03667d2f ChangeLog --- a/ChangeLog Wed Mar 14 23:34:56 2007 -0700 +++ b/ChangeLog Wed Mar 14 23:50:12 2007 -0700 @@ -1,3 +1,14 @@ +2007-03-15 06:34:56 +0000 Yoshiki Yazawa + revision [1816] + - implement real buffer_free() and buffer_playing(). + - remove unused code. + - apply cast to (short *) in lame_encode_xx() + - change version number from 0.2d6 to 0.2. + + trunk/src/lame/out_lame.c | 53 +++++++++++++--------------------------------- + 1 file changed, 15 insertions(+), 38 deletions(-) + + 2007-03-14 15:59:50 +0000 Giacomo Lozito revision [1814] statusicon: add missing files diff -r 9429121d61ec -r 301d03667d2f src/cue/cuesheet.c --- a/src/cue/cuesheet.c Wed Mar 14 23:34:56 2007 -0700 +++ b/src/cue/cuesheet.c Wed Mar 14 23:50:12 2007 -0700 @@ -35,6 +35,7 @@ #define MAX_CUE_LINE_LENGTH 1000 #define MAX_CUE_TRACKS 1000 +#define TRANSITION_GUARD_TIME 500000 static void cache_cue_file(gchar *f); static void free_cue_info(void); @@ -357,29 +358,16 @@ g_thread_exit(NULL); } -static gpointer do_prev(gpointer data) +static gpointer do_setpos(gpointer data) { Playlist *playlist = playlist_get_active(); - #ifdef DEBUG - g_print("do_prev\n"); + g_print("do_setpos: %d\n\n", *(guint *)data); #endif - playlist_prev(playlist); + playlist_set_position(playlist, *(guint *)data); g_thread_exit(NULL); } -static gpointer do_next(gpointer data) -{ - Playlist *playlist = playlist_get_active(); - -#ifdef DEBUG - g_print("do_next\n"); -#endif - playlist_next(playlist); - g_thread_exit(NULL); -} - - static void cue_pause(InputPlayback * data, short p) { if (real_ip != NULL) @@ -465,6 +453,7 @@ real_ip->plugin->seek(real_ip, finetune_seek ? finetune_seek / 1000 : cue_tracks[track].index / 1000 + 1); /* kick watchdog thread */ + g_usleep(TRANSITION_GUARD_TIME); g_mutex_lock(cue_mutex); watchdog_state = RUN; g_mutex_unlock(cue_mutex); @@ -555,66 +544,73 @@ } g_mutex_unlock(cue_mutex); + if(watchdog_state != RUN) + continue; + time = get_output_time(); if(time == 0) continue; -#if 0 -#ifdef DEBUG - if(real_ip) { - g_print("real_ip->playing = %d\n", real_ip->playing); - if(real_ip->playing == 0) - g_print("not playing\n"); - if(!real_ip->output->buffer_playing()) - g_print("not buffer_playing\n"); - } -#endif -#endif // prev track if (time < cue_tracks[cur_cue_track].index) { + guint pos; #ifdef DEBUG g_print("i: watchdog prev\n"); g_print("time = %d cur = %d cidx = %d nidx = %d\n", time, cur_cue_track, cue_tracks[cur_cue_track].index, cue_tracks[cur_cue_track+1].index); #endif - cur_cue_track--; - if (time >= cue_tracks[cur_cue_track].index) - finetune_seek = time; - exec_thread = g_thread_create(do_prev, NULL, FALSE, NULL); - g_usleep(1000000); // 1sec guard time + while(time < cue_tracks[cur_cue_track].index) { + cur_cue_track--; + pos = cur_cue_track; + if (time >= cue_tracks[cur_cue_track].index) + finetune_seek = time; + } + + exec_thread = g_thread_create(do_setpos, &pos, FALSE, NULL); + g_usleep(TRANSITION_GUARD_TIME); } // next track - if (cur_cue_track != last_cue_track && (time > cue_tracks[cur_cue_track + 1].index)) + if (time > cue_tracks[cur_cue_track + 1].index) { + guint pos; #ifdef DEBUG g_print("i: watchdog next\n"); - g_print("time = %d cur = %d cidx = %d nidx = %d\n", time, cur_cue_track, + g_print("time = %d cur = %d cidx = %d nidx = %d last = %d\n", time, cur_cue_track, cue_tracks[cur_cue_track].index, - cue_tracks[cur_cue_track+1].index); + cue_tracks[cur_cue_track+1].index, + last_cue_track); #endif - cur_cue_track++; - if (time <= cue_tracks[cur_cue_track].index) - finetune_seek = time; + while(time > cue_tracks[cur_cue_track + 1].index) { + if(cur_cue_track + 1 == last_cue_track) { + break; + } + cur_cue_track++; + pos = cur_cue_track; + if (time <= cue_tracks[cur_cue_track].index) + finetune_seek = time; + } if(cfg.stopaftersong) { exec_thread = g_thread_create(do_stop, (void *)real_ip, FALSE, NULL); } else { - exec_thread = g_thread_create(do_next, NULL, FALSE, NULL); - g_usleep(1000000); // 1sec guard time + exec_thread = g_thread_create(do_setpos, &pos, FALSE, NULL); + g_usleep(TRANSITION_GUARD_TIME); } } // end of file if (cur_cue_track + 1 == last_cue_track && 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"); #endif - exec_thread = g_thread_create(do_stop, (void *)real_ip, FALSE, NULL); + exec_thread = g_thread_create(do_stop, (void *)real_ip, FALSE, NULL); + } } }