Commit 3939ef72f8381fe436b3f4438367421c027c5270

pionere 2022-01-19T17:23:53

cleanup SDL_GetAudioDeviceSpec - drop unnecessary hascapture check - call SDL_InvalidParamError and return -1 in case the index is out of range - do not zfill SDL_AudioSpec - adjust documentation to reflect the behavior

diff --git a/include/SDL_audio.h b/include/SDL_audio.h
index 181f66c..ab25ec9 100644
--- a/include/SDL_audio.h
+++ b/include/SDL_audio.h
@@ -500,9 +500,7 @@ extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index,
  * hardware.
  *
  * `spec` will be filled with the sample rate, sample format, and channel
- * count. All other values in the structure are filled with 0. When the
- * supported struct members are 0, SDL was unable to get the property from the
- * backend.
+ * count.
  *
  * \param index the index of the audio device; valid values range from 0 to
  *              SDL_GetNumAudioDevices() - 1
diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c
index 028debd..9d6f936 100644
--- a/src/audio/SDL_audio.c
+++ b/src/audio/SDL_audio.c
@@ -1112,38 +1112,33 @@ SDL_GetAudioDeviceName(int index, int iscapture)
 int
 SDL_GetAudioDeviceSpec(int index, int iscapture, SDL_AudioSpec *spec)
 {
+    SDL_AudioDeviceItem *item;
+    int i, retval;
+
     if (spec == NULL) {
         return SDL_InvalidParamError("spec");
     }
 
-    SDL_zerop(spec);
-
     if (!SDL_GetCurrentAudioDriver()) {
         return SDL_SetError("Audio subsystem is not initialized");
     }
 
-    if (iscapture && !current_audio.impl.HasCaptureSupport) {
-        return SDL_SetError("No capture support");
-    }
-
-    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_LockMutex(current_audio.detectionLock);
+    item = iscapture ? current_audio.inputDevices : current_audio.outputDevices;
+    i = iscapture ? current_audio.inputDeviceCount : current_audio.outputDeviceCount;
+    if (index >= 0 && index < i) {
+        for (i--; i > index; i--, item = item->next) {
             SDL_assert(item != NULL);
-            SDL_memcpy(spec, &item->spec, sizeof(SDL_AudioSpec));
         }
-        SDL_UnlockMutex(current_audio.detectionLock);
+        SDL_assert(item != NULL);
+        SDL_memcpy(spec, &item->spec, sizeof(SDL_AudioSpec));
+        retval = 0;
+    } else {
+        retval = SDL_InvalidParamError("index");
     }
+    SDL_UnlockMutex(current_audio.detectionLock);
 
-    return 0;
+    return retval;
 }