# HG changeset patch # User Yoshiki Yazawa # Date 1185373077 -32400 # Node ID 4c43c38bd033e137fc9cdf6650b0134ca05f90aa # Parent 8702f72b3382e072508a51113f8e2d967725d034 - adapt tta for new threading model. - add mseek(). - remove get_time(). diff -r 8702f72b3382 -r 4c43c38bd033 src/tta/libtta.c --- a/src/tta/libtta.c Wed Jul 25 22:52:22 2007 +0900 +++ b/src/tta/libtta.c Wed Jul 25 23:17:57 2007 +0900 @@ -39,7 +39,6 @@ #include #include #include -#include #include #include @@ -67,19 +66,18 @@ static void play_file (InputPlayback *playback); static void tta_pause (InputPlayback *playback, short paused); static void stop (InputPlayback *playback); -static void seek (InputPlayback *playback, int time); -static int get_time (InputPlayback *playback); +static void mseek (InputPlayback *playback, gulong millisec); +static void seek (InputPlayback *playback, int sec); static void get_song_info (char *filename, char **title, int *length); static void file_info (char *filename); static void about (); static TitleInput *get_song_tuple(char *filename); static gchar *extname(const char *filename); -static pthread_t decode_thread; +static GThread *decode_thread = NULL; static char sample_buffer[PCM_BUFFER_LENGTH * MAX_BSIZE * MAX_NCH]; static tta_info info; // currently playing file info static int seek_position = -1; -static int playing = FALSE; static int read_samples = -1; gchar *tta_fmts[] = { "tta", NULL }; @@ -99,7 +97,7 @@ tta_pause, seek, NULL, - get_time, + NULL, NULL, NULL, cleanup, @@ -115,6 +113,7 @@ NULL, // buffer NULL, // vfs tta_fmts, + mseek, }; InputPlugin *tta_iplist[] = { &tta_ip, NULL }; @@ -198,52 +197,50 @@ } static void * -play_loop (void *arg) +play_loop (InputPlayback *playback) { - InputPlayback *playback = arg; int bufsize = PCM_BUFFER_LENGTH * info.BSIZE * info.NCH; //////////////////////////////////////// // decode PCM_BUFFER_LENGTH samples // into the current PCM buffer position - while (playing) + while (playback->playing) { while ((read_samples = get_samples ((unsigned char *)sample_buffer)) > 0) { - while ((playback->output->buffer_free () < bufsize) - && seek_position == -1) - { - if (!playing) - goto DONE; - xmms_usleep (10000); - } - - if (seek_position == -1) - { - produce_audio(playback->output->written_time(), - ((info.BPS == 8) ? FMT_U8 : FMT_S16_LE), - info.NCH, - read_samples * info.NCH * info.BSIZE, - sample_buffer, - NULL); - } - else - { - set_position (seek_position); - playback->output->flush (seek_position * SEEK_STEP); - seek_position = -1; - } - if(!playing) - goto DONE; + while ((playback->output->buffer_free () < bufsize) + && seek_position == -1) + { + if (!playback->playing) + goto DONE; + xmms_usleep (10000); + } + if (seek_position == -1) + { + produce_audio(playback->output->written_time(), + ((info.BPS == 8) ? FMT_U8 : FMT_S16_LE), + info.NCH, + read_samples * info.NCH * info.BSIZE, + sample_buffer, + &playback->playing); + } + else + { + set_position (seek_position); + playback->output->flush (seek_position * SEEK_STEP); + seek_position = -1; + } + if(!playback->playing) + goto DONE; } playback->output->buffer_free (); playback->output->buffer_free (); while (playback->output->buffer_playing()) { xmms_usleep(10000); - if(!playing) + if(!playback->playing) goto DONE; } } @@ -257,7 +254,7 @@ // close currently playing file close_tta_file (&info); - pthread_exit (NULL); + return NULL; } static void @@ -478,8 +475,6 @@ int datasize, origsize, bitrate; TitleInput *tuple = NULL; - playing = FALSE; - //////////////////////////////////////// // open TTA file if (open_tta_file (filename, &info, 0) > 0) @@ -521,12 +516,12 @@ if (title) g_free (title); - playing = TRUE; playback->playing = 1; seek_position = -1; read_samples = -1; - pthread_create (&decode_thread, NULL, play_loop, playback); + decode_thread = g_thread_self(); + play_loop(playback); } static void @@ -538,36 +533,34 @@ static void stop (InputPlayback *playback) { - if (playing) + if (playback->playing) { - playing = FALSE; playback->playing = 0; - pthread_join (decode_thread, NULL); + g_thread_join(decode_thread); + decode_thread = NULL; playback->output->close_audio (); close_tta_file (&info); - read_samples = 0; + read_samples = -1; } } static void -seek (InputPlayback *data, int time) +mseek (InputPlayback *data, gulong millisec) { - if (playing) + if (data->playing) { - seek_position = 1000 * time / SEEK_STEP; + seek_position = (int)(millisec / SEEK_STEP); while (seek_position != -1) xmms_usleep (10000); } } -static int -get_time (InputPlayback *playback) +static void +seek (InputPlayback *data, int sec) { - if (playing && (read_samples || playback->output->buffer_playing())) - return playback->output->output_time(); - - return -1; + gulong millisec = 1000 * sec; + mseek(data, millisec); } static TitleInput *