# HG changeset patch # User Ryan C. Gordon # Date 1159906070 0 # Node ID 8f8209f8da6d9a15a7ca87b61dbbdd882d94b79e # Parent e2f68b579a017801f2874918cff8b80cb8947ecf Added audio device enumeration for 1.3. diff -r e2f68b579a01 -r 8f8209f8da6d include/SDL_audio.h --- a/include/SDL_audio.h Tue Oct 03 20:05:33 2006 +0000 +++ b/include/SDL_audio.h Tue Oct 03 20:07:50 2006 +0000 @@ -235,6 +235,9 @@ * Get the human-readable name of a specific audio device. * Must be a value between 0 and (number of audio devices-1). * Only valid after a successfully initializing the audio subsystem. + * The values returned by this function reflect the latest call to + * SDL_GetNumAudioDevices(); recall that function to redetect available + * hardware. */ extern DECLSPEC const char *SDLCALL SDL_GetAudioDevice(int index, int iscapture); diff -r e2f68b579a01 -r 8f8209f8da6d src/audio/SDL_audio.c --- a/src/audio/SDL_audio.c Tue Oct 03 20:05:33 2006 +0000 +++ b/src/audio/SDL_audio.c Tue Oct 03 20:07:50 2006 +0000 @@ -455,6 +455,34 @@ return current_audio.name; } + +int +SDL_GetNumAudioDevices(int iscapture) +{ + if (!SDL_WasInit(SDL_INIT_AUDIO) || !current_audio.impl.DetectDevices) { + return -1; + } + return current_audio.impl.DetectDevices(iscapture); +} + + +const char * +SDL_GetAudioDevice(int index, int iscapture) +{ + if (!SDL_WasInit(SDL_INIT_AUDIO)) { + SDL_SetError("Audio subsystem is not initialized"); + return NULL; + } + + if ((index < 0) && (!current_audio.impl.GetAudioDevice)) { + SDL_SetError("No such device"); + return NULL; + } + + return current_audio.impl.GetAudioDevice(index, iscapture); +} + + static void close_audio_device(SDL_AudioDevice *device) { diff -r e2f68b579a01 -r 8f8209f8da6d src/audio/SDL_sysaudio.h --- a/src/audio/SDL_sysaudio.h Tue Oct 03 20:05:33 2006 +0000 +++ b/src/audio/SDL_sysaudio.h Tue Oct 03 20:07:50 2006 +0000 @@ -34,6 +34,8 @@ /* !!! FIXME: rename these from "Audio" to "Device" ... */ typedef struct SDL_AudioDriverImpl { + int (*DetectDevices)(int iscapture); + const char *(*GetAudioDevice)(int index, int iscapture); int (*OpenAudio) (_THIS, const char *devname, int iscapture); void (*ThreadInit) (_THIS); /* Called by audio thread at start */ void (*WaitAudio) (_THIS); diff -r e2f68b579a01 -r 8f8209f8da6d src/audio/macosx/SDL_coreaudio.c --- a/src/audio/macosx/SDL_coreaudio.c Tue Oct 03 20:05:33 2006 +0000 +++ b/src/audio/macosx/SDL_coreaudio.c Tue Oct 03 20:07:50 2006 +0000 @@ -29,7 +29,7 @@ #include "../SDL_sysaudio.h" #include "SDL_coreaudio.h" -#define DEBUG_COREAUDIO 1 +#define DEBUG_COREAUDIO 0 typedef struct COREAUDIO_DeviceList { @@ -169,6 +169,22 @@ } } +static inline void +build_device_lists(void) +{ + build_device_list(0, &outputDevices, &outputDeviceCount); + build_device_list(1, &inputDevices, &inputDeviceCount); +} + + +static inline void +free_device_lists(void) +{ + free_device_list(&outputDevices, &outputDeviceCount); + free_device_list(&inputDevices, &inputDeviceCount); +} + + static int find_device_id(const char *devname, int iscapture, AudioDeviceID *id) { @@ -188,6 +204,8 @@ /* Audio driver functions */ +static int COREAUDIO_DetectDevices(int iscapture); +static const char *COREAUDIO_GetAudioDevice(int index, int iscapture); static int COREAUDIO_OpenAudio(_THIS, const char *devname, int iscapture); static void COREAUDIO_WaitAudio(_THIS); static void COREAUDIO_PlayAudio(_THIS); @@ -206,11 +224,9 @@ static int COREAUDIO_Init(SDL_AudioDriverImpl *impl) { - /* !!! FIXME: should these _really_ be static? */ - build_device_list(0, &outputDevices, &outputDeviceCount); - build_device_list(1, &inputDevices, &inputDeviceCount); - /* Set the function pointers */ + impl->DetectDevices = COREAUDIO_DetectDevices; + impl->GetAudioDevice = COREAUDIO_GetAudioDevice; impl->OpenAudio = COREAUDIO_OpenAudio; impl->WaitAudio = COREAUDIO_WaitAudio; impl->PlayAudio = COREAUDIO_PlayAudio; @@ -227,11 +243,39 @@ }; +static int +COREAUDIO_DetectDevices(int iscapture) +{ + if (iscapture) { + build_device_list(1, &inputDevices, &inputDeviceCount); + return inputDeviceCount; + } else { + build_device_list(0, &outputDevices, &outputDeviceCount); + return outputDeviceCount; + } + + return 0; /* shouldn't ever hit this. */ +} + + +static const char * +COREAUDIO_GetAudioDevice(int index, int iscapture) +{ + if ((iscapture) && (index < inputDeviceCount)) { + return inputDevices[index].name; + } else if ((!iscapture) && (index < outputDeviceCount)) { + return outputDevices[index].name; + } + + SDL_SetError("No such device"); + return NULL; +} + + static void COREAUDIO_Deinitialize(void) { - free_device_list(&outputDevices, &outputDeviceCount); - free_device_list(&inputDevices, &inputDeviceCount); + free_device_lists(); }