248 lines
11 KiB
Objective-C
248 lines
11 KiB
Objective-C
//
|
|
// MGMSIPPane.m
|
|
// VoiceMac
|
|
//
|
|
// Created by Mr. Gecko on 9/16/10.
|
|
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
|
|
//
|
|
// Permission to use, copy, modify, and/or distribute this software for any purpose
|
|
// with or without fee is hereby granted, provided that the above copyright notice
|
|
// and this permission notice appear in all copies.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
|
|
// OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
|
// ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
//
|
|
|
|
#if MGMSIPENABLED
|
|
#import "MGMSIPPane.h"
|
|
#import <VoiceBase/VoiceBase.h>
|
|
|
|
@implementation MGMSIPPane
|
|
- (id)initWithPreferences:(MGMPreferences *)thePreferences {
|
|
if ((self = [super initWithPreferences:thePreferences])) {
|
|
if (![NSBundle loadNibNamed:@"SIPPane" owner:self]) {
|
|
NSLog(@"Unable to load Nib for SIP Preferences");
|
|
[self release];
|
|
self = nil;
|
|
} else {
|
|
shouldRestart = NO;
|
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
//Sound
|
|
[volumeSlider setFloatValue:[[MGMSIP sharedSIP] volume]];
|
|
[micVolumeSlider setFloatValue:[[MGMSIP sharedSIP] micVolume]];
|
|
[self audioChanged:nil];
|
|
[echoCancelationButton setState:([defaults boolForKey:MGMSIPEchoCacnellationEnabled] ? NSOnState : NSOffState)];
|
|
[voiceActivityDetectionButton setState:([defaults boolForKey:MGMSIPVoiceActivityDetection] ? NSOnState : NSOffState)];
|
|
|
|
//Network
|
|
[[localPortField cell] setPlaceholderString:[[NSNumber numberWithInt:[[MGMSIP sharedSIP] port]] stringValue]];
|
|
if ([defaults integerForKey:MGMSIPPort]!=0)
|
|
[localPortField setIntValue:[defaults integerForKey:MGMSIPPort]];
|
|
if ([defaults objectForKey:MGMSIPOutboundProxy]!=nil && ![[defaults objectForKey:MGMSIPOutboundProxy] isEqual:@""])
|
|
[outboundProxyHostField setStringValue:[defaults objectForKey:MGMSIPOutboundProxy]];
|
|
if ([defaults integerForKey:MGMSIPOutboundProxyPort]!=0)
|
|
[outboundProxyPortField setIntValue:[defaults integerForKey:MGMSIPOutboundProxyPort]];
|
|
if ([defaults objectForKey:MGMSIPSTUN]!=nil && ![[defaults objectForKey:MGMSIPSTUN] isEqual:@""])
|
|
[STUNServerField setStringValue:[defaults objectForKey:MGMSIPSTUN]];
|
|
if ([defaults integerForKey:MGMSIPSTUNPort]!=0)
|
|
[STUNServerPortField setIntValue:[defaults integerForKey:MGMSIPSTUNPort]];
|
|
[nameServersButton setState:([defaults boolForKey:MGMSIPNameServersEnabled] ? NSOnState : NSOffState)];
|
|
[ICEButton setState:([defaults boolForKey:MGMSIPInteractiveConnectivityEstablishment] ? NSOnState : NSOffState)];
|
|
|
|
//Advanced
|
|
if ([defaults objectForKey:MGMSIPLogFile]!=nil && ![[defaults objectForKey:MGMSIPLogFile] isEqual:@""])
|
|
[logFileField setStringValue:[defaults objectForKey:MGMSIPLogFile]];
|
|
[logFileLevelField setIntValue:[defaults integerForKey:MGMSIPLogLevel]];
|
|
[consoleLogLevelField setIntValue:[defaults integerForKey:MGMSIPConsoleLogLevel]];
|
|
if ([defaults objectForKey:MGMSIPPublicAddress]!=nil && ![[defaults objectForKey:MGMSIPPublicAddress] isEqual:@""])
|
|
[publicAddressField setStringValue:[defaults objectForKey:MGMSIPPublicAddress]];
|
|
if ([defaults objectForKey:MGMSIPUserAgent]!=nil)
|
|
[userAgentField setStringValue:[defaults objectForKey:MGMSIPUserAgent]];
|
|
|
|
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
|
|
[notificationCenter addObserver:self selector:@selector(volumeChanged:) name:MGMSIPVolumeChangedNotification object:nil];
|
|
[notificationCenter addObserver:self selector:@selector(micVolumeChanged:) name:MGMSIPMicVolumeChangedNotification object:nil];
|
|
[notificationCenter addObserver:self selector:@selector(audioChanged:) name:MGMSIPAudioChangedNotification object:nil];
|
|
}
|
|
}
|
|
return self;
|
|
}
|
|
- (void)dealloc {
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
if (shouldRestart) {
|
|
NSAlert *alert = [[NSAlert new] autorelease];
|
|
[alert setMessageText:@"Restart Required"];
|
|
[alert setInformativeText:@"You have changed some settings that requires you to restart VoiceMac for them to take place, do you want to restart VoiceMac now?"];
|
|
[alert addButtonWithTitle:@"Yes"];
|
|
[alert addButtonWithTitle:@"No"];
|
|
int result = [alert runModal];
|
|
if (result==1000) {
|
|
//Took from Sparkle.
|
|
NSString *pathToRelaunch = [[NSBundle mainBundle] bundlePath];
|
|
NSString *relaunchPath = [[[NSBundle bundleWithIdentifier:@"org.andymatuschak.Sparkle"] resourcePath] stringByAppendingPathComponent:@"relaunch"];
|
|
[NSTask launchedTaskWithLaunchPath:relaunchPath arguments:[NSArray arrayWithObjects:pathToRelaunch, [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]], nil]];
|
|
[[NSApplication sharedApplication] terminate:self];
|
|
}
|
|
//[[MGMSIP sharedSIP] restart];
|
|
}
|
|
[mainView release];
|
|
[super dealloc];
|
|
}
|
|
+ (void)setUpToolbarItem:(NSToolbarItem *)theItem {
|
|
[theItem setLabel:[self title]];
|
|
[theItem setPaletteLabel:[theItem label]];
|
|
[theItem setImage:[NSImage imageNamed:@"SIP"]];
|
|
}
|
|
+ (NSString *)title {
|
|
return @"SIP Options";
|
|
}
|
|
- (NSView *)preferencesView {
|
|
return mainView;
|
|
}
|
|
|
|
//Sound
|
|
- (void)volumeChanged:(NSNotification *)theNotification {
|
|
[volumeSlider setFloatValue:[[theNotification object] floatValue]];
|
|
}
|
|
- (IBAction)volume:(id)sender {
|
|
[[MGMSIP sharedSIP] setVolume:[volumeSlider floatValue]];
|
|
}
|
|
- (void)micVolumeChanged:(NSNotification *)theNotification {
|
|
[micVolumeSlider setFloatValue:[[theNotification object] floatValue]];
|
|
}
|
|
- (IBAction)micVolume:(id)sender {
|
|
[[MGMSIP sharedSIP] setMicVolume:[micVolumeSlider floatValue]];
|
|
}
|
|
- (void)audioChanged:(NSNotification *)theNotificaiton {
|
|
if (![[MGMSIP sharedSIP] isStarted]) {
|
|
[[MGMSIP sharedSIP] start];
|
|
return;
|
|
}
|
|
NSArray *devices = nil;
|
|
if (theNotificaiton==nil || [theNotificaiton object]==nil)
|
|
devices = [[MGMSIP sharedSIP] audioDevices];
|
|
else
|
|
devices = [theNotificaiton object];
|
|
|
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
NSMenu *outputMenu = [[NSMenu new] autorelease];
|
|
int outputIndex = 0;
|
|
int outputCount = 0;
|
|
NSMenu *inputMenu = [[NSMenu new] autorelease];
|
|
int inputIndex = 0;
|
|
int inputCount = 0;
|
|
for (int i=0; i<[devices count]; i++) {
|
|
NSDictionary *device = [devices objectAtIndex:i];
|
|
if ([[device objectForKey:MGMSIPADeviceIndex] intValue]==-1 || [[device objectForKey:MGMSIPADeviceOutputCount] intValue]>0) {
|
|
NSMenuItem *item = [[NSMenuItem new] autorelease];
|
|
[item setTitle:[device objectForKey:MGMSIPADeviceName]];
|
|
[item setTag:[[device objectForKey:MGMSIPADeviceIndex] intValue]];
|
|
[outputMenu addItem:item];
|
|
if ([[device objectForKey:MGMSIPADeviceUID] isEqual:[defaults objectForKey:MGMSIPACurrentOutputDevice]])
|
|
outputIndex = outputCount;
|
|
outputCount++;
|
|
if ([[device objectForKey:MGMSIPADeviceIndex] intValue]==-1) {
|
|
[outputMenu addItem:[NSMenuItem separatorItem]];
|
|
outputCount++;
|
|
}
|
|
}
|
|
if ([[device objectForKey:MGMSIPADeviceIndex] intValue]==-1 || [[device objectForKey:MGMSIPADeviceInputCount] intValue]>0) {
|
|
NSMenuItem *item = [[NSMenuItem new] autorelease];
|
|
[item setTitle:[device objectForKey:MGMSIPADeviceName]];
|
|
[item setTag:[[device objectForKey:MGMSIPADeviceIndex] intValue]];
|
|
[inputMenu addItem:item];
|
|
if ([[device objectForKey:MGMSIPADeviceUID] isEqual:[defaults objectForKey:MGMSIPACurrentInputDevice]])
|
|
inputIndex = inputCount;
|
|
inputCount++;
|
|
if ([[device objectForKey:MGMSIPADeviceIndex] intValue]==-1) {
|
|
[inputMenu addItem:[NSMenuItem separatorItem]];
|
|
inputCount++;
|
|
}
|
|
}
|
|
}
|
|
[audioOutputPopUp setMenu:outputMenu];
|
|
[audioOutputPopUp selectItemAtIndex:outputIndex];
|
|
[audioInputPopUp setMenu:inputMenu];
|
|
[audioInputPopUp selectItemAtIndex:inputIndex];
|
|
}
|
|
- (IBAction)audio:(id)sender {
|
|
[[MGMSIP sharedSIP] setInputSoundDevice:[[audioInputPopUp selectedItem] tag] outputSoundDevice:[[audioOutputPopUp selectedItem] tag]];
|
|
}
|
|
- (IBAction)echoCancelation:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setBool:([echoCancelationButton state]==NSOnState) forKey:MGMSIPEchoCacnellationEnabled];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)voiceActivityDetection:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setBool:([voiceActivityDetectionButton state]==NSOnState) forKey:MGMSIPVoiceActivityDetection];
|
|
shouldRestart = YES;
|
|
}
|
|
|
|
//Network
|
|
- (IBAction)localPort:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setInteger:[localPortField intValue] forKey:MGMSIPPort];
|
|
[[MGMSIP sharedSIP] setPort:[localPortField intValue]];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)outboundProxyHost:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setObject:[outboundProxyHostField stringValue] forKey:MGMSIPOutboundProxy];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)outboundProxyPort:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setInteger:[outboundProxyPortField intValue] forKey:MGMSIPOutboundProxyPort];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)STUNServer:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setObject:[STUNServerField stringValue] forKey:MGMSIPSTUN];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)STUNServerPort:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setInteger:[STUNServerPortField intValue] forKey:MGMSIPSTUNPort];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)nameServer:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setBool:([nameServersButton state]==NSOnState) forKey:MGMSIPNameServersEnabled];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)ICE:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setBool:([ICEButton state]==NSOnState) forKey:MGMSIPInteractiveConnectivityEstablishment];
|
|
shouldRestart = YES;
|
|
}
|
|
|
|
//Advanced
|
|
- (IBAction)logFile:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setObject:[logFileField stringValue] forKey:MGMSIPLogFile];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)chooseLogFile:(id)sender {
|
|
NSSavePanel *panel = [NSSavePanel savePanel];
|
|
int returnCode;
|
|
returnCode = [panel runModal];
|
|
if (returnCode==NSOKButton) {
|
|
NSString *path = [[panel URL] path];
|
|
[logFileField setStringValue:path];
|
|
[[NSUserDefaults standardUserDefaults] setObject:path forKey:MGMSIPLogFile];
|
|
}
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)logFileLevel:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setInteger:[logFileLevelField intValue] forKey:MGMSIPLogLevel];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)consoleLogLevel:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setInteger:[consoleLogLevelField intValue] forKey:MGMSIPConsoleLogLevel];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)publicAddress:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setObject:[publicAddressField stringValue] forKey:MGMSIPPublicAddress];
|
|
shouldRestart = YES;
|
|
}
|
|
- (IBAction)userAgent:(id)sender {
|
|
[[NSUserDefaults standardUserDefaults] setObject:[userAgentField stringValue] forKey:MGMSIPUserAgent];
|
|
shouldRestart = YES;
|
|
}
|
|
@end
|
|
#endif |