[XMA] Added multiple versions of XMA decoders

- Fake: No decoding
- Master: 1:1 from base version of Xenia
- Old: Master with improvements
- New: Completely new decoder with better stability (but not compability)

Co-authored-by: Herman S. <429230+has207@users.noreply.github.com>
This commit is contained in:
Gliniak
2025-12-02 22:33:02 +01:00
committed by Radosław Gliński
parent e588a772d4
commit 4494e40c71
9 changed files with 1498 additions and 81 deletions

View File

@@ -10,6 +10,8 @@
#include "xenia/apu/xma_decoder.h"
#include "xenia/apu/xma_context.h"
#include "xenia/apu/xma_context_fake.h"
#include "xenia/apu/xma_context_master.h"
#include "xenia/apu/xma_context_new.h"
#include "xenia/apu/xma_context_old.h"
@@ -54,15 +56,22 @@ extern "C" {
DEFINE_bool(ffmpeg_verbose, false, "Verbose FFmpeg output (debug and above)",
"APU");
DEFINE_bool(use_new_decoder, true,
"Enables usage of new experimental XMA audio decoder.", "APU");
DEFINE_bool(use_dedicated_xma_thread, true,
"Enables XMA decoding on separate thread. Disabled should produce "
"better results, but decrease performance a bit.",
"APU");
UPDATE_from_bool(use_new_decoder, 2025, 12, 01, 23, false);
DEFINE_string(
xma_decoder, "new",
"Decoder version used to process XMA audio.\n"
"Use: [fake, master, old, new]\n"
" fake: \n No audio will be decoded.\n"
" master: \n Version of decoder exactly like on base version of Xenia.\n"
" old: \n Decoder based on master version of decoder with few "
"improvements.\n"
" new: \n New version of decoder. Provides highest stability, but isn't "
"yet finished.\n",
"APU");
namespace xe {
namespace apu {
@@ -141,10 +150,16 @@ X_STATUS XmaDecoder::Setup(kernel::KernelState* kernel_state) {
// Setup XMA contexts.
for (int i = 0; i < kContextCount; ++i) {
if (cvars::use_new_decoder) {
if (cvars::xma_decoder == "fake") {
contexts_[i] = new XmaContextFake();
} else if (cvars::xma_decoder == "master") {
contexts_[i] = new XmaContextMaster();
} else if (cvars::xma_decoder == "old") {
contexts_[i] = new XmaContextOld();
} else if (cvars::xma_decoder == "new") {
contexts_[i] = new XmaContextNew();
} else {
contexts_[i] = new XmaContextOld();
contexts_[i] = new XmaContextNew();
}
uint32_t guest_ptr = context_data_first_ptr_ + i * sizeof(XMA_CONTEXT_DATA);