summaryrefslogtreecommitdiff
path: root/apps/pcmbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/pcmbuf.c')
-rw-r--r--apps/pcmbuf.c31
1 files changed, 13 insertions, 18 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c
index 95a423af6a..bcf971d1f8 100644
--- a/apps/pcmbuf.c
+++ b/apps/pcmbuf.c
@@ -85,7 +85,7 @@ volatile int pcmbuf_write_index;
85int pcmbuf_unplayed_bytes; 85int pcmbuf_unplayed_bytes;
86int pcmbuf_watermark; 86int pcmbuf_watermark;
87void (*pcmbuf_watermark_event)(int bytes_left); 87void (*pcmbuf_watermark_event)(int bytes_left);
88static int last_chunksize; 88//static int last_chunksize;
89 89
90static void pcmbuf_boost(bool state) 90static void pcmbuf_boost(bool state)
91{ 91{
@@ -110,11 +110,6 @@ int pcmbuf_num_used_buffers(void)
110static void pcmbuf_callback(unsigned char** start, long* size) 110static void pcmbuf_callback(unsigned char** start, long* size)
111{ 111{
112 struct pcmbufdesc *desc = &pcmbuffers[pcmbuf_read_index]; 112 struct pcmbufdesc *desc = &pcmbuffers[pcmbuf_read_index];
113 int sz;
114
115 pcmbuf_unplayed_bytes -= last_chunksize;
116 audiobuffer_free += last_chunksize;
117
118 113
119 if(desc->size == 0) 114 if(desc->size == 0)
120 { 115 {
@@ -129,17 +124,15 @@ static void pcmbuf_callback(unsigned char** start, long* size)
129 124
130 if(pcmbuf_num_used_buffers()) 125 if(pcmbuf_num_used_buffers())
131 { 126 {
132 /* Play max 64K at a time */ 127 pcmbuf_unplayed_bytes -= desc->size;
133 //sz = MIN(desc->size, 32768); 128 audiobuffer_free += desc->size;
134 sz = desc->size; 129
135 *start = desc->addr; 130 *start = desc->addr;
136 *size = sz; 131 *size = desc->size;
137 132
138 /* Update the buffer descriptor */ 133 /* Update the buffer descriptor */
139 desc->size -= sz; 134 desc->addr += desc->size;
140 desc->addr += sz; 135 desc->size = 0;
141
142 last_chunksize = sz;
143 } 136 }
144 else 137 else
145 { 138 {
@@ -243,7 +236,7 @@ bool pcmbuf_crossfade_init(void)
243void pcmbuf_play_stop(void) 236void pcmbuf_play_stop(void)
244{ 237{
245 pcm_play_stop(); 238 pcm_play_stop();
246 last_chunksize = 0; 239 //last_chunksize = 0;
247 pcmbuf_unplayed_bytes = 0; 240 pcmbuf_unplayed_bytes = 0;
248 pcmbuf_read_index = 0; 241 pcmbuf_read_index = 0;
249 pcmbuf_write_index = 0; 242 pcmbuf_write_index = 0;
@@ -278,6 +271,7 @@ void pcmbuf_flush_audio(void)
278 return ; 271 return ;
279 } 272 }
280 273
274 pcmbuf_boost(true);
281 crossfade_mode = CFM_FLUSH; 275 crossfade_mode = CFM_FLUSH;
282 crossfade_init = true; 276 crossfade_init = true;
283} 277}
@@ -296,7 +290,8 @@ void pcmbuf_flush_fillpos(void)
296 /* This is a fatal error situation that should never happen. */ 290 /* This is a fatal error situation that should never happen. */
297 if (!pcm_is_playing()) { 291 if (!pcm_is_playing()) {
298 logf("pcm_flush_fillpos error"); 292 logf("pcm_flush_fillpos error");
299 break ; 293 pcm_play_data(pcmbuf_callback);
294 return ;
300 } 295 }
301 } 296 }
302 pcmbuf_event_handler = NULL; 297 pcmbuf_event_handler = NULL;
@@ -320,7 +315,7 @@ static void crossfade_start(void)
320 } 315 }
321 316
322 logf("crossfade_start"); 317 logf("crossfade_start");
323 pcmbuf_flush_fillpos(); 318 audiobuffer_fillpos = 0;
324 pcmbuf_boost(true); 319 pcmbuf_boost(true);
325 crossfade_active = true; 320 crossfade_active = true;
326 crossfade_pos = audiobuffer_pos; 321 crossfade_pos = audiobuffer_pos;
@@ -384,7 +379,7 @@ static bool prepare_insert(long length)
384 pcmbuf_boost(false); 379 pcmbuf_boost(false);
385 return false; 380 return false;
386 } 381 }
387 382
388 if (!pcm_is_playing()) { 383 if (!pcm_is_playing()) {
389 pcmbuf_boost(true); 384 pcmbuf_boost(true);
390 crossfade_active = false; 385 crossfade_active = false;