diff options
Diffstat (limited to 'apps/pcmbuf.c')
-rw-r--r-- | apps/pcmbuf.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c index b18d411db6..f8fd2af82a 100644 --- a/apps/pcmbuf.c +++ b/apps/pcmbuf.c | |||
@@ -35,9 +35,10 @@ | |||
35 | #include "settings.h" | 35 | #include "settings.h" |
36 | #include "audio.h" | 36 | #include "audio.h" |
37 | #include "dsp.h" | 37 | #include "dsp.h" |
38 | #include "thread.h" | ||
38 | 39 | ||
39 | /* 1.5s low mark */ | 40 | /* Keep watermark high for iPods at least (2s) */ |
40 | #define PCMBUF_WATERMARK (NATIVE_FREQUENCY * 6) | 41 | #define PCMBUF_WATERMARK (NATIVE_FREQUENCY * 8) |
41 | 42 | ||
42 | /* Structure we can use to queue pcm chunks in memory to be played | 43 | /* Structure we can use to queue pcm chunks in memory to be played |
43 | * by the driver code. */ | 44 | * by the driver code. */ |
@@ -94,6 +95,8 @@ static size_t pcmbuf_mix_sample IDATA_ATTR; | |||
94 | static bool low_latency_mode = false; | 95 | static bool low_latency_mode = false; |
95 | static bool pcmbuf_flush; | 96 | static bool pcmbuf_flush; |
96 | 97 | ||
98 | extern struct thread_entry *codec_thread_p; | ||
99 | |||
97 | /* Helpful macros for use in conditionals this assumes some of the above | 100 | /* Helpful macros for use in conditionals this assumes some of the above |
98 | * static variable names */ | 101 | * static variable names */ |
99 | #define NEED_FLUSH(position) \ | 102 | #define NEED_FLUSH(position) \ |
@@ -109,14 +112,37 @@ static bool pcmbuf_flush_fillpos(void); | |||
109 | void pcmbuf_boost(bool state) | 112 | void pcmbuf_boost(bool state) |
110 | { | 113 | { |
111 | static bool boost_state = false; | 114 | static bool boost_state = false; |
112 | 115 | #ifdef HAVE_PRIORITY_SCHEDULING | |
116 | static bool priority_modified = false; | ||
117 | #endif | ||
118 | |||
113 | if (crossfade_init || crossfade_active) | 119 | if (crossfade_init || crossfade_active) |
114 | return; | 120 | return; |
115 | 121 | ||
116 | if (state != boost_state) { | 122 | if (state != boost_state) |
123 | { | ||
117 | cpu_boost(state); | 124 | cpu_boost(state); |
118 | boost_state = state; | 125 | boost_state = state; |
119 | } | 126 | } |
127 | |||
128 | #ifdef HAVE_PRIORITY_SCHEDULING | ||
129 | if (state && LOW_DATA(2) && pcm_is_playing()) | ||
130 | { | ||
131 | if (!priority_modified) | ||
132 | { | ||
133 | /* Buffer is critically low so override UI priority. */ | ||
134 | priority_modified = true; | ||
135 | thread_set_priority(codec_thread_p, PRIORITY_REALTIME); | ||
136 | } | ||
137 | } | ||
138 | else if (priority_modified) | ||
139 | { | ||
140 | /* Set back the original priority. */ | ||
141 | thread_set_priority(codec_thread_p, PRIORITY_PLAYBACK); | ||
142 | priority_modified = false; | ||
143 | } | ||
144 | |||
145 | #endif | ||
120 | } | 146 | } |
121 | #endif | 147 | #endif |
122 | 148 | ||
@@ -244,7 +270,9 @@ static void pcmbuf_under_watermark(void) | |||
244 | pcmbuf_boost(true); | 270 | pcmbuf_boost(true); |
245 | /* Disable crossfade if < .5s of audio */ | 271 | /* Disable crossfade if < .5s of audio */ |
246 | if (LOW_DATA(2)) | 272 | if (LOW_DATA(2)) |
273 | { | ||
247 | crossfade_active = false; | 274 | crossfade_active = false; |
275 | } | ||
248 | } | 276 | } |
249 | 277 | ||
250 | void pcmbuf_set_event_handler(void (*event_handler)(void)) | 278 | void pcmbuf_set_event_handler(void (*event_handler)(void)) |
@@ -270,8 +298,8 @@ bool pcmbuf_is_lowdata(void) | |||
270 | crossfade_init || crossfade_active) | 298 | crossfade_init || crossfade_active) |
271 | return false; | 299 | return false; |
272 | 300 | ||
273 | /* 0.5 seconds of buffer is low data */ | 301 | /* 1 seconds of buffer is low data */ |
274 | return LOW_DATA(2); | 302 | return LOW_DATA(4); |
275 | } | 303 | } |
276 | 304 | ||
277 | /* Amount of bytes left in the buffer. */ | 305 | /* Amount of bytes left in the buffer. */ |
@@ -443,7 +471,7 @@ static bool pcmbuf_flush_fillpos(void) | |||
443 | pcmbuf_play_start(); | 471 | pcmbuf_play_start(); |
444 | } | 472 | } |
445 | /* Let approximately one chunk of data playback */ | 473 | /* Let approximately one chunk of data playback */ |
446 | sleep(PCMBUF_TARGET_CHUNK/(NATIVE_FREQUENCY * 4) / 5); | 474 | sleep(HZ*PCMBUF_TARGET_CHUNK/(NATIVE_FREQUENCY*4)); |
447 | } | 475 | } |
448 | pcmbuf_add_chunk(); | 476 | pcmbuf_add_chunk(); |
449 | return true; | 477 | return true; |