diff --git a/Application/AppController.h b/Application/AppController.h index f0fbb1540..74552e982 100644 --- a/Application/AppController.h +++ b/Application/AppController.h @@ -103,6 +103,9 @@ - (void)showPathSuggester; + (void)globalShowPathSuggester; +- (IBAction)showRubberbandSettings:(id)sender; +- (void)globalShowRubberbandSettings; + @property NSWindow *mainWindow; @property NSWindow *miniWindow; diff --git a/Application/AppController.m b/Application/AppController.m index edfd81368..e2dff470a 100644 --- a/Application/AppController.m +++ b/Application/AppController.m @@ -11,6 +11,7 @@ #import "PlaylistEntry.h" #import "PlaylistLoader.h" #import "PlaylistView.h" +#import "RubberbandEngineTransformer.h" #import "SQLiteStore.h" #import "SandboxBroker.h" #import "SpotlightWindowController.h" @@ -71,6 +72,14 @@ static AppController *kAppController = nil; NSValueTransformer *numberHertzToStringTransformer = [[NumberHertzToStringTransformer alloc] init]; [NSValueTransformer setValueTransformer:numberHertzToStringTransformer forName:@"NumberHertzToStringTransformer"]; + + NSValueTransformer *rubberbandEngineEnabledTransformer = [[RubberbandEngineEnabledTransformer alloc] init]; + [NSValueTransformer setValueTransformer:rubberbandEngineEnabledTransformer + forName:@"RubberbandEngineEnabledTransformer"]; + + NSValueTransformer *rubberbandEngineHiddenTransformer = [[RubberbandEngineHiddenTransformer alloc] init]; + [NSValueTransformer setValueTransformer:rubberbandEngineHiddenTransformer + forName:@"RubberbandEngineHiddenTransformer"]; } - (id)init { self = [super init]; @@ -801,4 +810,12 @@ static AppController *kAppController = nil; [kAppController showPathSuggester]; } +- (void)showRubberbandSettings:(id)sender { + [preferencesController showRubberbandSettings:sender]; +} + ++ (void)globalShowRubberbandSettings { + [kAppController showRubberbandSettings:kAppController]; +} + @end diff --git a/Application/PlaybackController.m b/Application/PlaybackController.m index 96ed25614..cc2dfe0eb 100644 --- a/Application/PlaybackController.m +++ b/Application/PlaybackController.m @@ -100,7 +100,7 @@ NSString *CogPlaybackDidStopNotificiation = @"CogPlaybackDidStopNotificiation"; @"volumeLimit": @(YES), @"enableHrtf": @(NO), @"enableHeadTracking": @(NO), - @"rubberbandEngine": @"faster", + /*@"rubberbandEngine": @"faster",*/ @"rubberbandTransients": @"crisp", @"rubberbandDetector": @"compound", @"rubberbandPhase": @"laminar", diff --git a/Audio/Chain/DSP/DSPRubberbandNode.m b/Audio/Chain/DSP/DSPRubberbandNode.m index da52fe809..67d4b10d4 100644 --- a/Audio/Chain/DSP/DSPRubberbandNode.m +++ b/Audio/Chain/DSP/DSPRubberbandNode.m @@ -16,6 +16,8 @@ static void * kDSPRubberbandNodeContext = &kDSPRubberbandNodeContext; @implementation DSPRubberbandNode { + BOOL enableRubberband; + RubberBandState ts; RubberBandOptions tslastoptions, tsnewoptions; size_t blockSize, toDrop, samplesBuffered, tschannels; @@ -44,6 +46,8 @@ static void * kDSPRubberbandNodeContext = &kDSPRubberbandNodeContext; self = [super initWithController:c previous:p latency:latency]; if(self) { NSUserDefaults *defaults = [[NSUserDefaultsController sharedUserDefaultsController] defaults]; + enableRubberband = ![[defaults stringForKey:@"rubberbandEngine"] isEqualToString:@"disabled"]; + pitch = [defaults doubleForKey:@"pitch"]; tempo = [defaults doubleForKey:@"tempo"]; @@ -106,7 +110,9 @@ static void * kDSPRubberbandNodeContext = &kDSPRubberbandNodeContext; tempo = [defaults doubleForKey:@"tempo"]; tsapplynewoptions = YES; } else if([[keyPath substringToIndex:17] isEqualToString:@"values.rubberband"]) { - if(ts) { + NSUserDefaults *defaults = [[NSUserDefaultsController sharedUserDefaultsController] defaults]; + enableRubberband = ![[defaults stringForKey:@"rubberbandEngine"] isEqualToString:@"disabled"]; + if(enableRubberband && ts) { RubberBandOptions options = [self getRubberbandOptions]; RubberBandOptions changed = options ^ tslastoptions; if(changed) { @@ -348,7 +354,9 @@ static void * kDSPRubberbandNodeContext = &kDSPRubberbandNodeContext; [self writeChunk:chunk]; chunk = nil; } - if(tsrestartengine) { + if(!enableRubberband && ts) { + [self fullShutdown]; + } else if(tsrestartengine) { [self fullShutdown]; } else if(tsapplynewoptions) { [self partialInit]; @@ -373,7 +381,8 @@ static void * kDSPRubberbandNodeContext = &kDSPRubberbandNodeContext; return nil; } - if(!ts || memcmp(&inputFormat, &lastInputFormat, sizeof(inputFormat)) != 0 || + if((enableRubberband && !ts) || + memcmp(&inputFormat, &lastInputFormat, sizeof(inputFormat)) != 0 || inputChannelConfig != lastInputChannelConfig) { lastInputFormat = inputFormat; lastInputChannelConfig = inputChannelConfig; @@ -384,6 +393,11 @@ static void * kDSPRubberbandNodeContext = &kDSPRubberbandNodeContext; } } + if(!ts) { + processEntered = NO; + return [self readChunk:4096]; + } + size_t samplesToProcess = rubberband_get_samples_required(ts); if(samplesToProcess > blockSize) samplesToProcess = blockSize; diff --git a/Base.lproj/MainMenu.xib b/Base.lproj/MainMenu.xib index e4d3b903c..ff02fe14c 100644 --- a/Base.lproj/MainMenu.xib +++ b/Base.lproj/MainMenu.xib @@ -21,27 +21,27 @@ - + - + - + - + - + - + @@ -54,11 +54,11 @@ - + - + @@ -95,7 +95,7 @@ - + @@ -127,7 +127,7 @@ - + @@ -141,11 +141,11 @@ - + - + @@ -171,7 +171,7 @@ - + @@ -185,11 +185,11 @@ - + - + @@ -259,7 +259,7 @@ - + @@ -273,11 +273,11 @@ - + - + @@ -347,7 +347,7 @@ - + @@ -361,11 +361,11 @@ - + - + @@ -391,7 +391,7 @@ - + @@ -404,11 +404,11 @@ - + - + @@ -435,7 +435,7 @@ - + @@ -448,11 +448,11 @@ - + - + @@ -475,7 +475,7 @@ - + @@ -489,11 +489,11 @@ - + - + @@ -516,7 +516,7 @@ - + @@ -529,11 +529,11 @@ - + - + @@ -556,7 +556,7 @@ - + @@ -569,11 +569,11 @@ - + - + @@ -592,12 +592,12 @@ - + @@ -905,7 +905,7 @@ - + @@ -2617,6 +2617,11 @@ Gw + + + RubberbandEngineEnabledTransformer + + @@ -2629,6 +2634,11 @@ Gw + + + RubberbandEngineEnabledTransformer + + @@ -2637,6 +2647,11 @@ Gw + + + RubberbandEngineEnabledTransformer + + @@ -2649,10 +2664,31 @@ Gw + + + RubberbandEngineEnabledTransformer + + + + + - + diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index cac9bda0f..3f9adc5c8 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -161,6 +161,7 @@ 839B837F286D7F8D00F529EE /* NumberHertzToStringTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 839B837E286D7F8D00F529EE /* NumberHertzToStringTransformer.swift */; }; 839DA7CF274A2D4C001B18E5 /* NSDictionary+Merge.m in Sources */ = {isa = PBXBuildFile; fileRef = 839DA7CE274A2D4C001B18E5 /* NSDictionary+Merge.m */; }; 839E56F52879625100DFB5F4 /* SADIE_D02-96000.mhr in Resources */ = {isa = PBXBuildFile; fileRef = 839E56F12879625100DFB5F4 /* SADIE_D02-96000.mhr */; }; + 839E876E2D5DA0AC00A13526 /* RubberbandEngineTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 839E876D2D5DA0AC00A13526 /* RubberbandEngineTransformer.m */; }; 83A360B220E4E81D00192DAB /* Flac.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8303A30C20E4E3D000951EF8 /* Flac.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 83A3B734283AE89000CC6593 /* ColorToValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 83A3B72F283AE6AA00CC6593 /* ColorToValueTransformer.m */; }; 83AA7D04279EBCA900087AA4 /* libavcodec.61.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83AA7D00279EBC8200087AA4 /* libavcodec.61.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; @@ -1001,6 +1002,8 @@ 839DA7CE274A2D4C001B18E5 /* NSDictionary+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+Merge.m"; sourceTree = ""; }; 839E3B53286595D700880EA2 /* GeneralPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GeneralPane.h; path = Preferences/Preferences/GeneralPane.h; sourceTree = ""; }; 839E56F12879625100DFB5F4 /* SADIE_D02-96000.mhr */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SADIE_D02-96000.mhr"; sourceTree = ""; }; + 839E876C2D5DA0AC00A13526 /* RubberbandEngineTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RubberbandEngineTransformer.h; path = Preferences/Preferences/RubberbandEngineTransformer.h; sourceTree = ""; }; + 839E876D2D5DA0AC00A13526 /* RubberbandEngineTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RubberbandEngineTransformer.m; path = Preferences/Preferences/RubberbandEngineTransformer.m; sourceTree = ""; }; 83A3B72F283AE6AA00CC6593 /* ColorToValueTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ColorToValueTransformer.m; path = Preferences/Preferences/ColorToValueTransformer.m; sourceTree = ""; }; 83A3B733283AE6AA00CC6593 /* ColorToValueTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ColorToValueTransformer.h; path = Preferences/Preferences/ColorToValueTransformer.h; sourceTree = ""; }; 83AA7D00279EBC8200087AA4 /* libavcodec.61.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.61.dylib; path = ThirdParty/ffmpeg/lib/libavcodec.61.dylib; sourceTree = ""; }; @@ -1407,6 +1410,8 @@ 17E0D5F60F520F42005B6FED /* Transformers */ = { isa = PBXGroup; children = ( + 839E876C2D5DA0AC00A13526 /* RubberbandEngineTransformer.h */, + 839E876D2D5DA0AC00A13526 /* RubberbandEngineTransformer.m */, 83A3B733283AE6AA00CC6593 /* ColorToValueTransformer.h */, 83A3B72F283AE6AA00CC6593 /* ColorToValueTransformer.m */, 17E0D6120F520F87005B6FED /* FontSizetoLineHeightTransformer.h */, @@ -2559,6 +2564,7 @@ 838A337D2D06C14200D0D770 /* TempoSlider.m in Sources */, 838A337E2D06C14200D0D770 /* PitchSlider.m in Sources */, 838A33832D06CF4100D0D770 /* SpectrumViewCG.m in Sources */, + 839E876E2D5DA0AC00A13526 /* RubberbandEngineTransformer.m in Sources */, 838A33842D06CF4100D0D770 /* SpectrumWindowController.m in Sources */, 83B61E2829A82A0200CD0580 /* LyricsWindowController.m in Sources */, 56462EB20D634206000AB68C /* SpotlightPlaylistController.m in Sources */, diff --git a/Preferences/Preferences/Base.lproj/Preferences.xib b/Preferences/Preferences/Base.lproj/Preferences.xib index fe9f4a547..dcb6d1314 100644 --- a/Preferences/Preferences/Base.lproj/Preferences.xib +++ b/Preferences/Preferences/Base.lproj/Preferences.xib @@ -17,6 +17,7 @@ + @@ -1193,9 +1194,9 @@ - + - RubberbandEngineTransformer + RubberbandEngineR3Transformer @@ -1218,9 +1219,9 @@ - + - RubberbandEngineTransformer + RubberbandEngineR3Transformer @@ -1235,9 +1236,9 @@ - + - RubberbandEngineTransformer + RubberbandEngineR3Transformer @@ -1260,9 +1261,9 @@ - + - RubberbandEngineTransformer + RubberbandEngineR3Transformer @@ -1277,9 +1278,9 @@ - + - RubberbandEngineTransformer + RubberbandEngineR3Transformer @@ -1302,9 +1303,9 @@ - + - RubberbandEngineTransformer + RubberbandEngineR3Transformer @@ -1318,6 +1319,13 @@ + + + + RubberbandEngineEnabledTransformer + + + @@ -1337,6 +1345,11 @@ + + + RubberbandEngineEnabledTransformer + + @@ -1349,9 +1362,9 @@ - + - RubberbandEngineTransformer + RubberbandEngineR3Transformer @@ -1374,9 +1387,9 @@ - + - RubberbandEngineTransformer + RubberbandEngineR3Transformer @@ -1390,6 +1403,13 @@ + + + + RubberbandEngineEnabledTransformer + + + @@ -1409,6 +1429,11 @@ + + + RubberbandEngineEnabledTransformer + + @@ -1420,6 +1445,13 @@ + + + + RubberbandEngineEnabledTransformer + + + @@ -1439,6 +1471,11 @@ + + + RubberbandEngineEnabledTransformer + + @@ -1450,6 +1487,13 @@ + + + + RubberbandEngineEnabledTransformer + + + @@ -1469,6 +1513,11 @@ + + + RubberbandEngineEnabledTransformer + + diff --git a/Preferences/Preferences/GeneralPreferencesPlugin.m b/Preferences/Preferences/GeneralPreferencesPlugin.m index 6b8c04615..a89a43825 100644 --- a/Preferences/Preferences/GeneralPreferencesPlugin.m +++ b/Preferences/Preferences/GeneralPreferencesPlugin.m @@ -27,9 +27,13 @@ [NSValueTransformer setValueTransformer:timeIntervalToStringTransformer forName:@"TimeIntervalToStringTransformer"]; - NSValueTransformer *rubberbandEngineTransformer = [[RubberbandEngineTransformer alloc] init]; - [NSValueTransformer setValueTransformer:rubberbandEngineTransformer - forName:@"RubberbandEngineTransformer"]; + NSValueTransformer *rubberbandEngineR3Transformer = [[RubberbandEngineR3Transformer alloc] init]; + [NSValueTransformer setValueTransformer:rubberbandEngineR3Transformer + forName:@"RubberbandEngineR3Transformer"]; + + NSValueTransformer *rubberbandEngineEnabledTransformer = [[RubberbandEngineEnabledTransformer alloc] init]; + [NSValueTransformer setValueTransformer:rubberbandEngineEnabledTransformer + forName:@"RubberbandEngineEnabledTransformer"]; } + (NSArray *)preferencePanes { diff --git a/Preferences/Preferences/RubberbandEngineTransformer.h b/Preferences/Preferences/RubberbandEngineTransformer.h index 89e3499bd..4edde9084 100644 --- a/Preferences/Preferences/RubberbandEngineTransformer.h +++ b/Preferences/Preferences/RubberbandEngineTransformer.h @@ -10,7 +10,15 @@ NS_ASSUME_NONNULL_BEGIN -@interface RubberbandEngineTransformer : NSValueTransformer +@interface RubberbandEngineEnabledTransformer : NSValueTransformer + +@end + +@interface RubberbandEngineHiddenTransformer : NSValueTransformer + +@end + +@interface RubberbandEngineR3Transformer : NSValueTransformer @end diff --git a/Preferences/Preferences/RubberbandEngineTransformer.m b/Preferences/Preferences/RubberbandEngineTransformer.m index 9f1d098d7..71dc20787 100644 --- a/Preferences/Preferences/RubberbandEngineTransformer.m +++ b/Preferences/Preferences/RubberbandEngineTransformer.m @@ -9,7 +9,7 @@ #import "RubberbandEngineTransformer.h" -@implementation RubberbandEngineTransformer +@implementation RubberbandEngineR3Transformer + (Class)transformedValueClass { return [NSNumber class]; } @@ -19,35 +19,62 @@ - (id)transformedValue:(id)value { if(value == nil) return @(YES); - + if([value isKindOfClass:[NSString class]]) { NSString *stringValue = value; - if([stringValue isEqualToString:@"finer"]) { + if([stringValue isEqualToString:@"disabled"] || + [stringValue isEqualToString:@"finer"]) { return @(NO); } } - + return @(YES); } @end +@implementation RubberbandEngineEnabledTransformer ++ (Class)transformedValueClass { + return [NSNumber class]; +} ++ (BOOL)allowsReverseTransformation { + return NO; +} +- (id)transformedValue:(id)value { + if(value == nil) return @(YES); + if([value isKindOfClass:[NSString class]]) { + NSString *stringValue = value; + if([stringValue isEqualToString:@"disabled"]) { + return @(NO); + } + } + return @(YES); +} +@end +@implementation RubberbandEngineHiddenTransformer ++ (Class)transformedValueClass { + return [NSNumber class]; +} ++ (BOOL)allowsReverseTransformation { + return NO; +} +- (id)transformedValue:(id)value { + if(value == nil) return @(YES); + if([value isKindOfClass:[NSString class]]) { + NSString *stringValue = value; + if([stringValue isEqualToString:@"disabled"]) { + return @(NO); + } + } + return @(YES); +} - - - - - - - - - - +@end diff --git a/Preferences/Preferences/RubberbandPane.m b/Preferences/Preferences/RubberbandPane.m index 5df1492ad..c3832aceb 100644 --- a/Preferences/Preferences/RubberbandPane.m +++ b/Preferences/Preferences/RubberbandPane.m @@ -45,6 +45,8 @@ - (void)awakeFromNib { [self removeObjects:[self arrangedObjects]]; + [self addObject:@{@"name": NSLocalizedStringFromTableInBundle(@"EngineDisabled", nil, [NSBundle bundleForClass:[self class]], @""), @"preference": @"disabled"}]; + [self addObject:@{@"name": NSLocalizedStringFromTableInBundle(@"EngineFaster", nil, [NSBundle bundleForClass:[self class]], @""), @"preference": @"faster"}]; [self addObject:@{@"name": NSLocalizedStringFromTableInBundle(@"EngineFiner", nil, [NSBundle bundleForClass:[self class]], @""), @"preference": @"finer"}]; diff --git a/Preferences/Preferences/en.lproj/Localizable.strings b/Preferences/Preferences/en.lproj/Localizable.strings index cf76d66d6..9c196c4c3 100644 --- a/Preferences/Preferences/en.lproj/Localizable.strings +++ b/Preferences/Preferences/en.lproj/Localizable.strings @@ -31,6 +31,7 @@ "Volume scale tag only" = "Volume scale tag only"; "Zero Order Hold" = "Zero Order Hold"; "Rubber Band" = "Rubber Band"; +"EngineDisabled" = "Disabled"; "EngineFaster" = "Faster"; "EngineFiner" = "Finer"; "TransientsCrisp" = "Crisp"; diff --git a/Preferences/Preferences/es.lproj/Localizable.strings b/Preferences/Preferences/es.lproj/Localizable.strings index c7637adf7..9e2131191 100644 --- a/Preferences/Preferences/es.lproj/Localizable.strings +++ b/Preferences/Preferences/es.lproj/Localizable.strings @@ -83,6 +83,7 @@ "Zero Order Hold" = "Retención de orden cero"; "Rubber Band" = "Rubber Band"; +"EngineDisabled" = "Desactivado"; "EngineFaster" = "Más rápido"; "EngineFiner" = "Mejor calidad"; "TransientsCrisp" = "Definidos"; diff --git a/Preferences/PreferencesController.h b/Preferences/PreferencesController.h index 1c71c8004..a797285c1 100644 --- a/Preferences/PreferencesController.h +++ b/Preferences/PreferencesController.h @@ -15,5 +15,6 @@ - (IBAction)showPreferences:(id)sender; - (IBAction)showPathSuggester:(id)sender; +- (IBAction)showRubberbandSettings:(id)sender; @end diff --git a/Preferences/PreferencesController.m b/Preferences/PreferencesController.m index 717a81a3b..283d7b507 100644 --- a/Preferences/PreferencesController.m +++ b/Preferences/PreferencesController.m @@ -38,4 +38,10 @@ [window showPathSuggester]; } +- (IBAction)showRubberbandSettings:(id)sender { + [self initWindow]; + + [window showRubberbandSettings]; +} + @end diff --git a/Preferences/PreferencesWindow.h b/Preferences/PreferencesWindow.h index da494f56e..817e04e98 100644 --- a/Preferences/PreferencesWindow.h +++ b/Preferences/PreferencesWindow.h @@ -23,5 +23,6 @@ - (void)show; - (void)showPathSuggester; +- (void)showRubberbandSettings; @end diff --git a/Preferences/PreferencesWindow.m b/Preferences/PreferencesWindow.m index 7db3fd4dd..a5e658b69 100644 --- a/Preferences/PreferencesWindow.m +++ b/Preferences/PreferencesWindow.m @@ -167,6 +167,14 @@ } } +- (void)showRubberbandSettings { + NSString *name = NSLocalizedPrefString(@"Rubber Band"); + + [self loadPaneNamed:name display:NO]; + + [self makeKeyAndOrderFront:self]; +} + // Close on Esc pressed. - (void)cancelOperation:(id)sender { [self close]; diff --git a/Window/MainWindow.m b/Window/MainWindow.m index 4562e9ebf..9ebea956c 100644 --- a/Window/MainWindow.m +++ b/Window/MainWindow.m @@ -10,9 +10,17 @@ #import "AppController.h" +// NOTICE! We bury first time defaults that should depend on whether the install is fresh or not here +// so that they get created correctly depending on the situation. + +// For instance, for the first option to get this treatment, we want time stretching to stay enabled +// for existing installations, but disable itself by default on new installs, to spare processing. + void showCrashlyticsConsent(NSWindow *window) { BOOL askedConsent = [[NSUserDefaults standardUserDefaults] boolForKey:@"crashlyticsAskedConsent"]; if(!askedConsent) { + [[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"rubberbandEngine": @"disabled" }]; + [window orderFront:window]; NSAlert *alert = [[NSAlert alloc] init]; @@ -28,6 +36,8 @@ void showCrashlyticsConsent(NSWindow *window) { }]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"crashlyticsAskedConsent"]; + } else { + [[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"rubberbandEngine": @"faster" }]; } }