From b63ddc6e3dec979c4f0c77d45ba60865b18e2e3c Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Fri, 12 Apr 2024 13:46:29 +0300 Subject: [PATCH] Add audio activation settings to iOS --- iOS/GBSettingsViewController.m | 9 +++++ iOS/GBViewController.m | 69 +++++++++++++++++++--------------- iOS/main.m | 1 + 3 files changed, 49 insertions(+), 30 deletions(-) diff --git a/iOS/GBSettingsViewController.m b/iOS/GBSettingsViewController.m index c796cfa..dd120c1 100644 --- a/iOS/GBSettingsViewController.m +++ b/iOS/GBSettingsViewController.m @@ -283,6 +283,15 @@ static NSString const *typeLightTemp = @"typeLightTemp"; ]; NSArray *audioMenu = @[ + @{ + @"header": @"Enable Audio", + @"items": @[ + @{@"type": typeRadio, @"pref": @"GBAudioMode", @"title": @"Never", @"value": @"off",}, + @{@"type": typeRadio, @"pref": @"GBAudioMode", @"title": @"Controlled by Silent Mode", @"value": @"switch",}, + @{@"type": typeRadio, @"pref": @"GBAudioMode", @"title": @"Always", @"value": @"on",}, + ], + + }, @{ @"header": @"High-pass Filter", @"items": @[ diff --git a/iOS/GBViewController.m b/iOS/GBViewController.m index bb12c64..ac01e32 100644 --- a/iOS/GBViewController.m +++ b/iOS/GBViewController.m @@ -143,6 +143,13 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp) [self addDefaultObserver:^(id newValue) { GB_set_rewind_length(gb, [newValue unsignedIntValue]); } forKey:@"GBRewindLength"]; + [self addDefaultObserver:^(id newValue) { + [[AVAudioSession sharedInstance] setCategory:[newValue isEqual:@"on"]? AVAudioSessionCategoryPlayback : AVAudioSessionCategorySoloAmbient + mode:AVAudioSessionModeMeasurement // Reduces latency on BT + routeSharingPolicy:AVAudioSessionRouteSharingPolicyDefault + options:AVAudioSessionCategoryOptionAllowBluetoothA2DP | AVAudioSessionCategoryOptionAllowAirPlay + error:nil]; + } forKey:@"GBAudioMode"]; } - (void)addDefaultObserver:(void(^)(id newValue))block forKey:(NSString *)key @@ -526,37 +533,39 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp) { GB_set_pixels_output(&_gb, _gbView.pixels); GB_set_sample_rate(&_gb, 96000); - _audioClient = [[GBAudioClient alloc] initWithRendererBlock:^(UInt32 sampleRate, UInt32 nFrames, GB_sample_t *buffer) { - [_audioLock lock]; - - if (_audioBufferPosition < nFrames) { - _audioBufferNeeded = nFrames; - [_audioLock waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.125]]; - } - - if (_stopping) { - memset(buffer, 0, nFrames * sizeof(*buffer)); + if (![[[NSUserDefaults standardUserDefaults] stringForKey:@"GBAudioMode"] isEqual:@"off"]) { + _audioClient = [[GBAudioClient alloc] initWithRendererBlock:^(UInt32 sampleRate, UInt32 nFrames, GB_sample_t *buffer) { + [_audioLock lock]; + + if (_audioBufferPosition < nFrames) { + _audioBufferNeeded = nFrames; + [_audioLock waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.125]]; + } + + if (_stopping) { + memset(buffer, 0, nFrames * sizeof(*buffer)); + [_audioLock unlock]; + return; + } + + if (_audioBufferPosition < nFrames) { + // Not enough audio + memset(buffer, 0, (nFrames - _audioBufferPosition) * sizeof(*buffer)); + memcpy(buffer, _audioBuffer, _audioBufferPosition * sizeof(*buffer)); + _audioBufferPosition = 0; + } + else if (_audioBufferPosition < nFrames + 4800) { + memcpy(buffer, _audioBuffer, nFrames * sizeof(*buffer)); + memmove(_audioBuffer, _audioBuffer + nFrames, (_audioBufferPosition - nFrames) * sizeof(*buffer)); + _audioBufferPosition = _audioBufferPosition - nFrames; + } + else { + memcpy(buffer, _audioBuffer + (_audioBufferPosition - nFrames), nFrames * sizeof(*buffer)); + _audioBufferPosition = 0; + } [_audioLock unlock]; - return; - } - - if (_audioBufferPosition < nFrames) { - // Not enough audio - memset(buffer, 0, (nFrames - _audioBufferPosition) * sizeof(*buffer)); - memcpy(buffer, _audioBuffer, _audioBufferPosition * sizeof(*buffer)); - _audioBufferPosition = 0; - } - else if (_audioBufferPosition < nFrames + 4800) { - memcpy(buffer, _audioBuffer, nFrames * sizeof(*buffer)); - memmove(_audioBuffer, _audioBuffer + nFrames, (_audioBufferPosition - nFrames) * sizeof(*buffer)); - _audioBufferPosition = _audioBufferPosition - nFrames; - } - else { - memcpy(buffer, _audioBuffer + (_audioBufferPosition - nFrames), nFrames * sizeof(*buffer)); - _audioBufferPosition = 0; - } - [_audioLock unlock]; - } andSampleRate:96000]; + } andSampleRate:96000]; + } [_audioClient start]; if (GB_has_accelerometer(&_gb)) { diff --git a/iOS/main.m b/iOS/main.m index 86ce161..d76bd77 100644 --- a/iOS/main.m +++ b/iOS/main.m @@ -9,6 +9,7 @@ int main(int argc, char * argv[]) [[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"GBFilter": @"NearestNeighbor", @"GBColorCorrection": @(GB_COLOR_CORRECTION_MODERN_BALANCED), + @"GBAudioMode": @"switch", @"GBHighpassFilter": @(GB_HIGHPASS_ACCURATE), @"GBRewindLength": @(10), @"GBFrameBlendingMode": @(GB_FRAME_BLENDING_MODE_ACCURATE),