diff --git a/Audio/Output/OutputCoreAudio.h b/Audio/Output/OutputCoreAudio.h index e2bcfc0bb..fd1bd7ce4 100644 --- a/Audio/Output/OutputCoreAudio.h +++ b/Audio/Output/OutputCoreAudio.h @@ -102,7 +102,7 @@ using std::atomic_long; - (id)initWithController:(OutputNode *)c; - (BOOL)setup; -- (OSStatus)setOutputDeviceByID:(AudioDeviceID)deviceID; +- (OSStatus)setOutputDeviceByID:(int)deviceID; - (BOOL)setOutputDeviceWithDeviceDict:(NSDictionary *)deviceDict; - (void)start; - (void)pause; diff --git a/Audio/Output/OutputCoreAudio.m b/Audio/Output/OutputCoreAudio.m index ee5ae346a..99bab4c43 100644 --- a/Audio/Output/OutputCoreAudio.m +++ b/Audio/Output/OutputCoreAudio.m @@ -189,7 +189,7 @@ current_device_listener(AudioObjectID inObjectID, UInt32 inNumberAddresses, cons } } -- (OSStatus)setOutputDeviceByID:(AudioDeviceID)deviceID { +- (OSStatus)setOutputDeviceByID:(int)deviceIDIn { OSStatus err; BOOL defaultDevice = NO; AudioObjectPropertyAddress theAddress = { @@ -198,7 +198,9 @@ current_device_listener(AudioObjectID inObjectID, UInt32 inNumberAddresses, cons .mElement = kAudioObjectPropertyElementMaster }; - if(deviceID == -1) { + AudioDeviceID deviceID = (AudioDeviceID)deviceIDIn; + + if(deviceIDIn == -1) { defaultDevice = YES; UInt32 size = sizeof(AudioDeviceID); err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &theAddress, 0, NULL, &size, &deviceID); @@ -278,8 +280,8 @@ current_device_listener(AudioObjectID inObjectID, UInt32 inNumberAddresses, cons } - (BOOL)setOutputDeviceWithDeviceDict:(NSDictionary *)deviceDict { - NSNumber *deviceIDNum = [deviceDict objectForKey:@"deviceID"]; - AudioDeviceID outputDeviceID = [deviceIDNum unsignedIntValue] ?: -1; + NSNumber *deviceIDNum = deviceDict ? [deviceDict objectForKey:@"deviceID"] : @(-1); + int outputDeviceID = deviceIDNum ? [deviceIDNum intValue] : -1; __block OSStatus err = [self setOutputDeviceByID:outputDeviceID]; diff --git a/Preferences/Preferences/OutputsArrayController.m b/Preferences/Preferences/OutputsArrayController.m index 698d5cf8e..7e8ecab10 100644 --- a/Preferences/Preferences/OutputsArrayController.m +++ b/Preferences/Preferences/OutputsArrayController.m @@ -15,30 +15,34 @@ }; [self addObject:defaultDeviceInfo]; - NSDictionary *defaultDevice = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"outputDevice"]; - NSString *defaultDeviceName = defaultDevice[@"name"]; - NSNumber *defaultDeviceIDNum = defaultDevice[@"deviceID"]; - AudioDeviceID defaultDeviceID = [defaultDeviceIDNum unsignedIntValue]; + NSUserDefaults *defaults = [[NSUserDefaultsController sharedUserDefaultsController] defaults]; + NSDictionary *defaultDevice = [defaults objectForKey:@"outputDevice"]; + NSString *defaultDeviceName = defaultDevice ? defaultDevice[@"name"] : @""; + NSNumber *defaultDeviceIDNum = defaultDevice ? defaultDevice[@"deviceID"] : @(-1); + int defaultDeviceID = defaultDeviceIDNum ? [defaultDeviceIDNum intValue] : -1; [self enumerateAudioOutputsUsingBlock: - ^(NSString *deviceName, AudioDeviceID deviceID, AudioDeviceID systemDefaultID, BOOL *stop) { - NSDictionary *deviceInfo = @{ - @"name": deviceName, - @"deviceID": @(deviceID), - }; - [self addObject:deviceInfo]; + ^(NSString *deviceName, AudioDeviceID deviceID, AudioDeviceID systemDefaultID, BOOL *stop) { + NSDictionary *deviceInfo = @{ + @"name": deviceName, + @"deviceID": @(deviceID), + }; - if(defaultDevice && defaultDeviceID != -1) { - if((deviceID == defaultDeviceID) || - ([deviceName isEqualToString:defaultDeviceName])) { - [self setSelectedObjects:@[deviceInfo]]; - // Update `outputDevice`, in case the ID has changed. - [[NSUserDefaults standardUserDefaults] setObject:deviceInfo forKey:@"outputDevice"]; - } - } - }]; + [self addObject:deviceInfo]; - if(!defaultDevice || defaultDeviceID == -1) { + if(defaultDeviceID != -1) { + if((deviceID == (AudioDeviceID)defaultDeviceID) || + ([deviceName isEqualToString:defaultDeviceName])) { + [self setSelectedObjects:@[deviceInfo]]; + // Update `outputDevice`, in case the ID has changed. + if(deviceID != (AudioDeviceID)defaultDeviceID) { + [defaults setObject:deviceInfo forKey:@"outputDevice"]; + } + } + } + }]; + + if(defaultDeviceID == -1) { [self setSelectionIndex:0]; } }