Commit Graph
100 Commits
Author SHA1 Message Date
Ryan C. Gordon 08c6ac1b16 test: SDLTest_PrintEvent now reports key event mod state.
(cherry picked from commit d42fa25a9e)
2023-11-28 13:11:57 -05:00
Ryan C. Gordon 3817f5126e cocoa: Use -[NSApplicationDelegate applicationSupportsSecureRestorableState].
This prevents warnings at startup on macOS Sonoma (14.0).

(cherry picked from commit 7d25a443c4)
2023-11-28 12:41:35 -05:00
Ryan C. Gordon c5b0ff77d7 test: testwm2 now displays keyboard mod state.
(cherry picked from commit 258849c9bc)
2023-11-28 12:10:57 -05:00
Ryan C. Gordon 42a8139fd6 render: Clip bresenham lines against a real viewport thing.
You can't just use renderer->view->viewport, because it might be (0,0), -1x-1.

I _think_ this is more right?

Fixes #8609.
2023-11-25 01:51:35 -05:00
Ryan C. Gordon 4a40a272bd render: Patched to compile.
Bad cherry-pick on my part, sorry!

Fixes #8609.
2023-11-24 22:47:44 -05:00
Ryan C. Gordon 983f178b7d render: Clip lines before Bresenham algorithm generates points.
Otherwise, a massive line might generate gigabytes worth of points to render,
which the backend would simply throw away anyhow.

Fixes #8113.

(cherry picked from commit 4339647d90)
2023-11-24 19:34:47 -05:00
Ryan C. Gordon db7f6425d0 rect: Avoid numeric overflow on massive lines in SDL_IntersectRectAndLine.
Reference Issue #8301.
Reference Issue #8113.

(cherry picked from commit a391dd5fef)
2023-11-24 19:34:20 -05:00
Ryan C. Gordon 6ba90f7775 render: Batching is always enabled now!
Make sure your app uses SDL_RenderFlush() before it talks to D3D/OpenGL/etc!

Fixes #8584.
2023-11-23 20:37:52 -05:00
Ryan C. Gordon b24d6bd59a opengl: Creating a texture trashes the cached texturing state, fix it.
Reference Issue #7194.

(cherry picked from commit e9b4869372)
2023-11-23 20:01:02 -05:00
Ryan C. Gordon dcf04559db render: GL-based renderers should treat adaptive vsync as vsync being enabled.
Fixes #8004.
2023-11-23 18:28:43 -05:00
Ryan C. Gordon 74a2542564 x11: Deal with difference in GLX_EXT_swap_control_tear behavior.
Mesa and Nvidia handle it differently, and one or the other may fix their
implementation in the future, so test which way it works at runtime.

Reference Issue #8004.
2023-11-23 13:56:51 -05:00
Ryan C. Gordon 6cde96f9a0 psp: Hook up event subsystem init/quit.
Fixes #8554.

(cherry picked from commit 0e9d050296)
2023-11-22 18:03:29 -05:00
Ryan C. Gordon e9659f5738 Removed some function declarations that don't actually exist.
Reference Issue #8554.

(cherry picked from commit 87875a49b4)
2023-11-22 17:58:54 -05:00
Ryan C. Gordon 3264e64738 SDL_RunApp: Make sure argc/argv are stable if the caller didn't define them.
Fixes #8246.
2023-11-22 17:34:39 -05:00
Ryan C. Gordon 5b1c68c2f3 testshader: Don't make local variables with the same name as GL entry points.
Reference Issue #2706.

(cherry picked from commit cb5b8c9747)
2023-11-20 15:12:37 -05:00
Ryan C. Gordon f2c12fe5f3 Removed TODO.txt
This is obviously not how we track bugs at this point.  :)
2023-11-16 08:47:37 -05:00
Ryan C. Gordon e923a458ea audio: Protect against race conditions when closing a physical device.
This specifically deals with two threads closing the same device at the same
time, and a thread trying to reopen the device as it's still in process of
being closed. This can happen in normal usage if a device is disconnected:
the OS might send a disconnect event, while the device thread also attempts
to manage a disconnect as system calls start to report failure.

This effort is necessary because we have to release the device lock during
close to allow the device thread to unblock and cleanly shutdown. But the
good news is that all the places that call ClosePhysicalAudioDevice can now
safely hold the device lock on entry, and that one function will manage the
lock tapdancing.
2023-11-15 14:17:14 -05:00
Ryan C. Gordon 8fa0746d4a audio: Fix postmix state when migrating to new default devices.
Otherwise buffers might not be allocated, etc.
2023-11-15 14:17:13 -05:00
Ryan C. Gordon a58af6d0d1 wasapi: Reference devices when proxying to management thread.
Otherwise, a disconnect/default change on another thread may cause the
device pointer to become invalid by the time the management thread runs the
task.
2023-11-14 16:20:14 -05:00
Ryan C. Gordon dd8ab67bd9 Sync wiki -> headers. 2023-11-13 15:46:29 -05:00
Ryan C. Gordon 91460fc13d include: Fixed up documentation in SDL_pen.h 2023-11-13 15:40:55 -05:00
Ryan C. Gordon 8766aa39d6 Sync wiki -> headers. 2023-11-13 13:03:42 -05:00
Ryan C. Gordon e5ffd6d8eb include: Removed \link and \endlink Doxygen tags. 2023-11-13 13:01:25 -05:00
Ryan C. Gordon c47ac5b2df include: Fixed copy/paste error 2023-11-12 23:41:22 -05:00
Ryan C. Gordon 0efb3d90e0 audio: removed a fixed FIXME comment. 2023-11-12 23:41:22 -05:00
Ryan C. Gordon 89408a9705 wasapi: ResetWasapiDevice no longer blocks on management thread.
It just proxies all its necessary releases and frees to these without
blocking, and sets the appropriate fields to NULL so they can be used again
immediately, regardless of when the old stuff actually gets released.
2023-11-09 20:27:58 -05:00
Ryan C. Gordon aa7baf63aa Sync wiki -> headers. 2023-11-09 20:11:23 -05:00
Ryan C. Gordon 869257a5c1 SDL_migration.cocci: Added a thing for SDL_Vulkan_CreateSurface. 2023-11-06 19:16:38 -05:00
Ryan C. Gordon c6d9fb1ad7 hidapi: Avoid memcpy'ing to NULL.
(This fix was originally from @themightyoarfish on GitHub. Thanks!)

Fixes #8428.
Reference PR #8431.
2023-11-06 13:48:07 -05:00
Ryan C. Gordon 4d1aecc225 vulkan: Patched to compile on iOS. 2023-11-06 13:35:19 -05:00
Ryan C. Gordon 2f92807087 vulkan: SDL_Vulkan_CreateSurface now accepts an app-provided allocator.
Fixes #3638.
2023-11-06 13:31:20 -05:00
Ryan C. Gordon c53843a961 docs: Remove Doxygen \brief tags.
Doxygen and the wiki bridge don't need them; they'll both just use the first
line/sentence instead.

