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 3c472cf15..deb91c1de 100644 Binary files a/Scenes.scnassets/Spectrum.scn and b/Scenes.scnassets/Spectrum.scn differ 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"];