From a90b0daebef51dfa7ac2a4c5df49133ac4f98613 Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Sat, 20 Aug 2022 20:35:45 -0400 Subject: [PATCH 1/4] Look at version_major.h when for newer ffmpeg libs In ffmpeg 5.1, it seems most (or all) of these libraries use a separate version_major.h, so the logic to check minimum version didn't work without looking at the major version file. --- externals/cmake-modules/FindFFmpeg.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/externals/cmake-modules/FindFFmpeg.cmake b/externals/cmake-modules/FindFFmpeg.cmake index 6cb5960bb..cac21c614 100644 --- a/externals/cmake-modules/FindFFmpeg.cmake +++ b/externals/cmake-modules/FindFFmpeg.cmake @@ -116,6 +116,10 @@ function(find_ffmpeg LIBNAME) endforeach() string(TOUPPER ${LIBNAME} LIBNAME_UPPER) file(STRINGS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version.h" _FFmpeg_VERSION_H_CONTENTS REGEX "#define LIB${LIBNAME_UPPER}_VERSION_(MAJOR|MINOR|MICRO) ") + if (EXISTS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version_major.h") + file(STRINGS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version_major.h" _FFmpeg_MAJOR_VERSION_H_CONTENTS REGEX "#define LIB${LIBNAME_UPPER}_VERSION_MAJOR ") + string(APPEND _FFmpeg_VERSION_H_CONTENTS "\n" ${_FFmpeg_MAJOR_VERSION_H_CONTENTS}) + endif() set(_FFmpeg_VERSION_REGEX "([0-9]+)") foreach(v MAJOR MINOR MICRO) if("${_FFmpeg_VERSION_H_CONTENTS}" MATCHES "#define LIB${LIBNAME_UPPER}_VERSION_${v}[\\t ]+${_FFmpeg_VERSION_REGEX}") From c634c263db5b1f7e5cffb7d1beb3ba07960b621b Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Sat, 20 Aug 2022 20:49:59 -0400 Subject: [PATCH 2/4] citra-sdl: use the result of system.RunLoop() If a shutdown was requested by the application, close the SDL window, initiating the normal shutdown procedure. This causes a graceful exit process instead of hanging. --- src/citra/citra.cpp | 14 +++++++++++++- src/citra/emu_window/emu_window_sdl2.cpp | 6 +++++- src/citra/emu_window/emu_window_sdl2.h | 3 +++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp index a9b0b3eca..9e46fa9d9 100644 --- a/src/citra/citra.cpp +++ b/src/citra/citra.cpp @@ -391,6 +391,8 @@ int main(int argc, char** argv) { return -1; case Core::System::ResultStatus::Success: break; // Expected case + default: + LOG_ERROR(Frontend, "Error while loading ROM: {}", system.GetStatusDetails()); } system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL"); @@ -437,7 +439,17 @@ int main(int argc, char** argv) { }); while (emu_window->IsOpen()) { - system.RunLoop(); + const auto result = system.RunLoop(); + + switch (result) { + case Core::System::ResultStatus::ShutdownRequested: + emu_window->Close(); + break; + case Core::System::ResultStatus::Success: + break; + default: + LOG_ERROR(Frontend, "Error in main run loop: {}", result, system.GetStatusDetails()); + } } render_thread.join(); diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp index e5a0594c4..30206486b 100644 --- a/src/citra/emu_window/emu_window_sdl2.cpp +++ b/src/citra/emu_window/emu_window_sdl2.cpp @@ -104,6 +104,10 @@ bool EmuWindow_SDL2::IsOpen() const { return is_open; } +void EmuWindow_SDL2::Close() { + is_open = false; +} + void EmuWindow_SDL2::OnResize() { int width, height; SDL_GetWindowSize(render_window, &width, &height); @@ -134,7 +138,7 @@ void EmuWindow_SDL2::Fullscreen() { EmuWindow_SDL2::EmuWindow_SDL2(bool fullscreen) { // Initialize the window if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER) < 0) { - LOG_CRITICAL(Frontend, "Failed to initialize SDL2! Exiting..."); + LOG_CRITICAL(Frontend, "Failed to initialize SDL2: {}! Exiting...", SDL_GetError()); exit(1); } diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h index 64dec5381..831837ea6 100644 --- a/src/citra/emu_window/emu_window_sdl2.h +++ b/src/citra/emu_window/emu_window_sdl2.h @@ -46,6 +46,9 @@ public: /// Whether the window is still open, and a close request hasn't yet been sent bool IsOpen() const; + /// Close the window. + void Close(); + /// Creates a new context that is shared with the current context std::unique_ptr CreateSharedContext() const override; From 401336c5e789f117411e94e9870a5b687e8bc0eb Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Mon, 22 Aug 2022 18:10:47 -0400 Subject: [PATCH 3/4] Rename Close() -> RequestClose() --- src/citra/citra.cpp | 2 +- src/citra/emu_window/emu_window_sdl2.cpp | 6 +++--- src/citra/emu_window/emu_window_sdl2.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp index 9e46fa9d9..6f8c16e2f 100644 --- a/src/citra/citra.cpp +++ b/src/citra/citra.cpp @@ -443,7 +443,7 @@ int main(int argc, char** argv) { switch (result) { case Core::System::ResultStatus::ShutdownRequested: - emu_window->Close(); + emu_window->RequestClose(); break; case Core::System::ResultStatus::Success: break; diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp index 30206486b..08b36bf61 100644 --- a/src/citra/emu_window/emu_window_sdl2.cpp +++ b/src/citra/emu_window/emu_window_sdl2.cpp @@ -104,7 +104,7 @@ bool EmuWindow_SDL2::IsOpen() const { return is_open; } -void EmuWindow_SDL2::Close() { +void EmuWindow_SDL2::RequestClose() { is_open = false; } @@ -260,7 +260,7 @@ void EmuWindow_SDL2::PollEvents() { OnResize(); break; case SDL_WINDOWEVENT_CLOSE: - is_open = false; + RequestClose(); break; } break; @@ -291,7 +291,7 @@ void EmuWindow_SDL2::PollEvents() { OnFingerUp(); break; case SDL_QUIT: - is_open = false; + RequestClose(); break; default: break; diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h index 831837ea6..27a0f0787 100644 --- a/src/citra/emu_window/emu_window_sdl2.h +++ b/src/citra/emu_window/emu_window_sdl2.h @@ -47,7 +47,7 @@ public: bool IsOpen() const; /// Close the window. - void Close(); + void RequestClose(); /// Creates a new context that is shared with the current context std::unique_ptr CreateSharedContext() const override; From 24b54a9b010e1183a413c9e24ee683bec8e9249e Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Tue, 23 Aug 2022 08:22:17 -0400 Subject: [PATCH 4/4] Follow convention and break in default case --- src/citra/citra.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp index 6f8c16e2f..cf3d51869 100644 --- a/src/citra/citra.cpp +++ b/src/citra/citra.cpp @@ -393,6 +393,7 @@ int main(int argc, char** argv) { break; // Expected case default: LOG_ERROR(Frontend, "Error while loading ROM: {}", system.GetStatusDetails()); + break; } system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL"); @@ -449,6 +450,7 @@ int main(int argc, char** argv) { break; default: LOG_ERROR(Frontend, "Error in main run loop: {}", result, system.GetStatusDetails()); + break; } } render_thread.join();