#include "AudioBackend.h" #include AudioBackend audioBackend; AudioBackend::AudioBackend() { } AudioBackend::~AudioBackend() { terminate(); } void AudioBackend::init() { SDL_AudioSpec desired; desired.freq = 44100; desired.format = AUDIO_S16LSB; desired.channels = 2; desired.samples = 1024; desired.padding = 0; desired.userdata = this; desired.callback = [] (void *userdata, Uint8 *stream, int len) { static_cast(userdata)->generate(stream, len); }; _audioDevice = SDL_OpenAudioDevice(nullptr, 0, &desired, &_audioSpec, 0); if (!_audioDevice) { std::cerr << "Failed to open audio device: " << SDL_GetError() << std::endl; abort(); } SDL_PauseAudioDevice(_audioDevice, 0); } void AudioBackend::terminate() { if (_audioDevice) { SDL_PauseAudioDevice(_audioDevice, 1); SDL_CloseAudioDevice(_audioDevice); } } void AudioBackend::generate(Uint8 *stream, int len) { len = len / 4; auto s = reinterpret_cast(stream); for (int i = 0; i < len; i++) { int16_t l, r; Opl::generateSample(&l, &r); *s++ = l; *s++ = r; } }