mirror of
https://github.com/azahar-emu/azahar.git
synced 2026-06-06 02:33:44 -04:00
Merge branch 'master' into COMBO_BUTTON
This commit is contained in:
commit
47004dfa63
77 changed files with 12085 additions and 8665 deletions
|
|
@ -14,4 +14,7 @@ echo "Tag name is: $TAG_NAME"
|
|||
|
||||
docker build -f docker/azahar-room/Dockerfile -t azahar-room:$TAG_NAME .
|
||||
mkdir -p build
|
||||
docker save azahar-room:$TAG_NAME > build/azahar-room-$TAG_NAME.dockerimage
|
||||
FILENAME="azahar-room-$TAG_NAME.dockerimage"
|
||||
docker save azahar-room:$TAG_NAME > build/$FILENAME
|
||||
|
||||
echo "DOCKER_IMAGE_PATH=artifacts/$FILENAME" >> $GITHUB_ENV
|
||||
147
.github/workflows/build.yml
vendored
147
.github/workflows/build.yml
vendored
|
|
@ -7,21 +7,41 @@ on:
|
|||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
permissions:
|
||||
id-token: write
|
||||
contents: read
|
||||
attestations: write
|
||||
|
||||
jobs:
|
||||
source:
|
||||
if: ${{ !github.head_ref }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Pack
|
||||
run: ./.ci/source.sh
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: ./
|
||||
format: spdx-json
|
||||
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/
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
artifacts/*.tar.xz
|
||||
sbom-path: artifacts/source.spdx.json
|
||||
|
||||
linux-x86_64:
|
||||
runs-on: ubuntu-latest
|
||||
|
|
@ -39,14 +59,15 @@ jobs:
|
|||
OS: linux
|
||||
TARGET: ${{ matrix.target }}
|
||||
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' }}
|
||||
uses: actions/cache@v4
|
||||
if: ${{ env.SHOULD_RUN == 'true' && env.CACHE_ENABLED == 'true' }}
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ github.job }}-${{ matrix.target }}-${{ github.sha }}
|
||||
|
|
@ -64,12 +85,27 @@ jobs:
|
|||
if: ${{ matrix.target == 'appimage-wayland' && env.SHOULD_RUN == 'true' }}
|
||||
run: |
|
||||
mv artifacts/azahar.AppImage artifacts/azahar-wayland.AppImage
|
||||
- name: Generate SBOM
|
||||
if: ${{ contains(matrix.target, 'appimage') && github.ref_type == 'tag' && env.SHOULD_RUN == 'true' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: build/
|
||||
format: spdx-json
|
||||
output-file: artifacts/linux-x86_64-${{ matrix.target }}.spdx.json
|
||||
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/
|
||||
- name: Attest artifacts
|
||||
if: ${{ contains(matrix.target, 'appimage') && github.ref_type == 'tag' && env.SHOULD_RUN == 'true' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
artifacts/*.AppImage
|
||||
sbom-path: artifacts/linux-x86_64-${{ matrix.target }}.spdx.json
|
||||
|
||||
linux-arm64:
|
||||
runs-on: ubuntu-24.04-arm
|
||||
|
|
@ -87,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 }}
|
||||
|
|
@ -106,13 +142,15 @@ jobs:
|
|||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_COMPILERCHECK: content
|
||||
CCACHE_SLOPPINESS: time_macros
|
||||
CACHE_ENABLED: ${{ github.ref_type != 'tag' }}
|
||||
OS: macos
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
uses: actions/cache@v4
|
||||
if: ${{ env.CACHE_ENABLED == 'true' }}
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ github.sha }}
|
||||
|
|
@ -136,11 +174,26 @@ jobs:
|
|||
env:
|
||||
PACK_INDIVIDUALLY: 1
|
||||
run: ./.ci/pack.sh
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: build/
|
||||
format: spdx-json
|
||||
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/
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
artifacts/*.zip
|
||||
sbom-path: artifacts/macos.spdx.json
|
||||
|
||||
windows:
|
||||
strategy:
|
||||
|
|
@ -165,14 +218,16 @@ jobs:
|
|||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_COMPILERCHECK: content
|
||||
CCACHE_SLOPPINESS: time_macros
|
||||
CACHE_ENABLED: ${{ github.ref_type != 'tag' }}
|
||||
OS: windows
|
||||
TARGET: ${{ matrix.target }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
uses: actions/cache@v4
|
||||
if: ${{ env.CACHE_ENABLED == 'true' }}
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}
|
||||
|
|
@ -180,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
|
||||
|
|
@ -201,7 +256,7 @@ 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
|
||||
|
|
@ -236,11 +291,27 @@ jobs:
|
|||
mv ./*.exe ../../artifacts/
|
||||
- name: Pack
|
||||
run: ./.ci/pack.sh
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: build/
|
||||
format: spdx-json
|
||||
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/
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
artifacts/*.zip
|
||||
artifacts/*.exe
|
||||
sbom-path: artifacts/windows-${{ matrix.target }}.spdx.json
|
||||
|
||||
android:
|
||||
runs-on: ubuntu-latest
|
||||
|
|
@ -252,17 +323,18 @@ jobs:
|
|||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_COMPILERCHECK: content
|
||||
CCACHE_SLOPPINESS: time_macros
|
||||
CACHE_ENABLED: ${{ github.ref_type != 'tag' }}
|
||||
OS: android
|
||||
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' }}
|
||||
uses: actions/cache@v4
|
||||
if: ${{ env.SHOULD_RUN == 'true' && env.CACHE_ENABLED == 'true' }}
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
|
|
@ -300,19 +372,35 @@ jobs:
|
|||
working-directory: src/android/app
|
||||
env:
|
||||
UNPACKED: 1
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: src/android
|
||||
format: spdx-json
|
||||
output-file: src/android/app/artifacts/android-${{ matrix.target }}.spdx.json
|
||||
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/
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
src/android/app/artifacts/*.apk
|
||||
src/android/app/artifacts/*.aab
|
||||
sbom-path: src/android/app/artifacts/android-${{ matrix.target }}.spdx.json
|
||||
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: docker:dind
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install tools
|
||||
|
|
@ -325,8 +413,23 @@ jobs:
|
|||
run: |
|
||||
mkdir -p artifacts
|
||||
mv build/*.dockerimage artifacts/
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
image: ${{ env.DOCKER_IMAGE_PATH }}
|
||||
format: spdx-json
|
||||
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
|
||||
path: artifacts/
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
artifacts/*.dockerimage
|
||||
sbom-path: artifacts/docker-room.spdx.json
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
164
.github/workflows/libretro.yml
vendored
164
.github/workflows/libretro.yml
vendored
|
|
@ -11,6 +11,11 @@ on:
|
|||
env:
|
||||
CORE_ARGS: -DENABLE_LIBRETRO=ON
|
||||
|
||||
permissions:
|
||||
id-token: write
|
||||
contents: read
|
||||
attestations: write
|
||||
|
||||
jobs:
|
||||
android:
|
||||
runs-on: ubuntu-22.04
|
||||
|
|
@ -23,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
|
||||
|
|
@ -32,6 +37,10 @@ jobs:
|
|||
echo "GIT_TAG_NAME=$GITHUB_REF_NAME" >> $GITHUB_ENV
|
||||
fi
|
||||
echo $GIT_TAG_NAME
|
||||
- name: Install tools
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y llvm
|
||||
- name: Update Android SDK CMake version
|
||||
run: |
|
||||
echo "y" | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "ndk;$ANDROID_NDK_VERSION"
|
||||
|
|
@ -41,13 +50,32 @@ jobs:
|
|||
export NDK_ROOT=${ANDROID_SDK_ROOT}/ndk/$ANDROID_NDK_VERSION
|
||||
${ANDROID_SDK_ROOT}/cmake/3.30.3/bin/cmake $CORE_ARGS -DANDROID_PLATFORM=android-$API_LEVEL -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_STL=c++_static -DANDROID_ABI=$ANDROID_ABI . -B $BUILD_DIR
|
||||
${ANDROID_SDK_ROOT}/cmake/3.30.3/bin/cmake --build $BUILD_DIR --target azahar_libretro --config Release -j $(nproc)
|
||||
llvm-strip -s $BUILD_DIR/$EXTRA_PATH/azahar_libretro.*
|
||||
- name: Pack
|
||||
run: ./.ci/libretro-pack.sh
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: build/
|
||||
format: spdx-json
|
||||
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: ./*.zip
|
||||
path: |
|
||||
./*.zip
|
||||
./*.spdx.json
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
./*.zip
|
||||
sbom-path: libretro-android.spdx.json
|
||||
|
||||
linux:
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
|
|
@ -57,20 +85,43 @@ 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
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y llvm
|
||||
- name: Build
|
||||
run: |
|
||||
cmake $CORE_ARGS $EXTRA_CORE_ARGS . -B $BUILD_DIR
|
||||
cmake --build $BUILD_DIR --target azahar_libretro --config Release -j $(nproc)
|
||||
llvm-strip -s $BUILD_DIR/$EXTRA_PATH/azahar_libretro.*
|
||||
- name: Pack
|
||||
run: ./.ci/libretro-pack.sh
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: build/
|
||||
format: spdx-json
|
||||
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: ./*.zip
|
||||
path: |
|
||||
./*.zip
|
||||
./*.spdx.json
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
./*.zip
|
||||
sbom-path: libretro-linux.spdx.json
|
||||
|
||||
windows:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
|
|
@ -82,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
|
||||
|
|
@ -94,17 +145,36 @@ jobs:
|
|||
$IMAGE \
|
||||
bash -lc "\
|
||||
${CMAKE} $CORE_ARGS $EXTRA_CORE_ARGS . -B $BUILD_DIR && \
|
||||
${CMAKE} --build $BUILD_DIR --target azahar_libretro --config Release -j $(nproc)"
|
||||
${CMAKE} --build $BUILD_DIR --target azahar_libretro --config Release -j $(nproc) && \
|
||||
x86_64-w64-mingw32.static-strip -s $BUILD_DIR/$EXTRA_PATH/azahar_libretro.*"
|
||||
- name: Pack
|
||||
run: ./.ci/libretro-pack.sh
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: build/
|
||||
format: spdx-json
|
||||
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: ./*.zip
|
||||
path: |
|
||||
./*.zip
|
||||
./*.spdx.json
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
./*.zip
|
||||
sbom-path: libretro-windows.spdx.json
|
||||
macos:
|
||||
runs-on: macos-26
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target: ["x86_64", "arm64"]
|
||||
env:
|
||||
|
|
@ -114,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
|
||||
|
|
@ -123,13 +193,32 @@ jobs:
|
|||
run: |
|
||||
cmake $CORE_ARGS -DCMAKE_OSX_ARCHITECTURES=$TARGET . -B $BUILD_DIR
|
||||
cmake --build $BUILD_DIR --target azahar_libretro --config Release
|
||||
strip -x $BUILD_DIR/$EXTRA_PATH/azahar_libretro.*
|
||||
- name: Pack
|
||||
run: ./.ci/libretro-pack.sh
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: build/
|
||||
format: spdx-json
|
||||
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: ./*.zip
|
||||
path: |
|
||||
./*.zip
|
||||
./*.spdx.json
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
./*.zip
|
||||
sbom-path: libretro-macos-${{ matrix.target }}.spdx.json
|
||||
|
||||
ios:
|
||||
runs-on: macos-26
|
||||
env:
|
||||
|
|
@ -139,20 +228,39 @@ 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
|
||||
run: |
|
||||
cmake $CORE_ARGS $EXTRA_CORE_ARGS . -B $BUILD_DIR
|
||||
cmake --build $BUILD_DIR --target azahar_libretro --config Release
|
||||
strip -x $BUILD_DIR/$EXTRA_PATH/azahar_libretro.*
|
||||
- name: Pack
|
||||
run: ./.ci/libretro-pack.sh
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: build/
|
||||
format: spdx-json
|
||||
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: ./*.zip
|
||||
path: |
|
||||
./*.zip
|
||||
./*.spdx.json
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
./*.zip
|
||||
sbom-path: libretro-ios.spdx.json
|
||||
|
||||
tvos:
|
||||
runs-on: macos-26
|
||||
env:
|
||||
|
|
@ -162,17 +270,35 @@ 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
|
||||
run: |
|
||||
cmake $CORE_ARGS $EXTRA_CORE_ARGS . -B $BUILD_DIR
|
||||
cmake --build $BUILD_DIR --target azahar_libretro --config Release
|
||||
strip -x $BUILD_DIR/$EXTRA_PATH/azahar_libretro.*
|
||||
- name: Pack
|
||||
run: ./.ci/libretro-pack.sh
|
||||
- name: Generate SBOM
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: anchore/sbom-action@v0
|
||||
with:
|
||||
path: build/
|
||||
format: spdx-json
|
||||
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: ./*.zip
|
||||
path: |
|
||||
./*.zip
|
||||
./*.spdx.json
|
||||
- name: Attest artifacts
|
||||
if: ${{ github.ref_type == 'tag' }}
|
||||
uses: actions/attest@v4
|
||||
with:
|
||||
subject-path: |
|
||||
./*.zip
|
||||
sbom-path: libretro-tvos.spdx.json
|
||||
|
|
|
|||
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
|
||||
|
|
|
|||
2
.github/workflows/transifex.yml
vendored
2
.github/workflows/transifex.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
|||
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
|
||||
|
|
|
|||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -60,3 +60,6 @@ VULKAN_SDK/
|
|||
# Version info files
|
||||
GIT-COMMIT
|
||||
GIT-TAG
|
||||
|
||||
# verify-release.sh downloads
|
||||
verify/
|
||||
775
dist/languages/ca_ES_valencia.ts
vendored
775
dist/languages/ca_ES_valencia.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/da_DK.ts
vendored
779
dist/languages/da_DK.ts
vendored
File diff suppressed because it is too large
Load diff
775
dist/languages/de.ts
vendored
775
dist/languages/de.ts
vendored
File diff suppressed because it is too large
Load diff
777
dist/languages/el.ts
vendored
777
dist/languages/el.ts
vendored
File diff suppressed because it is too large
Load diff
835
dist/languages/es_419.ts
vendored
835
dist/languages/es_419.ts
vendored
File diff suppressed because it is too large
Load diff
775
dist/languages/es_ES.ts
vendored
775
dist/languages/es_ES.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/fi.ts
vendored
779
dist/languages/fi.ts
vendored
File diff suppressed because it is too large
Load diff
775
dist/languages/fr.ts
vendored
775
dist/languages/fr.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/hu_HU.ts
vendored
779
dist/languages/hu_HU.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/id.ts
vendored
779
dist/languages/id.ts
vendored
File diff suppressed because it is too large
Load diff
783
dist/languages/it.ts
vendored
783
dist/languages/it.ts
vendored
File diff suppressed because it is too large
Load diff
781
dist/languages/ja_JP.ts
vendored
781
dist/languages/ja_JP.ts
vendored
File diff suppressed because it is too large
Load diff
781
dist/languages/ko_KR.ts
vendored
781
dist/languages/ko_KR.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/lt_LT.ts
vendored
779
dist/languages/lt_LT.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/nb.ts
vendored
779
dist/languages/nb.ts
vendored
File diff suppressed because it is too large
Load diff
781
dist/languages/nl.ts
vendored
781
dist/languages/nl.ts
vendored
File diff suppressed because it is too large
Load diff
785
dist/languages/pl_PL.ts
vendored
785
dist/languages/pl_PL.ts
vendored
File diff suppressed because it is too large
Load diff
793
dist/languages/pt_BR.ts
vendored
793
dist/languages/pt_BR.ts
vendored
File diff suppressed because it is too large
Load diff
781
dist/languages/ro_RO.ts
vendored
781
dist/languages/ro_RO.ts
vendored
File diff suppressed because it is too large
Load diff
781
dist/languages/ru_RU.ts
vendored
781
dist/languages/ru_RU.ts
vendored
File diff suppressed because it is too large
Load diff
775
dist/languages/sv.ts
vendored
775
dist/languages/sv.ts
vendored
File diff suppressed because it is too large
Load diff
787
dist/languages/tr_TR.ts
vendored
787
dist/languages/tr_TR.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/vi_VN.ts
vendored
779
dist/languages/vi_VN.ts
vendored
File diff suppressed because it is too large
Load diff
775
dist/languages/zh_CN.ts
vendored
775
dist/languages/zh_CN.ts
vendored
File diff suppressed because it is too large
Load diff
779
dist/languages/zh_TW.ts
vendored
779
dist/languages/zh_TW.ts
vendored
File diff suppressed because it is too large
Load diff
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
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[]);
|
||||
|
||||
}
|
||||
|
|
@ -68,7 +68,7 @@ if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND MINGW)
|
|||
)
|
||||
endif()
|
||||
|
||||
target_link_libraries(citra_meta PRIVATE citra_common fmt)
|
||||
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++) {
|
||||
|
|
|
|||
|
|
@ -879,6 +879,8 @@ void GMainWindow::InitializeHotkeys() {
|
|||
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"));
|
||||
|
|
@ -1209,6 +1211,10 @@ void GMainWindow::ConnectMenuEvents() {
|
|||
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);
|
||||
|
|
@ -3235,64 +3241,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
|
||||
|
|
@ -3315,7 +3263,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;
|
||||
|
|
@ -3355,7 +3303,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;
|
||||
|
|
@ -3408,7 +3356,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;
|
||||
|
|
@ -3449,7 +3397,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;
|
||||
|
|
|
|||
|
|
@ -57,15 +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, 41> 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("Ctrl+F4"),Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Debug Resume"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F5"),Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Debug Step"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F6"),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}},
|
||||
|
|
|
|||
|
|
@ -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, 41> default_hotkeys;
|
||||
static const std::array<UISettings::Shortcut, 43> default_hotkeys;
|
||||
|
||||
private:
|
||||
void Initialize(const std::string& config_name);
|
||||
|
|
|
|||
|
|
@ -213,6 +213,9 @@
|
|||
<addaction name="action_Debug_Pause"/>
|
||||
<addaction name="action_Debug_Resume"/>
|
||||
<addaction name="action_Debug_Step"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="action_Debug_Unschedule_All"/>
|
||||
<addaction name="action_Debug_Schedule_All"/>
|
||||
</widget>
|
||||
<addaction name="menu_Debug"/>
|
||||
<addaction name="separator"/>
|
||||
|
|
@ -487,6 +490,22 @@
|
|||
<string>Debug Step</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Debug_Unschedule_All">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Debug Unschedule All</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Debug_Schedule_All">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Debug Schedule All</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Dump_Video">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
|
|
|
|||
|
|
@ -833,6 +833,19 @@ bool System::IsInitialSetup() {
|
|||
return app_loader && app_loader->DoingInitialSetup();
|
||||
}
|
||||
|
||||
void System::DebugUnscheduleAllThreadsFromFrontend(bool unschedule) {
|
||||
if (!is_powered_on)
|
||||
return;
|
||||
|
||||
for (auto proc : kernel->GetProcessList()) {
|
||||
if (unschedule) {
|
||||
proc->SetUnscheduleMode(Kernel::UnscheduleMode::FRONTEND);
|
||||
} else {
|
||||
proc->ClearUnscheduleMode(Kernel::UnscheduleMode::FRONTEND);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class Archive>
|
||||
void System::serialize(Archive& ar, const unsigned int file_version) {
|
||||
|
||||
|
|
|
|||
|
|
@ -419,6 +419,8 @@ public:
|
|||
debug_next_process = false;
|
||||
}
|
||||
|
||||
void DebugUnscheduleAllThreadsFromFrontend(bool unschedule);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Initialize the emulated system.
|
||||
|
|
|
|||
|
|
@ -877,7 +877,7 @@ static void HandleGetStopReason() {
|
|||
for (const auto& process : process_list) {
|
||||
if (process->codeset->program_id == program_id) {
|
||||
current_process = process.get();
|
||||
current_process->SetDebugBreak(true);
|
||||
current_process->SetUnscheduleMode(Kernel::UnscheduleMode::GDB);
|
||||
is_running = false;
|
||||
if (SetThread(0)) {
|
||||
SendStopReply(current_thread, 0);
|
||||
|
|
@ -900,7 +900,7 @@ static void BreakImpl(int signal) {
|
|||
"and memory exceptions. Disable CPU JIT for more accuracy.");
|
||||
}
|
||||
|
||||
current_process->SetDebugBreak(true);
|
||||
current_process->SetUnscheduleMode(Kernel::UnscheduleMode::GDB);
|
||||
is_running = false;
|
||||
|
||||
latest_signal = signal;
|
||||
|
|
@ -1248,7 +1248,7 @@ static void Continue() {
|
|||
continue_list.push_back(thread_id);
|
||||
}
|
||||
|
||||
current_process->SetDebugBreak(false, continue_list);
|
||||
current_process->ClearUnscheduleMode(Kernel::UnscheduleMode::GDB, continue_list);
|
||||
is_running = true;
|
||||
|
||||
ClearAllInstructionCache();
|
||||
|
|
@ -1414,7 +1414,7 @@ void HandleVCommand() {
|
|||
SendReply("E02");
|
||||
} else {
|
||||
current_process = process.get();
|
||||
current_process->SetDebugBreak(true);
|
||||
current_process->SetUnscheduleMode(Kernel::UnscheduleMode::GDB);
|
||||
is_running = false;
|
||||
if (SetThread(0)) {
|
||||
SendStopReply(current_thread, 0);
|
||||
|
|
@ -1456,7 +1456,7 @@ void HandleVCommand() {
|
|||
HexToInt(reinterpret_cast<const u8*>(threads[i].c_str()), threads[i].size()));
|
||||
}
|
||||
|
||||
current_process->SetDebugBreak(false, thread_ids);
|
||||
current_process->ClearUnscheduleMode(Kernel::UnscheduleMode::GDB, thread_ids);
|
||||
is_running = true;
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) {
|
|||
#ifdef ENABLE_GDBSTUB
|
||||
if (GDBStub::IsServerEnabled()) {
|
||||
LOG_INFO(Loader, "Pausing process {} at start", process_id);
|
||||
SetDebugBreak(true);
|
||||
SetUnscheduleMode(Kernel::UnscheduleMode::GDB);
|
||||
}
|
||||
#endif
|
||||
Core::System::GetInstance().ClearDebugNextProcessFlag();
|
||||
|
|
@ -624,7 +624,8 @@ std::vector<std::shared_ptr<Kernel::Thread>> Kernel::Process::GetThreadList() {
|
|||
return ret;
|
||||
}
|
||||
|
||||
void Kernel::Process::SetDebugBreak(bool debug_break, std::vector<u32> thread_ids) {
|
||||
void Kernel::Process::ChangeUnscheduleMode(UnscheduleMode mode, std::vector<u32> thread_ids,
|
||||
bool set) {
|
||||
auto thread_list = GetThreadList();
|
||||
bool needs_reschedule = false;
|
||||
for (auto& t : thread_list) {
|
||||
|
|
@ -636,7 +637,7 @@ void Kernel::Process::SetDebugBreak(bool debug_break, std::vector<u32> thread_id
|
|||
}
|
||||
}
|
||||
|
||||
needs_reschedule |= t->SetDebugBreak(debug_break);
|
||||
needs_reschedule |= (set ? t->SetUnscheduleMode(mode) : t->ClearUnscheduleMode(mode));
|
||||
}
|
||||
|
||||
if (needs_reschedule) {
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include <boost/container/static_vector.hpp>
|
||||
#include <boost/serialization/export.hpp>
|
||||
#include "common/bit_field.h"
|
||||
#include "common/common_funcs.h"
|
||||
#include "common/common_types.h"
|
||||
#include "core/hle/kernel/handle_table.h"
|
||||
#include "core/hle/kernel/object.h"
|
||||
|
|
@ -51,6 +52,13 @@ union ProcessFlags {
|
|||
BitField<12, 1, u16> loaded_high; ///< Application loaded high (not at 0x00100000).
|
||||
};
|
||||
|
||||
enum class UnscheduleMode : u32 {
|
||||
SVC = (1 << 0),
|
||||
GDB = (1 << 1),
|
||||
FRONTEND = (1 << 2),
|
||||
};
|
||||
DECLARE_ENUM_FLAG_OPERATORS(UnscheduleMode);
|
||||
|
||||
enum class ProcessStatus { Created, Running, Exited };
|
||||
|
||||
class ResourceLimit;
|
||||
|
|
@ -228,9 +236,15 @@ public:
|
|||
|
||||
std::vector<std::shared_ptr<Kernel::Thread>> GetThreadList();
|
||||
|
||||
void SetDebugBreak(bool debug_break, std::vector<u32> thread_ids = {});
|
||||
void SetUnscheduleMode(UnscheduleMode mode, std::vector<u32> thread_ids = {}) {
|
||||
ChangeUnscheduleMode(mode, thread_ids, true);
|
||||
}
|
||||
void ClearUnscheduleMode(UnscheduleMode mode, std::vector<u32> thread_ids = {}) {
|
||||
ChangeUnscheduleMode(mode, thread_ids, false);
|
||||
}
|
||||
|
||||
private:
|
||||
void ChangeUnscheduleMode(UnscheduleMode mode, std::vector<u32> thread_ids, bool set);
|
||||
void FreeAllMemory();
|
||||
|
||||
KernelSystem& kernel;
|
||||
|
|
|
|||
|
|
@ -2191,7 +2191,11 @@ Result SVC::ControlProcess(Handle process_handle, u32 process_OP, u32 varg2, u32
|
|||
kernel.GetCurrentThreadManager().GetCurrentThread()->thread_id) {
|
||||
continue;
|
||||
}
|
||||
thread.get()->can_schedule = !varg2;
|
||||
if (varg2) {
|
||||
thread->SetUnscheduleMode(Kernel::UnscheduleMode::SVC);
|
||||
} else {
|
||||
thread->ClearUnscheduleMode(Kernel::UnscheduleMode::SVC);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ResultSuccess;
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ void Thread::serialize(Archive& ar, const unsigned int file_version) {
|
|||
}
|
||||
}
|
||||
ar & wakeup_callback;
|
||||
ar & debug_break;
|
||||
ar & unschedule_mode;
|
||||
}
|
||||
SERIALIZE_IMPL(Thread)
|
||||
|
||||
|
|
@ -545,12 +545,20 @@ VAddr Thread::GetCommandBufferAddress() const {
|
|||
return GetTLSAddress() + command_header_offset;
|
||||
}
|
||||
|
||||
bool Thread::SetDebugBreak(bool _debug_break) {
|
||||
if (debug_break == _debug_break) {
|
||||
return false;
|
||||
}
|
||||
debug_break = _debug_break;
|
||||
return true;
|
||||
bool Thread::SetUnscheduleMode(UnscheduleMode mode) {
|
||||
UnscheduleMode old = unschedule_mode;
|
||||
|
||||
unschedule_mode |= mode;
|
||||
|
||||
return unschedule_mode != old;
|
||||
}
|
||||
|
||||
bool Thread::ClearUnscheduleMode(UnscheduleMode mode) {
|
||||
UnscheduleMode old = unschedule_mode;
|
||||
|
||||
unschedule_mode &= ~mode;
|
||||
|
||||
return unschedule_mode != old;
|
||||
}
|
||||
|
||||
CpuLimiter::~CpuLimiter() {}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#include "core/arm/arm_interface.h"
|
||||
#include "core/core_timing.h"
|
||||
#include "core/hle/kernel/object.h"
|
||||
#include "core/hle/kernel/process.h"
|
||||
#include "core/hle/kernel/resource_limit.h"
|
||||
#include "core/hle/kernel/wait_object.h"
|
||||
#include "core/hle/result.h"
|
||||
|
|
@ -28,7 +29,6 @@
|
|||
namespace Kernel {
|
||||
|
||||
class Mutex;
|
||||
class Process;
|
||||
|
||||
enum ThreadPriority : u32 {
|
||||
ThreadPrioHighest = 0, ///< Highest thread priority
|
||||
|
|
@ -366,19 +366,16 @@ public:
|
|||
}
|
||||
|
||||
bool CanSchedule() {
|
||||
// TODO(PabloMK7): This may not be the proper way
|
||||
// threads are marked as non-schedulable when they
|
||||
// are in debug break. Figure out and fix.
|
||||
return can_schedule && !debug_break;
|
||||
return static_cast<u32>(unschedule_mode) == 0;
|
||||
}
|
||||
|
||||
bool SetDebugBreak(bool debug_break);
|
||||
bool SetUnscheduleMode(UnscheduleMode mode);
|
||||
bool ClearUnscheduleMode(UnscheduleMode mode);
|
||||
|
||||
Core::ARM_Interface::ThreadContext context{};
|
||||
|
||||
u32 thread_id;
|
||||
|
||||
bool can_schedule{true};
|
||||
ThreadStatus status;
|
||||
VAddr entry_point;
|
||||
VAddr stack_top;
|
||||
|
|
@ -419,7 +416,10 @@ public:
|
|||
|
||||
private:
|
||||
ThreadManager& thread_manager;
|
||||
bool debug_break{};
|
||||
|
||||
// Does not represent how real HW works, instead it mimics behaviour
|
||||
// taking into account how our scheduler works.
|
||||
UnscheduleMode unschedule_mode{};
|
||||
|
||||
friend class boost::serialization::access;
|
||||
template <class Archive>
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ void Directory::Read(Kernel::HLERequestContext& ctx) {
|
|||
ctx.RunAsync(
|
||||
[this, async_data](Kernel::HLERequestContext& ctx) {
|
||||
std::vector<FileSys::Entry> entries(async_data->count);
|
||||
LOG_TRACE(Service_FS, "Read {}: count={}", GetName(), count);
|
||||
LOG_TRACE(Service_FS, "Read {}: count={}", GetName(), async_data->count);
|
||||
// Number of entries actually read
|
||||
async_data->read = backend->Read(static_cast<u32>(entries.size()), entries.data());
|
||||
async_data->buffer->Write(entries.data(), 0, async_data->read * sizeof(FileSys::Entry));
|
||||
|
|
|
|||
|
|
@ -6,8 +6,10 @@
|
|||
#include <string>
|
||||
#include "common/logging/log.h"
|
||||
#include "common/string_util.h"
|
||||
#include "common/zstd_compression.h"
|
||||
#include "core/core.h"
|
||||
#include "core/hle/kernel/process.h"
|
||||
#include "core/hle/service/am/am.h"
|
||||
#include "core/loader/3dsx.h"
|
||||
#include "core/loader/artic.h"
|
||||
#include "core/loader/elf.h"
|
||||
|
|
@ -179,4 +181,62 @@ std::unique_ptr<AppLoader> GetLoader(const std::string& filename) {
|
|||
return GetFileLoader(system, std::move(file), type, filename_filename, filename);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
} // namespace Loader
|
||||
|
|
|
|||
|
|
@ -322,4 +322,7 @@ protected:
|
|||
*/
|
||||
std::unique_ptr<AppLoader> GetLoader(const std::string& filename);
|
||||
|
||||
std::optional<std::pair<Loader::AppLoader::CompressFileInfo, size_t>> GetCompressFileInfo(
|
||||
const std::string& filepath, bool compress);
|
||||
|
||||
} // namespace Loader
|
||||
|
|
|
|||
|
|
@ -58,6 +58,9 @@ void PicaCore::InitializeRegs() {
|
|||
// Values initialized by GSP
|
||||
regs.internal.irq_autostop = 1;
|
||||
regs.internal.irq_mask = 0xFFFFFFF0;
|
||||
// Older versions of libctru didn't initialize this, initialize it here to avoid endless black
|
||||
// screen. Not needed on actual hardware due to previous software already having set it up
|
||||
regs.internal.irq_compare = 0x12345678;
|
||||
|
||||
auto& framebuffer_top = regs.framebuffer_config[0];
|
||||
auto& framebuffer_sub = regs.framebuffer_config[1];
|
||||
|
|
|
|||
194
tools/verify-release.sh
Executable file
194
tools/verify-release.sh
Executable file
|
|
@ -0,0 +1,194 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright Citra Emulator Project / Azahar Emulator Project
|
||||
# Licensed under GPLv2 or any later version
|
||||
# Refer to the license.txt file included.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Usage:
|
||||
# ./verify-release.sh <owner/repo> <tag>
|
||||
#
|
||||
# Example:
|
||||
# ./verify-release.sh azahar-emu/azahar 2126.0
|
||||
#
|
||||
# Behavior:
|
||||
# - Downloads all release assets
|
||||
# - Verifies asset is published in the release
|
||||
# - Verifies SPDX attestations for every asset
|
||||
# - Extracts SPDX SBOMs
|
||||
#
|
||||
# Notes:
|
||||
# - Requires installation of the GitHub CLI (gh) and jq tools.
|
||||
# - Draft release support requires authentication with permission
|
||||
# to view the draft release.
|
||||
# - gh release verify-asset currently does NOT support draft releases.
|
||||
|
||||
if [[ $# -ne 2 ]]; then
|
||||
echo "Usage: $0 <owner/repo> <tag>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
command -v gh >/dev/null 2>&1 || {
|
||||
echo "ERROR: GitHub CLI (gh) is not installed or not in PATH"
|
||||
exit 1
|
||||
}
|
||||
|
||||
command -v jq >/dev/null 2>&1 || {
|
||||
echo "ERROR: jq is not installed or not in PATH"
|
||||
exit 1
|
||||
}
|
||||
|
||||
REPO="$1"
|
||||
TAG="$2"
|
||||
|
||||
echo "==> Fetching release metadata"
|
||||
|
||||
IS_DRAFT=$(
|
||||
gh release view "$TAG" \
|
||||
--repo "$REPO" \
|
||||
--json isDraft \
|
||||
--jq '.isDraft'
|
||||
)
|
||||
|
||||
WORKDIR="verify/release-${TAG}"
|
||||
SBOMSUBDIR="sbom"
|
||||
|
||||
rm -rf "$WORKDIR"
|
||||
mkdir -p "$WORKDIR"
|
||||
cd "$WORKDIR"
|
||||
mkdir -p "$SBOMSUBDIR"
|
||||
|
||||
|
||||
echo
|
||||
echo "==> Downloading release assets"
|
||||
|
||||
gh release download "$TAG" \
|
||||
--repo "$REPO"
|
||||
|
||||
echo
|
||||
echo "==> Fetching asset list"
|
||||
|
||||
ASSETS=()
|
||||
|
||||
while IFS= read -r asset; do
|
||||
ASSETS+=("$asset")
|
||||
done < <(
|
||||
gh release view "$TAG" \
|
||||
--repo "$REPO" \
|
||||
--json assets \
|
||||
--jq '.assets[].name'
|
||||
)
|
||||
|
||||
echo
|
||||
echo "==> Release type: $(
|
||||
[[ "$IS_DRAFT" == "true" ]] && echo "draft" || echo "published"
|
||||
)"
|
||||
|
||||
echo
|
||||
echo "==> Verifying assets"
|
||||
|
||||
for asset in "${ASSETS[@]}"; do
|
||||
# Skip attestation files themselves
|
||||
if [[ "$asset" == *.intoto.jsonl ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ ! -f "$asset" ]]; then
|
||||
echo "ERROR: Missing downloaded asset: $asset"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "========================================"
|
||||
echo "Asset: $asset"
|
||||
echo "========================================"
|
||||
|
||||
echo "1/3 Release asset verification"
|
||||
|
||||
if [[ "$IS_DRAFT" != "true" ]]; then
|
||||
gh release verify-asset "$TAG" "$asset" \
|
||||
--repo "$REPO"
|
||||
echo
|
||||
else
|
||||
echo "SKIPPED (draft releases unsupported)"
|
||||
echo
|
||||
fi
|
||||
|
||||
echo "2/3 Attestation verification"
|
||||
|
||||
if [[ "$asset" == *.sha256sum ]]; then
|
||||
echo "SKIPPED (sha256sum does not need verification)"
|
||||
echo "SKIPPED (no SPDX SBOM extraction)"
|
||||
else
|
||||
gh attestation verify "$asset" \
|
||||
--repo "$REPO" \
|
||||
--predicate-type https://spdx.dev/Document
|
||||
|
||||
echo
|
||||
echo "3/3 SBOM extraction"
|
||||
|
||||
BASE_NAME="$(basename "$asset")"
|
||||
SBOM_FILE="${SBOMSUBDIR}/${BASE_NAME}.spdx.json"
|
||||
|
||||
# gh attestation download does not currently support
|
||||
# specifying the output file, nor it allows piping the
|
||||
# output. For that reason, we need to find the .jsonl
|
||||
# in the current directory.
|
||||
|
||||
# Exclude any existing .jsonl files from find
|
||||
# (failsafe, should not happen)
|
||||
BEFORE_JSONL="$(find . -maxdepth 1 -name '*.jsonl' -print)"
|
||||
|
||||
gh attestation download "$asset" \
|
||||
--repo "$REPO" \
|
||||
>/dev/null
|
||||
|
||||
ATTESTATION_FILE=""
|
||||
|
||||
while IFS= read -r file; do
|
||||
FOUND=false
|
||||
|
||||
while IFS= read -r oldfile; do
|
||||
if [[ "$file" == "$oldfile" ]]; then
|
||||
FOUND=true
|
||||
break
|
||||
fi
|
||||
done <<< "$BEFORE_JSONL"
|
||||
|
||||
# Only consider new jsonl files
|
||||
if [[ "$FOUND" == "false" ]]; then
|
||||
ATTESTATION_FILE="$file"
|
||||
break
|
||||
fi
|
||||
done < <(find . -maxdepth 1 -name '*.jsonl' -print)
|
||||
|
||||
if [[ -z "$ATTESTATION_FILE" ]]; then
|
||||
echo "ERROR: Could not locate downloaded attestation jsonl"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Extract and decode the SBOM from the jsonl
|
||||
jq -r '
|
||||
.dsseEnvelope.payload
|
||||
' "$ATTESTATION_FILE" |
|
||||
while IFS= read -r payload; do
|
||||
echo "$payload" | base64 -d
|
||||
done |
|
||||
jq '.predicate' \
|
||||
> "$SBOM_FILE"
|
||||
|
||||
rm -f "$ATTESTATION_FILE"
|
||||
|
||||
echo "Saved SBOM: $SBOM_FILE"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "OK: $asset"
|
||||
done
|
||||
|
||||
echo
|
||||
echo "========================================"
|
||||
echo "All assets verified successfully"
|
||||
echo "SBOMs saved in: $WORKDIR/$SBOMSUBDIR"
|
||||
echo "========================================"
|
||||
Loading…
Add table
Reference in a new issue