Fixes #8446.
2023-11-06 10:26:06 -05:00
Ryan C. Gordon 7ac281f800 Sync wiki -> headers. 2023-11-06 09:33:05 -05:00
Ryan C. Gordon e5f2cea234 Sync wiki -> headers 2023-11-04 22:18:38 -04:00
Ryan C. Gordon 1a8bf31a69 include: Fixing whitespace on SDL_MixAudioFormat. 2023-11-04 15:06:41 -04:00
Ryan C. Gordon 780b6612a9 wayland: Wayland_Vulkan_GetInstanceExtensions didn't set the count variable.
Fixes #8468.
2023-11-04 14:53:24 -04:00
Ryan C. Gordon a19029e3c1 docs: Updated README-main-functions.md based on feedback. 2023-11-04 10:03:10 -04:00
Ryan C. Gordon 019468dc59 main: Check for SDL_AddEventWatch failure, now that it can report it. 2023-11-04 10:03:10 -04:00
Ryan C. Gordon 853c28e624 docs: Added first draft of README-main-functions.md
Reference PR #8247.
2023-11-03 11:39:53 -04:00
Ryan C. Gordon 70d75b4a23 Sync wiki -> headers 2023-11-03 10:13:46 -04:00
Ryan C. Gordon 07a776f255 include: Fixed documentation for SDL_Vulkan_GetInstanceExtensions. 2023-11-02 15:12:24 -04:00
Ryan C. Gordon 5b3a2c6df6 docs: Updated SDL_Vulkan_GetInstanceExtensions info in README-migration.md.
Reference PR #8457.
2023-11-02 14:57:13 -04:00
Ryan C. Gordon ac6b32bb02 gendynapi.py: Discard SDLMAIN_DECLSPEC functions.
Otherwise SDL_main and SDL_App* functions look like exported symbols instead
of functions the app is meant to implement.

Reference PR #8247.
2023-11-01 21:47:42 -04:00
Ryan C. Gordon 9c664b0062 main: Added _optional_ callback entry points.
This lets apps optionally have a handful of callbacks for their entry points instead of a single main function. If used, the actual main/SDL_main/whatever entry point will be implemented in the single-header library SDL_main.h and the app will implement four separate functions:

First:

    int SDL_AppInit(int argc, char **argv);

This will be called once before anything else. argc/argv work like they always do. If this returns 0, the app runs. If it returns < 0, the app calls SDL_AppQuit and terminates with an exit code that reports an error to the platform. If it returns > 0, the app calls SDL_AppQuit and terminates with an exit code that reports success to the platform. This function should not go into an infinite mainloop; it should do any one-time startup it requires and then return.

Then:

     int SDL_AppIterate(void);

This is called over and over, possibly at the refresh rate of the display or some other metric that the platform dictates. This is where the heart of your app runs. It should return as quickly as reasonably possible, but it's not a "run one memcpy and that's all the time you have" sort of thing. The app should do any game updates, and render a frame of video. If it returns < 0, SDL will call SDL_AppQuit and terminate the process with an exit code that reports an error to the platform. If it returns > 0, the app calls SDL_AppQuit and terminates with an exit code that reports success to the platform. If it returns 0, then SDL_AppIterate will be called again at some regular frequency. The platform may choose to run this more or less (perhaps less in the background, etc), or it might just call this function in a loop as fast as possible. You do not check the event queue in this function (SDL_AppEvent exists for that).

Next:

    int SDL_AppEvent(const SDL_Event *event);

This will be called once for each event pushed into the SDL queue. This may be called from any thread, and possibly in parallel to SDL_AppIterate. The fields in event do not need to be free'd (as you would normally need to do for SDL_EVENT_DROP_FILE, etc), and your app should not call SDL_PollEvent, SDL_PumpEvent, etc, as SDL will manage this for you. Return values are the same as from SDL_AppIterate(), so you can terminate in response to SDL_EVENT_QUIT, etc.

Finally:

    void SDL_AppQuit(void);

