Adding audio interface part 1

This commit is contained in:
wheremyfoodat 2025-02-09 03:53:15 +02:00
parent be071ffb78
commit 486e2ea5cb
7 changed files with 91 additions and 51 deletions

View file

@ -7,10 +7,10 @@
#include "helpers.hpp"
MiniAudioDevice::MiniAudioDevice(const AudioDeviceConfig& audioSettings)
: initialized(false), running(false), samples(nullptr), audioSettings(audioSettings) {}
MiniAudioDevice::MiniAudioDevice(const AudioDeviceConfig& audioSettings) : AudioDeviceInterface(nullptr, audioSettings), initialized(false) {
running = false;
}
#ifndef __LIBRETRO__
void MiniAudioDevice::init(Samples& samples, bool safe) {
this->samples = &samples;
running = false;
@ -213,5 +213,4 @@ void MiniAudioDevice::close() {
ma_device_uninit(&device);
ma_context_uninit(&context);
}
}
#endif
}

View file

@ -22,7 +22,6 @@ static bool usingGLES = false;
std::unique_ptr<Emulator> emulator;
RendererGL* renderer;
MiniAudioDevice* audioDevice;
std::filesystem::path Emulator::getConfigPath() {
return std::filesystem::path(savePath / "config.toml");
@ -32,27 +31,6 @@ std::filesystem::path Emulator::getAppDataRoot() {
return std::filesystem::path(savePath / "Emulator Files");
}
void MiniAudioDevice::init(Samples& samples, bool safe) {
this->samples = &samples;
initialized = true;
running = false;
audioDevice = this;
}
void MiniAudioDevice::start() {
running = true;
}
void MiniAudioDevice::stop() {
running = false;
}
void MiniAudioDevice::close() {
running = false;
initialized = false;
}
static void* getGLProcAddress(const char* name) {
return (void*)hwRender.get_proc_address(name);
}
@ -411,29 +389,30 @@ void retro_run() {
emulator->runFrame();
videoCallback(RETRO_HW_FRAME_BUFFER_VALID, emulator->width, emulator->height, 0);
auto& audioDevice = emulator->getAudioDevice();
if (audioDevice->running) {
if (audioDevice.running) {
static constexpr int frameCount = 547;
static constexpr int channelCount = 2;
static int16_t audioBuffer[frameCount * channelCount];
usize samplesWritten = 0;
samplesWritten += audioDevice->samples->pop(audioBuffer, frameCount * channelCount);
samplesWritten += audioDevice.getSamples()->pop(audioBuffer, frameCount * channelCount);
// Get the last sample for underrun handling
if (samplesWritten != 0) {
std::memcpy(
&audioDevice->lastStereoSample[0],
&audioDevice.lastStereoSample[0],
&audioBuffer[(samplesWritten - 1) * 2],
sizeof(audioDevice->lastStereoSample)
sizeof(audioDevice.lastStereoSample)
);
}
// If underruning, copy the last output sample
{
s16* pointer = &audioBuffer[samplesWritten * 2];
s16 l = audioDevice->lastStereoSample[0];
s16 r = audioDevice->lastStereoSample[1];
s16 l = audioDevice.lastStereoSample[0];
s16 r = audioDevice.lastStereoSample[1];
for (usize i = samplesWritten; i < frameCount; i++) {
*pointer++ = l;