diff -r 9aa7aea27dec include/SDL_audio.h --- a/include/SDL_audio.h Fri Sep 06 08:50:19 2019 -0700 +++ b/include/SDL_audio.h Fri Sep 06 13:28:39 2019 -0400 @@ -359,6 +359,13 @@ extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index, int iscapture); +/** + * FIXME: DOCUMENT ME! + */ +extern DECLSPEC void SDLCALL SDL_GetAudioDeviceSpec(int index, + SDL_AudioSpec *spec, + int iscapture); + /** * Open a specific audio device. Passing in a device name of NULL requests diff -r 9aa7aea27dec src/audio/SDL_audio.c --- a/src/audio/SDL_audio.c Fri Sep 06 08:50:19 2019 -0700 +++ b/src/audio/SDL_audio.c Fri Sep 06 13:28:39 2019 -0400 @@ -1502,6 +1502,52 @@ allowed_changes, 2); } + +void +SDL_GetAudioDeviceSpec(int index, SDL_AudioSpec *spec, int iscapture) +{ + SDL_bool found = SDL_FALSE; + + if (spec == NULL) { + SDL_SetError("spec cannot be NULL"); + return; + } + + if (!SDL_WasInit(SDL_INIT_AUDIO)) { + SDL_SetError("Audio subsystem is not initialized"); + return; + } + + if ((iscapture) && (!current_audio.impl.HasCaptureSupport)) { + SDL_SetError("No capture support"); + return; + } + + if (index >= 0) { + SDL_AudioDeviceItem *item; + int i; + + SDL_LockMutex(current_audio.detectionLock); + item = iscapture ? current_audio.inputDevices : current_audio.outputDevices; + i = iscapture ? current_audio.inputDeviceCount : current_audio.outputDeviceCount; + if (index < i) { + for (i--; i > index; i--, item = item->next) { + SDL_assert(item != NULL); + } + SDL_assert(item != NULL); + SDL_memcpy(spec, &item->spec, sizeof(SDL_AudioSpec)); + found = SDL_TRUE; + } + SDL_UnlockMutex(current_audio.detectionLock); + } + + if (!found) { + SDL_SetError("No such device"); + SDL_memset(spec, '\0', sizeof(SDL_AudioSpec)); + prepare_audiospec(spec, spec); + } +} + SDL_AudioStatus SDL_GetAudioDeviceStatus(SDL_AudioDeviceID devid) { diff -r 9aa7aea27dec src/audio/SDL_sysaudio.h --- a/src/audio/SDL_sysaudio.h Fri Sep 06 08:50:19 2019 -0700 +++ b/src/audio/SDL_sysaudio.h Fri Sep 06 13:28:39 2019 -0400 @@ -100,6 +100,7 @@ char *name; char *original_name; int dupenum; + SDL_AudioSpec spec; struct SDL_AudioDeviceItem *next; } SDL_AudioDeviceItem; diff -r 9aa7aea27dec src/dynapi/SDL_dynapi_overrides.h --- a/src/dynapi/SDL_dynapi_overrides.h Fri Sep 06 08:50:19 2019 -0700 +++ b/src/dynapi/SDL_dynapi_overrides.h Fri Sep 06 13:28:39 2019 -0400 @@ -78,6 +78,7 @@ #define SDL_OpenAudio SDL_OpenAudio_REAL #define SDL_GetNumAudioDevices SDL_GetNumAudioDevices_REAL #define SDL_GetAudioDeviceName SDL_GetAudioDeviceName_REAL +#define SDL_GetAudioDeviceSpec SDL_GetAudioDeviceSpec_REAL #define SDL_OpenAudioDevice SDL_OpenAudioDevice_REAL #define SDL_GetAudioStatus SDL_GetAudioStatus_REAL #define SDL_GetAudioDeviceStatus SDL_GetAudioDeviceStatus_REAL diff -r 9aa7aea27dec src/dynapi/SDL_dynapi_procs.h --- a/src/dynapi/SDL_dynapi_procs.h Fri Sep 06 08:50:19 2019 -0700 +++ b/src/dynapi/SDL_dynapi_procs.h Fri Sep 06 13:28:39 2019 -0400 @@ -109,6 +109,7 @@ SDL_DYNAPI_PROC(int,SDL_OpenAudio,(SDL_AudioSpec *a, SDL_AudioSpec *b),(a,b),return) SDL_DYNAPI_PROC(int,SDL_GetNumAudioDevices,(int a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetAudioDeviceName,(int a, int b),(a,b),return) +SDL_DYNAPI_PROC(void,SDL_GetAudioDeviceSpec,(int a, SDL_AudioSpec *b, int c),(a,b,c),) SDL_DYNAPI_PROC(SDL_AudioDeviceID,SDL_OpenAudioDevice,(const char *a, int b, const SDL_AudioSpec *c, SDL_AudioSpec *d, int e),(a,b,c,d,e),return) SDL_DYNAPI_PROC(SDL_AudioStatus,SDL_GetAudioStatus,(void),(),return) SDL_DYNAPI_PROC(SDL_AudioStatus,SDL_GetAudioDeviceStatus,(SDL_AudioDeviceID a),(a),return)