From 4b07d4f20fd940f2ff5ea8a170d513140c27dbdd Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 1 Jan 2009 07:54:58 +0000 Subject: [PATCH] Adjusted default choice of audio driver. If a driver can definitely see available devices, it is chosen. Otherwise, we'll take the first driver that initializes but saw no devices...this might be because it can't enumerate them, or there really aren't any available. This prevents the dsp driver from hogging control when there are no /dev/dsp* nodes (for example, on a Linux box with ALSA and no OSS emulation). --- src/audio/SDL_audio.c | 22 +++++++++++++++++++++- src/audio/alsa/SDL_alsa_audio.c | 2 +- src/audio/bsd/SDL_bsdaudio.c | 2 +- src/audio/dma/SDL_dmaaudio.c | 2 +- src/audio/dsp/SDL_dspaudio.c | 2 +- src/audio/esd/SDL_esdaudio.c | 2 +- src/audio/iphoneos/SDL_coreaudio_iphone.c | 2 +- src/audio/macosx/SDL_coreaudio.c | 2 +- src/audio/mint/SDL_mintaudio_dma8.c | 2 +- src/audio/mint/SDL_mintaudio_gsxb.c | 2 +- src/audio/mint/SDL_mintaudio_mcsn.c | 2 +- src/audio/mint/SDL_mintaudio_stfa.c | 2 +- src/audio/mint/SDL_mintaudio_xbios.c | 2 +- src/audio/nas/SDL_nasaudio.c | 2 +- src/audio/nds/SDL_ndsaudio.c | 2 +- src/audio/nto/SDL_nto_audio.c | 4 +++- src/audio/paudio/SDL_paudio.c | 4 +++- src/audio/pulseaudio/SDL_pulseaudio.c | 1 + src/audio/windib/SDL_dibaudio.c | 1 + src/audio/windx5/SDL_dx5audio.c | 1 + 20 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index 915712699..e32c0f352 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -589,6 +589,8 @@ SDL_AudioInit(const char *driver_name) int i = 0; int initialized = 0; int tried_to_init = 0; + int rc = 0; + int best_choice = -1; if (SDL_WasInit(SDL_INIT_AUDIO)) { SDL_AudioQuit(); /* shutdown driver if already running. */ @@ -614,7 +616,25 @@ SDL_AudioInit(const char *driver_name) SDL_memset(¤t_audio, 0, sizeof(current_audio)); current_audio.name = backend->name; current_audio.desc = backend->desc; - initialized = backend->init(¤t_audio.impl); + rc = backend->init(¤t_audio.impl); + if (rc == 2) { /* init'd, and devices available. Take it! */ + initialized = 1; + best_choice = i; + } else if (rc == 1) { /* init'd, but can't see any devices. */ + current_audio.impl.Deinitialize(); + if (best_choice == -1) { + best_choice = i; + } + } + } + + /* No definite choice. Pick one that works but can't promise a device. */ + if ((!initialized) && (best_choice != -1)) { + const AudioBootStrap *backend = bootstrap[best_choice]; + SDL_memset(¤t_audio, 0, sizeof(current_audio)); + current_audio.name = backend->name; + current_audio.desc = backend->desc; + initialized = (backend->init(¤t_audio.impl) > 0); } if (!initialized) { diff --git a/src/audio/alsa/SDL_alsa_audio.c b/src/audio/alsa/SDL_alsa_audio.c index 5b3af23e4..daa08357f 100644 --- a/src/audio/alsa/SDL_alsa_audio.c +++ b/src/audio/alsa/SDL_alsa_audio.c @@ -607,7 +607,7 @@ ALSA_Init(SDL_AudioDriverImpl * impl) impl->Deinitialize = ALSA_Deinitialize; impl->OnlyHasDefaultOutputDevice = 1; /* !!! FIXME: Add device enum! */ - return 1; + return 1; /* !!! FIXME: return 2 once device enum is implemented. */ } diff --git a/src/audio/bsd/SDL_bsdaudio.c b/src/audio/bsd/SDL_bsdaudio.c index 631d9aae1..520e531c9 100644 --- a/src/audio/bsd/SDL_bsdaudio.c +++ b/src/audio/bsd/SDL_bsdaudio.c @@ -444,7 +444,7 @@ BSDAUDIO_Init(SDL_AudioDriverImpl * impl) impl->Deinitialize = BSDAUDIO_Deinitialize; build_device_lists(); - return 1; + return (outputDeviceCount > 0) ? 2 : 1; } diff --git a/src/audio/dma/SDL_dmaaudio.c b/src/audio/dma/SDL_dmaaudio.c index 5b81753ff..62a72dc26 100644 --- a/src/audio/dma/SDL_dmaaudio.c +++ b/src/audio/dma/SDL_dmaaudio.c @@ -524,7 +524,7 @@ DMA_Init(SDL_AudioDriverImpl * impl) impl->Deinitialize = DMA_Deinitialize; build_device_lists(); - return 1; + return (outputDeviceCount > 0) ? 2 : 1; } AudioBootStrap DMA_bootstrap = { diff --git a/src/audio/dsp/SDL_dspaudio.c b/src/audio/dsp/SDL_dspaudio.c index 627354883..396259788 100644 --- a/src/audio/dsp/SDL_dspaudio.c +++ b/src/audio/dsp/SDL_dspaudio.c @@ -381,7 +381,7 @@ DSP_Init(SDL_AudioDriverImpl * impl) impl->Deinitialize = DSP_Deinitialize; build_device_lists(); - return 1; + return (outputDeviceCount > 0) ? 2 : 1; } diff --git a/src/audio/esd/SDL_esdaudio.c b/src/audio/esd/SDL_esdaudio.c index 7e07f6993..201a41568 100644 --- a/src/audio/esd/SDL_esdaudio.c +++ b/src/audio/esd/SDL_esdaudio.c @@ -341,7 +341,7 @@ ESD_Init(SDL_AudioDriverImpl * impl) impl->Deinitialize = ESD_Deinitialize; impl->OnlyHasDefaultOutputDevice = 1; - return 1; + return 2; /* return 2 (definitely have a "device"). */ } diff --git a/src/audio/iphoneos/SDL_coreaudio_iphone.c b/src/audio/iphoneos/SDL_coreaudio_iphone.c index 29a30c0d2..3e50ea9f9 100644 --- a/src/audio/iphoneos/SDL_coreaudio_iphone.c +++ b/src/audio/iphoneos/SDL_coreaudio_iphone.c @@ -329,7 +329,7 @@ COREAUDIO_Init(SDL_AudioDriverImpl * impl) impl->OnlyHasDefaultOutputDevice = 1; impl->HasCaptureSupport = 0; /* still needs to be written */ - return 1; + return 2; /* defitely have an audio device. */ } AudioBootStrap COREAUDIOIPHONE_bootstrap = { diff --git a/src/audio/macosx/SDL_coreaudio.c b/src/audio/macosx/SDL_coreaudio.c index 2d53e4bba..3b4a6fcda 100644 --- a/src/audio/macosx/SDL_coreaudio.c +++ b/src/audio/macosx/SDL_coreaudio.c @@ -589,7 +589,7 @@ COREAUDIO_Init(SDL_AudioDriverImpl * impl) build_device_lists(); /* do an initial check for devices... */ - return 1; + return (outputDeviceCount > 0) ? 2 : 1; } AudioBootStrap COREAUDIO_bootstrap = { diff --git a/src/audio/mint/SDL_mintaudio_dma8.c b/src/audio/mint/SDL_mintaudio_dma8.c index c488c4a09..223d4495a 100644 --- a/src/audio/mint/SDL_mintaudio_dma8.c +++ b/src/audio/mint/SDL_mintaudio_dma8.c @@ -338,7 +338,7 @@ MINTDMA8_Init(SDL_AudioDriverImpl * impl) impl->ProvidesOwnCallbackThread = 1; impl->SkipMixerLock = 1; - return 1; + return 2; /* 2 == definitely has an audio device. */ } AudioBootStrap MINTAUDIO_DMA8_bootstrap = { diff --git a/src/audio/mint/SDL_mintaudio_gsxb.c b/src/audio/mint/SDL_mintaudio_gsxb.c index 81697bcec..ab9d7632e 100644 --- a/src/audio/mint/SDL_mintaudio_gsxb.c +++ b/src/audio/mint/SDL_mintaudio_gsxb.c @@ -433,7 +433,7 @@ MINTGSXB_Init(SDL_AudioDriverImpl * impl) impl->ProvidesOwnCallbackThread = 1; impl->SkipMixerLock = 1; - return 1; + return 2; /* 2 == definitely has an audio device. */ } AudioBootStrap MINTAUDIO_GSXB_bootstrap = { diff --git a/src/audio/mint/SDL_mintaudio_mcsn.c b/src/audio/mint/SDL_mintaudio_mcsn.c index c68c81158..8dc8fcfaa 100644 --- a/src/audio/mint/SDL_mintaudio_mcsn.c +++ b/src/audio/mint/SDL_mintaudio_mcsn.c @@ -390,7 +390,7 @@ MINTMCSN_Init(SDL_AudioDriverImpl * impl) impl->ProvidesOwnCallbackThread = 1; impl->SkipMixerLock = 1; - return 1; + return 2; /* 2 == definitely has an audio device. */ } AudioBootStrap MINTAUDIO_MCSN_bootstrap = { diff --git a/src/audio/mint/SDL_mintaudio_stfa.c b/src/audio/mint/SDL_mintaudio_stfa.c index 946c32072..3ba08972f 100644 --- a/src/audio/mint/SDL_mintaudio_stfa.c +++ b/src/audio/mint/SDL_mintaudio_stfa.c @@ -297,7 +297,7 @@ MINTSTFA_Init(SDL_AudioDriverImpl * impl) impl->ProvidesOwnCallbackThread = 1; impl->SkipMixerLock = 1; - return 1; + return 2; /* 2 == definitely has an audio device. */ } AudioBootStrap MINTAUDIO_STFA_bootstrap = { diff --git a/src/audio/mint/SDL_mintaudio_xbios.c b/src/audio/mint/SDL_mintaudio_xbios.c index 2a3d33d42..799a4cbe4 100644 --- a/src/audio/mint/SDL_mintaudio_xbios.c +++ b/src/audio/mint/SDL_mintaudio_xbios.c @@ -490,7 +490,7 @@ MINTXBIOS_Init(SDL_AudioDriverImpl * impl) impl->ProvidesOwnCallbackThread = 1; impl->SkipMixerLock = 1; - return 1; + return 2; /* 2 == definitely has an audio device. */ } AudioBootStrap MINTAUDIO_XBIOS_bootstrap = { diff --git a/src/audio/nas/SDL_nasaudio.c b/src/audio/nas/SDL_nasaudio.c index c71def2d1..dc72b537b 100644 --- a/src/audio/nas/SDL_nasaudio.c +++ b/src/audio/nas/SDL_nasaudio.c @@ -398,7 +398,7 @@ NAS_Init(SDL_AudioDriverImpl * impl) impl->Deinitialize = NAS_Deinitialize; impl->OnlyHasDefaultOutputDevice = 1; /* !!! FIXME: is this true? */ - return 1; + return 2; /* 2 == definitely has an audio device. */ } AudioBootStrap NAS_bootstrap = { diff --git a/src/audio/nds/SDL_ndsaudio.c b/src/audio/nds/SDL_ndsaudio.c index 47d103963..e92aeb410 100644 --- a/src/audio/nds/SDL_ndsaudio.c +++ b/src/audio/nds/SDL_ndsaudio.c @@ -120,7 +120,7 @@ NDSAUD_Init(SDL_AudioDriverImpl * impl) impl->OnlyHasDefaultOutputDevice = 1; impl->OnlyHasDefaultInputDevice = 1; - return 1; + return 2; /* 2 == definitely has an audio device. */ } AudioBootStrap NDSAUD_bootstrap = { diff --git a/src/audio/nto/SDL_nto_audio.c b/src/audio/nto/SDL_nto_audio.c index eb7674025..d85f94e69 100644 --- a/src/audio/nto/SDL_nto_audio.c +++ b/src/audio/nto/SDL_nto_audio.c @@ -434,6 +434,7 @@ NTO_OpenDevice(_THIS, const char *devname, int iscapture) static int NTO_Init(SDL_AudioDriverImpl * impl) { + /* !!! FIXME: not right for device enum? */ /* See if we can open a nonblocking channel. */ snd_pcm_t *handle = NULL; int rval = snd_pcm_open_preferred(&handle, NULL, NULL, OPEN_FLAGS); @@ -455,7 +456,8 @@ NTO_Init(SDL_AudioDriverImpl * impl) impl->CloseDevice = NTO_CloseDevice; impl->OnlyHasDefaultOutputDevice = 1; /* !!! FIXME: add device enum! */ - return 1; + /* !!! FIXME: device enum might make this 1. */ + return 2; /* 2 == definitely has an audio device. */ } AudioBootStrap QNXNTOAUDIO_bootstrap = { diff --git a/src/audio/paudio/SDL_paudio.c b/src/audio/paudio/SDL_paudio.c index f94152c73..79cff19ce 100644 --- a/src/audio/paudio/SDL_paudio.c +++ b/src/audio/paudio/SDL_paudio.c @@ -528,6 +528,7 @@ PAUDIO_OpenDevice(_THIS, const char *devname, int iscapture) static int PAUDIO_Init(SDL_AudioDriverImpl * impl) { + /* !!! FIXME: not right for device enum? */ int fd = OpenAudioPath(NULL, 0, OPEN_FLAGS, 0); if (fd < 0) { SDL_SetError("PAUDIO: Couldn't open audio device"); @@ -543,7 +544,8 @@ PAUDIO_Init(SDL_AudioDriverImpl * impl) impl->CloseDevice = DSP_CloseDevice; impl->OnlyHasDefaultOutputDevice = 1; /* !!! FIXME: add device enum! */ - return 1; + /* !!! FIXME: device enum might make this 1. */ + return 2; /* 2 == definitely has an audio device. */ } AudioBootStrap PAUDIO_bootstrap = { diff --git a/src/audio/pulseaudio/SDL_pulseaudio.c b/src/audio/pulseaudio/SDL_pulseaudio.c index 172d99952..0521331ee 100644 --- a/src/audio/pulseaudio/SDL_pulseaudio.c +++ b/src/audio/pulseaudio/SDL_pulseaudio.c @@ -380,6 +380,7 @@ PULSEAUDIO_Init(SDL_AudioDriverImpl * impl) impl->Deinitialize = PULSEAUDIO_Deinitialize; impl->OnlyHasDefaultOutputDevice = 1; + /* !!! FIXME: should test if server is available here, return 2 if so. */ return 1; } diff --git a/src/audio/windib/SDL_dibaudio.c b/src/audio/windib/SDL_dibaudio.c index 2c265d59d..b81291e6e 100644 --- a/src/audio/windib/SDL_dibaudio.c +++ b/src/audio/windib/SDL_dibaudio.c @@ -327,6 +327,7 @@ WINWAVEOUT_Init(SDL_AudioDriverImpl * impl) impl->CloseDevice = WINWAVEOUT_CloseDevice; impl->OnlyHasDefaultOutputDevice = 1; /* !!! FIXME: Is this true? */ + /* !!! FIXME: not right for device enum? */ return 1; } diff --git a/src/audio/windx5/SDL_dx5audio.c b/src/audio/windx5/SDL_dx5audio.c index 09a915dc4..557c20f64 100644 --- a/src/audio/windx5/SDL_dx5audio.c +++ b/src/audio/windx5/SDL_dx5audio.c @@ -508,6 +508,7 @@ DSOUND_Init(SDL_AudioDriverImpl * impl) impl->Deinitialize = DSOUND_Deinitialize; impl->OnlyHasDefaultOutputDevice = 1; /* !!! FIXME */ + /* !!! FIXME: not right for device enum? */ return 1; }