diff --git a/include/cpp3ds/System/Service.hpp b/include/cpp3ds/System/Service.hpp index 0df1b50..0770549 100644 --- a/include/cpp3ds/System/Service.hpp +++ b/include/cpp3ds/System/Service.hpp @@ -9,12 +9,13 @@ namespace cpp3ds { enum ServiceName { - NETWORK = 1 << 0, - AUDIO = 1 << 1, - CONFIG = 1 << 2, - ROMFS = 1 << 3, + NETWORK = 1 << 0, + AUDIO = 1 << 1, + CONFIG = 1 << 2, + ROMFS = 1 << 3, + WIFI_STATUS = 1 << 4, - ALL = 0xFFFF + ALL = 0xFFFF }; class Service { @@ -26,7 +27,7 @@ public: private: static Uint16 m_enabledServices; #ifndef EMULATION - static u32* socBuffer; + static u32* m_socBuffer; #endif }; diff --git a/src/cpp3ds/System/Service.cpp b/src/cpp3ds/System/Service.cpp index 0a563d0..27c193c 100644 --- a/src/cpp3ds/System/Service.cpp +++ b/src/cpp3ds/System/Service.cpp @@ -1,5 +1,6 @@ #include #include +#include #include <3ds.h> #include #include @@ -8,7 +9,7 @@ namespace cpp3ds { Uint16 Service::m_enabledServices = 0x0; -u32* Service::socBuffer = NULL; +u32* Service::m_socBuffer = nullptr; bool Service::enable(ServiceName service) { @@ -16,32 +17,39 @@ bool Service::enable(ServiceName service) { return true; bool success = false; + Result result; switch (service) { case ALL: return enable(NETWORK) && enable(AUDIO) && enable(CONFIG) && enable(ROMFS); case NETWORK: - socBuffer = (u32*) memalign(0x1000, 0x100000); - if (!socBuffer) + m_socBuffer = (u32*) memalign(0x1000, 0x100000); + if (m_socBuffer == nullptr) break; - if (SOC_Initialize(socBuffer, 0x100000) != 0) { - free(socBuffer); - socBuffer = NULL; + result = socInit(m_socBuffer, 0x100000); + if (result != 0) { + err() << "Network service (soc:U) failed to initialize: " << std::hex << result; + socExit(); + free(m_socBuffer); break; } success = true; break; case AUDIO: - success = csndInit() == 0; + result = ndspInit(); + success = R_SUCCEEDED(result); + if (!success) + err() << "Audio service (dsp) failed to initialize: " << std::hex << result; break; case CONFIG: - initCfgu(); - success = true; + success = R_SUCCEEDED(cfguInit()); break; case ROMFS: - romfsInit(); - success = strcmp(getcwd(NULL,0), "romfs:/") == 0; + success = R_SUCCEEDED(romfsInit()); + break; + case WIFI_STATUS: + success = R_SUCCEEDED(acInit()); break; default: break; @@ -54,31 +62,32 @@ bool Service::enable(ServiceName service) { bool Service::disable(ServiceName service) { - if (service & ~m_enabledServices) + if (service == ALL) + return disable(NETWORK) && disable(AUDIO) && + disable(CONFIG) && disable(ROMFS); + + if (!isEnabled(service)) return true; bool success = true; switch (service) { - case ALL: - return disable(NETWORK) && disable(AUDIO) && - disable(CONFIG) && disable(ROMFS); case NETWORK: - SOC_Shutdown(); - free(socBuffer); - socBuffer = NULL; + socExit(); + free(m_socBuffer); break; case AUDIO: - // TODO: Stop all audio - csndExecCmds(true); - csndExit(); + ndspExit(); break; case CONFIG: - exitCfgu(); + cfguExit(); break; case ROMFS: romfsExit(); break; + case WIFI_STATUS: + acExit(); + break; default: break; } @@ -90,6 +99,14 @@ bool Service::disable(ServiceName service) { bool Service::isEnabled(ServiceName service) { + if (service == NETWORK) { + if (!enable(WIFI_STATUS)) + return false; + u32 status; + Result result = ACU_GetWifiStatus(&status); + if (result != 0 || status == 0) + return false; + } return service & m_enabledServices; }