From 26e0e0cead659a2ec3dc994089fe385e9b4983ce Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Thu, 20 Jan 2022 23:53:45 -0800 Subject: [PATCH] HDCD Decoding: Add HDCD indicator --- Application/PlaybackController.h | 1 + Application/PlaybackController.m | 40 ++++++++++++++++++++++++++++++- Audio/AudioPlayer.h | 1 + Audio/AudioPlayer.m | 5 ++++ Audio/Chain/BufferChain.m | 1 + Base.lproj/MainMenu.xib | 13 ++++++++++ Cog.xcodeproj/project.pbxproj | 4 ++++ Images/hdcdLogoTemplate.pdf | Bin 0 -> 2543 bytes Window/MainWindow.h | 5 ++++ Window/MainWindow.m | 17 +++++++++++++ Window/MiniWindow.h | 4 ++++ Window/MiniWindow.m | 19 +++++++++++++++ 12 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 Images/hdcdLogoTemplate.pdf 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 0000000000000000000000000000000000000000..fcef3adb8a246e141441725a4a7ea8e42c9eead8 GIT binary patch literal 2543 zcmai0c|25W9}lflp`uc%V+$2?&Mb$Sq|2BQr3~Vg$cclAnPHZ$H6^V?B3BD8vSuku zXrtb^b{e!urNvUBvgDQMo`br2-#^~-ndkYP=X;*#x1I0IcQh@?K*b;{0ssI+7RO733NY)1h)@&Mh3|?I3=IiFkpM-w1mDZt zSc`~Gcv0wx;W45-^NPATofRQ(07NqzRjbF31Tsg5zd1Mk_N*mZJHKi}O@GZxe&yB? zC)KXDLuGfJzVD?5e;uhEA4?pb7QxdClAT`zlyhGM5E!kn~QB-A6cC+n%F`C3X=#=)zihZT8}Tqs#3d z*=EayWa~Q=_c`u&Pk1h>t5}+t9knoi=k+H_!EM$}v%Ym}2Gw0^*73i{Jy)%8&Mtu# zx>oU1f?uA**y!yA>9mH_e7lf{M?G`mM_%l#KXv}3;bxAd!uN)>ISv`yi&GsVPuSl+ zu{NX;F01j>t6?p!>J&RjXL=Y8@oZ~(z0h2v;WvAn!&Q z4W%Wd7eVec>A}>c653_n=prM^$n^l@VHc_0EoRFVOOD>T%5GLd7bH~i{!;z3zcEZ3 zN{a1@D@@LRO6ea?@pIrtay%#QPqg=W8~fc}ahShyw0`9Dyzn#aXCK60DS)I9wCx!) ztz+vGxSY+3p71&FFyqu{$qLox2VtxVmdlZkDjq3N%d1-h{`xmEI`@={n;#Eu>NtH9 zKCCg(0Tj9>u{Xw>)4pyA$YS=UJ4uZlEL)u<%b>$o-`ss7J1StR19M3+6y$jQEj90R zDm&I0ua;GmD?4$Z08~@*LFE3G0Bg_Ab|~E<8N0$ZtLb1JJ$f4QFl& z&?nEU_BXT>Pg9EK+RNNhh#d#z>r;eXUamXOpA1S2S0{_qau(*EqkqveS=zO#PZQ-k zzRS$nw6RsbvGm=&ok-e%qJiq!&tV@I3@G<6DZNIsp>1=PJi1)1o~jA^XL`SN?kG*k z(=!QGOf$Y?XhgXtR~{{+YT@AXyN~Sa(@O3G8Rn3hT?UCQ<=dpC8b;586x6%vDcvd- zO`aMXnMtWS$-a@Z_pMP>vbD}xrn4CR?Lzanb<@MZ(B~QI}M`z`5s}Ic*_*YshM+|uk zfhNBTUcG^$T}^Ml`eK`DXjk%r*)^W++p|`DGOqdEJcVPP?&*oV9>;QtD_X>$n1y{% zTX6{v+{B8K1Z=r+g>4_$?pPJBmJr7nfk#?w`}IhV*-pHrBP)AL&vriWyRKW5LX^Lk zr6SWUB~09WvQD{WRjA+Qhvrt?E~fXkj4!VU*WXhzgq_^p9ap8cr^ky@Z!kjq1Y+%H z{c>ct%H~W5$v*DQQvC%vHrC>S!ZFRE*;==^oe$J|-{cW<=6%o2H0Amcj)g^h?BMxl zx2{P00=4tA}bl?(X_x_wKuR+-F>F{UUxN0p+<)|EObkxE$ab zfLlxjAc{T--+(X4Kh~X4S<0G4qz7%0kH)@WEcSuKy*Q{8B+}G0XAcw zX+NZ&egLA4pEn8+EfIGV&;X!Gzm|vq<%zJPKZM8vb>$$&d|$u;gFpbLQgz8R3P>RX zBoajzhV}GmB*1aW-8!|y=SC26>$>%k+n6JhXCOTz46E{em`I{ zKqL^OKUNHEmkD~1 z2XBSd&)mg$*)tr#GaOh7_^x6XOpmo(5RQNkK)MjD3j$gmB9XU{PQ;pxq3#02+k@jG z)a47@wY4V$F)+0j@dbbZi^*bvAcY2kFcTZbAgD*iEIuIY9>gpa1WA}BV`~z&=NF6N zBz#`fu9fnY2si8jd(;$)f}KFjc1d>P~ zgwIqMBI$tonjok>qcwUnS~JyK1|mYd`0kTM<9rfMGw2`Q`3g`s0to06u)L=)oJ?dY z;08=%5DmoM8h!!1pBN0&{s*Jdund0P2Z9jx#rYM3sCpO^{|lqR*o*xY!-za1hDd;L zyimd9-!f~CKZ>P{bH<9#7Xf(TQ^Ypox$yy