SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
SDL/audio.c
1 #include <stdbool.h>
2 #include <stddef.h>
3 #include <stdlib.h>
4 #include <Core/gb.h>
5 #include "audio/audio.h"
6 #include "configuration.h"
7
8 #define likely(x) GB_likely(x)
9 #define unlikely(x) GB_unlikely(x)
10
11 static const GB_audio_driver_t *driver = NULL;
12
13 bool GB_audio_init(void)
14 {
15 const GB_audio_driver_t *drivers[] = {
16 #ifdef _WIN32
17 GB_AUDIO_DRIVER_REF(XAudio2),
18 #endif
19 GB_AUDIO_DRIVER_REF(SDL),
20 #ifdef ENABLE_OPENAL
21 GB_AUDIO_DRIVER_REF(OpenAL),
22 #endif
23 };
24
25 // First try the preferred driver
26 for (unsigned i = 0; i < sizeof(drivers) / sizeof(drivers[0]); i++) {
27 driver = drivers[i];
28 if (strcmp(driver->name, configuration.audio_driver) != 0) {
29 continue;
30 }
31 if (driver->audio_init()) {
32 if (driver->audio_deinit) {
33 atexit(driver->audio_deinit);
34 }
35 return true;
36 }
37 }
38
39 // Else go by priority
40 for (unsigned i = 0; i < sizeof(drivers) / sizeof(drivers[0]); i++) {
41 driver = drivers[i];
42 if (driver->audio_init()) {
43 atexit(driver->audio_deinit);
44 return true;
45 }
46 }
47
48 driver = NULL;
49 return false;
50 }
51
52 bool GB_audio_is_playing(void)
53 {
54 if (unlikely(!driver)) return false;
55 return driver->audio_is_playing();
56 }
57
58 void GB_audio_set_paused(bool paused)
59 {
60 if (unlikely(!driver)) return;
61 return driver->audio_set_paused(paused);
62 }
63
64 void GB_audio_clear_queue(void)
65 {
66 if (unlikely(!driver)) return;
67 return driver->audio_clear_queue();
68 }
69
70 unsigned GB_audio_get_frequency(void)
71 {
72 if (unlikely(!driver)) return 0;
73 return driver->audio_get_frequency();
74 }
75
76 size_t GB_audio_get_queue_length(void)
77 {
78 if (unlikely(!driver)) return 0;
79 return driver->audio_get_queue_length();
80 }
81
82 void GB_audio_queue_sample(GB_sample_t *sample)
83 {
84 if (unlikely(!driver)) return;
85 return driver->audio_queue_sample(sample);
86 }
87
88 const char *GB_audio_driver_name(void)
89 {
90 if (unlikely(!driver)) return "None";
91 return driver->name;
92 }
93
94 const char *GB_audio_driver_name_at_index(unsigned index)
95 {
96 const GB_audio_driver_t *drivers[] = {
97 #ifdef _WIN32
98 GB_AUDIO_DRIVER_REF(XAudio2),
99 #endif
100 GB_AUDIO_DRIVER_REF(SDL),
101 #ifdef ENABLE_OPENAL
102 GB_AUDIO_DRIVER_REF(OpenAL),
103 #endif
104 };
105 if (index >= sizeof(drivers) / sizeof(drivers[0])) {
106 return "";
107 }
108 return drivers[index]->name;
109 }
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.