mirror of
https://github.com/Lime3DS/Lime3DS.git
synced 2025-03-13 09:12:27 +01:00
android: Add turbo mode hotkey
This commit is contained in:
parent
89b2d3d3ce
commit
823746314a
@ -180,6 +180,17 @@ object NativeLibrary {
|
|||||||
|
|
||||||
external fun downloadTitleFromNus(title: Long): InstallStatus
|
external fun downloadTitleFromNus(title: Long): InstallStatus
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turbo speed.
|
||||||
|
*/
|
||||||
|
external fun toggleTurboSpeed(enabled: Boolean)
|
||||||
|
|
||||||
|
external fun getTurboSpeedSlider(): Int
|
||||||
|
|
||||||
|
external fun setTurboSpeedSlider(value: Int)
|
||||||
|
|
||||||
|
|
||||||
private var coreErrorAlertResult = false
|
private var coreErrorAlertResult = false
|
||||||
private val coreErrorAlertLock = Object()
|
private val coreErrorAlertLock = Object()
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ import org.citra.citra_emu.contracts.OpenFileResultContract
|
|||||||
import org.citra.citra_emu.databinding.ActivityEmulationBinding
|
import org.citra.citra_emu.databinding.ActivityEmulationBinding
|
||||||
import org.citra.citra_emu.display.ScreenAdjustmentUtil
|
import org.citra.citra_emu.display.ScreenAdjustmentUtil
|
||||||
import org.citra.citra_emu.features.hotkeys.HotkeyUtility
|
import org.citra.citra_emu.features.hotkeys.HotkeyUtility
|
||||||
|
import org.citra.citra_emu.features.hotkeys.HotkeyFunctions
|
||||||
import org.citra.citra_emu.features.settings.model.BooleanSetting
|
import org.citra.citra_emu.features.settings.model.BooleanSetting
|
||||||
import org.citra.citra_emu.features.settings.model.IntSetting
|
import org.citra.citra_emu.features.settings.model.IntSetting
|
||||||
import org.citra.citra_emu.features.settings.model.SettingsViewModel
|
import org.citra.citra_emu.features.settings.model.SettingsViewModel
|
||||||
@ -55,6 +56,7 @@ class EmulationActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private lateinit var binding: ActivityEmulationBinding
|
private lateinit var binding: ActivityEmulationBinding
|
||||||
private lateinit var screenAdjustmentUtil: ScreenAdjustmentUtil
|
private lateinit var screenAdjustmentUtil: ScreenAdjustmentUtil
|
||||||
|
private lateinit var hotkeyFunctions: HotkeyFunctions
|
||||||
private lateinit var hotkeyUtility: HotkeyUtility
|
private lateinit var hotkeyUtility: HotkeyUtility
|
||||||
|
|
||||||
private val emulationFragment: EmulationFragment
|
private val emulationFragment: EmulationFragment
|
||||||
@ -76,6 +78,7 @@ class EmulationActivity : AppCompatActivity() {
|
|||||||
binding = ActivityEmulationBinding.inflate(layoutInflater)
|
binding = ActivityEmulationBinding.inflate(layoutInflater)
|
||||||
screenAdjustmentUtil = ScreenAdjustmentUtil(this, windowManager, settingsViewModel.settings)
|
screenAdjustmentUtil = ScreenAdjustmentUtil(this, windowManager, settingsViewModel.settings)
|
||||||
hotkeyUtility = HotkeyUtility(screenAdjustmentUtil, this)
|
hotkeyUtility = HotkeyUtility(screenAdjustmentUtil, this)
|
||||||
|
hotkeyUtility = HotkeyUtility(screenAdjustmentUtil, hotkeyFunctions)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
val navHostFragment =
|
val navHostFragment =
|
||||||
@ -138,6 +141,7 @@ class EmulationActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
|
hotkeyFunctions.resetTurboSpeed()
|
||||||
EmulationLifecycleUtil.clear()
|
EmulationLifecycleUtil.clear()
|
||||||
isEmulationRunning = false
|
isEmulationRunning = false
|
||||||
instance = null
|
instance = null
|
||||||
|
@ -11,4 +11,5 @@ enum class Hotkey(val button: Int) {
|
|||||||
PAUSE_OR_RESUME(10004),
|
PAUSE_OR_RESUME(10004),
|
||||||
QUICKSAVE(10005),
|
QUICKSAVE(10005),
|
||||||
QUICKLOAD(10006);
|
QUICKLOAD(10006);
|
||||||
|
TURBO_SPEED(10007);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,57 @@
|
|||||||
|
// Copyright Lime3DS Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
package org.citra.citra_emu.features.hotkeys
|
||||||
|
|
||||||
|
import android.widget.Toast
|
||||||
|
import org.citra.citra_emu.CitraApplication
|
||||||
|
import org.citra.citra_emu.NativeLibrary
|
||||||
|
import org.citra.citra_emu.features.settings.model.IntSetting
|
||||||
|
import org.citra.citra_emu.features.settings.model.Settings
|
||||||
|
import org.citra.citra_emu.features.settings.utils.SettingsFile
|
||||||
|
|
||||||
|
|
||||||
|
class HotkeyFunctions (
|
||||||
|
private val settings: Settings
|
||||||
|
) {
|
||||||
|
private var normalSpeed = IntSetting.FRAME_LIMIT.int
|
||||||
|
var isTurboSpeedEnabled = false
|
||||||
|
|
||||||
|
// Turbo Speed
|
||||||
|
fun setTurboSpeed(enabled: Boolean) {
|
||||||
|
isTurboSpeedEnabled = enabled
|
||||||
|
toggleTurboSpeed()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun toggleTurboSpeed() {
|
||||||
|
if (isTurboSpeedEnabled) {
|
||||||
|
normalSpeed = IntSetting.FRAME_LIMIT.int
|
||||||
|
NativeLibrary.toggleTurboSpeed(true)
|
||||||
|
NativeLibrary.setTurboSpeedSlider(IntSetting.TURBO_SPEED.int)
|
||||||
|
IntSetting.FRAME_LIMIT.int = IntSetting.TURBO_SPEED.int
|
||||||
|
} else {
|
||||||
|
NativeLibrary.toggleTurboSpeed(false)
|
||||||
|
NativeLibrary.setTurboSpeedSlider(normalSpeed)
|
||||||
|
IntSetting.FRAME_LIMIT.int = normalSpeed
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.saveSetting(IntSetting.FRAME_LIMIT, SettingsFile.FILE_NAME_CONFIG)
|
||||||
|
NativeLibrary.reloadSettings()
|
||||||
|
|
||||||
|
val context = CitraApplication.appContext
|
||||||
|
Toast.makeText(context
|
||||||
|
, "Changed Emulation Speed to: ${IntSetting.FRAME_LIMIT.int}%", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun resetTurboSpeed() {
|
||||||
|
if (isTurboSpeedEnabled) {
|
||||||
|
isTurboSpeedEnabled = false
|
||||||
|
NativeLibrary.toggleTurboSpeed(false)
|
||||||
|
IntSetting.FRAME_LIMIT.int = normalSpeed
|
||||||
|
|
||||||
|
settings.saveSetting(IntSetting.FRAME_LIMIT, SettingsFile.FILE_NAME_CONFIG)
|
||||||
|
NativeLibrary.reloadSettings()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -22,6 +22,7 @@ class HotkeyUtility(private val screenAdjustmentUtil: ScreenAdjustmentUtil, priv
|
|||||||
Hotkey.CYCLE_LAYOUT.button -> screenAdjustmentUtil.cycleLayouts()
|
Hotkey.CYCLE_LAYOUT.button -> screenAdjustmentUtil.cycleLayouts()
|
||||||
Hotkey.CLOSE_GAME.button -> EmulationLifecycleUtil.closeGame()
|
Hotkey.CLOSE_GAME.button -> EmulationLifecycleUtil.closeGame()
|
||||||
Hotkey.PAUSE_OR_RESUME.button -> EmulationLifecycleUtil.pauseOrResume()
|
Hotkey.PAUSE_OR_RESUME.button -> EmulationLifecycleUtil.pauseOrResume()
|
||||||
|
Hotkey.TURBO_SPEED.button -> hotkeyFunctions.setTurboSpeed(!hotkeyFunctions.isTurboSpeedEnabled)
|
||||||
Hotkey.QUICKSAVE.button -> {
|
Hotkey.QUICKSAVE.button -> {
|
||||||
NativeLibrary.saveState(NativeLibrary.QUICKSAVE_SLOT)
|
NativeLibrary.saveState(NativeLibrary.QUICKSAVE_SLOT)
|
||||||
Toast.makeText(context,
|
Toast.makeText(context,
|
||||||
|
@ -65,6 +65,8 @@ enum class IntSetting(
|
|||||||
USE_ARTIC_BASE_CONTROLLER("use_artic_base_controller", Settings.SECTION_CONTROLS, 0),
|
USE_ARTIC_BASE_CONTROLLER("use_artic_base_controller", Settings.SECTION_CONTROLS, 0),
|
||||||
ORIENTATION_OPTION("screen_orientation", Settings.SECTION_LAYOUT, 2),
|
ORIENTATION_OPTION("screen_orientation", Settings.SECTION_LAYOUT, 2),
|
||||||
DISABLE_RIGHT_EYE_RENDER("disable_right_eye_render", Settings.SECTION_RENDERER, 0);
|
DISABLE_RIGHT_EYE_RENDER("disable_right_eye_render", Settings.SECTION_RENDERER, 0);
|
||||||
|
TURBO_SPEED("turbo_speed", Settings.SECTION_CORE, 200);
|
||||||
|
|
||||||
override var int: Int = defaultValue
|
override var int: Int = defaultValue
|
||||||
|
|
||||||
override val valueAsString: String
|
override val valueAsString: String
|
||||||
@ -94,6 +96,7 @@ enum class IntSetting(
|
|||||||
AUDIO_INPUT_TYPE,
|
AUDIO_INPUT_TYPE,
|
||||||
USE_ARTIC_BASE_CONTROLLER,
|
USE_ARTIC_BASE_CONTROLLER,
|
||||||
SHADERS_ACCURATE_MUL,
|
SHADERS_ACCURATE_MUL,
|
||||||
|
FRAME_LIMIT
|
||||||
)
|
)
|
||||||
|
|
||||||
fun from(key: String): IntSetting? = IntSetting.values().firstOrNull { it.key == key }
|
fun from(key: String): IntSetting? = IntSetting.values().firstOrNull { it.key == key }
|
||||||
|
@ -139,6 +139,7 @@ class Settings {
|
|||||||
const val HOTKEY_PAUSE_OR_RESUME = "hotkey_pause_or_resume_game"
|
const val HOTKEY_PAUSE_OR_RESUME = "hotkey_pause_or_resume_game"
|
||||||
const val HOTKEY_QUICKSAVE = "hotkey_quickload"
|
const val HOTKEY_QUICKSAVE = "hotkey_quickload"
|
||||||
const val HOTKEY_QUICKlOAD = "hotkey_quickpause"
|
const val HOTKEY_QUICKlOAD = "hotkey_quickpause"
|
||||||
|
const val HOTKEY_TURBO_SPEED = "hotkey_turbo_speed"
|
||||||
|
|
||||||
val buttonKeys = listOf(
|
val buttonKeys = listOf(
|
||||||
KEY_BUTTON_A,
|
KEY_BUTTON_A,
|
||||||
@ -204,7 +205,8 @@ class Settings {
|
|||||||
HOTKEY_CLOSE_GAME,
|
HOTKEY_CLOSE_GAME,
|
||||||
HOTKEY_PAUSE_OR_RESUME,
|
HOTKEY_PAUSE_OR_RESUME,
|
||||||
HOTKEY_QUICKSAVE,
|
HOTKEY_QUICKSAVE,
|
||||||
HOTKEY_QUICKlOAD
|
HOTKEY_QUICKlOAD,
|
||||||
|
HOTKEY_TURBO_SPEED
|
||||||
)
|
)
|
||||||
val hotkeyTitles = listOf(
|
val hotkeyTitles = listOf(
|
||||||
R.string.emulation_swap_screens,
|
R.string.emulation_swap_screens,
|
||||||
@ -213,6 +215,7 @@ class Settings {
|
|||||||
R.string.emulation_toggle_pause,
|
R.string.emulation_toggle_pause,
|
||||||
R.string.emulation_quicksave,
|
R.string.emulation_quicksave,
|
||||||
R.string.emulation_quickload,
|
R.string.emulation_quickload,
|
||||||
|
R.string.emulation_toggle_turbo_speed
|
||||||
)
|
)
|
||||||
|
|
||||||
const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch"
|
const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch"
|
||||||
|
@ -133,6 +133,7 @@ class InputBindingSetting(
|
|||||||
Settings.HOTKEY_PAUSE_OR_RESUME -> Hotkey.PAUSE_OR_RESUME.button
|
Settings.HOTKEY_PAUSE_OR_RESUME -> Hotkey.PAUSE_OR_RESUME.button
|
||||||
Settings.HOTKEY_QUICKSAVE -> Hotkey.QUICKSAVE.button
|
Settings.HOTKEY_QUICKSAVE -> Hotkey.QUICKSAVE.button
|
||||||
Settings.HOTKEY_QUICKlOAD -> Hotkey.QUICKLOAD.button
|
Settings.HOTKEY_QUICKlOAD -> Hotkey.QUICKLOAD.button
|
||||||
|
Settings.HOTKEY_TURBO_SPEED -> Hotkey.TURBO_SPEED.button
|
||||||
else -> -1
|
else -> -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,6 +236,18 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
|
|||||||
IntSetting.FRAME_LIMIT.defaultValue.toFloat()
|
IntSetting.FRAME_LIMIT.defaultValue.toFloat()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
add(
|
||||||
|
SliderSetting(
|
||||||
|
IntSetting.TURBO_SPEED,
|
||||||
|
R.string.turbo_speed,
|
||||||
|
R.string.turbo_speed_description,
|
||||||
|
100,
|
||||||
|
400,
|
||||||
|
"%",
|
||||||
|
IntSetting.TURBO_SPEED.key,
|
||||||
|
IntSetting.TURBO_SPEED.defaultValue.toFloat()
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,8 +149,8 @@ void Config::ReadValues() {
|
|||||||
ReadSetting("Renderer", Settings::values.use_vsync_new);
|
ReadSetting("Renderer", Settings::values.use_vsync_new);
|
||||||
ReadSetting("Renderer", Settings::values.texture_filter);
|
ReadSetting("Renderer", Settings::values.texture_filter);
|
||||||
ReadSetting("Renderer", Settings::values.texture_sampling);
|
ReadSetting("Renderer", Settings::values.texture_sampling);
|
||||||
|
ReadSetting("Renderer", Settings::values.turbo_speed);
|
||||||
// Work around to map Android setting for enabling the frame limiter to the format Citra expects
|
// Workaround to map Android setting for enabling the frame limiter to the format Citra expects
|
||||||
if (sdl2_config->GetBoolean("Renderer", "use_frame_limit", true)) {
|
if (sdl2_config->GetBoolean("Renderer", "use_frame_limit", true)) {
|
||||||
ReadSetting("Renderer", Settings::values.frame_limit);
|
ReadSetting("Renderer", Settings::values.frame_limit);
|
||||||
} else {
|
} else {
|
||||||
|
@ -745,4 +745,19 @@ void Java_org_citra_citra_1emu_NativeLibrary_logDeviceInfo([[maybe_unused]] JNIE
|
|||||||
LOG_INFO(Frontend, "Host OS: Android API level {}", android_get_device_api_level());
|
LOG_INFO(Frontend, "Host OS: Android API level {}", android_get_device_api_level());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JNICALL Java_io_github_lime3ds_android_NativeLibrary_toggleTurboSpeed(
|
||||||
|
[[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj, jboolean enabled) {
|
||||||
|
Settings::values.turbo_speed = enabled ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
jint JNICALL Java_io_github_lime3ds_android_NativeLibrary_getTurboSpeedSlider(
|
||||||
|
[[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj) {
|
||||||
|
return static_cast<jint>(Settings::values.turbo_speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JNICALL Java_io_github_lime3ds_android_NativeLibrary_setTurboSpeedSlider(
|
||||||
|
[[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj, jint value) {
|
||||||
|
Settings::values.turbo_speed = value;
|
||||||
|
}
|
||||||
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
@ -238,9 +238,12 @@
|
|||||||
<string name="asynchronous_gpu">Enable asynchronous GPU emulation</string>
|
<string name="asynchronous_gpu">Enable asynchronous GPU emulation</string>
|
||||||
<string name="asynchronous_gpu_description">Uses a separate thread to emulate the GPU asynchronously. When enabled, performance will be improved.</string>
|
<string name="asynchronous_gpu_description">Uses a separate thread to emulate the GPU asynchronously. When enabled, performance will be improved.</string>
|
||||||
<string name="frame_limit_enable">Limit Speed</string>
|
<string name="frame_limit_enable">Limit Speed</string>
|
||||||
<string name="frame_limit_enable_description">When enabled, emulation speed will be limited to a specified percentage of normal speed.</string>
|
<string name="frame_limit_enable_description">When enabled, emulation speed will be limited to a specified percentage of normal speed. If disabled, emulation speed will be uncapped and the turbo speed hotkey will not work.</string>
|
||||||
<string name="frame_limit_slider">Limit Speed Percent</string>
|
<string name="frame_limit_slider">Limit Speed Percent</string>
|
||||||
<string name="frame_limit_slider_description">Specifies the percentage to limit emulation speed. With the default of 100% emulation will be limited to normal speed. Values higher or lower will increase or decrease the speed limit.</string>
|
<string name="frame_limit_slider_description">Specifies the percentage to limit emulation speed. With the default of 100% emulation will be limited to normal speed. Values higher or lower will increase or decrease the speed limit.</string>
|
||||||
|
<string name="emulation_toggle_turbo_speed">Turbo Speed</string>
|
||||||
|
<string name="turbo_speed">Turbo Speed</string>
|
||||||
|
<string name="turbo_speed_description">Value used for the turbo hotkey</string>
|
||||||
<string name="internal_resolution">Internal Resolution</string>
|
<string name="internal_resolution">Internal Resolution</string>
|
||||||
<string name="internal_resolution_description">Specifies the resolution used to render at. A high resolution will improve visual quality a lot but is also quite heavy on performance and might cause glitches in certain applications.</string>
|
<string name="internal_resolution_description">Specifies the resolution used to render at. A high resolution will improve visual quality a lot but is also quite heavy on performance and might cause glitches in certain applications.</string>
|
||||||
<string name="internal_resolution_setting_1x">Native (400x240)</string>
|
<string name="internal_resolution_setting_1x">Native (400x240)</string>
|
||||||
|
@ -102,12 +102,11 @@ void ConfigureHotkeys::Configure(QModelIndex index) {
|
|||||||
// to the same action. Which cuases problems resetting the frame limit.to the inititla value.
|
// to the same action. Which cuases problems resetting the frame limit.to the inititla value.
|
||||||
const QString current_action =
|
const QString current_action =
|
||||||
model->data(model->index(index.row(), 0, index.parent())).toString();
|
model->data(model->index(index.row(), 0, index.parent())).toString();
|
||||||
const bool is_turbo = current_action == tr("Toggle Custom Emulation Speed");
|
const bool is_turbo = current_action == tr("Toggle Turbo Mode");
|
||||||
const bool is_per_game = current_action == tr("Toggle Per-Game Speed");
|
const bool is_per_game = current_action == tr("Toggle Per-Game Speed");
|
||||||
|
|
||||||
if (is_turbo || is_per_game) {
|
if (is_turbo || is_per_game) {
|
||||||
QString other_action =
|
QString other_action = is_turbo ? tr("Toggle Per-Game Speed") : tr("Toggle Turbo Mode");
|
||||||
is_turbo ? tr("Toggle Per-Game Speed") : tr("Toggle Custom Emulation Speed");
|
|
||||||
QKeySequence other_sequence;
|
QKeySequence other_sequence;
|
||||||
|
|
||||||
for (int r = 0; r < model->rowCount(); ++r) {
|
for (int r = 0; r < model->rowCount(); ++r) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user