summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/pcmbuf.c56
1 files changed, 32 insertions, 24 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c
index 41719d8efc..79a412c869 100644
--- a/apps/pcmbuf.c
+++ b/apps/pcmbuf.c
@@ -451,35 +451,43 @@ static void pcmbuf_flush_fillpos(void)
451/** 451/**
452 * Completely process the crossfade fade out effect with current pcm buffer. 452 * Completely process the crossfade fade out effect with current pcm buffer.
453 */ 453 */
454static void crossfade_process_buffer(unsigned int fade_in_delay, 454static void crossfade_process_buffer(size_t fade_in_delay,
455 unsigned int fade_out_delay, size_t fade_out_rem) 455 size_t fade_out_delay, size_t fade_out_rem)
456{ 456{
457 size_t amount; 457 if (crossfade_mode == CFM_CROSSFADE)
458 size_t pos;
459 short *buf;
460
461 /* Fade out the entire current buffer according to settings. */
462 amount = fade_out_rem;
463 pos = crossfade_pos + fade_out_delay*2;
464
465 while (fade_out_rem > 0 && crossfade_mode == CFM_CROSSFADE)
466 { 458 {
467 size_t blocksize = MIN(8192, fade_out_rem); 459 /* Fade out the specified amount of the already processed audio */
468 int factor = (fade_out_rem<<8)/amount; 460 size_t total_fade_out = fade_out_rem;
461 short *buf = (short *)&audiobuffer[crossfade_pos + fade_out_delay * 2];
462 short *buf_end = (short *)guardbuf;
469 463
470 /* Prevent pcmbuffer from wrapping. */ 464 /* Wrap the starting position if needed */
471 if (pos >= pcmbuf_size) pos -= pcmbuf_size; 465 if (buf >= buf_end) buf -= pcmbuf_size / 2;
472 466
473 blocksize = MIN((pcmbuf_size - pos)/2, blocksize); 467 while (fade_out_rem > 0)
474 buf = (short *)&audiobuffer[pos];
475
476 fade_out_rem -= blocksize;
477 pos += blocksize * 2;
478 while (blocksize > 0)
479 { 468 {
480 *buf = (*buf * factor) >> 8; 469 /* Each 1/10 second of audio will have the same fade applied */
481 *buf++; 470 size_t block_rem = MIN(NATIVE_FREQUENCY * 2 / 10, fade_out_rem);
482 blocksize--; 471 unsigned int factor = (fade_out_rem << 8) / total_fade_out;
472 short *block_end = buf + block_rem;
473
474 fade_out_rem -= block_rem;
475
476 /* Fade this block */
477 while (buf < block_end)
478 {
479 /* Fade one sample */
480 *buf = (*buf * factor) >> 8;
481 buf++;
482
483 if (buf >= buf_end)
484 {
485 /* Wrap the pcmbuffer */
486 buf -= pcmbuf_size / 2;
487 /* Wrap the end pointer to ensure proper termination */
488 block_end -= pcmbuf_size / 2;
489 }
490 }
483 } 491 }
484 } 492 }
485 493