From 3a2c203a806b3c201299f47ad192b0befc93c4b7 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 21 Oct 2025 08:28:30 -0700
Subject: [PATCH] Updated the Xcode project
---
Xcode/SDL_image.xcodeproj/project.pbxproj | 56 +++
Xcode/iOS/SDL3.framework/Headers/SDL.h | 3 +-
Xcode/iOS/SDL3.framework/Headers/SDL_assert.h | 7 +-
Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h | 18 +
Xcode/iOS/SDL3.framework/Headers/SDL_audio.h | 184 ++++++-
.../SDL3.framework/Headers/SDL_begin_code.h | 75 ++-
Xcode/iOS/SDL3.framework/Headers/SDL_camera.h | 28 +-
.../SDL3.framework/Headers/SDL_clipboard.h | 36 +-
.../iOS/SDL3.framework/Headers/SDL_cpuinfo.h | 21 +
Xcode/iOS/SDL3.framework/Headers/SDL_dialog.h | 10 +-
.../SDL3.framework/Headers/SDL_dlopennote.h | 227 +++++++++
Xcode/iOS/SDL3.framework/Headers/SDL_endian.h | 6 +-
Xcode/iOS/SDL3.framework/Headers/SDL_events.h | 88 +++-
.../SDL3.framework/Headers/SDL_filesystem.h | 34 +-
.../iOS/SDL3.framework/Headers/SDL_gamepad.h | 164 +++++-
Xcode/iOS/SDL3.framework/Headers/SDL_gpu.h | 411 +++++++++++++--
Xcode/iOS/SDL3.framework/Headers/SDL_haptic.h | 72 ++-
Xcode/iOS/SDL3.framework/Headers/SDL_hidapi.h | 19 +
Xcode/iOS/SDL3.framework/Headers/SDL_hints.h | 369 ++++++++++++--
Xcode/iOS/SDL3.framework/Headers/SDL_init.h | 4 +-
.../iOS/SDL3.framework/Headers/SDL_iostream.h | 149 +++---
.../iOS/SDL3.framework/Headers/SDL_joystick.h | 187 ++++++-
.../iOS/SDL3.framework/Headers/SDL_keyboard.h | 3 +-
.../iOS/SDL3.framework/Headers/SDL_keycode.h | 2 +
Xcode/iOS/SDL3.framework/Headers/SDL_log.h | 4 +-
Xcode/iOS/SDL3.framework/Headers/SDL_main.h | 27 +-
Xcode/iOS/SDL3.framework/Headers/SDL_mouse.h | 141 +++++-
Xcode/iOS/SDL3.framework/Headers/SDL_mutex.h | 8 +-
Xcode/iOS/SDL3.framework/Headers/SDL_pen.h | 57 ++-
Xcode/iOS/SDL3.framework/Headers/SDL_pixels.h | 12 +-
.../Headers/SDL_platform_defines.h | 23 +-
Xcode/iOS/SDL3.framework/Headers/SDL_power.h | 8 +-
.../iOS/SDL3.framework/Headers/SDL_process.h | 11 +
.../SDL3.framework/Headers/SDL_properties.h | 31 +-
Xcode/iOS/SDL3.framework/Headers/SDL_rect.h | 9 +-
Xcode/iOS/SDL3.framework/Headers/SDL_render.h | 470 ++++++++++++++++--
.../iOS/SDL3.framework/Headers/SDL_scancode.h | 2 +-
Xcode/iOS/SDL3.framework/Headers/SDL_sensor.h | 3 +-
Xcode/iOS/SDL3.framework/Headers/SDL_stdinc.h | 87 +++-
.../iOS/SDL3.framework/Headers/SDL_storage.h | 4 +
.../iOS/SDL3.framework/Headers/SDL_surface.h | 257 ++++++++--
Xcode/iOS/SDL3.framework/Headers/SDL_system.h | 4 +-
Xcode/iOS/SDL3.framework/Headers/SDL_thread.h | 3 +-
Xcode/iOS/SDL3.framework/Headers/SDL_timer.h | 12 +-
.../iOS/SDL3.framework/Headers/SDL_version.h | 11 +-
Xcode/iOS/SDL3.framework/Headers/SDL_video.h | 234 +++++++--
Xcode/iOS/SDL3.framework/Headers/SDL_vulkan.h | 6 +-
Xcode/iOS/SDL3.framework/SDL3.tbd | 35 +-
.../SDL3.framework/Versions/A/Headers/SDL.h | 3 +-
.../Versions/A/Headers/SDL_assert.h | 7 +-
.../Versions/A/Headers/SDL_atomic.h | 18 +
.../Versions/A/Headers/SDL_audio.h | 184 ++++++-
.../Versions/A/Headers/SDL_begin_code.h | 75 ++-
.../Versions/A/Headers/SDL_camera.h | 28 +-
.../Versions/A/Headers/SDL_clipboard.h | 36 +-
.../Versions/A/Headers/SDL_cpuinfo.h | 21 +
.../Versions/A/Headers/SDL_dialog.h | 10 +-
.../Versions/A/Headers/SDL_dlopennote.h | 227 +++++++++
.../Versions/A/Headers/SDL_endian.h | 6 +-
.../Versions/A/Headers/SDL_events.h | 88 +++-
.../Versions/A/Headers/SDL_filesystem.h | 34 +-
.../Versions/A/Headers/SDL_gamepad.h | 164 +++++-
.../Versions/A/Headers/SDL_gpu.h | 411 +++++++++++++--
.../Versions/A/Headers/SDL_haptic.h | 72 ++-
.../Versions/A/Headers/SDL_hidapi.h | 19 +
.../Versions/A/Headers/SDL_hints.h | 369 ++++++++++++--
.../Versions/A/Headers/SDL_init.h | 4 +-
.../Versions/A/Headers/SDL_iostream.h | 149 +++---
.../Versions/A/Headers/SDL_joystick.h | 187 ++++++-
.../Versions/A/Headers/SDL_keyboard.h | 3 +-
.../Versions/A/Headers/SDL_keycode.h | 2 +
.../Versions/A/Headers/SDL_log.h | 4 +-
.../Versions/A/Headers/SDL_main.h | 27 +-
.../Versions/A/Headers/SDL_mouse.h | 141 +++++-
.../Versions/A/Headers/SDL_mutex.h | 8 +-
.../Versions/A/Headers/SDL_pen.h | 57 ++-
.../Versions/A/Headers/SDL_pixels.h | 12 +-
.../Versions/A/Headers/SDL_platform_defines.h | 23 +-
.../Versions/A/Headers/SDL_power.h | 8 +-
.../Versions/A/Headers/SDL_process.h | 11 +
.../Versions/A/Headers/SDL_properties.h | 31 +-
.../Versions/A/Headers/SDL_rect.h | 9 +-
.../Versions/A/Headers/SDL_render.h | 470 ++++++++++++++++--
.../Versions/A/Headers/SDL_scancode.h | 2 +-
.../Versions/A/Headers/SDL_sensor.h | 3 +-
.../Versions/A/Headers/SDL_stdinc.h | 87 +++-
.../Versions/A/Headers/SDL_storage.h | 4 +
.../Versions/A/Headers/SDL_surface.h | 257 ++++++++--
.../Versions/A/Headers/SDL_system.h | 4 +-
.../Versions/A/Headers/SDL_thread.h | 3 +-
.../Versions/A/Headers/SDL_timer.h | 12 +-
.../Versions/A/Headers/SDL_version.h | 11 +-
.../Versions/A/Headers/SDL_video.h | 234 +++++++--
.../Versions/A/Headers/SDL_vulkan.h | 6 +-
.../macOS/SDL3.framework/Versions/A/SDL3.tbd | 35 +-
95 files changed, 6298 insertions(+), 910 deletions(-)
create mode 100644 Xcode/iOS/SDL3.framework/Headers/SDL_dlopennote.h
create mode 100644 Xcode/macOS/SDL3.framework/Versions/A/Headers/SDL_dlopennote.h
diff --git a/Xcode/SDL_image.xcodeproj/project.pbxproj b/Xcode/SDL_image.xcodeproj/project.pbxproj
index f9073a8c0..0a9544e3a 100644
--- a/Xcode/SDL_image.xcodeproj/project.pbxproj
+++ b/Xcode/SDL_image.xcodeproj/project.pbxproj
@@ -64,6 +64,20 @@
F354743E2828CA66007E9EDA /* IMG_jxl.c in Sources */ = {isa = PBXBuildFile; fileRef = F354743B2828CA66007E9EDA /* IMG_jxl.c */; };
F35475FD2829BAF9007E9EDA /* IMG_avif.c in Sources */ = {isa = PBXBuildFile; fileRef = F35475FC2829BAF9007E9EDA /* IMG_avif.c */; };
F382070E284EF58C004DD584 /* CMake in Resources */ = {isa = PBXBuildFile; fileRef = F3820707284EF58C004DD584 /* CMake */; };
+ F3DB661D2EA7DDC000568044 /* IMG_ani.c in Sources */ = {isa = PBXBuildFile; fileRef = F3DB66102EA7DDC000568044 /* IMG_ani.c */; };
+ F3DB661E2EA7DDC000568044 /* nanosvg.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66172EA7DDC000568044 /* nanosvg.h */; };
+ F3DB661F2EA7DDC000568044 /* IMG_ani.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB660F2EA7DDC000568044 /* IMG_ani.h */; };
+ F3DB66202EA7DDC000568044 /* IMG_anim_decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66112EA7DDC000568044 /* IMG_anim_decoder.h */; };
+ F3DB66212EA7DDC000568044 /* IMG_gif.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66142EA7DDC000568044 /* IMG_gif.h */; };
+ F3DB66222EA7DDC000568044 /* nanosvgrast.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66182EA7DDC000568044 /* nanosvgrast.h */; };
+ F3DB66232EA7DDC000568044 /* IMG_webp.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66162EA7DDC000568044 /* IMG_webp.h */; };
+ F3DB66242EA7DDC000568044 /* tiny_jpeg.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB661B2EA7DDC000568044 /* tiny_jpeg.h */; };
+ F3DB66252EA7DDC000568044 /* IMG_anim_encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66122EA7DDC000568044 /* IMG_anim_encoder.h */; };
+ F3DB66262EA7DDC000568044 /* qoi.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66192EA7DDC000568044 /* qoi.h */; };
+ F3DB66272EA7DDC000568044 /* xmlman.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB661C2EA7DDC000568044 /* xmlman.h */; };
+ F3DB66282EA7DDC000568044 /* IMG_avif.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66132EA7DDC000568044 /* IMG_avif.h */; };
+ F3DB66292EA7DDC000568044 /* stb_image.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB661A2EA7DDC000568044 /* stb_image.h */; };
+ F3DB662A2EA7DDC000568044 /* IMG_libpng.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66152EA7DDC000568044 /* IMG_libpng.h */; };
F3DC38C32E4CFF2500CD73DE /* xmlman.c in Sources */ = {isa = PBXBuildFile; fileRef = F3DC38C22E4CFF2500CD73DE /* xmlman.c */; };
F3DC38C42E4CFF2500CD73DE /* IMG_anim_encoder.c in Sources */ = {isa = PBXBuildFile; fileRef = F3DC38C02E4CFF2500CD73DE /* IMG_anim_encoder.c */; };
F3DC38C52E4CFF2500CD73DE /* IMG_libpng.c in Sources */ = {isa = PBXBuildFile; fileRef = F3DC38C12E4CFF2500CD73DE /* IMG_libpng.c */; };
@@ -190,6 +204,20 @@
F3547625282AE1C6007E9EDA /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = "<group>"; };
F3820707284EF58C004DD584 /* CMake */ = {isa = PBXFileReference; lastKnownFileType = folder; path = CMake; sourceTree = "<group>"; };
F3D87D15281EA88F005DA540 /* webp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = webp.xcodeproj; path = webp/webp.xcodeproj; sourceTree = "<group>"; };
+ F3DB660F2EA7DDC000568044 /* IMG_ani.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_ani.h; path = ../src/IMG_ani.h; sourceTree = SOURCE_ROOT; };
+ F3DB66102EA7DDC000568044 /* IMG_ani.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = IMG_ani.c; path = ../src/IMG_ani.c; sourceTree = SOURCE_ROOT; };
+ F3DB66112EA7DDC000568044 /* IMG_anim_decoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_anim_decoder.h; path = ../src/IMG_anim_decoder.h; sourceTree = SOURCE_ROOT; };
+ F3DB66122EA7DDC000568044 /* IMG_anim_encoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_anim_encoder.h; path = ../src/IMG_anim_encoder.h; sourceTree = SOURCE_ROOT; };
+ F3DB66132EA7DDC000568044 /* IMG_avif.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_avif.h; path = ../src/IMG_avif.h; sourceTree = SOURCE_ROOT; };
+ F3DB66142EA7DDC000568044 /* IMG_gif.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_gif.h; path = ../src/IMG_gif.h; sourceTree = SOURCE_ROOT; };
+ F3DB66152EA7DDC000568044 /* IMG_libpng.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_libpng.h; path = ../src/IMG_libpng.h; sourceTree = SOURCE_ROOT; };
+ F3DB66162EA7DDC000568044 /* IMG_webp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_webp.h; path = ../src/IMG_webp.h; sourceTree = SOURCE_ROOT; };
+ F3DB66172EA7DDC000568044 /* nanosvg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = nanosvg.h; path = ../src/nanosvg.h; sourceTree = SOURCE_ROOT; };
+ F3DB66182EA7DDC000568044 /* nanosvgrast.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = nanosvgrast.h; path = ../src/nanosvgrast.h; sourceTree = SOURCE_ROOT; };
+ F3DB66192EA7DDC000568044 /* qoi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = qoi.h; path = ../src/qoi.h; sourceTree = SOURCE_ROOT; };
+ F3DB661A2EA7DDC000568044 /* stb_image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = stb_image.h; path = ../src/stb_image.h; sourceTree = SOURCE_ROOT; };
+ F3DB661B2EA7DDC000568044 /* tiny_jpeg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = tiny_jpeg.h; path = ../src/tiny_jpeg.h; sourceTree = SOURCE_ROOT; };
+ F3DB661C2EA7DDC000568044 /* xmlman.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = xmlman.h; path = ../src/xmlman.h; sourceTree = SOURCE_ROOT; };
F3DC38BF2E4CFF2500CD73DE /* IMG_anim_decoder.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = IMG_anim_decoder.c; path = ../src/IMG_anim_decoder.c; sourceTree = SOURCE_ROOT; };
F3DC38C02E4CFF2500CD73DE /* IMG_anim_encoder.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = IMG_anim_encoder.c; path = ../src/IMG_anim_encoder.c; sourceTree = SOURCE_ROOT; };
F3DC38C12E4CFF2500CD73DE /* IMG_libpng.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = IMG_libpng.c; path = ../src/IMG_libpng.c; sourceTree = SOURCE_ROOT; };
@@ -256,15 +284,22 @@
isa = PBXGroup;
children = (
AA579DF1161C07E6005F809B /* IMG.c */,
+ F3DB660F2EA7DDC000568044 /* IMG_ani.h */,
+ F3DB66102EA7DDC000568044 /* IMG_ani.c */,
+ F3DB66112EA7DDC000568044 /* IMG_anim_decoder.h */,
F3DC38BF2E4CFF2500CD73DE /* IMG_anim_decoder.c */,
+ F3DB66122EA7DDC000568044 /* IMG_anim_encoder.h */,
F3DC38C02E4CFF2500CD73DE /* IMG_anim_encoder.c */,
+ F3DB66132EA7DDC000568044 /* IMG_avif.h */,
F35475FC2829BAF9007E9EDA /* IMG_avif.c */,
AA579DE2161C07E6005F809B /* IMG_bmp.c */,
+ F3DB66142EA7DDC000568044 /* IMG_gif.h */,
AA579DE3161C07E6005F809B /* IMG_gif.c */,
AA579DE4161C07E6005F809B /* IMG_ImageIO.m */,
AA579DE5161C07E6005F809B /* IMG_jpg.c */,
F354743B2828CA66007E9EDA /* IMG_jxl.c */,
AA579DE6161C07E6005F809B /* IMG_lbm.c */,
+ F3DB66152EA7DDC000568044 /* IMG_libpng.h */,
F3DC38C12E4CFF2500CD73DE /* IMG_libpng.c */,
AA579DE7161C07E6005F809B /* IMG_pcx.c */,
AA579DE8161C07E6005F809B /* IMG_png.c */,
@@ -274,10 +309,17 @@
AA50AA461F9C7C50003B9C0C /* IMG_svg.c */,
AA579DEA161C07E6005F809B /* IMG_tga.c */,
AA579DEB161C07E6005F809B /* IMG_tif.c */,
+ F3DB66162EA7DDC000568044 /* IMG_webp.h */,
AA579DEC161C07E6005F809B /* IMG_webp.c */,
AA579DED161C07E6005F809B /* IMG_xcf.c */,
AA579DEE161C07E6005F809B /* IMG_xpm.c */,
AA579DEF161C07E6005F809B /* IMG_xv.c */,
+ F3DB66172EA7DDC000568044 /* nanosvg.h */,
+ F3DB66182EA7DDC000568044 /* nanosvgrast.h */,
+ F3DB66192EA7DDC000568044 /* qoi.h */,
+ F3DB661A2EA7DDC000568044 /* stb_image.h */,
+ F3DB661B2EA7DDC000568044 /* tiny_jpeg.h */,
+ F3DB661C2EA7DDC000568044 /* xmlman.h */,
F3DC38C22E4CFF2500CD73DE /* xmlman.c */,
);
name = "Library Source";
@@ -362,6 +404,19 @@
buildActionMask = 2147483647;
files = (
BE1FA71A07AF4C44004B6283 /* SDL_image.h in Headers */,
+ F3DB661E2EA7DDC000568044 /* nanosvg.h in Headers */,
+ F3DB661F2EA7DDC000568044 /* IMG_ani.h in Headers */,
+ F3DB66202EA7DDC000568044 /* IMG_anim_decoder.h in Headers */,
+ F3DB66212EA7DDC000568044 /* IMG_gif.h in Headers */,
+ F3DB66222EA7DDC000568044 /* nanosvgrast.h in Headers */,
+ F3DB66232EA7DDC000568044 /* IMG_webp.h in Headers */,
+ F3DB66242EA7DDC000568044 /* tiny_jpeg.h in Headers */,
+ F3DB66252EA7DDC000568044 /* IMG_anim_encoder.h in Headers */,
+ F3DB66262EA7DDC000568044 /* qoi.h in Headers */,
+ F3DB66272EA7DDC000568044 /* xmlman.h in Headers */,
+ F3DB66282EA7DDC000568044 /* IMG_avif.h in Headers */,
+ F3DB66292EA7DDC000568044 /* stb_image.h in Headers */,
+ F3DB662A2EA7DDC000568044 /* IMG_libpng.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -577,6 +632,7 @@
F35475FD2829BAF9007E9EDA /* IMG_avif.c in Sources */,
AA579E04161C07E7005F809B /* IMG_tif.c in Sources */,
AA579E06161C07E7005F809B /* IMG_webp.c in Sources */,
+ F3DB661D2EA7DDC000568044 /* IMG_ani.c in Sources */,
AA579E08161C07E7005F809B /* IMG_xcf.c in Sources */,
AA579E0A161C07E7005F809B /* IMG_xpm.c in Sources */,
F354743E2828CA66007E9EDA /* IMG_jxl.c in Sources */,
diff --git a/Xcode/iOS/SDL3.framework/Headers/SDL.h b/Xcode/iOS/SDL3.framework/Headers/SDL.h
index f8586ad46..7cfba76e6 100644
--- a/Xcode/iOS/SDL3.framework/Headers/SDL.h
+++ b/Xcode/iOS/SDL3.framework/Headers/SDL.h
@@ -20,7 +20,7 @@
*/
/**
- * Main include header for the SDL library, version 3.2.6
+ * Main include header for the SDL library, version 3.3.0
*
* It is almost always best to include just this one header instead of
* picking out individual headers included here. There are exceptions to
@@ -42,6 +42,7 @@
#include <SDL3/SDL_clipboard.h>
#include <SDL3/SDL_cpuinfo.h>
#include <SDL3/SDL_dialog.h>
+#include <SDL3/SDL_dlopennote.h>
#include <SDL3/SDL_endian.h>
#include <SDL3/SDL_error.h>
#include <SDL3/SDL_events.h>
diff --git a/Xcode/iOS/SDL3.framework/Headers/SDL_assert.h b/Xcode/iOS/SDL3.framework/Headers/SDL_assert.h
index 6c90acc02..2ab796a1a 100644
--- a/Xcode/iOS/SDL3.framework/Headers/SDL_assert.h
+++ b/Xcode/iOS/SDL3.framework/Headers/SDL_assert.h
@@ -126,15 +126,12 @@ extern "C" {
*/
#define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner
-#elif defined(_MSC_VER) && _MSC_VER >= 1310
+#elif defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER >= 1310)
/* Don't include intrin.h here because it contains C++ code */
extern void __cdecl __debugbreak(void);
#define SDL_TriggerBreakpoint() __debugbreak()
#elif defined(_MSC_VER) && defined(_M_IX86)
#define SDL_TriggerBreakpoint() { _asm { int 0x03 } }
-#elif defined(ANDROID)
- #include <assert.h>
- #define SDL_TriggerBreakpoint() assert(0)
#elif SDL_HAS_BUILTIN(__builtin_debugtrap)
#define SDL_TriggerBreakpoint() __builtin_debugtrap()
#elif SDL_HAS_BUILTIN(__builtin_trap)
@@ -362,7 +359,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *
#define SDL_enabled_assert(condition) \
do { \
while ( !(condition) ) { \
- static struct SDL_AssertData sdl_assert_data = { 0, 0, #condition, 0, 0, 0, 0 }; \
+ static struct SDL_AssertData sdl_assert_data = { false, 0, #condition, NULL, 0, NULL, NULL }; \
const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \
if (sdl_assert_state == SDL_ASSERTION_RETRY) { \
continue; /* go again. */ \
diff --git a/Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h b/Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h
index 78b5e0fa5..bfcf81ee0 100644
--- a/Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h
+++ b/Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h
@@ -596,6 +596,24 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 v);
*/
extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAtomicU32(SDL_AtomicU32 *a);
+/**
+ * Add to an atomic variable.
+ *
+ * This function also acts as a full memory barrier.
+ *
+ * ***Note: If you don't know what this function is for, you shouldn't use
+ * it!***
+ *
+ * \param a a pointer to an SDL_AtomicU32 variable to be modified.
+ * \param v the desired value to add or subtract.
+ * \returns the previous value of the atomic variable.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.4.0.
+ */
+extern SDL_DECLSPEC Uint32 SDLCALL SDL_AddAtomicU32(SDL_AtomicU32 *a, int v);
+
/**
* Set a pointer to a new value if it is currently an old value.
*
diff --git a/Xcode/iOS/SDL3.framework/Headers/SDL_audio.h b/Xcode/iOS/SDL3.framework/Headers/SDL_audio.h
index 541c5dfba..be5eb32e9 100644
--- a/Xcode/iOS/SDL3.framework/Headers/SDL_audio.h
+++ b/Xcode/iOS/SDL3.framework/Headers/SDL_audio.h
@@ -942,7 +942,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID devid);
* Binding a stream to a device will set its output format for playback
* devices, and its input format for recording devices, so they match the
* device's settings. The caller is welcome to change the other end of the
- * stream's format at any time with SDL_SetAudioStreamFormat().
+ * stream's format at any time with SDL_SetAudioStreamFormat(). If the other
+ * end of the stream's format has never been set (the audio stream was created
+ * with a NULL audio spec), this function will set it to match the device
+ * end's format.
*
* \param devid an audio device to bind a stream to.
* \param streams an array of audio streams to bind.
@@ -1021,7 +1024,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStream(SDL_AudioStream *stream);
/**
* Query an audio stream for its currently-bound device.
*
- * This reports the audio device that an audio stream is currently bound to.
+ * This reports the logical audio device that an audio stream is currently
+ * bound to.
*
* If not bound, or invalid, this returns zero, which is not a valid device
* ID.
@@ -1063,6 +1067,17 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au
/**
* Get the properties associated with an audio stream.
*
+ * The application can hang any data it wants here, but the following
+ * properties are understood by SDL:
+ *
+ * - `SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN`: if true (the default), the
+ * stream be automatically cleaned up when the audio subsystem quits. If set
+ * to false, the streams will persist beyond that. This property is ignored
+ * for streams created through SDL_OpenAudioDeviceStream(), and will always
+ * be cleaned up. Streams that are not cleaned up will still be unbound from
+ * devices when the audio subsystem quits. This property was added in SDL
+ * 3.4.0.
+ *
* \param stream the SDL_AudioStream to query.
* \returns a valid property ID on success or 0 on failure; call
* SDL_GetError() for more information.
@@ -1073,6 +1088,9 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au
*/
extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_AudioStream *stream);
+#define SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN "SDL.audiostream.auto_cleanup"
+
+
/**
* Query the current format of an audio stream.
*
@@ -1149,14 +1167,14 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamFrequencyRatio(SDL_AudioStre
*
* The frequency ratio is used to adjust the rate at which input data is
* consumed. Changing this effectively modifies the speed and pitch of the
- * audio. A value greater than 1.0 will play the audio faster, and at a higher
- * pitch. A value less than 1.0 will play the audio slower, and at a lower
- * pitch.
+ * audio. A value greater than 1.0f will play the audio faster, and at a
+ * higher pitch. A value less than 1.0f will play the audio slower, and at a
+ * lower pitch. 1.0f means play at normal speed.
*
* This is applied during SDL_GetAudioStreamData, and can be continuously
* changed to create various effects.
*
- * \param stream the stream the frequency ratio is being changed.
+ * \param stream the stream on which the frequency ratio is being changed.
* \param ratio the frequency ratio. 1.0 is normal speed. Must be between 0.01
* and 100.
* \returns true on success or false on failure; call SDL_GetError() for more
@@ -1332,7 +1350,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStre
* Channel maps are optional; most things do not need them, instead passing
* data in the [order that SDL expects](CategoryAudio#channel-layouts).
*
- * The output channel map reorders data that leaving a stream via
+ * The output channel map reorders data that is leaving a stream via
* SDL_GetAudioStreamData.
*
* Each item in the array represents an input channel, and its value is the
@@ -1414,6 +1432,136 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStr
*/
extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream, const void *buf, int len);
+/**
+ * A callback that fires for completed SDL_PutAudioStreamDataNoCopy() data.
+ *
+ * When using SDL_PutAudioStreamDataNoCopy() to provide data to an
+ * SDL_AudioStream, it's not safe to dispose of the data until the stream has
+ * completely consumed it. Often times it's difficult to know exactly when
+ * this has happened.
+ *
+ * This callback fires once when the stream no longer needs the buffer,
+ * allowing the app to easily free or reuse it.
+ *
+ * \param userdata an opaque pointer provided by the app for their personal
+ * use.
+ * \param buf the pointer provided to SDL_PutAudioStreamDataNoCopy().
+ * \param buflen the size of buffer, in bytes, provided to
+ * SDL_PutAudioStreamDataNoCopy().
+ *
+ * \threadsafety This callbacks may run from any thread, so if you need to
+ * protect shared data, you should use SDL_LockAudioStream to
+ * serialize access; this lock will be held before your callback
+ * is called, so your callback does not need to manage the lock
+ * explicitly.
+ *
+ * \since This datatype is available since SDL 3.4.0.
+ *
+ * \sa SDL_SetAudioStreamGetCallback
+ * \sa SDL_SetAudioStreamPutCallback
+ */
+typedef void (SDLCALL *SDL_AudioStreamDataCompleteCallback)(void *userdata, const void *buf, int buflen);
+
+/**
+ * Add external data to an audio stream without copying it.
+ *
+ * Unlike SDL_PutAudioStreamData(), this function does not make a copy of the
+ * provided data, instead storing the provided pointer. This means that the
+ * put operation does not need to allocate and copy the data, but the original
+ * data must remain available until the stream is done with it, either by
+ * being read from the stream in its entirety, or a call to
+ * SDL_ClearAudioStream() or SDL_DestroyAudioStream().
+ *
+ * The data must match the format/channels/samplerate specified in the latest
+ * call to SDL_SetAudioStreamFormat, or the format specified when creating the
+ * stream if it hasn't been changed.
+ *
+ * An optional callback may be provided, which is called when the stream no
+ * longer needs the data. Once this callback fires, the stream will not access
+ * the data again. This callback will fire for any reason the data is no
+ * longer needed, including clearing or destroying the stream.
+ *
+ * Note that there is still an allocation to store tracking information, so
+ * this function is more efficient for larger blocks of data. If you're
+ * planning to put a few samples at a time, it will be more efficient to use
+ * SDL_PutAudioStreamData(), which allocates and buffers in blocks.
+ *
+ * \param stream the stream the audio data is being added to.
+ * \param buf a pointer to the audio data to add.
+ * \param len the number of bytes to add to the stream.
+ * \param callback the callback function to call when the data is no longer
+ * needed by the stream. May be NULL.
+ * \param userdata an opaque pointer provided to the callback for its own
+ * personal use.
+ * \returns true on success or false on failure; call SDL_GetError() for more
+ * information.
+ *
+ * \threadsafety It is safe to call this function from any thread, but if the
+ * stream has a callback set, the caller might need to manage
+ * extra locking.
+ *
+ * \since This function is available since SDL 3.4.0.
+ *
+ * \sa SDL_ClearAudioStream
+ * \sa SDL_FlushAudioStream
+ * \sa SDL_GetAudioStreamData
+ * \sa SDL_GetAudioStreamQueued
+ */
+extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamDataNoCopy(SDL_AudioStream *stream, const void *buf, int len, SDL_AudioStreamDataCompleteCallback callback, void *userdata);
+
+/**
+ * Add data to the stream with each channel in a separate array.
+ *
+ * This data must match the format/channels/samplerate specified in the latest
+ * call to SDL_SetAudioStreamFormat, or the format specified when creating the
+ * stream if it hasn't been changed.
+ *
+ * The data will be interleaved and queued. Note that SDL_AudioStream only
+ * operates on interleaved data, so this is simply a convenience function for
+ * easily queueing data from sources that provide separate arrays. There is no
+ * equivalent function to retrieve planar data.
+ *
+ * The arrays in `channel_buffers` are ordered as they are to be interleaved;
+ * the first array will be the first sample in the interleaved data. Any
+ * individual array may be NULL; in this case, silence will be interleaved for
+ * that channel.
+ *
+ * `num_channels` specifies how many arrays are in `channel_buffers`. This can
+ * be used as a safety to prevent overflow, in case the stream format has
+ * changed elsewhere. If more channels are specified than the current input
+ * spec, they are ignored. If less channels are specified, the missing arrays
+ * are treated as if they are NULL (silence is written to those channels). If
+ * the count is -1, SDL will assume the array count matches the current input
+ * spec.
+ *
+ * Note that `num_samples` is the number of _samples per array_. This can also
+ * be thought of as the number of _sample frames_ to be queued. A value of 1
+ * with stereo arrays will queue two samples to the stream. This is different
+ * than SDL_PutAudioStreamData, which wants the size of a single array in
+ * bytes.
+ *
+ * \param stream the stream the audio data is being added to.
+ * \param channel_buffers a pointer to an array of arrays, one array per
+ * channel.
+ * \param num_channels the number of arrays in `channel_buffers` or -1.
+ * \param num_samples the number of _samples_ per array to write to the
+ * stream.
+ * \returns true on success or false on failure; call SDL_GetError() for more
+ * information.
+ *
+ * \threadsafety It is safe to call this function from any thread, but if the
+ * stream has a callback set, the caller might need to manage
+ * extra locking.
+ *
+ * \since This function is available since SDL 3.4.0.
+ *
+ * \sa SDL_ClearAudioStream
+ * \sa SDL_FlushAudioStream
+ * \sa SDL_GetAudioStreamData
+ * \sa SDL_GetAudioStreamQueued
+ */
+extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamPlanarData(SDL_AudioStream *stream, const void * const *channel_buffers, int num_channels, int num_samples);
+
/**
* Get converted/resampled data from the stream.
*
@@ -1583,8 +1731,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *str
* previously been paused. Once unpaused, any bound audio streams will begin
* to progress again, and audio can be generated.
*
- * Remember, SDL_OpenAudioDeviceStream opens device in a paused state, so this
- * function call is required for audio playback to begin on such device.
+ * SDL_OpenAudioDeviceStream opens audio devices in a paused state, so this
+ * function call is required for audio playback to begin on such devices.
*
* \param stream the audio stream associated with the audio device to resume.
* \returns true on success or false on failure; call SDL_GetError() for more
@@ -1717,7 +1865,7 @@ typedef void (SDLCALL *SDL_AudioStreamCallback)(void *userdata, SDL_AudioStream
* audio to the stream during this call; if needed, the request that triggered
* this callback will obtain the new data immediately.
*
- * The callback's `approx_request` argument is roughly how many bytes of
+ * The callback's `additional_amount` argument is roughly how many bytes of
* _unconverted_ data (in the stream's input format) is needed by the caller,
* although this may overestimate a little for safety. This takes into account
* how much is already in the stream and only asks for any extra necessary to
@@ -1762,13 +1910,13 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStream *
* The callback can (optionally) call SDL_GetAudioStreamData() to obtain audio
* from the stream during this call.
*
- * The callback's `a
(Patch may be truncated, please check the link at the top of this post.)