From bef642c04f06b4051997e480100d3e3566af7b74 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Sat, 18 Nov 2023 13:49:57 +0100 Subject: [PATCH] Add volume slider override --- arm9/data/config_template.ini | Bin 6749 -> 6999 bytes arm9/source/config.c | 7 ++ arm9/source/patches.c | 2 + arm9/source/types.h | 1 + k11_extension/include/globals.h | 1 + k11_extension/source/svc/GetSystemInfo.c | 3 + sysmodules/rosalina/data/config_template.ini | Bin 6749 -> 6999 bytes sysmodules/rosalina/include/menus/sysconfig.h | 3 + sysmodules/rosalina/source/luma_config.c | 4 + sysmodules/rosalina/source/main.c | 1 + sysmodules/rosalina/source/menus/sysconfig.c | 107 ++++++++++++++++++ 11 files changed, 129 insertions(+) diff --git a/arm9/data/config_template.ini b/arm9/data/config_template.ini index 7f36b3c37024fc744745ce460cb35a81a4cbd612..4b93e22fc31951d6a81bbc096ff962d29833d3e1 100644 GIT binary patch delta 268 zcmZ9HJqp4=5QV`q7qFeiQb|B;#KHrppa%#O=822@BiY?(mn#V##>&=nn8dZQ8|Hm{ zGw(HjF7AHZ?i$p!5>PmS8mFTHdEG7QS+=CZ$we(xftVWB5#1QBfTd|cY=w$E@40nK z-LVfud9F14;5>putno+XWWd%_n@*Y-Ab(8fPL$!BGSQ^}dTa}br@iy6m1WY71wz3M euU;-%^|r6O{MISmujz^=l68&^pYgbk-=h!tKwA0$ delta 12 Tcmca^cGqM>vH0d(iC0VjCujwI diff --git a/arm9/source/config.c b/arm9/source/config.c index b6b1c5e..3ad0f0f 100644 --- a/arm9/source/config.c +++ b/arm9/source/config.c @@ -567,6 +567,11 @@ static int configIniHandler(void* user, const char* section, const char* name, c } else { CHECK_PARSE_OPTION(-1); } + } else if (strcmp(name, "volume_slider_override") == 0) { + s64 opt; + CHECK_PARSE_OPTION(parseDecIntOption(&opt, value, -1, 100)); + cfg->volumeSliderOverride = (s8)opt; + return 1; } else { CHECK_PARSE_OPTION(-1); } @@ -671,6 +676,7 @@ static size_t saveLumaIniConfigToStr(char *out) cfg->autobootTwlTitleId, (int)cfg->autobootCtrAppmemtype, forceAudioOutputStr, + cfg->volumeSliderOverride, (int)CONFIG(PATCHUNITINFO), (int)CONFIG(DISABLEARM11EXCHANDLERS), (int)CONFIG(ENABLESAFEFIRMROSALINA) @@ -775,6 +781,7 @@ bool readConfig(void) configData.formatVersionMinor = CONFIG_VERSIONMINOR; configData.config |= 1u << PATCHVERSTRING; configData.splashDurationMsec = 3000; + configData.volumeSliderOverride = -1; configData.hbldr3dsxTitleId = HBLDR_DEFAULT_3DSX_TID; configData.rosalinaMenuCombo = 1u << 9 | 1u << 7 | 1u << 2; // L+Start+Select configData.topScreenFilter.cct = 6500; // default temp, no-op diff --git a/arm9/source/patches.c b/arm9/source/patches.c index 4d7010a..f1d7589 100644 --- a/arm9/source/patches.c +++ b/arm9/source/patches.c @@ -132,6 +132,7 @@ u32 installK11Extension(u8 *pos, u32 size, bool needToInitSd, u32 baseK11VA, u32 u16 configFormatVersionMajor, configFormatVersionMinor; u32 config, multiConfig, bootConfig; u32 splashDurationMsec; + s8 volumeSliderOverride; u64 hbldr3dsxTitleId; u32 rosalinaMenuCombo; u32 pluginLoaderFlags; @@ -215,6 +216,7 @@ u32 installK11Extension(u8 *pos, u32 size, bool needToInitSd, u32 baseK11VA, u32 info->multiConfig = configData.multiConfig; info->bootConfig = configData.bootConfig; info->splashDurationMsec = configData.splashDurationMsec; + info->volumeSliderOverride = configData.volumeSliderOverride; info->hbldr3dsxTitleId = configData.hbldr3dsxTitleId; info->rosalinaMenuCombo = configData.rosalinaMenuCombo; info->pluginLoaderFlags = configData.pluginLoaderFlags; diff --git a/arm9/source/types.h b/arm9/source/types.h index f6f96f5..cdbc7f1 100644 --- a/arm9/source/types.h +++ b/arm9/source/types.h @@ -74,6 +74,7 @@ typedef struct CfgData { u32 config, multiConfig, bootConfig; u32 splashDurationMsec; + s8 volumeSliderOverride; u64 hbldr3dsxTitleId; u32 rosalinaMenuCombo; diff --git a/k11_extension/include/globals.h b/k11_extension/include/globals.h index 839a283..bbba81d 100644 --- a/k11_extension/include/globals.h +++ b/k11_extension/include/globals.h @@ -150,6 +150,7 @@ typedef struct CfwInfo u16 configFormatVersionMajor, configFormatVersionMinor; u32 config, multiConfig, bootConfig; u32 splashDurationMsec; + s8 volumeSliderOverride; u64 hbldr3dsxTitleId; u32 rosalinaMenuCombo; u32 pluginLoaderFlags; diff --git a/k11_extension/source/svc/GetSystemInfo.c b/k11_extension/source/svc/GetSystemInfo.c index ffd6337..127f7b7 100644 --- a/k11_extension/source/svc/GetSystemInfo.c +++ b/k11_extension/source/svc/GetSystemInfo.c @@ -69,6 +69,9 @@ Result GetSystemInfoHook(s64 *out, s32 type, s32 param) case 6: *out = cfwInfo.splashDurationMsec; break; + case 7: + *out = (s64)cfwInfo.volumeSliderOverride; + break; case 0x10: *out = (s64)cfwInfo.autobootTwlTitleId; break; diff --git a/sysmodules/rosalina/data/config_template.ini b/sysmodules/rosalina/data/config_template.ini index 7f36b3c37024fc744745ce460cb35a81a4cbd612..4b93e22fc31951d6a81bbc096ff962d29833d3e1 100644 GIT binary patch delta 268 zcmZ9HJqp4=5QV`q7qFeiQb|B;#KHrppa%#O=822@BiY?(mn#V##>&=nn8dZQ8|Hm{ zGw(HjF7AHZ?i$p!5>PmS8mFTHdEG7QS+=CZ$we(xftVWB5#1QBfTd|cY=w$E@40nK z-LVfud9F14;5>putno+XWWd%_n@*Y-Ab(8fPL$!BGSQ^}dTa}br@iy6m1WY71wz3M euU;-%^|r6O{MISmujz^=l68&^pYgbk-=h!tKwA0$ delta 12 Tcmca^cGqM>vH0d(iC0VjCujwI diff --git a/sysmodules/rosalina/include/menus/sysconfig.h b/sysmodules/rosalina/include/menus/sysconfig.h index 9e635ca..63c0859 100644 --- a/sysmodules/rosalina/include/menus/sysconfig.h +++ b/sysmodules/rosalina/include/menus/sysconfig.h @@ -31,6 +31,7 @@ extern Menu sysconfigMenu; extern bool isConnectionForced; +extern s8 currVolumeSliderOverride; void SysConfigMenu_UpdateStatus(bool control); @@ -40,3 +41,5 @@ void SysConfigMenu_TogglePowerButton(void); void SysConfigMenu_ControlWifi(void); void SysConfigMenu_DisableForcedWifiConnection(void); void SysConfigMenu_ToggleCardIfPower(void); +void SysConfigMenu_LoadConfig(void); +void SysConfigMenu_AdjustVolume(void); diff --git a/sysmodules/rosalina/source/luma_config.c b/sysmodules/rosalina/source/luma_config.c index ae3a8ca..fb4197f 100644 --- a/sysmodules/rosalina/source/luma_config.c +++ b/sysmodules/rosalina/source/luma_config.c @@ -32,6 +32,7 @@ #include "config_template_ini.h" #include "ifile.h" #include "menus/miscellaneous.h" +#include "menus/sysconfig.h" #include "plugin/plgloader.h" typedef struct CfgData { @@ -39,6 +40,7 @@ typedef struct CfgData { u32 config, multiConfig, bootConfig; u32 splashDurationMsec; + s8 volumeSliderOverride; u64 hbldr3dsxTitleId; u32 rosalinaMenuCombo; @@ -187,6 +189,7 @@ static size_t LumaConfig_SaveLumaIniConfigToStr(char *out, const CfgData *cfg) cfg->autobootTwlTitleId, (int)cfg->autobootCtrAppmemtype, forceAudioOutputStr, + cfg->volumeSliderOverride, (int)CONFIG(PATCHUNITINFO), (int)CONFIG(DISABLEARM11EXCHANDLERS), (int)CONFIG(ENABLESAFEFIRMROSALINA) @@ -245,6 +248,7 @@ Result LumaConfig_SaveSettings(void) configData.multiConfig = multiConfig; configData.bootConfig = bootConfig; configData.splashDurationMsec = splashDurationMsec; + configData.volumeSliderOverride = currVolumeSliderOverride; configData.hbldr3dsxTitleId = Luma_SharedConfig->selected_hbldr_3dsx_tid; configData.rosalinaMenuCombo = menuCombo; configData.pluginLoaderFlags = PluginLoader__IsEnabled(); diff --git a/sysmodules/rosalina/source/main.c b/sysmodules/rosalina/source/main.c index adfee97..f85d699 100644 --- a/sysmodules/rosalina/source/main.c +++ b/sysmodules/rosalina/source/main.c @@ -262,6 +262,7 @@ int main(void) Draw_Init(); Cheat_SeedRng(svcGetSystemTick()); ScreenFiltersMenu_LoadConfig(); + SysConfigMenu_LoadConfig(); MyThread *menuThread = menuCreateThread(); MyThread *taskRunnerThread = taskRunnerCreateThread(); diff --git a/sysmodules/rosalina/source/menus/sysconfig.c b/sysmodules/rosalina/source/menus/sysconfig.c index 06e6039..20c3091 100644 --- a/sysmodules/rosalina/source/menus/sysconfig.c +++ b/sysmodules/rosalina/source/menus/sysconfig.c @@ -25,6 +25,7 @@ */ #include <3ds.h> +#include "luma_config.h" #include "menus/sysconfig.h" #include "memory.h" #include "draw.h" @@ -35,6 +36,7 @@ Menu sysconfigMenu = { "System configuration menu", { + { "Control volume", METHOD, .method=&SysConfigMenu_AdjustVolume}, { "Control Wireless connection", METHOD, .method = &SysConfigMenu_ControlWifi }, { "Toggle LEDs", METHOD, .method = &SysConfigMenu_ToggleLEDs }, { "Toggle Wireless", METHOD, .method = &SysConfigMenu_ToggleWireless }, @@ -45,6 +47,7 @@ Menu sysconfigMenu = { }; bool isConnectionForced = false; +s8 currVolumeSliderOverride = -1; void SysConfigMenu_ToggleLEDs(void) { @@ -380,3 +383,107 @@ void SysConfigMenu_ToggleCardIfPower(void) } while(!menuShouldExit); } + +static Result SysConfigMenu_ApplyVolumeOverride(void) +{ + // Thanks profi200! + u8 tmp; + Result res = cdcChkInit(); + + if (R_SUCCEEDED(res)) res = CDCCHK_ReadRegisters2(0, 116, &tmp, 1); // CDC_REG_VOL_MICDET_PIN_SAR_ADC + if (currVolumeSliderOverride >= 0) + tmp &= ~0x80; + else + tmp |= 0x80; + if (R_SUCCEEDED(res)) res = CDCCHK_WriteRegisters2(0, 116, &tmp, 1); + + if (currVolumeSliderOverride >= 0) { + s8 calculated = -128 + (((float)currVolumeSliderOverride/100.f) * 108); + if (calculated > -20) + return -1; // Just in case + s8 volumes[2] = {calculated, calculated}; // Volume in 0.5 dB steps. -128 (muted) to 48. Do not go above -20 (100%). + if (R_SUCCEEDED(res)) res = CDCCHK_WriteRegisters2(0, 65, volumes, 2); // CDC_REG_DAC_L_VOLUME_CTRL, CDC_REG_DAC_R_VOLUME_CTRL + } + + cdcChkExit(); + return res; +} + +void SysConfigMenu_LoadConfig(void) +{ + s64 out = -1; + svcGetSystemInfo(&out, 0x10000, 7); + currVolumeSliderOverride = (s8)out; + if (currVolumeSliderOverride >= 0) + SysConfigMenu_ApplyVolumeOverride(); +} + +void SysConfigMenu_AdjustVolume(void) +{ + Draw_Lock(); + Draw_ClearFramebuffer(); + Draw_FlushFramebuffer(); + Draw_Unlock(); + + s8 tempVolumeOverride = currVolumeSliderOverride; + static s8 backupVolumeOverride = -1; + if (backupVolumeOverride == -1) + backupVolumeOverride = tempVolumeOverride >= 0 ? tempVolumeOverride : 85; + + do + { + Draw_Lock(); + Draw_DrawString(10, 10, COLOR_TITLE, "System configuration menu"); + u32 posY = Draw_DrawString(10, 30, COLOR_WHITE, "Y: Toggle volume slider override.\nDPAD: Adjust the volume level.\nA: Apply\nB: Go back\n\n"); + Draw_DrawString(10, posY, COLOR_WHITE, "Current status:"); + posY = Draw_DrawString(100, posY, (tempVolumeOverride == -1) ? COLOR_RED : COLOR_GREEN, (tempVolumeOverride == -1) ? " DISABLED" : " ENABLED "); + if (tempVolumeOverride != -1) { + posY = Draw_DrawFormattedString(30, posY, COLOR_WHITE, "\nValue: [%d%%]", tempVolumeOverride); + } else { + posY = Draw_DrawString(30, posY, COLOR_WHITE, "\n "); + } + + u32 pressed = waitInputWithTimeout(1000); + + if(pressed & KEY_A) + { + currVolumeSliderOverride = tempVolumeOverride; + Result res = SysConfigMenu_ApplyVolumeOverride(); + LumaConfig_SaveSettings(); + if (R_SUCCEEDED(res)) + Draw_DrawString(10, posY, COLOR_GREEN, "\nSuccess!"); + else + Draw_DrawFormattedString(10, posY, COLOR_RED, "\nFailed: 0x%08lX", res); + } + else if(pressed & KEY_B) + return; + else if(pressed & KEY_Y) + { + Draw_DrawString(10, posY, COLOR_WHITE, "\n "); + if (tempVolumeOverride == -1) { + tempVolumeOverride = backupVolumeOverride; + } else { + backupVolumeOverride = tempVolumeOverride; + tempVolumeOverride = -1; + } + } + else if ((pressed & (KEY_DUP | KEY_DDOWN | KEY_DLEFT | KEY_DRIGHT)) && tempVolumeOverride != -1) + { + Draw_DrawString(10, posY, COLOR_WHITE, "\n "); + if (pressed & KEY_DUP) + tempVolumeOverride++; + else if (pressed & KEY_DDOWN) + tempVolumeOverride--; + else if (pressed & KEY_DRIGHT) + tempVolumeOverride+=10; + else if (pressed & KEY_DLEFT) + tempVolumeOverride-=10; + + if (tempVolumeOverride < 0) + tempVolumeOverride = 0; + if (tempVolumeOverride > 100) + tempVolumeOverride = 100; + } + + } while(!menuShouldExit); +} \ No newline at end of file