1 /* 2 * This software is licensed under the terms of the MIT License. 3 * See COPYING for further information. 4 * --- 5 * Copyright (c) 2011-2019, Lukas Weber <laochailan@web.de>. 6 * Copyright (c) 2012-2019, Andrei Alexeyev <akari@taisei-project.org>. 7 */ 8 9 #include "taisei.h" 10 11 #include "backend.h" 12 #include "util.h" 13 14 #undef A 15 #define A(x) extern AudioBackend _a_backend_##x; 16 TAISEI_BUILDCONF_AUDIO_BACKENDS 17 #undef A 18 19 AudioBackend *_a_backends[] = { 20 #define A(x) &_a_backend_##x, 21 TAISEI_BUILDCONF_AUDIO_BACKENDS 22 #undef A 23 NULL, 24 }; 25 26 AudioBackend _a_backend; 27 _audio_find_backend(const char * name)28static AudioBackend *_audio_find_backend(const char *name) { 29 for(AudioBackend **b = _a_backends; *b; ++b) { 30 if(!strcmp((*b)->name, name)) { 31 return *b; 32 } 33 } 34 35 log_error("Unknown audio backend '%s'", name); 36 return NULL; 37 } 38 _audio_backend_try_init(AudioBackend * backend)39static bool _audio_backend_try_init(AudioBackend *backend) { 40 _a_backend = *backend; 41 log_debug("Trying %s", _a_backend.name); 42 return _a_backend.funcs.init(); 43 } 44 audio_backend_init(void)45bool audio_backend_init(void) { 46 const char *name = env_get("TAISEI_AUDIO_BACKEND", ""); 47 bool initialized = false; 48 49 if(!*name) { 50 name = TAISEI_BUILDCONF_AUDIO_DEFAULT; 51 } 52 53 AudioBackend *backend = _audio_find_backend(name); 54 55 if(backend) { 56 initialized = _audio_backend_try_init(backend); 57 } 58 59 for(AudioBackend **b = _a_backends; *b && !initialized; ++b) { 60 if(*b != backend) { 61 initialized = _audio_backend_try_init(*b); 62 } 63 } 64 65 return initialized; 66 } 67