Skip to content

Commit 0a53eb8

Browse files
authored
Merge pull request #10017 from relic-se/audiodelays_buffer_fix
Fix sample decimation bug on `audiodelays.Echo` when `freq_shift=True`
2 parents 3236a0f + 3eeb90b commit 0a53eb8

File tree

1 file changed

+9
-9
lines changed
  • shared-module/audiodelays

1 file changed

+9
-9
lines changed

shared-module/audiodelays/Echo.c

+9-9
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,8 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
351351
echo = echo_buffer[echo_buffer_pos >> 8];
352352
next_buffer_pos = echo_buffer_pos + self->echo_buffer_rate;
353353

354-
word = (int16_t)(echo * decay);
355354
for (uint32_t j = echo_buffer_pos >> 8; j < next_buffer_pos >> 8; j++) {
355+
word = (int16_t)(echo_buffer[j % echo_buf_len] * decay);
356356
echo_buffer[j % echo_buf_len] = word;
357357
}
358358
} else {
@@ -421,33 +421,33 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
421421
if (self->freq_shift) {
422422
echo = echo_buffer[echo_buffer_pos >> 8];
423423
next_buffer_pos = echo_buffer_pos + self->echo_buffer_rate;
424-
word = (int32_t)(echo * decay + sample_word);
425424
} else {
426425
echo = echo_buffer[self->echo_buffer_read_pos++];
427426
word = (int32_t)(echo * decay + sample_word);
428427
}
429428

430429
if (MP_LIKELY(self->bits_per_sample == 16)) {
431-
word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2));
432430
if (self->freq_shift) {
433431
for (uint32_t j = echo_buffer_pos >> 8; j < next_buffer_pos >> 8; j++) {
432+
word = (int32_t)(echo_buffer[j % echo_buf_len] * decay + sample_word);
433+
word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2));
434434
echo_buffer[j % echo_buf_len] = (int16_t)word;
435435
}
436436
} else {
437+
word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2));
437438
echo_buffer[self->echo_buffer_write_pos++] = (int16_t)word;
438439
}
439440
} else {
440-
// Do not have mix_down for 8 bit so just hard cap samples into 1 byte
441-
if (word > 127) {
442-
word = 127;
443-
} else if (word < -128) {
444-
word = -128;
445-
}
446441
if (self->freq_shift) {
447442
for (uint32_t j = echo_buffer_pos >> 8; j < next_buffer_pos >> 8; j++) {
443+
word = (int32_t)(echo_buffer[j % echo_buf_len] * decay + sample_word);
444+
// Do not have mix_down for 8 bit so just hard cap samples into 1 byte
445+
word = MIN(MAX(word, -128), 127);
448446
echo_buffer[j % echo_buf_len] = (int8_t)word;
449447
}
450448
} else {
449+
// Do not have mix_down for 8 bit so just hard cap samples into 1 byte
450+
word = MIN(MAX(word, -128), 127);
451451
echo_buffer[self->echo_buffer_write_pos++] = (int8_t)word;
452452
}
453453
}

0 commit comments

Comments
 (0)