Commit dbca7a3b authored by David Reid's avatar David Reid

Version 0.10.42

parent 04fe7201
/* /*
Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file. Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file.
miniaudio - v0.10.41 - 2021-08-15 miniaudio - v0.10.42 - 2021-08-22
David Reid - mackron@gmail.com David Reid - mackron@gmail.com
...@@ -2651,7 +2651,7 @@ typedef unsigned char c89atomic_bool; ...@@ -2651,7 +2651,7 @@ typedef unsigned char c89atomic_bool;
#define c89atomic_memory_order_release 3 #define c89atomic_memory_order_release 3
#define c89atomic_memory_order_acq_rel 4 #define c89atomic_memory_order_acq_rel 4
#define c89atomic_memory_order_seq_cst 5 #define c89atomic_memory_order_seq_cst 5
#if _MSC_VER < 1600 && defined(C89ATOMIC_32BIT) #if _MSC_VER < 1600 && defined(C89ATOMIC_X86)
#define C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY #define C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY
#endif #endif
#if _MSC_VER < 1600 #if _MSC_VER < 1600
...@@ -4115,6 +4115,10 @@ typedef unsigned char c89atomic_bool; ...@@ -4115,6 +4115,10 @@ typedef unsigned char c89atomic_bool;
#define c89atomic_fetch_and_i16(dst, src) c89atomic_fetch_and_explicit_i16(dst, src, c89atomic_memory_order_seq_cst) #define c89atomic_fetch_and_i16(dst, src) c89atomic_fetch_and_explicit_i16(dst, src, c89atomic_memory_order_seq_cst)
#define c89atomic_fetch_and_i32(dst, src) c89atomic_fetch_and_explicit_i32(dst, src, c89atomic_memory_order_seq_cst) #define c89atomic_fetch_and_i32(dst, src) c89atomic_fetch_and_explicit_i32(dst, src, c89atomic_memory_order_seq_cst)
#define c89atomic_fetch_and_i64(dst, src) c89atomic_fetch_and_explicit_i64(dst, src, c89atomic_memory_order_seq_cst) #define c89atomic_fetch_and_i64(dst, src) c89atomic_fetch_and_explicit_i64(dst, src, c89atomic_memory_order_seq_cst)
#define c89atomic_compare_and_swap_i8( dst, expected, dedsired) (c89atomic_int8 )c89atomic_compare_and_swap_8( (c89atomic_uint8* )dst, (c89atomic_uint8 )expected, (c89atomic_uint8 )dedsired)
#define c89atomic_compare_and_swap_i16(dst, expected, dedsired) (c89atomic_int16)c89atomic_compare_and_swap_16((c89atomic_uint16*)dst, (c89atomic_uint16)expected, (c89atomic_uint16)dedsired)
#define c89atomic_compare_and_swap_i32(dst, expected, dedsired) (c89atomic_int32)c89atomic_compare_and_swap_32((c89atomic_uint32*)dst, (c89atomic_uint32)expected, (c89atomic_uint32)dedsired)
#define c89atomic_compare_and_swap_i64(dst, expected, dedsired) (c89atomic_int64)c89atomic_compare_and_swap_64((c89atomic_uint64*)dst, (c89atomic_uint64)expected, (c89atomic_uint64)dedsired)
typedef union typedef union
{ {
c89atomic_uint32 i; c89atomic_uint32 i;
...@@ -6144,6 +6148,11 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) ...@@ -6144,6 +6148,11 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice)
} }
} }
/* Make sure we don't get stuck in the inner loop. */
if (capturedDeviceFramesProcessed == 0) {
break;
}
totalCapturedDeviceFramesProcessed += capturedDeviceFramesProcessed; totalCapturedDeviceFramesProcessed += capturedDeviceFramesProcessed;
} }
} break; } break;
...@@ -6167,6 +6176,11 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) ...@@ -6167,6 +6176,11 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice)
break; break;
} }
/* Make sure we don't get stuck in the inner loop. */
if (framesProcessed == 0) {
break;
}
ma_device__send_frames_to_client(pDevice, framesProcessed, capturedDeviceData); ma_device__send_frames_to_client(pDevice, framesProcessed, capturedDeviceData);
framesReadThisPeriod += framesProcessed; framesReadThisPeriod += framesProcessed;
...@@ -6194,6 +6208,11 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) ...@@ -6194,6 +6208,11 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice)
break; break;
} }
/* Make sure we don't get stuck in the inner loop. */
if (framesProcessed == 0) {
break;
}
framesWrittenThisPeriod += framesProcessed; framesWrittenThisPeriod += framesProcessed;
} }
} break; } break;
...@@ -39979,7 +39998,7 @@ extern "C" { ...@@ -39979,7 +39998,7 @@ extern "C" {
#define DRFLAC_XSTRINGIFY(x) DRFLAC_STRINGIFY(x) #define DRFLAC_XSTRINGIFY(x) DRFLAC_STRINGIFY(x)
#define DRFLAC_VERSION_MAJOR 0 #define DRFLAC_VERSION_MAJOR 0
#define DRFLAC_VERSION_MINOR 12 #define DRFLAC_VERSION_MINOR 12
#define DRFLAC_VERSION_REVISION 30 #define DRFLAC_VERSION_REVISION 31
#define DRFLAC_VERSION_STRING DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MAJOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MINOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_REVISION) #define DRFLAC_VERSION_STRING DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MAJOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MINOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_REVISION)
#include <stddef.h> #include <stddef.h>
typedef signed char drflac_int8; typedef signed char drflac_int8;
...@@ -40340,7 +40359,7 @@ extern "C" { ...@@ -40340,7 +40359,7 @@ extern "C" {
#define DRMP3_XSTRINGIFY(x) DRMP3_STRINGIFY(x) #define DRMP3_XSTRINGIFY(x) DRMP3_STRINGIFY(x)
#define DRMP3_VERSION_MAJOR 0 #define DRMP3_VERSION_MAJOR 0
#define DRMP3_VERSION_MINOR 6 #define DRMP3_VERSION_MINOR 6
#define DRMP3_VERSION_REVISION 28 #define DRMP3_VERSION_REVISION 31
#define DRMP3_VERSION_STRING DRMP3_XSTRINGIFY(DRMP3_VERSION_MAJOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_MINOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_REVISION) #define DRMP3_VERSION_STRING DRMP3_XSTRINGIFY(DRMP3_VERSION_MAJOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_MINOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_REVISION)
#include <stddef.h> #include <stddef.h>
typedef signed char drmp3_int8; typedef signed char drmp3_int8;
...@@ -59034,7 +59053,7 @@ static type* drflac__full_read_and_close_ ## extension (drflac* pFlac, unsigned ...@@ -59034,7 +59053,7 @@ static type* drflac__full_read_and_close_ ## extension (drflac* pFlac, unsigned
DRFLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \ DRFLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \
} else { \ } else { \
drflac_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type); \ drflac_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type); \
if (dataSize > DRFLAC_SIZE_MAX) { \ if (dataSize > (drflac_uint64)DRFLAC_SIZE_MAX) { \
goto on_error; \ goto on_error; \
} \ } \
\ \
...@@ -59477,6 +59496,29 @@ static __inline__ __attribute__((always_inline)) drmp3_int32 drmp3_clip_int16_ar ...@@ -59477,6 +59496,29 @@ static __inline__ __attribute__((always_inline)) drmp3_int32 drmp3_clip_int16_ar
#else #else
#define DRMP3_HAVE_ARMV6 0 #define DRMP3_HAVE_ARMV6 0
#endif #endif
#ifndef DRMP3_ASSERT
#include <assert.h>
#define DRMP3_ASSERT(expression) assert(expression)
#endif
#ifndef DRMP3_COPY_MEMORY
#define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
#endif
#ifndef DRMP3_MOVE_MEMORY
#define DRMP3_MOVE_MEMORY(dst, src, sz) memmove((dst), (src), (sz))
#endif
#ifndef DRMP3_ZERO_MEMORY
#define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
#endif
#define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))
#ifndef DRMP3_MALLOC
#define DRMP3_MALLOC(sz) malloc((sz))
#endif
#ifndef DRMP3_REALLOC
#define DRMP3_REALLOC(p, sz) realloc((p), (sz))
#endif
#ifndef DRMP3_FREE
#define DRMP3_FREE(p) free((p))
#endif
typedef struct typedef struct
{ {
const drmp3_uint8 *buf; const drmp3_uint8 *buf;
...@@ -59716,7 +59758,7 @@ static int drmp3_L12_dequantize_granule(float *grbuf, drmp3_bs *bs, drmp3_L12_sc ...@@ -59716,7 +59758,7 @@ static int drmp3_L12_dequantize_granule(float *grbuf, drmp3_bs *bs, drmp3_L12_sc
static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci, const float *scf, float *dst) static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci, const float *scf, float *dst)
{ {
int i, k; int i, k;
memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float)); DRMP3_COPY_MEMORY(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float));
for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6) for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)
{ {
for (k = 0; k < 12; k++) for (k = 0; k < 12; k++)
...@@ -59854,14 +59896,14 @@ static void drmp3_L3_read_scalefactors(drmp3_uint8 *scf, drmp3_uint8 *ist_pos, c ...@@ -59854,14 +59896,14 @@ static void drmp3_L3_read_scalefactors(drmp3_uint8 *scf, drmp3_uint8 *ist_pos, c
int cnt = scf_count[i]; int cnt = scf_count[i];
if (scfsi & 8) if (scfsi & 8)
{ {
memcpy(scf, ist_pos, cnt); DRMP3_COPY_MEMORY(scf, ist_pos, cnt);
} else } else
{ {
int bits = scf_size[i]; int bits = scf_size[i];
if (!bits) if (!bits)
{ {
memset(scf, 0, cnt); DRMP3_ZERO_MEMORY(scf, cnt);
memset(ist_pos, 0, cnt); DRMP3_ZERO_MEMORY(ist_pos, cnt);
} else } else
{ {
int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1; int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
...@@ -60102,12 +60144,19 @@ static void drmp3_L3_midside_stereo(float *left, int n) ...@@ -60102,12 +60144,19 @@ static void drmp3_L3_midside_stereo(float *left, int n)
int i = 0; int i = 0;
float *right = left + 576; float *right = left + 576;
#if DRMP3_HAVE_SIMD #if DRMP3_HAVE_SIMD
if (drmp3_have_simd()) for (; i < n - 3; i += 4) if (drmp3_have_simd())
{ {
drmp3_f4 vl = DRMP3_VLD(left + i); for (; i < n - 3; i += 4)
drmp3_f4 vr = DRMP3_VLD(right + i); {
DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr)); drmp3_f4 vl = DRMP3_VLD(left + i);
DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr)); drmp3_f4 vr = DRMP3_VLD(right + i);
DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr));
DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr));
}
#ifdef __GNUC__
if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0)
return;
#endif
} }
#endif #endif
for (; i < n; i++) for (; i < n; i++)
...@@ -60207,7 +60256,7 @@ static void drmp3_L3_reorder(float *grbuf, float *scratch, const drmp3_uint8 *sf ...@@ -60207,7 +60256,7 @@ static void drmp3_L3_reorder(float *grbuf, float *scratch, const drmp3_uint8 *sf
*dst++ = src[2*len]; *dst++ = src[2*len];
} }
} }
memcpy(grbuf, scratch, (dst - scratch)*sizeof(float)); DRMP3_COPY_MEMORY(grbuf, scratch, (dst - scratch)*sizeof(float));
} }
static void drmp3_L3_antialias(float *grbuf, int nbands) static void drmp3_L3_antialias(float *grbuf, int nbands)
{ {
...@@ -60357,8 +60406,8 @@ static void drmp3_L3_imdct_short(float *grbuf, float *overlap, int nbands) ...@@ -60357,8 +60406,8 @@ static void drmp3_L3_imdct_short(float *grbuf, float *overlap, int nbands)
for (;nbands > 0; nbands--, overlap += 9, grbuf += 18) for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
{ {
float tmp[18]; float tmp[18];
memcpy(tmp, grbuf, sizeof(tmp)); DRMP3_COPY_MEMORY(tmp, grbuf, sizeof(tmp));
memcpy(grbuf, overlap, 6*sizeof(float)); DRMP3_COPY_MEMORY(grbuf, overlap, 6*sizeof(float));
drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6); drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);
drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6); drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6); drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6);
...@@ -60399,7 +60448,7 @@ static void drmp3_L3_save_reservoir(drmp3dec *h, drmp3dec_scratch *s) ...@@ -60399,7 +60448,7 @@ static void drmp3_L3_save_reservoir(drmp3dec *h, drmp3dec_scratch *s)
} }
if (remains > 0) if (remains > 0)
{ {
memmove(h->reserv_buf, s->maindata + pos, remains); DRMP3_MOVE_MEMORY(h->reserv_buf, s->maindata + pos, remains);
} }
h->reserv = remains; h->reserv = remains;
} }
...@@ -60407,8 +60456,8 @@ static int drmp3_L3_restore_reservoir(drmp3dec *h, drmp3_bs *bs, drmp3dec_scratc ...@@ -60407,8 +60456,8 @@ static int drmp3_L3_restore_reservoir(drmp3dec *h, drmp3_bs *bs, drmp3dec_scratc
{ {
int frame_bytes = (bs->limit - bs->pos)/8; int frame_bytes = (bs->limit - bs->pos)/8;
int bytes_have = DRMP3_MIN(h->reserv, main_data_begin); int bytes_have = DRMP3_MIN(h->reserv, main_data_begin);
memcpy(s->maindata, h->reserv_buf + DRMP3_MAX(0, h->reserv - main_data_begin), DRMP3_MIN(h->reserv, main_data_begin)); DRMP3_COPY_MEMORY(s->maindata, h->reserv_buf + DRMP3_MAX(0, h->reserv - main_data_begin), DRMP3_MIN(h->reserv, main_data_begin));
memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes); DRMP3_COPY_MEMORY(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes); drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);
return h->reserv >= main_data_begin; return h->reserv >= main_data_begin;
} }
...@@ -60786,7 +60835,7 @@ static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int ...@@ -60786,7 +60835,7 @@ static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int
{ {
drmp3d_DCT_II(grbuf + 576*i, nbands); drmp3d_DCT_II(grbuf + 576*i, nbands);
} }
memcpy(lins, qmf_state, sizeof(float)*15*64); DRMP3_COPY_MEMORY(lins, qmf_state, sizeof(float)*15*64);
for (i = 0; i < nbands; i += 2) for (i = 0; i < nbands; i += 2)
{ {
drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64); drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
...@@ -60801,7 +60850,7 @@ static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int ...@@ -60801,7 +60850,7 @@ static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int
} else } else
#endif #endif
{ {
memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64); DRMP3_COPY_MEMORY(qmf_state, lins + nbands*64, sizeof(float)*15*64);
} }
} }
static int drmp3d_match_frame(const drmp3_uint8 *hdr, int mp3_bytes, int frame_bytes) static int drmp3d_match_frame(const drmp3_uint8 *hdr, int mp3_bytes, int frame_bytes)
...@@ -60872,7 +60921,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -60872,7 +60921,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
} }
if (!frame_size) if (!frame_size)
{ {
memset(dec, 0, sizeof(drmp3dec)); DRMP3_ZERO_MEMORY(dec, sizeof(drmp3dec));
i = drmp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size); i = drmp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size);
if (!frame_size || i + frame_size > mp3_bytes) if (!frame_size || i + frame_size > mp3_bytes)
{ {
...@@ -60881,7 +60930,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -60881,7 +60930,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
} }
} }
hdr = mp3 + i; hdr = mp3 + i;
memcpy(dec->header, hdr, DRMP3_HDR_SIZE); DRMP3_COPY_MEMORY(dec->header, hdr, DRMP3_HDR_SIZE);
info->frame_bytes = i + frame_size; info->frame_bytes = i + frame_size;
info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2; info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
info->hz = drmp3_hdr_sample_rate_hz(hdr); info->hz = drmp3_hdr_sample_rate_hz(hdr);
...@@ -60905,7 +60954,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -60905,7 +60954,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
{ {
for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*576*info->channels)) for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*576*info->channels))
{ {
memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));
drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels); drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels);
drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]); drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
} }
...@@ -60921,7 +60970,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -60921,7 +60970,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
return drmp3_hdr_frame_samples(hdr); return drmp3_hdr_frame_samples(hdr);
} }
drmp3_L12_read_scale_info(hdr, bs_frame, sci); drmp3_L12_read_scale_info(hdr, bs_frame, sci);
memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));
for (i = 0, igr = 0; igr < 3; igr++) for (i = 0, igr = 0; igr < 3; igr++)
{ {
if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1))) if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1)))
...@@ -60929,7 +60978,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -60929,7 +60978,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
i = 0; i = 0;
drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]); drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]); drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));
pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*384*info->channels); pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*384*info->channels);
} }
if (bs_frame->pos > bs_frame->limit) if (bs_frame->pos > bs_frame->limit)
...@@ -61014,26 +61063,6 @@ DRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num ...@@ -61014,26 +61063,6 @@ DRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num
#ifndef DRMP3_DATA_CHUNK_SIZE #ifndef DRMP3_DATA_CHUNK_SIZE
#define DRMP3_DATA_CHUNK_SIZE DRMP3_MIN_DATA_CHUNK_SIZE*4 #define DRMP3_DATA_CHUNK_SIZE DRMP3_MIN_DATA_CHUNK_SIZE*4
#endif #endif
#ifndef DRMP3_ASSERT
#include <assert.h>
#define DRMP3_ASSERT(expression) assert(expression)
#endif
#ifndef DRMP3_COPY_MEMORY
#define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
#endif
#ifndef DRMP3_ZERO_MEMORY
#define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
#endif
#define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))
#ifndef DRMP3_MALLOC
#define DRMP3_MALLOC(sz) malloc((sz))
#endif
#ifndef DRMP3_REALLOC
#define DRMP3_REALLOC(p, sz) realloc((p), (sz))
#endif
#ifndef DRMP3_FREE
#define DRMP3_FREE(p) free((p))
#endif
#define DRMP3_COUNTOF(x) (sizeof(x) / sizeof(x[0])) #define DRMP3_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
#define DRMP3_CLAMP(x, lo, hi) (DRMP3_MAX(lo, DRMP3_MIN(x, hi))) #define DRMP3_CLAMP(x, lo, hi) (DRMP3_MAX(lo, DRMP3_MIN(x, hi)))
#ifndef DRMP3_PI_D #ifndef DRMP3_PI_D
...@@ -61203,7 +61232,7 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sa ...@@ -61203,7 +61232,7 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sa
if (pMP3->dataSize < DRMP3_MIN_DATA_CHUNK_SIZE) { if (pMP3->dataSize < DRMP3_MIN_DATA_CHUNK_SIZE) {
size_t bytesRead; size_t bytesRead;
if (pMP3->pData != NULL) { if (pMP3->pData != NULL) {
memmove(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize); DRMP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize);
} }
pMP3->dataConsumed = 0; pMP3->dataConsumed = 0;
if (pMP3->dataCapacity < DRMP3_DATA_CHUNK_SIZE) { if (pMP3->dataCapacity < DRMP3_DATA_CHUNK_SIZE) {
...@@ -61246,7 +61275,7 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sa ...@@ -61246,7 +61275,7 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sa
break; break;
} else if (info.frame_bytes == 0) { } else if (info.frame_bytes == 0) {
size_t bytesRead; size_t bytesRead;
memmove(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize); DRMP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize);
pMP3->dataConsumed = 0; pMP3->dataConsumed = 0;
if (pMP3->dataCapacity == pMP3->dataSize) { if (pMP3->dataCapacity == pMP3->dataSize) {
drmp3_uint8* pNewData; drmp3_uint8* pNewData;
...@@ -61278,12 +61307,20 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__memory(drmp3* pMP3, drmp3d_sampl ...@@ -61278,12 +61307,20 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__memory(drmp3* pMP3, drmp3d_sampl
if (pMP3->atEnd) { if (pMP3->atEnd) {
return 0; return 0;
} }
pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->memory.pData + pMP3->memory.currentReadPos, (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos), pPCMFrames, &info); for (;;) {
if (pcmFramesRead > 0) { pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->memory.pData + pMP3->memory.currentReadPos, (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos), pPCMFrames, &info);
pMP3->pcmFramesConsumedInMP3Frame = 0; if (pcmFramesRead > 0) {
pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead; pcmFramesRead = drmp3_hdr_frame_samples(pMP3->decoder.header);
pMP3->mp3FrameChannels = info.channels; pMP3->pcmFramesConsumedInMP3Frame = 0;
pMP3->mp3FrameSampleRate = info.hz; pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead;
pMP3->mp3FrameChannels = info.channels;
pMP3->mp3FrameSampleRate = info.hz;
break;
} else if (info.frame_bytes > 0) {
pMP3->memory.currentReadPos += (size_t)info.frame_bytes;
} else {
break;
}
} }
pMP3->memory.currentReadPos += (size_t)info.frame_bytes; pMP3->memory.currentReadPos += (size_t)info.frame_bytes;
return pcmFramesRead; return pcmFramesRead;
...@@ -61328,7 +61365,7 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm ...@@ -61328,7 +61365,7 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
if (pMP3->allocationCallbacks.onFree == NULL || (pMP3->allocationCallbacks.onMalloc == NULL && pMP3->allocationCallbacks.onRealloc == NULL)) { if (pMP3->allocationCallbacks.onFree == NULL || (pMP3->allocationCallbacks.onMalloc == NULL && pMP3->allocationCallbacks.onRealloc == NULL)) {
return DRMP3_FALSE; return DRMP3_FALSE;
} }
if (!drmp3_decode_next_frame(pMP3)) { if (drmp3_decode_next_frame(pMP3) == 0) {
drmp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks); drmp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks);
return DRMP3_FALSE; return DRMP3_FALSE;
} }
...@@ -62410,7 +62447,7 @@ static float* drmp3__full_read_and_close_f32(drmp3* pMP3, drmp3_config* pConfig, ...@@ -62410,7 +62447,7 @@ static float* drmp3__full_read_and_close_f32(drmp3* pMP3, drmp3_config* pConfig,
} }
oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(float); oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(float);
newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(float); newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(float);
if (newFramesBufferSize > DRMP3_SIZE_MAX) { if (newFramesBufferSize > (drmp3_uint64)DRMP3_SIZE_MAX) {
break; break;
} }
pNewFrames = (float*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks); pNewFrames = (float*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);
...@@ -62461,7 +62498,7 @@ static drmp3_int16* drmp3__full_read_and_close_s16(drmp3* pMP3, drmp3_config* pC ...@@ -62461,7 +62498,7 @@ static drmp3_int16* drmp3__full_read_and_close_s16(drmp3* pMP3, drmp3_config* pC
} }
oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(drmp3_int16); oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(drmp3_int16);
newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(drmp3_int16); newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(drmp3_int16);
if (newFramesBufferSize > DRMP3_SIZE_MAX) { if (newFramesBufferSize > (drmp3_uint64)DRMP3_SIZE_MAX) {
break; break;
} }
pNewFrames = (drmp3_int16*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks); pNewFrames = (drmp3_int16*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);
/* /*
Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file. Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file.
miniaudio - v0.10.41 - 2021-08-15 miniaudio - v0.10.42 - 2021-08-22
David Reid - mackron@gmail.com David Reid - mackron@gmail.com
...@@ -20,7 +20,7 @@ extern "C" { ...@@ -20,7 +20,7 @@ extern "C" {
#define MA_VERSION_MAJOR 0 #define MA_VERSION_MAJOR 0
#define MA_VERSION_MINOR 10 #define MA_VERSION_MINOR 10
#define MA_VERSION_REVISION 41 #define MA_VERSION_REVISION 42
#define MA_VERSION_STRING MA_XSTRINGIFY(MA_VERSION_MAJOR) "." MA_XSTRINGIFY(MA_VERSION_MINOR) "." MA_XSTRINGIFY(MA_VERSION_REVISION) #define MA_VERSION_STRING MA_XSTRINGIFY(MA_VERSION_MAJOR) "." MA_XSTRINGIFY(MA_VERSION_MINOR) "." MA_XSTRINGIFY(MA_VERSION_REVISION)
#if defined(_MSC_VER) && !defined(__clang__) #if defined(_MSC_VER) && !defined(__clang__)
......
/* /*
Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file. Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file.
miniaudio - v0.10.41 - 2021-08-15 miniaudio - v0.10.42 - 2021-08-22
David Reid - mackron@gmail.com David Reid - mackron@gmail.com
...@@ -1498,7 +1498,7 @@ extern "C" { ...@@ -1498,7 +1498,7 @@ extern "C" {
#define MA_VERSION_MAJOR 0 #define MA_VERSION_MAJOR 0
#define MA_VERSION_MINOR 10 #define MA_VERSION_MINOR 10
#define MA_VERSION_REVISION 41 #define MA_VERSION_REVISION 42
#define MA_VERSION_STRING MA_XSTRINGIFY(MA_VERSION_MAJOR) "." MA_XSTRINGIFY(MA_VERSION_MINOR) "." MA_XSTRINGIFY(MA_VERSION_REVISION) #define MA_VERSION_STRING MA_XSTRINGIFY(MA_VERSION_MAJOR) "." MA_XSTRINGIFY(MA_VERSION_MINOR) "." MA_XSTRINGIFY(MA_VERSION_REVISION)
#if defined(_MSC_VER) && !defined(__clang__) #if defined(_MSC_VER) && !defined(__clang__)
...@@ -9180,7 +9180,7 @@ typedef unsigned char c89atomic_bool; ...@@ -9180,7 +9180,7 @@ typedef unsigned char c89atomic_bool;
#define c89atomic_memory_order_release 3 #define c89atomic_memory_order_release 3
#define c89atomic_memory_order_acq_rel 4 #define c89atomic_memory_order_acq_rel 4
#define c89atomic_memory_order_seq_cst 5 #define c89atomic_memory_order_seq_cst 5
#if _MSC_VER < 1600 && defined(C89ATOMIC_32BIT) #if _MSC_VER < 1600 && defined(C89ATOMIC_X86)
#define C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY #define C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY
#endif #endif
#if _MSC_VER < 1600 #if _MSC_VER < 1600
...@@ -10644,6 +10644,10 @@ typedef unsigned char c89atomic_bool; ...@@ -10644,6 +10644,10 @@ typedef unsigned char c89atomic_bool;
#define c89atomic_fetch_and_i16(dst, src) c89atomic_fetch_and_explicit_i16(dst, src, c89atomic_memory_order_seq_cst) #define c89atomic_fetch_and_i16(dst, src) c89atomic_fetch_and_explicit_i16(dst, src, c89atomic_memory_order_seq_cst)
#define c89atomic_fetch_and_i32(dst, src) c89atomic_fetch_and_explicit_i32(dst, src, c89atomic_memory_order_seq_cst) #define c89atomic_fetch_and_i32(dst, src) c89atomic_fetch_and_explicit_i32(dst, src, c89atomic_memory_order_seq_cst)
#define c89atomic_fetch_and_i64(dst, src) c89atomic_fetch_and_explicit_i64(dst, src, c89atomic_memory_order_seq_cst) #define c89atomic_fetch_and_i64(dst, src) c89atomic_fetch_and_explicit_i64(dst, src, c89atomic_memory_order_seq_cst)
#define c89atomic_compare_and_swap_i8( dst, expected, dedsired) (c89atomic_int8 )c89atomic_compare_and_swap_8( (c89atomic_uint8* )dst, (c89atomic_uint8 )expected, (c89atomic_uint8 )dedsired)
#define c89atomic_compare_and_swap_i16(dst, expected, dedsired) (c89atomic_int16)c89atomic_compare_and_swap_16((c89atomic_uint16*)dst, (c89atomic_uint16)expected, (c89atomic_uint16)dedsired)
#define c89atomic_compare_and_swap_i32(dst, expected, dedsired) (c89atomic_int32)c89atomic_compare_and_swap_32((c89atomic_uint32*)dst, (c89atomic_uint32)expected, (c89atomic_uint32)dedsired)
#define c89atomic_compare_and_swap_i64(dst, expected, dedsired) (c89atomic_int64)c89atomic_compare_and_swap_64((c89atomic_uint64*)dst, (c89atomic_uint64)expected, (c89atomic_uint64)dedsired)
typedef union typedef union
{ {
c89atomic_uint32 i; c89atomic_uint32 i;
...@@ -46523,7 +46527,7 @@ extern "C" { ...@@ -46523,7 +46527,7 @@ extern "C" {
#define DRFLAC_XSTRINGIFY(x) DRFLAC_STRINGIFY(x) #define DRFLAC_XSTRINGIFY(x) DRFLAC_STRINGIFY(x)
#define DRFLAC_VERSION_MAJOR 0 #define DRFLAC_VERSION_MAJOR 0
#define DRFLAC_VERSION_MINOR 12 #define DRFLAC_VERSION_MINOR 12
#define DRFLAC_VERSION_REVISION 30 #define DRFLAC_VERSION_REVISION 31
#define DRFLAC_VERSION_STRING DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MAJOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MINOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_REVISION) #define DRFLAC_VERSION_STRING DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MAJOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MINOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_REVISION)
#include <stddef.h> #include <stddef.h>
typedef signed char drflac_int8; typedef signed char drflac_int8;
...@@ -46884,7 +46888,7 @@ extern "C" { ...@@ -46884,7 +46888,7 @@ extern "C" {
#define DRMP3_XSTRINGIFY(x) DRMP3_STRINGIFY(x) #define DRMP3_XSTRINGIFY(x) DRMP3_STRINGIFY(x)
#define DRMP3_VERSION_MAJOR 0 #define DRMP3_VERSION_MAJOR 0
#define DRMP3_VERSION_MINOR 6 #define DRMP3_VERSION_MINOR 6
#define DRMP3_VERSION_REVISION 28 #define DRMP3_VERSION_REVISION 31
#define DRMP3_VERSION_STRING DRMP3_XSTRINGIFY(DRMP3_VERSION_MAJOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_MINOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_REVISION) #define DRMP3_VERSION_STRING DRMP3_XSTRINGIFY(DRMP3_VERSION_MAJOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_MINOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_REVISION)
#include <stddef.h> #include <stddef.h>
typedef signed char drmp3_int8; typedef signed char drmp3_int8;
...@@ -65578,7 +65582,7 @@ static type* drflac__full_read_and_close_ ## extension (drflac* pFlac, unsigned ...@@ -65578,7 +65582,7 @@ static type* drflac__full_read_and_close_ ## extension (drflac* pFlac, unsigned
DRFLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \ DRFLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \
} else { \ } else { \
drflac_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type); \ drflac_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type); \
if (dataSize > DRFLAC_SIZE_MAX) { \ if (dataSize > (drflac_uint64)DRFLAC_SIZE_MAX) { \
goto on_error; \ goto on_error; \
} \ } \
\ \
...@@ -66021,6 +66025,29 @@ static __inline__ __attribute__((always_inline)) drmp3_int32 drmp3_clip_int16_ar ...@@ -66021,6 +66025,29 @@ static __inline__ __attribute__((always_inline)) drmp3_int32 drmp3_clip_int16_ar
#else #else
#define DRMP3_HAVE_ARMV6 0 #define DRMP3_HAVE_ARMV6 0
#endif #endif
#ifndef DRMP3_ASSERT
#include <assert.h>
#define DRMP3_ASSERT(expression) assert(expression)
#endif
#ifndef DRMP3_COPY_MEMORY
#define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
#endif
#ifndef DRMP3_MOVE_MEMORY
#define DRMP3_MOVE_MEMORY(dst, src, sz) memmove((dst), (src), (sz))
#endif
#ifndef DRMP3_ZERO_MEMORY
#define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
#endif
#define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))
#ifndef DRMP3_MALLOC
#define DRMP3_MALLOC(sz) malloc((sz))
#endif
#ifndef DRMP3_REALLOC
#define DRMP3_REALLOC(p, sz) realloc((p), (sz))
#endif
#ifndef DRMP3_FREE
#define DRMP3_FREE(p) free((p))
#endif
typedef struct typedef struct
{ {
const drmp3_uint8 *buf; const drmp3_uint8 *buf;
...@@ -66260,7 +66287,7 @@ static int drmp3_L12_dequantize_granule(float *grbuf, drmp3_bs *bs, drmp3_L12_sc ...@@ -66260,7 +66287,7 @@ static int drmp3_L12_dequantize_granule(float *grbuf, drmp3_bs *bs, drmp3_L12_sc
static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci, const float *scf, float *dst) static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci, const float *scf, float *dst)
{ {
int i, k; int i, k;
memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float)); DRMP3_COPY_MEMORY(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float));
for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6) for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)
{ {
for (k = 0; k < 12; k++) for (k = 0; k < 12; k++)
...@@ -66398,14 +66425,14 @@ static void drmp3_L3_read_scalefactors(drmp3_uint8 *scf, drmp3_uint8 *ist_pos, c ...@@ -66398,14 +66425,14 @@ static void drmp3_L3_read_scalefactors(drmp3_uint8 *scf, drmp3_uint8 *ist_pos, c
int cnt = scf_count[i]; int cnt = scf_count[i];
if (scfsi & 8) if (scfsi & 8)
{ {
memcpy(scf, ist_pos, cnt); DRMP3_COPY_MEMORY(scf, ist_pos, cnt);
} else } else
{ {
int bits = scf_size[i]; int bits = scf_size[i];
if (!bits) if (!bits)
{ {
memset(scf, 0, cnt); DRMP3_ZERO_MEMORY(scf, cnt);
memset(ist_pos, 0, cnt); DRMP3_ZERO_MEMORY(ist_pos, cnt);
} else } else
{ {
int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1; int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
...@@ -66646,12 +66673,19 @@ static void drmp3_L3_midside_stereo(float *left, int n) ...@@ -66646,12 +66673,19 @@ static void drmp3_L3_midside_stereo(float *left, int n)
int i = 0; int i = 0;
float *right = left + 576; float *right = left + 576;
#if DRMP3_HAVE_SIMD #if DRMP3_HAVE_SIMD
if (drmp3_have_simd()) for (; i < n - 3; i += 4) if (drmp3_have_simd())
{ {
drmp3_f4 vl = DRMP3_VLD(left + i); for (; i < n - 3; i += 4)
drmp3_f4 vr = DRMP3_VLD(right + i); {
DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr)); drmp3_f4 vl = DRMP3_VLD(left + i);
DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr)); drmp3_f4 vr = DRMP3_VLD(right + i);
DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr));
DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr));
}
#ifdef __GNUC__
if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0)
return;
#endif
} }
#endif #endif
for (; i < n; i++) for (; i < n; i++)
...@@ -66751,7 +66785,7 @@ static void drmp3_L3_reorder(float *grbuf, float *scratch, const drmp3_uint8 *sf ...@@ -66751,7 +66785,7 @@ static void drmp3_L3_reorder(float *grbuf, float *scratch, const drmp3_uint8 *sf
*dst++ = src[2*len]; *dst++ = src[2*len];
} }
} }
memcpy(grbuf, scratch, (dst - scratch)*sizeof(float)); DRMP3_COPY_MEMORY(grbuf, scratch, (dst - scratch)*sizeof(float));
} }
static void drmp3_L3_antialias(float *grbuf, int nbands) static void drmp3_L3_antialias(float *grbuf, int nbands)
{ {
...@@ -66901,8 +66935,8 @@ static void drmp3_L3_imdct_short(float *grbuf, float *overlap, int nbands) ...@@ -66901,8 +66935,8 @@ static void drmp3_L3_imdct_short(float *grbuf, float *overlap, int nbands)
for (;nbands > 0; nbands--, overlap += 9, grbuf += 18) for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
{ {
float tmp[18]; float tmp[18];
memcpy(tmp, grbuf, sizeof(tmp)); DRMP3_COPY_MEMORY(tmp, grbuf, sizeof(tmp));
memcpy(grbuf, overlap, 6*sizeof(float)); DRMP3_COPY_MEMORY(grbuf, overlap, 6*sizeof(float));
drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6); drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);
drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6); drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6); drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6);
...@@ -66943,7 +66977,7 @@ static void drmp3_L3_save_reservoir(drmp3dec *h, drmp3dec_scratch *s) ...@@ -66943,7 +66977,7 @@ static void drmp3_L3_save_reservoir(drmp3dec *h, drmp3dec_scratch *s)
} }
if (remains > 0) if (remains > 0)
{ {
memmove(h->reserv_buf, s->maindata + pos, remains); DRMP3_MOVE_MEMORY(h->reserv_buf, s->maindata + pos, remains);
} }
h->reserv = remains; h->reserv = remains;
} }
...@@ -66951,8 +66985,8 @@ static int drmp3_L3_restore_reservoir(drmp3dec *h, drmp3_bs *bs, drmp3dec_scratc ...@@ -66951,8 +66985,8 @@ static int drmp3_L3_restore_reservoir(drmp3dec *h, drmp3_bs *bs, drmp3dec_scratc
{ {
int frame_bytes = (bs->limit - bs->pos)/8; int frame_bytes = (bs->limit - bs->pos)/8;
int bytes_have = DRMP3_MIN(h->reserv, main_data_begin); int bytes_have = DRMP3_MIN(h->reserv, main_data_begin);
memcpy(s->maindata, h->reserv_buf + DRMP3_MAX(0, h->reserv - main_data_begin), DRMP3_MIN(h->reserv, main_data_begin)); DRMP3_COPY_MEMORY(s->maindata, h->reserv_buf + DRMP3_MAX(0, h->reserv - main_data_begin), DRMP3_MIN(h->reserv, main_data_begin));
memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes); DRMP3_COPY_MEMORY(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes); drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);
return h->reserv >= main_data_begin; return h->reserv >= main_data_begin;
} }
...@@ -67330,7 +67364,7 @@ static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int ...@@ -67330,7 +67364,7 @@ static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int
{ {
drmp3d_DCT_II(grbuf + 576*i, nbands); drmp3d_DCT_II(grbuf + 576*i, nbands);
} }
memcpy(lins, qmf_state, sizeof(float)*15*64); DRMP3_COPY_MEMORY(lins, qmf_state, sizeof(float)*15*64);
for (i = 0; i < nbands; i += 2) for (i = 0; i < nbands; i += 2)
{ {
drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64); drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
...@@ -67345,7 +67379,7 @@ static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int ...@@ -67345,7 +67379,7 @@ static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int
} else } else
#endif #endif
{ {
memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64); DRMP3_COPY_MEMORY(qmf_state, lins + nbands*64, sizeof(float)*15*64);
} }
} }
static int drmp3d_match_frame(const drmp3_uint8 *hdr, int mp3_bytes, int frame_bytes) static int drmp3d_match_frame(const drmp3_uint8 *hdr, int mp3_bytes, int frame_bytes)
...@@ -67416,7 +67450,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -67416,7 +67450,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
} }
if (!frame_size) if (!frame_size)
{ {
memset(dec, 0, sizeof(drmp3dec)); DRMP3_ZERO_MEMORY(dec, sizeof(drmp3dec));
i = drmp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size); i = drmp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size);
if (!frame_size || i + frame_size > mp3_bytes) if (!frame_size || i + frame_size > mp3_bytes)
{ {
...@@ -67425,7 +67459,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -67425,7 +67459,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
} }
} }
hdr = mp3 + i; hdr = mp3 + i;
memcpy(dec->header, hdr, DRMP3_HDR_SIZE); DRMP3_COPY_MEMORY(dec->header, hdr, DRMP3_HDR_SIZE);
info->frame_bytes = i + frame_size; info->frame_bytes = i + frame_size;
info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2; info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
info->hz = drmp3_hdr_sample_rate_hz(hdr); info->hz = drmp3_hdr_sample_rate_hz(hdr);
...@@ -67449,7 +67483,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -67449,7 +67483,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
{ {
for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*576*info->channels)) for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*576*info->channels))
{ {
memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));
drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels); drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels);
drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]); drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
} }
...@@ -67465,7 +67499,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -67465,7 +67499,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
return drmp3_hdr_frame_samples(hdr); return drmp3_hdr_frame_samples(hdr);
} }
drmp3_L12_read_scale_info(hdr, bs_frame, sci); drmp3_L12_read_scale_info(hdr, bs_frame, sci);
memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));
for (i = 0, igr = 0; igr < 3; igr++) for (i = 0, igr = 0; igr < 3; igr++)
{ {
if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1))) if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1)))
...@@ -67473,7 +67507,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m ...@@ -67473,7 +67507,7 @@ DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int m
i = 0; i = 0;
drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]); drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]); drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));
pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*384*info->channels); pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*384*info->channels);
} }
if (bs_frame->pos > bs_frame->limit) if (bs_frame->pos > bs_frame->limit)
...@@ -67558,26 +67592,6 @@ DRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num ...@@ -67558,26 +67592,6 @@ DRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num
#ifndef DRMP3_DATA_CHUNK_SIZE #ifndef DRMP3_DATA_CHUNK_SIZE
#define DRMP3_DATA_CHUNK_SIZE DRMP3_MIN_DATA_CHUNK_SIZE*4 #define DRMP3_DATA_CHUNK_SIZE DRMP3_MIN_DATA_CHUNK_SIZE*4
#endif #endif
#ifndef DRMP3_ASSERT
#include <assert.h>
#define DRMP3_ASSERT(expression) assert(expression)
#endif
#ifndef DRMP3_COPY_MEMORY
#define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
#endif
#ifndef DRMP3_ZERO_MEMORY
#define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
#endif
#define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))
#ifndef DRMP3_MALLOC
#define DRMP3_MALLOC(sz) malloc((sz))
#endif
#ifndef DRMP3_REALLOC
#define DRMP3_REALLOC(p, sz) realloc((p), (sz))
#endif
#ifndef DRMP3_FREE
#define DRMP3_FREE(p) free((p))
#endif
#define DRMP3_COUNTOF(x) (sizeof(x) / sizeof(x[0])) #define DRMP3_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
#define DRMP3_CLAMP(x, lo, hi) (DRMP3_MAX(lo, DRMP3_MIN(x, hi))) #define DRMP3_CLAMP(x, lo, hi) (DRMP3_MAX(lo, DRMP3_MIN(x, hi)))
#ifndef DRMP3_PI_D #ifndef DRMP3_PI_D
...@@ -67747,7 +67761,7 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sa ...@@ -67747,7 +67761,7 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sa
if (pMP3->dataSize < DRMP3_MIN_DATA_CHUNK_SIZE) { if (pMP3->dataSize < DRMP3_MIN_DATA_CHUNK_SIZE) {
size_t bytesRead; size_t bytesRead;
if (pMP3->pData != NULL) { if (pMP3->pData != NULL) {
memmove(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize); DRMP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize);
} }
pMP3->dataConsumed = 0; pMP3->dataConsumed = 0;
if (pMP3->dataCapacity < DRMP3_DATA_CHUNK_SIZE) { if (pMP3->dataCapacity < DRMP3_DATA_CHUNK_SIZE) {
...@@ -67790,7 +67804,7 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sa ...@@ -67790,7 +67804,7 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sa
break; break;
} else if (info.frame_bytes == 0) { } else if (info.frame_bytes == 0) {
size_t bytesRead; size_t bytesRead;
memmove(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize); DRMP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize);
pMP3->dataConsumed = 0; pMP3->dataConsumed = 0;
if (pMP3->dataCapacity == pMP3->dataSize) { if (pMP3->dataCapacity == pMP3->dataSize) {
drmp3_uint8* pNewData; drmp3_uint8* pNewData;
...@@ -67822,12 +67836,20 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__memory(drmp3* pMP3, drmp3d_sampl ...@@ -67822,12 +67836,20 @@ static drmp3_uint32 drmp3_decode_next_frame_ex__memory(drmp3* pMP3, drmp3d_sampl
if (pMP3->atEnd) { if (pMP3->atEnd) {
return 0; return 0;
} }
pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->memory.pData + pMP3->memory.currentReadPos, (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos), pPCMFrames, &info); for (;;) {
if (pcmFramesRead > 0) { pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->memory.pData + pMP3->memory.currentReadPos, (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos), pPCMFrames, &info);
pMP3->pcmFramesConsumedInMP3Frame = 0; if (pcmFramesRead > 0) {
pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead; pcmFramesRead = drmp3_hdr_frame_samples(pMP3->decoder.header);
pMP3->mp3FrameChannels = info.channels; pMP3->pcmFramesConsumedInMP3Frame = 0;
pMP3->mp3FrameSampleRate = info.hz; pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead;
pMP3->mp3FrameChannels = info.channels;
pMP3->mp3FrameSampleRate = info.hz;
break;
} else if (info.frame_bytes > 0) {
pMP3->memory.currentReadPos += (size_t)info.frame_bytes;
} else {
break;
}
} }
pMP3->memory.currentReadPos += (size_t)info.frame_bytes; pMP3->memory.currentReadPos += (size_t)info.frame_bytes;
return pcmFramesRead; return pcmFramesRead;
...@@ -67872,7 +67894,7 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm ...@@ -67872,7 +67894,7 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
if (pMP3->allocationCallbacks.onFree == NULL || (pMP3->allocationCallbacks.onMalloc == NULL && pMP3->allocationCallbacks.onRealloc == NULL)) { if (pMP3->allocationCallbacks.onFree == NULL || (pMP3->allocationCallbacks.onMalloc == NULL && pMP3->allocationCallbacks.onRealloc == NULL)) {
return DRMP3_FALSE; return DRMP3_FALSE;
} }
if (!drmp3_decode_next_frame(pMP3)) { if (drmp3_decode_next_frame(pMP3) == 0) {
drmp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks); drmp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks);
return DRMP3_FALSE; return DRMP3_FALSE;
} }
...@@ -68954,7 +68976,7 @@ static float* drmp3__full_read_and_close_f32(drmp3* pMP3, drmp3_config* pConfig, ...@@ -68954,7 +68976,7 @@ static float* drmp3__full_read_and_close_f32(drmp3* pMP3, drmp3_config* pConfig,
} }
oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(float); oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(float);
newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(float); newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(float);
if (newFramesBufferSize > DRMP3_SIZE_MAX) { if (newFramesBufferSize > (drmp3_uint64)DRMP3_SIZE_MAX) {
break; break;
} }
pNewFrames = (float*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks); pNewFrames = (float*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);
...@@ -69005,7 +69027,7 @@ static drmp3_int16* drmp3__full_read_and_close_s16(drmp3* pMP3, drmp3_config* pC ...@@ -69005,7 +69027,7 @@ static drmp3_int16* drmp3__full_read_and_close_s16(drmp3* pMP3, drmp3_config* pC
} }
oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(drmp3_int16); oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(drmp3_int16);
newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(drmp3_int16); newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(drmp3_int16);
if (newFramesBufferSize > DRMP3_SIZE_MAX) { if (newFramesBufferSize > (drmp3_uint64)DRMP3_SIZE_MAX) {
break; break;
} }
pNewFrames = (drmp3_int16*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks); pNewFrames = (drmp3_int16*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);
...@@ -69417,6 +69439,9 @@ The following miscellaneous changes have also been made. ...@@ -69417,6 +69439,9 @@ The following miscellaneous changes have also been made.
/* /*
REVISION HISTORY REVISION HISTORY
================ ================
v0.10.42 - 2021-08-22
- Fix a possible deadlock when stopping devices.
v0.10.41 - 2021-08-15 v0.10.41 - 2021-08-15
- Core Audio: Fix some deadlock errors. - Core Audio: Fix some deadlock errors.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment