Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/src/pc/audio/audio_sdl2.c
7861 views
1
#ifdef __MINGW32__
2
#include "SDL.h"
3
#elif TARGET_MACOS
4
#include <SDL.h>
5
#else
6
#include "SDL2/SDL.h"
7
#endif
8
9
#include "audio_api.h"
10
11
#include "../../game/settings.h"
12
13
static SDL_AudioDeviceID dev;
14
15
static bool audio_sdl_init(void) {
16
if (SDL_Init(SDL_INIT_AUDIO) != 0) {
17
fprintf(stderr, "SDL init error: %s\n", SDL_GetError());
18
return false;
19
}
20
SDL_AudioSpec want, have;
21
SDL_zero(want);
22
want.freq = 32000;
23
want.format = AUDIO_S16;
24
want.channels = 2;
25
want.samples = 512;
26
want.callback = NULL;
27
dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, 0);
28
if (dev == 0) {
29
fprintf(stderr, "SDL_OpenAudio error: %s\n", SDL_GetError());
30
return false;
31
}
32
SDL_PauseAudioDevice(dev, 0);
33
return true;
34
}
35
36
static int audio_sdl_buffered(void) {
37
return SDL_GetQueuedAudioSize(dev) / 4;
38
}
39
40
static int audio_sdl_get_desired_buffered(void) {
41
return 1100;
42
}
43
44
static void audio_sdl_play(const uint8_t *buf, size_t len) {
45
if (configOverallVolume > 0 && audio_sdl_buffered() < 6000) {
46
#if TARGET_MACOS
47
SDL_QueueAudio(dev, buf, len);
48
#else
49
uint8_t *mix_buf[len];
50
SDL_memset(mix_buf, 0, len);
51
SDL_MixAudioFormat((Uint8*)mix_buf, buf, AUDIO_S16, len, SDL_MIX_MAXVOLUME * configOverallVolume);
52
SDL_QueueAudio(dev, mix_buf, len);
53
#endif
54
}
55
}
56
57
struct AudioAPI audio_sdl = {
58
audio_sdl_init,
59
audio_sdl_buffered,
60
audio_sdl_get_desired_buffered,
61
audio_sdl_play
62
};
63
64