rexglue-skate3/include/rex/audio/sdl/sdl_audio_driver.h
2026-05-18 22:41:13 +01:00

54 lines
1.7 KiB
C++

/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2020 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*
* @modified Tom Clay, 2026 - Adapted for ReXGlue runtime
*/
#pragma once
#include <mutex>
#include <queue>
#include <stack>
#include <rex/audio/audio_driver.h>
#include <rex/thread.h>
#include <SDL3/SDL.h>
namespace rex::audio::sdl {
class SDLAudioDriver : public AudioDriver {
public:
SDLAudioDriver(memory::Memory* memory, rex::thread::Semaphore* semaphore);
~SDLAudioDriver() override;
bool Initialize();
void SubmitFrame(uint32_t frame_ptr) override;
void Shutdown();
protected:
static void SDLCallback(void* userdata, SDL_AudioStream* stream, int additional_amount,
int total_amount);
rex::thread::Semaphore* semaphore_ = nullptr;
SDL_AudioStream* sdl_stream_ = nullptr;
bool sdl_initialized_ = false;
uint8_t sdl_device_channels_ = 0;
static const uint32_t frame_frequency_ = 48000;
static const uint32_t frame_channels_ = 6;
static const uint32_t channel_samples_ = 256;
static const uint32_t frame_samples_ = frame_channels_ * channel_samples_;
static const uint32_t frame_size_ = sizeof(float) * frame_samples_;
std::queue<float*> frames_queued_ = {};
std::stack<float*> frames_unused_ = {};
std::mutex frames_mutex_ = {};
};
} // namespace rex::audio::sdl