From fe468b1149bf61b2b4a0c4a2ac3624632af5cb2b Mon Sep 17 00:00:00 2001 From: Miika Pekkarinen Date: Thu, 9 Jun 2005 19:31:35 +0000 Subject: Bunch of playback bugs fixed including next/prev/select track, pausing, faster ui response, ... git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6641 a1c6a512-1295-4272-9138-f99709370657 --- apps/playback.c | 50 ++++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) (limited to 'apps/playback.c') diff --git a/apps/playback.c b/apps/playback.c index db04f3a784..98b73b4639 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -68,7 +68,7 @@ static volatile bool paused; #define CODEC_WAV "/.rockbox/codecs/codecwav.rock"; #define AUDIO_WATERMARK 0x70000 -#define AUDIO_FILE_CHUNK (1024*512) +#define AUDIO_FILE_CHUNK (1024*32) #define AUDIO_PLAY 1 #define AUDIO_STOP 2 @@ -107,9 +107,6 @@ static const char codec_thread_name[] = "codec"; /* Is file buffer currently being refilled? */ static volatile bool filling; -/* Interrupts buffer filling. */ -static volatile bool interrupt; - /* Ring buffer where tracks and codecs are loaded. */ char *codecbuf; @@ -423,7 +420,7 @@ void audio_fill_file_buffer(void) /* Give codecs some processing time. */ yield_codecs(); - if (interrupt) { + if (!queue_empty(&audio_queue)) { logf("Filling interrupted"); close(current_fd); current_fd = -1; @@ -543,7 +540,7 @@ bool loadcodec(const char *trackname, bool start_play) i = 0; while (i < size) { yield_codecs(); - if (interrupt) { + if (!queue_empty(&audio_queue)) { logf("Buffering interrupted"); close(fd); return false; @@ -610,10 +607,12 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) } tracks[track_widx].filebuf = &codecbuf[buf_widx]; - logf("%s", trackname); + //logf("%s", trackname); logf("Buffering track:%d/%d", track_widx, track_ridx); - if (interrupt) { + if (!queue_empty(&audio_queue)) { + logf("Interrupted!"); + ci.stop_codec = true; close(fd); return false; } @@ -637,10 +636,12 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) } else { lseek(fd, 0, SEEK_SET); } + /* logf("T:%s", tracks[track_widx].id3.title); logf("L:%d", tracks[track_widx].id3.length); logf("O:%d", tracks[track_widx].id3.first_frame_offset); logf("F:%d", tracks[track_widx].id3.frequency); + */ tracks[track_widx].taginfo_ready = true; break ; @@ -715,12 +716,13 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) break; } + track_changed = true; track_count++; i = tracks[track_widx].filepos; while (i < size) { /* Give codecs some processing time to prevent glitches. */ yield_codecs(); - if (interrupt) { + if (!queue_empty(&audio_queue)) { logf("Buffering interrupted"); close(fd); return false; @@ -734,6 +736,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) copy_n = MIN((int)fill_bytesleft, copy_n); rc = read(fd, &codecbuf[buf_widx], copy_n); if (rc < 0) { + logf("File error!"); close(fd); return false; } @@ -782,10 +785,9 @@ void audio_insert_tracks(int offset, bool start_playing) void audio_play_start(int offset) { - memset(&tracks, 0, sizeof(struct track_info)); + memset(&tracks, 0, sizeof(struct track_info) * MAX_TRACK); sound_set(SOUND_VOLUME, global_settings.volume); track_count = 0; - track_changed = true; track_widx = 0; track_ridx = 0; buf_ridx = 0; @@ -808,12 +810,13 @@ void audio_check_buffer(void) /* Fill buffer as full as possible for cross-fader. */ #ifndef SIMULATOR - if (cur_ti->id3.length - cur_ti->id3.elapsed < 20000) + if (cur_ti->id3.length - cur_ti->id3.elapsed < 20000 && playing) pcm_set_boost_mode(true); #endif /* Start buffer filling as necessary. */ - if (codecbufused > AUDIO_WATERMARK || interrupt || !playing) + if (codecbufused > AUDIO_WATERMARK || !queue_empty(&audio_queue) + || !playing || ci.stop_codec || ci.reload_codec) return ; filling = true; @@ -915,7 +918,7 @@ void audio_change_track(void) bool codec_request_next_track_callback(void) { - if (ci.stop_codec || !playing) + if (ci.stop_codec || !playing || !queue_empty(&audio_queue)) return false; logf("Request new track"); @@ -989,21 +992,20 @@ void audio_thread(void) yield(); audio_check_buffer(); - queue_wait_w_tmo(&audio_queue, &ev, 0); + queue_wait_w_tmo(&audio_queue, &ev, 10); switch (ev.id) { case AUDIO_PLAY: - interrupt = false; ci.stop_codec = true; ci.reload_codec = false; ci.seek_time = 0; #ifndef SIMULATOR pcm_play_stop(); #endif - paused = false; audio_play_start((int)ev.data); break ; case AUDIO_STOP: + paused = false; #ifndef SIMULATOR pcm_play_stop(); pcm_play_pause(true); @@ -1092,12 +1094,11 @@ void codec_thread(void) if (playing && !ci.stop_codec && !ci.reload_codec) { audio_change_track(); - } else if (ci.reload_codec) { - interrupt = true; - } else { - playing = false; + continue ; + } else if (ci.stop_codec) { + //playing = false; } - queue_post(&audio_queue, AUDIO_CODEC_DONE, (void *)status); + //queue_post(&audio_queue, AUDIO_CODEC_DONE, (void *)status); } } } @@ -1146,7 +1147,6 @@ void audio_play(int offset) { logf("audio_play"); ci.stop_codec = true; - playing = false; #ifndef SIMULATOR pcm_play_pause(true); #endif @@ -1157,6 +1157,7 @@ void audio_stop(void) { logf("audio_stop"); playing = false; + paused = false; ci.stop_codec = true; if (current_fd) { close(current_fd); @@ -1196,7 +1197,6 @@ void audio_next(void) /* Detect if disk is spinning.. */ if (filling) { - interrupt = true; ci.stop_codec = true; playlist_next(1); queue_post(&audio_queue, AUDIO_PLAY, 0); @@ -1217,7 +1217,6 @@ void audio_prev(void) #endif if (filling) { - interrupt = true; ci.stop_codec = true; playlist_next(-1); queue_post(&audio_queue, AUDIO_PLAY, 0); @@ -1398,7 +1397,6 @@ void audio_init(void) //codecbuflen = 2*512*1024; codecbufused = 0; filling = false; - interrupt = false; codecbuf = &audiobuf[MALLOC_BUFSIZE]; playing = false; paused = false; -- cgit v1.2.3