[APU] Switched to New XMA decoder as default
- Added codepath for "consume only" pass. This should resolve constant clicking in Source engine games. - Added smaller performance improvements to decoder
This commit is contained in:
@@ -146,6 +146,12 @@ struct XMA_CONTEXT_DATA {
|
||||
const uint32_t GetCurrentInputBufferPacketCount() const {
|
||||
return GetInputBufferPacketCount(current_buffer);
|
||||
}
|
||||
const bool IsStreamingContext() const {
|
||||
return (input_buffer_0_packet_count | input_buffer_1_packet_count) == 1;
|
||||
}
|
||||
const bool IsConsumeOnlyContext() const {
|
||||
return (input_buffer_0_packet_count | input_buffer_1_packet_count) == 0;
|
||||
}
|
||||
};
|
||||
static_assert_size(XMA_CONTEXT_DATA, 64);
|
||||
|
||||
|
||||
@@ -128,6 +128,15 @@ bool XmaContextNew::Work() {
|
||||
|
||||
RingBuffer output_rb = PrepareOutputRingBuffer(&data);
|
||||
|
||||
if (data.IsConsumeOnlyContext()) {
|
||||
Consume(&output_rb, &data);
|
||||
if (data.output_buffer_read_offset == data.output_buffer_write_offset) {
|
||||
Clear();
|
||||
}
|
||||
data.Store(context_ptr);
|
||||
return true;
|
||||
}
|
||||
|
||||
const int32_t minimum_subframe_decode_count =
|
||||
(data.subframe_decode_count * 2) - 1;
|
||||
|
||||
@@ -257,7 +266,8 @@ void XmaContextNew::SwapInputBuffer(XMA_CONTEXT_DATA* data) {
|
||||
data->input_buffer_read_offset = kBitsPerPacketHeader;
|
||||
}
|
||||
|
||||
void XmaContextNew::Consume(RingBuffer* output_rb, XMA_CONTEXT_DATA* data) {
|
||||
void XmaContextNew::Consume(RingBuffer* XE_RESTRICT output_rb,
|
||||
const XMA_CONTEXT_DATA* const XE_RESTRICT data) {
|
||||
if (!current_frame_remaining_subframes_) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -106,7 +106,8 @@ class XmaContextNew : public XmaContext {
|
||||
static uint32_t GetCurrentInputBufferSize(XMA_CONTEXT_DATA* data);
|
||||
|
||||
void Decode(XMA_CONTEXT_DATA* data);
|
||||
void Consume(RingBuffer* output_rb, XMA_CONTEXT_DATA* data);
|
||||
void Consume(RingBuffer* XE_RESTRICT output_rb,
|
||||
const XMA_CONTEXT_DATA* const XE_RESTRICT data);
|
||||
|
||||
void UpdateLoopStatus(XMA_CONTEXT_DATA* data);
|
||||
int PrepareDecoder(int sample_rate, bool is_two_channel);
|
||||
|
||||
@@ -54,7 +54,7 @@ extern "C" {
|
||||
DEFINE_bool(ffmpeg_verbose, false, "Verbose FFmpeg output (debug and above)",
|
||||
"APU");
|
||||
|
||||
DEFINE_bool(use_new_decoder, false,
|
||||
DEFINE_bool(use_new_decoder, true,
|
||||
"Enables usage of new experimental XMA audio decoder.", "APU");
|
||||
|
||||
DEFINE_bool(use_dedicated_xma_thread, true,
|
||||
@@ -62,6 +62,8 @@ DEFINE_bool(use_dedicated_xma_thread, true,
|
||||
"better results, but decrease performance a bit.",
|
||||
"APU");
|
||||
|
||||
UPDATE_from_bool(use_new_decoder, 2025, 12, 01, 23, false);
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
|
||||
|
||||
@@ -511,7 +511,7 @@ class IConfigVarUpdate {
|
||||
// If you're reviewing a pull request with a change here, check if 1) has been
|
||||
// done by the submitter before merging.
|
||||
static constexpr uint32_t kLastCommittedUpdateDate =
|
||||
MakeConfigVarUpdateDate(2024, 9, 23, 9);
|
||||
MakeConfigVarUpdateDate(2025, 12, 1, 23);
|
||||
|
||||
virtual ~IConfigVarUpdate() = default;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user