diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 4d0623c1c..45b7b16ba 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -20,6 +20,8 @@ add_library(common iso_reader.h jit_code_buffer.cpp jit_code_buffer.h + null_audio_stream.cpp + null_audio_stream.h rectangle.h state_wrapper.cpp state_wrapper.h diff --git a/src/common/audio_stream.cpp b/src/common/audio_stream.cpp index 42d4619f3..7599967d1 100644 --- a/src/common/audio_stream.cpp +++ b/src/common/audio_stream.cpp @@ -97,6 +97,7 @@ void AudioStream::WriteSamples(const SampleType* samples, u32 num_samples) m_num_free_buffers--; m_first_free_buffer = (m_first_free_buffer + 1) % m_buffers.size(); m_num_available_buffers++; + BufferAvailable(); } } } @@ -116,6 +117,7 @@ void AudioStream::EndWrite(u32 num_samples) m_num_free_buffers--; m_first_free_buffer = (m_first_free_buffer + 1) % m_buffers.size(); m_num_available_buffers++; + BufferAvailable(); } m_buffer_mutex.unlock(); diff --git a/src/common/audio_stream.h b/src/common/audio_stream.h index 7efe496f6..7900863b8 100644 --- a/src/common/audio_stream.h +++ b/src/common/audio_stream.h @@ -45,11 +45,14 @@ protected: virtual bool OpenDevice() = 0; virtual void PauseDevice(bool paused) = 0; virtual void CloseDevice() = 0; + virtual void BufferAvailable() = 0; bool IsDeviceOpen() const { return (m_output_sample_rate > 0); } u32 ReadSamples(SampleType* samples, u32 num_samples); + void DropBuffer(); + u32 m_output_sample_rate = 0; u32 m_channels = 0; u32 m_buffer_size = 0; @@ -64,7 +67,6 @@ private: void AllocateBuffers(u32 buffer_count); void EnsureBuffer(); - void DropBuffer(); std::vector m_buffers; std::mutex m_buffer_mutex; diff --git a/src/common/common.vcxproj b/src/common/common.vcxproj index e2e998a02..f5fc643de 100644 --- a/src/common/common.vcxproj +++ b/src/common/common.vcxproj @@ -49,6 +49,7 @@ + @@ -70,6 +71,7 @@ + diff --git a/src/common/common.vcxproj.filters b/src/common/common.vcxproj.filters index f8321b034..67e8a518e 100644 --- a/src/common/common.vcxproj.filters +++ b/src/common/common.vcxproj.filters @@ -34,6 +34,7 @@ + @@ -66,6 +67,7 @@ + diff --git a/src/common/null_audio_stream.cpp b/src/common/null_audio_stream.cpp new file mode 100644 index 000000000..a9d3ec26d --- /dev/null +++ b/src/common/null_audio_stream.cpp @@ -0,0 +1,20 @@ +#include "null_audio_stream.h" + +NullAudioStream::NullAudioStream() = default; + +NullAudioStream::~NullAudioStream() = default; + +bool NullAudioStream::OpenDevice() +{ + return true; +} + +void NullAudioStream::PauseDevice(bool paused) {} + +void NullAudioStream::CloseDevice() {} + +void NullAudioStream::BufferAvailable() +{ + // drop any buffer as soon as they're available + DropBuffer(); +} diff --git a/src/common/null_audio_stream.h b/src/common/null_audio_stream.h new file mode 100644 index 000000000..a1e0a6edf --- /dev/null +++ b/src/common/null_audio_stream.h @@ -0,0 +1,17 @@ +#pragma once +#include "audio_stream.h" + +class NullAudioStream final : public AudioStream +{ +public: + NullAudioStream(); + ~NullAudioStream(); + + static std::unique_ptr Create(); + +protected: + bool OpenDevice() override; + void PauseDevice(bool paused) override; + void CloseDevice() override; + void BufferAvailable() override; +}; diff --git a/src/duckstation/sdl_audio_stream.cpp b/src/duckstation/sdl_audio_stream.cpp index 87c006189..9f3c3724a 100644 --- a/src/duckstation/sdl_audio_stream.cpp +++ b/src/duckstation/sdl_audio_stream.cpp @@ -59,3 +59,5 @@ void SDLAudioStream::AudioCallback(void* userdata, uint8_t* stream, int len) silence_samples * this_ptr->m_channels * sizeof(SampleType)); } } + +void SDLAudioStream::BufferAvailable() {} diff --git a/src/duckstation/sdl_audio_stream.h b/src/duckstation/sdl_audio_stream.h index a3daf689c..c2a600e94 100644 --- a/src/duckstation/sdl_audio_stream.h +++ b/src/duckstation/sdl_audio_stream.h @@ -12,6 +12,7 @@ protected: bool OpenDevice() override; void PauseDevice(bool paused) override; void CloseDevice() override; + void BufferAvailable() override; static void AudioCallback(void* userdata, uint8_t* stream, int len);