From 7213f7e69b8ce5eb9273256cb844d8f8f0787011 Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Sun, 15 Feb 2026 23:41:30 +0900 Subject: [PATCH] [XMA] Fix consume-only context clear being overwritten in new decoder --- src/xenia/apu/xma_context_new.cc | 27 +++++++++++++-------------- src/xenia/apu/xma_context_new.h | 2 +- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/xenia/apu/xma_context_new.cc b/src/xenia/apu/xma_context_new.cc index c2829abf1..b92a36c9c 100644 --- a/src/xenia/apu/xma_context_new.cc +++ b/src/xenia/apu/xma_context_new.cc @@ -131,7 +131,7 @@ bool XmaContextNew::Work() { if (data.IsConsumeOnlyContext()) { Consume(&output_rb, &data); if (data.output_buffer_read_offset == data.output_buffer_write_offset) { - ClearLocked(); + ClearLocked(&data); } data.Store(context_ptr); return true; @@ -217,26 +217,25 @@ bool XmaContextNew::Block(bool poll) { void XmaContextNew::Clear() { std::lock_guard lock(lock_); - ClearLocked(); -} - -void XmaContextNew::ClearLocked() { - XELOGAPU("XmaContext: reset context {}", id()); auto context_ptr = memory()->TranslateVirtual(guest_ptr()); XMA_CONTEXT_DATA data(context_ptr); + ClearLocked(&data); + data.Store(context_ptr); +} - data.input_buffer_0_valid = 0; - data.input_buffer_1_valid = 0; - data.output_buffer_valid = 0; +void XmaContextNew::ClearLocked(XMA_CONTEXT_DATA* data) { + XELOGAPU("XmaContext: reset context {}", id()); - data.input_buffer_read_offset = 0; - data.output_buffer_read_offset = 0; - data.output_buffer_write_offset = 0; - data.input_buffer_read_offset = kBitsPerPacketHeader; + data->input_buffer_0_valid = 0; + data->input_buffer_1_valid = 0; + data->output_buffer_valid = 0; + + data->input_buffer_read_offset = kBitsPerPacketHeader; + data->output_buffer_read_offset = 0; + data->output_buffer_write_offset = 0; current_frame_remaining_subframes_ = 0; - data.Store(context_ptr); } void XmaContextNew::Disable() { diff --git a/src/xenia/apu/xma_context_new.h b/src/xenia/apu/xma_context_new.h index 50349b3be..111a4e0d4 100644 --- a/src/xenia/apu/xma_context_new.h +++ b/src/xenia/apu/xma_context_new.h @@ -61,7 +61,7 @@ class XmaContextNew : public XmaContext { void Release(); private: - void ClearLocked(); + void ClearLocked(XMA_CONTEXT_DATA* data); static void SwapInputBuffer(XMA_CONTEXT_DATA* data); // Convert sampling rate from ID to frequency. static int GetSampleRate(int id);