From 2de52e3af65e71df8a1ef00c9bcfcaa9f67330c3 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Sun, 7 Oct 2018 14:14:09 +1100 Subject: Fixed smo softlock --- src/audio_core/audio_renderer.h | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/audio_core/audio_renderer.h') diff --git a/src/audio_core/audio_renderer.h b/src/audio_core/audio_renderer.h index dfef89e1d..a2caeb118 100644 --- a/src/audio_core/audio_renderer.h +++ b/src/audio_core/audio_renderer.h @@ -28,6 +28,16 @@ enum class PlayState : u8 { Paused = 2, }; +enum class Effect : u8 { + None = 0, + Aux = 2, +}; + +enum class EffectStatus : u8 { + None = 0, + New = 1, +}; + struct AudioRendererParameter { u32_le sample_rate; u32_le sample_count; @@ -128,6 +138,43 @@ struct VoiceOutStatus { }; static_assert(sizeof(VoiceOutStatus) == 0x10, "VoiceOutStatus has wrong size"); +struct AuxInfo { + std::array input_mix_buffers; + std::array output_mix_buffers; + u32_le mix_buffer_count; + u32_le sample_rate; // Stored in the aux buffer currently + u32_le sampe_count; + u64_le send_buffer_info; + u64_le send_buffer_base; + + u64_le return_buffer_info; + u64_le return_buffer_base; +}; +static_assert(sizeof(AuxInfo) == 0x60, "AuxInfo is an invalid size"); + +struct EffectInStatus { + Effect type; + u8 is_new; + u8 is_enabled; + INSERT_PADDING_BYTES(1); + u32_le mix_id; + u64_le buffer_base; + u64_le buffer_sz; + s32_le priority; + INSERT_PADDING_BYTES(4); + union { + std::array raw; + AuxInfo aux_info; + }; +}; +static_assert(sizeof(EffectInStatus) == 0xc0, "EffectInStatus is an invalid size"); + +struct EffectOutStatus { + EffectStatus state; + INSERT_PADDING_BYTES(15); +}; +static_assert(sizeof(EffectOutStatus) == 0x10, "EffectOutStatus is an invalid size"); + struct UpdateDataHeader { UpdateDataHeader() {} @@ -174,10 +221,12 @@ public: private: class VoiceState; + class EffectState; AudioRendererParameter worker_params; Kernel::SharedPtr buffer_event; std::vector voices; + std::vector effects; std::unique_ptr audio_out; AudioCore::StreamPtr stream; }; -- cgit v1.2.3 From ceef334c1cc2c55def468a1f83474ba8d4a3884d Mon Sep 17 00:00:00 2001 From: David Marcec Date: Sun, 7 Oct 2018 14:25:39 +1100 Subject: Fixups for softlock --- src/audio_core/audio_renderer.cpp | 11 ++++++----- src/audio_core/audio_renderer.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'src/audio_core/audio_renderer.h') diff --git a/src/audio_core/audio_renderer.cpp b/src/audio_core/audio_renderer.cpp index 5d2feb1b9..23e5d3f10 100644 --- a/src/audio_core/audio_renderer.cpp +++ b/src/audio_core/audio_renderer.cpp @@ -30,7 +30,7 @@ public: return info; } - VoiceInfo& Info() { + VoiceInfo& GetInfo() { return info; } @@ -61,7 +61,7 @@ public: return info; } - EffectInStatus& Info() { + EffectInStatus& GetInfo() { return info; } @@ -120,7 +120,7 @@ std::vector AudioRenderer::UpdateAudioRenderer(const std::vector& input_ std::size_t voice_offset{sizeof(UpdateDataHeader) + config.behavior_size + config.memory_pools_size + config.voice_resource_size}; for (auto& voice : voices) { - std::memcpy(&voice.Info(), input_params.data() + voice_offset, sizeof(VoiceInfo)); + std::memcpy(&voice.GetInfo(), input_params.data() + voice_offset, sizeof(VoiceInfo)); voice_offset += sizeof(VoiceInfo); } @@ -128,7 +128,7 @@ std::vector AudioRenderer::UpdateAudioRenderer(const std::vector& input_ config.memory_pools_size + config.voice_resource_size + config.voices_size}; for (auto& effect : effects) { - std::memcpy(&effect.Info(), input_params.data() + effect_offset, sizeof(EffectInStatus)); + std::memcpy(&effect.GetInfo(), input_params.data() + effect_offset, sizeof(EffectInStatus)); effect_offset += sizeof(EffectInStatus); } @@ -285,7 +285,8 @@ void AudioRenderer::VoiceState::RefreshBuffer() { break; } - samples = Interpolate(interp_state, std::move(samples), Info().sample_rate, STREAM_SAMPLE_RATE); + samples = + Interpolate(interp_state, std::move(samples), GetInfo().sample_rate, STREAM_SAMPLE_RATE); is_refresh_pending = false; } diff --git a/src/audio_core/audio_renderer.h b/src/audio_core/audio_renderer.h index a2caeb118..4662c8722 100644 --- a/src/audio_core/audio_renderer.h +++ b/src/audio_core/audio_renderer.h @@ -220,8 +220,8 @@ public: Stream::State GetStreamState() const; private: - class VoiceState; class EffectState; + class VoiceState; AudioRendererParameter worker_params; Kernel::SharedPtr buffer_event; -- cgit v1.2.3 From a47c1c77e6dad8ebd4dfc49d76ef39b605a1ef69 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Tue, 9 Oct 2018 11:20:54 +1100 Subject: EffectOutStatus padding is now in hex --- src/audio_core/audio_renderer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/audio_core/audio_renderer.h') diff --git a/src/audio_core/audio_renderer.h b/src/audio_core/audio_renderer.h index 4662c8722..046417da3 100644 --- a/src/audio_core/audio_renderer.h +++ b/src/audio_core/audio_renderer.h @@ -171,7 +171,7 @@ static_assert(sizeof(EffectInStatus) == 0xc0, "EffectInStatus is an invalid size struct EffectOutStatus { EffectStatus state; - INSERT_PADDING_BYTES(15); + INSERT_PADDING_BYTES(0xf); }; static_assert(sizeof(EffectOutStatus) == 0x10, "EffectOutStatus is an invalid size"); -- cgit v1.2.3