diff --git a/Application/PlaybackController.h b/Application/PlaybackController.h index 49d3ad43e..bb0112e8e 100644 --- a/Application/PlaybackController.h +++ b/Application/PlaybackController.h @@ -42,6 +42,7 @@ extern NSDictionary * makeRGInfo(PlaylistEntry *pe); IBOutlet NSArrayController *outputDevices; NSTimer *positionTimer; + NSTimer *hdcdLogoTimer; AudioPlayer *audioPlayer; diff --git a/Application/PlaybackController.m b/Application/PlaybackController.m index 5f61d2c68..1c295e7e3 100644 --- a/Application/PlaybackController.m +++ b/Application/PlaybackController.m @@ -8,6 +8,9 @@ #import "PlaylistEntry.h" #import "PlaylistLoader.h" +#import "MainWindow.h" +#import "MiniWindow.h" + #import #import #import @@ -114,6 +117,12 @@ NSString *CogPlaybackDidStopNotficiation = @"CogPlaybackDidStopNotficiation"; [self setPlaybackStatus: CogStatusPaused]; [self sendMetaData]; + + if (hdcdLogoTimer) + { + [hdcdLogoTimer invalidate]; + hdcdLogoTimer = nil; + } } - (IBAction)resume:(id)sender @@ -131,6 +140,8 @@ NSString *CogPlaybackDidStopNotficiation = @"CogPlaybackDidStopNotficiation"; [audioPlayer stop]; [self sendMetaData]; + + [self removeHDCD:nil]; } //called by double-clicking on table @@ -766,7 +777,7 @@ NSDictionary * makeRGInfo(PlaylistEntry *pe) lastPosition = -10; [self setPosition:0]; - + [[NSNotificationCenter defaultCenter] postNotificationName:CogPlaybackDidBeginNotficiation object:pe]; } @@ -775,6 +786,7 @@ NSDictionary * makeRGInfo(PlaylistEntry *pe) int status = [s intValue]; if (status == CogStatusStopped || status == CogStatusPaused) { + [self removeHDCD:nil]; if (positionTimer) { [positionTimer invalidate]; @@ -836,6 +848,32 @@ NSDictionary * makeRGInfo(PlaylistEntry *pe) [self sendMetaData]; } +- (void)audioPlayer:(AudioPlayer *)player sustainHDCD:(id)userInfo +{ + MainWindow * mainWindow = (MainWindow *) appController.mainWindow; + [mainWindow showHDCDLogo:YES]; + MiniWindow * miniWindow = (MiniWindow *) appController.miniWindow; + [miniWindow showHDCDLogo:YES]; + + if (hdcdLogoTimer) + { + [hdcdLogoTimer invalidate]; + hdcdLogoTimer = nil; + } + + hdcdLogoTimer = [NSTimer timerWithTimeInterval:10.0 target:self selector:@selector(removeHDCD:) userInfo:nil repeats:NO]; +} + +- (void)removeHDCD:(id)sender +{ + MainWindow * mainWindow = (MainWindow *) appController.mainWindow; + [mainWindow showHDCDLogo:NO]; + MiniWindow * miniWindow = (MiniWindow *) appController.miniWindow; + [miniWindow showHDCDLogo:NO]; + [hdcdLogoTimer invalidate]; + hdcdLogoTimer = nil; +} + - (void)playlistDidChange:(PlaylistController *)p { [audioPlayer resetNextStreams]; diff --git a/Audio/AudioPlayer.h b/Audio/AudioPlayer.h index 5127dbf14..0b00aaeab 100644 --- a/Audio/AudioPlayer.h +++ b/Audio/AudioPlayer.h @@ -119,6 +119,7 @@ - (void)audioPlayer:(AudioPlayer *)player displayEqualizer:(AudioUnit)eq; - (void)audioPlayer:(AudioPlayer *)player refreshEqualizer:(AudioUnit)eq; - (void)audioPlayer:(AudioPlayer *)player removeEqualizer:(AudioUnit)eq; +- (void)audioPlayer:(AudioPlayer *)player sustainHDCD:(id)userInfo; @end diff --git a/Audio/AudioPlayer.m b/Audio/AudioPlayer.m index 2d647e37f..f6e9efd65 100644 --- a/Audio/AudioPlayer.m +++ b/Audio/AudioPlayer.m @@ -518,6 +518,11 @@ [self sendDelegateMethod:@selector(audioPlayer:didChangeStatus:userInfo:) withObject:[NSNumber numberWithInt:status] withObject:[bufferChain userInfo] waitUntilDone:wait]; } +- (void)sustainHDCD +{ + [self sendDelegateMethod:@selector(audioPlayer:sustainHDCD:) withObject:[bufferChain userInfo] waitUntilDone:NO]; +} + - (void)setPlaybackStatus:(int)status { [self setPlaybackStatus:status waitUntilDone:NO]; diff --git a/Audio/Chain/BufferChain.m b/Audio/Chain/BufferChain.m index e4535caab..1b051ab5b 100644 --- a/Audio/Chain/BufferChain.m +++ b/Audio/Chain/BufferChain.m @@ -246,6 +246,7 @@ { OutputNode * outputNode = (OutputNode *) [controller output]; [outputNode sustainHDCD]; + [controller sustainHDCD]; } @end diff --git a/Base.lproj/MainMenu.xib b/Base.lproj/MainMenu.xib index f0f222589..a58403b39 100644 --- a/Base.lproj/MainMenu.xib +++ b/Base.lproj/MainMenu.xib @@ -826,8 +826,13 @@ + + + + + @@ -856,6 +861,7 @@ + @@ -1020,8 +1026,13 @@ + + + + + @@ -1042,6 +1053,7 @@ + @@ -2135,6 +2147,7 @@ Gw + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05T diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index a2d043ae3..092318d85 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -171,6 +171,7 @@ 83E5E54C18087CA5001F3284 /* miniModeOffTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 83E5E54A18087CA5001F3284 /* miniModeOffTemplate.pdf */; }; 83E5E54D18087CA5001F3284 /* miniModeOnTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 83E5E54B18087CA5001F3284 /* miniModeOnTemplate.pdf */; }; 83E88FD227945204003D6FE5 /* AUPlayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83E88FD027945204003D6FE5 /* AUPlayerView.m */; }; + 83ED3AD1279A91C000904199 /* hdcdLogoTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 83ED3AC7279A91C000904199 /* hdcdLogoTemplate.pdf */; }; 83F9D8071A884C54007ABEC2 /* SilenceDecoder.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83F9D7F61A884B46007ABEC2 /* SilenceDecoder.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; @@ -1008,6 +1009,7 @@ 83E5EFAC1FFEF78100659F0F /* OpenMPT.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OpenMPT.xcodeproj; path = Plugins/OpenMPT/OpenMPT.xcodeproj; sourceTree = ""; }; 83E88FD027945204003D6FE5 /* AUPlayerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AUPlayerView.m; path = Window/AUPlayerView.m; sourceTree = ""; }; 83E88FD127945204003D6FE5 /* AUPlayerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUPlayerView.h; path = Window/AUPlayerView.h; sourceTree = ""; }; + 83ED3AC7279A91C000904199 /* hdcdLogoTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = hdcdLogoTemplate.pdf; path = Images/hdcdLogoTemplate.pdf; sourceTree = ""; }; 83F9D7F11A884B44007ABEC2 /* SilenceDecoder.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SilenceDecoder.xcodeproj; path = Plugins/SilenceDecoder/SilenceDecoder.xcodeproj; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8E07AB760AAC930B00A4B32F /* PreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PreferencesController.h; path = Preferences/PreferencesController.h; sourceTree = ""; }; @@ -1200,6 +1202,7 @@ 177EC02D0B8BC2E60000BC8C /* Images */ = { isa = PBXGroup; children = ( + 83ED3AC7279A91C000904199 /* hdcdLogoTemplate.pdf */, 83E5E54A18087CA5001F3284 /* miniModeOffTemplate.pdf */, 83E5E54B18087CA5001F3284 /* miniModeOnTemplate.pdf */, 8384916F180843B200E7332D /* pauseDockBadgeColorful.png */, @@ -2399,6 +2402,7 @@ 17D1B2810CF8B2830028F5B5 /* song.icns in Resources */, 17D1B2820CF8B2830028F5B5 /* vg.icns in Resources */, 17D1B2830CF8B2830028F5B5 /* xm.icns in Resources */, + 83ED3AD1279A91C000904199 /* hdcdLogoTemplate.pdf in Resources */, 83849172180843B200E7332D /* pauseDockBadgeColorful.png in Resources */, 8384916318083EAB00E7332D /* repeatModeAlbumTemplate.pdf in Resources */, 8384916B18083EAB00E7332D /* stopDockBadge.png in Resources */, diff --git a/Images/hdcdLogoTemplate.pdf b/Images/hdcdLogoTemplate.pdf new file mode 100644 index 000000000..fcef3adb8 Binary files /dev/null and b/Images/hdcdLogoTemplate.pdf differ diff --git a/Window/MainWindow.h b/Window/MainWindow.h index 51b6c2760..fb2531688 100644 --- a/Window/MainWindow.h +++ b/Window/MainWindow.h @@ -10,6 +10,11 @@ @interface MainWindow : NSWindow { IBOutlet NSView *playlistView; + IBOutlet NSToolbar *mainToolbar; + + NSImage *hdcdLogo; } +- (void)showHDCDLogo:(BOOL)show; + @end diff --git a/Window/MainWindow.m b/Window/MainWindow.m index 9a5da77d4..495379f4a 100644 --- a/Window/MainWindow.m +++ b/Window/MainWindow.m @@ -27,6 +27,23 @@ [super awakeFromNib]; [playlistView setNextResponder:self]; + + hdcdLogo = [NSImage imageNamed:@"hdcdLogoTemplate"]; + + [self showHDCDLogo:NO]; +} + +- (void)showHDCDLogo:(BOOL)show +{ + for (NSToolbarItem * toolbarItem in [mainToolbar items]) + { + if ([[toolbarItem itemIdentifier] isEqualToString:@"hdcd"]) { + if (show) + [toolbarItem setImage:hdcdLogo]; + else + [toolbarItem setImage:nil]; + } + } } @end diff --git a/Window/MiniWindow.h b/Window/MiniWindow.h index 1b2ee588c..043594dd5 100644 --- a/Window/MiniWindow.h +++ b/Window/MiniWindow.h @@ -11,6 +11,10 @@ @interface MiniWindow : NSWindow { IBOutlet PlaybackController *playbackController; + IBOutlet NSToolbar *miniToolbar; + NSImage *hdcdLogo; } +- (void)showHDCDLogo:(BOOL)show; + @end diff --git a/Window/MiniWindow.m b/Window/MiniWindow.m index db82b8ebc..6ac34cd19 100644 --- a/Window/MiniWindow.m +++ b/Window/MiniWindow.m @@ -25,11 +25,18 @@ [self setContentMinSize:NSMakeSize(325, 1)]; [self setContentMaxSize:NSMakeSize(CGFLOAT_MAX, 1)]; [self setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary]; + + hdcdLogo = [NSImage imageNamed:@"hdcdLogoTemplate"]; } return self; } +- (void)awakeFromNib +{ + [self showHDCDLogo:NO]; +} + - (void)toggleToolbarShown:(id)sender { // Mini window IS the toolbar, no point in hiding it. // Do nothing! @@ -76,5 +83,17 @@ } } +- (void)showHDCDLogo:(BOOL)show +{ + for (NSToolbarItem * toolbarItem in [miniToolbar items]) + { + if ([[toolbarItem itemIdentifier] isEqualToString:@"hdcd"]) { + if (show) + [toolbarItem setImage:hdcdLogo]; + else + [toolbarItem setImage:nil]; + } + } +} @end