From be071ffb787555f80bf4002a9c3985d839e06d25 Mon Sep 17 00:00:00 2001 From: Jonian Guveli Date: Sat, 1 Feb 2025 23:19:45 +0200 Subject: [PATCH 1/9] Libretro: Add audio support --- include/audio/miniaudio_device.hpp | 1 + src/core/audio/miniaudio_device.cpp | 2 ++ src/libretro_core.cpp | 54 +++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/include/audio/miniaudio_device.hpp b/include/audio/miniaudio_device.hpp index 0363aa441..9aae6eed4 100644 --- a/include/audio/miniaudio_device.hpp +++ b/include/audio/miniaudio_device.hpp @@ -9,6 +9,7 @@ #include "ring_buffer.hpp" class MiniAudioDevice { + public: using Samples = Common::RingBuffer; static constexpr ma_uint32 sampleRate = 32768; // 3DS sample rate static constexpr ma_uint32 channelCount = 2; // Audio output is stereo diff --git a/src/core/audio/miniaudio_device.cpp b/src/core/audio/miniaudio_device.cpp index 550fb039d..e2cc6f37b 100644 --- a/src/core/audio/miniaudio_device.cpp +++ b/src/core/audio/miniaudio_device.cpp @@ -10,6 +10,7 @@ MiniAudioDevice::MiniAudioDevice(const AudioDeviceConfig& audioSettings) : initialized(false), running(false), samples(nullptr), audioSettings(audioSettings) {} +#ifndef __LIBRETRO__ void MiniAudioDevice::init(Samples& samples, bool safe) { this->samples = &samples; running = false; @@ -213,3 +214,4 @@ void MiniAudioDevice::close() { ma_context_uninit(&context); } } +#endif diff --git a/src/libretro_core.cpp b/src/libretro_core.cpp index 727da8d2d..45791c2d4 100644 --- a/src/libretro_core.cpp +++ b/src/libretro_core.cpp @@ -22,6 +22,7 @@ static bool usingGLES = false; std::unique_ptr emulator; RendererGL* renderer; +MiniAudioDevice* audioDevice; std::filesystem::path Emulator::getConfigPath() { return std::filesystem::path(savePath / "config.toml"); @@ -31,6 +32,27 @@ 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); } @@ -389,6 +411,38 @@ void retro_run() { emulator->runFrame(); videoCallback(RETRO_HW_FRAME_BUFFER_VALID, emulator->width, emulator->height, 0); + + 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); + + // Get the last sample for underrun handling + if (samplesWritten != 0) { + std::memcpy( + &audioDevice->lastStereoSample[0], + &audioBuffer[(samplesWritten - 1) * 2], + 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]; + + for (usize i = samplesWritten; i < frameCount; i++) { + *pointer++ = l; + *pointer++ = r; + } + } + + audioBatchCallback(audioBuffer, sizeof(audioBuffer) / (2 * sizeof(int16_t))); + } } void retro_set_controller_port_device(uint port, uint device) {} From 486e2ea5cb262d640b412d94b0cfd1ddd036dad0 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 9 Feb 2025 03:53:15 +0200 Subject: [PATCH 2/9] Adding audio interface part 1 --- CMakeLists.txt | 3 ++- include/audio/audio_device.hpp | 31 ++++++++++++++++++++++ include/audio/libretro_audio_device.hpp | 33 +++++++++++++++++++++++ include/audio/miniaudio_device.hpp | 25 ++++++------------ include/emulator.hpp | 6 +++++ src/core/audio/miniaudio_device.cpp | 9 +++---- src/libretro_core.cpp | 35 +++++-------------------- 7 files changed, 91 insertions(+), 51 deletions(-) create mode 100644 include/audio/audio_device.hpp create mode 100644 include/audio/libretro_audio_device.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index be70036c0..5d9c691d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -402,7 +402,8 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/align.hpp include/audio/aac_decoder.hpp include/PICA/pica_simd.hpp include/services/fonts.hpp include/audio/audio_interpolation.hpp include/audio/hle_mixer.hpp include/audio/dsp_simd.hpp include/services/dsp_firmware_db.hpp include/frontend_settings.hpp include/fs/archive_twl_photo.hpp - include/fs/archive_twl_sound.hpp include/fs/archive_card_spi.hpp include/services/ns.hpp + include/fs/archive_twl_sound.hpp include/fs/archive_card_spi.hpp include/services/ns.hpp include/audio/audio_device.hpp + include/audio/libretro_audio_device.hpp ) cmrc_add_resource_library( diff --git a/include/audio/audio_device.hpp b/include/audio/audio_device.hpp new file mode 100644 index 000000000..6dc1ff8f3 --- /dev/null +++ b/include/audio/audio_device.hpp @@ -0,0 +1,31 @@ +#pragma once +#include + +#include "config.hpp" +#include "helpers.hpp" +#include "ring_buffer.hpp" + +class AudioDeviceInterface { + protected: + using Samples = Common::RingBuffer; + Samples* samples = nullptr; + + const AudioDeviceConfig& audioSettings; + + public: + AudioDeviceInterface(Samples* samples, const AudioDeviceConfig& audioSettings) : samples(samples), audioSettings(audioSettings) {} + + // Store the last stereo sample we output. We play this when underruning to avoid pops. + // TODO: Make this protected again before merging!!! + std::array lastStereoSample{}; + + bool running = false; + Samples* getSamples() { return samples; } + + // If safe is on, we create a null audio device + virtual void init(Samples& samples, bool safe = false) = 0; + virtual void close() = 0; + + virtual void start() = 0; + virtual void stop() = 0; +}; \ No newline at end of file diff --git a/include/audio/libretro_audio_device.hpp b/include/audio/libretro_audio_device.hpp new file mode 100644 index 000000000..a6e29b956 --- /dev/null +++ b/include/audio/libretro_audio_device.hpp @@ -0,0 +1,33 @@ +#pragma once +#include +#include +#include + +#include "audio/audio_device.hpp" + +class LibretroAudioDevice : public AudioDeviceInterface { + bool initialized = false; + + public: + LibretroAudioDevice(const AudioDeviceConfig& audioSettings) : AudioDeviceInterface(nullptr, audioSettings), initialized(false) { + running = false; + } + + void init(Samples& samples, bool safe = false) override { + this->samples = &samples; + + initialized = true; + running = false; + } + + void close() override { + initialized = false; + running = false; + }; + + void start() override { running = true; } + void stop() override { running = false; }; + + bool isInitialized() const { return initialized; } + bool isRunning() const { return running; } +}; \ No newline at end of file diff --git a/include/audio/miniaudio_device.hpp b/include/audio/miniaudio_device.hpp index 9aae6eed4..99cdd026c 100644 --- a/include/audio/miniaudio_device.hpp +++ b/include/audio/miniaudio_device.hpp @@ -3,40 +3,31 @@ #include #include -#include "config.hpp" -#include "helpers.hpp" +#include "audio/audio_device.hpp" #include "miniaudio.h" -#include "ring_buffer.hpp" -class MiniAudioDevice { - public: - using Samples = Common::RingBuffer; +class MiniAudioDevice : public AudioDeviceInterface { static constexpr ma_uint32 sampleRate = 32768; // 3DS sample rate static constexpr ma_uint32 channelCount = 2; // Audio output is stereo + bool initialized = false; + ma_device device; ma_context context; ma_device_config deviceConfig; - Samples* samples = nullptr; - - const AudioDeviceConfig& audioSettings; - - bool initialized = false; - bool running = false; // Store the last stereo sample we output. We play this when underruning to avoid pops. - std::array lastStereoSample; std::vector audioDevices; public: MiniAudioDevice(const AudioDeviceConfig& audioSettings); // If safe is on, we create a null audio device - void init(Samples& samples, bool safe = false); - void close(); + void init(Samples& samples, bool safe = false) override; + void close() override; - void start(); - void stop(); + void start() override; + void stop() override; bool isInitialized() const { return initialized; } }; \ No newline at end of file diff --git a/include/emulator.hpp b/include/emulator.hpp index a222a021f..81d7ed846 100644 --- a/include/emulator.hpp +++ b/include/emulator.hpp @@ -8,6 +8,7 @@ #include "PICA/gpu.hpp" #include "audio/dsp_core.hpp" +#include "audio/libretro_audio_device.hpp" #include "audio/miniaudio_device.hpp" #include "cheats.hpp" #include "config.hpp" @@ -48,7 +49,11 @@ class Emulator { Scheduler scheduler; Crypto::AESEngine aesEngine; +#ifndef __LIBRETRO__ MiniAudioDevice audioDevice; +#else + LibretroAudioDevice audioDevice; +#endif Cheats cheats; public: @@ -126,6 +131,7 @@ class Emulator { LuaManager& getLua() { return lua; } Scheduler& getScheduler() { return scheduler; } Memory& getMemory() { return memory; } + AudioDeviceInterface& getAudioDevice() { return audioDevice; } RendererType getRendererType() const { return config.rendererType; } Renderer* getRenderer() { return gpu.getRenderer(); } diff --git a/src/core/audio/miniaudio_device.cpp b/src/core/audio/miniaudio_device.cpp index e2cc6f37b..8e2a1e71b 100644 --- a/src/core/audio/miniaudio_device.cpp +++ b/src/core/audio/miniaudio_device.cpp @@ -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 +} \ No newline at end of file diff --git a/src/libretro_core.cpp b/src/libretro_core.cpp index 45791c2d4..52c9e47c8 100644 --- a/src/libretro_core.cpp +++ b/src/libretro_core.cpp @@ -22,7 +22,6 @@ static bool usingGLES = false; std::unique_ptr 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; From 4b7fedb65c50d744fdfced322208967c04251636 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 9 Feb 2025 04:06:44 +0200 Subject: [PATCH 3/9] Audio device pt 2 --- include/audio/audio_device.hpp | 11 +++++--- include/audio/libretro_audio_device.hpp | 35 ++++++++++++++++++++++--- include/emulator.hpp | 2 +- src/libretro_core.cpp | 35 ++----------------------- 4 files changed, 41 insertions(+), 42 deletions(-) diff --git a/include/audio/audio_device.hpp b/include/audio/audio_device.hpp index 6dc1ff8f3..4534f9e32 100644 --- a/include/audio/audio_device.hpp +++ b/include/audio/audio_device.hpp @@ -8,17 +8,17 @@ class AudioDeviceInterface { protected: using Samples = Common::RingBuffer; + using RenderBatchCallback = usize (*)(const s16*, usize); + Samples* samples = nullptr; const AudioDeviceConfig& audioSettings; + // Store the last stereo sample we output. We play this when underruning to avoid pops. + std::array lastStereoSample{}; public: AudioDeviceInterface(Samples* samples, const AudioDeviceConfig& audioSettings) : samples(samples), audioSettings(audioSettings) {} - // Store the last stereo sample we output. We play this when underruning to avoid pops. - // TODO: Make this protected again before merging!!! - std::array lastStereoSample{}; - bool running = false; Samples* getSamples() { return samples; } @@ -28,4 +28,7 @@ class AudioDeviceInterface { virtual void start() = 0; virtual void stop() = 0; + + // Only used for audio devices that render multiple audio frames in one go, eg the libretro audio device. + virtual void renderBatch(RenderBatchCallback callback) {} }; \ No newline at end of file diff --git a/include/audio/libretro_audio_device.hpp b/include/audio/libretro_audio_device.hpp index a6e29b956..86727cbe1 100644 --- a/include/audio/libretro_audio_device.hpp +++ b/include/audio/libretro_audio_device.hpp @@ -1,7 +1,5 @@ #pragma once -#include -#include -#include +#include #include "audio/audio_device.hpp" @@ -28,6 +26,35 @@ class LibretroAudioDevice : public AudioDeviceInterface { void start() override { running = true; } void stop() override { running = false; }; + void renderBatch(RenderBatchCallback callback) override { + if (running) { + static constexpr int frameCount = 547; + static constexpr int channelCount = 2; + static s16 audioBuffer[frameCount * channelCount]; + + usize samplesWritten = 0; + samplesWritten += samples->pop(audioBuffer, frameCount * channelCount); + + // Get the last sample for underrun handling + if (samplesWritten != 0) { + std::memcpy(&lastStereoSample[0], &audioBuffer[(samplesWritten - 1) * 2], sizeof(lastStereoSample)); + } + + // If underruning, copy the last output sample + { + s16* pointer = &audioBuffer[samplesWritten * 2]; + s16 l = lastStereoSample[0]; + s16 r = lastStereoSample[1]; + + for (usize i = samplesWritten; i < frameCount; i++) { + *pointer++ = l; + *pointer++ = r; + } + } + + callback(audioBuffer, sizeof(audioBuffer) / (2 * sizeof(s16))); + } + } + bool isInitialized() const { return initialized; } - bool isRunning() const { return running; } }; \ No newline at end of file diff --git a/include/emulator.hpp b/include/emulator.hpp index 81d7ed846..76ea289de 100644 --- a/include/emulator.hpp +++ b/include/emulator.hpp @@ -60,7 +60,7 @@ class Emulator { static constexpr u32 width = 400; static constexpr u32 height = 240 * 2; // * 2 because 2 screens ROMType romType = ROMType::None; - bool running = false; // Is the emulator running a game? + bool running = false; // Is the emulator running a game? private: #ifdef PANDA3DS_ENABLE_HTTP_SERVER diff --git a/src/libretro_core.cpp b/src/libretro_core.cpp index 52c9e47c8..a97833209 100644 --- a/src/libretro_core.cpp +++ b/src/libretro_core.cpp @@ -389,39 +389,8 @@ void retro_run() { emulator->runFrame(); videoCallback(RETRO_HW_FRAME_BUFFER_VALID, emulator->width, emulator->height, 0); - auto& audioDevice = emulator->getAudioDevice(); - - if (audioDevice.running) { - static constexpr int frameCount = 547; - static constexpr int channelCount = 2; - static int16_t audioBuffer[frameCount * channelCount]; - - usize samplesWritten = 0; - samplesWritten += audioDevice.getSamples()->pop(audioBuffer, frameCount * channelCount); - - // Get the last sample for underrun handling - if (samplesWritten != 0) { - std::memcpy( - &audioDevice.lastStereoSample[0], - &audioBuffer[(samplesWritten - 1) * 2], - 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]; - - for (usize i = samplesWritten; i < frameCount; i++) { - *pointer++ = l; - *pointer++ = r; - } - } - - audioBatchCallback(audioBuffer, sizeof(audioBuffer) / (2 * sizeof(int16_t))); - } + // Call audio batch callback + emulator->getAudioDevice().renderBatch(audioBatchCallback); } void retro_set_controller_port_device(uint port, uint device) {} From 08b9e49269a9e30d818281a9ad122d28bd569b61 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 9 Feb 2025 04:15:34 +0200 Subject: [PATCH 4/9] More audio device --- CMakeLists.txt | 2 +- include/audio/audio_device.hpp | 41 ++++-------------------- include/audio/audio_device_interface.hpp | 34 ++++++++++++++++++++ include/audio/libretro_audio_device.hpp | 2 +- include/audio/miniaudio_device.hpp | 2 +- include/emulator.hpp | 3 +- 6 files changed, 45 insertions(+), 39 deletions(-) create mode 100644 include/audio/audio_device_interface.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d9c691d3..f37ce28ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -403,7 +403,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/audio/audio_interpolation.hpp include/audio/hle_mixer.hpp include/audio/dsp_simd.hpp include/services/dsp_firmware_db.hpp include/frontend_settings.hpp include/fs/archive_twl_photo.hpp include/fs/archive_twl_sound.hpp include/fs/archive_card_spi.hpp include/services/ns.hpp include/audio/audio_device.hpp - include/audio/libretro_audio_device.hpp + include/audio/audio_device_interface.hpp include/audio/libretro_audio_device.hpp ) cmrc_add_resource_library( diff --git a/include/audio/audio_device.hpp b/include/audio/audio_device.hpp index 4534f9e32..f16068c9e 100644 --- a/include/audio/audio_device.hpp +++ b/include/audio/audio_device.hpp @@ -1,34 +1,7 @@ -#pragma once -#include - -#include "config.hpp" -#include "helpers.hpp" -#include "ring_buffer.hpp" - -class AudioDeviceInterface { - protected: - using Samples = Common::RingBuffer; - using RenderBatchCallback = usize (*)(const s16*, usize); - - Samples* samples = nullptr; - - const AudioDeviceConfig& audioSettings; - // Store the last stereo sample we output. We play this when underruning to avoid pops. - std::array lastStereoSample{}; - - public: - AudioDeviceInterface(Samples* samples, const AudioDeviceConfig& audioSettings) : samples(samples), audioSettings(audioSettings) {} - - bool running = false; - Samples* getSamples() { return samples; } - - // If safe is on, we create a null audio device - virtual void init(Samples& samples, bool safe = false) = 0; - virtual void close() = 0; - - virtual void start() = 0; - virtual void stop() = 0; - - // Only used for audio devices that render multiple audio frames in one go, eg the libretro audio device. - virtual void renderBatch(RenderBatchCallback callback) {} -}; \ No newline at end of file +#ifndef __LIBRETRO__ +#include "audio/miniaudio_device.hpp" +using AudioDevice = MiniAudioDevice; +#else +#include "audio/libretro_audio_device.hpp" +using AudioDevice = LibretroAudioDevice; +#endif \ No newline at end of file diff --git a/include/audio/audio_device_interface.hpp b/include/audio/audio_device_interface.hpp new file mode 100644 index 000000000..4534f9e32 --- /dev/null +++ b/include/audio/audio_device_interface.hpp @@ -0,0 +1,34 @@ +#pragma once +#include + +#include "config.hpp" +#include "helpers.hpp" +#include "ring_buffer.hpp" + +class AudioDeviceInterface { + protected: + using Samples = Common::RingBuffer; + using RenderBatchCallback = usize (*)(const s16*, usize); + + Samples* samples = nullptr; + + const AudioDeviceConfig& audioSettings; + // Store the last stereo sample we output. We play this when underruning to avoid pops. + std::array lastStereoSample{}; + + public: + AudioDeviceInterface(Samples* samples, const AudioDeviceConfig& audioSettings) : samples(samples), audioSettings(audioSettings) {} + + bool running = false; + Samples* getSamples() { return samples; } + + // If safe is on, we create a null audio device + virtual void init(Samples& samples, bool safe = false) = 0; + virtual void close() = 0; + + virtual void start() = 0; + virtual void stop() = 0; + + // Only used for audio devices that render multiple audio frames in one go, eg the libretro audio device. + virtual void renderBatch(RenderBatchCallback callback) {} +}; \ No newline at end of file diff --git a/include/audio/libretro_audio_device.hpp b/include/audio/libretro_audio_device.hpp index 86727cbe1..ee126cdbb 100644 --- a/include/audio/libretro_audio_device.hpp +++ b/include/audio/libretro_audio_device.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include "audio/audio_device.hpp" +#include "audio/audio_device_interface.hpp" class LibretroAudioDevice : public AudioDeviceInterface { bool initialized = false; diff --git a/include/audio/miniaudio_device.hpp b/include/audio/miniaudio_device.hpp index 99cdd026c..deb6e31a0 100644 --- a/include/audio/miniaudio_device.hpp +++ b/include/audio/miniaudio_device.hpp @@ -3,7 +3,7 @@ #include #include -#include "audio/audio_device.hpp" +#include "audio/audio_device_interface.hpp" #include "miniaudio.h" class MiniAudioDevice : public AudioDeviceInterface { diff --git a/include/emulator.hpp b/include/emulator.hpp index 76ea289de..0bb7b9ae7 100644 --- a/include/emulator.hpp +++ b/include/emulator.hpp @@ -7,9 +7,8 @@ #include #include "PICA/gpu.hpp" +#include "audio/audio_device.hpp" #include "audio/dsp_core.hpp" -#include "audio/libretro_audio_device.hpp" -#include "audio/miniaudio_device.hpp" #include "cheats.hpp" #include "config.hpp" #include "cpu.hpp" From 14ec76eb5c08cc0f889861c10ba6e7c4b60a4710 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 9 Feb 2025 04:15:57 +0200 Subject: [PATCH 5/9] More audio device --- include/emulator.hpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/include/emulator.hpp b/include/emulator.hpp index 0bb7b9ae7..326eb2324 100644 --- a/include/emulator.hpp +++ b/include/emulator.hpp @@ -48,11 +48,7 @@ class Emulator { Scheduler scheduler; Crypto::AESEngine aesEngine; -#ifndef __LIBRETRO__ - MiniAudioDevice audioDevice; -#else - LibretroAudioDevice audioDevice; -#endif + AudioDevice audioDevice; Cheats cheats; public: From 0dd27a88dd5353ca45c67a7baeac3bfa217246b4 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 9 Feb 2025 04:22:49 +0200 Subject: [PATCH 6/9] Morea uudi odevice --- include/audio/audio_device.hpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/audio/audio_device.hpp b/include/audio/audio_device.hpp index f16068c9e..5c1f5fc1b 100644 --- a/include/audio/audio_device.hpp +++ b/include/audio/audio_device.hpp @@ -1,7 +1,9 @@ -#ifndef __LIBRETRO__ -#include "audio/miniaudio_device.hpp" -using AudioDevice = MiniAudioDevice; -#else +#pragma once + +#ifdef __LIBRETRO__ #include "audio/libretro_audio_device.hpp" using AudioDevice = LibretroAudioDevice; +#else +#include "audio/miniaudio_device.hpp" +using AudioDevice = MiniAudioDevice; #endif \ No newline at end of file From 2d85e79d12c6ab2e305fca488fc380f1bfebb7bc Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 9 Feb 2025 04:40:12 +0200 Subject: [PATCH 7/9] More audio device --- include/audio/audio_device_interface.hpp | 4 +++- include/audio/libretro_audio_device.hpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/audio/audio_device_interface.hpp b/include/audio/audio_device_interface.hpp index 4534f9e32..de70c77aa 100644 --- a/include/audio/audio_device_interface.hpp +++ b/include/audio/audio_device_interface.hpp @@ -7,7 +7,9 @@ class AudioDeviceInterface { protected: - using Samples = Common::RingBuffer; + static constexpr usize maxFrameCount = 0x2000; + + using Samples = Common::RingBuffer; using RenderBatchCallback = usize (*)(const s16*, usize); Samples* samples = nullptr; diff --git a/include/audio/libretro_audio_device.hpp b/include/audio/libretro_audio_device.hpp index ee126cdbb..536298777 100644 --- a/include/audio/libretro_audio_device.hpp +++ b/include/audio/libretro_audio_device.hpp @@ -28,7 +28,7 @@ class LibretroAudioDevice : public AudioDeviceInterface { void renderBatch(RenderBatchCallback callback) override { if (running) { - static constexpr int frameCount = 547; + static constexpr int frameCount = maxFrameCount; static constexpr int channelCount = 2; static s16 audioBuffer[frameCount * channelCount]; From 8e89f7f24e6240f550b926329b3b946521425683 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 9 Feb 2025 04:44:53 +0200 Subject: [PATCH 8/9] More audio device --- include/audio/libretro_audio_device.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/audio/libretro_audio_device.hpp b/include/audio/libretro_audio_device.hpp index 536298777..299d9169f 100644 --- a/include/audio/libretro_audio_device.hpp +++ b/include/audio/libretro_audio_device.hpp @@ -28,8 +28,8 @@ class LibretroAudioDevice : public AudioDeviceInterface { void renderBatch(RenderBatchCallback callback) override { if (running) { - static constexpr int frameCount = maxFrameCount; - static constexpr int channelCount = 2; + static constexpr usize frameCount = maxFrameCount; + static constexpr usize channelCount = 2; static s16 audioBuffer[frameCount * channelCount]; usize samplesWritten = 0; From 69afa2f87a838e52ba33bd491268b85cd3ccc081 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 9 Feb 2025 04:58:24 +0200 Subject: [PATCH 9/9] More audio device --- include/audio/libretro_audio_device.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/audio/libretro_audio_device.hpp b/include/audio/libretro_audio_device.hpp index 299d9169f..047427cee 100644 --- a/include/audio/libretro_audio_device.hpp +++ b/include/audio/libretro_audio_device.hpp @@ -28,7 +28,7 @@ class LibretroAudioDevice : public AudioDeviceInterface { void renderBatch(RenderBatchCallback callback) override { if (running) { - static constexpr usize frameCount = maxFrameCount; + static constexpr usize frameCount = 774; static constexpr usize channelCount = 2; static s16 audioBuffer[frameCount * channelCount]; @@ -52,7 +52,7 @@ class LibretroAudioDevice : public AudioDeviceInterface { } } - callback(audioBuffer, sizeof(audioBuffer) / (2 * sizeof(s16))); + callback(audioBuffer, sizeof(audioBuffer) / (channelCount * sizeof(s16))); } }