Support comma-separated lists in SDL_AUDIODRIVER
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c
index 5ce94d1..dff8d08 100644
--- a/src/audio/SDL_audio.c
+++ b/src/audio/SDL_audio.c
@@ -972,19 +972,38 @@ SDL_AudioInit(const char *driver_name)
driver_name = SDL_getenv("SDL_AUDIODRIVER");
}
- for (i = 0; (!initialized) && (bootstrap[i]); ++i) {
- /* make sure we should even try this driver before doing so... */
- const AudioBootStrap *backend = bootstrap[i];
- if ((driver_name && (SDL_strncasecmp(backend->name, driver_name, SDL_strlen(driver_name)) != 0)) ||
- (!driver_name && backend->demand_only)) {
- continue;
+ if (driver_name != NULL) {
+ const char *driver_attempt = driver_name;
+ while (driver_attempt != NULL && *driver_attempt != 0 && !initialized) {
+ const char *driver_attempt_end = SDL_strchr(driver_attempt, ',');
+ size_t driver_attempt_len = (driver_attempt_end != NULL) ? (driver_attempt_end - driver_attempt)
+ : SDL_strlen(driver_attempt);
+
+ for (i = 0; bootstrap[i]; ++i) {
+ if (SDL_strncasecmp(bootstrap[i]->name, driver_attempt, driver_attempt_len) == 0) {
+ tried_to_init = 1;
+ SDL_zero(current_audio);
+ current_audio.name = bootstrap[i]->name;
+ current_audio.desc = bootstrap[i]->desc;
+ initialized = bootstrap[i]->init(¤t_audio.impl);
+ break;
+ }
+ }
+
+ driver_attempt = (driver_attempt_end != NULL) ? (driver_attempt_end + 1) : NULL;
}
+ } else {
+ for (i = 0; (!initialized) && (bootstrap[i]); ++i) {
+ if(bootstrap[i]->demand_only) {
+ continue;
+ }
- tried_to_init = 1;
- SDL_zero(current_audio);
- current_audio.name = backend->name;
- current_audio.desc = backend->desc;
- initialized = backend->init(¤t_audio.impl);
+ tried_to_init = 1;
+ SDL_zero(current_audio);
+ current_audio.name = bootstrap[i]->name;
+ current_audio.desc = bootstrap[i]->desc;
+ initialized = bootstrap[i]->init(¤t_audio.impl);
+ }
}
if (!initialized) {