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] 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 5d9c691d..f37ce28a 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 4534f9e3..f16068c9 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 00000000..4534f9e3 --- /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 86727cbe..ee126cdb 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 99cdd026..deb6e31a 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 76ea289d..0bb7b9ae 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"