mirror of
https://github.com/azahar-emu/azahar.git
synced 2026-06-06 02:33:44 -04:00
Compare commits
51 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
379649dbce | ||
|
|
c03248f158 | ||
|
|
4867bb2e2b | ||
|
|
4e4c7e687b | ||
|
|
56f738eb06 | ||
|
|
b1e537a485 | ||
|
|
59da460177 | ||
|
|
8bdb60a6e1 | ||
|
|
383a28795e | ||
|
|
725544f3b4 | ||
|
|
135f10320a | ||
|
|
0b7114cbf8 | ||
|
|
95d42cb40a | ||
|
|
f0bc64d967 | ||
|
|
ad8526c4cf | ||
|
|
ae7d7dca1f | ||
|
|
4a4b75b0de | ||
|
|
b186b04995 | ||
|
|
ab6896a2ca | ||
|
|
e11f3da493 | ||
|
|
8ffb94b06c | ||
|
|
267887d7a9 | ||
|
|
778ca369cd | ||
|
|
dbe7fd979f | ||
|
|
1c7c7a5f1b | ||
|
|
bf59d26c48 | ||
|
|
652fc02175 | ||
|
|
854e198196 | ||
|
|
5ecd402811 | ||
|
|
0ce2a30d20 | ||
|
|
644a181aff | ||
|
|
422c7865a3 | ||
|
|
ca99574700 | ||
|
|
f902010f04 | ||
|
|
929a51afc6 | ||
|
|
260f08c497 | ||
|
|
921ea178b9 | ||
|
|
b540725090 | ||
|
|
5ddbaeae23 | ||
|
|
b081f800a4 | ||
|
|
76a71d76d4 | ||
|
|
83eef0012e | ||
|
|
ec6a0dd1c8 | ||
|
|
eb498e5ecd | ||
|
|
4fa793b945 | ||
|
|
5d84dfed91 | ||
|
|
eee7f076ee | ||
|
|
996abd1eaf | ||
|
|
91128d6625 | ||
|
|
37b6c91de6 | ||
|
|
b6c54ac8c7 |
166 changed files with 14770 additions and 9361 deletions
|
|
@ -12,9 +12,9 @@ fi
|
|||
|
||||
echo "Tag name is: $TAG_NAME"
|
||||
|
||||
docker build -f docker/azahar-room/Dockerfile -t azahar-room:$TAG_NAME .
|
||||
docker build --no-cache -f docker/azahar-room/Dockerfile -t azahar-room:$TAG_NAME .
|
||||
mkdir -p build
|
||||
FILENAME="azahar-room-$TAG_NAME.dockerimage"
|
||||
FILENAME="azahar-room-$TARGET-$TAG_NAME.dockerimage"
|
||||
docker save azahar-room:$TAG_NAME > build/$FILENAME
|
||||
|
||||
echo "DOCKER_IMAGE_PATH=artifacts/$FILENAME" >> $GITHUB_ENV
|
||||
echo "DOCKER_IMAGE_PATH=artifacts/$FILENAME" >> $GITHUB_ENV
|
||||
|
|
|
|||
26
.ci/mxe.sh
Executable file
26
.ci/mxe.sh
Executable file
|
|
@ -0,0 +1,26 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
# TODO: Why doesn't the CI environment use the PATH set in the Dockerimage?
|
||||
# It works fine when using the image locally.
|
||||
export PATH="/mxe/usr/bin:${PATH}"
|
||||
|
||||
mkdir build && cd build
|
||||
|
||||
if [ "$GITHUB_REF_TYPE" == "tag" ]; then
|
||||
export EXTRA_CMAKE_FLAGS=(-DENABLE_QT_UPDATE_CHECKER=ON)
|
||||
fi
|
||||
|
||||
x86_64-w64-mingw32.shared-cmake .. \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DENABLE_QT_TRANSLATION=ON \
|
||||
-DUSE_DISCORD_PRESENCE=ON \
|
||||
-DUSE_SYSTEM_BOOST=ON \
|
||||
-DUSE_SYSTEM_CRYPTOPP=ON \
|
||||
"${EXTRA_CMAKE_FLAGS[@]}"
|
||||
x86_64-w64-mingw32.shared-cmake --build . -- -j$(nproc)
|
||||
x86_64-w64-mingw32.shared-strip -s bin/Release/*.exe
|
||||
make bundle
|
||||
|
||||
ccache -s -v
|
||||
|
|
@ -36,10 +36,10 @@ function pack_artifacts() {
|
|||
fi
|
||||
|
||||
# Create .zip/.tar.gz
|
||||
if [ "$OS" = "windows" ]; then
|
||||
if [ "$OS" = "windows" ] && [ "$TARGET" != "mxe" ]; then
|
||||
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.zip"
|
||||
powershell Compress-Archive "$REV_NAME" "$ARCHIVE_FULL_NAME"
|
||||
elif [ "$OS" = "android" ] || [ "$OS" = "macos" ]; then
|
||||
elif [ "$OS" = "android" ] || [ "$OS" = "macos" ] || [ "$TARGET" = "mxe" ]; then
|
||||
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.zip"
|
||||
zip -r "$ARCHIVE_FULL_NAME" "$REV_NAME"
|
||||
else
|
||||
|
|
|
|||
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
|
@ -1,4 +1,5 @@
|
|||
- [ ] I have read the [Azahar AI Policy document](https://github.com/azahar-emu/azahar/blob/master/AI-POLICY.md) and have disclosed any use of AI if applicable under those terms.
|
||||
---------
|
||||
|
||||
---
|
||||
<!--
|
||||
|
|
|
|||
93
.github/workflows/build.yml
vendored
93
.github/workflows/build.yml
vendored
|
|
@ -17,7 +17,7 @@ jobs:
|
|||
if: ${{ !github.head_ref }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Pack
|
||||
|
|
@ -31,7 +31,7 @@ jobs:
|
|||
output-file: artifacts/source.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: source
|
||||
path: artifacts/
|
||||
|
|
@ -61,13 +61,13 @@ jobs:
|
|||
SHOULD_RUN: ${{ (matrix.target != 'appimage-wayland' || github.ref_type == 'tag') }}
|
||||
CACHE_ENABLED: ${{ github.ref_type != 'tag' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
if: ${{ env.SHOULD_RUN == 'true' }}
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
if: ${{ env.SHOULD_RUN == 'true' && env.CACHE_ENABLED == 'true' }}
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ github.job }}-${{ matrix.target }}-${{ github.sha }}
|
||||
|
|
@ -95,7 +95,7 @@ jobs:
|
|||
upload-artifact: false
|
||||
- name: Upload
|
||||
if: ${{ contains(matrix.target, 'appimage') && env.SHOULD_RUN == 'true' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ github.job }}-${{ matrix.target }}
|
||||
path: artifacts/
|
||||
|
|
@ -123,11 +123,11 @@ jobs:
|
|||
OS: linux
|
||||
TARGET: ${{ matrix.target }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ github.job }}-${{ matrix.target }}-${{ github.sha }}
|
||||
|
|
@ -145,12 +145,12 @@ jobs:
|
|||
CACHE_ENABLED: ${{ github.ref_type != 'tag' }}
|
||||
OS: macos
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
if: ${{ env.CACHE_ENABLED == 'true' }}
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ github.sha }}
|
||||
|
|
@ -183,7 +183,7 @@ jobs:
|
|||
output-file: artifacts/macos.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ env.OS }}
|
||||
path: artifacts/
|
||||
|
|
@ -196,11 +196,21 @@ jobs:
|
|||
sbom-path: artifacts/macos.spdx.json
|
||||
|
||||
windows:
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target: ["msvc", "msys2"]
|
||||
include:
|
||||
- target: msvc
|
||||
os: windows-latest
|
||||
- target: msys2
|
||||
os: windows-latest
|
||||
- target: mxe
|
||||
os: ubuntu-latest
|
||||
container:
|
||||
image: opensauce04/azahar-build-environment:latest
|
||||
options: -u 1001
|
||||
runs-on: ${{ matrix.os }}
|
||||
container: ${{ matrix.container }}
|
||||
defaults:
|
||||
run:
|
||||
shell: ${{ (matrix.target == 'msys2' && 'msys2') || 'bash' }} {0}
|
||||
|
|
@ -212,12 +222,12 @@ jobs:
|
|||
OS: windows
|
||||
TARGET: ${{ matrix.target }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
if: ${{ env.CACHE_ENABLED == 'true' }}
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}
|
||||
|
|
@ -225,7 +235,7 @@ jobs:
|
|||
${{ runner.os }}-${{ matrix.target }}-
|
||||
- name: Set up MSVC
|
||||
if: ${{ matrix.target == 'msvc' }}
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
uses: azahar-emu/msvc-dev-cmd@v1
|
||||
- name: Install extra tools (MSVC)
|
||||
if: ${{ matrix.target == 'msvc' }}
|
||||
run: choco install ccache ninja ptime wget
|
||||
|
|
@ -246,27 +256,39 @@ jobs:
|
|||
qt6-base:p qt6-multimedia:p qt6-multimedia-wmf:p qt6-tools:p qt6-translations:p
|
||||
- name: Install extra tools (MSYS2)
|
||||
if: ${{ matrix.target == 'msys2' }}
|
||||
uses: crazy-max/ghaction-chocolatey@v3
|
||||
uses: crazy-max/ghaction-chocolatey@v4
|
||||
with:
|
||||
args: install ptime wget
|
||||
- name: Install NSIS
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
if: ${{ github.ref_type == 'tag' && matrix.target != 'mxe' }}
|
||||
run: |
|
||||
wget https://download.sourceforge.net/project/nsis/NSIS%203/3.11/nsis-3.11-setup.exe -O D:/a/_temp/nsis-setup.exe
|
||||
ptime D:/a/_temp/nsis-setup.exe /S
|
||||
shell: pwsh
|
||||
- name: Disable line ending translation
|
||||
run: git config --global core.autocrlf input
|
||||
- name: Build
|
||||
- name: Build (Native)
|
||||
if: ${{ matrix.target != 'mxe' }}
|
||||
run: ./.ci/windows.sh
|
||||
- name: Generate installer
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
- name: Build (MXE)
|
||||
if: ${{ matrix.target == 'mxe' }}
|
||||
run: ./.ci/mxe.sh
|
||||
- name: Generate installer (Native)
|
||||
if: ${{ github.ref_type == 'tag' && matrix.target != 'mxe' }}
|
||||
run: |
|
||||
cd src\installer
|
||||
"C:\Program Files (x86)\NSIS\makensis.exe" /DPRODUCT_VARIANT=${{ matrix.target }} /DPRODUCT_VERSION=${{ github.ref_name }} citra.nsi
|
||||
mkdir ..\..\artifacts 2> NUL
|
||||
move /y *.exe ..\..\artifacts\
|
||||
shell: cmd
|
||||
- name: Generate installer (MXE)
|
||||
if: ${{ github.ref_type == 'tag' && matrix.target == 'mxe' }}
|
||||
run: |
|
||||
export PATH="/mxe/usr/bin:${PATH}" # TODO: Why do we have to do this if it's in the image?
|
||||
cd src/installer
|
||||
x86_64-w64-mingw32.shared-makensis -DPRODUCT_VARIANT=${{ matrix.target }} -DPRODUCT_VERSION=${{ github.ref_name }} citra.nsi
|
||||
mkdir -p ../../artifacts
|
||||
mv ./*.exe ../../artifacts/
|
||||
- name: Pack
|
||||
run: ./.ci/pack.sh
|
||||
- name: Generate SBOM
|
||||
|
|
@ -278,7 +300,7 @@ jobs:
|
|||
output-file: artifacts/windows-${{ matrix.target }}.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: artifacts/
|
||||
|
|
@ -306,13 +328,13 @@ jobs:
|
|||
TARGET: ${{ matrix.target }}
|
||||
SHOULD_RUN: ${{ (matrix.target == 'vanilla' || github.ref_type == 'tag') }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
if: ${{ env.SHOULD_RUN == 'true' }}
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
if: ${{ env.SHOULD_RUN == 'true' && env.CACHE_ENABLED == 'true' }}
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
|
|
@ -360,7 +382,7 @@ jobs:
|
|||
upload-artifact: false
|
||||
- name: Upload
|
||||
if: ${{ env.SHOULD_RUN == 'true' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: src/android/app/artifacts/
|
||||
|
|
@ -374,15 +396,24 @@ jobs:
|
|||
sbom-path: src/android/app/artifacts/android-${{ matrix.target }}.spdx.json
|
||||
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- target: x86_64
|
||||
os: ubuntu-24.04
|
||||
- target: arm64
|
||||
os: ubuntu-24.04-arm
|
||||
runs-on: ${{ matrix.os }}
|
||||
container:
|
||||
image: docker:dind
|
||||
# Can't use docker:dind for ARM64 because it's Alpine-based, see https://github.com/actions/upload-artifact/issues/739
|
||||
image: earthbuild/dind:ubuntu-24.04-docker-28.5.2-1
|
||||
env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install tools
|
||||
run: apk add bash
|
||||
- name: Fix git ownership
|
||||
run: git config --global --add safe.directory .
|
||||
- name: Build Docker image
|
||||
|
|
@ -400,9 +431,9 @@ jobs:
|
|||
output-file: artifacts/docker-room.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: docker
|
||||
name: docker-${{ env.TARGET }}
|
||||
path: artifacts/
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ jobs:
|
|||
(github.event.pull_request.author_association != 'OWNER')
|
||||
steps:
|
||||
- name: Detect PR if author is first-time contributor
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
script: |
|
||||
const { owner, repo } = context.repo;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ jobs:
|
|||
if: github.event.issue.pull_request && contains(github.event.issue.labels.*.name, 'needs verification')
|
||||
steps:
|
||||
- name: Verify and reopen PR
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
script: |
|
||||
const { owner, repo } = context.repo;
|
||||
|
|
|
|||
2
.github/workflows/format.yml
vendored
2
.github/workflows/format.yml
vendored
|
|
@ -13,7 +13,7 @@ jobs:
|
|||
image: opensauce04/azahar-build-environment:latest
|
||||
options: -u 1001
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Build
|
||||
|
|
|
|||
25
.github/workflows/libretro.yml
vendored
25
.github/workflows/libretro.yml
vendored
|
|
@ -28,7 +28,7 @@ jobs:
|
|||
BUILD_DIR: build/android-arm64-v8a
|
||||
EXTRA_PATH: bin/Release
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set tag name
|
||||
|
|
@ -62,7 +62,7 @@ jobs:
|
|||
output-file: libretro-android.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: |
|
||||
|
|
@ -85,7 +85,7 @@ jobs:
|
|||
EXTRA_PATH: bin/Release
|
||||
EXTRA_CORE_ARGS: -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DENABLE_LTO=OFF
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install tools
|
||||
|
|
@ -108,7 +108,7 @@ jobs:
|
|||
output-file: libretro-linux.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: |
|
||||
|
|
@ -133,7 +133,7 @@ jobs:
|
|||
IMAGE: reallibretroretroarch/libretro-build-mxe-win-cross-cores:mingw12
|
||||
EXTRA_PATH: bin/Release
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Build in cross-container
|
||||
|
|
@ -158,7 +158,7 @@ jobs:
|
|||
output-file: libretro-windows.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: |
|
||||
|
|
@ -174,6 +174,7 @@ jobs:
|
|||
macos:
|
||||
runs-on: macos-26
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target: ["x86_64", "arm64"]
|
||||
env:
|
||||
|
|
@ -183,7 +184,7 @@ jobs:
|
|||
BUILD_DIR: build/osx-${{ matrix.target }}
|
||||
EXTRA_PATH: bin/Release
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install tools
|
||||
|
|
@ -204,7 +205,7 @@ jobs:
|
|||
output-file: libretro-macos-${{ matrix.target }}.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: |
|
||||
|
|
@ -227,7 +228,7 @@ jobs:
|
|||
EXTRA_PATH: bin/Release
|
||||
EXTRA_CORE_ARGS: -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_C_FLAGS=-DIOS -DCMAKE_CXX_FLAGS=-DIOS -DIOS=ON -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCITRA_USE_PRECOMPILED_HEADERS=OFF -DCMAKE_OSX_ARCHITECTURES=arm64 -DENABLE_OPT=OFF
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Build
|
||||
|
|
@ -246,7 +247,7 @@ jobs:
|
|||
output-file: libretro-ios.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: |
|
||||
|
|
@ -269,7 +270,7 @@ jobs:
|
|||
EXTRA_PATH: bin/Release
|
||||
EXTRA_CORE_ARGS: -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_C_FLAGS=-DIOS -DCMAKE_CXX_FLAGS=-DIOS -DIOS=ON -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 -DCITRA_USE_PRECOMPILED_HEADERS=OFF -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_ARCHITECTURES=arm64 -DENABLE_OPT=OFF
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Build
|
||||
|
|
@ -288,7 +289,7 @@ jobs:
|
|||
output-file: libretro-tvos.spdx.json
|
||||
upload-artifact: false
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: |
|
||||
|
|
|
|||
2
.github/workflows/license-header.yml
vendored
2
.github/workflows/license-header.yml
vendored
|
|
@ -11,7 +11,7 @@ jobs:
|
|||
image: opensauce04/azahar-build-environment:latest
|
||||
options: -u 1001
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Fetch master branch
|
||||
|
|
|
|||
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
|||
permissions:
|
||||
issues: write
|
||||
steps:
|
||||
- uses: actions/stale@v9.1.0
|
||||
- uses: actions/stale@v10.2.0
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
days-before-issue-stale: 90
|
||||
|
|
|
|||
4
.github/workflows/transifex.yml
vendored
4
.github/workflows/transifex.yml
vendored
|
|
@ -7,10 +7,10 @@ on:
|
|||
jobs:
|
||||
transifex:
|
||||
runs-on: ubuntu-latest
|
||||
container: opensauce04/azahar-build-environment:transifex
|
||||
container: opensauce04/azahar-build-environment:latest
|
||||
if: ${{ github.repository == 'azahar-emu/azahar' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
|
|
|
|||
14
.gitmodules
vendored
14
.gitmodules
vendored
|
|
@ -55,18 +55,12 @@
|
|||
[submodule "sdl2"]
|
||||
path = externals/sdl2/SDL
|
||||
url = https://github.com/libsdl-org/SDL
|
||||
[submodule "cryptopp-cmake"]
|
||||
path = externals/cryptopp-cmake
|
||||
url = https://github.com/abdes/cryptopp-cmake.git
|
||||
[submodule "cryptopp"]
|
||||
path = externals/cryptopp
|
||||
url = https://github.com/weidai11/cryptopp.git
|
||||
[submodule "dds-ktx"]
|
||||
path = externals/dds-ktx
|
||||
url = https://github.com/septag/dds-ktx
|
||||
[submodule "openal-soft"]
|
||||
path = externals/openal-soft
|
||||
url = https://github.com/kcat/openal-soft
|
||||
url = https://github.com/azahar-emu/openal-soft
|
||||
[submodule "glslang"]
|
||||
path = externals/glslang
|
||||
url = https://github.com/KhronosGroup/glslang
|
||||
|
|
@ -106,3 +100,9 @@
|
|||
[submodule "externals/libretro-common"]
|
||||
path = externals/libretro-common/libretro-common
|
||||
url = https://github.com/libretro/libretro-common.git
|
||||
[submodule "dllwalker"]
|
||||
path = externals/dllwalker
|
||||
url = https://github.com/azahar-emu/dllwalker
|
||||
[submodule "externals/cryptopp"]
|
||||
path = externals/cryptopp
|
||||
url = https://github.com/cryptopp-modern/cryptopp-modern.git
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@ cmake_policy(SET CMP0063 NEW)
|
|||
cmake_policy(SET CMP0127 NEW)
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
|
||||
|
||||
# Prefer building bundled dependencies as static instead of shared
|
||||
set(BUILD_SHARED_LIBS OFF)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
||||
include(DownloadExternals)
|
||||
|
|
@ -25,6 +28,11 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
|||
enable_language(OBJC OBJCXX)
|
||||
endif()
|
||||
|
||||
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND MINGW)
|
||||
string(TOLOWER ${LIBTYPE} LIBTYPE_LOWER)
|
||||
set(CMAKE_AR x86_64-w64-mingw32.${LIBTYPE_LOWER}-gcc-ar)
|
||||
endif()
|
||||
|
||||
if (BSD STREQUAL "OpenBSD")
|
||||
add_link_options(-z wxneeded)
|
||||
endif()
|
||||
|
|
@ -99,7 +107,7 @@ endif()
|
|||
|
||||
# Track which options were explicitly set by the user (for libretro conflict detection)
|
||||
set(_LIBRETRO_INCOMPATIBLE_OPTIONS
|
||||
ENABLE_SDL2 ENABLE_QT ENABLE_WEB_SERVICE ENABLE_SCRIPTING
|
||||
ENABLE_SDL2 ENABLE_QT ENABLE_WEB_SERVICE ENABLE_SCRIPTING ENABLE_GDBSTUB
|
||||
ENABLE_OPENAL ENABLE_ROOM ENABLE_ROOM_STANDALONE ENABLE_CUBEB ENABLE_LIBUSB)
|
||||
set(_USER_SET_OPTIONS "")
|
||||
foreach(_opt IN LISTS _LIBRETRO_INCOMPATIBLE_OPTIONS)
|
||||
|
|
@ -122,6 +130,7 @@ CMAKE_DEPENDENT_OPTION(ENABLE_ROOM_STANDALONE "Enable generating a standalone de
|
|||
|
||||
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
||||
option(ENABLE_SCRIPTING "Enable RPC server for scripting" ON)
|
||||
option(ENABLE_GDBSTUB "Enable GDB stub for emulated applications" ON)
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_CUBEB "Enables the cubeb audio backend" ON "NOT IOS" OFF)
|
||||
option(ENABLE_OPENAL "Enables the OpenAL audio backend" ON)
|
||||
|
|
@ -402,13 +411,21 @@ if (APPLE)
|
|||
endif()
|
||||
find_library(AVFOUNDATION_LIBRARY AVFoundation REQUIRED)
|
||||
find_library(IOSURFACE_LIBRARY IOSurface REQUIRED)
|
||||
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${AVFOUNDATION_LIBRARY} ${IOSURFACE_LIBRARY} ${MOLTENVK_LIBRARY})
|
||||
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${AVFOUNDATION_LIBRARY} ${IOSURFACE_LIBRARY})
|
||||
|
||||
if (ENABLE_VULKAN AND NOT ENABLE_LIBRETRO)
|
||||
if (NOT USE_SYSTEM_MOLTENVK)
|
||||
if (USE_SYSTEM_MOLTENVK)
|
||||
find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
|
||||
else()
|
||||
download_moltenvk()
|
||||
if (IOS)
|
||||
set(MOLTENVK_RELATIVE_LIBPATH "static/MoltenVK.xcframework/ios-arm64/libMoltenVK.a")
|
||||
else()
|
||||
set(MOLTENVK_RELATIVE_LIBPATH "dynamic/dylib/macOS/libMoltenVK.dylib")
|
||||
endif()
|
||||
set(MOLTENVK_LIBRARY "${CMAKE_BINARY_DIR}/externals/MoltenVK/MoltenVK/${MOLTENVK_RELATIVE_LIBPATH}")
|
||||
endif()
|
||||
find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
|
||||
|
||||
message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.")
|
||||
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} ${MOLTENVK_LIBRARY})
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -198,6 +198,10 @@ if (BUNDLE_TARGET_EXECUTE)
|
|||
|
||||
# On Linux, always bundle an AppImage.
|
||||
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
|
||||
if (IS_MINGW)
|
||||
return()
|
||||
endif()
|
||||
|
||||
if (IN_PLACE)
|
||||
message(FATAL_ERROR "Cannot bundle for Linux in-place.")
|
||||
endif()
|
||||
|
|
@ -273,15 +277,23 @@ else()
|
|||
|
||||
# On Linux, add a command to prepare linuxdeploy and any required plugins before any bundling occurs.
|
||||
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
"-DBUNDLE_TARGET_DOWNLOAD_LINUXDEPLOY=1"
|
||||
"-DLINUXDEPLOY_PATH=${CMAKE_BINARY_DIR}/externals/linuxdeploy"
|
||||
"-DLINUXDEPLOY_ARCH=${CMAKE_HOST_SYSTEM_PROCESSOR}"
|
||||
-P "${CMAKE_SOURCE_DIR}/CMakeModules/BundleTarget.cmake"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
||||
POST_BUILD)
|
||||
if (MINGW)
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
# The target here is arbitrary
|
||||
COMMAND cp -r "$<TARGET_FILE_DIR:citra_meta>/*" "${CMAKE_BINARY_DIR}/bundle/"
|
||||
POST_BUILD)
|
||||
else()
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
"-DBUNDLE_TARGET_DOWNLOAD_LINUXDEPLOY=1"
|
||||
"-DLINUXDEPLOY_PATH=${CMAKE_BINARY_DIR}/externals/linuxdeploy"
|
||||
"-DLINUXDEPLOY_ARCH=${CMAKE_HOST_SYSTEM_PROCESSOR}"
|
||||
-P "${CMAKE_SOURCE_DIR}/CMakeModules/BundleTarget.cmake"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
||||
POST_BUILD)
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
|
|
@ -293,6 +305,11 @@ else()
|
|||
create_base_bundle_target()
|
||||
endif()
|
||||
|
||||
if (CMAKE_HOST_SYSTEM STREQUAL "Linux" AND MINGW)
|
||||
# We don't really need to "bundle" MXE builds, so don't do anything
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(bundle_executable_path "$<TARGET_FILE:${target_name}>")
|
||||
if (bundle_qt AND APPLE)
|
||||
# For Qt targets on Apple, expect an app bundle.
|
||||
|
|
@ -331,6 +348,7 @@ else()
|
|||
"-DBUNDLE_LIBRARY_PATHS=\"${bundle_library_paths}\""
|
||||
"-DBUNDLE_QT=${bundle_qt}"
|
||||
"-DIN_PLACE=${in_place}"
|
||||
"-DIS_MINGW=${MINGW}"
|
||||
"-DLINUXDEPLOY=${CMAKE_BINARY_DIR}/externals/linuxdeploy/squashfs-root/AppRun"
|
||||
-P "${CMAKE_SOURCE_DIR}/CMakeModules/BundleTarget.cmake"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||
|
|
|
|||
|
|
@ -171,15 +171,8 @@ function(download_qt target)
|
|||
endfunction()
|
||||
|
||||
function(download_moltenvk)
|
||||
if (IOS)
|
||||
set(MOLTENVK_PLATFORM "static/MoltenVK.xcframework/ios-arm64")
|
||||
else()
|
||||
set(MOLTENVK_PLATFORM "dynamic/dylib/macOS")
|
||||
endif()
|
||||
|
||||
set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK")
|
||||
set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar")
|
||||
if (NOT EXISTS ${MOLTENVK_DIR})
|
||||
if (NOT EXISTS "${CMAKE_BINARY_DIR}/externals/MoltenVK")
|
||||
if (NOT EXISTS ${MOLTENVK_TAR})
|
||||
file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/v1.2.9/MoltenVK-all.tar
|
||||
${MOLTENVK_TAR} SHOW_PROGRESS)
|
||||
|
|
@ -188,10 +181,6 @@ function(download_moltenvk)
|
|||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
|
||||
endif()
|
||||
|
||||
# Add the MoltenVK library path to the prefix so find_library can locate it.
|
||||
list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/${MOLTENVK_PLATFORM}")
|
||||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(get_external_prefix lib_name prefix_var)
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ foreach(KEY IN ITEMS
|
|||
"use_virtual_sd"
|
||||
"use_custom_storage"
|
||||
"compress_cia_installs"
|
||||
"async_fs_operations"
|
||||
"region_value"
|
||||
"init_clock"
|
||||
"init_time"
|
||||
|
|
@ -48,6 +49,7 @@ foreach(KEY IN ITEMS
|
|||
"texture_filter"
|
||||
"texture_sampling"
|
||||
"delay_game_render_thread_us"
|
||||
"simulate_3ds_gpu_timings"
|
||||
"layout_option"
|
||||
"swap_screen"
|
||||
"upright_screen"
|
||||
|
|
@ -107,6 +109,7 @@ foreach(KEY IN ITEMS
|
|||
"output_device"
|
||||
"input_type"
|
||||
"input_device"
|
||||
"simulate_headphones_plugged"
|
||||
"delay_start_for_lle_modules"
|
||||
"use_gdbstub"
|
||||
"gdbstub_port"
|
||||
|
|
@ -115,6 +118,7 @@ foreach(KEY IN ITEMS
|
|||
"log_filter"
|
||||
"log_regex_filter"
|
||||
"toggle_unique_data_console_type"
|
||||
"break_on_unmapped_memory_access"
|
||||
"use_integer_scaling"
|
||||
"layouts_to_cycle"
|
||||
"camera_inner_flip"
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
**The Contributor's Guide has moved to [the wiki](https://github.com/citra-emu/citra/wiki/Contributing).**
|
||||
2
dist/languages/.tx/config
vendored
2
dist/languages/.tx/config
vendored
|
|
@ -12,4 +12,4 @@ lang_map = ca@valencia:ca_ES_valencia
|
|||
file_filter = ../../src/android/app/src/main/res/values-<lang>/strings.xml
|
||||
source_file = ../../src/android/app/src/main/res/values/strings.xml
|
||||
type = ANDROID
|
||||
lang_map = es_ES:b+es+ES, hu_HU:b+hu+HU, ru_RU:b+ru+RU, pt_BR:b+pt+BR, zh_CN:b+zh+CN, pl_PL:b+pl+PL, ca@valencia:b+ca+ES+valencia, ko_KR:b+ko+KR, da_DK:b+da+DK, ja_JP:b+ja+JP, lt_LT:b+lt+LT, ro_RO:b+ro+RO, tr_TR:b+tr+TR, vi_VN:b+vi+VN, zh_TW:b+zh+TW, es_419:b+es+419
|
||||
lang_map = ca@valencia:b+ca+ES+valencia, es_419:b+es+419, pt_BR:b+pt+BR, zh_CN:b+zh+CN, zh_TW:b+zh+TW
|
||||
|
|
|
|||
785
dist/languages/ca_ES_valencia.ts
vendored
785
dist/languages/ca_ES_valencia.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/da_DK.ts → dist/languages/da.ts
vendored
779
dist/languages/da_DK.ts → dist/languages/da.ts
vendored
File diff suppressed because it is too large
Load diff
785
dist/languages/de.ts
vendored
785
dist/languages/de.ts
vendored
File diff suppressed because it is too large
Load diff
787
dist/languages/el.ts
vendored
787
dist/languages/el.ts
vendored
File diff suppressed because it is too large
Load diff
787
dist/languages/es_ES.ts → dist/languages/es.ts
vendored
787
dist/languages/es_ES.ts → dist/languages/es.ts
vendored
File diff suppressed because it is too large
Load diff
827
dist/languages/es_419.ts
vendored
827
dist/languages/es_419.ts
vendored
File diff suppressed because it is too large
Load diff
777
dist/languages/fi.ts
vendored
777
dist/languages/fi.ts
vendored
File diff suppressed because it is too large
Load diff
785
dist/languages/fr.ts
vendored
785
dist/languages/fr.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/hu_HU.ts → dist/languages/hu.ts
vendored
779
dist/languages/hu_HU.ts → dist/languages/hu.ts
vendored
File diff suppressed because it is too large
Load diff
777
dist/languages/id.ts
vendored
777
dist/languages/id.ts
vendored
File diff suppressed because it is too large
Load diff
793
dist/languages/it.ts
vendored
793
dist/languages/it.ts
vendored
File diff suppressed because it is too large
Load diff
775
dist/languages/ja_JP.ts → dist/languages/ja.ts
vendored
775
dist/languages/ja_JP.ts → dist/languages/ja.ts
vendored
File diff suppressed because it is too large
Load diff
781
dist/languages/ko_KR.ts → dist/languages/ko.ts
vendored
781
dist/languages/ko_KR.ts → dist/languages/ko.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/lt_LT.ts → dist/languages/lt.ts
vendored
779
dist/languages/lt_LT.ts → dist/languages/lt.ts
vendored
File diff suppressed because it is too large
Load diff
777
dist/languages/nb.ts
vendored
777
dist/languages/nb.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/nl.ts
vendored
779
dist/languages/nl.ts
vendored
File diff suppressed because it is too large
Load diff
793
dist/languages/pl_PL.ts → dist/languages/pl.ts
vendored
793
dist/languages/pl_PL.ts → dist/languages/pl.ts
vendored
File diff suppressed because it is too large
Load diff
803
dist/languages/pt_BR.ts
vendored
803
dist/languages/pt_BR.ts
vendored
File diff suppressed because it is too large
Load diff
781
dist/languages/ro_RO.ts → dist/languages/ro.ts
vendored
781
dist/languages/ro_RO.ts → dist/languages/ro.ts
vendored
File diff suppressed because it is too large
Load diff
775
dist/languages/ru_RU.ts → dist/languages/ru.ts
vendored
775
dist/languages/ru_RU.ts → dist/languages/ru.ts
vendored
File diff suppressed because it is too large
Load diff
785
dist/languages/sv.ts
vendored
785
dist/languages/sv.ts
vendored
File diff suppressed because it is too large
Load diff
781
dist/languages/tr_TR.ts → dist/languages/tr.ts
vendored
781
dist/languages/tr_TR.ts → dist/languages/tr.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/vi_VN.ts → dist/languages/vi.ts
vendored
779
dist/languages/vi_VN.ts → dist/languages/vi.ts
vendored
File diff suppressed because it is too large
Load diff
785
dist/languages/zh_CN.ts
vendored
785
dist/languages/zh_CN.ts
vendored
File diff suppressed because it is too large
Load diff
777
dist/languages/zh_TW.ts
vendored
777
dist/languages/zh_TW.ts
vendored
File diff suppressed because it is too large
Load diff
|
|
@ -4,23 +4,19 @@
|
|||
# --- Builder ----------------
|
||||
FROM opensauce04/azahar-build-environment:latest AS builder
|
||||
|
||||
COPY . /var/azahar-src
|
||||
RUN mkdir /var/azahar-src/
|
||||
COPY ./ /var/azahar-src/
|
||||
|
||||
RUN mkdir builddir && cd builddir && \
|
||||
cmake /var/azahar-src -G Ninja \
|
||||
RUN mkdir ./builddir/
|
||||
WORKDIR ./builddir/
|
||||
RUN cmake /var/azahar-src -G Ninja \
|
||||
-DENABLE_QT=OFF \
|
||||
-DENABLE_GDBSTUB=OFF \
|
||||
-DENABLE_TESTS=OFF \
|
||||
-DENABLE_ROOM=ON \
|
||||
-DENABLE_ROOM_STANDALONE=ON \
|
||||
-DENABLE_OPENGL=OFF $( : "TODO: Can we disable these automatically when there's no frontend?") \
|
||||
-DENABLE_VULKAN=OFF \
|
||||
-DENABLE_SDL2=OFF \
|
||||
-DENABLE_LIBUSB=OFF \
|
||||
-DENABLE_CUBEB=OFF \
|
||||
-DENABLE_OPENAL=OFF && \
|
||||
ninja && \
|
||||
mv bin/Release/azahar-room /usr/local/bin/ && \
|
||||
cd .. && rm -rf builddir
|
||||
-DENABLE_ROOM_STANDALONE=ON
|
||||
RUN ninja
|
||||
RUN mv ./bin/Release/azahar-room /usr/local/bin/
|
||||
|
||||
# --- Final ------------------
|
||||
FROM debian:trixie AS final
|
||||
|
|
|
|||
21
externals/CMakeLists.txt
vendored
21
externals/CMakeLists.txt
vendored
|
|
@ -69,17 +69,9 @@ if(USE_SYSTEM_CRYPTOPP)
|
|||
add_library(cryptopp INTERFACE)
|
||||
target_link_libraries(cryptopp INTERFACE cryptopp::cryptopp)
|
||||
else()
|
||||
if (WIN32 AND NOT MSVC AND "arm64" IN_LIST ARCHITECTURE)
|
||||
# TODO: CryptoPP ARM64 ASM does not seem to support Windows unless compiled with MSVC.
|
||||
# TODO: See https://github.com/weidai11/cryptopp/issues/1260
|
||||
set(CRYPTOPP_DISABLE_ASM ON CACHE BOOL "")
|
||||
endif()
|
||||
|
||||
set(CRYPTOPP_BUILD_DOCUMENTATION OFF CACHE BOOL "")
|
||||
set(CRYPTOPP_BUILD_TESTING OFF CACHE BOOL "")
|
||||
set(CRYPTOPP_INSTALL OFF CACHE BOOL "")
|
||||
set(CRYPTOPP_SOURCES "${CMAKE_SOURCE_DIR}/externals/cryptopp" CACHE STRING "")
|
||||
add_subdirectory(cryptopp-cmake EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(cryptopp EXCLUDE_FROM_ALL)
|
||||
endif()
|
||||
|
||||
# dds-ktx
|
||||
|
|
@ -327,12 +319,8 @@ endif()
|
|||
# OpenSSL
|
||||
if (USE_SYSTEM_OPENSSL)
|
||||
find_package(OpenSSL 1.1)
|
||||
if (OPENSSL_FOUND)
|
||||
set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT OPENSSL_FOUND)
|
||||
set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
|
||||
else()
|
||||
# LibreSSL
|
||||
set(LIBRESSL_SKIP_INSTALL ON CACHE BOOL "")
|
||||
set(OPENSSLDIR "/etc/ssl/")
|
||||
|
|
@ -414,6 +402,9 @@ if (ENABLE_OPENAL)
|
|||
find_package(OpenAL REQUIRED)
|
||||
target_link_libraries(OpenAL INTERFACE OpenAL::OpenAL)
|
||||
else()
|
||||
if (BSD STREQUAL "OpenBSD")
|
||||
set(ALSOFT_BACKEND_SOLARIS OFF CACHE BOOL "")
|
||||
endif()
|
||||
set(ALSOFT_EMBED_HRTF_DATA OFF CACHE BOOL "")
|
||||
set(ALSOFT_EXAMPLES OFF CACHE BOOL "")
|
||||
set(ALSOFT_INSTALL OFF CACHE BOOL "")
|
||||
|
|
|
|||
2
externals/cryptopp
vendored
2
externals/cryptopp
vendored
|
|
@ -1 +1 @@
|
|||
Subproject commit 60f81a77e0c9a0e7ffc1ca1bc438ddfa2e43b78e
|
||||
Subproject commit 8d92d788421483a43e09acf1cd4a2861cb2b8cab
|
||||
1
externals/cryptopp-cmake
vendored
1
externals/cryptopp-cmake
vendored
|
|
@ -1 +0,0 @@
|
|||
Subproject commit 00a151f8489daaa32434ab1f340e6750793ddf0c
|
||||
1
externals/dllwalker
vendored
Submodule
1
externals/dllwalker
vendored
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 2f8b349c26832cae612aa7082154c0697a9cbc8e
|
||||
2
externals/openal-soft
vendored
2
externals/openal-soft
vendored
|
|
@ -1 +1 @@
|
|||
Subproject commit 90191edd20bb877c5cbddfdac7ec0fe49ad93727
|
||||
Subproject commit e399840fc6aba5f7bc3f0633e8ff10bba0640906
|
||||
|
|
@ -203,6 +203,7 @@ if (ENABLE_QT)
|
|||
endif()
|
||||
|
||||
if (ENABLE_QT) # Or any other hypothetical future frontends
|
||||
add_subdirectory(citra_cli)
|
||||
add_subdirectory(citra_meta)
|
||||
endif()
|
||||
|
||||
|
|
|
|||
|
|
@ -24,12 +24,11 @@ val abiFilter = listOf("arm64-v8a", "x86_64")
|
|||
|
||||
val downloadedJniLibsPath = "${layout.buildDirectory.get().asFile.path}/downloadedJniLibs"
|
||||
|
||||
@Suppress("UnstableApiUsage")
|
||||
android {
|
||||
namespace = "org.citra.citra_emu"
|
||||
|
||||
compileSdkVersion = "android-35"
|
||||
ndkVersion = "27.1.12297006"
|
||||
ndkVersion = "27.3.13750724"
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
|
|
@ -80,7 +79,8 @@ android {
|
|||
"-DENABLE_QT=0", // Don't use QT
|
||||
"-DENABLE_SDL2=0", // Don't use SDL
|
||||
"-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work
|
||||
"-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" // Support Android 15 16KiB page sizes
|
||||
"-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON", // Support Android 15 16KiB page sizes
|
||||
"-DENABLE_GDBSTUB=OFF", // Disable GDB stub
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ import android.view.Surface
|
|||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.Keep
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.net.toUri
|
||||
import androidx.fragment.app.DialogFragment
|
||||
|
|
@ -317,6 +318,12 @@ object NativeLibrary {
|
|||
canContinue = false
|
||||
}
|
||||
|
||||
CoreError.ErrorCoreExceptionRaised -> {
|
||||
title = emulationActivity.getString(R.string.fatal_error)
|
||||
message = emulationActivity.getString(R.string.fatal_error_message)
|
||||
canContinue = false
|
||||
}
|
||||
|
||||
CoreError.ErrorUnknown -> {
|
||||
title = emulationActivity.getString(R.string.fatal_error)
|
||||
message = emulationActivity.getString(R.string.fatal_error_message)
|
||||
|
|
@ -439,7 +446,7 @@ object NativeLibrary {
|
|||
return
|
||||
}
|
||||
|
||||
if (resultCode == EmulationErrorDialogFragment.ShutdownRequested) {
|
||||
if (resultCode == CoreError.ShutdownRequested.value) {
|
||||
emulationActivity.finish()
|
||||
return
|
||||
}
|
||||
|
|
@ -458,23 +465,51 @@ object NativeLibrary {
|
|||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
emulationActivity = requireActivity() as EmulationActivity
|
||||
|
||||
var captionId = R.string.loader_error_invalid_format
|
||||
val result = requireArguments().getInt(RESULT_CODE)
|
||||
if (result == ErrorLoader_ErrorEncrypted) {
|
||||
captionId = R.string.loader_error_encrypted
|
||||
}
|
||||
if (result == ErrorArticDisconnected) {
|
||||
captionId = R.string.artic_base
|
||||
var coreError = CoreError.fromInt(requireArguments().getInt(RESULT_CODE))
|
||||
val title: String
|
||||
val message: String
|
||||
when (coreError) {
|
||||
CoreError.ErrorGetLoader, CoreError.ErrorLoader_ErrorInvalidFormat, CoreError.ErrorSystemMode -> {
|
||||
title = getString(R.string.loader_error_invalid_format)
|
||||
message = getString(R.string.loader_error_invalid_format_description)
|
||||
}
|
||||
|
||||
CoreError.ErrorLoader_ErrorEncrypted -> {
|
||||
title = getString(R.string.loader_error_encrypted)
|
||||
message = getString(R.string.loader_error_encrypted_description)
|
||||
}
|
||||
|
||||
CoreError.ErrorArticDisconnected -> {
|
||||
title = getString(R.string.artic_base)
|
||||
message = getString(R.string.artic_server_comm_error)
|
||||
}
|
||||
|
||||
CoreError.ErrorN3DSApplication -> {
|
||||
title = getString(R.string.loader_error_invalid_system_mode)
|
||||
message = getString(R.string.loader_error_invalid_system_mode_description)
|
||||
}
|
||||
|
||||
CoreError.ErrorLoader_ErrorPatches -> {
|
||||
title = getString(R.string.loader_error_applying_patches)
|
||||
message = getString(R.string.loader_error_applying_patches_description)
|
||||
}
|
||||
|
||||
CoreError.ErrorLoader_ErrorPatchesInvalidTitle -> {
|
||||
title = getString(R.string.loader_error_applying_patches)
|
||||
message = getString(R.string.loader_error_patch_wrong_application)
|
||||
}
|
||||
|
||||
else -> {
|
||||
title = getString(R.string.loader_error_generic_title)
|
||||
message = getString(R.string.loader_error_generic,
|
||||
getString(coreError.stringRes), coreError.value)
|
||||
}
|
||||
}
|
||||
|
||||
val alert = MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(captionId)
|
||||
.setTitle(title)
|
||||
.setMessage(
|
||||
Html.fromHtml(
|
||||
if (result == ErrorArticDisconnected)
|
||||
CitraApplication.appContext.resources.getString(R.string.artic_server_comm_error)
|
||||
else
|
||||
CitraApplication.appContext.resources.getString(R.string.redump_games),
|
||||
Html.fromHtml(message,
|
||||
Html.FROM_HTML_MODE_LEGACY
|
||||
)
|
||||
)
|
||||
|
|
@ -496,21 +531,6 @@ object NativeLibrary {
|
|||
|
||||
const val RESULT_CODE = "resultcode"
|
||||
|
||||
const val Success = 0
|
||||
const val ErrorNotInitialized = 1
|
||||
const val ErrorGetLoader = 2
|
||||
const val ErrorSystemMode = 3
|
||||
const val ErrorLoader = 4
|
||||
const val ErrorLoader_ErrorEncrypted = 5
|
||||
const val ErrorLoader_ErrorInvalidFormat = 6
|
||||
const val ErrorLoader_ErrorGBATitle = 7
|
||||
const val ErrorSystemFiles = 8
|
||||
const val ErrorSavestate = 9
|
||||
const val ErrorArticDisconnected = 10
|
||||
const val ErrorN3DSApplication = 11
|
||||
const val ShutdownRequested = 12
|
||||
const val ErrorUnknown = 13
|
||||
|
||||
fun newInstance(resultCode: Int): EmulationErrorDialogFragment {
|
||||
val args = Bundle()
|
||||
args.putInt(RESULT_CODE, resultCode)
|
||||
|
|
@ -857,12 +877,31 @@ object NativeLibrary {
|
|||
FileUtil.deleteDocument(path)
|
||||
}
|
||||
|
||||
enum class CoreError {
|
||||
ErrorSystemFiles,
|
||||
ErrorSavestate,
|
||||
ErrorArticDisconnected,
|
||||
ErrorN3DSApplication,
|
||||
ErrorUnknown
|
||||
enum class CoreError(val value: Int, @StringRes val stringRes: Int) {
|
||||
Success(0, R.string.core_error_success),
|
||||
ErrorNotInitialized(1, R.string.core_error_not_initialized),
|
||||
ErrorGetLoader(2, R.string.core_error_get_loader),
|
||||
ErrorSystemMode(3, R.string.core_error_system_mode),
|
||||
ErrorLoader(4, R.string.core_error_loader),
|
||||
ErrorLoader_ErrorEncrypted(5, R.string.core_error_loader_encrypted),
|
||||
ErrorLoader_ErrorInvalidFormat(6, R.string.core_error_loader_invalid_format),
|
||||
ErrorLoader_ErrorGBATitle(7, R.string.core_error_loader_gba_title),
|
||||
ErrorLoader_ErrorPatches(8, R.string.core_error_loader_error_patches),
|
||||
ErrorLoader_ErrorPatchesInvalidTitle(9, R.string.core_error_loader_patches_invalid_title),
|
||||
ErrorSystemFiles(10, R.string.core_error_system_files),
|
||||
ErrorSavestate(11, R.string.core_error_savestate),
|
||||
ErrorArticDisconnected(12, R.string.core_error_artic_disconnected),
|
||||
ErrorN3DSApplication(13, R.string.core_error_n3ds_application),
|
||||
ErrorCoreExceptionRaised(14, R.string.core_error_core_exception_raised),
|
||||
ErrorMemoryExceptionRaised(15, R.string.core_error_memory_exception_raised),
|
||||
ShutdownRequested(16, R.string.core_error_shutdown_requested),
|
||||
ErrorUnknown(17, R.string.core_error_unknown);
|
||||
|
||||
companion object {
|
||||
fun fromInt(value: Int): CoreError {
|
||||
return entries.find { it.value == value } ?: ErrorUnknown
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum class InstallStatus {
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ object SettingKeys {
|
|||
external fun enable_required_online_lle_modules(): String
|
||||
external fun use_virtual_sd(): String
|
||||
external fun compress_cia_installs(): String
|
||||
external fun async_fs_operations(): String
|
||||
external fun region_value(): String
|
||||
external fun init_clock(): String
|
||||
external fun init_time(): String
|
||||
|
|
@ -45,6 +46,7 @@ object SettingKeys {
|
|||
external fun texture_filter(): String
|
||||
external fun texture_sampling(): String
|
||||
external fun delay_game_render_thread_us(): String
|
||||
external fun simulate_3ds_gpu_timings(): String
|
||||
external fun layout_option(): String
|
||||
external fun swap_screen(): String
|
||||
external fun upright_screen(): String
|
||||
|
|
@ -92,6 +94,7 @@ object SettingKeys {
|
|||
external fun audio_emulation(): String
|
||||
external fun enable_audio_stretching(): String
|
||||
external fun enable_realtime_audio(): String
|
||||
external fun simulate_headphones_plugged(): String
|
||||
external fun volume(): String
|
||||
external fun output_type(): String
|
||||
external fun output_device(): String
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ enum class BooleanSetting(
|
|||
PRELOAD_TEXTURES(SettingKeys.preload_textures(), Settings.SECTION_UTILITY, false),
|
||||
ENABLE_AUDIO_STRETCHING(SettingKeys.enable_audio_stretching(), Settings.SECTION_AUDIO, true),
|
||||
ENABLE_REALTIME_AUDIO(SettingKeys.enable_realtime_audio(), Settings.SECTION_AUDIO, false),
|
||||
SIMULATE_HEADPHONES_PLUGGED(SettingKeys.simulate_headphones_plugged(), Settings.SECTION_AUDIO, false),
|
||||
CPU_JIT(SettingKeys.use_cpu_jit(), Settings.SECTION_CORE, true),
|
||||
HW_SHADER(SettingKeys.use_hw_shader(), Settings.SECTION_RENDERER, true),
|
||||
SHADER_JIT(SettingKeys.use_shader_jit(), Settings.SECTION_RENDERER, true),
|
||||
|
|
@ -54,9 +55,11 @@ enum class BooleanSetting(
|
|||
USE_ARTIC_BASE_CONTROLLER(SettingKeys.use_artic_base_controller(), Settings.SECTION_CONTROLS, false),
|
||||
UPRIGHT_SCREEN(SettingKeys.upright_screen(), Settings.SECTION_LAYOUT, false),
|
||||
COMPRESS_INSTALLED_CIA_CONTENT(SettingKeys.compress_cia_installs(), Settings.SECTION_STORAGE, false),
|
||||
ASYNC_FS_OPERATIONS(SettingKeys.async_fs_operations(), Settings.SECTION_STORAGE, true),
|
||||
ANDROID_HIDE_IMAGES(SettingKeys.android_hide_images(), Settings.SECTION_MISC, false),
|
||||
APPLY_REGION_FREE_PATCH(SettingKeys.apply_region_free_patch(), Settings.SECTION_SYSTEM, true),
|
||||
USE_INTEGER_SCALING(SettingKeys.use_integer_scaling(), Settings.SECTION_RENDERER, false);
|
||||
USE_INTEGER_SCALING(SettingKeys.use_integer_scaling(), Settings.SECTION_RENDERER, false),
|
||||
SIMULATE_3DS_GPU_TIMINGS(SettingKeys.simulate_3ds_gpu_timings(), Settings.SECTION_RENDERER, true);
|
||||
|
||||
override var boolean: Boolean = defaultValue
|
||||
|
||||
|
|
@ -91,6 +94,7 @@ enum class BooleanSetting(
|
|||
SHADERS_ACCURATE_MUL,
|
||||
USE_ARTIC_BASE_CONTROLLER,
|
||||
COMPRESS_INSTALLED_CIA_CONTENT,
|
||||
ASYNC_FS_OPERATIONS,
|
||||
ANDROID_HIDE_IMAGES,
|
||||
PERF_OVERLAY_ENABLE, // Works in overlay options, but not from the settings menu
|
||||
APPLY_REGION_FREE_PATCH
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
package org.citra.citra_emu.features.settings.model
|
||||
|
||||
import org.citra.citra_emu.features.settings.SettingKeys
|
||||
|
||||
enum class IntListSetting(
|
||||
override val key: String,
|
||||
override val section: String,
|
||||
|
|
@ -11,7 +13,7 @@ enum class IntListSetting(
|
|||
val canBeEmpty: Boolean = true
|
||||
) : AbstractListSetting<Int> {
|
||||
|
||||
LAYOUTS_TO_CYCLE("layouts_to_cycle", Settings.SECTION_LAYOUT, listOf(0, 1, 2, 3, 4, 5), canBeEmpty = false);
|
||||
LAYOUTS_TO_CYCLE(SettingKeys.layouts_to_cycle(), Settings.SECTION_LAYOUT, listOf(0, 1, 2, 3, 4, 5), canBeEmpty = false);
|
||||
|
||||
private var backingList: List<Int> = defaultValue
|
||||
private var lastValidList : List<Int> = defaultValue
|
||||
|
|
|
|||
|
|
@ -599,6 +599,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
|
|||
BooleanSetting.COMPRESS_INSTALLED_CIA_CONTENT.defaultValue
|
||||
)
|
||||
)
|
||||
add(
|
||||
SwitchSetting(
|
||||
BooleanSetting.ASYNC_FS_OPERATIONS,
|
||||
R.string.async_fs_operations,
|
||||
R.string.async_fs_operations_description,
|
||||
BooleanSetting.ASYNC_FS_OPERATIONS.key,
|
||||
BooleanSetting.ASYNC_FS_OPERATIONS.defaultValue
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1704,6 +1713,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
|
|||
BooleanSetting.ENABLE_REALTIME_AUDIO.defaultValue
|
||||
)
|
||||
)
|
||||
add(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SIMULATE_HEADPHONES_PLUGGED,
|
||||
R.string.simulate_headphones_plugged,
|
||||
R.string.simulate_headphones_plugged_description,
|
||||
BooleanSetting.SIMULATE_HEADPHONES_PLUGGED.key,
|
||||
BooleanSetting.SIMULATE_HEADPHONES_PLUGGED.defaultValue
|
||||
)
|
||||
)
|
||||
add(
|
||||
SingleChoiceSetting(
|
||||
IntSetting.AUDIO_INPUT_TYPE,
|
||||
|
|
@ -1790,6 +1808,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
|
|||
BooleanSetting.VSYNC.defaultValue
|
||||
)
|
||||
)
|
||||
add(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SIMULATE_3DS_GPU_TIMINGS,
|
||||
R.string.simulate_3ds_gpu_timings,
|
||||
R.string.simulate_3ds_gpu_timings_description,
|
||||
BooleanSetting.SIMULATE_3DS_GPU_TIMINGS.key,
|
||||
BooleanSetting.SIMULATE_3DS_GPU_TIMINGS.defaultValue
|
||||
)
|
||||
)
|
||||
add(
|
||||
SwitchSetting(
|
||||
BooleanSetting.DEBUG_RENDERER,
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@ void Config::ReadValues() {
|
|||
ReadSetting("Renderer", Settings::values.bg_blue);
|
||||
ReadSetting("Renderer", Settings::values.custom_second_layer_opacity);
|
||||
ReadSetting("Renderer", Settings::values.delay_game_render_thread_us);
|
||||
ReadSetting("Renderer", Settings::values.simulate_3ds_gpu_timings);
|
||||
ReadSetting("Renderer", Settings::values.disable_right_eye_render);
|
||||
ReadSetting("Renderer", Settings::values.swap_eyes_3d);
|
||||
ReadSetting("Renderer", Settings::values.render_3d_which_display);
|
||||
|
|
@ -231,6 +232,7 @@ void Config::ReadValues() {
|
|||
|
||||
// Storage
|
||||
ReadSetting("Storage", Settings::values.compress_cia_installs);
|
||||
ReadSetting("Storage", Settings::values.async_fs_operations);
|
||||
|
||||
// Utility
|
||||
ReadSetting("Utility", Settings::values.dump_textures);
|
||||
|
|
@ -242,6 +244,7 @@ void Config::ReadValues() {
|
|||
ReadSetting("Audio", Settings::values.audio_emulation);
|
||||
ReadSetting("Audio", Settings::values.enable_audio_stretching);
|
||||
ReadSetting("Audio", Settings::values.enable_realtime_audio);
|
||||
ReadSetting("Audio", Settings::values.simulate_headphones_plugged);
|
||||
ReadSetting("Audio", Settings::values.volume);
|
||||
ReadSetting("Audio", Settings::values.output_type);
|
||||
ReadSetting("Audio", Settings::values.output_device);
|
||||
|
|
@ -316,6 +319,7 @@ void Config::ReadValues() {
|
|||
ReadSetting("Debugging", Settings::values.instant_debug_log);
|
||||
ReadSetting("Debugging", Settings::values.enable_rpc_server);
|
||||
ReadSetting("Debugging", Settings::values.toggle_unique_data_console_type);
|
||||
ReadSetting("Debugging", Settings::values.break_on_unmapped_memory_access);
|
||||
|
||||
for (const auto& service_module : Service::service_module_map) {
|
||||
bool use_lle =
|
||||
|
|
@ -335,14 +339,13 @@ void Config::Reload() {
|
|||
for (auto key = Settings::Keys::keys_array.begin(); key != Settings::Keys::keys_array.end();
|
||||
++key) {
|
||||
const auto key_declaration_string = std::string(*key) + " =";
|
||||
// FIXME: This code looks so ass when formatted by clang-format -OS
|
||||
if (std::ranges::find(DefaultINI::android_config_omitted_keys, *key) ==
|
||||
std::end(DefaultINI::android_config_omitted_keys) &&
|
||||
std::string(DefaultINI::android_config_default_file_content)
|
||||
.find(key_declaration_string) == std::string::npos) {
|
||||
if ((std::ranges::find(DefaultINI::android_config_omitted_keys, *key) ==
|
||||
std::end(DefaultINI::android_config_omitted_keys)) &&
|
||||
(std::string(DefaultINI::android_config_default_file_content)
|
||||
.find(key_declaration_string) == std::string::npos)) {
|
||||
ASSERT_MSG(false,
|
||||
"Validation of default content config failed: Missing or malformed key "
|
||||
"declaration {}",
|
||||
"Validation of default config content (jni/default_ini.h) failed: Missing "
|
||||
"declaration for key '{}'",
|
||||
*key);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,10 @@ constexpr std::array android_config_omitted_keys = {
|
|||
Keys::audio_encoder,
|
||||
Keys::audio_encoder_options,
|
||||
Keys::audio_bitrate,
|
||||
Keys::last_artic_base_addr, // On Android, this value is stored as a "preference"
|
||||
Keys::last_artic_base_addr, // On Android, this value is stored as a "preference"
|
||||
Keys::break_on_unmapped_memory_access, // Does nothing as the error is ignored
|
||||
Keys::use_gdbstub, // GDB functionality disabled by deafult on Android
|
||||
Keys::gdbstub_port,
|
||||
};
|
||||
|
||||
// clang-format off
|
||||
|
|
@ -196,6 +199,10 @@ static const char* android_config_default_file_content = (BOOST_HANA_STRING(R"(
|
|||
# Set to 0 for no delay, only useful in dynamic-fps games to simulate GPU delay.
|
||||
)") DECLARE_KEY(delay_game_render_thread_us) BOOST_HANA_STRING(R"(
|
||||
|
||||
# Delays GPU completion events based on measurements taken from real hardware
|
||||
# 0: No delay, 1 (default): Enable delay
|
||||
)") DECLARE_KEY(simulate_3ds_gpu_timings) BOOST_HANA_STRING(R"(
|
||||
|
||||
# Disables rendering the right eye image
|
||||
# Greatly improves performance in some games, but can cause flickering in others.
|
||||
# 0 : Enable right eye rendering, 1: Disable right eye rendering
|
||||
|
|
@ -271,6 +278,10 @@ static const char* android_config_default_file_content = (BOOST_HANA_STRING(R"(
|
|||
# 0 (default): Do not compress, 1: Compress
|
||||
)") DECLARE_KEY(compress_cia_installs) BOOST_HANA_STRING(R"(
|
||||
|
||||
# Whether to enable async filesystem operations
|
||||
# 0: Disabled, 1 (default): Enabled
|
||||
)") DECLARE_KEY(async_fs_operations) BOOST_HANA_STRING(R"(
|
||||
|
||||
# Position of the performance overlay
|
||||
# 0: Top Left
|
||||
# 1: Center Top
|
||||
|
|
@ -404,6 +415,10 @@ static const char* android_config_default_file_content = (BOOST_HANA_STRING(R"(
|
|||
# 0 (default): No, 1: Yes
|
||||
)") DECLARE_KEY(enable_realtime_audio) BOOST_HANA_STRING(R"(
|
||||
|
||||
# Simulates whether headphones are plugged in to the emulated 3DS system
|
||||
# 0 (default): No, 1: Yes
|
||||
)") DECLARE_KEY(simulate_headphones_plugged) BOOST_HANA_STRING(R"(
|
||||
|
||||
# Output volume.
|
||||
# 1.0 (default): 100%, 0.0; mute
|
||||
)") DECLARE_KEY(volume) BOOST_HANA_STRING(R"(
|
||||
|
|
@ -527,10 +542,6 @@ static const char* android_config_default_file_content = (BOOST_HANA_STRING(R"(
|
|||
# 0 (default): Off, 1: On
|
||||
)") DECLARE_KEY(renderer_debug) BOOST_HANA_STRING(R"(
|
||||
|
||||
# Port for listening to GDB connections.
|
||||
)") DECLARE_KEY(use_gdbstub) BOOST_HANA_STRING(R"(
|
||||
)") DECLARE_KEY(gdbstub_port) BOOST_HANA_STRING(R"(
|
||||
|
||||
# Flush log output on every message
|
||||
# Immediately commits the debug log to file. Use this if Azahar crashes and the log output is being cut.
|
||||
)") DECLARE_KEY(instant_debug_log) BOOST_HANA_STRING(R"(
|
||||
|
|
|
|||
|
|
@ -212,7 +212,6 @@
|
|||
<string name="storage">Emmagatzematge</string>
|
||||
<string name="compress_cia_installs">Comprimir el contingut de CIAs instal·lats</string>
|
||||
<string name="compress_cia_installs_description">Comprimix el contingut de fitxers CIA quan són instal·lats a la SD emulada. Només afecta contingut CIA instal·lat amb esta opció activada.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Càmera interior</string>
|
||||
<string name="outer_left_camera">Càmera esquerra externa</string>
|
||||
|
|
@ -371,7 +370,6 @@ S\'esperen errors gràfics temporals quan estigue activat.</string>
|
|||
<string name="learn_more">Més Informació</string>
|
||||
<string name="close">Tancar</string>
|
||||
<string name="reset_to_default">Restablir valors de fàbrica</string>
|
||||
<string name="redump_games"><![CDATA[Per favor, seguix les guies per a bolcar els teus <a href=\"https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/\">cartutxos de joc</a> i/o <a href=\"https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/\">títols instal·lats</a>.]]></string>
|
||||
<string name="option_default">Per omissió</string>
|
||||
<string name="none">Cap</string>
|
||||
<string name="auto">Auto</string>
|
||||
|
|
@ -413,9 +411,7 @@ S\'esperen errors gràfics temporals quan estigue activat.</string>
|
|||
<string name="preferences_theme">Tema i Color</string>
|
||||
<string name="preferences_layout">Estil</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">La teua ROM està encriptada</string>
|
||||
<string name="loader_error_invalid_format">Format de ROM no vàlid</string>
|
||||
<string name="loader_error_file_not_found">El fitxer ROM no existix</string>
|
||||
<string name="no_game_present">No hi ha cap joc iniciable!</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -212,7 +212,6 @@
|
|||
<string name="storage">Almacenamiento</string>
|
||||
<string name="compress_cia_installs">Comprimir contenido CIA instalado</string>
|
||||
<string name="compress_cia_installs_description">Comprime el contenido de archivos CIA cuando son instalados a la SD emulada. Solo afecta contenido CIA instalado con esta opción activada.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Cámara interior</string>
|
||||
<string name="outer_left_camera">Cámara izquierda externa</string>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
<string name="settings_description">Definir as configurações do emulador</string>
|
||||
<string name="install_game_content">Instalar arquivo CIA</string>
|
||||
<string name="install_game_content_description">Instalar aplicativos, atualizações ou DLC</string>
|
||||
<string name="share_log">Compartilhar Registro</string>
|
||||
<string name="share_log">Compartilhar Log</string>
|
||||
<string name="share_log_description">Compartilhe o arquivo de log do Azahar para depurar problemas</string>
|
||||
<string name="gpu_driver_manager">Gerenciador de Driver da GPU</string>
|
||||
<string name="install_gpu_driver">Instalar driver da GPU</string>
|
||||
|
|
@ -86,7 +86,7 @@
|
|||
<string name="warning_cancel">Cancelar</string>
|
||||
<string name="select_citra_user_folder">Selecione a Pasta do Usuário</string>
|
||||
<string name="select_citra_user_folder_description"><![CDATA[Selecione o seu diretório de <a href=\"https://web.archive.org/web/20240304193549/https://github.com/citra-emu/citra/wiki/Citra-Android-user-data-and-storage\">dados de usuário</a>com o botão abaixo.]]></string>
|
||||
<string name="select_which_user_directory_to_use">Parece que você tem diretórios de usuários configurados para ambos o Lime3DS e o Azahar. Isso ocorreu devido a você ter atualizado para o Azahar, e quando solicitado, escolha um diretório de usuário diferente daquele que foi usado pelo Lime3DS.\n\nIsso pode ter resultado em você pensar que tenha perdidos dados salvos ou outras configurações - pedimos desculpas caso isso tenha acontecido.\n\nGostaria de voltar a usar sua pasta de usuário original do Lime3DS, restaurar configurações e salvar os jogos do Lime3DS, ou manter o diretório de usuário do Azahar atual?\n\nNenhum dos diretórios serão excluídos, independente de sua escolha, sinta-se livre para trocar entre elas usando a opção Selecionar Pasta de Usuário.</string>
|
||||
<string name="select_which_user_directory_to_use">Parece que você possui pastas de usuário configuradas tanto para o Lime3DS quanto para o Azahar. Isso provavelmente ocorreu porque você atualizou para o Azahar e, quando solicitado, escolheu uma pasta de usuário diferente da que era usada pelo Lime3DS.\n\nIsso pode ter feito você pensar que perdeu seus saves ou outras configurações — pedimos desculpas se isso aconteceu.\n\nVocê gostaria de voltar a usar sua pasta de usuário original do Lime3DS, restaurando as configurações e jogos salvos do Lime3DS, ou manter sua pasta de usuário atual do Azahar?\n\nNenhuma das pastas será excluída, independentemente da sua escolha, e você pode alternar livremente entre elas usando a opção Selecionar Pasta do Usuário.</string>
|
||||
<string name="keep_current_azahar_directory">Manter diretório atual do Azahar</string>
|
||||
<string name="use_prior_lime3ds_directory">Usar o diretório antigo do Lime3DS</string>
|
||||
<string name="select">Selecionar</string>
|
||||
|
|
@ -141,7 +141,7 @@
|
|||
<string name="button_home">Menu Principal</string>
|
||||
<string name="button_swap">Trocar telas</string>
|
||||
<string name="button_turbo">Turbo</string>
|
||||
<string name="input_message_analog_only">Este controle tem de ser mapeado a um eixo analógico do gamepad ou um eixo de D-pad!</string>
|
||||
<string name="input_message_analog_only">Este controle deve ser mapeado para um analógico ou eixo do D-pad!</string>
|
||||
<string name="input_message_button_only">Este controle tem de ser mapeado a um botão do gamepad!</string>
|
||||
<string name="turbo_limit_hotkey">Velocidade Turbo</string>
|
||||
<string name="turbo_enabled_toast">Velocidade Turbo Ativada</string>
|
||||
|
|
@ -212,6 +212,8 @@
|
|||
<string name="storage">Armazenamento</string>
|
||||
<string name="compress_cia_installs">Comprimir conteúdo CIA instalado</string>
|
||||
<string name="compress_cia_installs_description">Comprime o conteúdo dos arquivos CIA ao serem instalados no cartão SD emulado. Afeta apenas o conteúdo CIA instalado enquanto a opção estiver ativada.</string>
|
||||
<string name="async_fs_operations">Operações assíncronas do sistema de arquivos</string>
|
||||
<string name="async_fs_operations_description">Torna assíncronos os acessos ao sistema de arquivos emulado. Reduz consideravelmente os engasgos relacionados ao sistema de arquivos, mas pode aumentar um pouco os tempos de carregamento.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Câmera frontal</string>
|
||||
|
|
@ -243,6 +245,8 @@
|
|||
<string name="texture_filter_description">Aprimora o visual dos aplicativos ao aplicar filtros às texturas. Os filtros compatíveis são: Anime4K Ultrafast, Bicúbico, ScaleForce, xBRZ Freescale e MMPX.</string>
|
||||
<string name="delay_render_thread">Atrasar Thread de Renderização do Aplicativo</string>
|
||||
<string name="delay_render_thread_description">Atrasar thread de renderização do aplicativo quando for enviado dados para a GPU. Ajuda com problemas de desempenho em (muito poucos) aplicativos com taxa de quadros dinâmica.</string>
|
||||
<string name="simulate_3ds_gpu_timings">Simular temporizações da GPU do 3DS</string>
|
||||
<string name="simulate_3ds_gpu_timings_description">Atrasa os eventos de conclusão da GPU com base em medições feitas no hardware original, para que os jogos tenham medições de tempo de GPU mais realistas. Ajuda a estabilizar jogos com FPS dinâmico. Desativar este recurso pode melhorar o desempenho em alguns casos raros, à custa da estabilidade.</string>
|
||||
<string name="advanced">Avançado</string>
|
||||
<string name="texture_sampling_name">Amostragem de Texturas</string>
|
||||
<string name="texture_sampling_description">Substitui o filtro de amostragem usado pelos jogos. Isso pode ser útil em certos casos com jogos que se comportem mal durante o upscaling. Em caso de dúvidas, defina como Controlado pelo Jogo.</string>
|
||||
|
|
@ -315,6 +319,8 @@
|
|||
<string name="audio_stretch_description">Estica o áudio para reduzir engasgos. Quando ativado, aumenta a latência do áudio e reduz levemente o desempenho.</string>
|
||||
<string name="realtime_audio">Ativar Áudio em Tempo Real</string>
|
||||
<string name="realtime_audio_description">Dimensiona a velocidade de reprodução de áudio para compensar quedas na taxa de quadros da emulação. Isso significa que o áudio será reproduzido em velocidade máxima mesmo quando a taxa de quadros do jogo estiver baixa. Pode causar problemas de dessincronização de áudio.</string>
|
||||
<string name="simulate_headphones_plugged">Simular fones de ouvido conectados</string>
|
||||
<string name="simulate_headphones_plugged_description">Simula se os fones de ouvido estão conectados ao sistema emulado do 3DS.</string>
|
||||
<string name="audio_input_type">Dispositivo de entrada de áudio</string>
|
||||
<string name="sound_output_mode">Modo de Saída de Som</string>
|
||||
|
||||
|
|
@ -370,7 +376,6 @@
|
|||
<string name="learn_more">Saber mais</string>
|
||||
<string name="close">Fechar</string>
|
||||
<string name="reset_to_default">Redefinir para o Padrão</string>
|
||||
<string name="redump_games"><![CDATA[Por favor, siga os guias para extrair novamente seus <a href=\"https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/\">cartuchos de jogo</a> ou <a href=\"https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/\">títulos instalados</a>.]]></string>
|
||||
<string name="option_default">Padrão</string>
|
||||
<string name="none">Nenhum</string>
|
||||
<string name="auto">Automático</string>
|
||||
|
|
@ -413,11 +418,39 @@
|
|||
<string name="preferences_layout">Disposição</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_generic_title">Erro ao carregar o aplicativo</string>
|
||||
<string name="loader_error_invalid_format">Formato de aplicativo inválido</string>
|
||||
<string name="loader_error_invalid_format_description"><![CDATA[Formato de arquivo do aplicativo não suportado.<br>Certifique-se de estar usando um dos formatos de arquivo compatíveis: <ul><li>Imagens de cartucho: <b>.cci/.zcci/.3ds</b></li><li>Arquivos instaláveis: <b>.cia/.zcia</b></li><li> Títulos homebrew: <b>.3dsx/.z3dsx</b></li><li>Contêineres NCCH: <b>.cxi/.zcxi/.app</b></li><li>Arquivos ELF: <b>.elf/.axf</b></li></ul>]]></string>
|
||||
<string name="loader_error_invalid_system_mode">Modo de sistema inválido</string>
|
||||
<string name="loader_error_invalid_system_mode_description">Aplicativos exclusivos do New 3DS não podem ser carregados sem ativar o modo New 3DS.</string>
|
||||
<string name="loader_error_applying_patches">Erro ao aplicar patches</string>
|
||||
<string name="loader_error_applying_patches_description">Ocorreu um erro genérico ao aplicar um patch ao aplicativo. Verifique o log para mais detalhes.</string>
|
||||
<string name="loader_error_patch_wrong_application">Falha ao aplicar um patch porque ele foi projetado para um aplicativo diferente. Certifique-se de estar usando os patches para o aplicativo, região e versão corretos.</string>
|
||||
<string name="loader_error_encrypted">Sua ROM está Criptografada</string>
|
||||
<string name="loader_error_invalid_format">Formato inválido de ROM</string>
|
||||
<string name="loader_error_encrypted_description"><![CDATA[O Azahar não suporta aplicativos criptografados. Leia nosso <a href=\"https://azahar-emu.org/blog/game-loading-changes/\">post no blog</a> para mais informações.]]></string>
|
||||
<string name="loader_error_file_not_found">O arquivo ROM não existe</string>
|
||||
<string name="no_game_present">Nenhum jogo inicializável presente!</string>
|
||||
|
||||
<string name="loader_error_generic">Ocorreu um erro ao carregar a ROM: \"%s (%d)\"</string>
|
||||
<string name="core_error_success">Sucesso</string>
|
||||
<string name="core_error_not_initialized">Não inicializado</string>
|
||||
<string name="core_error_get_loader">Carregador do arquivo não encontrado, tipo de arquivo incompatível</string>
|
||||
<string name="core_error_system_mode">Falha ao analisar o arquivo</string>
|
||||
<string name="core_error_loader">Erro genérico do carregador</string>
|
||||
<string name="core_error_loader_encrypted">Arquivo criptografado</string>
|
||||
<string name="core_error_loader_invalid_format">Arquivo corrompido</string>
|
||||
<string name="core_error_loader_gba_title">O arquivo é um título de GBA</string>
|
||||
<string name="core_error_loader_error_patches">Erro ao aplicar patches</string>
|
||||
<string name="core_error_loader_patches_invalid_title">Os patches são para um aplicativo diferente</string>
|
||||
<string name="core_error_system_files">Arquivos de sistema ausentes</string>
|
||||
<string name="core_error_savestate">Falha no savestate</string>
|
||||
<string name="core_error_artic_disconnected">Artic Base desconectado</string>
|
||||
<string name="core_error_n3ds_application">O arquivo é um aplicativo do New 3DS</string>
|
||||
<string name="core_error_core_exception_raised">Exceção de núcleo disparada</string>
|
||||
<string name="core_error_memory_exception_raised">Exceção de memória disparada</string>
|
||||
<string name="core_error_shutdown_requested">Desligamento solicitado</string>
|
||||
<string name="core_error_unknown">Erro desconhecido</string>
|
||||
|
||||
<!-- Emulation Menu -->
|
||||
<string name="emulation_menu_help">Pressione Voltar para acessar o menu.</string>
|
||||
<string name="emulation_save_state">Salvar estado</string>
|
||||
|
|
|
|||
|
|
@ -190,7 +190,6 @@
|
|||
<string name="storage">存储</string>
|
||||
<string name="compress_cia_installs">压缩已安装的 CIA 内容</string>
|
||||
<string name="compress_cia_installs_description">安装到模拟 SD 卡时,压缩 CIA 文件的内容。仅影响启用此设置时安装的 CIA 内容。</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">内置摄像头</string>
|
||||
<string name="outer_left_camera">外置左摄像头</string>
|
||||
|
|
@ -375,9 +374,7 @@
|
|||
<string name="preferences_theme">主题和色彩</string>
|
||||
<string name="preferences_layout">布局</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">您的 ROM 是加密的</string>
|
||||
<string name="loader_error_invalid_format">无效的 ROM 格式</string>
|
||||
<string name="loader_error_file_not_found">ROM 文件不存在</string>
|
||||
<string name="no_game_present">目前没有可启动的游戏!</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -203,7 +203,6 @@
|
|||
<string name="storage">Lager</string>
|
||||
<string name="compress_cia_installs">Komprimer installeret CIA-indhold</string>
|
||||
<string name="compress_cia_installs_description">Komprimerer indholdet af CIA-filer, når de installeres på det emulerede SD-kort. Påvirker kun CIA-indhold, der installeres, når indstillingen er aktiveret.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Indre kamera</string>
|
||||
<string name="outer_left_camera">Ydre venstre kamera</string>
|
||||
|
|
@ -396,9 +395,7 @@
|
|||
<string name="preferences_theme">Tema og farve</string>
|
||||
<string name="preferences_layout">Layout</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Din ROM er krypteret</string>
|
||||
<string name="loader_error_invalid_format">Ugyldigt ROM-format</string>
|
||||
<string name="loader_error_file_not_found">ROM-fil eksisterer ikke</string>
|
||||
<string name="no_game_present">Intet startbart spil til stede!</string>
|
||||
|
||||
|
|
@ -193,7 +193,6 @@
|
|||
<string name="storage">Speicher</string>
|
||||
<string name="compress_cia_installs">Komprimiere installierten CIA Kontent</string>
|
||||
<string name="compress_cia_installs_description">Komprimiert den Inhalt von CIA-Dateien, wenn diese auf der emulierten SD-Karte installiert werden. Betrifft nur CIA-Inhalte, die installiert werden, während die Einstellung aktiviert ist.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Innenkamera</string>
|
||||
<string name="outer_left_camera">Außenkamera Links</string>
|
||||
|
|
@ -375,9 +374,7 @@
|
|||
<string name="preferences_theme">Design und Farbe</string>
|
||||
<string name="preferences_layout">Anordnung</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Deine ROM ist verschlüsselt</string>
|
||||
<string name="loader_error_invalid_format">Ungültiges ROM-Format</string>
|
||||
<string name="loader_error_file_not_found">ROM-Datei existiert nicht</string>
|
||||
<string name="no_game_present">Kein ausführbares Spiel vorhanden!</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -122,7 +122,6 @@
|
|||
<string name="preferences_theme">Θέμα και χρώμα</string>
|
||||
<string name="preferences_layout">Διάταξη</string>
|
||||
|
||||
<string name="loader_error_invalid_format">Μη έγκυρη μορφή ROM</string>
|
||||
<string name="emulation_save_state">Αποθήκευση κατάστασης</string>
|
||||
<string name="emulation_load_state">Φόρτωση κατάστασης</string>
|
||||
<string name="emulation_edit_layout">Επεξεργασία διάταξης</string>
|
||||
|
|
|
|||
|
|
@ -212,7 +212,6 @@
|
|||
<string name="storage">Almacenamiento</string>
|
||||
<string name="compress_cia_installs">Comprimir el contenido de CIAs instalados</string>
|
||||
<string name="compress_cia_installs_description">Comprime el contenido de archivos CIA cuando son instalados a la SD emulada. Solo afecta contenido CIA instalado con esta opción activada.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Cámara interior</string>
|
||||
<string name="outer_left_camera">Cámara izquierda externa</string>
|
||||
|
|
@ -371,7 +370,6 @@ Se esperan fallos gráficos temporales cuando ésta esté activado.</string>
|
|||
<string name="learn_more">Más Información</string>
|
||||
<string name="close">Cerrar</string>
|
||||
<string name="reset_to_default">Restablecer valores de fábrica</string>
|
||||
<string name="redump_games"><![CDATA[Por favor, sigue las guías para volcar tus <a href=\"https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/\">cartuchos de juego</a> y/o <a href=\"https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/\">títulos instalados</a>.]]></string>
|
||||
<string name="option_default">Por defecto</string>
|
||||
<string name="none">Ninguno</string>
|
||||
<string name="auto">Auto</string>
|
||||
|
|
@ -413,9 +411,7 @@ Se esperan fallos gráficos temporales cuando ésta esté activado.</string>
|
|||
<string name="preferences_theme">Tema y Color</string>
|
||||
<string name="preferences_layout">Estilo</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Tu ROM está encriptada</string>
|
||||
<string name="loader_error_invalid_format">Formato de ROM no válido</string>
|
||||
<string name="loader_error_file_not_found">El archivo ROM no existe</string>
|
||||
<string name="no_game_present">¡No hay ningún juego iniciable!</string>
|
||||
|
||||
|
|
@ -47,9 +47,7 @@
|
|||
<string name="preferences_controls">Ohjain</string>
|
||||
<string name="preferences_graphics">Grafiikat</string>
|
||||
<string name="preferences_audio">Ääni</string>
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Pelitiedostosi on salattu.</string>
|
||||
<string name="loader_error_invalid_format">Epäsopiva pelitiedoston formaatti</string>
|
||||
<string name="emulation_show_fps">Näytä FPS</string>
|
||||
<string name="emulation_done">Valmis</string>
|
||||
<string name="emulation_open_settings">Avaa asetukset</string>
|
||||
|
|
|
|||
|
|
@ -212,6 +212,8 @@
|
|||
<string name="storage">Stockage</string>
|
||||
<string name="compress_cia_installs">Compresser le contenu CIA installé</string>
|
||||
<string name="compress_cia_installs_description">Compresse le contenu des fichiers CIA lorsqu\'ils sont installés sur la carte SD émulée. N\'affecte que le contenu CIA installé lorsque le paramètre est activé.</string>
|
||||
<string name="async_fs_operations">Opérations du système de fichiers asynchrones</string>
|
||||
<string name="async_fs_operations_description">Rend les accès au système de fichier émulé asynchrones. Réduit grandement les saccades liées au système de fichiers, mais peut légèrement augmenter les temps de chargement.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Caméra intérieure</string>
|
||||
|
|
@ -243,6 +245,8 @@
|
|||
<string name="texture_filter_description">Améliore l\'aspect visuel des applications en appliquant un filtre aux textures. Les filtres pris en charge sont Anime4K Ultrafast, Bicubique, ScaleForce, xBRZ freescale et MMPX.</string>
|
||||
<string name="delay_render_thread">Retarder le fil de rendu du jeu</string>
|
||||
<string name="delay_render_thread_description">Délai le thread de rendu du jeu lorsqu\'il soumet des données au GPU. Cela permet de résoudre les problèmes de performance dans les (très rares) applications avec des fréquences d\'images dynamiques.</string>
|
||||
<string name="simulate_3ds_gpu_timings">Simuler les timings du GPU de la 3DS</string>
|
||||
<string name="simulate_3ds_gpu_timings_description">Retarde les évènements de complétion du GPU en suivant des mesures prises sur du matériel réel, afin que les jeux aient des mesure de temps de GPU plus réalistes. Aide à stabiliser les jeux à taux de rafraichissement dynamique. Désactiver cette fonctionnalité peut améliorer la performance dans de rares cas, au détriment de la stabilité.</string>
|
||||
<string name="advanced">Avancé</string>
|
||||
<string name="texture_sampling_name">Échantillonnage de texture</string>
|
||||
<string name="texture_sampling_description">Remplace le filtre d\'échantillonnage utilisé par les jeux. Cela peut être utile dans certains cas où les jeux se comportent mal lors de la conversion ascendante. En cas de doute, réglez ce paramètre sur « Contrôlé par le jeu ».</string>
|
||||
|
|
@ -315,6 +319,8 @@
|
|||
<string name="audio_stretch_description">Étire le son pour réduire les saccades. Lorsqu\'il est activé, la latence est augmentée et les performances sont légèrement réduites.</string>
|
||||
<string name="realtime_audio">Activer l\'audio en temps réel</string>
|
||||
<string name="realtime_audio_description">Adapte la vitesse de lecture de l\'audio afin de ne pas être perturbé par les pertes de framerate. Ceci veut dire que l\'audio sera joué correctement même si le jeu n\'est pas aussi rapide. Peut provoquer des problèmes de synchronisation audio.</string>
|
||||
<string name="simulate_headphones_plugged">Simuler le branchement d\'écouteurs</string>
|
||||
<string name="simulate_headphones_plugged_description">Simule si des écouteurs sont branchés à la console 3DS émulée.</string>
|
||||
<string name="audio_input_type">Périphérique d\'entrée audio</string>
|
||||
<string name="sound_output_mode">Mode de sortie audio</string>
|
||||
|
||||
|
|
@ -370,7 +376,6 @@
|
|||
<string name="learn_more">En savoir plus</string>
|
||||
<string name="close">Fermer</string>
|
||||
<string name="reset_to_default">Par défaut</string>
|
||||
<string name="redump_games"><![CDATA[Merci de suivre les guides pour extraire à nouveau vos <a href=\"https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/\">cartouches</a> ou <a href=\"https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/\">titres installés</a>.]]></string>
|
||||
<string name="option_default">Par défaut</string>
|
||||
<string name="none">Aucun</string>
|
||||
<string name="auto">Auto</string>
|
||||
|
|
@ -413,11 +418,39 @@
|
|||
<string name="preferences_layout">Disposition</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_generic_title">Erreur lors du chargement de l\'application</string>
|
||||
<string name="loader_error_invalid_format">Format d\'application invalide</string>
|
||||
<string name="loader_error_invalid_format_description"><![CDATA[Le format de fichier d\'application n\'est pas supporté.<br>Assurez vous d\'utiliser un des formats compatibles : <ul><li>Images de cartouche : <b>.cci/.zcci/.3ds</b></li><li>Archives installables : <b>.cia/.zcia</b></li><li>Applications Homebrew : <b>.3dsx/.z3dsx</b></li><li>Conteneurs NCCH : <b>.cxi/.zcxi/.app</b></li><li>Fichiers ELF : <b>.elf/.axf</b></li></ul>]]></string>
|
||||
<string name="loader_error_invalid_system_mode">Mode système invalide</string>
|
||||
<string name="loader_error_invalid_system_mode_description">Les applications exclusives à la New 3DS ne peuvent pas être chargées sans activer le mode New 3DS.</string>
|
||||
<string name="loader_error_applying_patches">Erreur lors de l\'application de patchs</string>
|
||||
<string name="loader_error_applying_patches_description">Une erreur générique s\'est produite lors de l\'application de correctifs à l\'application. Veuillez consulter les logs pour plus de détails.</string>
|
||||
<string name="loader_error_patch_wrong_application">Échec de l\'application d\'un correctif car il est conçu pour une autre application. Veuillez vous assurer que vous utilisez les correctifs pour la bonne application, région et version.</string>
|
||||
<string name="loader_error_encrypted">Votre ROM est chiffrée</string>
|
||||
<string name="loader_error_invalid_format">Format de ROM non valide</string>
|
||||
<string name="loader_error_encrypted_description"><![CDATA[Azahar ne supporte pas les applications encryptées. Lisez notre <a href=\"https://azahar-emu.org/blog/game-loading-changes/\">article</a> pour plus d\'informations.]]></string>
|
||||
<string name="loader_error_file_not_found">Le fichier ROM n\'existe pas</string>
|
||||
<string name="no_game_present">Aucun jeu démarrable présent !</string>
|
||||
|
||||
<string name="loader_error_generic">Une erreur s\'est produite lors du chargement de la ROM : \"%s (%d)\"</string>
|
||||
<string name="core_error_success">Réussite</string>
|
||||
<string name="core_error_not_initialized">Non initialisé</string>
|
||||
<string name="core_error_get_loader">Aucun lanceur trouvé pour ce fichier, type de fichier incompatible</string>
|
||||
<string name="core_error_system_mode">Échec lors de l\'analyse du fichier</string>
|
||||
<string name="core_error_loader">Erreur de chargement générique</string>
|
||||
<string name="core_error_loader_encrypted">Fichier encrypté</string>
|
||||
<string name="core_error_loader_invalid_format">Fichier corrompu</string>
|
||||
<string name="core_error_loader_gba_title">Le fichier est une application GBA</string>
|
||||
<string name="core_error_loader_error_patches">Erreur lors de l\'application de patchs</string>
|
||||
<string name="core_error_loader_patches_invalid_title">Les correctifs sont pour une application différente</string>
|
||||
<string name="core_error_system_files">Fichiers systèmes manquants</string>
|
||||
<string name="core_error_savestate">Échec de la sauvegarde du point de récupération</string>
|
||||
<string name="core_error_artic_disconnected">Artic Base déconnecté</string>
|
||||
<string name="core_error_n3ds_application">Le fichier est une application New 3DS</string>
|
||||
<string name="core_error_core_exception_raised">Une erreur du cœur s\'est produite</string>
|
||||
<string name="core_error_memory_exception_raised">Une erreur de mémoire s\'est produite</string>
|
||||
<string name="core_error_shutdown_requested">Arrêt demandé</string>
|
||||
<string name="core_error_unknown">Erreur inconnue</string>
|
||||
|
||||
<!-- Emulation Menu -->
|
||||
<string name="emulation_menu_help">Appuyez sur Retour pour accéder au menu.</string>
|
||||
<string name="emulation_save_state">Établir pt de récupération</string>
|
||||
|
|
|
|||
|
|
@ -212,6 +212,8 @@
|
|||
<string name="storage">Archiviazione</string>
|
||||
<string name="compress_cia_installs">Comprimi i contenuti CIA installati</string>
|
||||
<string name="compress_cia_installs_description">Comprime il contenuto dei file CIA quando installati sulla scheda SD emulata. Riguarda solo i contenuti CIA installati mentre l\'impostazione è abilitata.</string>
|
||||
<string name="async_fs_operations">Operazioni filesystem asincrone</string>
|
||||
<string name="async_fs_operations_description">Rende asincroni gli accessi al filesystem emulato. Riduce drasticamente i micro-scatti legati alla lettura dei file, ma potrebbe aumentare leggermente i tempi di caricamento.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Fotocamera Interna</string>
|
||||
|
|
@ -243,6 +245,8 @@
|
|||
<string name="texture_filter_description">Migliora la grafica delle applicazioni applicando un filtro alle texture. I filtri supportati sono Anime4k Ultrafast, Bicubic, ScaleForce, xBRZ freescale e MMPX.</string>
|
||||
<string name="delay_render_thread">Ritarda il thread di rendering del gioco</string>
|
||||
<string name="delay_render_thread_description">Ritarda il thread di rendering del gioco quando invia dati alla GPU. Aiuta con i problemi di prestazioni nelle (poche) applicazioni con frame rate dinamici.</string>
|
||||
<string name="simulate_3ds_gpu_timings">Simula timing della GPU 3DS</string>
|
||||
<string name="simulate_3ds_gpu_timings_description">Ritarda gli eventi di completamento della GPU in base alle misurazioni effettuate su hardware reale, garantendo ai giochi una gestione dei tempi della GPU più realistica. Aiuta a stabilizzare i titoli con FPS dinamici. In rari casi, disattivare questa funzione può migliorare le prestazioni a discapito della stabilità.</string>
|
||||
<string name="advanced">Avanzato</string>
|
||||
<string name="texture_sampling_name">Campionamento texture</string>
|
||||
<string name="texture_sampling_description">Sovrascrive il filtro di campionamento utilizzato dai giochi. Questo può essere utile in alcuni casi con giochi che gestiscono male l\'upscaling. Se hai dubbi, imposta questa opzione su \"Gestito dal gioco\".</string>
|
||||
|
|
@ -315,6 +319,8 @@
|
|||
<string name="audio_stretch_description">Allunga l\'audio per ridurre gli scatti. Quando è abilitato, aumenta la latenza dell\'audio e riduce lievemente le prestazioni.</string>
|
||||
<string name="realtime_audio">Abilita audio in tempo reale</string>
|
||||
<string name="realtime_audio_description">Regola la velocità della riproduzione dell\'audio per compensare i cali nel framerate dell\'emulazione. Questo significa che l\'audio verrà riprodotto a velocità normale anche mentre il framerate del gioco è basso. Può causare problemi di desincronizzazione dell\'audio.</string>
|
||||
<string name="simulate_headphones_plugged">Simula cuffie collegate</string>
|
||||
<string name="simulate_headphones_plugged_description">Simula se le cuffie sono collegate al sistema 3DS emulato.</string>
|
||||
<string name="audio_input_type">Dispositivo di input dell\'audio</string>
|
||||
<string name="sound_output_mode">Modalità di output del suono</string>
|
||||
|
||||
|
|
@ -370,7 +376,6 @@
|
|||
<string name="learn_more">Scopri di più</string>
|
||||
<string name="close">Chiudi</string>
|
||||
<string name="reset_to_default">Reimposta</string>
|
||||
<string name="redump_games"><![CDATA[Per favore segui le guide per dumpare nuovamente le tue <a href=\"https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/\">cartuccie di gioco</a> o <a href=\"https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/\">titoli installati</a>.]]></string>
|
||||
<string name="option_default">Standard</string>
|
||||
<string name="none">Nessuno</string>
|
||||
<string name="auto">Auto</string>
|
||||
|
|
@ -413,11 +418,39 @@
|
|||
<string name="preferences_layout">Layout</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_generic_title">Errore nel caricamento dell\'applicazione</string>
|
||||
<string name="loader_error_invalid_format">Formato applicazione non valido</string>
|
||||
<string name="loader_error_invalid_format_description"><![CDATA[Formato del file dell\'applicazione non supportato.<br>Assicurati di utilizzare uno dei formati compatibili:<ul><li>Immagini schedine: <b>.cci/.zcci/.3ds</b></li><li>Archivi installabili: <b>.cia/.zcia</b></li><li>Titoli Homebrew: <b>.3dsx/.z3dsx</b></li><li>Container NCCH: <b>.cxi/.zcxi/.app</b></li><li>File ELF: <b>.elf/.axf</b></li></ul>]]></string>
|
||||
<string name="loader_error_invalid_system_mode">Modalità di sistema non valida</string>
|
||||
<string name="loader_error_invalid_system_mode_description">Le applicazioni esclusive per New 3DS non possono essere caricate senza aver abilitato la modalità New 3DS.</string>
|
||||
<string name="loader_error_applying_patches">Errore nell\'applicazione della patch</string>
|
||||
<string name="loader_error_applying_patches_description">Si è verificato un errore generico durante l\'applicazione di una patch all\'applicazione. Consulta il file di log per ulteriori dettagli.</string>
|
||||
<string name="loader_error_patch_wrong_application">Impossibile applicare la patch perché è progettata per un\'altra applicazione. Assicurati di utilizzare le patch corrette per l\'applicazione, la regione e la versione corrispondenti.</string>
|
||||
<string name="loader_error_encrypted">La tua ROM è criptata</string>
|
||||
<string name="loader_error_invalid_format">Formato ROM non valido</string>
|
||||
<string name="loader_error_encrypted_description"><![CDATA[Azahar non supporta le applicazioni criptate. Leggi il <a href=\"https://azahar-emu.org/blog/game-loading-changes/\">post sul nostro blog</a> per ulteriori informazioni.]]></string>
|
||||
<string name="loader_error_file_not_found">Il file ROM non esiste</string>
|
||||
<string name="no_game_present">Nessun gioco avviabile è presente!</string>
|
||||
|
||||
<string name="loader_error_generic">Si è verificato un errore durante il caricamento della ROM: \"%s (%d)\"</string>
|
||||
<string name="core_error_success">Successo</string>
|
||||
<string name="core_error_not_initialized">Non inizializzato</string>
|
||||
<string name="core_error_get_loader">Loader per il file non trovato, tipo di file non compatibile</string>
|
||||
<string name="core_error_system_mode">Analisi del file fallita</string>
|
||||
<string name="core_error_loader">Errore generico del loader</string>
|
||||
<string name="core_error_loader_encrypted">File criptato</string>
|
||||
<string name="core_error_loader_invalid_format">File corrotto</string>
|
||||
<string name="core_error_loader_gba_title">Il file è un titolo GBA</string>
|
||||
<string name="core_error_loader_error_patches">Errore nell\'applicazione della patch</string>
|
||||
<string name="core_error_loader_patches_invalid_title">Le patch sono per un\'altra applicazione</string>
|
||||
<string name="core_error_system_files">File di sistema mancanti</string>
|
||||
<string name="core_error_savestate">Savestate fallito</string>
|
||||
<string name="core_error_artic_disconnected">Artic Base disconnesso</string>
|
||||
<string name="core_error_n3ds_application">Il file è un\'applicazione New 3DS</string>
|
||||
<string name="core_error_core_exception_raised">Rilevata eccezione del core</string>
|
||||
<string name="core_error_memory_exception_raised">Rilevata eccezione della memoria</string>
|
||||
<string name="core_error_shutdown_requested">Spegnimento richiesto</string>
|
||||
<string name="core_error_unknown">Errore sconosciuto</string>
|
||||
|
||||
<!-- Emulation Menu -->
|
||||
<string name="emulation_menu_help">Premi Indietro per accedere al menù</string>
|
||||
<string name="emulation_save_state">Salva stato</string>
|
||||
|
|
@ -524,7 +557,7 @@
|
|||
<string name="copy_file_name">Copia file: %s</string>
|
||||
<string name="copy_complete">Copia completata</string>
|
||||
<string name="savestates">Stati salvati</string>
|
||||
<string name="savestate_warning_message">Attenzione: Gli stati salvati NON sostituiscono i salvataggi in-game, e non sono pensati per essere affidabili.\n\nUsali a tuo rischio e pericolo.</string>
|
||||
<string name="savestate_warning_message">Attenzione: i Savestate salvati NON sostituiscono i salvataggi in-game, e non sono pensati per essere affidabili.\n\nUsali a tuo rischio e pericolo.</string>
|
||||
|
||||
<!-- Software Keyboard -->
|
||||
<string name="software_keyboard">Tastiera Software</string>
|
||||
|
|
|
|||
|
|
@ -68,9 +68,7 @@
|
|||
<string name="preferences_graphics">Grafikk</string>
|
||||
<string name="preferences_audio">Lyd</string>
|
||||
<string name="preferences_debug">Feilsøk</string>
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Ditt ROM er kryptert</string>
|
||||
<string name="loader_error_invalid_format">Ugyldig ROM format </string>
|
||||
<string name="emulation_show_fps">Vis FPS</string>
|
||||
<string name="emulation_configure_controls">Konfigurer Kontroller</string>
|
||||
<string name="emulation_edit_layout">Endre Utseende </string>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="app_disclaimer">To oprogramowanie umożliwia uruchamianie aplikacja na konsolę przenośną Nintendo 3DS. Nie zawiera tytułów gier.\n\nPrzed rozpoczęciem emulacji należy wybrać folder do przechowywania danych użytkownika Azahar.\n\nCo to jest:\n<a href='https://web.archive.org/web/20240304193549/https://github.com/citra-emu/citra/wiki/Citra-Android-user-data-and-storage'>Wiki - Dane użytkownika i przechowywanie Azahar dla systemu Android</a></string>
|
||||
<string name="app_disclaimer">To oprogramowanie umożliwia uruchamianie aplikacje na konsolę przenośną Nintendo 3DS. Nie zawiera tytułów gier.\n\nPrzed rozpoczęciem emulacji należy wybrać folder do przechowywania danych użytkownika Azahar.\n\nCo to jest:\n<a href='https://web.archive.org/web/20240304193549/https://github.com/citra-emu/citra/wiki/Citra-Android-user-data-and-storage'>Wiki - Dane użytkownika i przechowywanie Azahar dla systemu Android</a></string>
|
||||
<string name="app_notification_channel_description">Powiadomienia o emulatorze Azahar</string>
|
||||
<string name="app_notification_running">Azahar jest uruchomiony</string>
|
||||
<string name="app_game_install_description">Następnie należy wybrać folder z aplikacjami. Azahar wyświetli wszystkie ROM-y 3DS w wybranym folderze w aplikacji.\n\nROMy CIA, aktualizacje i DLC będą musiały zostać zainstalowane oddzielnie, klikając ikonę folderu i wybierając opcję Zainstaluj CIA.</string>
|
||||
|
|
@ -212,6 +212,8 @@
|
|||
<string name="storage">Miejsce</string>
|
||||
<string name="compress_cia_installs">Kompresuj zainstalowaną zawartość CIA</string>
|
||||
<string name="compress_cia_installs_description">Kompresuje zawartość plików CIA zainstalowanych na emulowanej karcie SD. Ma wpływ tylko na zawartość CIA, która jest instalowana, gdy ustawienie jest włączone.</string>
|
||||
<string name="async_fs_operations">Asynchroniczne operacje systemu plików</string>
|
||||
<string name="async_fs_operations_description">Sprawia, że operacje na emulowanym systemie plików przebiegają asynchronicznie. Znacznie ogranicza opóźnienia związane z systemem plików, ale może nieznacznie wydłużyć czas ładowania.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Kamera wewnętrzna</string>
|
||||
|
|
@ -243,6 +245,8 @@
|
|||
<string name="texture_filter_description">Ulepsza oprawę wizualną aplikacji poprzez zastosowanie filtrów do tekstur. Obsługiwane filtry to Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale i MMPX.</string>
|
||||
<string name="delay_render_thread">Opóźnienie Renderowania Wątku Gry</string>
|
||||
<string name="delay_render_thread_description">Opóźnia wątek renderowania aplikacji podczas przesyłania danych do GPU. Pomaga w kwestiach wydajności w (bardzo niewielu) aplikacjach z dynamiczną liczbą klatek na sekundę.</string>
|
||||
<string name="simulate_3ds_gpu_timings">Symuluj czasy pracy procesora graficznego 3DS</string>
|
||||
<string name="simulate_3ds_gpu_timings_description">Opóźnia zdarzenia zakończenia pracy procesora graficznego GPU na podstawie pomiarów przeprowadzonych na rzeczywistym sprzęcie, dzięki czemu gry uzyskują bardziej realistyczne pomiary czasu pracy procesora graficznego. Pomaga to ustabilizować działanie gier z dynamiczną liczbą klatek na sekundę. Wyłączenie tej funkcji może w niektórych rzadkich przypadkach poprawić wydajność, ale kosztem stabilności działania.</string>
|
||||
<string name="advanced">Zaawansowane</string>
|
||||
<string name="texture_sampling_name">Próbkowanie tekstur</string>
|
||||
<string name="texture_sampling_description">Zastępuje filtr próbkowania używany przez gry. Może to być przydatne w niektórych przypadkach, gdy gry źle zachowują się podczas skalowania w górę. Jeśli nie masz pewności, ustaw tę opcję na Kontrolowane przez grę.</string>
|
||||
|
|
@ -370,7 +374,6 @@
|
|||
<string name="learn_more">Dowiedz się więcej</string>
|
||||
<string name="close">Zamknij</string>
|
||||
<string name="reset_to_default">Przywróć ustawienia domyślne</string>
|
||||
<string name="redump_games"><![CDATA[Postępuj zgodnie z poniższymi krokami, aby zrzucić <a href=\"https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/\">kartridże z grami</a> lub <a href=\"https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/\">zainstalowane tytuły</a>.]]></string>
|
||||
<string name="option_default">Domyślne</string>
|
||||
<string name="none">Brak</string>
|
||||
<string name="auto">Automatyczne</string>
|
||||
|
|
@ -413,11 +416,39 @@
|
|||
<string name="preferences_layout">Układ</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_generic_title">Wystąpił błąd podczas ładowania aplikacji</string>
|
||||
<string name="loader_error_invalid_format">Nieprawidłowy format aplikacji</string>
|
||||
<string name="loader_error_invalid_format_description"><![CDATA[Format pliku aplikacji nie jest obsługiwany.<br>Upewnij się, że używasz jednego z obsługiwanych formatów plików:<ul><li>Obrazy kartridża: <b>.cci/.zcci/.3ds</b></li><li>Archiwa instalacyjne: <b>.cia/.zcia</b></li><li>Tytuły homebrew: <b>.3dsx/.z3dsx</b></li><li>Pliki NCCH: <b>.cxi/.zcxi/.app</li><li>Pliki ELF: <b>.elf/.axf</b></li></ul>]]></string>
|
||||
<string name="loader_error_invalid_system_mode">Nieprawidłowy moduł systemu</string>
|
||||
<string name="loader_error_invalid_system_mode_description">Aplikacje dostępne wyłącznie na konsoli New 3DS nie mogą być uruchamiane bez włączenia trybu New 3DS.</string>
|
||||
<string name="loader_error_applying_patches">Błąd podczas instalowania łatki</string>
|
||||
<string name="loader_error_applying_patches_description">Podczas instalowania łatki w aplikacji wystąpił ogólny błąd. Więcej szczegółów można znaleźć w logu.</string>
|
||||
<string name="loader_error_patch_wrong_application">Nie udało się zainstalować łatki, ponieważ jest ona przeznaczona dla innej aplikacji. Upewnij się, że używasz łatki przeznaczonej dla właściwej aplikacji, regionu i wersji.</string>
|
||||
<string name="loader_error_encrypted">Twój ROM jest zaszyfrowany</string>
|
||||
<string name="loader_error_invalid_format">Nieprawidłowy format ROMu</string>
|
||||
<string name="loader_error_encrypted_description"><![CDATA[Azahar nie obsługuje zaszyfrowanych plików ROM. Więcej informacji znajdziesz na naszym <a href=\"https://azahar-emu.org/blog/game-loading-changes/\">blogu</a>.]]></string>
|
||||
<string name="loader_error_file_not_found">Plik ROMu nie istnieje</string>
|
||||
<string name="no_game_present">Brak gry do uruchomienia!</string>
|
||||
|
||||
<string name="loader_error_generic">Wystąpił błąd podczas ładowania pamięci ROM: \"%s (%d)\"</string>
|
||||
<string name="core_error_success">Sukces</string>
|
||||
<string name="core_error_not_initialized">Nie zainicjowano</string>
|
||||
<string name="core_error_get_loader">Nie znaleziono pliku, który miał zostać załadowany, typ pliku jest niekompatybilny</string>
|
||||
<string name="core_error_system_mode">Nie udało się przeanalizować pliku</string>
|
||||
<string name="core_error_loader">Ogólny błąd modułu ładującego</string>
|
||||
<string name="core_error_loader_encrypted">Zaszyfrowany plik</string>
|
||||
<string name="core_error_loader_invalid_format">Uszkodzony plik</string>
|
||||
<string name="core_error_loader_gba_title">Gra jest tytułem na konsolę GBA</string>
|
||||
<string name="core_error_loader_error_patches">Błąd podczas instalowania łatki</string>
|
||||
<string name="core_error_loader_patches_invalid_title">Te łatki są przeznaczone do innej aplikacji</string>
|
||||
<string name="core_error_system_files">Brakujące pliki systemowe</string>
|
||||
<string name="core_error_savestate">Nie powiodło się zapisanie savestate.u</string>
|
||||
<string name="core_error_artic_disconnected">Odłączono Artic Base</string>
|
||||
<string name="core_error_n3ds_application">Aplikacja jest dostępna wyłącznie na konsolę New 3DS</string>
|
||||
<string name="core_error_core_exception_raised">Wystąpił błąd rdzenia</string>
|
||||
<string name="core_error_memory_exception_raised">Wystąpił błąd pamięci</string>
|
||||
<string name="core_error_shutdown_requested">Prośba o zamknięcie</string>
|
||||
<string name="core_error_unknown">Nieznany błąd</string>
|
||||
|
||||
<!-- Emulation Menu -->
|
||||
<string name="emulation_menu_help">Naciśnij przycisk Wstecz, aby przejść do menu.</string>
|
||||
<string name="emulation_save_state">Zapisz stan</string>
|
||||
|
|
@ -565,6 +596,11 @@
|
|||
<!-- Disk Shader Cache -->
|
||||
<string name="preparing_shaders">Przygotowanie shaderów</string>
|
||||
<string name="building_shaders">Tworzenie%s</string>
|
||||
<string name="delete_shader_cache">Usuń pamięć podręczną shaderów</string>
|
||||
<string name="delete_cache_select_backend">Wybierz interfejs API grafiki, dla którego chcesz usunąć pamięć podręczną shaderów</string>
|
||||
<string name="deleting_shader_cache">Usuwanie pamięci podręcznej shaderów dla tytułu, proszę zaczekać...</string>
|
||||
<string name="shader_cache_deleted">Pamięć podręczna shaderów została usunięta</string>
|
||||
|
||||
<!-- About Game Dialog -->
|
||||
<string name="play">Odtwórz</string>
|
||||
<string name="uninstall_cia">Odinstaluj aktualizacje</string>
|
||||
|
|
@ -214,9 +214,7 @@
|
|||
<string name="preferences_audio">Аудио</string>
|
||||
<string name="preferences_debug">Отладка</string>
|
||||
<string name="preferences_theme">Тема и цвет</string>
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Образ зашифрован</string>
|
||||
<string name="loader_error_invalid_format">Неправильный формат образа</string>
|
||||
<string name="loader_error_file_not_found">Файл образа не существует</string>
|
||||
<string name="no_game_present">Отсутствует игра для загрузки!</string>
|
||||
|
||||
|
|
@ -212,7 +212,6 @@
|
|||
<string name="storage">Lagring</string>
|
||||
<string name="compress_cia_installs">Komprimera installerat CIA-innehåll</string>
|
||||
<string name="compress_cia_installs_description">Komprimerar innehållet i CIA-filer när det installeras på det emulerade SD-kortet. Påverkar endast CIA-innehåll som installeras medan inställningen är aktiverad.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Innerkamera</string>
|
||||
<string name="outer_left_camera">Yttre vänstra kameran</string>
|
||||
|
|
@ -370,7 +369,6 @@
|
|||
<string name="learn_more">Lär dig mer</string>
|
||||
<string name="close">Stäng</string>
|
||||
<string name="reset_to_default">Återställ till standard</string>
|
||||
<string name="redump_games"><![CDATA[Följ anvisningarna för att göra en ny dump av dina <a href=\"https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/\">spelkassetter</a> eller <a href=\"https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/\">installerade titlarna</a>.]]></string>
|
||||
<string name="option_default">Standard</string>
|
||||
<string name="none">Ingen</string>
|
||||
<string name="auto">Auto</string>
|
||||
|
|
@ -412,9 +410,7 @@
|
|||
<string name="preferences_theme">Tema och färg</string>
|
||||
<string name="preferences_layout">Layout</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">Ditt ROM är krypterat</string>
|
||||
<string name="loader_error_invalid_format"> Ogiltigt ROM-format</string>
|
||||
<string name="loader_error_file_not_found">ROM-filen finns inte</string>
|
||||
<string name="no_game_present">Inget startbart spel närvarande!</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@
|
|||
<string name="cannot_skip">Kullanıcı klasörü ayarlamayı atlayamazsınız</string>
|
||||
<string name="cannot_skip_directory_description">Bu adım Azahar\'ın çalışması için gereklidir. Lütfen devam etmek için bir dizin seçin.</string>
|
||||
<string name="selecting_user_directory_without_write_permissions">Kayıtların ve diğer bilgilerin depolandığı <a href="https://web.archive.org/web/20240304193549/https://github.com/citra-emu/citra/wiki/Citra-Android-user-data-and-storage">kullanıcı verileri</a>dizininizdeki yazma izinlerini kaybettiniz. Bu durum bazı uygulama veya Android güncellemelerinden sonra meydana gelebilir. Devam edebilmeniz için lütfen izinleri yeniden kazanmak üzere dizini yeniden seçin.</string>
|
||||
<string name="invalid_selection">Geçersiz Seçim</string>
|
||||
<string name="set_up_theme_settings">Tema Ayarları</string>
|
||||
<string name="setup_theme_settings_description">Azahar için tema tercihlerinizi yapılandırın.</string>
|
||||
<string name="setup_set_theme">Tema Ayarla</string>
|
||||
|
|
@ -346,9 +347,7 @@
|
|||
<string name="preferences_theme">Tema ve Renk</string>
|
||||
<string name="preferences_layout">Düzen</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_encrypted">ROM\'unuz Şifreli</string>
|
||||
<string name="loader_error_invalid_format">Geçersiz ROM formatı</string>
|
||||
<string name="loader_error_file_not_found">ROM dosyası mevcut değil</string>
|
||||
<string name="no_game_present">Başlatılabilir oyun yok!</string>
|
||||
|
||||
|
|
@ -233,6 +233,8 @@
|
|||
<string name="storage">Storage</string>
|
||||
<string name="compress_cia_installs">Compress installed CIA content</string>
|
||||
<string name="compress_cia_installs_description">Compresses the content of CIA files when installed to the emulated SD card. Only affects CIA content which is installed while the setting is enabled.</string>
|
||||
<string name="async_fs_operations">Asynchronous filesystem operations</string>
|
||||
<string name="async_fs_operations_description">Makes emulated filesystem accesses asynchronous. Greatly reduces filesystem related stutter, but may slightly increase load times.</string>
|
||||
|
||||
<!-- Camera settings strings -->
|
||||
<string name="inner_camera">Inner Camera</string>
|
||||
|
|
@ -264,6 +266,8 @@
|
|||
<string name="texture_filter_description">Enhances the visuals of applications by applying a filter to textures. The supported filters are Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale, and MMPX.</string>
|
||||
<string name="delay_render_thread">Delay Game Render Thread</string>
|
||||
<string name="delay_render_thread_description">Delay the game render thread when it submits data to the GPU. Helps with performance issues in the (very few) applications with dynamic framerates.</string>
|
||||
<string name="simulate_3ds_gpu_timings">Simulate 3DS GPU Timings</string>
|
||||
<string name="simulate_3ds_gpu_timings_description">Delays GPU completion events based on measurements taken from real hardware, so that games have more realistic GPU time measurements. Helps stabilize dynamic FPS games. Disabling this feature may improve performance in some rare cases at the cost of stability.</string>
|
||||
<string name="advanced">Advanced</string>
|
||||
<string name="texture_sampling_name">Texture Sampling</string>
|
||||
<string name="texture_sampling_description">Overrides the sampling filter used by games. This can be useful in certain cases with poorly behaved games when upscaling. If unsure, set this to Game Controlled.</string>
|
||||
|
|
@ -336,6 +340,8 @@
|
|||
<string name="audio_stretch_description">Stretches audio to reduce stuttering. When enabled, increases audio latency and slightly reduces performance.</string>
|
||||
<string name="realtime_audio">Enable Realtime Audio</string>
|
||||
<string name="realtime_audio_description">Scales audio playback speed to account for drops in emulation framerate. This means that audio will play at full speed even while the game framerate is low. May cause audio desync issues.</string>
|
||||
<string name="simulate_headphones_plugged">Simulate Headphones Plugged In</string>
|
||||
<string name="simulate_headphones_plugged_description">Simulates whether headphones are plugged in to the emulated 3DS system.</string>
|
||||
<string name="audio_input_type">Audio Input Device</string>
|
||||
<string name="sound_output_mode">Sound Output Mode</string>
|
||||
|
||||
|
|
@ -391,7 +397,6 @@
|
|||
<string name="learn_more">Learn More</string>
|
||||
<string name="close">Close</string>
|
||||
<string name="reset_to_default">Reset to Default</string>
|
||||
<string name="redump_games"><![CDATA[Please follow the guides to redump your <a href="https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/">game cartridges</a> or <a href="https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/">installed titles</a>.]]></string>
|
||||
<string name="option_default">Default</string>
|
||||
<string name="none">None</string>
|
||||
<string name="auto">Auto</string>
|
||||
|
|
@ -434,11 +439,39 @@
|
|||
<string name="preferences_layout">Layout</string>
|
||||
|
||||
<!-- ROM loading errors -->
|
||||
<string name="loader_error_generic_title">Error loading application</string>
|
||||
<string name="loader_error_invalid_format">Invalid application format</string>
|
||||
<string name="loader_error_invalid_format_description"><![CDATA[The application file format not supported.<br>Please make sure you are using one of the compatible file formats:<ul><li>Cartridge images: <b>.cci/.zcci/.3ds</b></li><li>Installable archives: <b>.cia/.zcia</b></li><li>Homebrew titles: <b>.3dsx/.z3dsx</b></li><li>NCCH containers: <b>.cxi/.zcxi/.app</b></li><li>ELF files: <b>.elf/.axf</b></li></ul>]]></string>
|
||||
<string name="loader_error_invalid_system_mode">Invalid system mode</string>
|
||||
<string name="loader_error_invalid_system_mode_description">New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode.</string>
|
||||
<string name="loader_error_applying_patches">Error applying patches</string>
|
||||
<string name="loader_error_applying_patches_description">A generic error occurred while applying a patch to the application. Please check the log for more details.</string>
|
||||
<string name="loader_error_patch_wrong_application">Failed to apply a patch because it is designed for a different application. Please make sure you are using the patches for the right application, region and version.</string>
|
||||
<string name="loader_error_encrypted">Your ROM is Encrypted</string>
|
||||
<string name="loader_error_invalid_format">Invalid ROM format</string>
|
||||
<string name="loader_error_encrypted_description"><![CDATA[Azahar does not support encrypted applications. Read our <a href="https://azahar-emu.org/blog/game-loading-changes/">blog post</a> for more information.]]></string>
|
||||
<string name="loader_error_file_not_found">ROM file does not exist</string>
|
||||
<string name="no_game_present">No bootable game present!</string>
|
||||
|
||||
<string name="loader_error_generic">An error occurred while loading ROM: \"%s (%d)\"</string>
|
||||
<string name="core_error_success">Success</string>
|
||||
<string name="core_error_not_initialized">Not initialized</string>
|
||||
<string name="core_error_get_loader">Loader for file not found, incompatible file type</string>
|
||||
<string name="core_error_system_mode">Failed to parse file</string>
|
||||
<string name="core_error_loader">Generic loader error</string>
|
||||
<string name="core_error_loader_encrypted">Encrypted file</string>
|
||||
<string name="core_error_loader_invalid_format">Corrupted file</string>
|
||||
<string name="core_error_loader_gba_title">File is GBA title</string>
|
||||
<string name="core_error_loader_error_patches">Error applying patches</string>
|
||||
<string name="core_error_loader_patches_invalid_title">Patches are for a different application</string>
|
||||
<string name="core_error_system_files">Missing system files</string>
|
||||
<string name="core_error_savestate">Savestate failed</string>
|
||||
<string name="core_error_artic_disconnected">Artic Base disconnected</string>
|
||||
<string name="core_error_n3ds_application">File is New 3DS application</string>
|
||||
<string name="core_error_core_exception_raised">Core exception raised</string>
|
||||
<string name="core_error_memory_exception_raised">Memory exception raised</string>
|
||||
<string name="core_error_shutdown_requested">Shutdown requested</string>
|
||||
<string name="core_error_unknown">Unknown error</string>
|
||||
|
||||
<!-- Emulation Menu -->
|
||||
<string name="emulation_menu_help">Press Back to access the menu.</string>
|
||||
<string name="emulation_save_state">Save State</string>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
plugins {
|
||||
id("com.android.application") version "8.13.1" apply false
|
||||
id("com.android.library") version "8.13.1" apply false
|
||||
id("com.android.application") version "8.13.2" apply false
|
||||
id("com.android.library") version "8.13.2" apply false
|
||||
id("org.jetbrains.kotlin.android") version "2.0.20" apply false
|
||||
id("org.jetbrains.kotlin.plugin.serialization") version "2.0.20"
|
||||
}
|
||||
|
|
|
|||
12
src/citra_cli/CMakeLists.txt
Normal file
12
src/citra_cli/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
add_library(citra_cli STATIC EXCLUDE_FROM_ALL
|
||||
citra_cli.h
|
||||
citra_cli.cpp
|
||||
compression_cli.h
|
||||
compression_cli.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(citra_cli PRIVATE citra_common citra_core)
|
||||
|
||||
if (MSVC)
|
||||
target_link_libraries(citra_cli PRIVATE getopt)
|
||||
endif()
|
||||
45
src/citra_cli/citra_cli.cpp
Normal file
45
src/citra_cli/citra_cli.cpp
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
// Copyright Citra Emulator Project / Azahar Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#undef _UNICODE
|
||||
#include <getopt.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "citra_cli/citra_cli.h"
|
||||
#include "citra_cli/compression_cli.h"
|
||||
|
||||
namespace CitraCLI {
|
||||
|
||||
bool CheckForOptions(const char* optstring, int argc, char* argv[]) {
|
||||
const int original_opterr = opterr;
|
||||
opterr = 0; // Temporarily suppress invalid option messages
|
||||
|
||||
bool return_value = false;
|
||||
int option;
|
||||
while ((option = getopt(argc, argv, optstring)) != -1) {
|
||||
for (size_t i = 0; optstring[i] != '\0'; ++i) {
|
||||
if (optstring[i] == ':') {
|
||||
continue;
|
||||
}
|
||||
if (option == optstring[i]) {
|
||||
return_value = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
opterr = original_opterr;
|
||||
optind = 1; // Reset getopt so that it can be used again
|
||||
return return_value;
|
||||
}
|
||||
|
||||
int ParseCommand(int argc, char* argv[]) {
|
||||
if (CheckForOptions(compression_ops_optstring, argc, argv)) {
|
||||
return ParseCompressionCommand(argc, argv);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace CitraCLI
|
||||
13
src/citra_cli/citra_cli.h
Normal file
13
src/citra_cli/citra_cli.h
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
// Copyright Citra Emulator Project / Azahar Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
namespace CitraCLI {
|
||||
|
||||
constexpr char compression_ops_optstring[] = "c:x:o:";
|
||||
constexpr char cli_capture_optstring[] = "c:x:o:";
|
||||
|
||||
bool CheckForOptions(const char* optstring, int argc, char* argv[]);
|
||||
int ParseCommand(int argc, char* argv[]);
|
||||
|
||||
} // namespace CitraCLI
|
||||
129
src/citra_cli/compression_cli.cpp
Normal file
129
src/citra_cli/compression_cli.cpp
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
// Copyright Citra Emulator Project / Azahar Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <filesystem>
|
||||
#include <iostream>
|
||||
#undef _UNICODE
|
||||
#include <getopt.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "citra_cli/citra_cli.h"
|
||||
#include "common/common_paths.h"
|
||||
#include "common/logging/log.h"
|
||||
#include "common/zstd_compression.h"
|
||||
#include "core/loader/loader.h"
|
||||
|
||||
namespace CitraCLI {
|
||||
|
||||
static std::string strip_path_filename(std::string path) {
|
||||
namespace fs = std::filesystem;
|
||||
fs::path path_path = path;
|
||||
fs::path stripped_path = path_path.remove_filename();
|
||||
return stripped_path.string();
|
||||
}
|
||||
|
||||
static std::string build_output_path(std::string source_path, std::string extension,
|
||||
std::string output_dir_path) {
|
||||
namespace fs = std::filesystem;
|
||||
fs::path source_path_path = source_path;
|
||||
std::string recommended_filename =
|
||||
source_path_path.filename().replace_extension(extension).string();
|
||||
return output_dir_path + DIR_SEP + recommended_filename;
|
||||
}
|
||||
|
||||
static bool perform_z3ds_operation(bool is_compressing, const std::string& src_file,
|
||||
const std::string& dst_file,
|
||||
const std::array<u8, 4>& underlying_magic, size_t frame_size,
|
||||
std::function<FileUtil::ProgressCallback>&& update_callback,
|
||||
std::unordered_map<std::string, std::vector<u8>> metadata) {
|
||||
if (is_compressing) {
|
||||
return FileUtil::CompressZ3DSFile(src_file, dst_file, underlying_magic, frame_size,
|
||||
std::move(update_callback), metadata);
|
||||
} else { // decompressing
|
||||
return FileUtil::DeCompressZ3DSFile(src_file, dst_file, std::move(update_callback));
|
||||
}
|
||||
}
|
||||
|
||||
int ParseCompressionCommand(int argc, char* argv[]) {
|
||||
Common::Log::Initialize();
|
||||
Common::Log::Start();
|
||||
|
||||
const std::string common_error_addendum = "\nCheck log for more details.";
|
||||
|
||||
std::optional<std::string> compress_path; // The path of a decompressed file to be compressed
|
||||
std::optional<std::string> decompress_path; // The path of a compressed file to be decompressed
|
||||
std::optional<std::string> output_dir_path; // The directory which will contain processed file
|
||||
|
||||
int option;
|
||||
while ((option = getopt(argc, argv, compression_ops_optstring)) != -1) {
|
||||
switch (option) {
|
||||
case 'c':
|
||||
compress_path = optarg;
|
||||
break;
|
||||
case 'x':
|
||||
decompress_path = optarg;
|
||||
break;
|
||||
case 'o':
|
||||
output_dir_path = optarg;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool is_compressing; // True if compressing, false if decompressing
|
||||
std::string source_path;
|
||||
std::string action_description; // String containing a user-friendly verb
|
||||
// describing the performed operation
|
||||
if (compress_path.has_value()) {
|
||||
is_compressing = true;
|
||||
source_path = compress_path.value();
|
||||
action_description = "Compressing";
|
||||
} else if (decompress_path.has_value()) {
|
||||
is_compressing = false;
|
||||
source_path = decompress_path.value();
|
||||
action_description = "Decompressing";
|
||||
} else {
|
||||
std::cout << "Invalid option combination provided. Quitting." << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::cout << action_description << " file '" << source_path << "'..." << std::flush;
|
||||
|
||||
if (!output_dir_path.has_value()) {
|
||||
output_dir_path = strip_path_filename(source_path);
|
||||
}
|
||||
|
||||
auto compress_info = Loader::GetCompressFileInfo(source_path, is_compressing);
|
||||
|
||||
if (!compress_info.has_value()) {
|
||||
std::cout << "fail: Failed to get compress info for file." << common_error_addendum
|
||||
<< std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::string extension; // The extension that the final processed file should have
|
||||
if (is_compressing) {
|
||||
extension = compress_info.value().first.recommended_compressed_extension;
|
||||
} else {
|
||||
extension = compress_info.value().first.recommended_uncompressed_extension;
|
||||
}
|
||||
|
||||
std::string output_path = build_output_path(source_path, extension, output_dir_path.value());
|
||||
|
||||
bool success = perform_z3ds_operation(
|
||||
is_compressing, source_path, output_path, compress_info.value().first.underlying_magic,
|
||||
compress_info.value().second, nullptr, compress_info.value().first.default_metadata);
|
||||
if (!success) {
|
||||
FileUtil::Delete(output_path);
|
||||
std::cout << "fail: Failed to perform Z3DS operation." << common_error_addendum
|
||||
<< std::endl;
|
||||
return 1;
|
||||
}
|
||||
std::cout << "success" << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // namespace CitraCLI
|
||||
9
src/citra_cli/compression_cli.h
Normal file
9
src/citra_cli/compression_cli.h
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
// Copyright Citra Emulator Project / Azahar Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
namespace CitraCLI {
|
||||
|
||||
int ParseCompressionCommand(int argc, char* argv[]);
|
||||
|
||||
}
|
||||
|
|
@ -48,7 +48,27 @@ if (APPLE)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
target_link_libraries(citra_meta PRIVATE citra_common fmt)
|
||||
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND MINGW)
|
||||
# TODO: Do this for all executables, not just citra_meta
|
||||
# TODO: Don't hardcode MXE directory to root?
|
||||
set(dllwalker_command "${CMAKE_SOURCE_DIR}/externals/dllwalker/dllwalker.rb"
|
||||
$<TARGET_FILE:citra_meta>
|
||||
/mxe/usr/x86_64-w64-mingw32.shared/bin/
|
||||
/mxe/usr/x86_64-w64-mingw32.shared/qt6/bin/)
|
||||
set(dll_list_filename "${CMAKE_CURRENT_BINARY_DIR}/required_dlls_list.txt")
|
||||
add_custom_command(TARGET citra_meta POST_BUILD
|
||||
COMMAND ${dllwalker_command} > ${dll_list_filename}
|
||||
)
|
||||
add_custom_command(TARGET citra_meta POST_BUILD
|
||||
COMMAND cat ${dll_list_filename} | xargs -I {} ${CMAKE_COMMAND} -E copy {} $<TARGET_FILE_DIR:citra_meta>
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:citra_meta>/plugins/"
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory /mxe/usr/x86_64-w64-mingw32.shared/qt6/plugins/ "$<TARGET_FILE_DIR:citra_meta>/plugins/"
|
||||
COMMAND_EXPAND_LISTS
|
||||
DEPENDS ${dll_list_filename}
|
||||
)
|
||||
endif()
|
||||
|
||||
target_link_libraries(citra_meta PRIVATE citra_cli citra_common fmt)
|
||||
|
||||
if (ENABLE_QT)
|
||||
target_link_libraries(citra_meta PRIVATE citra_qt)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ namespace Common {
|
|||
|
||||
constexpr char help_string[] =
|
||||
"Usage: {} [options] <file path>\n"
|
||||
"-c [path] Z3DS compress a ROM located at the given path\n"
|
||||
" (optionally provide '-o [path]' for output directory)\n"
|
||||
"-d, --dump-video [path] Dump video recording of emulator playback to the given file path\n"
|
||||
"-f, --fullscreen Start in fullscreen mode\n"
|
||||
"-g, --gdbport [port] Enable gdb stub on the given port\n"
|
||||
|
|
@ -24,6 +26,8 @@ constexpr char help_string[] =
|
|||
"the old citra-room executable)\n"
|
||||
#endif
|
||||
"-v, --version Output version information and exit\n"
|
||||
"-w, --windowed Start in windowed mode";
|
||||
"-w, --windowed Start in windowed mode\n"
|
||||
"-x [path] Decompress a Z3DS compressed ROM located at the given path\n"
|
||||
" (optionally provide '-o [path]' for output directory)";
|
||||
|
||||
} // namespace Common
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <iostream>
|
||||
|
||||
#include "citra_cli/citra_cli.h"
|
||||
#include "common/detached_tasks.h"
|
||||
#include "common/scope_exit.h"
|
||||
|
||||
|
|
@ -59,6 +60,10 @@ int main(int argc, char* argv[]) {
|
|||
}
|
||||
#endif
|
||||
|
||||
if (CitraCLI::CheckForOptions(CitraCLI::cli_capture_optstring, argc, argv)) {
|
||||
return CitraCLI::ParseCommand(argc, argv);
|
||||
}
|
||||
|
||||
#if ENABLE_ROOM
|
||||
bool launch_room = false;
|
||||
for (int i = 1; i < argc; i++) {
|
||||
|
|
|
|||
|
|
@ -225,10 +225,13 @@ if (ENABLE_QT_TRANSLATION)
|
|||
if (GENERATE_QT_TRANSLATION)
|
||||
get_target_property(QT_SRCS citra_qt SOURCES)
|
||||
get_target_property(QT_INCLUDES citra_qt INCLUDE_DIRECTORIES)
|
||||
qt_add_lupdate(citra_qt TS_FILES ${CITRA_QT_LANGUAGES}/en.ts
|
||||
qt_add_lupdate(
|
||||
LUPDATE_TARGET citra_qt_lupdate
|
||||
SOURCES ${QT_SRCS} ${UIS}
|
||||
TS_FILES ${CITRA_QT_LANGUAGES}/en.ts
|
||||
INCLUDE_DIRECTORIES ${QT_INCLUDES}
|
||||
NO_GLOBAL_TARGET)
|
||||
NO_GLOBAL_TARGET
|
||||
)
|
||||
add_custom_target(translation ALL DEPENDS citra_qt_lupdate)
|
||||
endif()
|
||||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,9 @@
|
|||
#include "citra_qt/debugger/graphics/graphics_vertex_shader.h"
|
||||
#include "citra_qt/debugger/ipc/recorder.h"
|
||||
#include "citra_qt/debugger/lle_service_modules.h"
|
||||
#if MICROPROFILE_ENABLED
|
||||
#include "citra_qt/debugger/profiler.h"
|
||||
#endif
|
||||
#include "citra_qt/debugger/registers.h"
|
||||
#include "citra_qt/debugger/wait_tree.h"
|
||||
#ifdef USE_DISCORD_PRESENCE
|
||||
|
|
@ -712,11 +714,6 @@ void GMainWindow::InitializeDebugWidgets() {
|
|||
microProfileDialog = new MicroProfileDialog(this);
|
||||
microProfileDialog->hide();
|
||||
debug_menu->addAction(microProfileDialog->toggleViewAction());
|
||||
#else
|
||||
auto micro_profile_stub = new QAction(tr("MicroProfile (unavailable)"), this);
|
||||
micro_profile_stub->setEnabled(false);
|
||||
micro_profile_stub->setChecked(false);
|
||||
debug_menu->addAction(micro_profile_stub);
|
||||
#endif
|
||||
|
||||
registersWidget = new RegistersWidget(system, this);
|
||||
|
|
@ -855,10 +852,11 @@ void GMainWindow::InitializeHotkeys() {
|
|||
|
||||
// QAction Hotkeys
|
||||
const auto link_action_shortcut = [&](QAction* action, const QString& action_name,
|
||||
const bool primary_only = false) {
|
||||
const bool primary_only = false,
|
||||
const bool auto_repeat = false) {
|
||||
static const QString main_window = QStringLiteral("Main Window");
|
||||
action->setShortcut(hotkey_registry.GetKeySequence(main_window, action_name));
|
||||
action->setAutoRepeat(false);
|
||||
action->setAutoRepeat(auto_repeat);
|
||||
this->addAction(action);
|
||||
if (!primary_only)
|
||||
secondary_window->addAction(action);
|
||||
|
|
@ -875,6 +873,11 @@ void GMainWindow::InitializeHotkeys() {
|
|||
link_action_shortcut(ui->action_Show_Status_Bar, QStringLiteral("Toggle Status Bar"));
|
||||
link_action_shortcut(ui->action_Fullscreen, fullscreen, true);
|
||||
link_action_shortcut(ui->action_Capture_Screenshot, QStringLiteral("Capture Screenshot"));
|
||||
link_action_shortcut(ui->action_Debug_Pause, QStringLiteral("Debug Pause"));
|
||||
link_action_shortcut(ui->action_Debug_Resume, QStringLiteral("Debug Resume"));
|
||||
link_action_shortcut(ui->action_Debug_Step, QStringLiteral("Debug Step"), false, true);
|
||||
link_action_shortcut(ui->action_Debug_Unschedule_All, QStringLiteral("Debug Unschedule All"));
|
||||
link_action_shortcut(ui->action_Debug_Schedule_All, QStringLiteral("Debug Schedule All"));
|
||||
link_action_shortcut(ui->action_Screen_Layout_Swap_Screens, QStringLiteral("Swap Screens"));
|
||||
link_action_shortcut(ui->action_Screen_Layout_Upright_Screens,
|
||||
QStringLiteral("Rotate Screens Upright"));
|
||||
|
|
@ -1189,6 +1192,27 @@ void GMainWindow::ConnectMenuEvents() {
|
|||
connect_menu(ui->action_Capture_Screenshot, &GMainWindow::OnCaptureScreenshot);
|
||||
connect_menu(ui->action_Dump_Video, &GMainWindow::OnDumpVideo);
|
||||
|
||||
// Tools debug
|
||||
connect_menu(ui->action_Debug_Pause, [this] {
|
||||
if (emu_thread) {
|
||||
emu_thread->SetRunning(false);
|
||||
}
|
||||
});
|
||||
connect_menu(ui->action_Debug_Resume, [this] {
|
||||
if (emu_thread) {
|
||||
emu_thread->SetRunning(true);
|
||||
}
|
||||
});
|
||||
connect_menu(ui->action_Debug_Step, [this] {
|
||||
if (emu_thread) {
|
||||
emu_thread->ExecStep();
|
||||
}
|
||||
});
|
||||
connect_menu(ui->action_Debug_Unschedule_All,
|
||||
[this] { system.DebugUnscheduleAllThreadsFromFrontend(true); });
|
||||
connect_menu(ui->action_Debug_Schedule_All,
|
||||
[this] { system.DebugUnscheduleAllThreadsFromFrontend(false); });
|
||||
|
||||
// Tools
|
||||
connect_menu(ui->action_Compress_ROM_File, &GMainWindow::OnCompressFile);
|
||||
connect_menu(ui->action_Decompress_ROM_File, &GMainWindow::OnDecompressFile);
|
||||
|
|
@ -1345,61 +1369,39 @@ bool GMainWindow::LoadROM(const QString& filename) {
|
|||
system.Load(*render_window, filename.toStdString(), secondary_window)};
|
||||
|
||||
if (result != Core::System::ResultStatus::Success) {
|
||||
QString invalid_format = tr("Invalid application format");
|
||||
QString invalid_format_description =
|
||||
tr("The application file format not supported.<br>Please make sure you are using one "
|
||||
"of the compatible file formats:<ul><li>Cartridge images: "
|
||||
"<b>.cci/.zcci/.3ds</b></li><li>Installable archives: "
|
||||
"<b>.cia/.zcia</b></li><li>Homebrew titles: <b>.3dsx/.z3dsx</b></li><li>NCCH "
|
||||
"containers: <b>.cxi/.zcxi/.app</b></li><li>ELF files: <b>.elf/.axf</b></li></ul>");
|
||||
|
||||
switch (result) {
|
||||
case Core::System::ResultStatus::ErrorGetLoader:
|
||||
LOG_CRITICAL(Frontend, "Failed to obtain loader for {}", filename.toStdString());
|
||||
QMessageBox::critical(
|
||||
this, tr("Invalid App Format"),
|
||||
tr("Your app format is not supported.<br/>Please follow the guides to redump your "
|
||||
"<a "
|
||||
"href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/"
|
||||
"dumping-game-cartridges/'>game "
|
||||
"cartridges</a> or "
|
||||
"<a "
|
||||
"href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/"
|
||||
"dumping-installed-titles/'>installed "
|
||||
"titles</a>."));
|
||||
QMessageBox::critical(this, invalid_format, invalid_format_description);
|
||||
break;
|
||||
|
||||
case Core::System::ResultStatus::ErrorSystemMode:
|
||||
LOG_CRITICAL(Frontend, "Failed to load App!");
|
||||
QMessageBox::critical(
|
||||
this, tr("App Corrupted"),
|
||||
tr("Your app is corrupted. <br/>Please follow the guides to redump your "
|
||||
"<a "
|
||||
"href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/"
|
||||
"dumping-game-cartridges/'>game "
|
||||
"cartridges</a> or "
|
||||
"<a "
|
||||
"href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/"
|
||||
"dumping-installed-titles/'>installed "
|
||||
"titles</a>."));
|
||||
LOG_CRITICAL(Frontend, "Failed to load application!");
|
||||
QMessageBox::critical(this, invalid_format, invalid_format_description);
|
||||
break;
|
||||
|
||||
case Core::System::ResultStatus::ErrorLoader_ErrorEncrypted: {
|
||||
QMessageBox::critical(this, tr("App Encrypted"),
|
||||
tr("Your app is encrypted. <br/>"
|
||||
QMessageBox::critical(this, tr("Encrypted application"),
|
||||
tr("Encrypted applications are not supported.<br/>"
|
||||
"<a "
|
||||
"href='https://azahar-emu.org/blog/game-loading-changes/'>"
|
||||
"Please check our blog for more info.</a>"));
|
||||
break;
|
||||
}
|
||||
case Core::System::ResultStatus::ErrorLoader_ErrorInvalidFormat:
|
||||
QMessageBox::critical(
|
||||
this, tr("Invalid App Format"),
|
||||
tr("Your app format is not supported.<br/>Please follow the guides to redump your "
|
||||
"<a "
|
||||
"href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/"
|
||||
"dumping-game-cartridges/'>game "
|
||||
"cartridges</a> or "
|
||||
"<a "
|
||||
"href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/"
|
||||
"dumping-installed-titles/'>installed "
|
||||
"titles</a>."));
|
||||
QMessageBox::critical(this, invalid_format, invalid_format_description);
|
||||
break;
|
||||
|
||||
case Core::System::ResultStatus::ErrorLoader_ErrorGbaTitle:
|
||||
QMessageBox::critical(this, tr("Unsupported App"),
|
||||
QMessageBox::critical(this, tr("Unsupported application"),
|
||||
tr("GBA Virtual Console is not supported by Azahar."));
|
||||
break;
|
||||
|
||||
|
|
@ -1416,10 +1418,27 @@ bool GMainWindow::LoadROM(const QString& filename) {
|
|||
tr("New 3DS exclusive applications cannot be loaded without "
|
||||
"enabling the New 3DS mode."));
|
||||
break;
|
||||
case Core::System::ResultStatus::ErrorLoader:
|
||||
QMessageBox::critical(this, tr("Generic load error"),
|
||||
tr("An generic load error occurred while loading the "
|
||||
"application.<br/>Please check the log for more details."));
|
||||
break;
|
||||
case Core::System::ResultStatus::ErrorLoader_ErrorPatches:
|
||||
QMessageBox::critical(this, tr("Error applying patches"),
|
||||
tr("A generic error occurred while applying a patch to the "
|
||||
"application.<br/>Please check the log for more details."));
|
||||
break;
|
||||
case Core::System::ResultStatus::ErrorLoader_ErrorPatchesInvalidTitle:
|
||||
QMessageBox::critical(
|
||||
this, tr("Error applying patches"),
|
||||
tr("Failed to apply a patch because it is designed for a different "
|
||||
"application.<br/>Please make sure you are using the patches for "
|
||||
"the right application, region and version."));
|
||||
break;
|
||||
default:
|
||||
QMessageBox::critical(
|
||||
this, tr("Error while loading App!"),
|
||||
tr("An unknown error occurred. Please see the log for more details."));
|
||||
this, tr("Error while loading application"),
|
||||
tr("An unknown error occurred.<br/>Please see the log for more details."));
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
|
|
@ -1478,7 +1497,8 @@ void GMainWindow::BootGame(const QString& filename) {
|
|||
auto loader = Loader::GetLoader(path);
|
||||
|
||||
u64 title_id{0};
|
||||
Loader::ResultStatus res = loader->ReadProgramId(title_id);
|
||||
Loader::ResultStatus res =
|
||||
loader ? loader->ReadProgramId(title_id) : Loader::ResultStatus::Error;
|
||||
|
||||
if (Loader::ResultStatus::Success == res) {
|
||||
// Load per game settings
|
||||
|
|
@ -1491,7 +1511,7 @@ void GMainWindow::BootGame(const QString& filename) {
|
|||
|
||||
// Artic Server cannot accept a client multiple times, so multiple loaders are not
|
||||
// possible. Instead register the app loader early and do not create it again on system load.
|
||||
if (!loader->SupportsMultipleInstancesForSameFile()) {
|
||||
if (loader && !loader->SupportsMultipleInstancesForSameFile()) {
|
||||
system.RegisterAppLoaderEarly(loader);
|
||||
}
|
||||
|
||||
|
|
@ -3218,64 +3238,6 @@ void GMainWindow::OnDumpVideo() {
|
|||
}
|
||||
}
|
||||
|
||||
static std::optional<std::pair<Loader::AppLoader::CompressFileInfo, size_t>> GetCompressFileInfo(
|
||||
const std::string& filepath, bool compress) {
|
||||
Loader::AppLoader::CompressFileInfo compress_info{};
|
||||
compress_info.is_supported = false;
|
||||
size_t frame_size{};
|
||||
auto loader = Loader::GetLoader(filepath);
|
||||
if (loader) {
|
||||
compress_info = loader->GetCompressFileInfo();
|
||||
frame_size = FileUtil::Z3DSWriteIOFile::DEFAULT_FRAME_SIZE;
|
||||
} else {
|
||||
bool is_compressed = false;
|
||||
if (Service::AM::CheckCIAToInstall(filepath, is_compressed, compress ? true : false) ==
|
||||
Service::AM::InstallStatus::Success) {
|
||||
compress_info.is_supported = true;
|
||||
compress_info.is_compressed = is_compressed;
|
||||
compress_info.recommended_compressed_extension = "zcia";
|
||||
compress_info.recommended_uncompressed_extension = "cia";
|
||||
compress_info.underlying_magic = std::array<u8, 4>({'C', 'I', 'A', '\0'});
|
||||
frame_size = FileUtil::Z3DSWriteIOFile::DEFAULT_CIA_FRAME_SIZE;
|
||||
if (compress) {
|
||||
auto meta_info = Service::AM::GetCIAInfos(filepath);
|
||||
if (meta_info.Succeeded()) {
|
||||
const auto& meta_info_val = meta_info.Unwrap();
|
||||
std::vector<u8> value(sizeof(Service::AM::TitleInfo));
|
||||
memcpy(value.data(), &meta_info_val.first, sizeof(Service::AM::TitleInfo));
|
||||
compress_info.default_metadata.emplace("titleinfo", value);
|
||||
if (meta_info_val.second) {
|
||||
value.resize(sizeof(Loader::SMDH));
|
||||
memcpy(value.data(), meta_info_val.second.get(), sizeof(Loader::SMDH));
|
||||
compress_info.default_metadata.emplace("smdh", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!compress_info.is_supported) {
|
||||
LOG_ERROR(Frontend,
|
||||
"Error {} file {}, the selected file is not a compatible 3DS ROM format or is "
|
||||
"encrypted.",
|
||||
compress ? "compressing" : "decompressing", filepath);
|
||||
return {};
|
||||
}
|
||||
if (compress_info.is_compressed && compress) {
|
||||
LOG_ERROR(Frontend, "Error compressing file {}, the selected file is already compressed",
|
||||
filepath);
|
||||
return {};
|
||||
}
|
||||
if (!compress_info.is_compressed && !compress) {
|
||||
LOG_ERROR(Frontend,
|
||||
"Error decompressing file {}, the selected file is already decompressed",
|
||||
filepath);
|
||||
return {};
|
||||
}
|
||||
|
||||
return std::pair(compress_info, frame_size);
|
||||
}
|
||||
|
||||
void GMainWindow::OnCompressFile() {
|
||||
// NOTE: Encrypted files SHOULD NEVER be compressed, otherwise the resulting
|
||||
// compressed file will have very poor compression ratios, due to the high
|
||||
|
|
@ -3298,7 +3260,7 @@ void GMainWindow::OnCompressFile() {
|
|||
bool single_file = filepaths.size() == 1;
|
||||
if (single_file) {
|
||||
// If it's a single file, ask the user for the output file.
|
||||
auto compress_info = GetCompressFileInfo(filepaths[0].toStdString(), true);
|
||||
auto compress_info = Loader::GetCompressFileInfo(filepaths[0].toStdString(), true);
|
||||
if (!compress_info.has_value()) {
|
||||
emit CompressFinished(true, false);
|
||||
return;
|
||||
|
|
@ -3338,7 +3300,7 @@ void GMainWindow::OnCompressFile() {
|
|||
std::string in_path = filepath.toStdString();
|
||||
|
||||
// Identify file type
|
||||
auto compress_info = GetCompressFileInfo(filepath.toStdString(), true);
|
||||
auto compress_info = Loader::GetCompressFileInfo(filepath.toStdString(), true);
|
||||
if (!compress_info.has_value()) {
|
||||
total_success = false;
|
||||
continue;
|
||||
|
|
@ -3391,7 +3353,7 @@ void GMainWindow::OnDecompressFile() {
|
|||
bool single_file = filepaths.size() == 1;
|
||||
if (single_file) {
|
||||
// If it's a single file, ask the user for the output file.
|
||||
auto compress_info = GetCompressFileInfo(filepaths[0].toStdString(), false);
|
||||
auto compress_info = Loader::GetCompressFileInfo(filepaths[0].toStdString(), false);
|
||||
if (!compress_info.has_value()) {
|
||||
emit CompressFinished(false, false);
|
||||
return;
|
||||
|
|
@ -3432,7 +3394,7 @@ void GMainWindow::OnDecompressFile() {
|
|||
std::string in_path = filepath.toStdString();
|
||||
|
||||
// Identify file type
|
||||
auto compress_info = GetCompressFileInfo(filepath.toStdString(), false);
|
||||
auto compress_info = Loader::GetCompressFileInfo(filepath.toStdString(), false);
|
||||
if (!compress_info.has_value()) {
|
||||
total_success = false;
|
||||
continue;
|
||||
|
|
@ -3880,6 +3842,18 @@ void GMainWindow::OnCoreError(Core::System::ResultStatus result, std::string det
|
|||
.c_str());
|
||||
error_severity_icon = QMessageBox::Icon::Critical;
|
||||
can_continue = false;
|
||||
} else if (result == Core::System::ResultStatus::ErrorCoreExceptionRaised) {
|
||||
title = tr("An exception occurred");
|
||||
message = tr("An exception occurred while executing the emulated application.\n\n");
|
||||
message += QString::fromStdString(details);
|
||||
error_severity_icon = QMessageBox::Icon::Critical;
|
||||
can_continue = false;
|
||||
} else if (result == Core::System::ResultStatus::ErrorMemoryExceptionRaised) {
|
||||
title = tr("An invalid memory access occurred");
|
||||
message =
|
||||
tr("An invalid memory access occurred while executing the emulated application.\n\n");
|
||||
message += QString::fromStdString(details);
|
||||
error_severity_icon = QMessageBox::Icon::Critical;
|
||||
} else {
|
||||
title = tr("Fatal Error");
|
||||
message = tr("A fatal error occurred. "
|
||||
|
|
|
|||
|
|
@ -57,12 +57,17 @@ const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> QtConfi
|
|||
// This must be in alphabetical order according to action name as it must have the same order as
|
||||
// UISetting::values.shortcuts, which is alphabetically ordered.
|
||||
// clang-format off
|
||||
const std::array<UISettings::Shortcut, 38> QtConfig::default_hotkeys {{
|
||||
const std::array<UISettings::Shortcut, 43> QtConfig::default_hotkeys {{
|
||||
{QStringLiteral("Advance Frame"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::ApplicationShortcut}},
|
||||
{QStringLiteral("Audio Mute/Unmute"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Audio Volume Down"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Audio Volume Up"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Capture Screenshot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"), Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Debug Pause"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Debug Resume"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Debug Step"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Debug Unschedule All"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Debug Schedule All"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Decrease 3D Factor"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+-"), Qt::ApplicationShortcut}},
|
||||
{QStringLiteral("Decrease Speed Limit"), QStringLiteral("Main Window"), {QStringLiteral("-"), Qt::ApplicationShortcut}},
|
||||
|
|
@ -287,6 +292,7 @@ void QtConfig::ReadAudioValues() {
|
|||
ReadGlobalSetting(Settings::values.audio_emulation);
|
||||
ReadGlobalSetting(Settings::values.enable_audio_stretching);
|
||||
ReadGlobalSetting(Settings::values.enable_realtime_audio);
|
||||
ReadGlobalSetting(Settings::values.simulate_headphones_plugged);
|
||||
ReadGlobalSetting(Settings::values.volume);
|
||||
|
||||
if (global) {
|
||||
|
|
@ -483,6 +489,7 @@ void QtConfig::ReadDataStorageValues() {
|
|||
ReadBasicSetting(Settings::values.use_virtual_sd);
|
||||
ReadBasicSetting(Settings::values.use_custom_storage);
|
||||
ReadBasicSetting(Settings::values.compress_cia_installs);
|
||||
ReadBasicSetting(Settings::values.async_fs_operations);
|
||||
|
||||
const std::string nand_dir =
|
||||
ReadSetting(Settings::QKeys::nand_directory, QStringLiteral("")).toString().toStdString();
|
||||
|
|
@ -510,6 +517,7 @@ void QtConfig::ReadDebuggingValues() {
|
|||
ReadBasicSetting(Settings::values.instant_debug_log);
|
||||
ReadBasicSetting(Settings::values.enable_rpc_server);
|
||||
ReadBasicSetting(Settings::values.toggle_unique_data_console_type);
|
||||
ReadBasicSetting(Settings::values.break_on_unmapped_memory_access);
|
||||
|
||||
qt_config->beginGroup(QStringLiteral("LLE"));
|
||||
for (const auto& service_module : Service::service_module_map) {
|
||||
|
|
@ -722,6 +730,8 @@ void QtConfig::ReadRendererValues() {
|
|||
ReadGlobalSetting(Settings::values.delay_game_render_thread_us);
|
||||
ReadGlobalSetting(Settings::values.disable_right_eye_render);
|
||||
|
||||
ReadGlobalSetting(Settings::values.simulate_3ds_gpu_timings);
|
||||
|
||||
if (global) {
|
||||
ReadBasicSetting(Settings::values.use_shader_jit);
|
||||
}
|
||||
|
|
@ -937,6 +947,7 @@ void QtConfig::SaveAudioValues() {
|
|||
WriteGlobalSetting(Settings::values.audio_emulation);
|
||||
WriteGlobalSetting(Settings::values.enable_audio_stretching);
|
||||
WriteGlobalSetting(Settings::values.enable_realtime_audio);
|
||||
WriteGlobalSetting(Settings::values.simulate_headphones_plugged);
|
||||
WriteGlobalSetting(Settings::values.volume);
|
||||
|
||||
if (global) {
|
||||
|
|
@ -1073,6 +1084,7 @@ void QtConfig::SaveDataStorageValues() {
|
|||
WriteBasicSetting(Settings::values.use_virtual_sd);
|
||||
WriteBasicSetting(Settings::values.use_custom_storage);
|
||||
WriteBasicSetting(Settings::values.compress_cia_installs);
|
||||
WriteBasicSetting(Settings::values.async_fs_operations);
|
||||
WriteSetting(Settings::QKeys::nand_directory,
|
||||
QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)),
|
||||
QStringLiteral(""));
|
||||
|
|
@ -1094,6 +1106,7 @@ void QtConfig::SaveDebuggingValues() {
|
|||
WriteBasicSetting(Settings::values.instant_debug_log);
|
||||
WriteBasicSetting(Settings::values.enable_rpc_server);
|
||||
WriteBasicSetting(Settings::values.toggle_unique_data_console_type);
|
||||
WriteBasicSetting(Settings::values.break_on_unmapped_memory_access);
|
||||
|
||||
qt_config->beginGroup(QStringLiteral("LLE"));
|
||||
for (const auto& service_module : Settings::values.lle_modules) {
|
||||
|
|
@ -1266,6 +1279,8 @@ void QtConfig::SaveRendererValues() {
|
|||
WriteGlobalSetting(Settings::values.delay_game_render_thread_us);
|
||||
WriteGlobalSetting(Settings::values.disable_right_eye_render);
|
||||
|
||||
WriteGlobalSetting(Settings::values.simulate_3ds_gpu_timings);
|
||||
|
||||
if (global) {
|
||||
WriteSetting(Settings::QKeys::use_shader_jit, Settings::values.use_shader_jit.GetValue(),
|
||||
true);
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ public:
|
|||
|
||||
static const std::array<int, Settings::NativeButton::NumButtons> default_buttons;
|
||||
static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> default_analogs;
|
||||
static const std::array<UISettings::Shortcut, 38> default_hotkeys;
|
||||
static const std::array<UISettings::Shortcut, 43> default_hotkeys;
|
||||
|
||||
private:
|
||||
void Initialize(const std::string& config_name);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright 2016 Citra Emulator Project
|
||||
// Copyright Citra Emulator Project / Azahar Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
|
|
@ -67,6 +67,8 @@ void ConfigureAudio::SetConfiguration() {
|
|||
|
||||
ui->toggle_audio_stretching->setChecked(Settings::values.enable_audio_stretching.GetValue());
|
||||
ui->toggle_realtime_audio->setChecked(Settings::values.enable_realtime_audio.GetValue());
|
||||
ui->simulate_headphones_plugged->setChecked(
|
||||
Settings::values.simulate_headphones_plugged.GetValue());
|
||||
SetHleFeaturesEnabled();
|
||||
|
||||
const s32 volume =
|
||||
|
|
@ -175,6 +177,9 @@ void ConfigureAudio::ApplyConfiguration() {
|
|||
&Settings::values.volume, ui->volume_combo_box, [this](s32) {
|
||||
return static_cast<float>(ui->volume_slider->value()) / ui->volume_slider->maximum();
|
||||
});
|
||||
ConfigurationShared::ApplyPerGameSetting(&Settings::values.simulate_headphones_plugged,
|
||||
ui->simulate_headphones_plugged,
|
||||
simulate_headphones_plugged);
|
||||
|
||||
if (Settings::IsConfiguringGlobal()) {
|
||||
Settings::values.output_type =
|
||||
|
|
@ -252,4 +257,7 @@ void ConfigureAudio::SetupPerGameUI() {
|
|||
|
||||
ConfigurationShared::SetColoredTristate(ui->toggle_realtime_audio,
|
||||
Settings::values.enable_realtime_audio, realtime_audio);
|
||||
ConfigurationShared::SetColoredTristate(ui->simulate_headphones_plugged,
|
||||
Settings::values.simulate_headphones_plugged,
|
||||
simulate_headphones_plugged);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright 2016 Citra Emulator Project
|
||||
// Copyright Citra Emulator Project / Azahar Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
|
|
@ -41,5 +41,6 @@ private:
|
|||
|
||||
ConfigurationShared::CheckState audio_stretching;
|
||||
ConfigurationShared::CheckState realtime_audio;
|
||||
ConfigurationShared::CheckState simulate_headphones_plugged;
|
||||
std::unique_ptr<Ui::ConfigureAudio> ui;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -85,26 +85,6 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="toggle_audio_stretching">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Enable audio stretching</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="toggle_realtime_audio">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Scales audio playback speed to account for drops in emulation framerate. This means that audio will play at full speed even while the application framerate is low. May cause audio desync issues.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Enable realtime audio</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="volume_layout" native="true">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
|
|
@ -192,6 +172,36 @@
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="toggle_audio_stretching">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Enable audio stretching</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="toggle_realtime_audio">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Scales audio playback speed to account for drops in emulation framerate. This means that audio will play at full speed even while the application framerate is low. May cause audio desync issues.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Enable realtime audio</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="simulate_headphones_plugged">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Simulates whether headphones are plugged in to the emulated 3DS system.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Simulate headphones plugged in</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include "common/file_util.h"
|
||||
#include "common/logging/backend.h"
|
||||
#include "common/settings.h"
|
||||
#include "core/core.h"
|
||||
#include "ui_configure_debug.h"
|
||||
#ifdef ENABLE_VULKAN
|
||||
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||
|
|
@ -33,6 +34,17 @@ ConfigureDebug::ConfigureDebug(bool is_powered_on_, QWidget* parent)
|
|||
ui->setupUi(this);
|
||||
SetConfiguration();
|
||||
|
||||
connect(ui->toggle_gdbstub, &QCheckBox::clicked,
|
||||
[this](bool checked) { ui->debug_next_process->setEnabled(checked); });
|
||||
|
||||
connect(ui->debug_next_process, &QCheckBox::clicked, [](bool checked) {
|
||||
if (checked) {
|
||||
Core::System::GetInstance().SetDebugNextProcessFlag();
|
||||
} else {
|
||||
Core::System::GetInstance().ClearDebugNextProcessFlag();
|
||||
}
|
||||
});
|
||||
|
||||
connect(ui->open_log_button, &QPushButton::clicked, []() {
|
||||
QString path = QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::LogDir));
|
||||
QDesktopServices::openUrl(QUrl::fromLocalFile(path));
|
||||
|
|
@ -87,6 +99,10 @@ ConfigureDebug::ConfigureDebug(bool is_powered_on_, QWidget* parent)
|
|||
ui->clock_speed_label->setVisible(Settings::IsConfiguringGlobal());
|
||||
ui->clock_speed_combo->setVisible(!Settings::IsConfiguringGlobal());
|
||||
|
||||
#ifndef ENABLE_GDBSTUB
|
||||
ui->gdb_groupbox->setVisible(false);
|
||||
#endif
|
||||
|
||||
SetupPerGameUI();
|
||||
}
|
||||
|
||||
|
|
@ -94,6 +110,9 @@ ConfigureDebug::~ConfigureDebug() = default;
|
|||
|
||||
void ConfigureDebug::SetConfiguration() {
|
||||
ui->toggle_gdbstub->setChecked(Settings::values.use_gdbstub.GetValue());
|
||||
if (!ui->toggle_gdbstub->isChecked()) {
|
||||
ui->debug_next_process->setEnabled(false);
|
||||
}
|
||||
ui->gdbport_spinbox->setEnabled(Settings::values.use_gdbstub.GetValue());
|
||||
ui->gdbport_spinbox->setValue(Settings::values.gdbstub_port.GetValue());
|
||||
ui->toggle_console->setEnabled(!is_powered_on);
|
||||
|
|
@ -112,6 +131,8 @@ void ConfigureDebug::SetConfiguration() {
|
|||
#endif // !ENABLE_SCRIPTING
|
||||
ui->toggle_unique_data_console_type->setChecked(
|
||||
Settings::values.toggle_unique_data_console_type.GetValue());
|
||||
ui->break_on_unmapped_memory_access->setChecked(
|
||||
Settings::values.break_on_unmapped_memory_access.GetValue());
|
||||
|
||||
ui->toggle_renderer_debug->setChecked(Settings::values.renderer_debug.GetValue());
|
||||
ui->toggle_dump_command_buffers->setChecked(Settings::values.dump_command_buffers.GetValue());
|
||||
|
|
@ -133,6 +154,10 @@ void ConfigureDebug::SetConfiguration() {
|
|||
ui->clock_display_label->setText(
|
||||
QStringLiteral("%1%").arg(Settings::values.cpu_clock_percentage.GetValue()));
|
||||
ui->instant_debug_log->setChecked(Settings::values.instant_debug_log.GetValue());
|
||||
|
||||
if (Core::System::GetInstance().GetDebugNextProcessFlag()) {
|
||||
ui->debug_next_process->setChecked(true);
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigureDebug::ApplyConfiguration() {
|
||||
|
|
@ -153,6 +178,8 @@ void ConfigureDebug::ApplyConfiguration() {
|
|||
Settings::values.enable_rpc_server = ui->enable_rpc_server->isChecked();
|
||||
Settings::values.toggle_unique_data_console_type =
|
||||
ui->toggle_unique_data_console_type->isChecked();
|
||||
Settings::values.break_on_unmapped_memory_access =
|
||||
ui->break_on_unmapped_memory_access->isChecked();
|
||||
Settings::values.renderer_debug = ui->toggle_renderer_debug->isChecked();
|
||||
Settings::values.dump_command_buffers = ui->toggle_dump_command_buffers->isChecked();
|
||||
Settings::values.instant_debug_log = ui->instant_debug_log->isChecked();
|
||||
|
|
@ -174,10 +201,11 @@ void ConfigureDebug::SetupPerGameUI() {
|
|||
ConfigurationShared::SetHighlight(ui->clock_speed_widget, index == 1);
|
||||
});
|
||||
|
||||
ui->groupBox->setVisible(false);
|
||||
ui->gdb_groupbox->setVisible(false);
|
||||
ui->groupBox_2->setVisible(false);
|
||||
ui->enable_rpc_server->setVisible(false);
|
||||
ui->toggle_unique_data_console_type->setVisible(false);
|
||||
ui->break_on_unmapped_memory_access->setVisible(false);
|
||||
ui->toggle_cpu_jit->setVisible(false);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<widget class="QGroupBox" name="gdb_groupbox">
|
||||
<property name="title">
|
||||
<string>GDB</string>
|
||||
</property>
|
||||
|
|
@ -60,6 +60,13 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="debug_next_process">
|
||||
<property name="text">
|
||||
<string>Pause next non-sysmodule process at start</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
@ -299,6 +306,16 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="break_on_unmapped_memory_access">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Pauses emulation and shows an error message if an unmapped memory access is detected.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Break on unmapped memory access</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue