summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/pcmbuf.c21
-rw-r--r--apps/pcmbuf.h1
-rw-r--r--apps/playback.c14
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: