From 35f6b7135a40f5d95777b74f84bc90db2a33ad2b Mon Sep 17 00:00:00 2001 From: Kent Sutherland Date: Wed, 21 May 2003 01:32:34 +0000 Subject: [PATCH] Lots of changes.... --- English.lproj/Preferences.nib/classes.nib | 1 + .../Preferences.nib/keyedobjects.nib | Bin 39991 -> 40050 bytes MainController.m | 28 +++--- MenuController.m | 34 ++++++- PreferencesController.h | 1 + PreferencesController.m | 17 +--- iTunesRemote.h | 1 + iTunesRemote.m | 87 +++++++++--------- 8 files changed, 93 insertions(+), 76 deletions(-) diff --git a/English.lproj/Preferences.nib/classes.nib b/English.lproj/Preferences.nib/classes.nib index 582b1bc..d273da6 100755 --- a/English.lproj/Preferences.nib/classes.nib +++ b/English.lproj/Preferences.nib/classes.nib @@ -32,6 +32,7 @@ toggleLoopButton = NSButton; toggleShuffleButton = NSButton; trackInfoButton = NSButton; + trackNumberCheckbox = NSButton; trackTimeCheckbox = NSButton; upcomingSongsButton = NSButton; visualizerButton = NSButton; diff --git a/English.lproj/Preferences.nib/keyedobjects.nib b/English.lproj/Preferences.nib/keyedobjects.nib index fc202f9eb57876c00c200a446774d0273829b38a..b8110c91a5135311b96f8ff78e4a108a0b849772 100755 GIT binary patch literal 40050 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 K%m42o`+ot|pofqE literal 39991 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 K@c;Kz{{H|Dp^Oj! diff --git a/MainController.m b/MainController.m index 600d8df..0d34014 100755 --- a/MainController.m +++ b/MainController.m @@ -11,7 +11,6 @@ - (void)timerUpdate; - (void)setLatestSongIdentifier:(NSString *)newIdentifier; - (void)showCurrentTrackInfo; - - (void)applicationLaunched:(NSNotification *)note; - (void)applicationTerminated:(NSNotification *)note; @end @@ -161,9 +160,12 @@ static MainController *sharedController; - (void)timerUpdate { - if ( ( [self songChanged] ) || + //This huge if statement is being nasty + /*if ( ( [self songChanged] ) || ( ([self radioIsPlaying]) && (latestPlaylistClass != ITMTRemotePlayerRadioPlaylist) ) || - ( (! [self radioIsPlaying]) && (latestPlaylistClass == ITMTRemotePlayerRadioPlaylist) ) ) { + ( (! [self radioIsPlaying]) && (latestPlaylistClass == ITMTRemotePlayerRadioPlaylist) ) )*/ + + if ([self songChanged]) { [self setLatestSongIdentifier:[currentRemote currentSongUniqueIdentifier]]; latestPlaylistClass = [currentRemote currentPlaylistClass]; [menuController rebuildSubmenus]; @@ -528,6 +530,7 @@ static MainController *sharedController; - (void)applicationLaunched:(NSNotification *)note { if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) { + [currentRemote begin]; [self setLatestSongIdentifier:@""]; [self timerUpdate]; [NSThread detachNewThreadSelector:@selector(startTimerInNewThread) toTarget:self withObject:nil]; @@ -539,11 +542,12 @@ static MainController *sharedController; - (void)applicationTerminated:(NSNotification *)note { if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[currentRemote playerFullName]]) { - [refreshTimer invalidate]; - [refreshTimer release]; - refreshTimer = nil; - [self clearHotKeys]; - playerRunningState = ITMTRemotePlayerNotRunning; + [currentRemote halt]; + [refreshTimer invalidate]; + [refreshTimer release]; + refreshTimer = nil; + [self clearHotKeys]; + playerRunningState = ITMTRemotePlayerNotRunning; } } @@ -567,13 +571,7 @@ static MainController *sharedController; - (void)dealloc { - if (refreshTimer) { - [refreshTimer invalidate]; - [refreshTimer release]; - refreshTimer = nil; - } - - [currentRemote halt]; + [self applicationTerminated:nil]; [statusItem release]; [statusWindowController release]; [menuController release]; diff --git a/MenuController.m b/MenuController.m index 0344308..0d6cdb5 100755 --- a/MenuController.m +++ b/MenuController.m @@ -33,7 +33,8 @@ - (NSMenu *)menu { NSMenu *menu = [[NSMenu alloc] initWithTitle:@""]; - NSArray *menuArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"menu"]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSArray *menuArray = [defaults arrayForKey:@"menu"]; NSEnumerator *enumerator = [menuArray objectEnumerator]; NSString *nextObject; NSMenuItem *tempItem; @@ -154,9 +155,36 @@ [menu addItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@""]; if ([title length] > 0) { - [menu addItemWithTitle:[NSString stringWithFormat:@" %@", title] action:nil keyEquivalent:@""]; + [menu addItemWithTitle:[NSString stringWithFormat:@" %@", title] + action:nil + keyEquivalent:@""]; + } + + if ([defaults boolForKey:@"showAlbum"]) { + [menu addItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongAlbum]] + action:nil + keyEquivalent:@""]; + } + + if ([defaults boolForKey:@"showArtist"]) { + [menu addItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongArtist]] + action:nil + keyEquivalent:@""]; + } + + if ([defaults boolForKey:@"showTrackNumber"]) { + [menu addItemWithTitle:[NSString stringWithFormat:@" Track %i", [currentRemote currentSongTrack]] + action:nil + keyEquivalent:@""]; + } + + if ([defaults boolForKey:@"showTime"]) { + int left = [[currentRemote currentSongRemaining] intValue]; + NSString *remaining = [NSString stringWithFormat:@"%i:%02i", left / 60, left % 60]; + [menu addItemWithTitle:[NSString stringWithFormat:@" %@/%@", remaining, [currentRemote currentSongLength]] + action:nil + keyEquivalent:@""]; } - //Gotta add artist, album, track, time, etc, blah, blah, blah... } else { [menu addItemWithTitle:@"No Song" action:NULL keyEquivalent:@""]; } diff --git a/PreferencesController.h b/PreferencesController.h index 7be6a5e..effb259 100755 --- a/PreferencesController.h +++ b/PreferencesController.h @@ -35,6 +35,7 @@ IBOutlet NSButton *toggleLoopButton; IBOutlet NSButton *toggleShuffleButton; IBOutlet NSButton *trackInfoButton; + IBOutlet NSButton *trackNumberCheckbox; IBOutlet NSButton *trackTimeCheckbox; IBOutlet NSButton *upcomingSongsButton; IBOutlet NSButton *visualizerButton; diff --git a/PreferencesController.m b/PreferencesController.m index 802fdcb..4f43e26 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -95,41 +95,27 @@ static PreferencesController *prefs = nil; - (IBAction)changeGeneralSetting:(id)sender { - BOOL rebuildRequired = NO; - if ( [sender tag] == 1010) { [self setLaunchesAtLogin:SENDER_STATE]; } else if ( [sender tag] == 1020) { [df setBool:SENDER_STATE forKey:@"LaunchPlayerWithMT"]; } else if ( [sender tag] == 1030) { [df setInteger:[sender intValue] forKey:@"SongsInAdvance"]; - rebuildRequired = YES; + } else if ( [sender tag] == 1040) { // This will not be executed. Song info always shows the title of the song. // [df setBool:SENDER_STATE forKey:@"showName"]; - // rebuildRequired = YES; } else if ( [sender tag] == 1050) { [df setBool:SENDER_STATE forKey:@"showArtist"]; - rebuildRequired = YES; } else if ( [sender tag] == 1060) { [df setBool:SENDER_STATE forKey:@"showAlbum"]; - rebuildRequired = YES; } else if ( [sender tag] == 1070) { [df setBool:SENDER_STATE forKey:@"showTime"]; - rebuildRequired = YES; } else if ( [sender tag] == 1080) { [df setBool:SENDER_STATE forKey:@"showTrackNumber"]; - rebuildRequired = YES; } else if ( [sender tag] == 1090) { [df setBool:SENDER_STATE forKey:@"showTrackRating"]; - rebuildRequired = YES; } - - if ( rebuildRequired ) { - //[controller rebuildMenu]; - // redraw song info status window, or upcoming songs here - } - [df synchronize]; } @@ -615,6 +601,7 @@ static PreferencesController *prefs = nil; [nameCheckbox setEnabled:NO]; // Song info will ALWAYS show song title. [artistCheckbox setState:[df boolForKey:@"showArtist"] ? NSOnState : NSOffState]; [trackTimeCheckbox setState:[df boolForKey:@"showTime"] ? NSOnState : NSOffState]; + [trackNumberCheckbox setState:[df boolForKey:@"showTrackNumber"] ? NSOnState : NSOffState]; // Set the launch at login checkbox state [df synchronize]; diff --git a/iTunesRemote.h b/iTunesRemote.h index 949ec96..992eb49 100755 --- a/iTunesRemote.h +++ b/iTunesRemote.h @@ -14,6 +14,7 @@ @interface iTunesRemote : ITMTRemote { + ProcessSerialNumber savedPSN; } - (ProcessSerialNumber)iTunesPSN; @end diff --git a/iTunesRemote.m b/iTunesRemote.m index 529cd67..c24a5dc 100755 --- a/iTunesRemote.m +++ b/iTunesRemote.m @@ -24,6 +24,7 @@ - (BOOL)begin { + savedPSN = [self iTunesPSN]; return YES; } @@ -62,12 +63,12 @@ - (BOOL)showPrimaryInterface { // Make this into AppleEvents... shouldn't be too hard, I'm just too tired to do it right now. - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pisf'), from:'null'() }" eventClass:@"core" eventID:@"setd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pisf'), from:'null'() }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; // Still have to convert these to AEs: // set visible of browser window 1 to true - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:true($$), ----:obj { form:'prop', want:'prop', seld:'pvis', from:obj { form:'indx', want:'cBrW', seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:true($$), ----:obj { form:'prop', want:'prop', seld:'pvis', from:obj { form:'indx', want:'cBrW', seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; // set minimized of browser window 1 to false - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:fals($$), ----:obj { form:'prop', want:'prop', seld:'pMin', from:obj { form:'indx', want:'cBrW', seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:fals($$), ----:obj { form:'prop', want:'prop', seld:'pMin', from:obj { form:'indx', want:'cBrW', seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; return NO; } @@ -88,7 +89,7 @@ - (ITMTRemotePlayerPlayingState)playerPlayingState { - long result = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:'prop', want:type('prop'), seld:type('pPlS'), from:'null'() }" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + long result = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:'prop', want:type('prop'), seld:type('pPlS'), from:'null'() }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; switch (result) { @@ -111,13 +112,13 @@ - (NSArray *)playlists { long i = 0; - const signed long numPlaylists = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"kocl:type('cPly'), '----':(), &subj:()" eventClass:@"core" eventID:@"cnte" appPSN:[self iTunesPSN]]; + const signed long numPlaylists = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"kocl:type('cPly'), '----':(), &subj:()" eventClass:@"core" eventID:@"cnte" appPSN:savedPSN]; NSMutableArray *playlists = [[NSMutableArray alloc] initWithCapacity:numPlaylists]; for (i = 1; i <= numPlaylists; i++) { const long j = i; NSString *sendStr = [NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'indx', want:type('cPly'), seld:long(%lu), from:'null'() } }",(unsigned long)j]; - NSString *theObj = [[ITAppleEventCenter sharedCenter] sendAEWithSendString:sendStr eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + NSString *theObj = [[ITAppleEventCenter sharedCenter] sendAEWithSendString:sendStr eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; [playlists addObject:theObj]; } return [playlists autorelease]; @@ -125,12 +126,12 @@ - (int)numberOfSongsInPlaylistAtIndex:(int)index { - return [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:[NSString stringWithFormat:@"kocl:type('cTrk'), '----':obj { form:'indx', want:type('cPly'), seld:long(%lu), from:'null'() }",index] eventClass:@"core" eventID:@"cnte" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:[NSString stringWithFormat:@"kocl:type('cTrk'), '----':obj { form:'indx', want:type('cPly'), seld:long(%lu), from:'null'() }",index] eventClass:@"core" eventID:@"cnte" appPSN:savedPSN]; } - (ITMTRemotePlayerPlaylistClass)currentPlaylistClass { - int realResult = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pcls" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + int realResult = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pcls" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; switch (realResult) @@ -148,65 +149,65 @@ - (int)currentPlaylistIndex { - return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pidx" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pidx" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (NSString *)songTitleAtIndex:(int)index { - return [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'indx', want:type('cTrk'), seld:long(%lu), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } } }",index] eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'indx', want:type('cTrk'), seld:long(%lu), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } } }",index] eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (int)currentAlbumTrackCount { - return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pTrC" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pTrC" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (int)currentSongTrack { - return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pTrN" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pTrN" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (NSString *)currentSongUniqueIdentifier { - return [NSString stringWithFormat:@"%i-%i", [self currentPlaylistIndex], [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pDID" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]]; + return [NSString stringWithFormat:@"%i-%i", [self currentPlaylistIndex], [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pDID" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]]; } - (int)currentSongIndex { - return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pidx" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pidx" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (NSString *)currentSongTitle { - return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pnam" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pnam" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (NSString *)currentSongArtist { - return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pArt" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pArt" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (NSString *)currentSongAlbum { - return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pAlb" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pAlb" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (NSString *)currentSongGenre { - return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pGen" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pGen" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (NSString *)currentSongLength { - return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pTim" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + return [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pTim" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; } - (NSString *)currentSongRemaining { long duration = [[ITAppleEventCenter sharedCenter] - sendTwoTierAEWithRequestedKeyForNumber:@"pDur" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + sendTwoTierAEWithRequestedKeyForNumber:@"pDur" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; long current = [[ITAppleEventCenter sharedCenter] - sendAEWithRequestedKeyForNumber:@"pPos" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + sendAEWithRequestedKeyForNumber:@"pPos" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; return [[NSNumber numberWithLong:duration - current] stringValue]; } @@ -214,36 +215,36 @@ - (float)currentSongRating { return (float)[[ITAppleEventCenter sharedCenter] - sendTwoTierAEWithRequestedKeyForNumber:@"pRte" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]] / 100.0; + sendTwoTierAEWithRequestedKeyForNumber:@"pRte" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN] / 100.0; } - (BOOL)setCurrentSongRating:(float)rating { - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu), '----':obj { form:'prop', want:type('prop'), seld:type('pRte'), from:obj { form:'indx', want:type('cTrk'), seld:long(%lu), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } } }",(long)(rating*100),[self currentSongIndex]] eventClass:@"core" eventID:@"setd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu), '----':obj { form:'prop', want:type('prop'), seld:type('pRte'), from:obj { form:'indx', want:type('cTrk'), seld:long(%lu), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } } }",(long)(rating*100),[self currentSongIndex]] eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; return YES; } /* - (BOOL)equalizerEnabled { - int thingy = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:type('prop'), want:type('prop'), seld:type('pEQ '), from:() }" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + int thingy = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:type('prop'), want:type('prop'), seld:type('pEQ '), from:() }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; NSLog(@"Debug equalizerEnabled: %i", thingy); return thingy; } - (BOOL)setEqualizerEnabled:(BOOL)enabled { - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu), '----':obj { form:'prop', want:type('prop'), seld:type('pEQ '), from:'null'() }",enabled] eventClass:@"core" eventID:@"setd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu), '----':obj { form:'prop', want:type('prop'), seld:type('pEQ '), from:'null'() }",enabled] eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; return YES; } */ - (NSArray *)eqPresets { int i; - long numPresets = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"kocl:type('cEQP'), '----':(), &subj:()" eventClass:@"core" eventID:@"cnte" appPSN:[self iTunesPSN]]; + long numPresets = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"kocl:type('cEQP'), '----':(), &subj:()" eventClass:@"core" eventID:@"cnte" appPSN:savedPSN]; NSMutableArray *presets = [[NSMutableArray alloc] initWithCapacity:numPresets]; for (i = 1; i <= numPresets; i++) { - NSString *theObj = [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'indx', want:type('cEQP'), seld:long(%lu), from:'null'() } }",i] eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + NSString *theObj = [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'indx', want:type('cEQP'), seld:long(%lu), from:'null'() } }",i] eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; if (theObj) { [presets addObject:theObj]; } @@ -255,31 +256,31 @@ { int result; result = [[ITAppleEventCenter sharedCenter] - sendTwoTierAEWithRequestedKeyForNumber:@"pidx" fromObjectByKey:@"pEQP" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + sendTwoTierAEWithRequestedKeyForNumber:@"pidx" fromObjectByKey:@"pEQP" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; return result; } - (float)volume { - return (float)[[ITAppleEventCenter sharedCenter] sendAEWithRequestedKeyForNumber:@"pVol" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]] / 100; + return (float)[[ITAppleEventCenter sharedCenter] sendAEWithRequestedKeyForNumber:@"pVol" eventClass:@"core" eventID:@"getd" appPSN:savedPSN] / 100; } - (BOOL)setVolume:(float)volume { - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu), '----':obj { form:'prop', want:type('prop'), seld:type('pVol'), from:'null'() }",(long)(volume*100)] eventClass:@"core" eventID:@"setd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu), '----':obj { form:'prop', want:type('prop'), seld:type('pVol'), from:'null'() }",(long)(volume*100)] eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; return NO; } - (BOOL)shuffleEnabled { int result = [[ITAppleEventCenter sharedCenter] - sendTwoTierAEWithRequestedKeyForNumber:@"pShf" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + sendTwoTierAEWithRequestedKeyForNumber:@"pShf" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; return result; } - (BOOL)setShuffleEnabled:(BOOL)enabled { - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu) ----:obj { form:'prop', want:type('prop'), seld:type('pShf'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } }",enabled] eventClass:@"core" eventID:@"setd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu) ----:obj { form:'prop', want:type('prop'), seld:type('pShf'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } }",enabled] eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; return YES; } @@ -288,7 +289,7 @@ FourCharCode m00f = 0; int result = 0; m00f = [[ITAppleEventCenter sharedCenter] - sendTwoTierAEWithRequestedKeyForNumber:@"pRpt" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:[self iTunesPSN]]; + sendTwoTierAEWithRequestedKeyForNumber:@"pRpt" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; switch (m00f) { @@ -322,62 +323,62 @@ break; } - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu) ----:obj { form:'prop', want:type('pRpt'), seld:type('pShf'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } }",m00f] eventClass:@"core" eventID:@"setd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu) ----:obj { form:'prop', want:type('pRpt'), seld:type('pShf'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } }",m00f] eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; return YES; } - (BOOL)play { - [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Play" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Play" appPSN:savedPSN]; return YES; } - (BOOL)pause { - [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Paus" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Paus" appPSN:savedPSN]; return YES; } - (BOOL)goToNextSong { - [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Next" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Next" appPSN:savedPSN]; return YES; } - (BOOL)goToPreviousSong { - [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Prev" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Prev" appPSN:savedPSN]; return YES; } - (BOOL)forward { - [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Fast" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Fast" appPSN:savedPSN]; return YES; } - (BOOL)rewind { - [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Rwnd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Rwnd" appPSN:savedPSN]; return YES; } - (BOOL)switchToPlaylistAtIndex:(int)index { - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'indx', want:type('cPly'), seld:long(%lu), from:() }",index] eventClass:@"hook" eventID:@"Play" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'indx', want:type('cPly'), seld:long(%lu), from:() }",index] eventClass:@"hook" eventID:@"Play" appPSN:savedPSN]; return YES; } - (BOOL)switchToSongAtIndex:(int)index { - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'indx', want:type('cTrk'), seld:long(%lu), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:() } }",index] eventClass:@"hook" eventID:@"Play" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'indx', want:type('cTrk'), seld:long(%lu), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:() } }",index] eventClass:@"hook" eventID:@"Play" appPSN:savedPSN]; return YES; } - (BOOL)switchToEQAtIndex:(int)index { // index should count from 0, but itunes counts from 1, so let's add 1. - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pEQP'), from:'null'() }, data:obj { form:'indx', want:type('cEQP'), seld:long(%lu), from:'null'() }",(index+1)] eventClass:@"core" eventID:@"setd" appPSN:[self iTunesPSN]]; + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pEQP'), from:'null'() }, data:obj { form:'indx', want:type('cEQP'), seld:long(%lu), from:'null'() }",(index+1)] eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; return YES; } -- 2.20.1