summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-03-06 20:32:13 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-03-06 20:32:13 +0000
commitb425de71df7acdc82b4e466a5bac709d0dc15f64 (patch)
tree341a404edde5d4192bbf45b1b63f605f81ef3d8a
parentbf133996d52eb6adb04c103a15ef18af1ccc7674 (diff)
downloadrockbox-b425de71df7acdc82b4e466a5bac709d0dc15f64.tar.gz
rockbox-b425de71df7acdc82b4e466a5bac709d0dc15f64.tar.bz2
rockbox-b425de71df7acdc82b4e466a5bac709d0dc15f64.zip
Fix problem with recording screen creep and bag a bigfoot. Voice clips aren't long enough now to untrigger the thread boost that was supposed to be applied to the codec thread. The voice thread was needlessly boosting the codec thread and leaving it boosted which explains the encoders' ability to flood the output buffer when everything else was stopped in its tracks. Check which thread is calling pcmbuf_under_watermark and only initiate the boost when it's the codec thread. Always return the codec thread to its usual priority in pcmbuf_play_stop.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12649 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/pcmbuf.c50
-rw-r--r--firmware/export/thread.h1
-rw-r--r--firmware/thread.c5
3 files changed, 38 insertions, 18 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c
index e2b1d7f87b..91b9f1329b 100644
--- a/apps/pcmbuf.c
+++ b/apps/pcmbuf.c
@@ -104,6 +104,8 @@ static size_t pcmbuf_mix_sample IDATA_ATTR;
static bool low_latency_mode = false;
static bool pcmbuf_flush;
+static int codec_thread_priority = 0;
+
extern struct thread_entry *codec_thread_p;
/* Helpful macros for use in conditionals this assumes some of the above
@@ -235,30 +237,37 @@ static inline void pcmbuf_add_chunk(void)
audiobuffer_fillpos = 0;
}
-static void pcmbuf_under_watermark(void)
-{
#ifdef HAVE_PRIORITY_SCHEDULING
- static int old_priority = 0;
-
- if (LOW_DATA(2) && pcm_is_playing())
+static void boost_codec_thread(bool boost)
+{
+ if (boost)
{
- if (!old_priority)
- {
- /* Buffer is critically low so override UI priority. */
- old_priority = thread_set_priority(codec_thread_p,
- PRIORITY_REALTIME);
- }
+ if (codec_thread_priority == 0)
+ codec_thread_priority = thread_set_priority(
+ codec_thread_p, PRIORITY_REALTIME);
}
- else if (old_priority)
+ else if (codec_thread_priority != 0)
{
- /* Set back the original priority. */
- thread_set_priority(codec_thread_p, old_priority);
- old_priority = 0;
+ thread_set_priority(codec_thread_p, codec_thread_priority);
+ codec_thread_priority = 0;
}
-#endif
+}
+#endif /* HAVE_PRIORITY_SCHEDULING */
- /* Fill audio buffer by boosting cpu */
- trigger_cpu_boost();
+static void pcmbuf_under_watermark(void)
+{
+ /* Only codec thread initiates boost - voice boosts the cpu when playing
+ a clip */
+ if (thread_get_current() == codec_thread_p)
+ {
+#ifdef HAVE_PRIORITY_SCHEDULING
+ /* If buffer is critically low, override UI priority, else
+ set back to the original priority. */
+ boost_codec_thread(LOW_DATA(2) && pcm_is_playing());
+#endif
+ /* Fill audio buffer by boosting cpu */
+ trigger_cpu_boost();
+ }
/* Disable crossfade if < .5s of audio */
if (LOW_DATA(2))
@@ -364,6 +373,11 @@ void pcmbuf_play_stop(void)
crossfade_init = false;
crossfade_active = false;
pcmbuf_flush = false;
+
+#ifdef HAVE_PRIORITY_SCHEDULING
+ /* Can unboost the codec thread here no matter who's calling */
+ boost_codec_thread(false);
+#endif
}
int pcmbuf_used_descs(void) {
diff --git a/firmware/export/thread.h b/firmware/export/thread.h
index 2ff4694159..3a979722b9 100644
--- a/firmware/export/thread.h
+++ b/firmware/export/thread.h
@@ -150,6 +150,7 @@ void wakeup_thread(struct thread_entry **thread);
int thread_set_priority(struct thread_entry *thread, int priority);
int thread_get_priority(struct thread_entry *thread);
#endif
+struct thread_entry * thread_get_current(void);
void init_threads(void);
int thread_stack_usage(const struct thread_entry *thread);
int thread_get_status(const struct thread_entry *thread);
diff --git a/firmware/thread.c b/firmware/thread.c
index 281ab0fa54..614286c422 100644
--- a/firmware/thread.c
+++ b/firmware/thread.c
@@ -776,6 +776,11 @@ int thread_get_priority(struct thread_entry *thread)
}
#endif
+struct thread_entry * thread_get_current(void)
+{
+ return cores[CURRENT_CORE].running;
+}
+
void init_threads(void)
{
unsigned int core = CURRENT_CORE;