Merge branch 'master' into new-shortcut
commit
728aca7703
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1 +1 @@
|
|||||||
Subproject commit 031912c4b6c5db80b443f04aa56fec3e4e645153
|
Subproject commit cc016b0046d563287f0aa9f09b958b5e70d43696
|
@ -1 +1 @@
|
|||||||
Subproject commit ed857118e243fdc0f3a100f00ac9919e874cfe63
|
Subproject commit df60f0316899460eeaaefa06d2dd7e4e300c1604
|
@ -1 +1 @@
|
|||||||
Subproject commit 9b0fc3e7b02afe97895eb3e945fe800c3a7485ac
|
Subproject commit 2f382df218d7e8516dee3b3caccb819a62b571a2
|
@ -0,0 +1 @@
|
|||||||
|
Subproject commit c89f9dddc793f19910ef06c13e4fd240da4e7a59
|
@ -1 +1 @@
|
|||||||
Subproject commit 6d963fbe8d415399d65e94db7910bbd22fe3741c
|
Subproject commit a609330e4c6374f741d3b369269f7848255e1954
|
@ -1 +1 @@
|
|||||||
Subproject commit e12ef06218596b52d9b5d6e1639484866a8e7067
|
Subproject commit 10ef5735d842b31025f1257ae78899f50a40fb14
|
@ -1 +1 @@
|
|||||||
Subproject commit 7da378033a7764f955516f75194856d87bbcd7a5
|
Subproject commit 0df09e2f6b61c2d7ad2f2053d4f020a5c33e0378
|
@ -1 +1 @@
|
|||||||
Subproject commit 6b6b9e593dd4d3aaf75f48d40a13ef03bdef9fdb
|
Subproject commit 9c1294eaddb88cb0e044c675ccae059a85fc9c6c
|
@ -1 +1 @@
|
|||||||
Subproject commit 1e80a47dffbda813604f0913e2ad68c7054c14e4
|
Subproject commit 9cecf0643da0846e77f64d10a126d9f48b9e05e8
|
@ -1 +1 @@
|
|||||||
Subproject commit c6a35c56016ea2ab2f19115d2ea1e85e0edae155
|
Subproject commit c060e9ce30ac2e3ffb49d94209c4dae77b6642f7
|
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 101a71e03bbf860aaafb7090a0e440675cb27660
|
@ -1,259 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2019 yuzu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.8)
|
|
||||||
|
|
||||||
project(opus)
|
|
||||||
|
|
||||||
option(OPUS_STACK_PROTECTOR "Use stack protection" OFF)
|
|
||||||
option(OPUS_USE_ALLOCA "Use alloca for stack arrays (on non-C99 compilers)" OFF)
|
|
||||||
option(OPUS_CUSTOM_MODES "Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames" OFF)
|
|
||||||
option(OPUS_FIXED_POINT "Compile as fixed-point (for machines without a fast enough FPU)" OFF)
|
|
||||||
option(OPUS_ENABLE_FLOAT_API "Compile with the floating point API (for machines with float library" ON)
|
|
||||||
|
|
||||||
include(opus/opus_functions.cmake)
|
|
||||||
|
|
||||||
if(OPUS_STACK_PROTECTOR)
|
|
||||||
if(NOT MSVC) # GC on by default on MSVC
|
|
||||||
check_and_set_flag(STACK_PROTECTION_STRONG -fstack-protector-strong)
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
if(MSVC)
|
|
||||||
check_and_set_flag(BUFFER_SECURITY_CHECK /GS-)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_library(opus
|
|
||||||
# CELT sources
|
|
||||||
opus/celt/bands.c
|
|
||||||
opus/celt/celt.c
|
|
||||||
opus/celt/celt_decoder.c
|
|
||||||
opus/celt/celt_encoder.c
|
|
||||||
opus/celt/celt_lpc.c
|
|
||||||
opus/celt/cwrs.c
|
|
||||||
opus/celt/entcode.c
|
|
||||||
opus/celt/entdec.c
|
|
||||||
opus/celt/entenc.c
|
|
||||||
opus/celt/kiss_fft.c
|
|
||||||
opus/celt/laplace.c
|
|
||||||
opus/celt/mathops.c
|
|
||||||
opus/celt/mdct.c
|
|
||||||
opus/celt/modes.c
|
|
||||||
opus/celt/pitch.c
|
|
||||||
opus/celt/quant_bands.c
|
|
||||||
opus/celt/rate.c
|
|
||||||
opus/celt/vq.c
|
|
||||||
|
|
||||||
# SILK sources
|
|
||||||
opus/silk/A2NLSF.c
|
|
||||||
opus/silk/CNG.c
|
|
||||||
opus/silk/HP_variable_cutoff.c
|
|
||||||
opus/silk/LPC_analysis_filter.c
|
|
||||||
opus/silk/LPC_fit.c
|
|
||||||
opus/silk/LPC_inv_pred_gain.c
|
|
||||||
opus/silk/LP_variable_cutoff.c
|
|
||||||
opus/silk/NLSF2A.c
|
|
||||||
opus/silk/NLSF_VQ.c
|
|
||||||
opus/silk/NLSF_VQ_weights_laroia.c
|
|
||||||
opus/silk/NLSF_decode.c
|
|
||||||
opus/silk/NLSF_del_dec_quant.c
|
|
||||||
opus/silk/NLSF_encode.c
|
|
||||||
opus/silk/NLSF_stabilize.c
|
|
||||||
opus/silk/NLSF_unpack.c
|
|
||||||
opus/silk/NSQ.c
|
|
||||||
opus/silk/NSQ_del_dec.c
|
|
||||||
opus/silk/PLC.c
|
|
||||||
opus/silk/VAD.c
|
|
||||||
opus/silk/VQ_WMat_EC.c
|
|
||||||
opus/silk/ana_filt_bank_1.c
|
|
||||||
opus/silk/biquad_alt.c
|
|
||||||
opus/silk/bwexpander.c
|
|
||||||
opus/silk/bwexpander_32.c
|
|
||||||
opus/silk/check_control_input.c
|
|
||||||
opus/silk/code_signs.c
|
|
||||||
opus/silk/control_SNR.c
|
|
||||||
opus/silk/control_audio_bandwidth.c
|
|
||||||
opus/silk/control_codec.c
|
|
||||||
opus/silk/dec_API.c
|
|
||||||
opus/silk/decode_core.c
|
|
||||||
opus/silk/decode_frame.c
|
|
||||||
opus/silk/decode_indices.c
|
|
||||||
opus/silk/decode_parameters.c
|
|
||||||
opus/silk/decode_pitch.c
|
|
||||||
opus/silk/decode_pulses.c
|
|
||||||
opus/silk/decoder_set_fs.c
|
|
||||||
opus/silk/enc_API.c
|
|
||||||
opus/silk/encode_indices.c
|
|
||||||
opus/silk/encode_pulses.c
|
|
||||||
opus/silk/gain_quant.c
|
|
||||||
opus/silk/init_decoder.c
|
|
||||||
opus/silk/init_encoder.c
|
|
||||||
opus/silk/inner_prod_aligned.c
|
|
||||||
opus/silk/interpolate.c
|
|
||||||
opus/silk/lin2log.c
|
|
||||||
opus/silk/log2lin.c
|
|
||||||
opus/silk/pitch_est_tables.c
|
|
||||||
opus/silk/process_NLSFs.c
|
|
||||||
opus/silk/quant_LTP_gains.c
|
|
||||||
opus/silk/resampler.c
|
|
||||||
opus/silk/resampler_down2.c
|
|
||||||
opus/silk/resampler_down2_3.c
|
|
||||||
opus/silk/resampler_private_AR2.c
|
|
||||||
opus/silk/resampler_private_IIR_FIR.c
|
|
||||||
opus/silk/resampler_private_down_FIR.c
|
|
||||||
opus/silk/resampler_private_up2_HQ.c
|
|
||||||
opus/silk/resampler_rom.c
|
|
||||||
opus/silk/shell_coder.c
|
|
||||||
opus/silk/sigm_Q15.c
|
|
||||||
opus/silk/sort.c
|
|
||||||
opus/silk/stereo_LR_to_MS.c
|
|
||||||
opus/silk/stereo_MS_to_LR.c
|
|
||||||
opus/silk/stereo_decode_pred.c
|
|
||||||
opus/silk/stereo_encode_pred.c
|
|
||||||
opus/silk/stereo_find_predictor.c
|
|
||||||
opus/silk/stereo_quant_pred.c
|
|
||||||
opus/silk/sum_sqr_shift.c
|
|
||||||
opus/silk/table_LSF_cos.c
|
|
||||||
opus/silk/tables_LTP.c
|
|
||||||
opus/silk/tables_NLSF_CB_NB_MB.c
|
|
||||||
opus/silk/tables_NLSF_CB_WB.c
|
|
||||||
opus/silk/tables_gain.c
|
|
||||||
opus/silk/tables_other.c
|
|
||||||
opus/silk/tables_pitch_lag.c
|
|
||||||
opus/silk/tables_pulses_per_block.c
|
|
||||||
|
|
||||||
# Opus sources
|
|
||||||
opus/src/analysis.c
|
|
||||||
opus/src/mapping_matrix.c
|
|
||||||
opus/src/mlp.c
|
|
||||||
opus/src/mlp_data.c
|
|
||||||
opus/src/opus.c
|
|
||||||
opus/src/opus_decoder.c
|
|
||||||
opus/src/opus_encoder.c
|
|
||||||
opus/src/opus_multistream.c
|
|
||||||
opus/src/opus_multistream_decoder.c
|
|
||||||
opus/src/opus_multistream_encoder.c
|
|
||||||
opus/src/opus_projection_decoder.c
|
|
||||||
opus/src/opus_projection_encoder.c
|
|
||||||
opus/src/repacketizer.c
|
|
||||||
)
|
|
||||||
|
|
||||||
if (DEBUG)
|
|
||||||
target_sources(opus PRIVATE opus/silk/debug.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (OPUS_FIXED_POINT)
|
|
||||||
target_sources(opus PRIVATE
|
|
||||||
opus/silk/fixed/LTP_analysis_filter_FIX.c
|
|
||||||
opus/silk/fixed/LTP_scale_ctrl_FIX.c
|
|
||||||
opus/silk/fixed/apply_sine_window_FIX.c
|
|
||||||
opus/silk/fixed/autocorr_FIX.c
|
|
||||||
opus/silk/fixed/burg_modified_FIX.c
|
|
||||||
opus/silk/fixed/corrMatrix_FIX.c
|
|
||||||
opus/silk/fixed/encode_frame_FIX.c
|
|
||||||
opus/silk/fixed/find_LPC_FIX.c
|
|
||||||
opus/silk/fixed/find_LTP_FIX.c
|
|
||||||
opus/silk/fixed/find_pitch_lags_FIX.c
|
|
||||||
opus/silk/fixed/find_pred_coefs_FIX.c
|
|
||||||
opus/silk/fixed/k2a_FIX.c
|
|
||||||
opus/silk/fixed/k2a_Q16_FIX.c
|
|
||||||
opus/silk/fixed/noise_shape_analysis_FIX.c
|
|
||||||
opus/silk/fixed/pitch_analysis_core_FIX.c
|
|
||||||
opus/silk/fixed/prefilter_FIX.c
|
|
||||||
opus/silk/fixed/process_gains_FIX.c
|
|
||||||
opus/silk/fixed/regularize_correlations_FIX.c
|
|
||||||
opus/silk/fixed/residual_energy16_FIX.c
|
|
||||||
opus/silk/fixed/residual_energy_FIX.c
|
|
||||||
opus/silk/fixed/schur64_FIX.c
|
|
||||||
opus/silk/fixed/schur_FIX.c
|
|
||||||
opus/silk/fixed/solve_LS_FIX.c
|
|
||||||
opus/silk/fixed/vector_ops_FIX.c
|
|
||||||
opus/silk/fixed/warped_autocorrelation_FIX.c
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
target_sources(opus PRIVATE
|
|
||||||
opus/silk/float/LPC_analysis_filter_FLP.c
|
|
||||||
opus/silk/float/LPC_inv_pred_gain_FLP.c
|
|
||||||
opus/silk/float/LTP_analysis_filter_FLP.c
|
|
||||||
opus/silk/float/LTP_scale_ctrl_FLP.c
|
|
||||||
opus/silk/float/apply_sine_window_FLP.c
|
|
||||||
opus/silk/float/autocorrelation_FLP.c
|
|
||||||
opus/silk/float/burg_modified_FLP.c
|
|
||||||
opus/silk/float/bwexpander_FLP.c
|
|
||||||
opus/silk/float/corrMatrix_FLP.c
|
|
||||||
opus/silk/float/encode_frame_FLP.c
|
|
||||||
opus/silk/float/energy_FLP.c
|
|
||||||
opus/silk/float/find_LPC_FLP.c
|
|
||||||
opus/silk/float/find_LTP_FLP.c
|
|
||||||
opus/silk/float/find_pitch_lags_FLP.c
|
|
||||||
opus/silk/float/find_pred_coefs_FLP.c
|
|
||||||
opus/silk/float/inner_product_FLP.c
|
|
||||||
opus/silk/float/k2a_FLP.c
|
|
||||||
opus/silk/float/noise_shape_analysis_FLP.c
|
|
||||||
opus/silk/float/pitch_analysis_core_FLP.c
|
|
||||||
opus/silk/float/process_gains_FLP.c
|
|
||||||
opus/silk/float/regularize_correlations_FLP.c
|
|
||||||
opus/silk/float/residual_energy_FLP.c
|
|
||||||
opus/silk/float/scale_copy_vector_FLP.c
|
|
||||||
opus/silk/float/scale_vector_FLP.c
|
|
||||||
opus/silk/float/schur_FLP.c
|
|
||||||
opus/silk/float/sort_FLP.c
|
|
||||||
opus/silk/float/warped_autocorrelation_FLP.c
|
|
||||||
opus/silk/float/wrappers_FLP.c
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_compile_definitions(opus PRIVATE OPUS_BUILD ENABLE_HARDENING)
|
|
||||||
|
|
||||||
if(NOT MSVC)
|
|
||||||
if(MINGW)
|
|
||||||
target_compile_definitions(opus PRIVATE _FORTIFY_SOURCE=0)
|
|
||||||
else()
|
|
||||||
target_compile_definitions(opus PRIVATE _FORTIFY_SOURCE=2)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# It is strongly recommended to uncomment one of these VAR_ARRAYS: Use C99
|
|
||||||
# variable-length arrays for stack allocation USE_ALLOCA: Use alloca() for stack
|
|
||||||
# allocation If none is defined, then the fallback is a non-threadsafe global
|
|
||||||
# array
|
|
||||||
if(OPUS_USE_ALLOCA OR MSVC)
|
|
||||||
target_compile_definitions(opus PRIVATE USE_ALLOCA)
|
|
||||||
else()
|
|
||||||
target_compile_definitions(opus PRIVATE VAR_ARRAYS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(OPUS_CUSTOM_MODES)
|
|
||||||
target_compile_definitions(opus PRIVATE CUSTOM_MODES)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT OPUS_ENABLE_FLOAT_API)
|
|
||||||
target_compile_definitions(opus PRIVATE DISABLE_FLOAT_API)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_compile_definitions(opus
|
|
||||||
PUBLIC
|
|
||||||
-DOPUS_VERSION="\\"1.3.1\\""
|
|
||||||
|
|
||||||
PRIVATE
|
|
||||||
# Use C99 intrinsics to speed up float-to-int conversion
|
|
||||||
HAVE_LRINTF
|
|
||||||
)
|
|
||||||
|
|
||||||
if (FIXED_POINT)
|
|
||||||
target_compile_definitions(opus PRIVATE -DFIXED_POINT=1 -DDISABLE_FLOAT_API)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_include_directories(opus
|
|
||||||
PUBLIC
|
|
||||||
opus/include
|
|
||||||
|
|
||||||
PRIVATE
|
|
||||||
opus/celt
|
|
||||||
opus/silk
|
|
||||||
opus/silk/fixed
|
|
||||||
opus/silk/float
|
|
||||||
opus/src
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(Opus::opus ALIAS opus)
|
|
@ -1 +0,0 @@
|
|||||||
Subproject commit ad8fe90db79b7d2a135e3dfd2ed6631b0c5662ab
|
|
@ -1 +1 @@
|
|||||||
Subproject commit cbf56573a987527b39272e88cbdd11389b78c6e4
|
Subproject commit ef2eef17340f3fbd679327d286fad06dd6e838ed
|
@ -0,0 +1,90 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package org.yuzu.yuzu_emu.adapters
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.core.content.res.ResourcesCompat
|
||||||
|
import androidx.fragment.app.FragmentActivity
|
||||||
|
import androidx.navigation.findNavController
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
||||||
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
|
import org.yuzu.yuzu_emu.R
|
||||||
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
|
import org.yuzu.yuzu_emu.databinding.CardAppletOptionBinding
|
||||||
|
import org.yuzu.yuzu_emu.model.Applet
|
||||||
|
import org.yuzu.yuzu_emu.model.AppletInfo
|
||||||
|
import org.yuzu.yuzu_emu.model.Game
|
||||||
|
|
||||||
|
class AppletAdapter(val activity: FragmentActivity, var applets: List<Applet>) :
|
||||||
|
RecyclerView.Adapter<AppletAdapter.AppletViewHolder>(),
|
||||||
|
View.OnClickListener {
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(
|
||||||
|
parent: ViewGroup,
|
||||||
|
viewType: Int
|
||||||
|
): AppletAdapter.AppletViewHolder {
|
||||||
|
CardAppletOptionBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
|
.apply { root.setOnClickListener(this@AppletAdapter) }
|
||||||
|
.also { return AppletViewHolder(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: AppletViewHolder, position: Int) =
|
||||||
|
holder.bind(applets[position])
|
||||||
|
|
||||||
|
override fun getItemCount(): Int = applets.size
|
||||||
|
|
||||||
|
override fun onClick(view: View) {
|
||||||
|
val applet = (view.tag as AppletViewHolder).applet
|
||||||
|
val appletPath = NativeLibrary.getAppletLaunchPath(applet.appletInfo.entryId)
|
||||||
|
if (appletPath.isEmpty()) {
|
||||||
|
Toast.makeText(
|
||||||
|
YuzuApplication.appContext,
|
||||||
|
R.string.applets_error_applet,
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (applet.appletInfo == AppletInfo.Cabinet) {
|
||||||
|
view.findNavController()
|
||||||
|
.navigate(R.id.action_appletLauncherFragment_to_cabinetLauncherDialogFragment)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
NativeLibrary.setCurrentAppletId(applet.appletInfo.appletId)
|
||||||
|
val appletGame = Game(
|
||||||
|
title = YuzuApplication.appContext.getString(applet.titleId),
|
||||||
|
path = appletPath
|
||||||
|
)
|
||||||
|
val action = HomeNavigationDirections.actionGlobalEmulationActivity(appletGame)
|
||||||
|
view.findNavController().navigate(action)
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class AppletViewHolder(val binding: CardAppletOptionBinding) :
|
||||||
|
RecyclerView.ViewHolder(binding.root) {
|
||||||
|
lateinit var applet: Applet
|
||||||
|
|
||||||
|
init {
|
||||||
|
itemView.tag = this
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bind(applet: Applet) {
|
||||||
|
this.applet = applet
|
||||||
|
|
||||||
|
binding.title.setText(applet.titleId)
|
||||||
|
binding.description.setText(applet.descriptionId)
|
||||||
|
binding.icon.setImageDrawable(
|
||||||
|
ResourcesCompat.getDrawable(
|
||||||
|
binding.icon.context.resources,
|
||||||
|
applet.iconId,
|
||||||
|
binding.icon.context.theme
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package org.yuzu.yuzu_emu.adapters
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.content.res.ResourcesCompat
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
||||||
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
|
import org.yuzu.yuzu_emu.R
|
||||||
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
|
import org.yuzu.yuzu_emu.databinding.DialogListItemBinding
|
||||||
|
import org.yuzu.yuzu_emu.model.CabinetMode
|
||||||
|
import org.yuzu.yuzu_emu.adapters.CabinetLauncherDialogAdapter.CabinetModeViewHolder
|
||||||
|
import org.yuzu.yuzu_emu.model.AppletInfo
|
||||||
|
import org.yuzu.yuzu_emu.model.Game
|
||||||
|
|
||||||
|
class CabinetLauncherDialogAdapter(val fragment: Fragment) :
|
||||||
|
RecyclerView.Adapter<CabinetModeViewHolder>(),
|
||||||
|
View.OnClickListener {
|
||||||
|
private val cabinetModes = CabinetMode.values().copyOfRange(1, CabinetMode.values().size)
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CabinetModeViewHolder {
|
||||||
|
DialogListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
|
.apply { root.setOnClickListener(this@CabinetLauncherDialogAdapter) }
|
||||||
|
.also { return CabinetModeViewHolder(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount(): Int = cabinetModes.size
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: CabinetModeViewHolder, position: Int) =
|
||||||
|
holder.bind(cabinetModes[position])
|
||||||
|
|
||||||
|
override fun onClick(view: View) {
|
||||||
|
val mode = (view.tag as CabinetModeViewHolder).cabinetMode
|
||||||
|
val appletPath = NativeLibrary.getAppletLaunchPath(AppletInfo.Cabinet.entryId)
|
||||||
|
NativeLibrary.setCurrentAppletId(AppletInfo.Cabinet.appletId)
|
||||||
|
NativeLibrary.setCabinetMode(mode.id)
|
||||||
|
val appletGame = Game(
|
||||||
|
title = YuzuApplication.appContext.getString(R.string.cabinet_applet),
|
||||||
|
path = appletPath
|
||||||
|
)
|
||||||
|
val action = HomeNavigationDirections.actionGlobalEmulationActivity(appletGame)
|
||||||
|
fragment.findNavController().navigate(action)
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class CabinetModeViewHolder(val binding: DialogListItemBinding) :
|
||||||
|
RecyclerView.ViewHolder(binding.root) {
|
||||||
|
lateinit var cabinetMode: CabinetMode
|
||||||
|
|
||||||
|
init {
|
||||||
|
itemView.tag = this
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bind(cabinetMode: CabinetMode) {
|
||||||
|
this.cabinetMode = cabinetMode
|
||||||
|
binding.icon.setImageDrawable(
|
||||||
|
ResourcesCompat.getDrawable(
|
||||||
|
binding.icon.context.resources,
|
||||||
|
cabinetMode.iconId,
|
||||||
|
binding.icon.context.theme
|
||||||
|
)
|
||||||
|
)
|
||||||
|
binding.title.setText(cabinetMode.titleId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,113 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package org.yuzu.yuzu_emu.fragments
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.view.ViewCompat
|
||||||
|
import androidx.core.view.WindowInsetsCompat
|
||||||
|
import androidx.core.view.updatePadding
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.navigation.findNavController
|
||||||
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
|
import com.google.android.material.transition.MaterialSharedAxis
|
||||||
|
import org.yuzu.yuzu_emu.R
|
||||||
|
import org.yuzu.yuzu_emu.adapters.AppletAdapter
|
||||||
|
import org.yuzu.yuzu_emu.databinding.FragmentAppletLauncherBinding
|
||||||
|
import org.yuzu.yuzu_emu.model.Applet
|
||||||
|
import org.yuzu.yuzu_emu.model.AppletInfo
|
||||||
|
import org.yuzu.yuzu_emu.model.HomeViewModel
|
||||||
|
|
||||||
|
class AppletLauncherFragment : Fragment() {
|
||||||
|
private var _binding: FragmentAppletLauncherBinding? = null
|
||||||
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
|
private val homeViewModel: HomeViewModel by activityViewModels()
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
|
||||||
|
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
||||||
|
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
_binding = FragmentAppletLauncherBinding.inflate(inflater)
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
homeViewModel.setNavigationVisibility(visible = false, animated = true)
|
||||||
|
homeViewModel.setStatusBarShadeVisibility(visible = false)
|
||||||
|
|
||||||
|
binding.toolbarApplets.setNavigationOnClickListener {
|
||||||
|
binding.root.findNavController().popBackStack()
|
||||||
|
}
|
||||||
|
|
||||||
|
val applets = listOf(
|
||||||
|
Applet(
|
||||||
|
R.string.album_applet,
|
||||||
|
R.string.album_applet_description,
|
||||||
|
R.drawable.ic_album,
|
||||||
|
AppletInfo.PhotoViewer
|
||||||
|
),
|
||||||
|
Applet(
|
||||||
|
R.string.cabinet_applet,
|
||||||
|
R.string.cabinet_applet_description,
|
||||||
|
R.drawable.ic_nfc,
|
||||||
|
AppletInfo.Cabinet
|
||||||
|
),
|
||||||
|
Applet(
|
||||||
|
R.string.mii_edit_applet,
|
||||||
|
R.string.mii_edit_applet_description,
|
||||||
|
R.drawable.ic_mii,
|
||||||
|
AppletInfo.MiiEdit
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
binding.listApplets.apply {
|
||||||
|
layoutManager = GridLayoutManager(
|
||||||
|
requireContext(),
|
||||||
|
resources.getInteger(R.integer.grid_columns)
|
||||||
|
)
|
||||||
|
adapter = AppletAdapter(requireActivity(), applets)
|
||||||
|
}
|
||||||
|
|
||||||
|
setInsets()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setInsets() =
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(
|
||||||
|
binding.root
|
||||||
|
) { _: View, windowInsets: WindowInsetsCompat ->
|
||||||
|
val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||||
|
val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
|
||||||
|
|
||||||
|
val leftInsets = barInsets.left + cutoutInsets.left
|
||||||
|
val rightInsets = barInsets.right + cutoutInsets.right
|
||||||
|
|
||||||
|
val mlpAppBar = binding.toolbarApplets.layoutParams as ViewGroup.MarginLayoutParams
|
||||||
|
mlpAppBar.leftMargin = leftInsets
|
||||||
|
mlpAppBar.rightMargin = rightInsets
|
||||||
|
binding.toolbarApplets.layoutParams = mlpAppBar
|
||||||
|
|
||||||
|
val mlpListApplets =
|
||||||
|
binding.listApplets.layoutParams as ViewGroup.MarginLayoutParams
|
||||||
|
mlpListApplets.leftMargin = leftInsets
|
||||||
|
mlpListApplets.rightMargin = rightInsets
|
||||||
|
binding.listApplets.layoutParams = mlpListApplets
|
||||||
|
|
||||||
|
binding.listApplets.updatePadding(bottom = barInsets.bottom)
|
||||||
|
|
||||||
|
windowInsets
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package org.yuzu.yuzu_emu.fragments
|
||||||
|
|
||||||
|
import android.app.Dialog
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.DialogFragment
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
import org.yuzu.yuzu_emu.R
|
||||||
|
import org.yuzu.yuzu_emu.adapters.CabinetLauncherDialogAdapter
|
||||||
|
import org.yuzu.yuzu_emu.databinding.DialogListBinding
|
||||||
|
|
||||||
|
class CabinetLauncherDialogFragment : DialogFragment() {
|
||||||
|
private lateinit var binding: DialogListBinding
|
||||||
|
|
||||||
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
|
binding = DialogListBinding.inflate(layoutInflater)
|
||||||
|
binding.dialogList.apply {
|
||||||
|
layoutManager = LinearLayoutManager(requireContext())
|
||||||
|
adapter = CabinetLauncherDialogAdapter(this@CabinetLauncherDialogFragment)
|
||||||
|
}
|
||||||
|
|
||||||
|
return MaterialAlertDialogBuilder(requireContext())
|
||||||
|
.setTitle(R.string.cabinet_launcher)
|
||||||
|
.setView(binding.root)
|
||||||
|
.create()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package org.yuzu.yuzu_emu.model
|
||||||
|
|
||||||
|
import androidx.annotation.DrawableRes
|
||||||
|
import androidx.annotation.StringRes
|
||||||
|
import org.yuzu.yuzu_emu.R
|
||||||
|
|
||||||
|
data class Applet(
|
||||||
|
@StringRes val titleId: Int,
|
||||||
|
@StringRes val descriptionId: Int,
|
||||||
|
@DrawableRes val iconId: Int,
|
||||||
|
val appletInfo: AppletInfo,
|
||||||
|
val cabinetMode: CabinetMode = CabinetMode.None
|
||||||
|
)
|
||||||
|
|
||||||
|
// Combination of Common::AM::Applets::AppletId enum and the entry id
|
||||||
|
enum class AppletInfo(val appletId: Int, val entryId: Long = 0) {
|
||||||
|
None(0x00),
|
||||||
|
Application(0x01),
|
||||||
|
OverlayDisplay(0x02),
|
||||||
|
QLaunch(0x03),
|
||||||
|
Starter(0x04),
|
||||||
|
Auth(0x0A),
|
||||||
|
Cabinet(0x0B, 0x0100000000001002),
|
||||||
|
Controller(0x0C),
|
||||||
|
DataErase(0x0D),
|
||||||
|
Error(0x0E),
|
||||||
|
NetConnect(0x0F),
|
||||||
|
ProfileSelect(0x10),
|
||||||
|
SoftwareKeyboard(0x11),
|
||||||
|
MiiEdit(0x12, 0x0100000000001009),
|
||||||
|
Web(0x13),
|
||||||
|
Shop(0x14),
|
||||||
|
PhotoViewer(0x015, 0x010000000000100D),
|
||||||
|
Settings(0x16),
|
||||||
|
OfflineWeb(0x17),
|
||||||
|
LoginShare(0x18),
|
||||||
|
WebAuth(0x19),
|
||||||
|
MyPage(0x1A)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Matches enum in Service::NFP::CabinetMode with extra metadata
|
||||||
|
enum class CabinetMode(
|
||||||
|
val id: Int,
|
||||||
|
@StringRes val titleId: Int = 0,
|
||||||
|
@DrawableRes val iconId: Int = 0
|
||||||
|
) {
|
||||||
|
None(-1),
|
||||||
|
StartNicknameAndOwnerSettings(0, R.string.cabinet_nickname_and_owner, R.drawable.ic_edit),
|
||||||
|
StartGameDataEraser(1, R.string.cabinet_game_data_eraser, R.drawable.ic_refresh),
|
||||||
|
StartRestorer(2, R.string.cabinet_restorer, R.drawable.ic_restore),
|
||||||
|
StartFormatter(3, R.string.cabinet_formatter, R.drawable.ic_clear)
|
||||||
|
}
|
@ -1,70 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.utils
|
|
||||||
|
|
||||||
import android.view.InputDevice
|
|
||||||
import android.view.KeyEvent
|
|
||||||
import android.view.MotionEvent
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Some controllers have incorrect mappings. This class has special-case fixes for them.
|
|
||||||
*/
|
|
||||||
class ControllerMappingHelper {
|
|
||||||
/**
|
|
||||||
* Some controllers report extra button presses that can be ignored.
|
|
||||||
*/
|
|
||||||
fun shouldKeyBeIgnored(inputDevice: InputDevice, keyCode: Int): Boolean {
|
|
||||||
return if (isDualShock4(inputDevice)) {
|
|
||||||
// The two analog triggers generate analog motion events as well as a keycode.
|
|
||||||
// We always prefer to use the analog values, so throw away the button press
|
|
||||||
keyCode == KeyEvent.KEYCODE_BUTTON_L2 || keyCode == KeyEvent.KEYCODE_BUTTON_R2
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Scale an axis to be zero-centered with a proper range.
|
|
||||||
*/
|
|
||||||
fun scaleAxis(inputDevice: InputDevice, axis: Int, value: Float): Float {
|
|
||||||
if (isDualShock4(inputDevice)) {
|
|
||||||
// Android doesn't have correct mappings for this controller's triggers. It reports them
|
|
||||||
// as RX & RY, centered at -1.0, and with a range of [-1.0, 1.0]
|
|
||||||
// Scale them to properly zero-centered with a range of [0.0, 1.0].
|
|
||||||
if (axis == MotionEvent.AXIS_RX || axis == MotionEvent.AXIS_RY) {
|
|
||||||
return (value + 1) / 2.0f
|
|
||||||
}
|
|
||||||
} else if (isXboxOneWireless(inputDevice)) {
|
|
||||||
// Same as the DualShock 4, the mappings are missing.
|
|
||||||
if (axis == MotionEvent.AXIS_Z || axis == MotionEvent.AXIS_RZ) {
|
|
||||||
return (value + 1) / 2.0f
|
|
||||||
}
|
|
||||||
if (axis == MotionEvent.AXIS_GENERIC_1) {
|
|
||||||
// This axis is stuck at ~.5. Ignore it.
|
|
||||||
return 0.0f
|
|
||||||
}
|
|
||||||
} else if (isMogaPro2Hid(inputDevice)) {
|
|
||||||
// This controller has a broken axis that reports a constant value. Ignore it.
|
|
||||||
if (axis == MotionEvent.AXIS_GENERIC_1) {
|
|
||||||
return 0.0f
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sony DualShock 4 controller
|
|
||||||
private fun isDualShock4(inputDevice: InputDevice): Boolean {
|
|
||||||
return inputDevice.vendorId == 0x54c && inputDevice.productId == 0x9cc
|
|
||||||
}
|
|
||||||
|
|
||||||
// Microsoft Xbox One controller
|
|
||||||
private fun isXboxOneWireless(inputDevice: InputDevice): Boolean {
|
|
||||||
return inputDevice.vendorId == 0x45e && inputDevice.productId == 0x2e0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Moga Pro 2 HID
|
|
||||||
private fun isMogaPro2Hid(inputDevice: InputDevice): Boolean {
|
|
||||||
return inputDevice.vendorId == 0x20d6 && inputDevice.productId == 0x6271
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,20 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package org.yuzu.yuzu_emu.utils
|
||||||
|
|
||||||
|
object GameMetadata {
|
||||||
|
external fun getTitle(path: String): String
|
||||||
|
|
||||||
|
external fun getProgramId(path: String): String
|
||||||
|
|
||||||
|
external fun getDeveloper(path: String): String
|
||||||
|
|
||||||
|
external fun getVersion(path: String): String
|
||||||
|
|
||||||
|
external fun getIcon(path: String): ByteArray
|
||||||
|
|
||||||
|
external fun getIsHomebrew(path: String): Boolean
|
||||||
|
|
||||||
|
external fun resetMetadata()
|
||||||
|
}
|
@ -0,0 +1,112 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <core/core.h>
|
||||||
|
#include <core/file_sys/patch_manager.h>
|
||||||
|
#include <core/loader/nro.h>
|
||||||
|
#include <jni.h>
|
||||||
|
#include "core/loader/loader.h"
|
||||||
|
#include "jni/android_common/android_common.h"
|
||||||
|
#include "native.h"
|
||||||
|
|
||||||
|
struct RomMetadata {
|
||||||
|
std::string title;
|
||||||
|
u64 programId;
|
||||||
|
std::string developer;
|
||||||
|
std::string version;
|
||||||
|
std::vector<u8> icon;
|
||||||
|
bool isHomebrew;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::unordered_map<std::string, RomMetadata> m_rom_metadata_cache;
|
||||||
|
|
||||||
|
RomMetadata CacheRomMetadata(const std::string& path) {
|
||||||
|
const auto file =
|
||||||
|
Core::GetGameFileFromPath(EmulationSession::GetInstance().System().GetFilesystem(), path);
|
||||||
|
auto loader = Loader::GetLoader(EmulationSession::GetInstance().System(), file, 0, 0);
|
||||||
|
|
||||||
|
RomMetadata entry;
|
||||||
|
loader->ReadTitle(entry.title);
|
||||||
|
loader->ReadProgramId(entry.programId);
|
||||||
|
loader->ReadIcon(entry.icon);
|
||||||
|
|
||||||
|
const FileSys::PatchManager pm{
|
||||||
|
entry.programId, EmulationSession::GetInstance().System().GetFileSystemController(),
|
||||||
|
EmulationSession::GetInstance().System().GetContentProvider()};
|
||||||
|
const auto control = pm.GetControlMetadata();
|
||||||
|
|
||||||
|
if (control.first != nullptr) {
|
||||||
|
entry.developer = control.first->GetDeveloperName();
|
||||||
|
entry.version = control.first->GetVersionString();
|
||||||
|
} else {
|
||||||
|
FileSys::NACP nacp;
|
||||||
|
if (loader->ReadControlData(nacp) == Loader::ResultStatus::Success) {
|
||||||
|
entry.developer = nacp.GetDeveloperName();
|
||||||
|
} else {
|
||||||
|
entry.developer = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
entry.version = "1.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loader->GetFileType() == Loader::FileType::NRO) {
|
||||||
|
auto loader_nro = reinterpret_cast<Loader::AppLoader_NRO*>(loader.get());
|
||||||
|
entry.isHomebrew = loader_nro->IsHomebrew();
|
||||||
|
} else {
|
||||||
|
entry.isHomebrew = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_rom_metadata_cache[path] = entry;
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
RomMetadata GetRomMetadata(const std::string& path) {
|
||||||
|
if (auto search = m_rom_metadata_cache.find(path); search != m_rom_metadata_cache.end()) {
|
||||||
|
return search->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CacheRomMetadata(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getTitle(JNIEnv* env, jobject obj,
|
||||||
|
jstring jpath) {
|
||||||
|
return ToJString(env, GetRomMetadata(GetJString(env, jpath)).title);
|
||||||
|
}
|
||||||
|
|
||||||
|
jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getProgramId(JNIEnv* env, jobject obj,
|
||||||
|
jstring jpath) {
|
||||||
|
return ToJString(env, std::to_string(GetRomMetadata(GetJString(env, jpath)).programId));
|
||||||
|
}
|
||||||
|
|
||||||
|
jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getDeveloper(JNIEnv* env, jobject obj,
|
||||||
|
jstring jpath) {
|
||||||
|
return ToJString(env, GetRomMetadata(GetJString(env, jpath)).developer);
|
||||||
|
}
|
||||||
|
|
||||||
|
jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getVersion(JNIEnv* env, jobject obj,
|
||||||
|
jstring jpath) {
|
||||||
|
return ToJString(env, GetRomMetadata(GetJString(env, jpath)).version);
|
||||||
|
}
|
||||||
|
|
||||||
|
jbyteArray Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobject obj,
|
||||||
|
jstring jpath) {
|
||||||
|
auto icon_data = GetRomMetadata(GetJString(env, jpath)).icon;
|
||||||
|
jbyteArray icon = env->NewByteArray(static_cast<jsize>(icon_data.size()));
|
||||||
|
env->SetByteArrayRegion(icon, 0, env->GetArrayLength(icon),
|
||||||
|
reinterpret_cast<jbyte*>(icon_data.data()));
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsHomebrew(JNIEnv* env, jobject obj,
|
||||||
|
jstring jpath) {
|
||||||
|
return static_cast<jboolean>(GetRomMetadata(GetJString(env, jpath)).isHomebrew);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_GameMetadata_resetMetadata(JNIEnv* env, jobject obj) {
|
||||||
|
return m_rom_metadata_cache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // extern "C"
|
@ -0,0 +1,85 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <android/native_window_jni.h>
|
||||||
|
#include "common/detached_tasks.h"
|
||||||
|
#include "core/core.h"
|
||||||
|
#include "core/file_sys/registered_cache.h"
|
||||||
|
#include "core/hle/service/acc/profile_manager.h"
|
||||||
|
#include "core/perf_stats.h"
|
||||||
|
#include "jni/applets/software_keyboard.h"
|
||||||
|
#include "jni/emu_window/emu_window.h"
|
||||||
|
#include "video_core/rasterizer_interface.h"
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
class EmulationSession final {
|
||||||
|
public:
|
||||||
|
explicit EmulationSession();
|
||||||
|
~EmulationSession() = default;
|
||||||
|
|
||||||
|
static EmulationSession& GetInstance();
|
||||||
|
const Core::System& System() const;
|
||||||
|
Core::System& System();
|
||||||
|
|
||||||
|
const EmuWindow_Android& Window() const;
|
||||||
|
EmuWindow_Android& Window();
|
||||||
|
ANativeWindow* NativeWindow() const;
|
||||||
|
void SetNativeWindow(ANativeWindow* native_window);
|
||||||
|
void SurfaceChanged();
|
||||||
|
|
||||||
|
int InstallFileToNand(std::string filename, std::string file_extension);
|
||||||
|
void InitializeGpuDriver(const std::string& hook_lib_dir, const std::string& custom_driver_dir,
|
||||||
|
const std::string& custom_driver_name,
|
||||||
|
const std::string& file_redirect_dir);
|
||||||
|
|
||||||
|
bool IsRunning() const;
|
||||||
|
bool IsPaused() const;
|
||||||
|
void PauseEmulation();
|
||||||
|
void UnPauseEmulation();
|
||||||
|
void HaltEmulation();
|
||||||
|
void RunEmulation();
|
||||||
|
void ShutdownEmulation();
|
||||||
|
|
||||||
|
const Core::PerfStatsResults& PerfStats() const;
|
||||||
|
void ConfigureFilesystemProvider(const std::string& filepath);
|
||||||
|
void InitializeSystem(bool reload);
|
||||||
|
Core::SystemResultStatus InitializeEmulation(const std::string& filepath);
|
||||||
|
|
||||||
|
bool IsHandheldOnly();
|
||||||
|
void SetDeviceType([[maybe_unused]] int index, int type);
|
||||||
|
void OnGamepadConnectEvent([[maybe_unused]] int index);
|
||||||
|
void OnGamepadDisconnectEvent([[maybe_unused]] int index);
|
||||||
|
SoftwareKeyboard::AndroidKeyboard* SoftwareKeyboard();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress, int max);
|
||||||
|
static void OnEmulationStarted();
|
||||||
|
static void OnEmulationStopped(Core::SystemResultStatus result);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Window management
|
||||||
|
std::unique_ptr<EmuWindow_Android> m_window;
|
||||||
|
ANativeWindow* m_native_window{};
|
||||||
|
|
||||||
|
// Core emulation
|
||||||
|
Core::System m_system;
|
||||||
|
InputCommon::InputSubsystem m_input_subsystem;
|
||||||
|
Common::DetachedTasks m_detached_tasks;
|
||||||
|
Core::PerfStatsResults m_perf_stats{};
|
||||||
|
std::shared_ptr<FileSys::VfsFilesystem> m_vfs;
|
||||||
|
Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized};
|
||||||
|
std::atomic<bool> m_is_running = false;
|
||||||
|
std::atomic<bool> m_is_paused = false;
|
||||||
|
SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{};
|
||||||
|
std::unique_ptr<Service::Account::ProfileManager> m_profile_manager;
|
||||||
|
std::unique_ptr<FileSys::ManualContentProvider> m_manual_provider;
|
||||||
|
|
||||||
|
// GPU driver parameters
|
||||||
|
std::shared_ptr<Common::DynamicLibrary> m_vulkan_library;
|
||||||
|
|
||||||
|
// Synchronization
|
||||||
|
std::condition_variable_any m_cv;
|
||||||
|
mutable std::mutex m_perf_stats_mutex;
|
||||||
|
mutable std::mutex m_mutex;
|
||||||
|
};
|
@ -0,0 +1,31 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <common/logging/log.h>
|
||||||
|
#include <jni.h>
|
||||||
|
|
||||||
|
#include "android_common/android_common.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_debug(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_DEBUG(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_warning(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_WARNING(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_info(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_INFO(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_error(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_ERROR(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_critical(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_CRITICAL(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // extern "C"
|
@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z" />
|
||||||
|
</vector>
|
@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M17,16l-4,-4V8.82C14.16,8.4 15,7.3 15,6c0,-1.66 -1.34,-3 -3,-3S9,4.34 9,6c0,1.3 0.84,2.4 2,2.82V12l-4,4H3v5h5v-3.05l4,-4.2 4,4.2V21h5v-5h-4z" />
|
||||||
|
</vector>
|
@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" />
|
||||||
|
</vector>
|
@ -0,0 +1,18 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M9,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" />
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M20.77,8.58l-0.92,2.01c0.09,0.46 0.15,0.93 0.15,1.41 0,4.41 -3.59,8 -8,8s-8,-3.59 -8,-8c0,-0.05 0.01,-0.1 0,-0.14 2.6,-0.98 4.69,-2.99 5.74,-5.55C11.58,8.56 14.37,10 17.5,10c0.45,0 0.89,-0.04 1.33,-0.1l-0.6,-1.32 -0.88,-1.93 -1.93,-0.88 -2.79,-1.27 2.79,-1.27 0.71,-0.32C14.87,2.33 13.47,2 12,2 6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10c0,-1.47 -0.33,-2.87 -0.9,-4.13l-0.33,0.71z" />
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M15,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" />
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M20.6,5.6L19.5,8l-1.1,-2.4L16,4.5l2.4,-1.1L19.5,1l1.1,2.4L23,4.5z" />
|
||||||
|
</vector>
|
@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z" />
|
||||||
|
</vector>
|
@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z" />
|
||||||
|
</vector>
|
@ -0,0 +1,57 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
style="?attr/materialCardViewOutlinedStyle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:layout_marginVertical="12dp"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:padding="24dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/icon"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_marginEnd="20dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
app:tint="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_gravity="center_vertical">
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
android:id="@+id/title"
|
||||||
|
style="@style/TextAppearance.Material3.TitleMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
tools:text="@string/applets" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
android:id="@+id/description"
|
||||||
|
style="@style/TextAppearance.Material3.BodyMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
tools:text="@string/applets_description" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/dialog_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:fadeScrollbars="false"
|
||||||
|
android:paddingVertical="12dp"
|
||||||
|
android:scrollbars="vertical" />
|
||||||
|
|
||||||
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingHorizontal="24dp"
|
||||||
|
android:paddingVertical="16dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/icon"
|
||||||
|
android:layout_width="20dp"
|
||||||
|
android:layout_height="20dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
tools:src="@drawable/ic_nfc" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
android:id="@+id/title"
|
||||||
|
style="@style/TextAppearance.Material3.BodyMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_gravity="center_vertical|start"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
tools:text="List option" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/coordinator_applets"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/colorSurface">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appbar_applets"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:fitsSystemWindows="true">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/toolbar_applets"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
app:navigationIcon="@drawable/ic_back"
|
||||||
|
app:title="@string/applets" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/list_applets"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
@ -0,0 +1 @@
|
|||||||
|
unqualifiedResLocale=en-US
|
@ -0,0 +1,385 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
|
<string name="emulation_notification_channel_name">المحاكي نشط</string>
|
||||||
|
<string name="emulation_notification_channel_description">اظهار اشعار دائم عندما يكون المحاكي نشطاً</string>
|
||||||
|
<string name="emulation_notification_running">يوزو يعمل</string>
|
||||||
|
<string name="notice_notification_channel_name">الإشعارات والأخطاء</string>
|
||||||
|
<string name="notice_notification_channel_description">اظهار اشعار عند حصول اي مشكلة.</string>
|
||||||
|
<string name="notification_permission_not_granted">لم يتم منح إذن الإشعار</string>
|
||||||
|
|
||||||
|
<!-- Setup strings -->
|
||||||
|
<string name="welcome">مرحبًا</string>
|
||||||
|
<string name="welcome_description">والانتقال إلى المحاكاة <b>يوزو</b> تعرف على كيفية إعداد.</string>
|
||||||
|
<string name="get_started">لنبدأ</string>
|
||||||
|
<string name="keys">المفاتيح</string>
|
||||||
|
<string name="keys_description">اختر ملف <b>prod.keys</b> من الزر ادناه</string>
|
||||||
|
<string name="select_keys">إختيار المفاتيح</string>
|
||||||
|
<string name="games">الألعاب</string>
|
||||||
|
<string name="games_description">اختر مجلد <b>العابك</b> من الزر ادناه.</string>
|
||||||
|
<string name="done">إنهاء</string>
|
||||||
|
<string name="done_description">كل شيء جاهز./n استمتع بألعابك!</string>
|
||||||
|
<string name="text_continue">استمر</string>
|
||||||
|
<string name="next">التالي</string>
|
||||||
|
<string name="back">عودة</string>
|
||||||
|
<string name="add_games">إضافة ألعاب</string>
|
||||||
|
<string name="add_games_description">إختار مجلد ألعابك</string>
|
||||||
|
<string name="step_complete">مكتمل</string>
|
||||||
|
|
||||||
|
<!-- Home strings -->
|
||||||
|
<string name="home_games">الألعاب</string>
|
||||||
|
<string name="home_search">البحث</string>
|
||||||
|
<string name="home_settings">الإعدادات</string>
|
||||||
|
<string name="empty_gamelist">لم يتم العثور على ملفات او لم يتم تحديد مسار العاب.</string>
|
||||||
|
<string name="search_and_filter_games">بحث وتصفية الألعاب</string>
|
||||||
|
<string name="select_games_folder">تحديد مجلد الألعاب</string>
|
||||||
|
<string name="select_games_folder_description">يسمح لـ يوزو بملء قائمة الألعاب</string>
|
||||||
|
<string name="add_games_warning">تخطُ اختيار مجلد الالعاب؟</string>
|
||||||
|
<string name="add_games_warning_description">لن يتم عرض الألعاب في قائمة الألعاب إذا لم يتم تحديد مجلد</string>
|
||||||
|
<string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
|
||||||
|
<string name="home_search_games">البحث عن ألعاب</string>
|
||||||
|
<string name="search_settings">إعدادات البحث</string>
|
||||||
|
<string name="games_dir_selected">تم تحديد مجلد الألعاب</string>
|
||||||
|
<string name="install_prod_keys">تثبيت prod.keys</string>
|
||||||
|
<string name="install_prod_keys_description">مطلوب لفك تشفير ألعاب البيع بالتجزئة</string>
|
||||||
|
<string name="install_prod_keys_warning">تخطي إضافة المفاتيح؟</string>
|
||||||
|
<string name="install_prod_keys_warning_description">مطلوب مفاتيح صالحة لمحاكاة ألعاب البيع بالتجزئة. ستعمل تطبيقات البيرة المنزلية فقط إذا تابعت</string>
|
||||||
|
<string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
|
||||||
|
<string name="notifications">التنبيهات</string>
|
||||||
|
<string name="notifications_description">امنح إذن الإشعار باستخدام الزر أدناه</string>
|
||||||
|
<string name="give_permission">منح الإذن</string>
|
||||||
|
<string name="notification_warning">تخطي منح إذن الإشعارات؟</string>
|
||||||
|
<string name="notification_warning_description">لن يتمكن يوزو من إشعارك بالمعلومات المهمة</string>
|
||||||
|
<string name="permission_denied">تم رفض الإذن</string>
|
||||||
|
<string name="permission_denied_description">لقد رفضت هذا الإذن عدة مرات ويتعين عليك الآن منحه يدويًا في إعدادات النظام</string>
|
||||||
|
<string name="about">حول</string>
|
||||||
|
<string name="about_description">بناء الإصدار، والاعتمادات، وأكثر من ذلك</string>
|
||||||
|
<string name="warning_help">مساعدة</string>
|
||||||
|
<string name="warning_skip">تخطي</string>
|
||||||
|
<string name="warning_cancel">إلغاء</string>
|
||||||
|
<string name="install_amiibo_keys">تثبيت مفاتيح أميبو</string>
|
||||||
|
<string name="install_amiibo_keys_description">مطلوب لاستخدام أميبو في اللعبة</string>
|
||||||
|
<string name="invalid_keys_file">تم تحديد ملف مفاتيح غير صالح</string>
|
||||||
|
<string name="install_keys_success">تم تثبيت المفاتيح بنجاح</string>
|
||||||
|
<string name="reading_keys_failure">خطأ في قراءة مفاتيح التشفير</string>
|
||||||
|
<string name="invalid_keys_error">مفاتيح التشفير غير صالحة</string>
|
||||||
|
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
|
||||||
|
<string name="install_keys_failure_description">الملف المحدد غير صحيح أو تالف. يرجى إعادة المفاتيح الخاصة بك</string>
|
||||||
|
<string name="install_gpu_driver">GPU تثبيت برنامج تشغيل</string>
|
||||||
|
<string name="install_gpu_driver_description">قم بتثبيت برامج تشغيل بديلة للحصول على أداء أو دقة أفضل</string>
|
||||||
|
<string name="advanced_settings">إعدادات متقدمة</string>
|
||||||
|
<string name="advanced_settings_game">إعدادات متقدمة: %1$s</string>
|
||||||
|
<string name="settings_description">تكوين إعدادات المحاكي</string>
|
||||||
|
<string name="search_recently_played">لعبت مؤخرا</string>
|
||||||
|
<string name="search_recently_added">أضيف مؤخرا</string>
|
||||||
|
<string name="search_retail">بيع بالتجزئة</string>
|
||||||
|
<string name="search_homebrew">البيرة المنزلية</string>
|
||||||
|
<string name="open_user_folder">فتح مجلد يوزو</string>
|
||||||
|
<string name="open_user_folder_description">إدارة ملفات يوزو الداخلية</string>
|
||||||
|
<string name="theme_and_color_description">تعديل مظهر التطبيق</string>
|
||||||
|
<string name="no_file_manager">لم يتم العثور على مدير الملفات</string>
|
||||||
|
<string name="notification_no_directory_link">لا يمكن فتح مجلد يوزو</string>
|
||||||
|
<string name="notification_no_directory_link_description">الرجاء تحديد موقع مجلد المستخدم باستخدام اللوحة الجانبية لمدير الملفات يدويًا</string>
|
||||||
|
<string name="manage_save_data">إدارة حفظ البيانات</string>
|
||||||
|
<string name="manage_save_data_description">حفظ البيانات التي تم العثور عليها. يرجى اختيار أحد الخيارات التالية</string>
|
||||||
|
<string name="import_export_saves_description">استيراد أو تصدير ملفات الحفظ</string>
|
||||||
|
<string name="save_file_imported_success">تم الاستيراد بنجاح</string>
|
||||||
|
<string name="save_file_invalid_zip_structure">بنية مجلد الحفظ غير صالحة</string>
|
||||||
|
<string name="save_file_invalid_zip_structure_description">يجب أن يكون اسم المجلد الفرعي الأول هو معرف عنوان اللعبة.</string>
|
||||||
|
<string name="import_saves">استيراد</string>
|
||||||
|
<string name="export_saves">تصدير</string>
|
||||||
|
<string name="install_firmware">تثبيت البرامج الثابتة</string>
|
||||||
|
<string name="firmware_installing">تثبيت البرامج الثابتة</string>
|
||||||
|
<string name="firmware_installed_success">تم تثبيت البرامج الثابتة بنجاح</string>
|
||||||
|
<string name="firmware_installed_failure">فشل تثبيت البرامج الثابتة</string>
|
||||||
|
<string name="share_log">مشاركة سجلات التصحيح</string>
|
||||||
|
<string name="share_log_description">مشاركة ملف سجل يوزو لتصحيح المشكلات</string>
|
||||||
|
<string name="share_log_missing">لم يتم العثور على ملف السجل</string>
|
||||||
|
<string name="install_game_content">تثبيت محتوى اللعبة</string>
|
||||||
|
<string name="install_game_content_description">DLC قم بتثبيت تحديثات اللعبة أو</string>
|
||||||
|
<string name="installing_game_content">جارٍ تثبيت المحتوى</string>
|
||||||
|
<string name="install_game_content_failure_base">لا يُسمح بتثبيت الألعاب الأساسية لتجنب التعارضات المحتملة.</string>
|
||||||
|
<string name="install_game_content_success_install">%1$d تم التثبيت بنجاح</string>
|
||||||
|
<string name="install_game_content_success_overwrite">%1$d تمت الكتابة فوقه بنجاح</string>
|
||||||
|
<string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>
|
||||||
|
<string name="custom_driver_not_supported">برامج التشغيل المخصصة غير مدعومة</string>
|
||||||
|
<string name="custom_driver_not_supported_description">تحميل برنامج التشغيل المخصص غير معتمد حاليًا لهذا الجهاز.\nحدد هذا الخيار مرة أخرى في المستقبل لمعرفة ما إذا تمت إضافة الدعم!</string>
|
||||||
|
<string name="manage_yuzu_data">إدارة بيانات يوزو</string>
|
||||||
|
<string name="manage_yuzu_data_description">استيراد/تصدير البرامج الثابتة والمفاتيح وبيانات المستخدم والمزيد!</string>
|
||||||
|
<string name="share_save_file">مشاركة ملف الحفظ</string>
|
||||||
|
<string name="export_save_failed">فشل تصدير الحفظ</string>
|
||||||
|
|
||||||
|
<string name="copied_to_clipboard">نسخ إلى الحافظة</string>
|
||||||
|
<string name="about_app_description">محاكي سويتش مفتوح المصدر</string>
|
||||||
|
<string name="contributors">المساهمين</string>
|
||||||
|
<string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
|
||||||
|
<string name="licenses_description">المشاريع التي تجعل تطبيق يوزو لنظام أندرويد ممكنًا</string>
|
||||||
|
<string name="build">البناء</string>
|
||||||
|
<string name="user_data">بيانات المستخدم</string>
|
||||||
|
<string name="exporting_user_data">جارٍ تصدير بيانات المستخدم</string>
|
||||||
|
<string name="importing_user_data">جارٍ استيراد بيانات المستخدم</string>
|
||||||
|
<string name="import_user_data">استيراد بيانات المستخدم</string>
|
||||||
|
<string name="invalid_yuzu_backup">نسخة احتياطية يوزو غير صالحة</string>
|
||||||
|
<string name="user_data_export_success">تم تصدير بيانات المستخدم بنجاح</string>
|
||||||
|
<string name="user_data_import_success">تم استيراد بيانات المستخدم بنجاح</string>
|
||||||
|
<string name="user_data_export_cancelled">تم إلغاء التصدير</string>
|
||||||
|
<string name="support_link">https://discord.gg/u77vRWY</string>
|
||||||
|
<string name="website_link">https://yuzu-emu.org/</string>
|
||||||
|
<string name="github_link">https://github.com/yuzu-emu</string>
|
||||||
|
|
||||||
|
<!-- Early access upgrade strings -->
|
||||||
|
<string name="early_access">الوصول المبكر</string>
|
||||||
|
<string name="get_early_access">احصل على الوصول المبكر</string>
|
||||||
|
<string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
|
||||||
|
<string name="get_early_access_description">الميزات المتطورة، والوصول المبكر إلى التحديثات، وأكثر من ذلك</string>
|
||||||
|
<string name="early_access_benefits">مزايا الوصول المبكر</string>
|
||||||
|
<string name="cutting_edge_features">ميزات متطورة</string>
|
||||||
|
<string name="early_access_updates">الوصول المبكر إلى التحديثات</string>
|
||||||
|
<string name="no_manual_installation">لا يوجد التثبيت اليدوي</string>
|
||||||
|
<string name="prioritized_support">الدعم ذو الأولوية</string>
|
||||||
|
<string name="helping_game_preservation">المساعدة في الحفاظ على اللعبة</string>
|
||||||
|
<string name="our_eternal_gratitude">امتناننا الأبدي</string>
|
||||||
|
<string name="are_you_interested">هل انت مهتم؟</string>
|
||||||
|
|
||||||
|
<!-- General settings strings -->
|
||||||
|
<string name="frame_limit_enable">الحد من السرعة</string>
|
||||||
|
<string name="frame_limit_enable_description">يحد من سرعة المحاكاة بنسبة محددة من السرعة العادية</string>
|
||||||
|
<string name="frame_limit_slider">الحد من السرعة في المئة</string>
|
||||||
|
<string name="frame_limit_slider_description">يحدد النسبة المئوية للحد من سرعة المحاكاة. 100% هي السرعة الطبيعية. ستؤدي القيم الأعلى أو الأدنى إلى زيادة أو تقليل حد السرعة.</string>
|
||||||
|
<string name="cpu_accuracy">دقة وحدة المعالجة المركزية</string>
|
||||||
|
<string name="value_with_units">%1$s%2$s</string>
|
||||||
|
|
||||||
|
<!-- System settings strings -->
|
||||||
|
<string name="use_docked_mode">وضع الإرساء</string>
|
||||||
|
<string name="use_docked_mode_description">زيادة الدقة، وانخفاض الأداء. يتم استخدام الوضع المحمول عند تعطيله، مما يؤدي إلى خفض الدقة وزيادة الأداء.</string>
|
||||||
|
<string name="emulated_region">المنطقة التي تمت محاكاتها</string>
|
||||||
|
<string name="emulated_language">لغة المحاكاه</string>
|
||||||
|
<string name="select_rtc_date">حدد التاريخ و الساعة في الوقت الحقيقي</string>
|
||||||
|
<string name="select_rtc_time">حدد وقت الساعة في الوقت الفعلي</string>
|
||||||
|
<string name="use_custom_rtc">ساعة مخصصة في الوقت الحقيقي</string>
|
||||||
|
<string name="use_custom_rtc_description">يسمح لك بتعيين ساعة مخصصة في الوقت الفعلي منفصلة عن وقت النظام الحالي لديك</string>
|
||||||
|
<string name="set_custom_rtc">تعيين ساعة مخصصة في الوقت الحقيقي</string>
|
||||||
|
|
||||||
|
<!-- Graphics settings strings -->
|
||||||
|
<string name="renderer_accuracy">مستوى الدقة</string>
|
||||||
|
<string name="renderer_resolution">(Handheld/Docked) الدقة</string>
|
||||||
|
<string name="renderer_vsync">VSync وضع</string>
|
||||||
|
<string name="renderer_screen_layout">الاتجاه</string>
|
||||||
|
<string name="renderer_aspect_ratio">تناسب الابعاد</string>
|
||||||
|
<string name="renderer_anti_aliasing">طريقة مكافحة التعرج</string>
|
||||||
|
<string name="renderer_asynchronous_shaders">استخدم تظليل غير متزامن</string>
|
||||||
|
<string name="renderer_asynchronous_shaders_description">يجمع التظليل بشكل غير متزامن، مما يقلل من التأتأة ولكنه قد يؤدي إلى حدوث بعض الأخطاء.</string>
|
||||||
|
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
|
||||||
|
<string name="renderer_reactive_flushing_description">تحسين دقة العرض في بعض الألعاب على حساب الأداء</string>
|
||||||
|
<string name="use_disk_shader_cache_description">يقلل من التأتأة عن طريق تخزين وتحميل التظليلات التي تم إنشاؤها محليًا.</string>
|
||||||
|
|
||||||
|
<!-- Debug settings strings -->
|
||||||
|
<string name="cpu">وحدة المعالج المركزية</string>
|
||||||
|
<string name="cpu_debug_mode">تصحيح أخطاء وحدة المعالجة المركزية</string>
|
||||||
|
<string name="cpu_debug_mode_description">يضع وحدة المعالجة المركزية في وضع التصحيح البطيء.</string>
|
||||||
|
<string name="gpu">GPU</string>
|
||||||
|
<string name="renderer_api">API</string>
|
||||||
|
<string name="renderer_debug">تصحيح الأخطاء الرسومية</string>
|
||||||
|
<string name="renderer_debug_description">يضبط واجهة برمجة تطبيقات الرسومات على وضع تصحيح الأخطاء البطيء.</string>
|
||||||
|
<string name="fastmem">Fastmem</string>
|
||||||
|
|
||||||
|
<!-- Audio settings strings -->
|
||||||
|
<string name="audio_output_engine">محرك الإخراج</string>
|
||||||
|
<string name="audio_volume">حجم</string>
|
||||||
|
<string name="audio_volume_description">يحدد حجم إخراج الصوت</string>
|
||||||
|
|
||||||
|
<!-- Miscellaneous -->
|
||||||
|
<string name="slider_default">افتراضي</string>
|
||||||
|
<string name="ini_saved">الإعدادات المحفوظة</string>
|
||||||
|
<string name="gameid_saved">الإعدادات المحفوظة لـ %1$s</string>
|
||||||
|
<string name="unimplemented_menu">القائمة غير المنفذة</string>
|
||||||
|
<string name="loading">جاري تحميل</string>
|
||||||
|
<string name="shutting_down">إيقاف تشغيل</string>
|
||||||
|
<string name="reset_setting_confirmation">هل تريد إعادة تعيين هذا الإعداد مرة أخرى إلى قيمته الافتراضية؟</string>
|
||||||
|
<string name="reset_to_default">إعادة تعيين إلى الافتراضي</string>
|
||||||
|
<string name="reset_all_settings">إعادة تعيين جميع الإعدادات؟</string>
|
||||||
|
<string name="reset_all_settings_description">سيتم إعادة تعيين كافة الإعدادات المتقدمة إلى تكوينها الافتراضي. هذا لا يمكن التراجع عنها.</string>
|
||||||
|
<string name="settings_reset">إعادة تعيين الأعدادات</string>
|
||||||
|
<string name="close">إغلاق</string>
|
||||||
|
<string name="learn_more">معرفة المزيد</string>
|
||||||
|
<string name="auto">تلقائي</string>
|
||||||
|
<string name="submit">إرسال</string>
|
||||||
|
<string name="string_null">قيمه خاليه</string>
|
||||||
|
<string name="string_import">استيراد</string>
|
||||||
|
<string name="export">تصدير</string>
|
||||||
|
<string name="export_failed">فشل التصدير</string>
|
||||||
|
<string name="import_failed">فشل الاستيراد</string>
|
||||||
|
<string name="cancelling">إلغاء</string>
|
||||||
|
|
||||||
|
<!-- GPU driver installation -->
|
||||||
|
<string name="select_gpu_driver">GPU حدد برنامج تشغيل</string>
|
||||||
|
<string name="select_gpu_driver_title">الحالي الخاص بك؟ GPU هل ترغب في استبدال برنامج تشغيل</string>
|
||||||
|
<string name="select_gpu_driver_install">تثبيت</string>
|
||||||
|
<string name="select_gpu_driver_default">افتراضي</string>
|
||||||
|
<string name="select_gpu_driver_use_default">يستخدم تعريف معالج الرسوميات الافتراضي</string>
|
||||||
|
<string name="select_gpu_driver_error">تم تحديد برنامج تشغيل غير صالح ، باستخدام النظام الافتراضي</string>
|
||||||
|
<string name="system_gpu_driver">تعريف معالج الرسوميات الخاص بالنظام</string>
|
||||||
|
<string name="installing_driver">جارٍ تثبيت برنامج التشغيل…</string>
|
||||||
|
|
||||||
|
<!-- Preferences Screen -->
|
||||||
|
<string name="preferences_settings">إعدادات</string>
|
||||||
|
<string name="preferences_general">عام</string>
|
||||||
|
<string name="preferences_system">النظام</string>
|
||||||
|
<string name="preferences_graphics">الرسوميات</string>
|
||||||
|
<string name="preferences_audio">الصوت</string>
|
||||||
|
<string name="preferences_theme">السمة واللون</string>
|
||||||
|
<string name="preferences_debug">تصحيح الأخطاء</string>
|
||||||
|
|
||||||
|
<!-- ROM loading errors -->
|
||||||
|
<string name="loader_error_encrypted">الخاص بك ROM تم تشفير</string>
|
||||||
|
<string name="loader_error_video_core">حدث خطأ أثناء تهيئة مركز الفيديو</string>
|
||||||
|
<string name="loader_error_invalid_format">ROM غير قادر على تحميل</string>
|
||||||
|
<string name="loader_error_file_not_found">غير موجود ROM ملف</string>
|
||||||
|
|
||||||
|
<!-- Emulation Menu -->
|
||||||
|
<string name="emulation_exit">الخروج من المحاكاة</string>
|
||||||
|
<string name="emulation_done">منجز</string>
|
||||||
|
<string name="emulation_fps_counter">عداد إطار/ثانية</string>
|
||||||
|
<string name="emulation_toggle_controls">تبديل عناصر التحكم</string>
|
||||||
|
<string name="emulation_rel_stick_center">مركز العصا النسبي</string>
|
||||||
|
<string name="emulation_dpad_slide">مزلاق أزرار الاتجاهات</string>
|
||||||
|
<string name="emulation_haptics">الاهتزازات الديناميكية</string>
|
||||||
|
<string name="emulation_show_overlay">عرض التراكب</string>
|
||||||
|
<string name="emulation_toggle_all">تبديل الكل</string>
|
||||||
|
<string name="emulation_control_adjust">ضبط التراكب</string>
|
||||||
|
<string name="emulation_control_scale">حجم</string>
|
||||||
|
<string name="emulation_control_opacity">العتامه</string>
|
||||||
|
<string name="emulation_touch_overlay_reset">إعادة تعيين التراكب</string>
|
||||||
|
<string name="emulation_touch_overlay_edit">تحرير التراكب</string>
|
||||||
|
<string name="emulation_pause">إيقاف المحاكاة مؤقتًا</string>
|
||||||
|
<string name="emulation_unpause">إلغاء الإيقاف المؤقت للمضاهاة</string>
|
||||||
|
<string name="emulation_input_overlay">خيارات التراكب</string>
|
||||||
|
|
||||||
|
<string name="load_settings">جارٍ تحميل الإعدادات</string>
|
||||||
|
|
||||||
|
<!-- Software keyboard -->
|
||||||
|
<string name="software_keyboard">لوحة المفاتيح البرمجية</string>
|
||||||
|
|
||||||
|
<!-- Errors and warnings -->
|
||||||
|
<string name="abort_button">إلغاء</string>
|
||||||
|
<string name="continue_button">استمر</string>
|
||||||
|
<string name="system_archive_not_found">لم يتم العثور على أرشيف النظام</string>
|
||||||
|
<string name="system_archive_general">أرشيف النظام</string>
|
||||||
|
<string name="save_load_error">خطأ في الحفظ/التحميل</string>
|
||||||
|
<string name="fatal_error">خطا فادح</string>
|
||||||
|
<string name="performance_warning">سيؤدي إيقاف تشغيل هذا الإعداد إلى تقليل أداء المحاكاة بشكل ملحوظ! للحصول على أفضل تجربة، يوصى بترك هذا الإعداد ممكنًا.</string>
|
||||||
|
<string name="memory_formatted">%1$s %2$s</string>
|
||||||
|
<string name="no_game_present">لا توجد لعبة قابلة للتمهيد</string>
|
||||||
|
|
||||||
|
<!-- Region Names -->
|
||||||
|
<string name="region_japan">اليابان</string>
|
||||||
|
<string name="region_usa">الولايات المتحدة الأمريكية</string>
|
||||||
|
<string name="region_europe">أوروبا</string>
|
||||||
|
<string name="region_australia">أستراليا</string>
|
||||||
|
<string name="region_china">الصين</string>
|
||||||
|
<string name="region_korea">كوريا</string>
|
||||||
|
<string name="region_taiwan">تايوان</string>
|
||||||
|
|
||||||
|
<!-- Memory Sizes -->
|
||||||
|
<string name="memory_byte">Byte</string>
|
||||||
|
<string name="memory_kilobyte">KB</string>
|
||||||
|
<string name="memory_megabyte">MB</string>
|
||||||
|
<string name="memory_gigabyte">GB</string>
|
||||||
|
<string name="memory_terabyte">TB</string>
|
||||||
|
<string name="memory_petabyte">PB</string>
|
||||||
|
<string name="memory_exabyte">EB</string>
|
||||||
|
|
||||||
|
<!-- Renderer APIs -->
|
||||||
|
<string name="renderer_vulkan">Vulkan</string>
|
||||||
|
<string name="renderer_none">لاشيء</string>
|
||||||
|
|
||||||
|
<!-- Renderer Accuracy -->
|
||||||
|
<string name="renderer_accuracy_normal">عادي</string>
|
||||||
|
<string name="renderer_accuracy_high">عالي</string>
|
||||||
|
<string name="renderer_accuracy_extreme">Extreme (بطيء)</string>
|
||||||
|
|
||||||
|
<!-- Resolutions -->
|
||||||
|
<string name="resolution_half">0.5X (360p/540p)</string>
|
||||||
|
<string name="resolution_three_quarter">0.75X (540p/810p)</string>
|
||||||
|
<string name="resolution_one">1X (720p/1080p)</string>
|
||||||
|
<string name="resolution_two">2X (1440p/2160p) (بطيء)</string>
|
||||||
|
<string name="resolution_three">3X (2160p/3240p) (بطيء)</string>
|
||||||
|
<string name="resolution_four">4X (2880p/4320p) (بطيء)</string>
|
||||||
|
|
||||||
|
<!-- Renderer VSync -->
|
||||||
|
<string name="renderer_vsync_immediate">Immediate (Off)</string>
|
||||||
|
<string name="renderer_vsync_mailbox">Mailbox</string>
|
||||||
|
<string name="renderer_vsync_fifo">FIFO (On)</string>
|
||||||
|
<string name="renderer_vsync_fifo_relaxed">FIFO Relaxed</string>
|
||||||
|
|
||||||
|
<!-- Scaling Filters -->
|
||||||
|
<string name="scaling_filter_nearest_neighbor">Nearest Neighbor</string>
|
||||||
|
<string name="scaling_filter_bilinear">Bilinear</string>
|
||||||
|
<string name="scaling_filter_bicubic">Bicubic</string>
|
||||||
|
<string name="scaling_filter_gaussian">Gaussian</string>
|
||||||
|
<string name="scaling_filter_scale_force">ScaleForce</string>
|
||||||
|
<string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
|
||||||
|
|
||||||
|
<!-- Anti-Aliasing -->
|
||||||
|
<string name="anti_aliasing_none">لا شيء</string>
|
||||||
|
<string name="anti_aliasing_fxaa">FXAA</string>
|
||||||
|
<string name="anti_aliasing_smaa">SMAA</string>
|
||||||
|
|
||||||
|
<!-- Screen Layouts -->
|
||||||
|
<string name="screen_layout_landscape">افقي</string>
|
||||||
|
<string name="screen_layout_portrait">عمودي</string>
|
||||||
|
<string name="screen_layout_auto">تلقائي</string>
|
||||||
|
|
||||||
|
<!-- Aspect Ratios -->
|
||||||
|
<string name="ratio_default">(16:9) افتراضي</string>
|
||||||
|
<string name="ratio_force_four_three">4:3 فرض</string>
|
||||||
|
<string name="ratio_force_twenty_one_nine">21:9 فرض</string>
|
||||||
|
<string name="ratio_force_sixteen_ten">16:10 فرض</string>
|
||||||
|
<string name="ratio_stretch">تمتد إلى النافذة</string>
|
||||||
|
|
||||||
|
<!-- CPU Accuracy -->
|
||||||
|
<string name="cpu_accuracy_accurate">دقه</string>
|
||||||
|
<string name="cpu_accuracy_unsafe">غير آمن</string>
|
||||||
|
<string name="cpu_accuracy_paranoid">Paranoid (Slow)</string>
|
||||||
|
|
||||||
|
<!-- Gamepad Buttons -->
|
||||||
|
<string name="gamepad_d_pad">أزرار الاتجاهات</string>
|
||||||
|
<string name="gamepad_left_stick">العصا اليسرى</string>
|
||||||
|
<string name="gamepad_right_stick">العصا اليمنى</string>
|
||||||
|
<string name="gamepad_home">شاشة الإستقبال</string>
|
||||||
|
<string name="gamepad_screenshot">لقطة شاشة</string>
|
||||||
|
|
||||||
|
<!-- Disk shader cache -->
|
||||||
|
<string name="preparing_shaders">تحضير التظليل</string>
|
||||||
|
<string name="building_shaders">بناء التظليل</string>
|
||||||
|
|
||||||
|
<!-- Theme options -->
|
||||||
|
<string name="change_app_theme">تغيير سمة التطبيق</string>
|
||||||
|
<string name="theme_default">افتراضي</string>
|
||||||
|
<string name="theme_material_you">Material You</string>
|
||||||
|
|
||||||
|
<!-- Theme Modes -->
|
||||||
|
<string name="change_theme_mode">تغيير وضع السمة</string>
|
||||||
|
<string name="theme_mode_follow_system">اتبع النظام</string>
|
||||||
|
<string name="theme_mode_light">فاتح</string>
|
||||||
|
<string name="theme_mode_dark">غامق</string>
|
||||||
|
|
||||||
|
<!-- Audio output engines -->
|
||||||
|
<string name="cubeb">cubeb</string>
|
||||||
|
|
||||||
|
<!-- Black backgrounds theme -->
|
||||||
|
<string name="use_black_backgrounds">خلفيات سوداء</string>
|
||||||
|
<string name="use_black_backgrounds_description">عند استخدام المظهر الداكن، قم بتطبيق خلفيات سوداء.</string>
|
||||||
|
|
||||||
|
<!-- Picture-In-Picture -->
|
||||||
|
<string name="picture_in_picture">صورة داخل صورة</string>
|
||||||
|
<string name="picture_in_picture_description">تصغير النافذة عند وضعها في الخلفية</string>
|
||||||
|
<string name="pause">توقف</string>
|
||||||
|
<string name="play">تشغيل</string>
|
||||||
|
<string name="mute">كتم</string>
|
||||||
|
<string name="unmute">إلغاء الكتم</string>
|
||||||
|
|
||||||
|
<!-- Licenses screen strings -->
|
||||||
|
<string name="licenses">التراخيص</string>
|
||||||
|
<string name="license_fidelityfx_fsr_description">AMD ترقية عالية الجودة من</string>
|
||||||
|
</resources>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue