From 289be872f3c2fa8a4e19af6f7942fbc0ae18b97b Mon Sep 17 00:00:00 2001 From: Barry Rowe Date: Tue, 24 Mar 2020 20:00:13 -0700 Subject: [PATCH 1/2] Added in auto-translate support, fixes for ozone and glui accessibility, and support for nvda and SAPI narration. --- Makefile.common | 10 + frontend/drivers/platform_win32.c | 222 ++++++++++++-- input/input_mapper.c | 7 + menu/drivers/materialui.c | 2 +- menu/drivers/ozone/ozone.c | 20 +- menu/menu_defines.h | 5 +- menu/menu_driver.c | 19 ++ nvdaController.h | 80 +++++ nvdaControllerClient64.dll | Bin 0 -> 153600 bytes qb/config.params.sh | 1 + retroarch.c | 476 +++++++++++++++++++++++++++--- retroarch.h | 8 + 12 files changed, 774 insertions(+), 76 deletions(-) create mode 100644 nvdaController.h create mode 100644 nvdaControllerClient64.dll diff --git a/Makefile.common b/Makefile.common index 013fd9ce7d..9c6f7eebe4 100644 --- a/Makefile.common +++ b/Makefile.common @@ -19,6 +19,10 @@ ifeq ($(HAVE_CXX11), 1) CXXFLAGS += $(CXX11_CFLAGS) endif +ifeq ($(HAVE_NVDA), 1) + LIBS += nvdaControllerClient64.dll +endif + ifeq ($(HAVE_GL_CONTEXT),) HAVE_GL_CONTEXT = 0 HAVE_GL_MODERN = 0 @@ -1764,7 +1768,13 @@ endif # Accessibility ifeq ($(HAVE_ACCESSIBILITY), 1) DEFINES += -DHAVE_ACCESSIBILITY + +ifneq ($(findstring Win32,$(OS)),) + LIBS += -lsapi endif +endif + + # Things that depend on network availability diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index 597e0ccb41..2f1db1d605 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -51,6 +51,10 @@ #include "../../msg_hash.h" #include "platform_win32.h" +#ifdef HAVE_NVDA +#include "../../nvdaController.h" +#endif + #ifndef SM_SERVERR2 #define SM_SERVERR2 89 #endif @@ -717,6 +721,74 @@ static bool frontend_win32_set_fork(enum frontend_fork fork_mode) #endif #if defined(_WIN32) && !defined(_XBOX) +static const char *accessibility_win_language_id(const char* language) +{ + if (string_is_equal(language,"en")) + return "409"; + else if (string_is_equal(language,"it")) + return "410"; + else if (string_is_equal(language,"sv")) + return "041d"; + else if (string_is_equal(language,"fr")) + return "040c"; + else if (string_is_equal(language,"de")) + return "407"; + else if (string_is_equal(language,"he")) + return "040d"; + else if (string_is_equal(language,"id")) + return "421"; + else if (string_is_equal(language,"es")) + return "040a"; + else if (string_is_equal(language,"nl")) + return "413"; + else if (string_is_equal(language,"ro")) + return "418"; + else if (string_is_equal(language,"pt_pt")) + return "816"; + else if (string_is_equal(language,"pt_bt") || string_is_equal(language,"pt")) + return "416"; + else if (string_is_equal(language,"th")) + return "041e"; + else if (string_is_equal(language,"ja")) + return "411"; + else if (string_is_equal(language,"sk")) + return "041b"; + else if (string_is_equal(language,"hi")) + return "439"; + else if (string_is_equal(language,"ar")) + return "401"; + else if (string_is_equal(language,"hu")) + return "040e"; + else if (string_is_equal(language,"zh_tw") || string_is_equal(language,"zh")) + return "804"; + else if (string_is_equal(language,"el")) + return "408"; + else if (string_is_equal(language,"ru")) + return "419"; + else if (string_is_equal(language,"nb")) + return "414"; + else if (string_is_equal(language,"da")) + return "406"; + else if (string_is_equal(language,"fi")) + return "040b"; + else if (string_is_equal(language,"zh_hk")) + return "0c04"; + else if (string_is_equal(language,"zh_cn")) + return "804"; + else if (string_is_equal(language,"tr")) + return "041f"; + else if (string_is_equal(language,"ko")) + return "412"; + else if (string_is_equal(language,"pl")) + return "415"; + else if (string_is_equal(language,"cs")) + return "405"; + else + return ""; + + +} + static const char *accessibility_win_language_code(const char* language) { if (string_is_equal(language,"en")) @@ -730,9 +802,9 @@ static const char *accessibility_win_language_code(const char* language) else if (string_is_equal(language,"de")) return "Microsoft Stefan Desktop"; else if (string_is_equal(language,"he")) - return "Microsoft Hemant Desktop"; - else if (string_is_equal(language,"id")) return "Microsoft Asaf Desktop"; + else if (string_is_equal(language,"id")) + return "Microsoft Andika Desktop"; else if (string_is_equal(language,"es")) return "Microsoft Pablo Desktop"; else if (string_is_equal(language,"nl")) @@ -806,13 +878,68 @@ static bool create_win32_process(char* cmd) return true; } +#define COBJMACROS +#include +#include + +static ISpVoice* pVoice = NULL; +#ifdef HAVE_NVDA +bool USE_POWERSHELL = false; +bool USE_NVDA = true; +#else +bool USE_POWERSHELL = true; +bool USE_NVDA = false; +#endif +bool USE_NVDA_BRAILLE = false; + static bool is_narrator_running_windows(void) { DWORD status = 0; - if (pi_set == false) + bool res; + if (USE_POWERSHELL) + { + if (pi_set == false) + return false; + if (GetExitCodeProcess(g_pi.hProcess, &status)) + { + if (status == STILL_ACTIVE) + return true; + } return false; - if (GetExitCodeProcess(&g_pi, &status) && status == STILL_ACTIVE) - return true; + } +#ifdef HAVE_NVDA + else if (USE_NVDA) + { + long res=nvdaController_testIfRunning(); + if(res!=0) + { + /* The running nvda service wasn't found, so revert + back to the powershell method + */ + RARCH_LOG("Error communicating with NVDA\n"); + USE_POWERSHELL = true; + USE_NVDA = false; + return false; + } + return false; + /* + nvdaController_speakText(L"This is a test speech message"); + nvdaController_brailleMessage(L"This is a test braille message"); + */ + } +#endif + else + { + SPVOICESTATUS pStatus; + if (pVoice != NULL) + { + ISpVoice_GetStatus(pVoice, &pStatus, NULL); + if (pStatus.dwRunningState == SPRS_IS_SPEAKING) + return true; + else + return false; + } + } return false; } @@ -822,9 +949,12 @@ static bool accessibility_speak_windows(int speed, char cmd[1200]; const char *voice = get_user_language_iso639_1(true); const char *language = accessibility_win_language_code(voice); + const char *langid = accessibility_win_language_id(voice); bool res = false; const char* speeds[10] = {"-10", "-7.5", "-5", "-2.5", "0", "2", "4", "6", "8", "10"}; + HRESULT hr; + if (speed < 1) speed = 1; else if (speed > 10) @@ -836,22 +966,78 @@ static bool accessibility_speak_windows(int speed, return true; } - if (strlen(language) > 0) - snprintf(cmd, sizeof(cmd), - "powershell.exe -NoProfile -WindowStyle Hidden -Command \"Add-Type -AssemblyName System.Speech; $synth = New-Object System.Speech.Synthesis.SpeechSynthesizer; $synth.SelectVoice(\\\"%s\\\"); $synth.Rate = %s; $synth.Speak(\\\"%s\\\");\"", language, speeds[speed-1], (char*) speak_text); - else - snprintf(cmd, sizeof(cmd), - "powershell.exe -NoProfile -WindowStyle Hidden -Command \"Add-Type -AssemblyName System.Speech; $synth = New-Object System.Speech.Synthesis.SpeechSynthesizer; $synth.Rate = %s; $synth.Speak(\\\"%s\\\");\"", speeds[speed-1], (char*) speak_text); - if (pi_set) - terminate_win32_process(g_pi); - res = create_win32_process(cmd); - if (!res) + if (USE_POWERSHELL) { - pi_set = false; + if (strlen(language) > 0) + snprintf(cmd, sizeof(cmd), + "powershell.exe -NoProfile -WindowStyle Hidden -Command \"Add-Type -AssemblyName System.Speech; $synth = New-Object System.Speech.Synthesis.SpeechSynthesizer; $synth.SelectVoice(\\\"%s\\\"); $synth.Rate = %s; $synth.Speak(\\\"%s\\\");\"", language, speeds[speed-1], (char*) speak_text); + else + snprintf(cmd, sizeof(cmd), + "powershell.exe -NoProfile -WindowStyle Hidden -Command \"Add-Type -AssemblyName System.Speech; $synth = New-Object System.Speech.Synthesis.SpeechSynthesizer; $synth.Rate = %s; $synth.Speak(\\\"%s\\\");\"", speeds[speed-1], (char*) speak_text); + if (pi_set) + terminate_win32_process(g_pi); + res = create_win32_process(cmd); + if (!res) + { + pi_set = false; + return true; + } + pi_set = true; + return true; + } +#ifdef HAVE_NVDA + else if (USE_NVDA) + { + long res=nvdaController_testIfRunning(); + const size_t cSize = strlen(speak_text)+1; + wchar_t* wc = malloc(sizeof(wchar_t)*cSize); + mbstowcs(wc, speak_text, cSize); + + if(res!=0) + { + RARCH_LOG("Error communicating with NVDA\n"); + return false; + } + else + { + nvdaController_cancelSpeech(); + } + + if (USE_NVDA_BRAILLE) + nvdaController_brailleMessage(wc); + else + { + nvdaController_speakText(wc); + } + return true; + } +#endif + else + { + /* stop the old voice if running */ + if (pVoice != NULL) + { + CoUninitialize(); + ISpVoice_Release(pVoice); + } + pVoice = NULL; + + /* Play the new voice */ + if (FAILED(CoInitialize(NULL))) + return NULL; + + hr = CoCreateInstance(&CLSID_SpVoice, NULL, CLSCTX_ALL, &IID_ISpVoice, (void **)&pVoice); + if (SUCCEEDED(hr)) + { + wchar_t wtext[1200]; + snprintf(cmd, sizeof(cmd), + "%s", speeds[speed], langid, speak_text); + mbstowcs(wtext, speak_text, sizeof(wtext)); + + hr = ISpVoice_Speak(pVoice, wtext, SPF_ASYNC /*SVSFlagsAsync*/, NULL); + } return true; } - pi_set = true; - return true; } #endif diff --git a/input/input_mapper.c b/input/input_mapper.c index b92ad0a705..ff41d32bbe 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -40,6 +40,7 @@ #endif #include "../configuration.h" +#include "../retroarch.h" void input_mapper_poll(input_mapper_t *handle, void *ol_pointer, @@ -124,6 +125,12 @@ void input_mapper_poll(input_mapper_t *handle, remap_valid = (current_button_value == 1) && (j != remap_button) && (remap_button != RARCH_UNMAPPED); + /* gamepad override */ + if (i==0 && get_gamepad_input_override() & (1<buttons[i], j); + } + if (remap_valid) { if (remap_button < RARCH_FIRST_CUSTOM_BIND) diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 827e5014be..d3e2a6696b 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -6806,7 +6806,7 @@ static enum menu_action materialui_parse_menu_entry_action( (materialui_list_get_size(mui, MENU_LIST_PLAIN) == 1)) { materialui_switch_tabs(mui, NULL, action); - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE_LABEL; } else { diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c index 3b5de77879..28014647bd 100644 --- a/menu/drivers/ozone/ozone.c +++ b/menu/drivers/ozone/ozone.c @@ -3287,7 +3287,7 @@ static enum menu_action ozone_parse_menu_entry_action( ozone_sidebar_goto(ozone, new_selection); - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; ozone->cursor_mode = false; break; } @@ -3314,7 +3314,7 @@ static enum menu_action ozone_parse_menu_entry_action( ozone_sidebar_goto(ozone, new_selection); - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; ozone->cursor_mode = false; break; } @@ -3330,7 +3330,7 @@ static enum menu_action ozone_parse_menu_entry_action( ozone->cursor_mode = false; if (ozone->cursor_in_sidebar) { - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; break; } else if (ozone->depth > 1) @@ -3338,7 +3338,7 @@ static enum menu_action ozone_parse_menu_entry_action( ozone_go_to_sidebar(ozone, tag); - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; break; case MENU_ACTION_RIGHT: ozone->cursor_mode = false; @@ -3351,14 +3351,14 @@ static enum menu_action ozone_parse_menu_entry_action( ozone_leave_sidebar(ozone, tag); - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_LABEL; break; case MENU_ACTION_OK: ozone->cursor_mode = false; if (ozone->cursor_in_sidebar) { ozone_leave_sidebar(ozone, tag); - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_LABEL; break; } break; @@ -3370,14 +3370,14 @@ static enum menu_action ozone_parse_menu_entry_action( if (ozone->categories_selection_ptr != 0) ozone_sidebar_goto(ozone, 0); - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; break; } if (menu_entries_get_stack_size(0) == 1) { ozone_go_to_sidebar(ozone, tag); - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; } break; @@ -3387,7 +3387,7 @@ static enum menu_action ozone_parse_menu_entry_action( /* Ignore if cursor is in sidebar */ if (ozone->cursor_in_sidebar) { - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; break; } @@ -3404,7 +3404,7 @@ static enum menu_action ozone_parse_menu_entry_action( /* > Ignore if cursor is in sidebar */ if (ozone->cursor_in_sidebar) { - new_action = MENU_ACTION_NOOP; + new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE; break; } diff --git a/menu/menu_defines.h b/menu/menu_defines.h index c229fa1401..166bd6ba59 100644 --- a/menu/menu_defines.h +++ b/menu/menu_defines.h @@ -340,7 +340,10 @@ enum menu_action MENU_ACTION_SCROLL_UP, MENU_ACTION_TOGGLE, MENU_ACTION_POINTER_MOVED, - MENU_ACTION_POINTER_PRESSED + MENU_ACTION_POINTER_PRESSED, + MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE, + MENU_ACTION_ACCESSIBILITY_SPEAK_LABEL, + MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE_LABEL }; enum playlist_inline_core_display_type diff --git a/menu/menu_driver.c b/menu/menu_driver.c index fefc705393..39e8e23527 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -459,11 +459,23 @@ int generic_menu_entry_action( { case MENU_ACTION_INFO: break; + case MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE: + menu_entries_get_title(title_name, sizeof(title_name)); + break; + case MENU_ACTION_ACCESSIBILITY_SPEAK_LABEL: + get_current_menu_label(current_label, sizeof(current_label)); + break; + case MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE_LABEL: + menu_entries_get_title(title_name, sizeof(title_name)); + get_current_menu_label(current_label, sizeof(current_label)); + break; case MENU_ACTION_OK: case MENU_ACTION_LEFT: case MENU_ACTION_RIGHT: case MENU_ACTION_CANCEL: menu_entries_get_title(title_name, sizeof(title_name)); + get_current_menu_label(current_label, sizeof(current_label)); + break; case MENU_ACTION_UP: case MENU_ACTION_DOWN: case MENU_ACTION_SCROLL_UP: @@ -471,9 +483,16 @@ int generic_menu_entry_action( get_current_menu_label(current_label, sizeof(current_label)); break; case MENU_ACTION_START: + if (!string_is_equal(current_value, "...")) + { + menu_entries_get_title(title_name, sizeof(title_name)); + get_current_menu_label(current_label, sizeof(current_label)); + } + break; case MENU_ACTION_SELECT: case MENU_ACTION_SEARCH: get_current_menu_label(current_label, sizeof(current_label)); + break; case MENU_ACTION_SCAN: default: break; diff --git a/nvdaController.h b/nvdaController.h new file mode 100644 index 0000000000..78cb0738d0 --- /dev/null +++ b/nvdaController.h @@ -0,0 +1,80 @@ +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0555 */ +/* at Fri Feb 19 11:21:40 2010 + */ +/* Compiler settings for interfaces\nvdaController\nvdaController.idl, interfaces\nvdaController\nvdaController.acf: + Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 7.00.0555 + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +/* @@MIDL_FILE_HEADING( ) */ + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 475 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + + +#ifndef __nvdaController_h__ +#define __nvdaController_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +#ifdef __cplusplus +extern "C"{ +#endif + + +#ifndef __NvdaController_INTERFACE_DEFINED__ +#define __NvdaController_INTERFACE_DEFINED__ + +/* interface NvdaController */ +/* [implicit_handle][version][uuid] */ + +/* [comm_status][fault_status] */ error_status_t __stdcall nvdaController_testIfRunning( void); + +/* [comm_status][fault_status] */ error_status_t __stdcall nvdaController_speakText( + /* [string][in] */ const wchar_t *text); + +/* [comm_status][fault_status] */ error_status_t __stdcall nvdaController_cancelSpeech( void); + +/* [comm_status][fault_status] */ error_status_t __stdcall nvdaController_brailleMessage( + /* [string][in] */ const wchar_t *message); + + +extern handle_t nvdaControllerBindingHandle; + + +extern RPC_IF_HANDLE nvdaController_NvdaController_v1_0_c_ifspec; +extern RPC_IF_HANDLE NvdaController_v1_0_c_ifspec; +extern RPC_IF_HANDLE nvdaController_NvdaController_v1_0_s_ifspec; +#endif /* __NvdaController_INTERFACE_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/nvdaControllerClient64.dll b/nvdaControllerClient64.dll new file mode 100644 index 0000000000000000000000000000000000000000..6b4fff788426d8b50709e3242a82b0fa064908d9 GIT binary patch literal 153600 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 qJnf!lwt8c2Q>}AT!KTVhb($N;D7v literal 0 HcmV?d00001 diff --git a/qb/config.params.sh b/qb/config.params.sh index 62ea876f55..2bf27734e5 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -1,5 +1,6 @@ HAVE_LIBRETRO= # Libretro library used HAVE_ASSETS_DIR= # Assets install directory +HAVE_NVDA=no # NVDA support HAVE_BLISSBOX=auto # Blissbox support HAVE_ANGLE=no # ANGLE support (OpenGL wrapper) HAVE_CONFIGFILE=yes # Config file support diff --git a/retroarch.c b/retroarch.c index f19e1cf537..6e2355cdfa 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1297,6 +1297,7 @@ static const void *hid_driver_find_handle(int idx); #ifdef HAVE_ACCESSIBILITY #ifdef HAVE_TRANSLATE static bool is_narrator_running(void); +int ai_gamepad_state[16]; #endif static bool accessibility_startup_message(void); #endif @@ -3895,7 +3896,7 @@ static bool command_get_status(const char* arg) core_info_get_current_core(&core_info); - if (runloop_paused) + if (runloop_paused) status = "PAUSED"; if (core_info) system_id = core_info->system_id; @@ -6013,6 +6014,122 @@ error: /* TRANSLATION */ #ifdef HAVE_TRANSLATE +static int g_ai_service_auto = 0; + +int get_ai_service_auto(void) +{ + return g_ai_service_auto; +} + +bool set_ai_service_auto(int num) +{ + g_ai_service_auto = num; + return true; +} + +bool task_auto_translate_callback() +{ + bool was_paused = runloop_paused; + command_event(CMD_EVENT_AI_SERVICE_CALL, &was_paused); + return true; +} + + +/* Doesn't currently work. Fix this. */ +bool is_ai_service_speech_running(void) +{ +#ifdef HAVE_AUDIOMIXER + enum audio_mixer_state res = audio_driver_mixer_get_stream_state(10); + if (res == AUDIO_STREAM_STATE_NONE || res == AUDIO_STREAM_STATE_STOPPED) + return false; + return true; +#else + return false; +#endif +} + +bool ai_service_speech_stop(void) +{ +#ifdef HAVE_AUDIOMIXER + audio_driver_mixer_stop_stream(10); + audio_driver_mixer_remove_stream(10); +#endif + return false; +} + + +static void task_auto_translate_handler(retro_task_t *task) +{ + http_transfer_data_t *data = NULL; + int* mode_ptr = task->user_data; + + if (task_get_cancelled(task)) + goto task_finished; + /* Narrator Mode */ + if (*mode_ptr == 2) + { +#ifdef HAVE_ACCESSIBILITY + if (is_narrator_running() == false) + { + goto task_finished; + } +#endif + } + /* Speech Mode */ + else if (*mode_ptr == 1) + { +#ifdef HAVE_AUDIOMIXER + if (is_ai_service_speech_running() == false) + { + goto task_finished; + } +#endif + } + return; +task_finished: + if (get_ai_service_auto() == 1) + set_ai_service_auto(2); + + task_set_finished(task, true); + if (*mode_ptr == 1 || *mode_ptr == 2) + task_auto_translate_callback(); + if (task->user_data) + free(task->user_data); +} + +bool call_auto_translate_task(bool* was_paused) +{ + settings_t *settings = configuration_settings; + int ai_service_mode = settings->uints.ai_service_mode; + + /*Image Mode*/ + if (ai_service_mode == 0) + { + if (get_ai_service_auto() == 1) + set_ai_service_auto(2); + + command_event(CMD_EVENT_AI_SERVICE_CALL, was_paused); + return true; + } + else /* Speech or Narrator Mode */ + { + retro_task_t *t = NULL; + int* mode = (int*) malloc(sizeof(int)); + *mode = ai_service_mode; + t = task_init(); + if (!t) + return false; + + t->handler = task_auto_translate_handler; + t->user_data = mode; + t->mute = true; + task_queue_push(t); + } + return true; +} + + + static void handle_translation_cb( retro_task_t *task, void *task_data, void *user_data, const char *error) { @@ -6039,14 +6156,31 @@ static void handle_translation_cb( char* found_string = NULL; char* error_string = NULL; char* text_string = NULL; + char* auto_string = NULL; + char* key_string = NULL; int curr_state = 0; + settings_t* settings = configuration_settings; + bool was_paused = runloop_paused; + + +#ifdef GFX_MENU_WIDGETS + if (gfx_widgets_ai_service_overlay_get_state() != 0 + && get_ai_service_auto() == 2) + { + /* When auto mode is on, we turn off the overlay + * once we have the result for the next call.*/ + gfx_widgets_ai_service_overlay_unload(); + } +#endif #ifdef DEBUG - RARCH_LOG("RESULT FROM AI SERVICE...\n"); + if (get_ai_service_auto() != 2) + RARCH_LOG("RESULT FROM AI SERVICE...\n"); #endif + if (!data || error) goto finish; - + data->data = (char*)realloc(data->data, data->len + 1); if (!data->data) goto finish; @@ -6096,6 +6230,18 @@ static void handle_translation_cb( strlcpy(error_string, body_copy+start+1, i-start); curr_state = 0; } + else if (curr_state == 5) + { + auto_string = (char*)malloc(i-start+1); + strlcpy(auto_string, body_copy+start+1, i-start); + curr_state = 0; + } + else if (curr_state == 6) + { + key_string = (char*)malloc(i-start+1); + strlcpy(key_string, body_copy+start+1, i-start); + curr_state = 0; + } else if (string_is_equal(found_string, "image")) { curr_state = 1; @@ -6116,6 +6262,16 @@ static void handle_translation_cb( curr_state = 4; free(found_string); } + else if (string_is_equal(found_string, "auto")) + { + curr_state = 5; + free(found_string); + } + else if (string_is_equal(found_string, "press")) + { + curr_state = 6; + free(found_string); + } else { curr_state = 0; @@ -6146,7 +6302,7 @@ static void handle_translation_cb( #endif } - if (!raw_image_file_data && !raw_sound_data && !text_string) + if (!raw_image_file_data && !raw_sound_data && !text_string && get_ai_service_auto() != 2 && !key_string) { error = "Invalid JSON body."; goto finish; @@ -6379,6 +6535,76 @@ static void handle_translation_cb( } #endif + if (key_string) + { + int length = strlen(key_string); + int i = 0; + int start = 0; + char t = ' '; + char key[8]; + + for (i=1;i 7) + { + start = i; + continue; + } + + strncpy(key, key_string+start, i-start); + key[i-start] = '\0'; + if (string_is_equal(key, "b")) + ai_gamepad_state[0] = 2; + if (string_is_equal(key, "y")) + ai_gamepad_state[1] = 2; + if (string_is_equal(key, "select")) + ai_gamepad_state[2] = 2; + if (string_is_equal(key, "start")) + ai_gamepad_state[3] = 2; + + if (string_is_equal(key, "up")) + ai_gamepad_state[4] = 2; + if (string_is_equal(key, "down")) + ai_gamepad_state[5] = 2; + if (string_is_equal(key, "left")) + ai_gamepad_state[6] = 2; + if (string_is_equal(key, "right")) + ai_gamepad_state[7] = 2; + + if (string_is_equal(key, "a")) + ai_gamepad_state[8] = 2; + if (string_is_equal(key, "x")) + ai_gamepad_state[9] = 2; + if (string_is_equal(key, "l")) + ai_gamepad_state[10] = 2; + if (string_is_equal(key, "r")) + ai_gamepad_state[11] = 2; + + if (string_is_equal(key, "l2")) + ai_gamepad_state[12] = 2; + if (string_is_equal(key, "r2")) + ai_gamepad_state[13] = 2; + if (string_is_equal(key, "l3")) + ai_gamepad_state[14] = 2; + if (string_is_equal(key, "r3")) + ai_gamepad_state[15] = 2; + + if (string_is_equal(key, "pause")) + command_event(CMD_EVENT_PAUSE, NULL); + if (string_is_equal(key, "unpause")) + command_event(CMD_EVENT_UNPAUSE, NULL); + + start = i+1; + } + } + } + #ifdef HAVE_ACCESSIBILITY if (text_string && is_accessibility_enabled()) accessibility_speak_priority(text_string, 10); @@ -6413,25 +6639,18 @@ finish: free(text_string); if (raw_output_data) free(raw_output_data); -} -static bool is_ai_service_speech_running(void) -{ -#ifdef HAVE_AUDIOMIXER - enum audio_mixer_state res = audio_driver_mixer_get_stream_state(10); - if (res != AUDIO_STREAM_STATE_NONE && res != AUDIO_STREAM_STATE_STOPPED) - return true; -#endif - return false; -} - -static bool ai_service_speech_stop(void) -{ -#ifdef HAVE_AUDIOMIXER - audio_driver_mixer_stop_stream(10); - audio_driver_mixer_remove_stream(10); -#endif - return false; + if (string_is_equal(auto_string, "auto")) + { + if (get_ai_service_auto() != 0 && settings->bools.ai_service_pause == false) + { + call_auto_translate_task(&was_paused); + } + } + if (auto_string) + free(auto_string); + if (key_string) + free(key_string); } static const char *ai_service_get_str(enum translation_lang id) @@ -6572,6 +6791,7 @@ static const char *ai_service_get_str(enum translation_lang id) return ""; } + /* This function does all the stuff needed to translate the game screen, using the URL given in the settings. Once the image from the frame @@ -6598,8 +6818,17 @@ static const char *ai_service_get_str(enum translation_lang id) The server must output the translated image in the form of a JSON body, with the "image" field also as a base64 encoded 24bit-BMP, or as an alpha channel png. - */ -static bool run_translation_service(void) + + "paused" boolean is passed in to indicate if the current call + was made during a paused frame. Due to how the menu widgets work, + if the ai service is called in "auto" mode, then this call will + be made while the menu widgets unpause the core for a frame to update + the on-screen widgets. To tell the ai service what the pause + mode is honestly, we store the runloop_paused variable from before + the handle_translation_cb wipes the widgets, and pass that in here. +*/ + +static bool run_translation_service(bool paused) { struct video_viewport vp; uint8_t header[54]; @@ -6625,6 +6854,9 @@ static bool run_translation_service(void) const char *rf1 = "{\"image\": \""; const char *rf2 = "\"}\0"; char *rf3 = NULL; + char *state_son = NULL; + int state_son_length = 0; + int curr_length = 0; bool TRANSLATE_USE_BMP = false; bool use_overlay = false; @@ -6633,7 +6865,7 @@ static bool run_translation_service(void) core_info_t *core_info = NULL; #ifdef HAVE_GFX_WIDGETS - if (gfx_widgets_ai_service_overlay_get_state() != 0) + if (gfx_widgets_ai_service_overlay_get_state() != 0 && get_ai_service_auto() == 1) { /* For the case when ai service pause is disabled. */ gfx_widgets_ai_service_overlay_unload(); @@ -6794,32 +7026,96 @@ static bool run_translation_service(void) { unsigned i; /* include game label if provided */ - rf3 = (char *)malloc(16+strlen(system_label)); - memcpy(rf3, "\", \"label\": \"", 13*sizeof(uint8_t)); - memcpy(rf3+13, system_label, strlen(system_label)); - memcpy(rf3+13+strlen(system_label), "\"}\0", 3*sizeof(uint8_t)); - for (i=13;ibools.ai_service_pause; - if (ai_service_pause) + if (!settings->bools.ai_service_enable) + { + break; + } + else if (ai_service_pause) { /* pause on call, unpause on second press. */ if (!runloop_paused) @@ -8180,8 +8481,22 @@ bool command_event(enum event_command cmd, void *data) /* Don't pause - useful for Text-To-Speech since * the audio can't currently play while paused. * Also useful for cases when users don't want the - * core's sound to stop while translating. */ - command_event(CMD_EVENT_AI_SERVICE_CALL, NULL); + * core's sound to stop while translating. + * + * Also, this mode is required for "auto" translation + * packages, since you don't want to pause for that. + */ + if (get_ai_service_auto() == 2) + { + /* Auto mode was turned on, but we pressed the + * toggle button, so turn it off now. */ + set_ai_service_auto(0); +#ifdef HAVE_MENU_WIDGETS + gfx_widgets_ai_service_overlay_unload(); +#endif + } + else + command_event(CMD_EVENT_AI_SERVICE_CALL, NULL); } #endif break; @@ -9482,8 +9797,15 @@ bool command_event(enum event_command cmd, void *data) #endif else { - RARCH_LOG("AI Service Called...\n"); - run_translation_service(); + bool paused = runloop_paused; + if (data!=NULL) + paused = *((bool*)data); + + if (get_ai_service_auto() == 0 && settings->bools.ai_service_pause == false) + set_ai_service_auto(1); + if (get_ai_service_auto() != 2) + RARCH_LOG("AI Service Called...\n"); + run_translation_service(paused); } #endif break; @@ -25896,7 +26218,6 @@ static int16_t input_state_with_logging(unsigned port, int16_t last_input = input_state_get_last(port, device, index, id); if (result != last_input) input_is_dirty = true; - /*arbitrary limit of up to 65536 elements in state array*/ if (id < 65536) input_state_set_last(port, device, index, id, result); @@ -25922,7 +26243,7 @@ static bool unserialize_hook(const void *buf, size_t size) } static void add_input_state_hook(void) -{ +{ if (!input_state_callback_original) { input_state_callback_original = retro_ctx.state_cb; @@ -29138,7 +29459,22 @@ static enum runloop_state runloop_check_state(retro_time_t current_time) } else #endif + { input_keys_pressed(¤t_bits, &joypad_info); +#ifdef HAVE_TRANSLATE + if (settings->bools.ai_service_enable) + { + reset_gamepad_input_override(); + + for (int i=0;i<16;i++) + { + if (ai_gamepad_state[i] == 2) + set_gamepad_input_override(i, true); + ai_gamepad_state[i] = 0; + } + } +#endif + } #ifdef HAVE_MENU last_input = current_bits; @@ -29625,7 +29961,31 @@ static enum runloop_state runloop_check_state(retro_time_t current_time) } } - if (!focused) +#ifdef HAVE_TRANSLATE + /* Copy over the retropad state to a buffer for the translate service + to send off if it's run. */ + ai_gamepad_state[0] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_B); + ai_gamepad_state[1] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_Y); + ai_gamepad_state[2] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_SELECT); + ai_gamepad_state[3] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_START); + + ai_gamepad_state[4] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_UP); + ai_gamepad_state[5] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_DOWN); + ai_gamepad_state[6] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_LEFT); + ai_gamepad_state[7] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_RIGHT); + + ai_gamepad_state[8] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_A); + ai_gamepad_state[9] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_X); + ai_gamepad_state[10] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_L); + ai_gamepad_state[11] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_R); + + ai_gamepad_state[12] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_L2); + ai_gamepad_state[13] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_R2); + ai_gamepad_state[14] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_L3); + ai_gamepad_state[15] = BIT256_GET(current_bits, RETRO_DEVICE_ID_JOYPAD_R3); +#endif + + if (!focused) { retro_ctx.poll_cb(); return RUNLOOP_STATE_POLLED_AND_SLEEP; @@ -29824,6 +30184,7 @@ static enum runloop_state runloop_check_state(retro_time_t current_time) RARCH_CHEAT_INDEX_MINUS, CMD_EVENT_CHEAT_INDEX_MINUS, RARCH_CHEAT_TOGGLE, CMD_EVENT_CHEAT_TOGGLE); + #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) if (settings->bools.video_shader_watch_files) { @@ -30297,8 +30658,8 @@ static int16_t core_input_state_poll_late(unsigned port, { if (!current_core.input_polled) input_driver_poll(); - current_core.input_polled = true; + return input_state(port, device, idx, id); } @@ -30730,4 +31091,27 @@ static bool accessibility_startup_message(void) 10); return true; } + + +static unsigned gamepad_input_override = 0; + +unsigned get_gamepad_input_override(void) +{ + return gamepad_input_override; +} + +void set_gamepad_input_override(unsigned i, bool val) +{ + if (val) + gamepad_input_override = gamepad_input_override | (1< Date: Thu, 16 Apr 2020 11:57:39 -0700 Subject: [PATCH 2/2] Moved SAPI code into a define. --- Makefile.common | 6 ++++++ frontend/drivers/platform_win32.c | 6 ++++++ qb/config.params.sh | 1 + 3 files changed, 13 insertions(+) diff --git a/Makefile.common b/Makefile.common index 9c6f7eebe4..bd3513dfda 100644 --- a/Makefile.common +++ b/Makefile.common @@ -23,6 +23,12 @@ ifeq ($(HAVE_NVDA), 1) LIBS += nvdaControllerClient64.dll endif +ifeq ($(HAVE_SAPI), 1) + LIBS += sapi.dll +endif + + + ifeq ($(HAVE_GL_CONTEXT),) HAVE_GL_CONTEXT = 0 HAVE_GL_MODERN = 0 diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index 2f1db1d605..5a9e019ef4 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -878,9 +878,11 @@ static bool create_win32_process(char* cmd) return true; } +#ifdef HAVE_SAPI #define COBJMACROS #include #include +#endif static ISpVoice* pVoice = NULL; #ifdef HAVE_NVDA @@ -928,6 +930,7 @@ static bool is_narrator_running_windows(void) */ } #endif +#ifdef HAVE_SAPI else { SPVOICESTATUS pStatus; @@ -940,6 +943,7 @@ static bool is_narrator_running_windows(void) return false; } } +#endif return false; } @@ -1012,6 +1016,7 @@ static bool accessibility_speak_windows(int speed, return true; } #endif +#ifdef HAVE_SAPI else { /* stop the old voice if running */ @@ -1038,6 +1043,7 @@ static bool accessibility_speak_windows(int speed, } return true; } +#endif } #endif diff --git a/qb/config.params.sh b/qb/config.params.sh index 2bf27734e5..f2ace2ee57 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -1,6 +1,7 @@ HAVE_LIBRETRO= # Libretro library used HAVE_ASSETS_DIR= # Assets install directory HAVE_NVDA=no # NVDA support +HAVE_SAPI=no # SAPI support HAVE_BLISSBOX=auto # Blissbox support HAVE_ANGLE=no # ANGLE support (OpenGL wrapper) HAVE_CONFIGFILE=yes # Config file support