瀏覽代碼

audio: SDL_GetAudioDeviceName() now works with the default device IDs.

Fixes #14615.
Ryan C. Gordon 5 天之前
父節點
當前提交
6f774908fe
共有 3 個文件被更改,包括 18 次插入0 次删除
  1. 9 0
      include/SDL3/SDL_audio.h
  2. 8 0
      src/audio/SDL_audio.c
  3. 1 0
      test/loopwave.c

+ 9 - 0
include/SDL3/SDL_audio.h

@@ -577,6 +577,15 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecordingDevices(int
 /**
 /**
  * Get the human-readable name of a specific audio device.
  * Get the human-readable name of a specific audio device.
  *
  *
+ * **WARNING**: this function will work with SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK
+ * and SDL_AUDIO_DEVICE_DEFAULT_RECORDING, returning the current default
+ * physical devices' names. However, as the default device may change at any
+ * time, it is likely better to show a generic name to the user, like "System
+ * default audio device" or perhaps "default [currently %s]". Do not store
+ * this name to disk to reidentify the device in a later run of the program,
+ * as the default might change in general, and the string will be the name
+ * of a specific device and not the abstract system default.
+ *
  * \param devid the instance ID of the device to query.
  * \param devid the instance ID of the device to query.
  * \returns the name of the audio device, or NULL on failure; call
  * \returns the name of the audio device, or NULL on failure; call
  *          SDL_GetError() for more information.
  *          SDL_GetError() for more information.

+ 8 - 0
src/audio/SDL_audio.c

@@ -1579,6 +1579,14 @@ const char *SDL_GetAudioDeviceName(SDL_AudioDeviceID devid)
         // remains valid (in case the device is unplugged at the wrong moment), we hold the
         // remains valid (in case the device is unplugged at the wrong moment), we hold the
         // subsystem_rwlock while we copy the string.
         // subsystem_rwlock while we copy the string.
         SDL_LockRWLockForReading(current_audio.subsystem_rwlock);
         SDL_LockRWLockForReading(current_audio.subsystem_rwlock);
+
+        // Allow default device IDs to be used, just return the current default physical device's name.
+        if (devid == SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK) {
+            devid = current_audio.default_playback_device_id;
+        } else if (devid == SDL_AUDIO_DEVICE_DEFAULT_RECORDING) {
+            devid = current_audio.default_recording_device_id;
+        }
+
         SDL_FindInHashTable(islogical ? current_audio.device_hash_logical : current_audio.device_hash_physical, (const void *) (uintptr_t) devid, &vdev);
         SDL_FindInHashTable(islogical ? current_audio.device_hash_logical : current_audio.device_hash_physical, (const void *) (uintptr_t) devid, &vdev);
         if (!vdev) {
         if (!vdev) {
             SDL_SetError("Invalid audio device instance ID");
             SDL_SetError("Invalid audio device instance ID");

+ 1 - 0
test/loopwave.c

@@ -109,6 +109,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
     }
     }
 
 
     SDL_Log("Using audio driver: %s", SDL_GetCurrentAudioDriver());
     SDL_Log("Using audio driver: %s", SDL_GetCurrentAudioDriver());
+    SDL_Log("Current audio device name: %s", SDL_GetAudioDeviceName(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK));
 
 
     stream = SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &wave.spec, NULL, NULL);
     stream = SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &wave.spec, NULL, NULL);
     if (!stream) {
     if (!stream) {