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