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)28 static 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)39 static 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)45 bool 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