mirror of
https://github.com/mattingalls/Soundflower.git
synced 2026-09-27 17:01:43 +02:00
229 lines
7.4 KiB
Objective-C
229 lines
7.4 KiB
Objective-C
//
|
|
// SFPreferencesManager.m
|
|
// Soundfly
|
|
//
|
|
// Created by JuL on 11/08/05.
|
|
// Copyright 2005 abyssoft. All rights reserved.
|
|
//
|
|
|
|
#import "SFPreferencesManager.h"
|
|
|
|
#import <AudioUnit/AudioUnit.h>
|
|
|
|
#define SOUNDFLY_CONNECTION_NAME @"soundfly"
|
|
#define DEFAULT_NAME @"Soundfly"
|
|
|
|
NSString * SFDefaultsWillChangeNotification = @"SFDefaultsWillChangeNotification";
|
|
NSString * SFDefaultsDidChangeNotification = @"SFDefaultsDidChangeNotification";
|
|
NSString * SFDefaultsChangeNotification = @"SFDefaultsChangeNotification";
|
|
|
|
static SFPreferencesManager * _sharedPreferencesManager = nil;
|
|
|
|
@interface NSUserDefaults (Private)
|
|
|
|
+ (void)setStandardUserDefaults:(NSUserDefaults *)sud;
|
|
|
|
@end
|
|
|
|
@implementation NSObject (PreferencesAdditions)
|
|
|
|
- (void)bind:(NSString*)binding toPref:(NSString*)prefKey
|
|
{
|
|
[self bind:binding toObject:[SFPreferencesManager sharedPreferencesManager] withKeyPath:prefKey options:nil];
|
|
}
|
|
|
|
@end
|
|
|
|
@interface SFPreferencesManager (Private)
|
|
|
|
- (NSUserDefaultsController*)_defaultsController;
|
|
|
|
@end
|
|
|
|
@implementation NSString (PreferencesAdditions)
|
|
|
|
- (BOOL)boolValue
|
|
{
|
|
NSString * lowercaseString = [self lowercaseString];
|
|
return [lowercaseString isEqualToString:@"yes"] || [lowercaseString isEqualToString:@"true"] || [lowercaseString isEqualToString:@"1"];
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation SFPreferencesManager
|
|
|
|
+ (SFPreferencesManager*)sharedPreferencesManager
|
|
{
|
|
if(_sharedPreferencesManager == nil)
|
|
_sharedPreferencesManager = [[SFPreferencesManager alloc] init];
|
|
return _sharedPreferencesManager;
|
|
}
|
|
|
|
- init
|
|
{
|
|
self = [super init];
|
|
|
|
NSString * appDomainName = [[NSBundle mainBundle] bundleIdentifier];
|
|
NSString * domainName = [[NSBundle bundleForClass:[self class]] bundleIdentifier];
|
|
_isLocal = [domainName isEqualToString:appDomainName];
|
|
|
|
if(_isLocal) {
|
|
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(changeDefault:) name:SFDefaultsChangeNotification object:nil];
|
|
}
|
|
else {
|
|
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsWillChange:) name:SFDefaultsWillChangeNotification object:nil];
|
|
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsDidChange:) name:SFDefaultsDidChangeNotification object:nil];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
if(_isLocal) {
|
|
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self name:SFDefaultsChangeNotification object:nil];
|
|
}
|
|
else {
|
|
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self name:SFDefaultsWillChangeNotification object:nil];
|
|
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self name:SFDefaultsDidChangeNotification object:nil];
|
|
}
|
|
[super dealloc];
|
|
}
|
|
|
|
- (BOOL)isLocal
|
|
{
|
|
return _isLocal;
|
|
}
|
|
|
|
- (NSString*)daemonConnectionName
|
|
{
|
|
NSString * version = nil;
|
|
|
|
if(_isLocal) {
|
|
version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
|
|
}
|
|
else {
|
|
NSBundle * mainBundle = [NSBundle bundleForClass:[self class]];
|
|
NSString * daemonPath = [mainBundle pathForResource:SOUNDFLY_DAEMON ofType:@"app"];
|
|
NSBundle * daemonBundle = [NSBundle bundleWithPath:daemonPath];
|
|
NSDictionary * daemonInfoDict = [daemonBundle infoDictionary];
|
|
version = [daemonInfoDict objectForKey:@"CFBundleVersion"];
|
|
}
|
|
|
|
return [NSString stringWithFormat:@"%@-%@", SOUNDFLY_CONNECTION_NAME, version];
|
|
}
|
|
|
|
- (NSUserDefaultsController*)_defaultsController
|
|
{
|
|
static NSUserDefaultsController * _userDefaultsController = nil;
|
|
|
|
if(_userDefaultsController == nil) {
|
|
NSString * appDomainName = [[NSBundle mainBundle] bundleIdentifier];
|
|
NSString * domainName = [[NSBundle bundleForClass:[self class]] bundleIdentifier];
|
|
NSUserDefaults * defaults = [[NSUserDefaults alloc] init];
|
|
[defaults removeSuiteNamed:appDomainName];
|
|
[defaults addSuiteNamed:domainName];
|
|
|
|
_userDefaultsController = [[NSUserDefaultsController alloc] initWithDefaults:defaults initialValues:nil];
|
|
|
|
[_userDefaultsController setInitialValues:[NSDictionary dictionaryWithObjectsAndKeys:
|
|
[NSNumber numberWithBool:YES], SHOW_STATUS_ITEM,
|
|
|
|
[NSNumber numberWithBool:NO], RECEIVER_ACTIVE,
|
|
DEFAULT_NAME, RECEIVER_NAME,
|
|
|
|
[NSNumber numberWithBool:NO], SENDER_ACTIVE,
|
|
[NSNumber numberWithInt:52800], SENDER_PORT,
|
|
[NSNumber numberWithInt:kAUNetSendPresetFormat_Lossless16], SENDER_FORMAT_TAG,
|
|
DEFAULT_NAME, SENDER_CURRENT_NAME,
|
|
[NSArray arrayWithObject:DEFAULT_NAME], SENDER_KNOWN_NAMES,
|
|
nil]];
|
|
|
|
[defaults release];
|
|
}
|
|
|
|
return _userDefaultsController;
|
|
}
|
|
|
|
- (id)valueForKey:(NSString*)key
|
|
{
|
|
return [[self _defaultsController] valueForKeyPath:[NSString stringWithFormat:@"values.%@", key]];
|
|
}
|
|
|
|
- (BOOL)boolForPref:(NSString*)pref
|
|
{
|
|
return [[self valueForKey:pref] boolValue];
|
|
}
|
|
|
|
- (int)intForPref:(NSString*)pref
|
|
{
|
|
return [[self valueForKey:pref] intValue];
|
|
}
|
|
|
|
- (float)floatForPref:(NSString*)pref
|
|
{
|
|
return [[self valueForKey:pref] floatValue];
|
|
}
|
|
|
|
- (id)valueForPref:(NSString*)pref
|
|
{
|
|
return [self valueForKey:pref];
|
|
}
|
|
|
|
- (void)addObserver:(NSObject*)observer forPref:(NSString*)pref
|
|
{
|
|
NSUserDefaultsController * defaultsController = [self _defaultsController];
|
|
[defaultsController addObserver:observer forKeyPath:[NSString stringWithFormat:@"values.%@", pref] options:NSKeyValueObservingOptionNew context:NULL];
|
|
}
|
|
|
|
- (void)removeObserver:(NSObject*)observer forPref:(NSString*)pref
|
|
{
|
|
NSUserDefaultsController * defaultsController = [self _defaultsController];
|
|
[defaultsController removeObserver:observer forKeyPath:[NSString stringWithFormat:@"values.%@", pref]];
|
|
}
|
|
|
|
- (void)setValue:(id)value forKey:(NSString*)key
|
|
{
|
|
if(_isLocal) {
|
|
NSUserDefaultsController * defaultsController = [self _defaultsController];
|
|
[self willChangeValueForKey:key];
|
|
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:SFDefaultsWillChangeNotification object:key];
|
|
[defaultsController setValue:value forKeyPath:[NSString stringWithFormat:@"values.%@", key]];
|
|
[[defaultsController defaults] synchronize];
|
|
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:SFDefaultsDidChangeNotification object:key];
|
|
[self didChangeValueForKey:key];
|
|
}
|
|
else {
|
|
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:SFDefaultsChangeNotification object:key userInfo:[NSDictionary dictionaryWithObject:value forKey:key]];
|
|
}
|
|
}
|
|
|
|
- (void)changeDefault:(NSNotification*)notification
|
|
{
|
|
NSString * key = [notification object];
|
|
id value = [[notification userInfo] objectForKey:key];
|
|
[self setValue:value forKeyPath:key];
|
|
}
|
|
|
|
- (void)defaultsWillChange:(NSNotification*)notification
|
|
{
|
|
NSString * keyPath = [notification object];
|
|
[self willChangeValueForKey:keyPath];
|
|
}
|
|
|
|
- (void)defaultsDidChange:(NSNotification*)notification
|
|
{
|
|
NSString * keyPath = [notification object];
|
|
[[[self _defaultsController] defaults] synchronize];
|
|
[self didChangeValueForKey:keyPath];
|
|
}
|
|
|
|
static NSString *const kFSBonjourNameFormat = @"\t%@\tlocal.";
|
|
|
|
- (NSString*)bonjourNameFromSpeakerName:(NSString*)speakerName
|
|
{
|
|
return [NSString stringWithFormat:kFSBonjourNameFormat, speakerName];
|
|
}
|
|
|
|
@end
|