From 652ccb9059603d244b104568a9abf829f63f1d93 Mon Sep 17 00:00:00 2001 From: KIRA Ryouta Date: Tue, 24 Oct 2023 10:03:19 +0900 Subject: [PATCH] Fix a bug that st_read_s16 and st_read_f32 reterned the number of frames multiplied by the number of the WavPack file's channels. --- external/st_audiofile/src/st_audiofile.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/external/st_audiofile/src/st_audiofile.c b/external/st_audiofile/src/st_audiofile.c index b4cb7df4..b99602a4 100644 --- a/external/st_audiofile/src/st_audiofile.c +++ b/external/st_audiofile/src/st_audiofile.c @@ -516,12 +516,13 @@ uint64_t st_read_s16(st_audio_file* af, int16_t* buffer, uint64_t count) if (!buf_i32) { return 0; } - count = channels * WavpackUnpackSamples(af->wv, buf_i32, (uint32_t)count); + count = WavpackUnpackSamples(af->wv, buf_i32, (uint32_t)count); + uint64_t buf_size = channels * count; if (af->cache.wv.mode & MODE_FLOAT) { - drwav_f32_to_s16((drwav_int16*)buffer, (float*)buf_i32, (size_t)count); + drwav_f32_to_s16((drwav_int16*)buffer, (float*)buf_i32, (size_t)buf_size); } else { int d = af->cache.wv.bitrate - 16; - for (uint64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < buf_size; i++) { buffer[i] = (int16_t)(buf_i32[i] >> d); } } @@ -566,15 +567,16 @@ uint64_t st_read_f32(st_audio_file* af, float* buffer, uint64_t count) if (!buf_i32) { return 0; } - count = channels * WavpackUnpackSamples(af->wv, buf_i32, (uint32_t)count); - if (!(af->cache.wv.mode & MODE_FLOAT)) { + count = WavpackUnpackSamples(af->wv, buf_i32, (uint32_t)count); + { + uint64_t buf_size = count * channels; if (af->cache.wv.bitrate < 32) { int d = 32 - af->cache.wv.bitrate; - for (uint64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < buf_size; i++) { buf_i32[i] <<= d; } } - drwav_s32_to_f32(buffer, (drwav_int32*)buf_i32, (size_t)count); + drwav_s32_to_f32(buffer, (drwav_int32*)buf_i32, (size_t)buf_size); } free(buf_i32); }