dosgame1/system/sdl/AudioBackend.cpp

53 lines
1.2 KiB
C++

#include "AudioBackend.h"
#include <iostream>
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<AudioBackend*>(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<int16_t *>(stream);
for (int i = 0; i < len; i++) {
int16_t l, r;
Opl::generateSample(&l, &r);
*s++ = l;
*s++ = r;
}
}