This is called once before terminating the app--assuming the app isn't being forcibly killed or crashed--as a last chance to clean up. After this returns, SDL will call SDL_Quit so the app doesn't have to (but it's safe for the app to call it, too). Process termination proceeds as if the app returned normally from main(), so atexit handles will run, if your platform supports that.

The app does not implement SDL_main if using this. To turn this on, define SDL_MAIN_USE_CALLBACKS before including SDL_main.h. Defines like SDL_MAIN_HANDLED and SDL_MAIN_NOIMPL are also respected for callbacks, if the app wants to do some sort of magic main implementation thing.

In theory, on most platforms these can be implemented in the app itself, but this saves some #ifdefs in the app and lets everyone struggle less against some platforms, and might be more efficient in the long run, too.

On some platforms, it's possible this is the only reasonable way to go, but we haven't actually hit one that 100% requires it yet (but we will, if we want to write a RetroArch backend, for example).

Using the callback entry points works on every platform, because on platforms that don't require them, we can fake them with a simple loop in an internal implementation of the usual SDL_main.

The primary way we expect people to write SDL apps is with SDL_main, and this is not intended to replace it. If the app chooses to use this, it just removes some platform-specific details they might have to otherwise manage, and maybe removes a barrier to entry on some future platform.

Fixes #6785.
Reference PR #8247.
2023-11-01 18:40:41 -04:00
Ryan C. Gordon 759cdf6159 audio: Fixed GetFirstAudioDeviceAdded().
It forgot to check for the type of device needed.
2023-11-01 00:39:51 -04:00
Ryan C. Gordon 0e614d9179 audio: Massive reworking on thread locking.
This cleans up a ton of race conditions, and starts moving towards something
we can use with Clang's -Wthread-safety (but that has a ways to go still).
2023-11-01 00:10:25 -04:00
Ryan C. Gordon 40fb76196c audio: Don't let simplified audio streams bind to new devices.
This can happen if you close the stream's underlying device directly, which
removes the binding but doesn't destroy the object.

In this case, the stream remains valid until destroyed, but still should not
be able to be bound to a new device.
2023-10-31 10:52:50 -04:00
Ryan C. Gordon 24e3328cca audio: Don't reset device ID counter on subsystem init/quit.
Otherwise you risk a buggy app holding an obsolete device ID that now refers
to a different device after reinit.
2023-10-31 10:50:37 -04:00
Ryan C. Gordon dcc8805c21 testaudio: Fixed compiler warning on Visual Studio. 2023-10-30 13:09:56 -04:00
Ryan C. Gordon 9cb259e865 audio: Never SDL_PushEvent from anywhere but SDL_UpdateAudio().
Fixes some corner-case deadlocks.
2023-10-30 13:08:10 -04:00
Ryan C. Gordon f63e9a8a3f wasapi: Handle disconnected devices that get reconnected.
The device ID strings don't change between connects, so we need to move the
old device object out of the way if it still exists as a zombie, and let
the reconnected device get itself a fresh object.
2023-10-27 01:30:27 -04:00
Ryan C. Gordon 5fa7b291d4 wasapi: Fixed memory leak if new audio devices fail to add. 2023-10-27 01:30:13 -04:00
Ryan C. Gordon 468c386686 wasapi: Handle disconnect notifications from the management thread, too.
These are also pretty heavyweight, don't do them from the notification
thread, which can deadlock everything.
2023-10-27 01:28:51 -04:00
Ryan C. Gordon ce3be02b48 wasapi: If device is marked as a zombie, don't try to resuscitate it. 2023-10-27 01:27:22 -04:00
Ryan C. Gordon 85923049a6 wasapi: Patched to compile. 2023-10-26 23:09:11 -04:00
Ryan C. Gordon 9bec57309c wasapi: Proxy default device change handling to management thread.
This does a ton of work that can deadlock, because several crucial WASAPI
things that we want to do in response to this will block until the
notification callback has returned, so we can't call them from the handler
directly, or we'll be waiting until the thing that called us returns.
2023-10-26 23:03:27 -04:00
Ryan C. Gordon c45b5121ce audio: Fixed potential race condition.
We need to check if the device is ready to close before releasing the lock,
in case other things are messing with the list of logical devices.
2023-10-26 23:03:27 -04:00
Ryan C. Gordon e6116d399a mutex: Removed SDL_MUTEX_MAXWAIT.
Fixes #8436.
2023-10-26 14:21:53 -04:00
Ryan C. Gordon 899eb0d042 thread: Locking mutexes and rwlocks are now void functions.
Almost nothing checks these return values, and there's no reason a valid
lock should fail to operate. The cases where a lock isn't valid (it's a
bogus pointer, it was previously destroyed, a thread is unlocking a lock it
doesn't own, etc) are undefined behavior and always were, and should be
treated as an application bug.

Reference Issue #8096.
2023-10-26 08:57:34 -04:00
Ryan C. Gordon ace0c2c297 mutex: Fixed bug where generic SDL_TryLockMutex would incorrectly block.
Fixes #8433.
2023-10-25 13:03:46 -04:00
Ryan C. Gordon b61706373c n3ds: Check that audio thread name starts with "SDLAudioP"
The string has a number after it, so a basic SDL_strcmp() will never match.

Reference PR #8346.

(cherry picked from commit cba6090398)
2023-10-24 23:58:30 -04:00
Ryan C. Gordon b16165a33f rwlock: SDL_UnlockRWLock was incorrectly tagged with SDL_RELEASE_SHARED.
It needs to be SDL_RELEASE_GENERIC, because it releases both exclusive
(writer) and shared (reader) locks.

Without this fix, clang's `-Wthread-safety` tests generate incorrect warnings.

Reference Issue #8096.
2023-10-24 14:42:02 -04:00
Ryan C. Gordon 865dd04068 pulseaudio: Don't use a hash for device change detection.
Both strings are _right there_ for comparing, so we can just set a flag to
note the device definitely changed.

Also simplified string management further; hotplug thread now makes a copy
of the string before releasing the lock if there was a change event, so when
the lock releases further events don't see a NULL and assume it's a new
device, causing a lot of work to ripple out and decide nothing has changed,
until the system stabilizes again. Now, it just does the right thing once.
2023-10-24 00:36:30 -04:00
Ryan C. Gordon a774694be0 pulseaudio: Simplified default device change detection code.
This reduces allocations, simplifies some code, and makes it quick to decide
from the hotplug thread if there was _actually_ a device change.
2023-10-23 22:02:27 -04:00
Ryan C. Gordon 182cfc3265 pulseaudio: Rework how we manage default devices and hotplug.
This fixes problems where Pulse callbacks don't fire in the order we expect,
or fail to fire at all, and avoids extra round trips to the Pulse server to
lookup information we could have trivially obtained already.

The end result is we would occasionally miss default device changes, etc, and
this resolves that better.
2023-10-23 19:17:50 -04:00
Ryan C. Gordon b2ae1e835f pulseaudio: Change debug printf calls to use SDL_Log instead. 2023-10-23 19:17:49 -04:00
Ryan C. Gordon 4ac38d13dd alsa: Don't touch free'd memory in hotplug thread. 2023-10-23 00:59:40 -04:00
Ryan C. Gordon 43d41c9dcb audio: Another attempt to make device add/remove work vs event watchers.
This patch reverts the previous reversion, and then adds code to queue up
events to be sent the next time SDL pumps the event queue. This guarantees
that the event watcher/filter _never_ runs from an SDL audio device thread
or some other backend-specific internal thread.
2023-10-23 00:38:41 -04:00
Ryan C. Gordon 9abc692156 audio: Another attempt to deal with device destruction from device thread.
This only happens when closing a device from an event watcher, when the
device reports failure from its own thread.
2023-10-22 17:01:49 -04:00
Ryan C. Gordon 33c9eeec7c Revert "audio: Device threads don't increment physical device refcounts."
This reverts commit 76f81797b7.

This worked in the normal cases, but:

A device thread that calls SDL_DisconnectAudioDevice due to failure will fire
the disconnect event from the device thread...and if there's an event watcher
that uses that moment to close the device, we still end up in the same
situation, where the device thread tries to join on itself.

Better solutions are still pending.
2023-10-22 16:15:27 -04:00
Ryan C. Gordon 76f81797b7 audio: Device threads don't increment physical device refcounts.
Otherwise, they risk the device thread joining on itself.

Now we make sure the reference is held at the logical device level until
the physical device is closed, so it can't destroy the device in normal
usage until the thread is joined, etc.
2023-10-19 15:47:29 -04:00
Ryan C. Gordon bf269571fc jack: Removed FIXME comment that has since been fixed. 2023-10-18 15:47:01 -04:00
Ryan C. Gordon 797b70877d audio: Remove stub header SDL_audio_c.h.
It was a leftover, that just included SDL_sysaudio.h, in modern times.
2023-10-18 15:46:07 -04:00
Ryan C. Gordon 9d7c57234a audio: Cleaned out most remaining /* */ comments for // style.
Fully committing to it...!

This left SDL_wave.* alone for now, since there's a ton of comments in there
and this code hasn't changed much from SDL2 so far. But as SDL2 ages out a
little more, I'll likely switch this over, too.
2023-10-18 15:39:01 -04:00
Ryan C. Gordon 0ff67dc21b video: Fix compiler warning about SDL_ReadSurfacePixel not being declared.
(this was legal before, but the Android NDK wants to make sure we didn't mean
for this function to be marked `static` since it didn't have a formal
declaration before its definition and might only be used in the one source
file.)
2023-10-18 15:02:01 -04:00
Ryan C. Gordon 81c77396af opensles: Patched to compile. 2023-10-18 14:56:32 -04:00
Ryan C. Gordon 442e84916a opensles: Fixed capitalization to match other SDL backends. 2023-10-18 13:57:32 -04:00
Ryan C. Gordon 34914bfb49 alsa: Clean up device handles, now that hotplug thread cleanup is in place. 2023-10-18 13:53:42 -04:00
Ryan C. Gordon 7a52f7b3fd audio: Split Deinitialize into two stages.
First stage happens before we destroy objects, and is generally used to
shut down hotplug. The second stage is the usual deinit, which cleans up
the lowlevel API, unloads shared libraries, etc.
2023-10-18 10:43:45 -04:00
Ryan C. Gordon e55e556f32 alsa: Fixed minor memory leak.
The default device handles aren't free'd anywhere, so don't strdup them;
everything else is managed by the hotplug thread, which does its own freeing.
2023-10-17 23:28:50 -04:00
Ryan C. Gordon b733adb503 audio: Fix device refcounting vs ProvidesOwnCallbackThread backends. 2023-10-16 20:17:04 -04:00
Ryan C. Gordon c6f08c2553 testaudio: Removed debugging code. 2023-10-16 15:25:34 -04:00
Ryan C. Gordon d5dac0ad27 testaudio: Deal with a texture being unexpectedly NULL when scaling.
This happens to work because our current textures are all 128x128, but in
theory one shouldn't hit this case anyhow...right?!

Reference Issue #8344.
2023-10-16 14:03:58 -04:00
Ryan C. Gordon b19e68c8ec testaudio: Properly display playback progress, regardless of data source. 2023-10-16 13:56:43 -04:00
Ryan C. Gordon 8c39269279 audio: Fix audio stream format when binding to a capture device.
Fixes #8402.
2023-10-16 13:34:40 -04:00
Ryan C. Gordon f26b838a3e jack: Check for sample rate and buffer size changes from the server.
Reference Issue #8344.
2023-10-16 13:10:54 -04:00
Ryan C. Gordon 063cb0df6b audio: Fixed comment typo. "deref" should be "unref" 2023-10-16 13:09:55 -04:00
Ryan C. Gordon 354611a0c6 testaudio: Fixed some bugs Valgrind pointed out. 2023-10-16 10:04:02 -04:00
Ryan C. Gordon a17f3ba916 audio: Reworked audio device disconnect management.
- No more tapdance to either join the audio device thread or have it detach
itself. Significant simplication of and fixes to the locking code to prevent
deadlocks.
- Physical devices now keep a refcount. Each logical device increments it,
as does the existence of a device thread, etc. Last unref destroys the
device and takes it out of the device_hash. Since there's a lot of moving
parts that might be holding a reference to a physical device, this seemed
like a safer way to protect the object.
- Disconnected devices now continue to function as zombie devices. Playback
devices will still consume data (and just throw it away), and capture devices
will continue to produce data (which always be silence). This helps apps
that don't handle disconnect events; the device still stops playing/capturing,
but bound audio streams will still consume data so they don't allocate more
data infinitely, and apps that depend on an audio callback firing regularly
to make progress won't hang.

Please note that disconnected audio devices must now be explicitly closed!
They always _should_ have been, but before this commit, SDL3 would destroy the
disconnected device for you (and manually closing afterwards was a safe no-op).

Reference Issue #8331.
Fixes #8386.

(and probably others).
2023-10-16 10:04:02 -04:00
Ryan C. Gordon 8df68b4120 hashtable: Moved over to single-line comments. 2023-10-15 15:41:04 -04:00
Ryan C. Gordon 1c6d996108 testaudio: if the SDL_Renderer is already gone, don't destroy SDL_Textures. 2023-10-14 23:17:59 -04:00
Ryan C. Gordon b22ffb9797 audio: Fix some logic errors in the new device hashtable code.
Fixes #8395.
2023-10-14 23:11:10 -04:00
Ryan C. Gordon 6664437748 hashtable: Don't rearrange bucket elements during SDL_FindInHashTable.
This is a race condition if the hashtable isn't protected by a mutex, and it
makes a read/write operation out of something what appears to be read-only,
which is dangerously surprising from an interface viewpoint.

The downside is that if you have an item that is frequently accessed that
isn't in the first slot of a bucket, each find operation will take longer
instead of common items bubbling to the front of the bucket. Then again,
if you have several common things being looked up in rotation, they'll just
be doing unnecessary shuffling here. In this case, it might be better to
just use a larger hashtable or a better hashing function (or just look up the
thing you need once instead of multiple times).

Fixes #8391.
2023-10-14 13:56:56 -04:00
Ryan C. Gordon 8ac5c84ad1 audio: device thread shouldn't touch thread_alive after object is free'd.
Reference Issue #8386.
2023-10-14 13:49:08 -04:00
Ryan C. Gordon b17151eb16 testaudio: Don't crash if renderer is NULL (happens during shutdown). 2023-10-14 13:43:22 -04:00
Ryan C. Gordon 7f408e57ee audio: Keep all available devices in a hashtable instead of linked lists.
All devices are in a single hash, whether playback or capture, or physical
or logical. Lookups are keyed on device ID and map to either
`SDL_AudioDevice *` for physical devices or `SDL_LogicalAudioDevice *` for
logical devices (as an implementation detail, you can determine which object
type you have by checking a specific bit in the device ID).

This simplifies a bunch of code, makes some cases significantly more
efficient, and solves the problem of having to lock each physical
device while the device list rwlock is held to find logical devices by ID.

Device IDs hash perfectly evenly, too, being incrementing integers.
2023-10-14 13:34:42 -04:00
Ryan C. Gordon 0aba2c97db hashtable: SDL_IterateHashTable might as well provide both key and value.
And SDL_IterateHashTableKey is only necessary for stackable hashtables, since
non-stackable ones can either iterate each unique key/value pair with
SDL_IterateHashTable, or get a specific key/value pair by using
SDL_FindInHashTable.
2023-10-14 13:23:03 -04:00
Ryan C. Gordon 95a9271dbf audio: Never lock a device while holding the device_list_lock.
Fixes various not-necessarily-corner cases ending in deadlock.
2023-10-13 14:18:21 -04:00
Ryan C. Gordon ac71831350 Sync wiki -> headers 2023-10-12 15:20:53 -04:00
Ryan C. Gordon 2bca4671a6 audio: Allow audio streams to be created when the subsystem isn't initialized.
You are on your own to destroy them, though!
2023-10-11 22:43:53 -04:00