git.y1.nz

SameBoy

Accurate GB/GBC emulator
download: https://git.y1.nz/archives/sameboy.tar.gz
README | Files | Log | Refs | LICENSE

commit 033f025851622bd15c5ebff92df95963fc942ca2
parent 75d3470d55335b5eb56cd73a296c15c56baf8682
Author: Lior Halphon <LIJI32@gmail.com>
Date:   Fri, 21 May 2021 18:12:29 +0300

Added volume control to the Cocoa port

Diffstat:
MCocoa/AppDelegate.m2++
MCocoa/Document.m8++++++++
MCocoa/GBPreferencesWindow.h1+
MCocoa/GBPreferencesWindow.m19++++++++++++++++++-
MCocoa/Preferences.xib26++++++++++++++++++++++----
5 files changed, 51 insertions(+), 5 deletions(-)

diff --git 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 @@ -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 @@ -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 @@ -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 @@ -92,6 +92,7 @@ <outlet property="sgbPopupButton" destination="dza-T7-RkX" id="B0o-Nb-pIH"/> <outlet property="skipButton" destination="d2I-jU-sLb" id="udX-8K-0sK"/> <outlet property="temperatureSlider" destination="NuA-mL-AJZ" id="w11-n7-Bmj"/> + <outlet property="volumeSlider" destination="LNs-v1-Eki" id="DU4-An-OrC"/> </connections> <point key="canvasLocation" x="183" y="354"/> </window> @@ -486,9 +487,26 @@ <point key="canvasLocation" x="-501" y="667.5"/> </customView> <customView id="Zn1-Y5-RbR"> - <rect key="frame" x="0.0" y="0.0" width="292" height="135"/> + <rect key="frame" x="0.0" y="0.0" width="292" height="183"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <subviews> + <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Dzd-uB-B6l"> + <rect key="frame" x="18" y="146" width="252" height="17"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Volume:" id="IbP-7k-xsZ"> + <font key="font" metaFont="system"/> + <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <slider verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LNs-v1-Eki"> + <rect key="frame" x="40" y="121" width="230" height="19"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <sliderCell key="cell" continuous="YES" state="on" alignment="left" maxValue="256" doubleValue="256" tickMarkPosition="below" sliderType="linear" id="Xvk-Vj-NHx"/> + <connections> + <action selector="volumeChanged:" target="QvC-M9-y7g" id="4g3-NK-ay4"/> + </connections> + </slider> <popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="T69-6N-dhT"> <rect key="frame" x="30" y="65" width="234" height="26"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> @@ -532,11 +550,11 @@ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <sliderCell key="cell" continuous="YES" state="on" alignment="left" maxValue="256" tickMarkPosition="below" sliderType="linear" id="Rbx-DU-xYf"/> <connections> - <action selector="volumeTemperatureChanged:" target="QvC-M9-y7g" id="HFU-0q-hj1"/> + <action selector="interferenceVolumeChanged:" target="QvC-M9-y7g" id="HFU-0q-hj1"/> </connections> </slider> </subviews> - <point key="canvasLocation" x="-825" y="547.5"/> + <point key="canvasLocation" x="-825" y="446.5"/> </customView> <customView id="8TU-6J-NCg"> <rect key="frame" x="0.0" y="0.0" width="292" height="467"/> @@ -565,7 +583,7 @@ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <clipView key="contentView" focusRingType="none" ambiguous="YES" drawsBackground="NO" id="AMs-PO-nid"> <rect key="frame" x="1" y="1" width="227" height="209"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <autoresizingMask key="autoresizingMask"/> <subviews> <tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" id="UDd-IJ-fxX"> <rect key="frame" x="0.0" y="0.0" width="227" height="209"/>

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.