126
|
1 // SDL audio driver for ft2play
|
|
2
|
|
3 #include <SDL2/SDL.h>
|
|
4 #include <stdint.h>
|
|
5 #include <stdbool.h>
|
|
6 #include <string.h>
|
|
7 #include "../../pmp_mix.h"
|
|
8
|
|
9 static SDL_AudioDeviceID dev;
|
|
10
|
|
11 static void SDLCALL audioCallback(void *userdata, Uint8 *stream, int len)
|
|
12 {
|
|
13 mix_UpdateBuffer((int16_t *)stream, len / 4); // pmp_mix.c function
|
|
14 (void)userdata;
|
|
15 }
|
|
16
|
|
17 void lockMixer(void)
|
|
18 {
|
|
19 if (dev != 0)
|
|
20 SDL_LockAudioDevice(dev);
|
|
21 }
|
|
22
|
|
23 void unlockMixer(void)
|
|
24 {
|
|
25 if (dev != 0)
|
|
26 SDL_UnlockAudioDevice(dev);
|
|
27 }
|
|
28
|
|
29 bool openMixer(int32_t mixingFrequency, int32_t mixingBufferSize)
|
|
30 {
|
|
31 SDL_AudioSpec want, have;
|
|
32
|
|
33 if (dev != 0)
|
|
34 return true;
|
|
35
|
|
36 if (SDL_Init(SDL_INIT_AUDIO) != 0)
|
|
37 return false;
|
|
38
|
|
39 memset(&want, 0, sizeof (want));
|
|
40 want.freq = mixingFrequency;
|
|
41 want.format = AUDIO_S16;
|
|
42 want.channels = 2;
|
|
43 want.samples = (uint16_t)mixingBufferSize;
|
|
44 want.callback = audioCallback;
|
|
45
|
|
46 dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, 0);
|
|
47 if (dev == 0)
|
|
48 return false;
|
|
49
|
|
50 SDL_PauseAudioDevice(dev, false);
|
|
51 return true;
|
|
52 }
|
|
53
|
|
54 void closeMixer(void)
|
|
55 {
|
|
56 if (dev != 0)
|
|
57 {
|
|
58 SDL_PauseAudioDevice(dev, true);
|
|
59 SDL_CloseAudioDevice(dev);
|
|
60 dev = 0;
|
|
61 }
|
|
62
|
|
63 SDL_Quit();
|
|
64 }
|