diff options
Diffstat (limited to 'src/audio_core')
| -rw-r--r-- | src/audio_core/audio_renderer.cpp | 12 | ||||
| -rw-r--r-- | src/audio_core/audio_renderer.h | 5 | ||||
| -rw-r--r-- | src/audio_core/cubeb_sink.cpp | 6 |
3 files changed, 22 insertions, 1 deletions
diff --git a/src/audio_core/audio_renderer.cpp b/src/audio_core/audio_renderer.cpp index 282f345c5..6ebed3fb0 100644 --- a/src/audio_core/audio_renderer.cpp +++ b/src/audio_core/audio_renderer.cpp @@ -26,6 +26,18 @@ AudioRenderer::AudioRenderer(AudioRendererParameter params, QueueMixedBuffer(2); } +u32 AudioRenderer::GetSampleRate() const { + return worker_params.sample_rate; +} + +u32 AudioRenderer::GetSampleCount() const { + return worker_params.sample_count; +} + +u32 AudioRenderer::GetMixBufferCount() const { + return worker_params.mix_buffer_count; +} + std::vector<u8> AudioRenderer::UpdateAudioRenderer(const std::vector<u8>& input_params) { // Copy UpdateDataHeader struct UpdateDataHeader config{}; diff --git a/src/audio_core/audio_renderer.h b/src/audio_core/audio_renderer.h index 6950a4681..13c5d0adc 100644 --- a/src/audio_core/audio_renderer.h +++ b/src/audio_core/audio_renderer.h @@ -26,7 +26,7 @@ enum class PlayState : u8 { struct AudioRendererParameter { u32_le sample_rate; u32_le sample_count; - u32_le unknown_8; + u32_le mix_buffer_count; u32_le unknown_c; u32_le voice_count; u32_le sink_count; @@ -160,6 +160,9 @@ public: std::vector<u8> UpdateAudioRenderer(const std::vector<u8>& input_params); void QueueMixedBuffer(Buffer::Tag tag); void ReleaseAndQueueBuffers(); + u32 GetSampleRate() const; + u32 GetSampleCount() const; + u32 GetMixBufferCount() const; private: class VoiceState { diff --git a/src/audio_core/cubeb_sink.cpp b/src/audio_core/cubeb_sink.cpp index 1501ef1f4..5a1177d0c 100644 --- a/src/audio_core/cubeb_sink.cpp +++ b/src/audio_core/cubeb_sink.cpp @@ -4,6 +4,7 @@ #include <algorithm> #include <cstring> +#include <mutex> #include "audio_core/cubeb_sink.h" #include "audio_core/stream.h" @@ -66,6 +67,8 @@ public: return; } + std::lock_guard lock{queue_mutex}; + queue.reserve(queue.size() + samples.size() * GetNumChannels()); if (is_6_channel) { @@ -94,6 +97,7 @@ private: u32 num_channels{}; bool is_6_channel{}; + std::mutex queue_mutex; std::vector<s16> queue; static long DataCallback(cubeb_stream* stream, void* user_data, const void* input_buffer, @@ -153,6 +157,8 @@ long SinkStreamImpl::DataCallback(cubeb_stream* stream, void* user_data, const v return {}; } + std::lock_guard lock{impl->queue_mutex}; + const size_t frames_to_write{ std::min(impl->queue.size() / impl->GetNumChannels(), static_cast<size_t>(num_frames))}; |
