From 1fc01b030024a9891cc884c11757654c7568c94d Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Mon, 3 Jul 2023 11:51:22 -0400
Subject: [PATCH] audio: Try to definitely have a default device set up.
---
src/audio/SDL_audio.c | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c
index 56e7ac113b52..cc6f585214a2 100644
--- a/src/audio/SDL_audio.c
+++ b/src/audio/SDL_audio.c
@@ -468,6 +468,19 @@ static void CompleteAudioEntryPoints(void)
#undef FILL_STUB
}
+static SDL_AudioDeviceID GetFirstAddedAudioDeviceID(const SDL_bool iscapture)
+{
+ // (these are pushed to the front of the linked list as added, so the first device added is last in the list.)
+ SDL_LockRWLockForReading(current_audio.device_list_lock);
+ SDL_AudioDevice *last = NULL;
+ for (SDL_AudioDevice *i = current_audio.output_devices; i != NULL; i = i->next) {
+ last = i;
+ }
+ const SDL_AudioDeviceID retval = last ? last->instance_id : 0;
+ SDL_UnlockRWLock(current_audio.device_list_lock);
+ return retval;
+}
+
// !!! FIXME: the video subsystem does SDL_VideoInit, not SDL_InitVideo. Make this match.
int SDL_InitAudio(const char *driver_name)
{
@@ -580,11 +593,11 @@ int SDL_InitAudio(const char *driver_name)
}
// If no default was _ever_ specified, just take the first device we see, if any.
- if (!current_audio.default_output_device_id && (current_audio.output_devices != NULL)) {
- current_audio.default_output_device_id = current_audio.output_devices->instance_id;
+ if (!current_audio.default_output_device_id) {
+ current_audio.default_output_device_id = GetFirstAddedAudioDeviceID(/*iscapture=*/SDL_FALSE);
}
if (!current_audio.default_capture_device_id && (current_audio.capture_devices != NULL)) {
- current_audio.default_capture_device_id = current_audio.capture_devices->instance_id;
+ current_audio.default_output_device_id = GetFirstAddedAudioDeviceID(/*iscapture=*/SDL_TRUE);
}
return 0;