1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #define FSE_INTERNAL_API
6 #include <fs/emu/audio.h>
7 #include <fs/emu/options.h>
8 #include <fs/conf.h>
9 #include <fs/log.h>
10 #include <assert.h>
11 #include <stdlib.h>
12 #include <string.h>
13
14 fse_audio_t fse_audio = {};
15 static int g_volume = 100;
16 static bool g_muted = false;
17 int64_t g_fs_emu_audio_buffer_underrun_time = 0;
18
fse_audio_volume(int stream)19 int fse_audio_volume(int stream)
20 {
21 assert(stream == FS_EMU_AUDIO_MASTER);
22 return g_volume;
23 }
24
fse_set_set_audio_volume(int stream,int volume)25 void fse_set_set_audio_volume(int stream, int volume)
26 {
27 assert(stream == FS_EMU_AUDIO_MASTER);
28 g_volume = volume;
29 for (int i = 0; i < FSE_MAX_AUDIO_STREAMS; i++) {
30 fse_audio.want_volume[i] = g_muted ? 0.0 : g_volume / 100.0;
31 }
32 }
33
fse_audio_muted(int stream)34 bool fse_audio_muted(int stream)
35 {
36 assert(stream == FS_EMU_AUDIO_MASTER);
37 return g_muted || g_volume == 0;
38 }
39
fse_set_audio_muted(int stream,bool muted)40 void fse_set_audio_muted(int stream, bool muted)
41 {
42 assert(stream == FS_EMU_AUDIO_MASTER);
43 g_muted = muted;
44 for (int i = 0; i < FSE_MAX_AUDIO_STREAMS; i++) {
45 fse_audio.want_volume[i] = g_muted ? 0.0 : g_volume / 100.0;
46 }
47 }
48
fse_set_audio_paused(int stream,bool paused)49 void fse_set_audio_paused(int stream, bool paused)
50 {
51 fse_audio.set_paused(stream, paused);
52 }
53
fse_queue_audio_buffer(int stream,int16_t * buffer,int size)54 int fse_queue_audio_buffer(int stream, int16_t *buffer, int size)
55 {
56 return fse_audio.queue_buffer(stream, buffer, size);
57 }
58
fse_check_audio_buffer(int stream,int buffer)59 int fse_check_audio_buffer(int stream, int buffer)
60 {
61 return fse_audio.check_buffer(stream, buffer);
62 }
63
fs_emu_audio_configure(fse_audio_stream_options ** options)64 void fs_emu_audio_configure(fse_audio_stream_options **options)
65 {
66 fse_audio.configure(options);
67 }
68
fs_emu_audio_output_frequency(void)69 int fs_emu_audio_output_frequency(void)
70 {
71 return fse_audio.frequency();
72 }
73
74
fs_emu_audio_alloc_stream_options(int streams)75 fse_audio_stream_options **fs_emu_audio_alloc_stream_options(int streams)
76 {
77 fse_audio_stream_options **options = \
78 malloc(sizeof(fse_audio_stream_options *) * (streams + 1));
79 for (int i = 0; i < streams; i++) {
80 options[i] = (fse_audio_stream_options *) \
81 malloc(sizeof(fse_audio_stream_options));
82 memset(options[i], 0x00, sizeof(fse_audio_stream_options));
83
84 options[i]->frequency = 44100;
85 options[i]->channels = 2;
86 options[i]->sample_size = 16;
87 //options->buffer_size = 1024;
88 options[i]->buffer_size = 512;
89 //options->min_buffers = 10;
90 options[i]->min_buffers = 1;
91 }
92 options[streams] = NULL;
93 return options;
94 }
95
fs_emu_audio_free_stream_options(fse_audio_stream_options ** options)96 void fs_emu_audio_free_stream_options(fse_audio_stream_options **options)
97 {
98 for (fse_audio_stream_options **o = options; *o; o++) {
99 free(*o);
100 }
101 free(options);
102 }
103
fse_init_audio(void)104 void fse_init_audio(void)
105 {
106 fs_log("[AUDIO] Initialize\n");
107
108 const char *driver = fs_config_get_const_string(OPTION_AUDIO_DRIVER);
109 if (0) {
110 #ifdef WITH_OPENAL
111 } else if (!driver || strcmp(driver, "openal") == 0) {
112 fse_init_openal_audio();
113 #endif
114 } else {
115 fse_init_dummy_audio();
116 }
117
118 for (int i = 0; i < FSE_MAX_AUDIO_STREAMS; i++) {
119 fse_audio.want_volume[i] = 1.0;
120 }
121 int volume = fs_config_get_int_clamped("volume", 0, 100);
122 if (volume != FS_CONFIG_NONE) {
123 if (volume == 0) {
124 fse_set_audio_muted(FS_EMU_AUDIO_MASTER, 1);
125 } else {
126 fse_set_set_audio_volume(FS_EMU_AUDIO_MASTER, volume);
127 }
128 }
129 }
130