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; }