From dc923e9ec27d4c99e8e42cc977055444c86e3252 Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Sat, 17 Jan 2026 05:10:10 +0300
Subject: [PATCH] updated dr_mp3.h and dr_flac.h from mainstream.
---
src/dr_libs/dr_flac.h | 25 ++++++++++++++++++++-----
src/dr_libs/dr_mp3.h | 9 ++++-----
2 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/src/dr_libs/dr_flac.h b/src/dr_libs/dr_flac.h
index c95a78c3e..2891194c7 100644
--- a/src/dr_libs/dr_flac.h
+++ b/src/dr_libs/dr_flac.h
@@ -1,6 +1,6 @@
/*
FLAC audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file.
-dr_flac - v0.13.2 - 2025-12-02
+dr_flac - v0.13.3 - 2026-01-17
David Reid - mackron@gmail.com
@@ -126,7 +126,7 @@ extern "C" {
#define DRFLAC_VERSION_MAJOR 0
#define DRFLAC_VERSION_MINOR 13
-#define DRFLAC_VERSION_REVISION 2
+#define DRFLAC_VERSION_REVISION 3
#define DRFLAC_VERSION_STRING DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MAJOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MINOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_REVISION)
#include <stddef.h> /* For size_t. */
@@ -2716,9 +2716,17 @@ static DRFLAC_INLINE drflac_uint32 drflac__clz_lzcnt(drflac_cache_t x)
#if defined(__GNUC__) || defined(__clang__)
#if defined(DRFLAC_X64)
{
+ /*
+ A note on lzcnt.
+
+ We check for the presence of the lzcnt instruction at runtime before calling this function, but we still generate this code. I have had
+ a report where the assembler does not recognize the lzcnt instruction. To work around this we are going to use `rep; bsr` instead which
+ has an identical byte encoding as lzcnt, and should hopefully improve compatibility with older assemblers.
+ */
drflac_uint64 r;
__asm__ __volatile__ (
- "lzcnt{ %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc"
+ "rep; bsr{q %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc"
+ /*"lzcnt{ %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc"*/
);
return (drflac_uint32)r;
@@ -2727,7 +2735,8 @@ static DRFLAC_INLINE drflac_uint32 drflac__clz_lzcnt(drflac_cache_t x)
{
drflac_uint32 r;
__asm__ __volatile__ (
- "lzcnt{l %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc"
+ "rep; bsr{l %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc"
+ /*"lzcnt{l %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc"*/
);
return r;
@@ -6842,8 +6851,10 @@ static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, d
}
blockSizeRemaining -= metadata.data.picture.pictureDataSize;
- metadata.data.picture.pPictureData = (const drflac_uint8*)pPictureData;
+ (void)blockSizeRemaining;
+ metadata.data.picture.pPictureData = (const drflac_uint8*)pPictureData;
+
/* Only fire the callback if we actually have a way to read the image data. We must have either a valid offset, or a valid data pointer. */
if (metadata.data.picture.pictureDataOffset != 0 || metadata.data.picture.pPictureData != NULL) {
@@ -12158,6 +12169,10 @@ DRFLAC_API drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterat
/*
REVISION HISTORY
================
+v0.13.3 - 2026-01-17
+ - Fix a compiler compatibility issue with some inlined assembly.
+ - Fix a compilation warning.
+
v0.13.2 - 2025-12-02
- Improve robustness of the parsing of picture metadata to improve support for memory constrained embedded devices.
- Fix a warning about an assigned by unused variable.
diff --git a/src/dr_libs/dr_mp3.h b/src/dr_libs/dr_mp3.h
index 90fe66a97..e8833d136 100644
--- a/src/dr_libs/dr_mp3.h
+++ b/src/dr_libs/dr_mp3.h
@@ -1,6 +1,6 @@
/*
MP3 audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file.
-dr_mp3 - v0.7.3 - TBD
+dr_mp3 - v0.7.3 - 2026-01-17
David Reid - mackron@gmail.com
@@ -3170,7 +3170,6 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
{
drmp3_bs bs;
drmp3_L3_gr_info grInfo[4];
- const drmp3_uint8* pTagData = pFirstFrameData;
drmp3_bs_init(&bs, pFirstFrameData + DRMP3_HDR_SIZE, firstFrameInfo.frame_bytes - DRMP3_HDR_SIZE);
@@ -3181,6 +3180,7 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
if (drmp3_L3_read_side_info(&bs, grInfo, pFirstFrameData) >= 0) {
drmp3_bool32 isXing = DRMP3_FALSE;
drmp3_bool32 isInfo = DRMP3_FALSE;
+ const drmp3_uint8* pTagData;
const drmp3_uint8* pTagDataBeg;
pTagDataBeg = pFirstFrameData + DRMP3_HDR_SIZE + (bs.pos/8);
@@ -3331,8 +3331,6 @@ static drmp3_bool32 drmp3__on_seek_memory(void* pUserData, int byteOffset, drmp3
DRMP3_ASSERT(pMP3 != NULL);
- newCursor = pMP3->memory.currentReadPos;
-
if (origin == DRMP3_SEEK_SET) {
newCursor = 0;
} else if (origin == DRMP3_SEEK_CUR) {
@@ -5009,8 +5007,9 @@ DIFFERENCES BETWEEN minimp3 AND dr_mp3
/*
REVISION HISTORY
================
-v0.7.3 - TBD
+v0.7.3 - 2026-01-17
- Fix an error in drmp3_open_and_read_pcm_frames_s16() and family when memory allocation fails.
+ - Fix some compilation warnings.
v0.7.2 - 2025-12-02
- Reduce stack space to improve robustness on embedded systems.