2121#include " SIO/Sio.h"
2222#include " Counters.h"
2323#include " GS/GSState.h"
24+ #include " SPU2/spu2.h"
2425#include " GameList.h"
2526#include " ps2/BiosTools.h"
2627#include " pcsx2/Host.h"
@@ -71,6 +72,7 @@ @implementation ARMSX2BIOSInfo
7172static NSString * const ARMSX2CompatibilityProfileCustom = @" custom" ;
7273static constexpr int ARMSX2UseGlobalIntSentinel = -1 ;
7374static constexpr int ARMSX2TriFilterUseGlobalSentinel = std::numeric_limits<int >::min();
75+ static constexpr int ARMSX2DefaultAudioVolumePercent = 100 ;
7476
7577static int ARMSX2ClampInt (int value, int minValue, int maxValue)
7678{
@@ -1427,6 +1429,10 @@ static void ARMSX2ApplyLiveFloatSetting(const char* section, const char* key, fl
14271429 const bool globalEnableGameDBHardwareFixes = g_p44_settings_interface ? !g_p44_settings_interface->GetBoolValue (" EmuCore/GS" , " UserHacks" , false ) : true ;
14281430 const int globalEECoreType = g_p44_settings_interface ? g_p44_settings_interface->GetIntValue (" EmuCore/CPU" , " CoreType" , 2 ) : 2 ;
14291431 const bool globalMTVU = g_p44_settings_interface ? g_p44_settings_interface->GetBoolValue (" EmuCore/Speedhacks" , " vuThread" , true ) : true ;
1432+ const int globalVolumePercent = ARMSX2ClampInt (
1433+ g_p44_settings_interface ? g_p44_settings_interface->GetIntValue (" SPU2/Output" , " StandardVolume" , ARMSX2DefaultAudioVolumePercent) : ARMSX2DefaultAudioVolumePercent,
1434+ 0 ,
1435+ ARMSX2DefaultAudioVolumePercent);
14301436 return [@{
14311437 @" enabled" : @NO ,
14321438 @" path" : @" " ,
@@ -1464,6 +1470,9 @@ static void ARMSX2ApplyLiveFloatSetting(const char* section, const char* key, fl
14641470 @" enableGameDBHardwareFixes" : @(globalEnableGameDBHardwareFixes),
14651471 @" eeCoreType" : @(globalEECoreType),
14661472 @" mtvu" : @(globalMTVU),
1473+ @" globalVolumePercent" : @(globalVolumePercent),
1474+ @" volumePercent" : @(globalVolumePercent),
1475+ @" hasVolumeOverride" : @NO ,
14671476 } mutableCopy];
14681477}
14691478
@@ -1519,9 +1528,20 @@ static void ARMSX2ApplyPerGameSettingsOverrides(NSMutableDictionary<NSString*, i
15191528 si.ContainsValue (" EmuCore/GS" , " UserHacks" ) ||
15201529 si.ContainsValue (" EmuCore/CPU" , " CoreType" ) ||
15211530 si.ContainsValue (" EmuCore/CPU" , " UseArm64Dynarec" ) ||
1522- si.ContainsValue (" EmuCore/Speedhacks" , " vuThread" );
1531+ si.ContainsValue (" EmuCore/Speedhacks" , " vuThread" ) ||
1532+ si.ContainsValue (" SPU2/Output" , " StandardVolume" ) ||
1533+ si.ContainsValue (" SPU2/Output" , " FastForwardVolume" );
15231534
15241535 result[@" enabled" ] = @(hasKnownOverride);
1536+ const bool hasStandardVolumeOverride = si.ContainsValue (" SPU2/Output" , " StandardVolume" );
1537+ const bool hasFastForwardVolumeOverride = si.ContainsValue (" SPU2/Output" , " FastForwardVolume" );
1538+ const bool hasVolumeOverride = hasStandardVolumeOverride || hasFastForwardVolumeOverride;
1539+ const int inheritedVolumePercent = [result[@" volumePercent" ] intValue ];
1540+ const int volumePercent = hasStandardVolumeOverride ?
1541+ si.GetIntValue (" SPU2/Output" , " StandardVolume" , inheritedVolumePercent) :
1542+ (hasFastForwardVolumeOverride ? si.GetIntValue (" SPU2/Output" , " FastForwardVolume" , inheritedVolumePercent) : inheritedVolumePercent);
1543+ result[@" hasVolumeOverride" ] = @(hasVolumeOverride);
1544+ result[@" volumePercent" ] = @(ARMSX2ClampInt (volumePercent, 0 , ARMSX2DefaultAudioVolumePercent));
15251545 NSString * currentAspect = [result[@" aspectRatio" ] isKindOfClass: NSString .class ] ? result[@" aspectRatio" ] : @" Auto 4:3/3:2" ;
15261546 result[@" upscaleMultiplier" ] = @(si.GetFloatValue (" EmuCore/GS" , " upscale_multiplier" , [result[@" upscaleMultiplier" ] floatValue ]));
15271547 result[@" aspectRatio" ] = ARMSX2NSStringFromStdString (si.GetStringValue (" EmuCore/GS" , " AspectRatio" , currentAspect.UTF8String ));
@@ -1583,6 +1603,8 @@ static void ARMSX2WriteGameSettingsForIdentity(const std::string& serial,
15831603 int skipDrawStart,
15841604 BOOL skipDrawEndOverride,
15851605 int skipDrawEnd,
1606+ BOOL volumeOverride,
1607+ int volumePercent,
15861608 int eeCoreType,
15871609 BOOL mtvu,
15881610 BOOL enableCheats,
@@ -1658,6 +1680,15 @@ static void ARMSX2WriteGameSettingsForIdentity(const std::string& serial,
16581680 else
16591681 si.DeleteValue (" EmuCore/GS" , " UserHacks_SkipDraw_End" );
16601682
1683+ if (volumeOverride) {
1684+ const int clampedVolumePercent = ARMSX2ClampInt (volumePercent, 0 , ARMSX2DefaultAudioVolumePercent);
1685+ si.SetIntValue (" SPU2/Output" , " StandardVolume" , clampedVolumePercent);
1686+ si.SetIntValue (" SPU2/Output" , " FastForwardVolume" , clampedVolumePercent);
1687+ } else {
1688+ si.DeleteValue (" SPU2/Output" , " StandardVolume" );
1689+ si.DeleteValue (" SPU2/Output" , " FastForwardVolume" );
1690+ }
1691+
16611692 si.SetBoolValue (" EmuCore" , " EnableCheats" , enableCheats);
16621693 si.SetBoolValue (" EmuCore" , " EnablePatches" , enablePatches);
16631694 si.SetBoolValue (" EmuCore" , " EnableGameFixes" , enableGameFixes);
@@ -1702,6 +1733,8 @@ static void ARMSX2WriteGameSettingsForIdentity(const std::string& serial,
17021733 si.DeleteValue (" ARMSX2iOS/PerGame" , " ManualMTVU" );
17031734 si.DeleteValue (" ARMSX2iOS/PerGame" , " ManualMTVUVersion" );
17041735 si.DeleteValue (" EmuCore/Speedhacks" , " vuThread" );
1736+ si.DeleteValue (" SPU2/Output" , " StandardVolume" );
1737+ si.DeleteValue (" SPU2/Output" , " FastForwardVolume" );
17051738 si.RemoveEmptySections ();
17061739 }
17071740
@@ -2231,6 +2264,8 @@ + (void)setGameSettingsForISO:(nonnull NSString *)isoName
22312264 skipDrawStart : (int )skipDrawStart
22322265 skipDrawEndOverride : (BOOL )skipDrawEndOverride
22332266 skipDrawEnd : (int )skipDrawEnd
2267+ volumeOverride : (BOOL )volumeOverride
2268+ volumePercent : (int )volumePercent
22342269 eeCoreType : (int )eeCoreType
22352270 mtvu : (BOOL )mtvu
22362271 enableCheats : (BOOL )enableCheats
@@ -2250,7 +2285,8 @@ + (void)setGameSettingsForISO:(nonnull NSString *)isoName
22502285 alignSprite, mergeSpriteOverride, mergeSprite, wildArmsOffsetOverride,
22512286 wildArmsOffset, textureOffsetXOverride, textureOffsetX,
22522287 textureOffsetYOverride, textureOffsetY, skipDrawStartOverride,
2253- skipDrawStart, skipDrawEndOverride, skipDrawEnd, eeCoreType, mtvu,
2288+ skipDrawStart, skipDrawEndOverride, skipDrawEnd,
2289+ volumeOverride, volumePercent, eeCoreType, mtvu,
22542290 enableCheats, enablePatches, enableGameFixes, enableGameDBHardwareFixes);
22552291}
22562292
@@ -2278,6 +2314,8 @@ + (void)setGameSettingsForCurrentGameWithEnabled:(BOOL)enabled
22782314 skipDrawStart : (int )skipDrawStart
22792315 skipDrawEndOverride : (BOOL )skipDrawEndOverride
22802316 skipDrawEnd : (int )skipDrawEnd
2317+ volumeOverride : (BOOL )volumeOverride
2318+ volumePercent : (int )volumePercent
22812319 eeCoreType : (int )eeCoreType
22822320 mtvu : (BOOL )mtvu
22832321 enableCheats : (BOOL )enableCheats
@@ -2303,7 +2341,8 @@ + (void)setGameSettingsForCurrentGameWithEnabled:(BOOL)enabled
23032341 alignSprite, mergeSpriteOverride, mergeSprite, wildArmsOffsetOverride,
23042342 wildArmsOffset, textureOffsetXOverride, textureOffsetX,
23052343 textureOffsetYOverride, textureOffsetY, skipDrawStartOverride,
2306- skipDrawStart, skipDrawEndOverride, skipDrawEnd, eeCoreType, mtvu,
2344+ skipDrawStart, skipDrawEndOverride, skipDrawEnd,
2345+ volumeOverride, volumePercent, eeCoreType, mtvu,
23072346 enableCheats, enablePatches, enableGameFixes, enableGameDBHardwareFixes);
23082347
23092348 if (VMManager::HasValidVM()) {
@@ -2552,6 +2591,47 @@ + (void)applyOsdPreset:(int)preset {
25522591 EmuConfig.GS .OsdShowInputs = GSConfig.OsdShowInputs ;
25532592}
25542593
2594+ + (int )emulatorVolumePercent {
2595+ const int value = g_p44_settings_interface ?
2596+ g_p44_settings_interface->GetIntValue (" SPU2/Output" , " StandardVolume" , ARMSX2DefaultAudioVolumePercent) :
2597+ ARMSX2DefaultAudioVolumePercent;
2598+ return ARMSX2ClampInt (value, 0 , ARMSX2DefaultAudioVolumePercent);
2599+ }
2600+
2601+ + (void )setEmulatorVolumePercent:(int )value {
2602+ if (!g_p44_settings_interface)
2603+ return ;
2604+
2605+ const int clampedValue = ARMSX2ClampInt (value, 0 , ARMSX2DefaultAudioVolumePercent);
2606+ g_p44_settings_interface->SetIntValue (" SPU2/Output" , " StandardVolume" , clampedValue);
2607+ g_p44_settings_interface->SetIntValue (" SPU2/Output" , " FastForwardVolume" , clampedValue);
2608+ g_p44_settings_interface->Save ();
2609+
2610+ if (!VMManager::HasValidVM ())
2611+ return ;
2612+
2613+ Host::RunOnCPUThread ([clampedValue]() {
2614+ if (!VMManager::HasValidVM ())
2615+ return ;
2616+
2617+ const std::string serial = VMManager::GetDiscSerial ();
2618+ const u32 crc = VMManager::GetDiscCRC ();
2619+ if (crc != 0 ) {
2620+ INISettingsInterface si (VMManager::GetGameSettingsPath (serial, crc));
2621+ if (si.Load () &&
2622+ (si.ContainsValue (" SPU2/Output" , " StandardVolume" ) ||
2623+ si.ContainsValue (" SPU2/Output" , " FastForwardVolume" ))) {
2624+ return ;
2625+ }
2626+ }
2627+
2628+ const Pcsx2Config oldConfig (EmuConfig);
2629+ EmuConfig.SPU2 .StandardVolume = clampedValue;
2630+ EmuConfig.SPU2 .FastForwardVolume = clampedValue;
2631+ SPU2::CheckForConfigChanges (oldConfig);
2632+ }, false );
2633+ }
2634+
25552635// ============================================================
25562636// ISO / BIOS / Settings management
25572637// ============================================================
0 commit comments