From 10befc8e6ed2129143af79cfcfbc0fd5a4fe3d85 Mon Sep 17 00:00:00 2001 From: Steve Bavin Date: Sun, 15 Oct 2006 11:03:26 +0000 Subject: [PATCH] Don't unboost CPU in an ISR git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11224 a1c6a512-1295-4272-9138-f99709370657 --- apps/pcmbuf.c | 21 ++++++++++++--------- apps/pcmbuf.h | 1 + apps/playback.c | 14 ++++++-------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c index 964ebbc901..d8612a4fbc 100644 --- a/apps/pcmbuf.c +++ b/apps/pcmbuf.c @@ -94,6 +94,7 @@ static size_t pcmbuf_mix_sample IDATA_ATTR; static bool low_latency_mode = false; static bool pcmbuf_flush; +static volatile bool output_completed = false; extern struct thread_entry *codec_thread_p; @@ -115,7 +116,7 @@ void pcmbuf_boost(bool state) #ifdef HAVE_PRIORITY_SCHEDULING static bool priority_modified = false; #endif - + if (crossfade_init || crossfade_active) return; @@ -203,14 +204,7 @@ process_new_buffer: *realsize = 0; *realstart = NULL; CALL_IF_EXISTS(pcmbuf_event_handler); - /* FIXME: We need to find another way to keep the CPU from - * being left boosted, because this is boosting in interrupt - * context. This is also not a good thing, because it will - * result in the CPU being deboosted if there is a legitimate - * buffer underrun (albeit only temporarily, because someone - * will reboost it soon, but it will make the skip longer - * than necessary. */ - pcmbuf_boost(false); + output_completed = true; } } } @@ -1037,3 +1031,12 @@ bool pcmbuf_is_crossfade_enabled(void) return crossfade_enabled; } +bool pcmbuf_output_completed(void) +{ + if (output_completed) + { + output_completed = false; + return true; + } + return false; +} diff --git a/apps/pcmbuf.h b/apps/pcmbuf.h index b5035f4405..2106968368 100644 --- a/apps/pcmbuf.h +++ b/apps/pcmbuf.h @@ -46,6 +46,7 @@ size_t get_pcmbuf_descsize(void); void pcmbuf_pause(bool pause); void pcmbuf_play_stop(void); bool pcmbuf_is_crossfade_active(void); +bool pcmbuf_output_completed(void); /* These functions are for playing chained buffers of PCM data */ #if defined(HAVE_ADJUSTABLE_CPU_FREQ) && !defined(SIMULATOR) diff --git a/apps/playback.c b/apps/playback.c index 8c480c46c7..44aa8696fc 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -203,7 +203,7 @@ static unsigned char *iram_buf[2]; static unsigned char *dram_buf[2]; /* Step count to the next unbuffered track. */ -static int last_peek_offset; +static int last_peek_offset; /* Audio thread */ /* Track information (count in file buffer, read/write indexes for track ring structure. */ @@ -674,7 +674,7 @@ void audio_preinit(void) track_buffer_callback = NULL; track_unbuffer_callback = NULL; track_changed_callback = NULL; - /* Just to prevent CUR_TI never be anything random. */ + /* Just to prevent CUR_TI from being anything random. */ track_ridx = 0; mutex_init(&mutex_codecthread); @@ -1249,7 +1249,6 @@ static void codec_set_offset_callback(size_t value) static void codec_advance_buffer_counters(size_t amount) { buf_ridx = RINGBUF_ADD(buf_ridx, amount); - ci.curpos += amount; CUR_TI->available -= amount; @@ -1963,12 +1962,11 @@ static bool audio_buffer_wind_forward(int new_track_ridx, int old_track_ridx) amount = tracks[old_track_ridx].filesize - ci.curpos; /* Then collect all data from tracks in between them */ amount += audio_buffer_count_tracks(old_track_ridx, new_track_ridx); + logf("bwf:%ldB", (long) amount); if (amount > FILEBUFUSED) return false; - logf("bwf:%ldB",amount); - /* Wind the buffer to the beginning of the target track or its codec */ buf_ridx = RINGBUF_ADD(buf_ridx, amount); @@ -2535,7 +2533,6 @@ static bool audio_load_track(int offset, bool start_play, bool rebuffer) tracks[track_widx].id3.offset = offset; break; } - } logf("alt:%s", trackname); @@ -2891,9 +2888,8 @@ static void audio_rebuffer_and_seek(size_t newpos) int fd; char *trackname; - trackname = playlist_peek(0); /* (Re-)open current track's file handle. */ - + trackname = playlist_peek(0); fd = open(trackname, O_RDONLY); if (fd < 0) { @@ -3342,6 +3338,8 @@ static void audio_thread(void) case SYS_TIMEOUT: LOGFQUEUE("audio < SYS_TIMEOUT"); + if (pcmbuf_output_completed()) + pcmbuf_play_stop(); /* Stop to ensure unboosted */ break; default: