mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-15 00:09:18 +00:00
a3ef2cc183
This fixes newer updates / games. Implements partial audio rev15, rev13, rev12 and HID issues on SDK20+ games. Credits to LotP (Ryubing) and Zephyron (Citron) for their research and implementation. Co-authored-by: Zephyron <zephyron@citron-emu.org> Co-authored-by: Shinmegumi <shinmegumi@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2719 Reviewed-by: MaranBr <maranbr@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Co-authored-by: unknown <sahyno1996@gmail.com> Co-committed-by: unknown <sahyno1996@gmail.com>
56 lines
1.5 KiB
C++
56 lines
1.5 KiB
C++
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <array>
|
|
|
|
#include "common/common_types.h"
|
|
|
|
namespace Service::HID {
|
|
|
|
template <typename State>
|
|
struct AtomicStorage {
|
|
s64 sampling_number;
|
|
State state;
|
|
};
|
|
|
|
template <typename State, std::size_t max_buffer_size>
|
|
struct Lifo {
|
|
s64 timestamp{};
|
|
s64 total_buffer_count = static_cast<s64>(max_buffer_size);
|
|
s64 buffer_tail{};
|
|
s64 buffer_count{};
|
|
std::array<AtomicStorage<State>, max_buffer_size> entries{};
|
|
|
|
const AtomicStorage<State>& ReadCurrentEntry() const {
|
|
return entries[buffer_tail];
|
|
}
|
|
|
|
const AtomicStorage<State>& ReadPreviousEntry() const {
|
|
return entries[GetPreviousEntryIndex()];
|
|
}
|
|
|
|
std::size_t GetPreviousEntryIndex() const {
|
|
return static_cast<size_t>((buffer_tail + max_buffer_size - 1) % max_buffer_size);
|
|
}
|
|
|
|
std::size_t GetNextEntryIndex() const {
|
|
return static_cast<size_t>((buffer_tail + 1) % max_buffer_size);
|
|
}
|
|
|
|
void WriteNextEntry(const State& new_state) {
|
|
if (buffer_count < static_cast<s64>(max_buffer_size) - 1) {
|
|
buffer_count++;
|
|
}
|
|
buffer_tail = GetNextEntryIndex();
|
|
entries[buffer_tail].sampling_number = new_state.sampling_number << 1;
|
|
entries[buffer_tail].state = new_state;
|
|
}
|
|
};
|
|
|
|
} // namespace Service::HID
|