#include #include "audio.h" typedef struct { SDL_AudioDeviceID id; } sdl_audio_device; static sdl_audio_device the_audio_device = {0}; int sdl_audio_init(nes_Audio_Stream* stream, int frequency) { int status = SDL_Init(SDL_INIT_AUDIO); if (0 == status) { sdl_audio_device* device = &the_audio_device; SDL_AudioSpec as = { .freq = frequency, .format = AUDIO_S16SYS, .channels = 1, }; device->id = SDL_OpenAudioDevice(NULL, 0, &as, NULL, 0); if (0 == device->id) { printf("SDL: %s\n", SDL_GetError()); status = -1; } else { stream->data = device; SDL_PauseAudioDevice(device->id, 0); } } return status; } void sdl_audio_done(nes_Audio_Stream* stream) { if (stream->data) { SDL_CloseAudioDevice( ((sdl_audio_device*)stream->data)->id ); stream->data = NULL; } } int sdl_audio_push(nes_Audio_Stream* stream, short* samples, int n_samples) { return SDL_QueueAudio( ((sdl_audio_device*)stream->data)->id, samples, n_samples * sizeof(short) ); } nes_Audio_Stream sdl_audio = { .init = sdl_audio_init, .done = sdl_audio_done, .push = sdl_audio_push, };