diff --git a/Cocoa/AppDelegate.m b/Cocoa/AppDelegate.m
index 01b1527..627a7b6 100644
--- a/Cocoa/AppDelegate.m
+++ b/Cocoa/AppDelegate.m
@@ -68,6 +68,8 @@ static uint32_t color_to_int(NSColor *color)
@"GBCGBModel": @(GB_MODEL_CGB_E),
@"GBSGBModel": @(GB_MODEL_SGB2),
@"GBRumbleMode": @(GB_RUMBLE_CARTRIDGE_ONLY),
+
+ @"GBVolume": @(1.0),
}];
[JOYController startOnRunLoop:[NSRunLoop currentRunLoop] withOptions:@{
diff --git a/Cocoa/Document.m b/Cocoa/Document.m
index 297547c..010cff7 100644
--- a/Cocoa/Document.m
+++ b/Cocoa/Document.m
@@ -369,6 +369,11 @@ static void infraredStateChanged(GB_gameboy_t *gb, bool on)
}
audioBuffer = realloc(audioBuffer, sizeof(*sample) * audioBufferSize);
}
+ double volume = [[NSUserDefaults standardUserDefaults] doubleForKey:@"GBVolume"];
+ if (volume != 1) {
+ sample->left *= volume;
+ sample->right *= volume;
+ }
audioBuffer[audioBufferPosition++] = *sample;
}
if (audioBufferPosition == audioBufferNeeded) {
@@ -994,6 +999,9 @@ static unsigned *multiplication_table_for_frequency(unsigned frequency)
}
else {
[self.audioClient start];
+ if ([[NSUserDefaults standardUserDefaults] doubleForKey:@"GBVolume"] == 0) {
+ [GBWarningPopover popoverWithContents:@"Warning: Volume is set to to zero in the preferences panel" onWindow:self.mainWindow];
+ }
}
[[NSUserDefaults standardUserDefaults] setBool:!self.audioClient.isPlaying forKey:@"Mute"];
}
diff --git a/Cocoa/GBPreferencesWindow.h b/Cocoa/GBPreferencesWindow.h
index 0c7b422..16e36e2 100644
--- a/Cocoa/GBPreferencesWindow.h
+++ b/Cocoa/GBPreferencesWindow.h
@@ -26,5 +26,6 @@
@property (nonatomic, weak) IBOutlet NSPopUpButton *preferredJoypadButton;
@property (nonatomic, weak) IBOutlet NSPopUpButton *playerListButton;
@property (nonatomic, weak) IBOutlet NSButton *autoUpdatesCheckbox;
+@property (weak) IBOutlet NSSlider *volumeSlider;
@end
diff --git a/Cocoa/GBPreferencesWindow.m b/Cocoa/GBPreferencesWindow.m
index 217c7e1..4398ba3 100644
--- a/Cocoa/GBPreferencesWindow.m
+++ b/Cocoa/GBPreferencesWindow.m
@@ -29,6 +29,7 @@
NSPopUpButton *_rumbleModePopupButton;
NSSlider *_temperatureSlider;
NSSlider *_interferenceSlider;
+ NSSlider *_volumeSlider;
NSButton *_autoUpdatesCheckbox;
}
@@ -124,6 +125,17 @@
return _interferenceSlider;
}
+- (void)setVolumeSlider:(NSSlider *)volumeSlider
+{
+ _volumeSlider = volumeSlider;
+ [volumeSlider setDoubleValue:[[NSUserDefaults standardUserDefaults] doubleForKey:@"GBVolume"] * 256];
+}
+
+- (NSSlider *)volumeSlider
+{
+ return _volumeSlider;
+}
+
- (void)setFrameBlendingModePopupButton:(NSPopUpButton *)frameBlendingModePopupButton
{
_frameBlendingModePopupButton = frameBlendingModePopupButton;
@@ -331,12 +343,17 @@
[[NSNotificationCenter defaultCenter] postNotificationName:@"GBLightTemperatureChanged" object:nil];
}
-- (IBAction)volumeTemperatureChanged:(id)sender
+- (IBAction)interferenceVolumeChanged:(id)sender
{
[[NSUserDefaults standardUserDefaults] setObject:@([sender doubleValue] / 256.0)
forKey:@"GBInterferenceVolume"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"GBInterferenceVolumeChanged" object:nil];
+}
+- (IBAction)volumeChanged:(id)sender
+{
+ [[NSUserDefaults standardUserDefaults] setObject:@([sender doubleValue] / 256.0)
+ forKey:@"GBVolume"];
}
- (IBAction)franeBlendingModeChanged:(id)sender
diff --git a/Cocoa/Preferences.xib b/Cocoa/Preferences.xib
index b1d67f7..ad510c8 100644
--- a/Cocoa/Preferences.xib
+++ b/Cocoa/Preferences.xib
@@ -92,6 +92,7 @@
+
@@ -486,9 +487,26 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -532,11 +550,11 @@
-
+
-
+
@@ -565,7 +583,7 @@
-
+