diff --git a/.github/workflows/rolling-release.yml b/.github/workflows/rolling-release.yml
index bff8408ea..214ba694c 100644
--- a/.github/workflows/rolling-release.yml
+++ b/.github/workflows/rolling-release.yml
@@ -170,13 +170,27 @@ jobs:
run: |
cd android
./gradlew assembleRelease
- mv app/build/outputs/apk/release/app-release-unsigned.apk ../duckstation-release-unsigned.apk
-
+
+ - name: Sign APK
+ uses: r0adkll/sign-android-release@v1
+ with:
+ releaseDirectory: android/app/build/outputs/apk/release
+ signingKeyBase64: ${{ secrets.APK_SIGNING_KEY }}
+ alias: ${{ secrets.APK_KEY_ALIAS }}
+ keyStorePassword: ${{ secrets.APK_KEY_STORE_PASSWORD }}
+ keyPassword: ${{ secrets.APK_KEY_PASSWORD }}
+
+ - name: Rename APK
+ shell: bash
+ run: |
+ cd android
+ mv app/build/outputs/apk/release/app-release-unsigned-signed.apk ../duckstation-android-aarch64.apk
+
- name: Upload APK
uses: actions/upload-artifact@v1
with:
name: "android"
- path: "duckstation-release-unsigned.apk"
+ path: "duckstation-android-aarch64.apk"
create-release:
@@ -239,5 +253,5 @@ jobs:
linux-x64-appimage-qt-zsync/duckstation-qt-x64.AppImage.zsync
linux-libretro/duckstation_libretro.so.zip
linux-libretro/duckstation_libretro_android_aarch64.so.zip
- android/duckstation-release-unsigned.apk
+ android/duckstation-android-aarch64.apk
diff --git a/README.md b/README.md
index 8e636a218..e0ee7f745 100644
--- a/README.md
+++ b/README.md
@@ -49,7 +49,7 @@ Other features include:
- SDL-compatible game controller (e.g. XB360/XBOne)
## Downloading and running
-Binaries of DuckStation for 64-bit Windows and 64-bit Linux (in AppImage format) are available via GitHub Releases and are automatically built with every commit/push. Binaries or packages distributed through other sources may be out of date and are not supported by the developer.
+Binaries of DuckStation for Windows 64-bit, x86_64 Linux x86_64 (in AppImage format), and Android ARMv8/AArch64 are available via GitHub Releases and are automatically built with every commit/push. Binaries or packages distributed through other sources may be out of date and are not supported by the developer.
### Windows
@@ -83,14 +83,20 @@ To download:
A prebuilt APK is now available for Android. However, please keep in mind that the Android version is not yet feature complete, it is more of a preview of things to come. You will need a device running a 64-bit AArch64 userland (anything made in the last few years).
-Download link: https://github.com/stenzek/duckstation/releases/download/latest/duckstation-release-unsigned.apk
+Download link: https://github.com/stenzek/duckstation/releases/download/latest/duckstation-android-aarch64.apk
The main limitations are:
- No controller support, only on-screen controls.
- - User directory is currently hardcoded to /sdcard/duckstation. So BIOS files go in /sdcard/duckstation/bios.
+ - User directory is currently hardcoded to `/sdcard/duckstation`. So BIOS files go in `/sdcard/duckstation/bios`.
- Lack of options in menu when emulator is running.
- Performance is currently lower than the desktop x86_64 counterpart.
+To use:
+ - Install and run the app for the first time.
+ - This will create `/sdcard/duckstation`. Drop your BIOS files in `/sdcard/duckstation/bios`.
+ - Add game directories by hitting the `+` icon and selecting a directory. Due to a bug you may need to restart the app for it to scan the directory.
+ - Tap a game to start.
+
### Title Information
diff --git a/android/app/src/main/res/values/arrays.xml b/android/app/src/main/res/values/arrays.xml
index 50881a898..b888126b3 100644
--- a/android/app/src/main/res/values/arrays.xml
+++ b/android/app/src/main/res/values/arrays.xml
@@ -23,10 +23,12 @@
- Hardware (OpenGL)
+ - Hardware (Vulkan)
- Software
- OpenGL
+ - Vulkan
- Software
@@ -65,4 +67,4 @@
- 15
- 16
-
\ No newline at end of file
+
diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp
index 56f790294..3cb025446 100644
--- a/src/core/cdrom.cpp
+++ b/src/core/cdrom.cpp
@@ -2337,14 +2337,15 @@ void CDROM::DrawDebugWindow()
if (m_reader.HasMedia())
{
const CDImage* media = m_reader.GetMedia();
- const auto [disc_minute, disc_second, disc_frame] = media->GetMSFPositionOnDisc();
- const auto [track_minute, track_second, track_frame] = media->GetMSFPositionInTrack();
+ const CDImage::Position disc_position = CDImage::Position::FromLBA(m_current_lba);
+ const CDImage::Position track_position = CDImage::Position::FromLBA(
+ m_current_lba - media->GetTrackStartPosition(static_cast(media->GetTrackNumber())));
ImGui::Text("Filename: %s", media->GetFileName().c_str());
- ImGui::Text("Disc Position: MSF[%02u:%02u:%02u] LBA[%u]", disc_minute, disc_second, disc_frame,
- media->GetPositionOnDisc());
- ImGui::Text("Track Position: Number[%u] MSF[%02u:%02u:%02u] LBA[%u]", media->GetTrackNumber(), track_minute,
- track_second, track_frame, media->GetPositionInTrack());
+ ImGui::Text("Disc Position: MSF[%02u:%02u:%02u] LBA[%u]", disc_position.minute, disc_position.second,
+ disc_position.frame, disc_position.ToLBA());
+ ImGui::Text("Track Position: Number[%u] MSF[%02u:%02u:%02u] LBA[%u]", media->GetTrackNumber(),
+ track_position.minute, track_position.second, track_position.frame, track_position.ToLBA());
ImGui::Text("Last Sector: %02X:%02X:%02X (Mode %u)", m_last_sector_header.minute, m_last_sector_header.second,
m_last_sector_header.frame, m_last_sector_header.sector_mode);
}
diff --git a/src/duckstation-libretro/libretro_host_interface.cpp b/src/duckstation-libretro/libretro_host_interface.cpp
index 299386241..64af34bb9 100644
--- a/src/duckstation-libretro/libretro_host_interface.cpp
+++ b/src/duckstation-libretro/libretro_host_interface.cpp
@@ -369,17 +369,25 @@ static std::array s_option_definitions = {{
#endif
},
{"GPU.ResolutionScale",
- "Rendering Resolution Scale",
- "Scales internal rendering resolution by the specified multiplier. Larger values are slower. Some games require "
- "1x rendering resolution or they will have rendering issues.",
- {{"1", "1x (1024x512)"},
- {"2", "2x (2048x1024)"},
- {"3", "3x (3072x1536)"},
- {"4", "4x (4096x2048)"},
- {"5", "5x (5120x2160)"},
- {"6", "6x (6144x3072)"},
- {"7", "7x (7168x3584)"},
- {"8", "8x (8192x4096)"}},
+ "Internal Resolution Scale",
+ "Scales internal VRAM resolution by the specified multiplier. Larger values are slower. Some games require "
+ "1x VRAM resolution or they will have rendering issues.",
+ {{"1", "1x (1024x512 VRAM)"},
+ {"2", "2x (2048x1024 VRAM)"},
+ {"3", "3x (3072x1536 VRAM)"},
+ {"4", "4x (4096x2048 VRAM)"},
+ {"5", "5x (5120x2160 VRAM)"},
+ {"6", "6x (6144x3072 VRAM)"},
+ {"7", "7x (7168x3584 VRAM)"},
+ {"8", "8x (8192x4096 VRAM)"},
+ {"9", "9x (9216x4608 VRAM)"},
+ {"10", "10x (10240x5120 VRAM)"},
+ {"11", "11x (11264x5632 VRAM)"},
+ {"12", "12x (12288x6144 VRAM)"},
+ {"13", "13x (13312x6656 VRAM)"},
+ {"14", "14x (14336x7168 VRAM)"},
+ {"15", "15x (15360x7680 VRAM)"},
+ {"16", "16x (16384x8192 VRAM)"}},
"1"},
{"GPU.TrueColor",
"True Color Rendering",