diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 9fcdf549a7..0737ac3e5f 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -2163,6 +2163,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳过 SRAM 加载。") MSG_HASH(MSG_SLOW_MOTION, "慢动作。") +MSG_HASH(MSG_FAST_FORWARD, + "快进。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢动作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 5ada1e2891..c8214e7861 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -2163,6 +2163,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳過 SRAM 戴入。") MSG_HASH(MSG_SLOW_MOTION, "慢動作。") +MSG_HASH(MSG_FAST_FORWARD, + "快進。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢動作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index f5388aebd2..76146f2216 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -2225,6 +2225,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Überspringe Laden des SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Zeitlupe.") +MSG_HASH(MSG_FAST_FORWARD, + "Snel vooruit.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "In Zeitlupe zurückspulen.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 14d56c01a5..16d662480a 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -2052,6 +2052,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_es.c b/intl/msg_hash_es.c index 5f8ddab95a..631d53b609 100644 --- a/intl/msg_hash_es.c +++ b/intl/msg_hash_es.c @@ -1469,6 +1469,8 @@ const char *msg_hash_to_str_es(enum msg_hash_enums msg) return "Omitiendo carga de SRAM."; case MSG_SLOW_MOTION: return "Cámara lenta."; + case MSG_FAST_FORWARD: + return "Avance rápido."; case MSG_SLOW_MOTION_REWIND: return "Rebobinar cámara lenta."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 94bd0f9bbb..e652c33b87 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -2183,6 +2183,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignore le chargement de la SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Ralenti.") +MSG_HASH(MSG_FAST_FORWARD, + "Avance rapide.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Rembobinage ralenti.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 6d85124076..6e1b0b4c8e 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -2223,6 +2223,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanti veloce.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Riavvolgimento lento.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index c99815da72..fff4d59753 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -2237,6 +2237,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "スローモーション。") +MSG_HASH(MSG_FAST_FORWARD, + "早送り。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "スローモーション巻き戻し。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index a0db09d6f7..3984ed5260 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -2163,6 +2163,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "SRAM 불러오기 건너뛰는 중.") MSG_HASH(MSG_SLOW_MOTION, "슬로우 모션.") +MSG_HASH(MSG_FAST_FORWARD, + "빨리 감기.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "슬로우 모션 되감기.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 251c32c283..e8c280b988 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -2050,6 +2050,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_pl.c b/intl/msg_hash_pl.c index cf5300785a..a20415a68d 100644 --- a/intl/msg_hash_pl.c +++ b/intl/msg_hash_pl.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -982,6 +982,8 @@ const char *msg_hash_to_str_pl(enum msg_hash_enums msg) return "Pomijanie wczytywania SRAM."; case MSG_SLOW_MOTION: return "Spowolnione tempo."; + case MSG_FAST_FORWARD: + return "Szybko do przodu."; case MSG_SLOW_MOTION_REWIND: return "Przewijanie w spowolnionym tempie."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index bf472714fb..ed0c47b72f 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -2965,6 +2965,9 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, MSG_HASH(MSG_SLOW_MOTION, "Câmera Lenta." ) +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido." + ) MSG_HASH(MSG_SLOW_MOTION_REWIND, "Voltar Atrás em Câmera Lenta." ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 4815a6e8b1..c82ee3e6d3 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -2153,6 +2153,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignorando carregamento de SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Câmera lenta.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Função rewind em câmera lenta.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 8f734f92a1..dd28e2fab5 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -2198,6 +2198,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Пропуск загрузки SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Замедление.") +MSG_HASH(MSG_FAST_FORWARD, + "Перемотка вперед.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Замедленная перемотка.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index f66cb7cf77..240a4eb38f 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2231,6 +2231,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 08c362344d..6d9463823b 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -2181,6 +2181,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Nhanh về phía trước.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/msg_hash.h b/msg_hash.h index cf03f09a43..e1f8c8fb13 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -342,6 +342,7 @@ enum msg_hash_enums MSG_REWINDING, MSG_SLOW_MOTION_REWIND, MSG_SLOW_MOTION, + MSG_FAST_FORWARD, MSG_REWIND_REACHED_END, MSG_FAILED_TO_START_MOVIE_RECORD, MSG_CHEEVOS_HARDCORE_MODE_ENABLE, diff --git a/retroarch.c b/retroarch.c index 2a3598be88..da76e37c3c 100644 --- a/retroarch.c +++ b/retroarch.c @@ -219,6 +219,7 @@ static bool runloop_paused = false; static bool runloop_idle = false; static bool runloop_exec = false; static bool runloop_slowmotion = false; +static bool runloop_fastmotion = false; static bool runloop_shutdown_initiated = false; static bool runloop_core_shutdown_initiated = false; static bool runloop_perfcnt_enable = false; @@ -1380,10 +1381,10 @@ static bool rarch_game_specific_options(char **output) if (!retroarch_validate_game_options(game_path, game_path_size, false)) - goto error; + goto error; if (!config_file_exists(game_path)) - goto error; + goto error; RARCH_LOG("%s %s\n", msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT), @@ -2765,21 +2766,35 @@ static enum runloop_state runloop_check_state( if (new_button_state && !old_button_state) { - if (input_nonblock_state) + if (input_nonblock_state){ input_driver_unset_nonblock_state(); - else + runloop_fastmotion = false; + } + else { input_driver_set_nonblock_state(); + runloop_fastmotion = true; + } driver_set_nonblock_state(); } else if (old_hold_button_state != new_hold_button_state) { - if (new_hold_button_state) + if (new_hold_button_state) { input_driver_set_nonblock_state(); - else + runloop_fastmotion = true; + } + else { input_driver_unset_nonblock_state(); + runloop_fastmotion = false; + } driver_set_nonblock_state(); } + // Display the fast forward state to the user, if needed. + if (runloop_fastmotion) { + runloop_msg_queue_push( + msg_hash_to_str(MSG_FAST_FORWARD), 2, 15, true); + } + old_button_state = new_button_state; old_hold_button_state = new_hold_button_state; } @@ -3130,7 +3145,6 @@ int runloop_iterate(unsigned *sleep_ms) if (settings->floats.fastforward_ratio) end: { - retro_time_t to_sleep_ms = ( (frame_limit_last_time + frame_limit_minimum_time) - cpu_features_get_time_usec()) / 1000;