| 
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 }
 |