23 LOG_WARN(
"AudioBackend",
"Already initialized, shutting down first");
29 SDL_AudioSpec want, have;
30 SDL_memset(&want, 0,
sizeof(want));
36 want.callback =
nullptr;
38 device_id_ = SDL_OpenAudioDevice(
nullptr, 0, &want, &have, 0);
41 LOG_ERROR(
"AudioBackend",
"Failed to open SDL audio device: %s", SDL_GetError());
46 if (have.freq != want.freq || have.channels != want.channels) {
48 "Audio spec mismatch - wanted %dHz %dch, got %dHz %dch",
49 want.freq, want.channels, have.freq, have.channels);
55 LOG_INFO(
"AudioBackend",
"SDL2 audio initialized: %dHz, %d channels, %d samples buffer",
56 have.freq, have.channels, have.samples);
76 LOG_INFO(
"AudioBackend",
"SDL2 audio shut down");
106 int result = SDL_QueueAudio(
device_id_, samples, num_samples *
sizeof(int16_t));
108 LOG_ERROR(
"AudioBackend",
"SDL_QueueAudio failed: %s", SDL_GetError());
116 thread_local std::vector<int16_t> scaled_samples;
119 if (scaled_samples.size() <
static_cast<size_t>(num_samples)) {
120 scaled_samples.resize(num_samples);
124 for (
int i = 0; i < num_samples; ++i) {
125 int32_t scaled =
static_cast<int32_t
>(samples[i] *
volume_);
127 if (scaled > 32767) scaled = 32767;
128 else if (scaled < -32768) scaled = -32768;
129 scaled_samples[i] =
static_cast<int16_t
>(scaled);
132 int result = SDL_QueueAudio(
device_id_, scaled_samples.data(),
133 num_samples *
sizeof(int16_t));
135 LOG_ERROR(
"AudioBackend",
"SDL_QueueAudio failed: %s", SDL_GetError());
146 std::vector<int16_t> int_samples(num_samples);
147 for (
int i = 0; i < num_samples; ++i) {
148 float scaled = std::clamp(samples[i] *
volume_, -1.0f, 1.0f);
149 int_samples[i] =
static_cast<int16_t
>(scaled * 32767.0f);
185 volume_ = std::clamp(volume, 0.0f, 1.0f);
199 return std::make_unique<SDL2AudioBackend>();
203 LOG_WARN(
"AudioBackend",
"NULL backend not yet implemented, using SDL2");
204 return std::make_unique<SDL2AudioBackend>();
207 LOG_ERROR(
"AudioBackend",
"Unknown backend type, using SDL2");
208 return std::make_unique<SDL2AudioBackend>();
static std::unique_ptr< IAudioBackend > Create(BackendType type)
AudioConfig GetConfig() const override
void SetVolume(float volume) override
bool Initialize(const AudioConfig &config) override
~SDL2AudioBackend() override
bool IsInitialized() const override
AudioStatus GetStatus() const override
float GetVolume() const override
bool QueueSamples(const int16_t *samples, int num_samples) override
#define LOG_ERROR(category, format,...)
#define LOG_WARN(category, format,...)
#define LOG_INFO(category, format,...)
Main namespace for the application.