diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt index 96b7a8cce2..573549d84b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments @@ -19,6 +19,7 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.transition.MaterialSharedAxis +import kotlinx.coroutines.launch import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.adapters.AddonAdapter import org.yuzu.yuzu_emu.databinding.FragmentAddonsBinding @@ -41,7 +42,7 @@ class AddonsFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - addonViewModel.onAddonsViewCreated(args.game) + addonViewModel.onOpenAddons(args.game) enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) @@ -121,14 +122,12 @@ class AddonsFragment : Fragment() { override fun onResume() { super.onResume() - addonViewModel.onAddonsViewStarted(args.game) + addonViewModel.refreshAddons() } override fun onDestroy() { - if (activity?.isChangingConfigurations != true) { - addonViewModel.onCloseAddons() - } super.onDestroy() + addonViewModel.onCloseAddons() } val installAddon = @@ -168,7 +167,7 @@ class AddonsFragment : Fragment() { } catch (_: Exception) { return@newInstance errorMessage } - addonViewModel.refreshAddons(force = true) + addonViewModel.refreshAddons() return@newInstance getString(R.string.addon_installed_successfully) }.show(parentFragmentManager, ProgressDialogFragment.TAG) } else { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt index 2331630c4e..2a0e72be26 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt @@ -18,7 +18,7 @@ import org.yuzu.yuzu_emu.utils.NativeConfig import java.util.concurrent.atomic.AtomicBoolean class AddonViewModel : ViewModel() { - private val _patchList = MutableStateFlow>(emptyList()) + private val _patchList = MutableStateFlow(mutableListOf()) val addonList get() = _patchList.asStateFlow() private val _showModInstallPicker = MutableStateFlow(false) @@ -31,62 +31,34 @@ class AddonViewModel : ViewModel() { val addonToDelete = _addonToDelete.asStateFlow() var game: Game? = null - private var loadedGameKey: String? = null private val isRefreshing = AtomicBoolean(false) - private val pendingRefresh = AtomicBoolean(false) - fun onAddonsViewCreated(game: Game) { + fun onOpenAddons(game: Game) { this.game = game - refreshAddons(commitEmpty = false) + refreshAddons() } - fun onAddonsViewStarted(game: Game) { - this.game = game - val hasLoadedCurrentGame = loadedGameKey == gameKey(game) - refreshAddons(force = !hasLoadedCurrentGame) - } - - fun refreshAddons(force: Boolean = false, commitEmpty: Boolean = true) { - val currentGame = game ?: return - val currentGameKey = gameKey(currentGame) - if (!force && loadedGameKey == currentGameKey) { + fun refreshAddons() { + if (isRefreshing.get() || game == null) { return } - if (!isRefreshing.compareAndSet(false, true)) { - if (force) { - pendingRefresh.set(true) - } - return - } - + isRefreshing.set(true) viewModelScope.launch { - try { - val patches = withContext(Dispatchers.IO) { - NativeLibrary.getPatchesForFile(currentGame.path, currentGame.programId) - } ?: return@launch - - val patchList = patches.toMutableList() + withContext(Dispatchers.IO) { + val patchList = ( + NativeLibrary.getPatchesForFile(game!!.path, game!!.programId) + ?: emptyArray() + ).toMutableList() patchList.sortBy { it.name } // Ensure only one update is enabled ensureSingleUpdateEnabled(patchList) removeDuplicates(patchList) - if (patchList.isEmpty() && !commitEmpty) { - return@launch - } - if (gameKey(game ?: return@launch) != currentGameKey) { - return@launch - } - _patchList.value = patchList.toList() - loadedGameKey = currentGameKey - } finally { + _patchList.value = patchList isRefreshing.set(false) - if (pendingRefresh.compareAndSet(true, false)) { - refreshAddons(force = true) - } } } } @@ -147,26 +119,17 @@ class AddonViewModel : ViewModel() { PatchType.DLC -> NativeLibrary.removeDLC(patch.programId) PatchType.Mod -> NativeLibrary.removeMod(patch.programId, patch.name) } - refreshAddons(force = true) + refreshAddons() } fun onCloseAddons() { - val currentGame = game ?: run { - _patchList.value = emptyList() - loadedGameKey = null - return - } - val currentList = _patchList.value - if (currentList.isEmpty()) { - _patchList.value = emptyList() - loadedGameKey = null - game = null + if (_patchList.value.isEmpty()) { return } NativeConfig.setDisabledAddons( - currentGame.programId, - currentList.mapNotNull { + game!!.programId, + _patchList.value.mapNotNull { if (it.enabled) { null } else { @@ -185,8 +148,7 @@ class AddonViewModel : ViewModel() { }.toTypedArray() ) NativeConfig.saveGlobalConfig() - _patchList.value = emptyList() - loadedGameKey = null + _patchList.value.clear() game = null } @@ -197,8 +159,4 @@ class AddonViewModel : ViewModel() { fun showModNoticeDialog(show: Boolean) { _showModNoticeDialog.value = show } - - private fun gameKey(game: Game): String { - return "${game.programId}|${game.path}" - } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index 74a171cf1f..db4cc0f60e 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -642,7 +642,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { } } - addonViewModel.refreshAddons(force = true) + addonViewModel.refreshAddons() val separator = System.lineSeparator() ?: "\n" val installResult = StringBuilder() diff --git a/src/common/settings.h b/src/common/settings.h index ac04d26fc5..7c6c0d062f 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -706,7 +706,6 @@ struct Values { Setting pause_tas_on_load{linkage, true, "pause_tas_on_load", Category::Controls}; Setting tas_enable{linkage, false, "tas_enable", Category::Controls}; Setting tas_loop{linkage, false, "tas_loop", Category::Controls}; - Setting tas_show_recording_dialog{linkage, true, "tas_show_recording_dialog", Category::Controls}; Setting mouse_panning{ linkage, false, "mouse_panning", Category::Controls, Specialization::Default, false}; diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index 0fb4e9701d..46384f7e6d 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h @@ -4,7 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "dynarmic/interface/halt_reason.h" +#include #include "core/arm/arm_interface.h" diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index 011751c53d..d93cc1cfc9 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h @@ -6,8 +6,8 @@ #pragma once -#include "dynarmic/interface/A32/a32.h" -#include "dynarmic/interface/code_page.h" +#include +#include #include "core/arm/arm_interface.h" #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index b95462be15..9eff17c5fe 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h @@ -10,8 +10,8 @@ #include #include -#include "dynarmic/interface/A64/a64.h" -#include "dynarmic/interface/code_page.h" +#include +#include #include "common/common_types.h" #include "common/hash.h" #include "core/arm/arm_interface.h" diff --git a/src/core/arm/dynarmic/dynarmic_cp15.h b/src/core/arm/dynarmic/dynarmic_cp15.h index e4de20d578..f3d96b0d83 100644 --- a/src/core/arm/dynarmic/dynarmic_cp15.h +++ b/src/core/arm/dynarmic/dynarmic_cp15.h @@ -5,7 +5,7 @@ #include -#include "dynarmic/interface/A32/coprocessor.h" +#include #include "common/common_types.h" namespace Core { diff --git a/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h index 2362dad90e..c4f22ec891 100644 --- a/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h +++ b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h @@ -3,7 +3,7 @@ #pragma once -#include "dynarmic/interface/exclusive_monitor.h" +#include #include "common/common_types.h" #include "core/arm/exclusive_monitor.h" diff --git a/src/core/arm/nce/visitor_base.h b/src/core/arm/nce/visitor_base.h index 1feae327c0..6a2be3d9bc 100644 --- a/src/core/arm/nce/visitor_base.h +++ b/src/core/arm/nce/visitor_base.h @@ -7,9 +7,9 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wshadow" -#include "dynarmic/frontend/A64/a64_types.h" -#include "dynarmic/frontend/A64/decoder/a64.h" -#include "dynarmic/frontend/imm.h" +#include +#include +#include #pragma GCC diagnostic pop diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp index 7637ed5bf5..331176bf7f 100644 --- a/src/core/hle/service/audio/audio.cpp +++ b/src/core/hle/service/audio/audio.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -21,14 +18,17 @@ namespace Service::Audio { void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); + server_manager->RegisterNamedService("audctl", std::make_shared(system)); server_manager->RegisterNamedService("audin:u", std::make_shared(system)); server_manager->RegisterNamedService("audout:u", std::make_shared(system)); - // Depends on audout:u and audin:u on ctor! - server_manager->RegisterNamedService("audctl", std::make_shared(system)); - server_manager->RegisterNamedService("audrec:a", std::make_shared(system)); - server_manager->RegisterNamedService("audrec:u", std::make_shared(system)); - server_manager->RegisterNamedService("audren:u", std::make_shared(system)); - server_manager->RegisterNamedService("hwopus", std::make_shared(system)); + server_manager->RegisterNamedService( + "audrec:a", std::make_shared(system)); + server_manager->RegisterNamedService("audrec:u", + std::make_shared(system)); + server_manager->RegisterNamedService("audren:u", + std::make_shared(system)); + server_manager->RegisterNamedService("hwopus", + std::make_shared(system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/jit/jit_context.cpp b/src/core/hle/service/jit/jit_context.cpp index ad62e9c71f..a927318a7c 100644 --- a/src/core/hle/service/jit/jit_context.cpp +++ b/src/core/hle/service/jit/jit_context.cpp @@ -8,9 +8,9 @@ #include #include #include -#include "dynarmic/interface/A64/a64.h" -#include "dynarmic/interface/A64/config.h" -#include "dynarmic/interface/code_page.h" +#include +#include +#include #include "common/alignment.h" #include "common/common_funcs.h" diff --git a/src/dynarmic/src/dynarmic/interface/exclusive_monitor.h b/src/dynarmic/src/dynarmic/interface/exclusive_monitor.h index 0d35716c4c..566743c767 100644 --- a/src/dynarmic/src/dynarmic/interface/exclusive_monitor.h +++ b/src/dynarmic/src/dynarmic/interface/exclusive_monitor.h @@ -11,7 +11,7 @@ #include #include -#include "dynarmic/common/spin_lock.h" +#include namespace Dynarmic { diff --git a/src/yuzu/configuration/configure_tas.cpp b/src/yuzu/configuration/configure_tas.cpp index 75d5a5eeaf..8bdb987426 100644 --- a/src/yuzu/configuration/configure_tas.cpp +++ b/src/yuzu/configuration/configure_tas.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -35,7 +35,6 @@ void ConfigureTasDialog::LoadConfiguration() { ui->tas_enable->setChecked(Settings::values.tas_enable.GetValue()); ui->tas_loop_script->setChecked(Settings::values.tas_loop.GetValue()); ui->tas_pause_on_load->setChecked(Settings::values.pause_tas_on_load.GetValue()); - ui->tas_show_recording_dialog->setChecked(Settings::values.tas_show_recording_dialog.GetValue()); } void ConfigureTasDialog::ApplyConfiguration() { @@ -43,7 +42,6 @@ void ConfigureTasDialog::ApplyConfiguration() { Settings::values.tas_enable.SetValue(ui->tas_enable->isChecked()); Settings::values.tas_loop.SetValue(ui->tas_loop_script->isChecked()); Settings::values.pause_tas_on_load.SetValue(ui->tas_pause_on_load->isChecked()); - Settings::values.tas_show_recording_dialog.SetValue(ui->tas_show_recording_dialog->isChecked()); } void ConfigureTasDialog::SetDirectory(DirectoryTarget target, QLineEdit* edit) { diff --git a/src/yuzu/configuration/configure_tas.ui b/src/yuzu/configuration/configure_tas.ui index 5b4bba53b6..da8f2a86c5 100644 --- a/src/yuzu/configuration/configure_tas.ui +++ b/src/yuzu/configuration/configure_tas.ui @@ -78,13 +78,6 @@ - - - - Show recording dialog - - - diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 688078385a..e02e02b413 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -3665,17 +3665,13 @@ void MainWindow::OnTasRecord() { const bool is_recording = input_subsystem->GetTas()->Record(); if (!is_recording) { - if (Settings::values.tas_show_recording_dialog.GetValue()) { - is_tas_recording_dialog_active = true; + is_tas_recording_dialog_active = true; - bool answer = question(this, tr("TAS Recording"), tr("Overwrite file of player 1?"), - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + bool answer = question(this, tr("TAS Recording"), tr("Overwrite file of player 1?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); - input_subsystem->GetTas()->SaveRecording(answer); - is_tas_recording_dialog_active = false; - } else { - input_subsystem->GetTas()->SaveRecording(true); - } + input_subsystem->GetTas()->SaveRecording(answer); + is_tas_recording_dialog_active = false; } OnTasStateChanged(); }