From f4712ad219fb56373d8e277b5ae653045dde240e Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Sun, 22 May 2022 17:24:35 -0700 Subject: [PATCH] [Visualization]: Add Spectrum window Add a dedicated spectrum visualization window, and add the necessary hooks to start its event timer if playback is already running when it is first opened. Signed-off-by: Christopher Snowhill --- Base.lproj/MainMenu.xib | 14 ++++++++-- Cog.xcodeproj/project.pbxproj | 10 ++++++++ Scenes.scnassets/Spectrum.scn | Bin 24658 -> 24651 bytes SpectrumWindow.xib | 31 ++++++++++++++++++++++ SpectrumWindowController.h | 20 +++++++++++++++ SpectrumWindowController.m | 47 ++++++++++++++++++++++++++++++++++ Visualization/SpectrumView.h | 3 +++ Visualization/SpectrumView.m | 13 ++++++++++ 8 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 SpectrumWindow.xib create mode 100644 SpectrumWindowController.h create mode 100644 SpectrumWindowController.m diff --git a/Base.lproj/MainMenu.xib b/Base.lproj/MainMenu.xib index 4fdba8404..535b9b29c 100644 --- a/Base.lproj/MainMenu.xib +++ b/Base.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -1385,6 +1385,11 @@ + + + + + @@ -2326,6 +2331,11 @@ Gw + + + + + diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index fa3aba7ac..61dfc4034 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -99,6 +99,8 @@ 8314A46F27A28C29000EBE7E /* equalizerTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 8314A46527A28C28000EBE7E /* equalizerTemplate.pdf */; }; 8316B3932839FFD5004CC392 /* Scenes.scnassets in Resources */ = {isa = PBXBuildFile; fileRef = 8316B3922839FFD5004CC392 /* Scenes.scnassets */; }; 831B99BF27C23E88005A969B /* Cog.sdef in Resources */ = {isa = PBXBuildFile; fileRef = 831B99BE27C23E88005A969B /* Cog.sdef */; }; + 83229C9F283B0095004626A8 /* SpectrumWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83229C9D283B0095004626A8 /* SpectrumWindowController.m */; }; + 83229CA0283B0095004626A8 /* SpectrumWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 83229C9E283B0095004626A8 /* SpectrumWindow.xib */; }; 832923AF279FAC400048201E /* Cog.q1.json in Resources */ = {isa = PBXBuildFile; fileRef = 832923AE279FAC400048201E /* Cog.q1.json */; }; 83293070277886250010C07E /* OpenMPTOld.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8329306D277885790010C07E /* OpenMPTOld.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 832C1253180BD1E2005507C1 /* Cog.help in Resources */ = {isa = PBXBuildFile; fileRef = 832C1252180BD1E2005507C1 /* Cog.help */; }; @@ -908,6 +910,9 @@ 8314D63B1A354DFE00EEE8E6 /* sidplay.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = sidplay.xcodeproj; path = Plugins/sidplay/sidplay.xcodeproj; sourceTree = ""; }; 8316B3922839FFD5004CC392 /* Scenes.scnassets */ = {isa = PBXFileReference; lastKnownFileType = wrapper.scnassets; path = Scenes.scnassets; sourceTree = ""; }; 831B99BE27C23E88005A969B /* Cog.sdef */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Cog.sdef; sourceTree = ""; }; + 83229C9C283B0095004626A8 /* SpectrumWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SpectrumWindowController.h; sourceTree = ""; }; + 83229C9D283B0095004626A8 /* SpectrumWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SpectrumWindowController.m; sourceTree = ""; }; + 83229C9E283B0095004626A8 /* SpectrumWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SpectrumWindow.xib; sourceTree = ""; }; 832923AE279FAC400048201E /* Cog.q1.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Cog.q1.json; sourceTree = ""; }; 83293065277885790010C07E /* OpenMPTOld.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OpenMPTOld.xcodeproj; path = Plugins/OpenMPT.old/OpenMPTOld.xcodeproj; sourceTree = ""; }; 832C1252180BD1E2005507C1 /* Cog.help */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Cog.help; sourceTree = ""; }; @@ -1811,6 +1816,9 @@ 8377C66127B8CF6300E8BC0F /* SpectrumView.m */, 8377C6B727B900F000E8BC0F /* SpectrumItem.h */, 8377C6B827B900F000E8BC0F /* SpectrumItem.m */, + 83229C9C283B0095004626A8 /* SpectrumWindowController.h */, + 83229C9D283B0095004626A8 /* SpectrumWindowController.m */, + 83229C9E283B0095004626A8 /* SpectrumWindow.xib */, ); name = Visualization; sourceTree = ""; @@ -2493,6 +2501,7 @@ 17D1B2810CF8B2830028F5B5 /* song.icns in Resources */, 831B99BF27C23E88005A969B /* Cog.sdef in Resources */, 832923AF279FAC400048201E /* Cog.q1.json in Resources */, + 83229CA0283B0095004626A8 /* SpectrumWindow.xib in Resources */, 836F462A28207FA4005B9B87 /* PauseColorful.png in Resources */, 17D1B2820CF8B2830028F5B5 /* vg.icns in Resources */, 17D1B2830CF8B2830028F5B5 /* xm.icns in Resources */, @@ -2597,6 +2606,7 @@ 171EFE8C0F59FEAE000ADC42 /* DockIconController.m in Sources */, 17F6C8070F603701000D9DA9 /* PlaybackEventController.m in Sources */, 83BC5AB220E4C87100631CD4 /* DualWindow.m in Sources */, + 83229C9F283B0095004626A8 /* SpectrumWindowController.m in Sources */, 835F00BB279BD1CD00055FCF /* SecondsFormatter.m in Sources */, 1784560F0F631E24007E8021 /* FileTreeViewController.m in Sources */, 178456120F631E31007E8021 /* SideViewController.m in Sources */, diff --git a/Scenes.scnassets/Spectrum.scn b/Scenes.scnassets/Spectrum.scn index 3c472cf157c44669244f6a6772fe238c6170171e..deb91c1deedb394297a0248f2d8e155bf336d8e6 100644 GIT binary patch delta 1048 zcmXw#eN5F=7{|{KpJ%+w#TTZ$6mKF#fJ$11B-hI&)89G2`<%mXft$9=%O7oI%%E0A zU^+unCjP34Yic)gZpEmsrMZk-xl$oRgvwq(OoX*^YVlU|@*~H2_Wgc#zUS;b&rVN3 z>kMe`HffRd&;Z+^5%z(AlU9osU(a?z5qt?}Sq_|o^Uw)(&;{MB7kZ%&zJYJyJGczr z!;f$chTuAeU?_%RI7VP3&c-NoU^LFbxi}B!V+_k?i&zORz)Y5f_hJ@iV-7CCrML`p z@jhJ6(s2c@#MM}UE;Ds=ZB^BPe?`!%?p1cXYE}Zttk?D}womV~p&Fio8mQIQ+3C~p zjGZllXYI4+V5{xV+p2>X{K0FFgB8$~V;j6!s$9b5eWG%U*9Y6I6rL7U%?6pYYswxj z175O9cw*8nHp<4>IGbRDu-nc`CK7cm=5|N?dS8xHo_HQ!kw3v&~vr#BsTjMROsx0)@c;AGJaLKym$xr&h z#~x?yOKcMGZ|Ab)n*zl#&pcEURJxNhs6i1g~emx z53(4{V{c$SK4it3l_^eKV+v(T-G@%*?qLPYiG}DcvHw$*S8lHKVWHn=4u#a8);shw z`Z>K*@7DYDetke6(SOr#>*M+q*LVnz=5aicoBUB;$~W-G_yK;1AK^aU%8&B5`8)h0 zeuZD<*Z6fl!hhkv@*Dgnzs>*PV|;@D$*1@~f{7pjB2#3E9I;g7isj;du~OuTe6dxE0W#lzwev0iXt2omL@TI>-m;;`rtouXg-Y|JtoMy#>eSZ3rI1%}I5YpgdsMyXL| zRCu~Qmp#Lt8=g@LrP(x>7El5u(LIzytH?<%a??7}NsxysXa_aZ`*fT>q?2@tKBiA7 zK=q%|8Tx|G(s}Bl3)D@w=yw{WahjyR=x_R0YI2rD87xC(xQvuhGFqm|d|4tZ$Qb&|ewW_1)n0im0 zQlG0XUG=GcHLPx`$>N~m@Zx#JF=mK4-%Kzw%uF-O%rR@sI&-_(Xf~S%+5amj=nk>y J4rkmv{2!C2T<8D* delta 1106 zcmXw13s6->7~VtwFE7C>!Yxq}uR@RtM5Jbfye=_xcF*12dm3y42Z>2$%%Y&T-WxfN zoVT z30zKMa0RZyR7}H6eeuS!4c;W5J@#aH6-r1h*hssnubbL#&f}m2N}&wiP;$)boA8!d zi-LE|-n;Ogshdo02A9`2`*T2B%7IhDIIT)cIef52X0VKcmy2F2@IbloFpYMUkZvMO zOqu~>VH?SHEACK#o69vd)kXS9KebBVusbhqi| z2C&l%w#)dKM*4jOwQ#D=5@MX8HXo=luFx1GfQ9>e;kb#DaNN6u#VU9SE<>|-jkZa# zwnAGTleDa~VBLnI%!1N_YG{RaqtEg5!e2e4nAqD$9?3TYbU`;M^uX_M#a-`i@W3C? zW90Dk=xZ=e3hOMh;5z&bH=qyt;U)~gEf|C$7>3(00;4cye8z1NcVJ=~WF1UQ6Y*Zv zJIG&AqQl9SI*SG8;e3oRxd0<^q3MfoF-DpG2*zM6K5A^0756TIPa2`l(ZHvO6_d#! zOu^Mgm|nCf9W!($b)kANo!DDRDoH~-X62f1APb8&7J1O_t(+(4+JO{gj@ez4R)* zPH)hDIzR{MFdd;|^bY-p{!6Er!X9AAe3?H>V2Lb=EoUp)DwfPrSSm|rnJ$*avRMvO z8DkD6n3Fxn*0VBJ$quj@c8)c(9(GOh)55d`+EQ(Wma5scY>jFTP1o|Zm$YI>hoj5U z=NNWO@L)cNKg1)rjYso%p2X957SHB6T;rTeuJdAE!FTg7_?P@N|BBc1ulYCJ^({Zo z8+jAI$S?C2-o`ulC?Dq&e3IWazow4>F+=!?05MYp3yTO5p~5Pbh;)%BiiKP3701L` z(IY10Y#A$8%4cQ1Tr1bh?Q)0QB`c*NKaqRnKDl33$%FEctd_O%uskA<%471Rtd|#< zY>}O^NA}4PdDrRdv^eKF=jlOuxNg(q^aMRoPtxDk%k^#g4t=+Nko-S` GulWyt)O5T6 diff --git a/SpectrumWindow.xib b/SpectrumWindow.xib new file mode 100644 index 000000000..c2f474ed0 --- /dev/null +++ b/SpectrumWindow.xib @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SpectrumWindowController.h b/SpectrumWindowController.h new file mode 100644 index 000000000..621fce94c --- /dev/null +++ b/SpectrumWindowController.h @@ -0,0 +1,20 @@ +// +// SpectrumWindowController.h +// Cog +// +// Created by Christopher Snowhill on 5/22/22. +// + +#import + +#import "PlaybackController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface SpectrumWindowController : NSWindowController { + IBOutlet PlaybackController *playbackController; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SpectrumWindowController.m b/SpectrumWindowController.m new file mode 100644 index 000000000..fb180fbf6 --- /dev/null +++ b/SpectrumWindowController.m @@ -0,0 +1,47 @@ +// +// SpectrumWindowController.m +// Cog +// +// Created by Christopher Snowhill on 5/22/22. +// + +#import "SpectrumWindowController.h" + +#import "SpectrumView.h" + +@interface SpectrumWindowController () +@property SpectrumView *spectrumView; +@end + +@implementation SpectrumWindowController + +- (id)init { + return [super initWithWindowNibName:@"SpectrumWindow"]; +} + +- (void)windowDidLoad { + [super windowDidLoad]; + + self.spectrumView = [[SpectrumView alloc] initWithFrame:[[self window] frame]]; + [[self window] setContentView:self.spectrumView]; + + [self.spectrumView enableCameraControl]; + + if(playbackController.playbackStatus == CogStatusPlaying) + [self.spectrumView startPlayback]; +} + +- (IBAction)toggleWindow:(id)sender { + if([[self window] isVisible]) + [[self window] orderOut:self]; + else + [self showWindow:self]; +} + +- (IBAction)showWindow:(id)sender { + if(self.spectrumView && playbackController.playbackStatus == CogStatusPlaying) + [self.spectrumView startPlayback]; + return [super showWindow:sender]; +} + +@end diff --git a/Visualization/SpectrumView.h b/Visualization/SpectrumView.h index f32c6e1d4..5ec135b60 100644 --- a/Visualization/SpectrumView.h +++ b/Visualization/SpectrumView.h @@ -15,6 +15,9 @@ NS_ASSUME_NONNULL_BEGIN @interface SpectrumView : SCNView @property(nonatomic) BOOL isListening; + +- (void)enableCameraControl; +- (void)startPlayback; @end NS_ASSUME_NONNULL_END diff --git a/Visualization/SpectrumView.m b/Visualization/SpectrumView.m index 3ef5b721b..193f75a18 100644 --- a/Visualization/SpectrumView.m +++ b/Visualization/SpectrumView.m @@ -25,6 +25,7 @@ extern NSString *CogPlaybackDidStopNotficiation; BOOL stopped; BOOL isListening; BOOL bandsReset; + BOOL cameraControlEnabled; NSColor *backgroundColor; ddb_analyzer_t _analyzer; @@ -114,12 +115,18 @@ extern NSString *CogPlaybackDidStopNotficiation; } } +- (void)enableCameraControl { + [self setAllowsCameraControl:YES]; + cameraControlEnabled = YES; +} + - (void)setup { visController = [NSClassFromString(@"VisualizationController") sharedController]; timer = nil; stopped = YES; paused = NO; isListening = NO; + cameraControlEnabled = NO; [self setBackgroundColor:[NSColor clearColor]]; @@ -238,6 +245,10 @@ extern NSString *CogPlaybackDidStopNotficiation; [self repaint]; } +- (void)startPlayback { + [self playbackDidBegin:nil]; +} + - (void)playbackDidBegin:(NSNotification *)notification { stopped = NO; paused = NO; @@ -331,6 +342,8 @@ extern NSString *CogPlaybackDidStopNotficiation; } - (void)mouseDown:(NSEvent *)event { + if(cameraControlEnabled) return; + BOOL freqMode = ![[NSUserDefaults standardUserDefaults] boolForKey:@"spectrumFreqMode"]; [[NSUserDefaults standardUserDefaults] setBool:freqMode forKey:@"spectrumFreqMode"];