From a67171e2b8687183c5dbd801f930af94465a0eff Mon Sep 17 00:00:00 2001 From: ITotalJustice <47043333+ITotalJustice@users.noreply.github.com> Date: Tue, 20 May 2025 23:33:51 +0100 Subject: [PATCH] disable sleep whilst downloading, uploading, using usb, inside ftp menu. --- sphaira/include/app.hpp | 20 ++++++++++++++++++++ sphaira/include/usb/base.hpp | 1 + sphaira/source/download.cpp | 4 ++++ sphaira/source/threaded_file_transfer.cpp | 4 ++++ sphaira/source/ui/menus/ftp_menu.cpp | 3 +++ sphaira/source/usb/base.cpp | 7 +++++++ sphaira/source/yati/yati.cpp | 6 +++--- 7 files changed, 42 insertions(+), 3 deletions(-) diff --git a/sphaira/include/app.hpp b/sphaira/include/app.hpp index 5f7b855..d4c92eb 100644 --- a/sphaira/include/app.hpp +++ b/sphaira/include/app.hpp @@ -165,6 +165,26 @@ public: return (paths.unk[0] != '\0') || (paths.nintendo[0] != '\0'); } + static void SetAutoSleepDisabled(bool enable) { + static Mutex mutex{}; + static int ref_count{}; + + mutexLock(&mutex); + ON_SCOPE_EXIT(mutexUnlock(&mutex)); + + if (enable) { + appletSetAutoSleepDisabled(true); + ref_count++; + } else { + if (ref_count) { + ref_count--; + } + + if (!ref_count) { + appletSetAutoSleepDisabled(false); + } + } + } // private: static constexpr inline auto CONFIG_PATH = "/config/sphaira/config.ini"; diff --git a/sphaira/include/usb/base.hpp b/sphaira/include/usb/base.hpp index addcf3e..3a4b800 100644 --- a/sphaira/include/usb/base.hpp +++ b/sphaira/include/usb/base.hpp @@ -15,6 +15,7 @@ struct Base { }; Base(u64 transfer_timeout); + virtual ~Base(); // sets up usb. virtual Result Init() = 0; diff --git a/sphaira/source/download.cpp b/sphaira/source/download.cpp index d2b3b45..577f435 100644 --- a/sphaira/source/download.cpp +++ b/sphaira/source/download.cpp @@ -3,6 +3,7 @@ #include "defines.hpp" #include "evman.hpp" #include "fs.hpp" +#include "app.hpp" #include #include @@ -669,6 +670,9 @@ void SetCommonCurlOptions(CURL* curl, const Api& e) { } auto DownloadInternal(CURL* curl, const Api& e) -> ApiResult { + App::SetAutoSleepDisabled(true); + ON_SCOPE_EXIT(App::SetAutoSleepDisabled(false)); + // check if stop has been requested before starting download if (e.GetToken().stop_requested()) { return {}; diff --git a/sphaira/source/threaded_file_transfer.cpp b/sphaira/source/threaded_file_transfer.cpp index 370f4d9..673d2d7 100644 --- a/sphaira/source/threaded_file_transfer.cpp +++ b/sphaira/source/threaded_file_transfer.cpp @@ -1,6 +1,7 @@ #include "threaded_file_transfer.hpp" #include "log.hpp" #include "defines.hpp" +#include "app.hpp" #include #include @@ -302,6 +303,9 @@ auto GetAlternateCore(int id) { } Result TransferInternal(ui::ProgressBox* pbox, s64 size, ReadFunctionCallback rfunc, WriteFunctionCallback wfunc, StartFunctionCallback sfunc) { + App::SetAutoSleepDisabled(true); + ON_SCOPE_EXIT(App::SetAutoSleepDisabled(false)); + const auto WRITE_THREAD_CORE = sfunc ? pbox->GetCpuId() : GetAlternateCore(pbox->GetCpuId()); const auto READ_THREAD_CORE = GetAlternateCore(WRITE_THREAD_CORE); diff --git a/sphaira/source/ui/menus/ftp_menu.cpp b/sphaira/source/ui/menus/ftp_menu.cpp index 6f425aa..571946a 100644 --- a/sphaira/source/ui/menus/ftp_menu.cpp +++ b/sphaira/source/ui/menus/ftp_menu.cpp @@ -151,6 +151,8 @@ Menu::Menu() : MenuBase{"FTP Install (EXPERIMENTAL)"_i18n} { App::DisplayInstallOptions(false); }}); + App::SetAutoSleepDisabled(true); + mutexInit(&m_mutex); m_was_ftp_enabled = App::GetFtpEnable(); if (!m_was_ftp_enabled) { @@ -182,6 +184,7 @@ Menu::~Menu() { App::SetFtpEnable(false); } + App::SetAutoSleepDisabled(false); log_write("closing data!!!!\n"); } diff --git a/sphaira/source/usb/base.cpp b/sphaira/source/usb/base.cpp index 1f37380..28b0b3d 100644 --- a/sphaira/source/usb/base.cpp +++ b/sphaira/source/usb/base.cpp @@ -19,18 +19,25 @@ #include "usb/base.hpp" #include "log.hpp" #include "defines.hpp" +#include "app.hpp" #include #include namespace sphaira::usb { Base::Base(u64 transfer_timeout) { + App::SetAutoSleepDisabled(true); + m_transfer_timeout = transfer_timeout; ueventCreate(GetCancelEvent(), true); // this avoids allocations during transfers. m_aligned.reserve(1024 * 1024 * 16); } +Base::~Base() { + App::SetAutoSleepDisabled(false); +} + Result Base::TransferPacketImpl(bool read, void *page, u32 size, u32 *out_size_transferred, u64 timeout) { u32 xfer_id; diff --git a/sphaira/source/yati/yati.cpp b/sphaira/source/yati/yati.cpp index 6c818f8..f98a896 100644 --- a/sphaira/source/yati/yati.cpp +++ b/sphaira/source/yati/yati.cpp @@ -754,7 +754,7 @@ struct BufHelper { }; Yati::Yati(ui::ProgressBox* _pbox, std::shared_ptr _source) : pbox{_pbox}, source{_source} { - appletSetMediaPlaybackState(true); + App::SetAutoSleepDisabled(true); } Yati::~Yati() { @@ -768,11 +768,11 @@ Yati::~Yati() { ncmContentStorageClose(std::addressof(ncm_cs[i])); } - appletSetMediaPlaybackState(false); - if (config.boost_mode) { appletSetCpuBoostMode(ApmCpuBoostMode_Normal); } + + App::SetAutoSleepDisabled(false); } Result Yati::Setup(const ConfigOverride& override) {