53 lines
1.2 KiB
C++
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;
|
|
}
|
|
}
|