diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/pcmbuf.c | 56 |
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 | */ |
454 | static void crossfade_process_buffer(unsigned int fade_in_delay, | 454 | static 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 | ||