From c932fda6d34b5751c4f979084959966280fa2572 Mon Sep 17 00:00:00 2001 From: Zachary Girouard Date: Sun, 4 Oct 2015 23:09:56 -0400 Subject: [PATCH 001/156] Start of new layout UI/mechanics --- CocoaSplit.xcodeproj/project.pbxproj | 57 +- .../CSAnimationChooserViewController.xib | 24 +- CocoaSplit/CSLayoutButton.h | 16 + CocoaSplit/CSLayoutButton.m | 78 ++ CocoaSplit/CaptureController.h | 6 + CocoaSplit/CaptureController.m | 218 +++-- CocoaSplit/CreateLayoutViewController.xib | 15 +- .../CSFilterChooserWindowController.xib | 41 +- CocoaSplit/Interface/CSLayoutCollectionItem.h | 25 + CocoaSplit/Interface/CSLayoutCollectionItem.m | 60 ++ .../Interface/CSLayoutCollectionItem.xib | 37 + CocoaSplit/Interface/CapturePreview.xib | 7 +- .../InputPopupControllerViewController.xib | 237 ++++- CocoaSplit/Interface/NewLayoutPanel.xib | 9 +- .../PluginManagerWindowController.xib | 25 +- CocoaSplit/SourceLayout.h | 15 + CocoaSplit/SourceLayout.m | 200 ++++- CocoaSplit/TestView.xib | 6 +- CocoaSplit/en.lproj/MainMenu.xib | 829 +++++------------- 19 files changed, 1049 insertions(+), 856 deletions(-) create mode 100644 CocoaSplit/CSLayoutButton.h create mode 100644 CocoaSplit/CSLayoutButton.m create mode 100644 CocoaSplit/Interface/CSLayoutCollectionItem.h create mode 100644 CocoaSplit/Interface/CSLayoutCollectionItem.m create mode 100644 CocoaSplit/Interface/CSLayoutCollectionItem.xib diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 8ca089b1..224f4a35 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -115,7 +115,7 @@ 346CF44C1A5C10C2008E5BFF /* CSInputLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */; }; 346CF44D1A5C10C2008E5BFF /* CSInputLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */; }; 3470F41419C84989000A81C4 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3470F41319C84989000A81C4 /* Sparkle.framework */; settings = {ATTRIBUTES = (Required, ); }; }; - 3470F41619C849E7000A81C4 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3470F41319C84989000A81C4 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 3470F41619C849E7000A81C4 /* Sparkle.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = 3470F41319C84989000A81C4 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 347277FD1A5A2758008801A9 /* CSIOSurfaceLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 347277FC1A5A2758008801A9 /* CSIOSurfaceLayer.m */; }; 347277FE1A5A2758008801A9 /* CSIOSurfaceLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 347277FC1A5A2758008801A9 /* CSIOSurfaceLayer.m */; }; 34792AF616104AA70065A859 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34792AF516104AA70065A859 /* IOKit.framework */; }; @@ -151,7 +151,6 @@ 34AE3C30164E3E020052C95E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34AE3C2F164E3E020052C95E /* Foundation.framework */; }; 34AE3C36164E3E020052C95E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 34AE3C34164E3E020052C95E /* InfoPlist.strings */; }; 34AE3C39164E3E020052C95E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AE3C38164E3E020052C95E /* main.m */; }; - 34AE3C3F164E3F230052C95E /* zakk.lol.QTCaptureHelper.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 34AE3C2E164E3E020052C95E /* zakk.lol.QTCaptureHelper.xpc */; }; 34AE3C44164E410D0052C95E /* XPCListenerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AE3C43164E410D0052C95E /* XPCListenerDelegate.m */; }; 34AE3C4B164E68820052C95E /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340FE4E015F3581200E4CE4E /* QTKit.framework */; }; 34AE3C6B164F04B30052C95E /* IOSurface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34AE3C6A164F04B30052C95E /* IOSurface.framework */; }; @@ -318,6 +317,9 @@ 34ED8CBD1B07763F002C0674 /* CSMidiWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */; }; 34F5141216FD6E4F00BA894D /* x264Compressor.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F5140F16FD6E4F00BA894D /* x264Compressor.m */; }; 34F5141316FD6E4F00BA894D /* AppleVTCompressor.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F5141116FD6E4F00BA894D /* AppleVTCompressor.m */; }; + 34F52A271BC1CE2700662911 /* CSLayoutCollectionItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F52A251BC1CE2700662911 /* CSLayoutCollectionItem.m */; settings = {ASSET_TAGS = (); }; }; + 34F52A281BC1CE2700662911 /* CSLayoutCollectionItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F52A261BC1CE2700662911 /* CSLayoutCollectionItem.xib */; settings = {ASSET_TAGS = (); }; }; + 34F52A2B1BC1E0F900662911 /* CSLayoutButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F52A2A1BC1E0F800662911 /* CSLayoutButton.m */; settings = {ASSET_TAGS = (); }; }; 34F7C5871B2C9A5300345230 /* CSDeckLinkCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34F7C5611B2C908700345230 /* CSDeckLinkCapturePlugin.bundle */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 34FDA83E1A84C46500E7F65E /* CSTimeCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34FDA8191A84BF9400E7F65E /* CSTimeCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 34FDD6F21A215268009A7413 /* CSPluginServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 34FDD6F11A215268009A7413 /* CSPluginServices.m */; }; @@ -339,13 +341,6 @@ remoteGlobalIDString = 34A7C18719B9A41900BC6882; remoteInfo = CSLayoutSwitcherExtraPlugin; }; - 34AE3C40164E3FAD0052C95E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 340FE49415F3417E00E4CE4E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 34AE3C2D164E3E020052C95E; - remoteInfo = QTCaptureHelper; - }; 34AFC24919B05ADA0007C07B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 34AFC24519B05ADA0007C07B /* CSDesktopCapturePlugin.xcodeproj */; @@ -515,24 +510,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3470F41519C849D9000A81C4 /* CopyFiles */ = { + 3470F41519C849D9000A81C4 /* Copy Files */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 3470F41619C849E7000A81C4 /* Sparkle.framework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 34AE3C3E164E3EAE0052C95E /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = Contents/XPCServices; - dstSubfolderSpec = 1; - files = ( - 34AE3C3F164E3F230052C95E /* zakk.lol.QTCaptureHelper.xpc in CopyFiles */, + 3470F41619C849E7000A81C4 /* Sparkle.framework in Copy Files */, ); + name = "Copy Files"; runOnlyForDeploymentPostprocessing = 0; }; 34D43556198DD00F00266169 /* Copy Files */ = { @@ -904,6 +890,11 @@ 34F5141016FD6E4F00BA894D /* AppleVTCompressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppleVTCompressor.h; path = Compressor/AppleVTCompressor.h; sourceTree = ""; }; 34F5141116FD6E4F00BA894D /* AppleVTCompressor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppleVTCompressor.m; path = Compressor/AppleVTCompressor.m; sourceTree = ""; }; 34F5141416FD6E5D00BA894D /* h264Compressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = h264Compressor.h; path = Compressor/h264Compressor.h; sourceTree = ""; }; + 34F52A241BC1CE2700662911 /* CSLayoutCollectionItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSLayoutCollectionItem.h; path = Interface/CSLayoutCollectionItem.h; sourceTree = ""; }; + 34F52A251BC1CE2700662911 /* CSLayoutCollectionItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSLayoutCollectionItem.m; path = Interface/CSLayoutCollectionItem.m; sourceTree = ""; }; + 34F52A261BC1CE2700662911 /* CSLayoutCollectionItem.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSLayoutCollectionItem.xib; path = Interface/CSLayoutCollectionItem.xib; sourceTree = ""; }; + 34F52A291BC1E0F800662911 /* CSLayoutButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSLayoutButton.h; sourceTree = ""; }; + 34F52A2A1BC1E0F800662911 /* CSLayoutButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSLayoutButton.m; sourceTree = ""; }; 34F7C55A1B2C908700345230 /* CSDeckLinkCapturePlugin.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CSDeckLinkCapturePlugin.xcodeproj; path = CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin.xcodeproj; sourceTree = ""; }; 34FDA8071A84BF9300E7F65E /* CSTimeCapturePlugin.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CSTimeCapturePlugin.xcodeproj; path = CapturePlugins/CSTimeCapturePlugin/CSTimeCapturePlugin.xcodeproj; sourceTree = ""; }; 34FDD6DC1A204CE4009A7413 /* CAMultiAudioEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CAMultiAudioEngine.h; path = CAMultiAudio/CAMultiAudioEngine.h; sourceTree = ""; }; @@ -1239,6 +1230,11 @@ 34D4351A198BE3B700266169 /* NewLayoutPanel.xib */, 34348C2919BDBDC000A122C2 /* PluginManagerWindowController.xib */, 349461441AAD73BC00F28883 /* TestView.xib */, + 34F52A241BC1CE2700662911 /* CSLayoutCollectionItem.h */, + 34F52A251BC1CE2700662911 /* CSLayoutCollectionItem.m */, + 34F52A261BC1CE2700662911 /* CSLayoutCollectionItem.xib */, + 34F52A291BC1E0F800662911 /* CSLayoutButton.h */, + 34F52A2A1BC1E0F800662911 /* CSLayoutButton.m */, ); name = Interface; sourceTree = ""; @@ -1708,10 +1704,9 @@ 340FE49915F3417E00E4CE4E /* Sources */, 340FE49A15F3417E00E4CE4E /* Frameworks */, 340FE49B15F3417E00E4CE4E /* Resources */, - 34AE3C3E164E3EAE0052C95E /* CopyFiles */, 3435E39C188BD80A0015CC01 /* CopyFiles */, 34D43556198DD00F00266169 /* Copy Files */, - 3470F41519C849D9000A81C4 /* CopyFiles */, + 3470F41519C849D9000A81C4 /* Copy Files */, 3460E5891AC766120080358E /* CopyFiles */, 34FB04A31B349A0B00379548 /* ShellScript */, 343644051B78EFF90069B8F2 /* CopyFiles */, @@ -1719,7 +1714,6 @@ buildRules = ( ); dependencies = ( - 34AE3C41164E3FAD0052C95E /* PBXTargetDependency */, ); name = CocoaSplit; productName = CocoaSplit; @@ -2024,6 +2018,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 34F52A281BC1CE2700662911 /* CSLayoutCollectionItem.xib in Resources */, 347B14DD198492D900DC7DF0 /* InputPopupControllerViewController.xib in Resources */, 34ED8CB91B073C1B002C0674 /* CSMidiManagerWindowController.xib in Resources */, 340FE4AC15F3417E00E4CE4E /* InfoPlist.strings in Resources */, @@ -2111,6 +2106,7 @@ 34ED8C9D1B07371C002C0674 /* MIKMIDIProgramChangeCommand.m in Sources */, 34ED8C731B07371C002C0674 /* MIKMIDIMappingXMLParser.m in Sources */, 34BD1E631B2481C20015CBEC /* CAMultiAudioMatrixMixerWindowController.m in Sources */, + 34F52A271BC1CE2700662911 /* CSLayoutCollectionItem.m in Sources */, 347277FD1A5A2758008801A9 /* CSIOSurfaceLayer.m in Sources */, 344825E61B253D6900AF9EAC /* CAMultiAudioMatrixCell.m in Sources */, 34BD1E4D1B1F1A2D0015CBEC /* CAMultiAudioDownmixer.m in Sources */, @@ -2173,6 +2169,7 @@ 34F5141216FD6E4F00BA894D /* x264Compressor.m in Sources */, 34DC2FB01B512362008F12A2 /* CSCaptureBase+TimerDelegate.m in Sources */, 34ED8C791B07371C002C0674 /* MIKMIDIMetaEvent.m in Sources */, + 34F52A2B1BC1E0F900662911 /* CSLayoutButton.m in Sources */, 34576C7819AFCA1B007BAD90 /* CSPluginLoader.m in Sources */, 34FDD6F21A215268009A7413 /* CSPluginServices.m in Sources */, 34ED8C8F1B07371C002C0674 /* MIKMIDINoteOffCommand.m in Sources */, @@ -2315,14 +2312,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 34AE3C41164E3FAD0052C95E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 34AE3C2D164E3E020052C95E /* QTCaptureHelper */; - targetProxy = 34AE3C40164E3FAD0052C95E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ 340FE4AA15F3417E00E4CE4E /* InfoPlist.strings */ = { isa = PBXVariantGroup; @@ -2454,7 +2443,7 @@ ); PRODUCT_NAME = CocoaSplit; PROVISIONING_PROFILE = ""; - SDKROOT = macosx10.10; + SDKROOT = macosx10.11; STRIP_STYLE = debugging; WRAPPER_EXTENSION = app; }; @@ -2495,7 +2484,7 @@ ); PRODUCT_NAME = CocoaSplit; PROVISIONING_PROFILE = ""; - SDKROOT = macosx10.10; + SDKROOT = macosx10.11; STRIP_STYLE = debugging; WRAPPER_EXTENSION = app; }; diff --git a/CocoaSplit/CSAnimationChooserViewController.xib b/CocoaSplit/CSAnimationChooserViewController.xib index caa876e2..e174bd53 100644 --- a/CocoaSplit/CSAnimationChooserViewController.xib +++ b/CocoaSplit/CSAnimationChooserViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -18,6 +18,7 @@ - - + + - + + - + @@ -62,19 +64,24 @@ + + + @@ -85,6 +92,7 @@ + diff --git a/CocoaSplit/CSLayoutButton.h b/CocoaSplit/CSLayoutButton.h new file mode 100644 index 00000000..903998a1 --- /dev/null +++ b/CocoaSplit/CSLayoutButton.h @@ -0,0 +1,16 @@ +// +// CSLayoutButton.h +// CocoaSplit +// +// Created by Zakk on 10/4/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import +#import "CSLayoutCollectionItem.h" +@interface CSLayoutButton : NSButton + +@property (weak) IBOutlet CSLayoutCollectionItem *viewController; + + +@end diff --git a/CocoaSplit/CSLayoutButton.m b/CocoaSplit/CSLayoutButton.m new file mode 100644 index 00000000..2422b7f8 --- /dev/null +++ b/CocoaSplit/CSLayoutButton.m @@ -0,0 +1,78 @@ +// +// CSLayoutButton.m +// CocoaSplit +// +// Created by Zakk on 10/4/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import "CSLayoutButton.h" + +@implementation CSLayoutButton + + +-(void)awakeFromNib +{ + [super awakeFromNib]; + + + if (self.viewController) + { + [self.viewController addObserver:self forKeyPath:@"representedObject.in_live" options:NSKeyValueObservingOptionNew context:NULL]; + [self.viewController addObserver:self forKeyPath:@"representedObject.in_staging" options:NSKeyValueObservingOptionNew context:NULL]; + } +} + + +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + [self setNeedsDisplay]; +} + + +- (void)drawRect:(NSRect)dirtyRect { + [super drawRect:dirtyRect]; + + NSColor *redColor = [NSColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:0.3]; + NSColor *greenColor = [NSColor colorWithRed:0.0 green:1.0 blue:0.0 alpha:0.3]; + + NSRect mybounds = self.bounds; + + SourceLayout *myLayout = self.viewController.representedObject; + + if (myLayout.in_staging) + { + [greenColor set]; + + NSRect fillBox = mybounds; + + fillBox.size.width = fillBox.size.width/2; + + NSRectFillUsingOperation(fillBox, NSCompositeSourceOver); + } + + if (myLayout.in_live) + { + [redColor set]; + + NSRect fillBox = mybounds; + + fillBox.size.width = fillBox.size.width/2; + fillBox.origin.x = fillBox.origin.x + fillBox.size.width; + + NSRectFillUsingOperation(fillBox, NSCompositeSourceOver); + } + + + + // Drawing code here. +} + + +-(void)rightMouseDown:(NSEvent *)theEvent +{ + [self.viewController showLayoutMenu:theEvent]; +} + + +@end diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index fe303f9c..3222d856 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -398,6 +398,9 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) NSMutableDictionary *extraPluginsSaveData; @property (strong) CSPluginLoader *sharedPluginLoader; +@property (strong) PreviewView *activePreviewView; + + - (IBAction)openAnimatePopover:(NSButton *)sender; @@ -451,6 +454,9 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(void)layoutLeftFullscreen; +(void)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile withBlock:(void(^)(Class))withBlock; +(Class)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile; +-(void)toggleLayout:(SourceLayout *)layout; +-(void)saveToLayout:(SourceLayout *)layout; + diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 4c3cfdf6..6592f390 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1108,6 +1108,7 @@ @"ChangeInterval", @"EffectDuration", @"MultiTransition", @"PositionX", @"PositionY"]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buildScreensInfo:) name:NSApplicationDidChangeScreenParametersNotification object:nil]; @@ -1574,6 +1575,8 @@ { //all color panels allow opacity + self.activePreviewView = self.stagingPreviewView; + [NSColorPanel sharedColorPanel].showsAlpha = YES; [NSColor setIgnoresAlpha:NO]; @@ -1675,7 +1678,7 @@ //mainThread = [[NSThread alloc] initWithTarget:self selector:@selector(newFrameTimed) object:nil]; //[mainThread start]; - + self.stagingPreviewView.controller = self; self.livePreviewView.controller = self; LayoutRenderer *stagingRender = [[LayoutRenderer alloc] init]; @@ -1688,7 +1691,9 @@ self.livePreviewView.viewOnly = YES; - + self.selectedLayout = [[SourceLayout alloc] init]; + self.stagingLayout = [[SourceLayout alloc] init]; + self.extraPluginsSaveData = [saveRoot valueForKey:@"extraPluginsSaveData"]; [self migrateDefaultCompressor:saveRoot]; @@ -1724,19 +1729,22 @@ if (!self.sourceLayouts) { self.sourceLayouts = [[NSMutableArray alloc] init]; - SourceLayout *newLayout = [[SourceLayout alloc] init]; - newLayout.name = @"default"; - [[self mutableArrayValueForKey:@"sourceLayouts" ] addObject:newLayout]; - self.selectedLayout = newLayout; - self.stagingLayout = newLayout; - newLayout.isActive = YES; - - } else { - - self.selectedLayout = [saveRoot valueForKey:@"selectedLayout"]; - self.stagingLayout = [saveRoot valueForKey:@"stagingLayout"]; } - + + SourceLayout *tmpLayout = [saveRoot valueForKey:@"selectedLayout"]; + if (tmpLayout) + { + self.selectedLayout = tmpLayout; +// [self.selectedLayout mergeSourceLayout:tmpLayout withLayer:nil]; + } + + tmpLayout = [saveRoot valueForKey:@"stagingLayout"]; + if (tmpLayout) + { + self.stagingLayout = tmpLayout; + // [self.stagingLayout mergeSourceLayout:tmpLayout withLayer:nil]; + } + } @@ -1764,50 +1772,41 @@ -(void)setStagingLayout:(SourceLayout *)stagingLayout { - [self.objectController commitEditing]; - - - self.stagingCtx.layoutRenderer.transitionName = self.transitionName; - self.stagingCtx.layoutRenderer.transitionDirection = self.transitionDirection; - self.stagingCtx.layoutRenderer.transitionDuration = self.transitionDuration; - self.stagingCtx.layoutRenderer.transitionFilter = self.transitionFilter; - [self stagingSave:self]; - - - SourceLayout *previewCopy = stagingLayout.copy; - - [previewCopy restoreSourceList:nil]; - self.stagingPreviewView.sourceLayout = previewCopy; + [stagingLayout restoreSourceList:nil]; + + self.stagingPreviewView.sourceLayout = stagingLayout; - - - if (self.sourceLayoutsArrayController) - { - NSUInteger sidx = [self.sourceLayoutsArrayController.arrangedObjects indexOfObject:stagingLayout]; - if ((sidx != NSNotFound) && self.stagingSourceLayoutTableView) - { - [self.stagingSourceLayoutTableView selectRowIndexes:[NSIndexSet indexSetWithIndex:sidx] byExtendingSelection:NO]; - - - } - } + [stagingLayout setAddLayoutBlock:^(SourceLayout *layout) { - float framerate = stagingLayout.frameRate; + layout.in_staging = YES; - if (framerate && framerate > 0) - { - _staging_frame_interval = (1.0/framerate); - } else { - _staging_frame_interval = 1.0/60.0; - } - - self.currentMidiInputStagingIdx = 0; - - _stagingLayout = stagingLayout; + }]; + + [stagingLayout setRemoveLayoutBlock:^(SourceLayout *layout) { + + layout.in_staging = NO; + + }]; + + + [stagingLayout applyAddBlock]; + + float framerate = stagingLayout.frameRate; + + if (framerate && framerate > 0) + { + _staging_frame_interval = (1.0/framerate); + } else { + _staging_frame_interval = 1.0/60.0; + } + + self.currentMidiInputStagingIdx = 0; + + _stagingLayout = stagingLayout; + - } @@ -1821,45 +1820,36 @@ -(void)setSelectedLayout:(SourceLayout *)selectedLayout { - if (selectedLayout == _selectedLayout) - { - return; - } + + [selectedLayout setAddLayoutBlock:^(SourceLayout *layout) { + + layout.in_live = YES; + + }]; + [selectedLayout setRemoveLayoutBlock:^(SourceLayout *layout) { + + layout.in_live = NO; + + }]; + + [selectedLayout applyAddBlock]; + [self.objectController commitEditing]; - - - self.previewCtx.layoutRenderer.transitionName = self.transitionName; - self.previewCtx.layoutRenderer.transitionDirection = self.transitionDirection; - self.previewCtx.layoutRenderer.transitionDuration = self.transitionDuration; - self.previewCtx.layoutRenderer.transitionFilter = self.transitionFilter; - - - - selectedLayout.isActive = YES; - - [self setupFrameTimer:selectedLayout.frameRate]; - self.previewCtx.sourceLayout = selectedLayout; - - - if (self.sourceLayoutsArrayController) - { - NSUInteger sidx = [self.sourceLayoutsArrayController.arrangedObjects indexOfObject:selectedLayout]; - if ((sidx != NSNotFound) && self.mainSourceLayoutTableView) - { - [self.mainSourceLayoutTableView selectRowIndexes:[NSIndexSet indexSetWithIndex:sidx] byExtendingSelection:NO]; - - - } - } - - - self.currentMidiInputLiveIdx = 0; - _selectedLayout = selectedLayout; - + + selectedLayout.isActive = YES; + + [self setupFrameTimer:selectedLayout.frameRate]; + self.livePreviewView.sourceLayout = selectedLayout; + + + + self.currentMidiInputLiveIdx = 0; + _selectedLayout = selectedLayout; + } @@ -2941,6 +2931,27 @@ } + +-(void)toggleLayout:(SourceLayout *)layout +{ + SourceLayout *activeLayout = self.activePreviewView.sourceLayout; + if ([activeLayout containsLayout:layout]) + { + [activeLayout removeSourceLayout:layout withLayer:nil]; + } else { + [activeLayout mergeSourceLayout:layout withLayer:nil]; + } +} + + +-(void)saveToLayout:(SourceLayout *)layout +{ + NSLog(@"SAVING %@ TO %@", self.activePreviewView.sourceLayout, layout); + [self.activePreviewView.sourceLayout saveSourceList]; + layout.savedSourceListData = self.activePreviewView.sourceLayout.savedSourceListData; +} + + - (IBAction)layoutTableSelected:(NSTableView *)sender { @@ -3409,41 +3420,19 @@ self.previewCtx.layoutRenderer.transitionDirection = self.transitionDirection; self.previewCtx.layoutRenderer.transitionDuration = self.transitionDuration; self.previewCtx.layoutRenderer.transitionFilter = self.transitionFilter; - - - if (self.stagingLayout && self.stagingCtx.sourceLayout) + if (self.stagingLayout) { [self stagingSave:sender]; - - if (self.selectedLayout != self.stagingLayout) - { - self.selectedLayout = self.stagingLayout; - } else { - SourceLayout *previewCopy = self.stagingLayout.copy; - [previewCopy restoreSourceList:nil]; - NSUInteger layoutIdx = [self.sourceLayoutsArrayController.arrangedObjects indexOfObject:self.selectedLayout]; - [self.sourceLayoutsArrayController removeObjectAtArrangedObjectIndex:layoutIdx]; - [self.sourceLayoutsArrayController insertObject:previewCopy atArrangedObjectIndex:layoutIdx]; - - self.selectedLayout = previewCopy; - _stagingLayout = previewCopy; - - } + + [self.selectedLayout replaceWithSourceLayout:self.stagingLayout]; } } + -(IBAction)stagingSave:(id)sender { - if (self.stagingLayout && self.stagingCtx.sourceLayout) - { - [self.stagingCtx.sourceLayout saveSourceList]; - self.stagingLayout.savedSourceListData = self.stagingCtx.sourceLayout.savedSourceListData; - - self.stagingLayout.frameRate = self.stagingCtx.sourceLayout.frameRate; - self.stagingLayout.canvas_width = self.stagingCtx.sourceLayout.canvas_width; - self.stagingLayout.canvas_height = self.stagingCtx.sourceLayout.canvas_height; - } + [self.stagingLayout saveSourceList]; } -(IBAction)stagingRevert:(id)sender @@ -3495,6 +3484,7 @@ self.stagingControls.hidden = YES; self.goLiveControls.hidden = YES; self.livePreviewView.viewOnly = NO; + self.activePreviewView = self.livePreviewView; _stagingHidden = YES; } @@ -3534,6 +3524,8 @@ self.goLiveControls.hidden = NO; self.livePreviewView.viewOnly = YES; _stagingHidden = NO; + self.activePreviewView = self.stagingPreviewView; + dispatch_async(_preview_queue, ^{ [self newStagingFrameTimed]; }); diff --git a/CocoaSplit/CreateLayoutViewController.xib b/CocoaSplit/CreateLayoutViewController.xib index 54ead47a..5b09e9e4 100644 --- a/CocoaSplit/CreateLayoutViewController.xib +++ b/CocoaSplit/CreateLayoutViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -18,6 +18,7 @@ + @@ -30,6 +31,7 @@ + @@ -38,6 +40,7 @@ + @@ -46,6 +49,7 @@ + @@ -54,6 +58,7 @@ + @@ -65,6 +70,7 @@ + @@ -76,6 +82,7 @@ + @@ -84,6 +91,7 @@ + @@ -95,6 +103,7 @@ + @@ -115,6 +125,7 @@ DQ + diff --git a/CocoaSplit/Interface/CSFilterChooserWindowController.xib b/CocoaSplit/Interface/CSFilterChooserWindowController.xib index e07021ac..9c9ecbbf 100644 --- a/CocoaSplit/Interface/CSFilterChooserWindowController.xib +++ b/CocoaSplit/Interface/CSFilterChooserWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -24,15 +24,16 @@ - - + + - + + - + @@ -55,19 +56,24 @@ + + - + + - - + + - + + - + @@ -125,18 +133,23 @@ Gw + + + diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.h b/CocoaSplit/Interface/CSLayoutCollectionItem.h new file mode 100644 index 00000000..cbd8cdaa --- /dev/null +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.h @@ -0,0 +1,25 @@ +// +// CSLayoutCollectionItem.h +// CocoaSplit +// +// Created by Zakk on 10/4/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import +#import "CaptureController.h" + + +@interface CSLayoutCollectionItem : NSCollectionViewItem + + +@property (weak) IBOutlet CaptureController *captureController; +@property (strong) NSMenu *layoutMenu; + +- (IBAction)layoutButtonPushed:(id)sender; + +-(void)buildLayoutMenu; +-(void)showLayoutMenu:(NSEvent *)clickEvent; + + +@end diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.m b/CocoaSplit/Interface/CSLayoutCollectionItem.m new file mode 100644 index 00000000..35edc7f8 --- /dev/null +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.m @@ -0,0 +1,60 @@ +// +// CSLayoutCollectionItem.m +// CocoaSplit +// +// Created by Zakk on 10/4/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import "CSLayoutCollectionItem.h" +#import "AppDelegate.h" +@interface CSLayoutCollectionItem () + +@end + +@implementation CSLayoutCollectionItem + + +-(void) awakeFromNib +{ + [super awakeFromNib]; + AppDelegate *appDel = [NSApp delegate]; + + self.captureController = appDel.captureController; + +} +- (void)viewDidLoad { + [super viewDidLoad]; + // Do view setup here. +} + +- (IBAction)layoutButtonPushed:(id)sender +{ + [self.captureController toggleLayout:self.representedObject]; +} + + +-(void)saveToLayout:(id) sender +{ + [self.captureController saveToLayout:self.representedObject]; +} + + +-(void)buildLayoutMenu +{ + NSInteger idx = 0; + + NSMenuItem *tmp; + self.layoutMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] init]; + tmp = [self.layoutMenu insertItemWithTitle:@"Save To" action:@selector(saveToLayout:) keyEquivalent:@"" atIndex:idx++]; + tmp.target = self; +} + +-(void)showLayoutMenu:(NSEvent *)clickEvent +{ + NSPoint tmp = [self.view convertPoint:clickEvent.locationInWindow fromView:nil]; + [self buildLayoutMenu]; + [self.layoutMenu popUpMenuPositioningItem:self.layoutMenu.itemArray.firstObject atLocation:tmp inView:self.view]; +} + +@end diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.xib b/CocoaSplit/Interface/CSLayoutCollectionItem.xib new file mode 100644 index 00000000..6443274c --- /dev/null +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.xib @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CapturePreview.xib b/CocoaSplit/Interface/CapturePreview.xib index 098dc4fa..30ae3bef 100644 --- a/CocoaSplit/Interface/CapturePreview.xib +++ b/CocoaSplit/Interface/CapturePreview.xib @@ -1,7 +1,8 @@ - + - + + @@ -18,6 +19,7 @@ + @@ -26,6 +28,7 @@ + diff --git a/CocoaSplit/Interface/InputPopupControllerViewController.xib b/CocoaSplit/Interface/InputPopupControllerViewController.xib index 5954c30d..56e4195c 100644 --- a/CocoaSplit/Interface/InputPopupControllerViewController.xib +++ b/CocoaSplit/Interface/InputPopupControllerViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -21,6 +21,7 @@ + @@ -29,6 +30,7 @@ + @@ -37,6 +39,7 @@ + @@ -45,6 +48,7 @@ + @@ -60,6 +64,7 @@ + @@ -72,6 +77,7 @@ + @@ -79,6 +85,7 @@ + @@ -115,6 +124,7 @@ + @@ -127,6 +137,7 @@ + @@ -134,6 +145,7 @@ + @@ -142,6 +154,7 @@ + @@ -154,6 +167,7 @@ + @@ -161,6 +175,7 @@ + @@ -169,6 +184,7 @@ + @@ -181,6 +197,7 @@ + @@ -188,6 +205,7 @@ + @@ -196,6 +214,7 @@ + @@ -207,6 +226,7 @@ + @@ -218,6 +238,7 @@ + @@ -229,6 +250,7 @@ + @@ -240,6 +262,7 @@ + @@ -247,6 +270,7 @@ + @@ -254,6 +278,7 @@ + @@ -261,6 +286,7 @@ + @@ -268,6 +294,7 @@ + @@ -276,6 +303,7 @@ + @@ -284,6 +312,7 @@ + @@ -292,6 +321,7 @@ + @@ -300,6 +330,7 @@ + @@ -317,6 +349,7 @@ + @@ -325,6 +358,7 @@ + @@ -333,6 +367,7 @@ + @@ -341,6 +376,7 @@ + @@ -348,6 +384,7 @@ + @@ -355,6 +392,7 @@ + @@ -363,6 +401,7 @@ + @@ -371,6 +410,7 @@ + @@ -382,6 +422,7 @@ + @@ -393,6 +434,7 @@ + @@ -400,6 +442,7 @@ + @@ -407,6 +450,7 @@ + @@ -415,6 +459,7 @@ + @@ -422,6 +467,7 @@ + @@ -430,6 +476,7 @@ + @@ -441,6 +488,7 @@ + @@ -449,6 +497,7 @@ + @@ -460,12 +509,14 @@ + + @@ -474,24 +525,28 @@ + + + + @@ -500,18 +555,21 @@ + + + @@ -520,6 +578,7 @@ + @@ -527,6 +586,7 @@ + + @@ -555,6 +617,7 @@ + @@ -563,6 +626,7 @@ + @@ -570,6 +634,7 @@ + @@ -577,6 +642,7 @@ + @@ -585,6 +651,7 @@ + @@ -593,6 +660,7 @@ + @@ -601,6 +669,7 @@ + @@ -609,6 +678,7 @@ + @@ -620,6 +690,7 @@ + @@ -631,6 +702,7 @@ + @@ -642,6 +714,7 @@ + @@ -663,18 +737,21 @@ + + + @@ -703,6 +781,7 @@ + @@ -731,6 +810,7 @@ + @@ -750,6 +830,7 @@ + @@ -768,6 +849,7 @@ + @@ -776,15 +858,19 @@ + + + + @@ -794,6 +880,7 @@ + @@ -802,6 +889,7 @@ + @@ -813,6 +901,7 @@ + @@ -821,6 +910,7 @@ + @@ -838,6 +928,7 @@ + @@ -846,6 +937,7 @@ + @@ -861,6 +953,7 @@ + @@ -884,6 +977,7 @@ + @@ -895,6 +989,7 @@ + @@ -913,6 +1009,7 @@ + @@ -948,6 +1046,7 @@ - - + + - + + @@ -1025,20 +1125,28 @@ + + + + - + + + @@ -1048,6 +1156,7 @@ + @@ -1056,6 +1165,7 @@ + @@ -1064,6 +1174,7 @@ + @@ -1075,6 +1186,7 @@ + @@ -1083,6 +1195,7 @@ + @@ -1094,6 +1207,7 @@ + @@ -1101,6 +1215,7 @@ + @@ -1108,6 +1223,7 @@ + @@ -1116,6 +1232,7 @@ + @@ -1124,6 +1241,7 @@ + @@ -1132,6 +1250,7 @@ + @@ -1143,6 +1262,7 @@ + @@ -1154,6 +1274,7 @@ + @@ -1161,6 +1282,7 @@ + @@ -1168,6 +1290,7 @@ + @@ -1176,6 +1299,7 @@ + @@ -1184,6 +1308,7 @@ + @@ -1192,6 +1317,7 @@ + @@ -1200,6 +1326,7 @@ + @@ -1208,6 +1335,7 @@ + @@ -1216,6 +1344,7 @@ + @@ -1224,6 +1353,7 @@ + @@ -1256,6 +1386,7 @@ + @@ -1264,6 +1395,7 @@ + @@ -1296,6 +1428,7 @@ + @@ -1328,6 +1461,7 @@ + @@ -1360,6 +1494,7 @@ + @@ -1392,6 +1527,7 @@ + @@ -1424,6 +1560,7 @@ + @@ -1456,6 +1593,7 @@ + @@ -1488,6 +1626,7 @@ + @@ -1496,6 +1635,7 @@ + @@ -1507,6 +1647,7 @@ + @@ -1514,6 +1655,7 @@ + @@ -1522,6 +1664,7 @@ + @@ -1533,6 +1676,7 @@ + @@ -1540,6 +1684,7 @@ + @@ -1548,6 +1693,7 @@ + @@ -1559,6 +1705,7 @@ + @@ -1566,6 +1713,7 @@ + @@ -1574,6 +1722,7 @@ + @@ -1585,6 +1734,7 @@ + @@ -1592,6 +1742,7 @@ + @@ -1600,6 +1751,7 @@ + @@ -1611,6 +1763,7 @@ + @@ -1618,6 +1771,7 @@ + @@ -1626,6 +1780,7 @@ + @@ -1637,6 +1792,7 @@ + @@ -1644,6 +1800,7 @@ + @@ -1652,6 +1809,7 @@ + @@ -1663,6 +1821,7 @@ + @@ -1670,6 +1829,7 @@ + @@ -1678,6 +1838,7 @@ + @@ -1689,6 +1850,7 @@ + @@ -1696,6 +1858,7 @@ + @@ -1704,6 +1867,7 @@ + @@ -1722,13 +1887,14 @@ - - + + - + + @@ -1755,19 +1921,24 @@ + + + @@ -1797,13 +1970,14 @@ - - + + - + + @@ -1831,19 +2005,24 @@ + + + @@ -1863,13 +2043,14 @@ - - + + - + + @@ -1896,19 +2077,24 @@ + + + @@ -1928,6 +2115,7 @@ + @@ -1989,6 +2182,7 @@ + @@ -2010,6 +2204,7 @@ + diff --git a/CocoaSplit/Interface/NewLayoutPanel.xib b/CocoaSplit/Interface/NewLayoutPanel.xib index d1e19354..7a908750 100644 --- a/CocoaSplit/Interface/NewLayoutPanel.xib +++ b/CocoaSplit/Interface/NewLayoutPanel.xib @@ -1,8 +1,8 @@ - + - + @@ -24,6 +24,7 @@ + @@ -32,6 +33,7 @@ + @@ -43,6 +45,7 @@ + diff --git a/CocoaSplit/Interface/PluginManagerWindowController.xib b/CocoaSplit/Interface/PluginManagerWindowController.xib index 49481fa0..b481bee9 100644 --- a/CocoaSplit/Interface/PluginManagerWindowController.xib +++ b/CocoaSplit/Interface/PluginManagerWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -23,18 +23,19 @@ - - + + - + + - + - + @@ -56,20 +57,28 @@ + + - + + + diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index 6fad77a5..4d902d6a 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -65,6 +65,16 @@ @property (weak) InputSource *layoutTimingSource; @property (strong) NSUndoManager *undoManager; +@property (strong) NSMutableArray *containedLayouts; + +@property (assign) bool in_live; +@property (assign) bool in_staging; + +@property (nonatomic, copy) void (^addLayoutBlock)(SourceLayout *layout); +@property (nonatomic, copy) void (^removeLayoutBlock)(SourceLayout *layout); + + + -(void)deleteSource:(InputSource *)delSource; -(void)addSource:(InputSource *)newSource; @@ -86,6 +96,11 @@ -(bool)containsInput:(InputSource *)cSource; -(void)modifyUUID:(NSString *)uuid withBlock:(void (^)(InputSource *input))withBlock; +-(void)mergeSourceLayout:(SourceLayout *)toMerge withLayer:(CALayer *)withLayer; +-(void)removeSourceLayout:(SourceLayout *)toRemove withLayer:(CALayer *)withLayer; +-(bool)containsLayout:(SourceLayout *)layout; +-(void)applyAddBlock; +-(void)replaceWithSourceLayout:(SourceLayout *)layout; diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 67a6bac9..990617fc 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -32,7 +32,7 @@ _uuidMap = [NSMutableDictionary dictionary]; _animationQueue = dispatch_queue_create("CSAnimationQueue", NULL); - + _containedLayouts = [NSMutableArray array]; self.rootLayer = [self newRootLayer]; self.animationList = [NSMutableArray array]; @@ -309,11 +309,17 @@ { [aCoder encodeObject:self.animationSaveData forKey:@"animationSaveData"]; } + + if (self.containedLayouts) + { + [aCoder encodeObject:self.containedLayouts forKey:@"containedLayouts"]; + } } + -(id) initWithCoder:(NSCoder *)aDecoder { if (self = [self init]) @@ -339,13 +345,29 @@ { self.animationSaveData = [aDecoder decodeObjectForKey:@"animationSaveData"]; } - + + if ([aDecoder containsValueForKey:@"containedLayouts"]) + { + self.containedLayouts = [aDecoder decodeObjectForKey:@"containedLayouts"]; + //set live/staging status for each layout + } } return self; } +-(void)applyAddBlock +{ + if (self.addLayoutBlock) + { + for (SourceLayout *layout in self.containedLayouts) + { + self.addLayoutBlock(layout); + } + } +} + -(NSArray *)sourceListOrdered { NSArray *mylist; @@ -435,6 +457,80 @@ } +-(void)replaceWithSourceLayout:(SourceLayout *)layout +{ + for (SourceLayout *cLayout in self.containedLayouts.copy) + { + if (self.removeLayoutBlock) + { + self.removeLayoutBlock(cLayout); + } + + [self.containedLayouts removeObject:cLayout]; + } + + [self removeSourceInputs:self.sourceList withLayer:nil]; + + for (SourceLayout *cLayout in layout.containedLayouts.copy) + { + if (self.addLayoutBlock) + { + self.addLayoutBlock(cLayout); + } + + [self.containedLayouts addObject:cLayout]; + } + + + [self mergeSourceListData:layout.savedSourceListData withLayer:nil]; +} + + + +-(bool)containsLayout:(SourceLayout *)layout +{ + return [self.containedLayouts containsObject:layout]; +} + + +-(void)mergeSourceLayout:(SourceLayout *)toMerge withLayer:(CALayer *)withLayer +{ + + if ([self.containedLayouts containsObject:toMerge]) + { + return; + } + + [self mergeSourceListData:toMerge.savedSourceListData withLayer:withLayer]; + + [self.containedLayouts addObject:toMerge]; + if (self.addLayoutBlock) + { + self.addLayoutBlock(toMerge); + } +} + + +-(void)removeSourceLayout:(SourceLayout *)toRemove withLayer:(CALayer *)withLayer +{ + + if (![self.containedLayouts containsObject:toRemove]) + { + return; + } + + [self removeSourceListData:toRemove.savedSourceListData withLayer:withLayer]; + + [self.containedLayouts removeObject:toRemove]; + if (self.removeLayoutBlock) + { + self.removeLayoutBlock(toRemove); + } +} + + + + -(NSObject *)mergeSourceListData:(NSData *)mergeData withLayer:(CALayer *)withLayer { @@ -545,6 +641,60 @@ } +-(void)removeSourceInputs:(NSArray *)inputs withLayer:(CALayer *)withLayer +{ + + NSMutableArray *undoSources = [NSMutableArray array]; + + if (self.undoManager) + { + [self.undoManager beginUndoGrouping]; + } + for(InputSource *src in inputs) + { + src.sourceLayout = self; + InputSource *eSrc = [self inputForUUID:src.uuid]; + if (eSrc) + { + CATransition *rTrans = [CATransition animation]; + rTrans.type = @"flip"; + rTrans.duration = 2.5; + rTrans.removedOnCompletion = YES; + + [CATransaction begin]; + __weak SourceLayout *weakSelf = self; + + [CATransaction setCompletionBlock:^{ + [weakSelf deleteSource:eSrc]; + }]; + + + + [eSrc.layer addAnimation:rTrans forKey:nil]; + // [src.layer addAnimation:rTrans forKey:nil]; + + eSrc.layer.hidden = YES; + + [CATransaction commit]; + [undoSources addObject:eSrc]; + } + + + if (undoSources.count > 0) + { + NSData *undoData = [NSKeyedArchiver archivedDataWithRootObject:undoSources]; + [[self.undoManager prepareWithInvocationTarget:self] mergeSourceListData:undoData withLayer:nil]; + } + } + if (self.undoManager) + { + [self.undoManager endUndoGrouping]; + } + + +} + + -(NSObject *)removeSourceListData:(NSData *)mergeData withLayer:(CALayer *)withLayer { @@ -564,7 +714,6 @@ withLayer = self.rootLayer; } - NSMutableArray *undoSources = [NSMutableArray array]; NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:mergeData]; @@ -582,51 +731,8 @@ mergeList = (NSArray *)mergeObj; } - if (self.undoManager) - { - [self.undoManager beginUndoGrouping]; - } - for(InputSource *src in mergeList) - { - src.sourceLayout = self; - InputSource *eSrc = [self inputForUUID:src.uuid]; - if (eSrc) - { - CATransition *rTrans = [CATransition animation]; - rTrans.type = @"flip"; - rTrans.duration = 2.5; - rTrans.removedOnCompletion = YES; - [CATransaction begin]; - __weak SourceLayout *weakSelf = self; - - [CATransaction setCompletionBlock:^{ - [weakSelf deleteSource:eSrc]; - }]; - - - - [eSrc.layer addAnimation:rTrans forKey:nil]; - // [src.layer addAnimation:rTrans forKey:nil]; - - eSrc.layer.hidden = YES; - - [CATransaction commit]; - [undoSources addObject:eSrc]; - } - - - if (undoSources.count > 0) - { - NSData *undoData = [NSKeyedArchiver archivedDataWithRootObject:undoSources]; - [[self.undoManager prepareWithInvocationTarget:self] mergeSourceListData:undoData withLayer:nil]; - } - } - if (self.undoManager) - { - [self.undoManager endUndoGrouping]; - } - + [self removeSourceInputs:mergeList withLayer:withLayer]; return mergeObj; } diff --git a/CocoaSplit/TestView.xib b/CocoaSplit/TestView.xib index c214e989..9c06f1e0 100644 --- a/CocoaSplit/TestView.xib +++ b/CocoaSplit/TestView.xib @@ -1,8 +1,8 @@ - + - + @@ -18,6 +18,7 @@ + @@ -28,6 +29,7 @@ + diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 3ab88814..adb99c89 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -25,18 +25,14 @@ - - - - @@ -319,12 +315,15 @@ + + + @@ -337,6 +336,7 @@ + @@ -345,6 +345,7 @@ + @@ -355,6 +356,7 @@ + @@ -369,6 +371,7 @@ + @@ -379,6 +382,7 @@ + @@ -386,470 +390,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -880,8 +423,9 @@ - - + + + @@ -903,11 +447,12 @@ - - + + + @@ -917,16 +462,18 @@ - - + + + - - + + + @@ -940,48 +487,37 @@ - - + + + - - + + + - - + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1111,6 +635,7 @@ + @@ -1119,6 +644,7 @@ + @@ -1127,6 +653,7 @@ + @@ -1134,6 +661,7 @@ + @@ -1141,6 +669,7 @@ + @@ -1169,6 +700,7 @@ + @@ -1187,6 +719,7 @@ + @@ -1213,6 +746,7 @@ + @@ -1221,6 +755,7 @@ + @@ -1229,6 +764,7 @@ + @@ -1240,6 +776,7 @@ + @@ -1248,6 +785,7 @@ + @@ -1256,6 +794,7 @@ + @@ -1264,6 +803,7 @@ + @@ -1298,6 +838,7 @@ + @@ -1305,14 +846,18 @@ + + @@ -1323,6 +868,7 @@ + @@ -1332,6 +878,7 @@ + @@ -1350,6 +897,7 @@ + @@ -1378,6 +928,7 @@ + @@ -1398,6 +949,7 @@ - - + + - + + - + @@ -1452,7 +1006,7 @@ - + @@ -1489,7 +1043,7 @@ - + @@ -1505,7 +1059,7 @@ - + @@ -1521,7 +1075,7 @@ - + @@ -1558,20 +1112,28 @@ + + - + + + @@ -1588,6 +1150,7 @@ + @@ -1615,19 +1178,24 @@ + + + - + - + - + + @@ -1684,19 +1254,24 @@ + + - + + - - - - + - + - + + @@ -1790,6 +1370,7 @@ + @@ -1800,6 +1381,7 @@ + @@ -1825,6 +1407,7 @@ + @@ -1843,6 +1426,7 @@ + @@ -1850,6 +1434,7 @@ + @@ -1860,6 +1445,7 @@ + @@ -1867,6 +1453,7 @@ + @@ -1886,19 +1474,24 @@ + + - + @@ -2053,15 +1656,19 @@ + + @@ -2104,6 +1711,7 @@ + @@ -2114,12 +1722,13 @@ - + - + + @@ -2269,17 +1878,22 @@ + + - + + @@ -2289,6 +1903,7 @@ + @@ -2307,8 +1922,10 @@ + + @@ -2321,6 +1938,7 @@ + @@ -2454,9 +2072,11 @@ + + @@ -2505,6 +2127,7 @@ Gw + @@ -2517,6 +2140,7 @@ Gw + @@ -2554,6 +2178,7 @@ MgA3AEEARwBQAFcAXABkAHkAewB9AH8AgQCLAJAAlQCgAKMApQCnAKkArgC5AMIAygDNANYA2wDoAOwA + - - - - + From d9a0107c893ecde7dce0bdb3ced12cb01d7397bd Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 5 Oct 2015 04:57:52 -0400 Subject: [PATCH 002/156] Added delete layout contextual menu item --- CocoaSplit/CSLayoutButton.h | 5 ++- CocoaSplit/CSLayoutButton.m | 23 ++++------ CocoaSplit/CaptureController.h | 3 +- CocoaSplit/CaptureController.m | 42 ++----------------- CocoaSplit/Interface/CSLayoutCollectionItem.h | 2 + CocoaSplit/Interface/CSLayoutCollectionItem.m | 31 ++++++++++++++ .../Interface/CSLayoutCollectionItem.xib | 1 + 7 files changed, 51 insertions(+), 56 deletions(-) diff --git a/CocoaSplit/CSLayoutButton.h b/CocoaSplit/CSLayoutButton.h index 903998a1..1a4d9cdd 100644 --- a/CocoaSplit/CSLayoutButton.h +++ b/CocoaSplit/CSLayoutButton.h @@ -7,7 +7,10 @@ // #import -#import "CSLayoutCollectionItem.h" + +@class CSLayoutCollectionItem; + + @interface CSLayoutButton : NSButton @property (weak) IBOutlet CSLayoutCollectionItem *viewController; diff --git a/CocoaSplit/CSLayoutButton.m b/CocoaSplit/CSLayoutButton.m index 2422b7f8..3a160b3a 100644 --- a/CocoaSplit/CSLayoutButton.m +++ b/CocoaSplit/CSLayoutButton.m @@ -7,27 +7,13 @@ // #import "CSLayoutButton.h" +#import "CSLayoutCollectionItem.h" @implementation CSLayoutButton --(void)awakeFromNib -{ - [super awakeFromNib]; - - - if (self.viewController) - { - [self.viewController addObserver:self forKeyPath:@"representedObject.in_live" options:NSKeyValueObservingOptionNew context:NULL]; - [self.viewController addObserver:self forKeyPath:@"representedObject.in_staging" options:NSKeyValueObservingOptionNew context:NULL]; - } -} --(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context -{ - [self setNeedsDisplay]; -} - (void)drawRect:(NSRect)dirtyRect { @@ -75,4 +61,11 @@ } +-(void)dealloc +{ + [self.viewController removeObserver:self forKeyPath:@"representedObject.in_live"]; + [self.viewController removeObserver:self forKeyPath:@"representedObject.in_staging"]; + + +} @end diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 3222d856..fd3933d9 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -246,8 +246,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , - (IBAction)unlockStagingFPS:(id)sender; - (IBAction)unlockLiveFPS:(id)sender; -- (void)deleteLayout:(NSInteger)deleteIdx; - +- (bool)deleteLayout:(SourceLayout *)toDelete; - (IBAction)addStreamingService:(id)sender; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 6592f390..2aab3f51 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -43,35 +43,6 @@ --(IBAction)mainDeleteLayoutClicked:(id)sender -{ - - NSInteger selectedIdx = self.mainSourceLayoutTableView.selectedRow; - if (selectedIdx != -1) - { - [self deleteLayout:selectedIdx]; - [self layoutTableSelected:self.mainSourceLayoutTableView]; - } -} - --(IBAction)stagingDeleteLayoutClicked:(id)sender -{ - - NSInteger selectedIdx = self.stagingSourceLayoutTableView.selectedRow; - if (selectedIdx != -1) - { - [self deleteLayout:selectedIdx]; - [self layoutTableSelected:self.stagingSourceLayoutTableView]; - } -} - --(IBAction)stagingCopyLayoutClicked:(id)sender -{ - [self cloneSelectedSourceLayout:self.stagingSourceLayoutTableView]; -} - -- (IBAction)stagingAnimationSelected:(id)sender { -} -(IBAction)mainCopyLayoutClicked:(id)sender @@ -124,9 +95,8 @@ } -- (void)deleteLayout:(NSInteger)deleteIdx +- (bool)deleteLayout:(SourceLayout *)toDelete { - SourceLayout *toDelete = [self.sourceLayoutsArrayController.arrangedObjects objectAtIndex:deleteIdx]; if (toDelete) { @@ -135,15 +105,11 @@ toDelete.isActive = NO; - - [self.sourceLayoutsArrayController removeObjectAtArrangedObjectIndex:deleteIdx]; - - if (self.selectedLayout == toDelete) - { - self.selectedLayout = nil; - } + [self.sourceLayoutsArrayController removeObject:toDelete]; + return YES; } } + return NO; } diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.h b/CocoaSplit/Interface/CSLayoutCollectionItem.h index cbd8cdaa..150ff489 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.h +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.h @@ -8,6 +8,7 @@ #import #import "CaptureController.h" +#import "CSLayoutButton.h" @interface CSLayoutCollectionItem : NSCollectionViewItem @@ -21,5 +22,6 @@ -(void)buildLayoutMenu; -(void)showLayoutMenu:(NSEvent *)clickEvent; +@property (weak) IBOutlet CSLayoutButton *layoutButton; @end diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.m b/CocoaSplit/Interface/CSLayoutCollectionItem.m index 35edc7f8..b45e7fe4 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.m +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.m @@ -15,14 +15,30 @@ @implementation CSLayoutCollectionItem + +-(void)setRepresentedObject:(id)representedObject +{ + [super setRepresentedObject:representedObject]; + [self.representedObject addObserver:self forKeyPath:@"in_live" options:NSKeyValueObservingOptionNew context:NULL]; + [self.representedObject addObserver:self forKeyPath:@"in_staging" options:NSKeyValueObservingOptionNew context:NULL]; + +} -(void) awakeFromNib { [super awakeFromNib]; AppDelegate *appDel = [NSApp delegate]; self.captureController = appDel.captureController; + } + +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + [self.layoutButton setNeedsDisplay]; +} + + - (void)viewDidLoad { [super viewDidLoad]; // Do view setup here. @@ -40,6 +56,19 @@ } +-(void)deleteLayout:(id) sender +{ + SourceLayout *toDelete = self.representedObject; + + if ([self.captureController deleteLayout:self.representedObject]) + { + [toDelete removeObserver:self forKeyPath:@"in_live"]; + [toDelete removeObserver:self forKeyPath:@"in_staging"]; + + } +} + + -(void)buildLayoutMenu { NSInteger idx = 0; @@ -48,6 +77,8 @@ self.layoutMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] init]; tmp = [self.layoutMenu insertItemWithTitle:@"Save To" action:@selector(saveToLayout:) keyEquivalent:@"" atIndex:idx++]; tmp.target = self; + tmp = [self.layoutMenu insertItemWithTitle:@"Delete" action:@selector(deleteLayout:) keyEquivalent:@"" atIndex:idx++]; + tmp.target = self; } -(void)showLayoutMenu:(NSEvent *)clickEvent diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.xib b/CocoaSplit/Interface/CSLayoutCollectionItem.xib index 6443274c..f8163a9b 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.xib +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.xib @@ -7,6 +7,7 @@ + From 49ad6bb24f54adc15e3cbb266ed7a99ea9fcc0e8 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 5 Oct 2015 05:00:24 -0400 Subject: [PATCH 003/156] Hi? --- CapturePlugins/CSSyphonCapturePlugin/Syphon-Framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CapturePlugins/CSSyphonCapturePlugin/Syphon-Framework b/CapturePlugins/CSSyphonCapturePlugin/Syphon-Framework index 01b14481..d47874c9 160000 --- a/CapturePlugins/CSSyphonCapturePlugin/Syphon-Framework +++ b/CapturePlugins/CSSyphonCapturePlugin/Syphon-Framework @@ -1 +1 @@ -Subproject commit 01b144811f6f7080b70b2d7cc729da071f86f9d7 +Subproject commit d47874c99a415514453344b74cfd5df5c878c289 From aabf9eec5cc9408046fd1a696f35ded19fcb290e Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 5 Oct 2015 10:51:21 -0400 Subject: [PATCH 004/156] Command-clicking a layout replaces the working view with that layout only --- CocoaSplit/CaptureController.h | 2 ++ CocoaSplit/CaptureController.m | 6 ++++++ CocoaSplit/Interface/CSLayoutCollectionItem.m | 10 ++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index fd3933d9..4284af49 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -455,6 +455,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , +(Class)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile; -(void)toggleLayout:(SourceLayout *)layout; -(void)saveToLayout:(SourceLayout *)layout; +-(void)switchToLayout:(SourceLayout *)layout; + diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 2aab3f51..807ee133 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2897,6 +2897,12 @@ } +-(void)switchToLayout:(SourceLayout *)layout +{ + SourceLayout *activeLayout = self.activePreviewView.sourceLayout; + [activeLayout replaceWithSourceLayout:layout]; +} + -(void)toggleLayout:(SourceLayout *)layout { diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.m b/CocoaSplit/Interface/CSLayoutCollectionItem.m index b45e7fe4..a637c2f1 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.m +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.m @@ -21,8 +21,9 @@ [super setRepresentedObject:representedObject]; [self.representedObject addObserver:self forKeyPath:@"in_live" options:NSKeyValueObservingOptionNew context:NULL]; [self.representedObject addObserver:self forKeyPath:@"in_staging" options:NSKeyValueObservingOptionNew context:NULL]; - } + + -(void) awakeFromNib { [super awakeFromNib]; @@ -46,7 +47,12 @@ - (IBAction)layoutButtonPushed:(id)sender { - [self.captureController toggleLayout:self.representedObject]; + if ([NSEvent modifierFlags] & NSCommandKeyMask) + { + [self.captureController switchToLayout:self.representedObject]; + } else { + [self.captureController toggleLayout:self.representedObject]; + } } From 0bea958e28b4644a8506571e684f03479401d343 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 10 Oct 2015 21:42:25 -0400 Subject: [PATCH 005/156] Transitions now support being applied per-input or on the full layout/scene --- CocoaSplit/CSInputLayer.m | 4 +- CocoaSplit/CaptureController.h | 2 + CocoaSplit/CaptureController.m | 69 ++--- CocoaSplit/LayoutRenderer.m | 58 +---- CocoaSplit/SourceLayout.h | 12 +- CocoaSplit/SourceLayout.m | 429 ++++++++++++++++++++++++------- CocoaSplit/en.lproj/MainMenu.xib | 321 ++++++++++++----------- 7 files changed, 549 insertions(+), 346 deletions(-) diff --git a/CocoaSplit/CSInputLayer.m b/CocoaSplit/CSInputLayer.m index 8a2f6076..1832db50 100644 --- a/CocoaSplit/CSInputLayer.m +++ b/CocoaSplit/CSInputLayer.m @@ -466,11 +466,11 @@ } - +/* -(void)setHidden:(BOOL)hidden { _yLayer.hidden = hidden; -} +}*/ -(void)transitionToLayer:(CALayer *)toLayer fromLayer:(CALayer *)fromLayer withTransition:(CATransition *)transition diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 4284af49..6bd33be4 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -222,6 +222,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) NSString *transitionName; @property (strong) NSString *transitionDirection; @property (strong) CIFilter *transitionFilter; +@property (assign) bool transitionFullScene; + @property (strong) NSWindow *transitionFilterWindow; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 807ee133..56c0534e 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1295,7 +1295,15 @@ [fileManager createDirectoryAtPath:saveFolder withIntermediateDirectories:NO attributes:nil error:nil]; } - NSString *saveFile = [saveFolder stringByAppendingPathComponent:@"CocoaSplit-CA.settings"]; + NSString *saveFile = [saveFolder stringByAppendingPathComponent:@"CocoaSplit-2.settings"]; + + if ([fileManager fileExistsAtPath:saveFile]) + { + return saveFile; + } + + + saveFile = [saveFolder stringByAppendingPathComponent:@"CocoaSplit-CA.settings"]; if ([fileManager fileExistsAtPath:saveFile]) { @@ -1322,7 +1330,7 @@ [fileManager createDirectoryAtPath:saveFolder withIntermediateDirectories:NO attributes:nil error:nil]; } - NSString *saveFile = @"CocoaSplit-CA.settings"; + NSString *saveFile = @"CocoaSplit-2.settings"; return [saveFolder stringByAppendingPathComponent:saveFile]; } @@ -2907,6 +2915,14 @@ -(void)toggleLayout:(SourceLayout *)layout { SourceLayout *activeLayout = self.activePreviewView.sourceLayout; + [self.objectController commitEditing]; + + activeLayout.transitionName = self.transitionName; + activeLayout.transitionDirection = self.transitionDirection; + activeLayout.transitionDuration = self.transitionDuration; + activeLayout.transitionFilter = self.transitionFilter; + activeLayout.transitionFullScene = self.transitionFullScene; + if ([activeLayout containsLayout:layout]) { [activeLayout removeSourceLayout:layout withLayer:nil]; @@ -2918,51 +2934,11 @@ -(void)saveToLayout:(SourceLayout *)layout { - NSLog(@"SAVING %@ TO %@", self.activePreviewView.sourceLayout, layout); [self.activePreviewView.sourceLayout saveSourceList]; layout.savedSourceListData = self.activePreviewView.sourceLayout.savedSourceListData; } -- (IBAction)layoutTableSelected:(NSTableView *)sender -{ - - NSInteger selectedRow = [sender selectedRow]; - - NSInteger selectedCount = sender.numberOfSelectedRows; - - if (selectedRow != -1) - { - SourceLayout *selected = [self.sourceLayoutsArrayController.arrangedObjects objectAtIndex:selectedRow]; - if (selected) - { - if (sender == self.mainSourceLayoutTableView) - { - if (selectedCount > 1) - { - if (!self.livePreviewView.viewOnly) - { - [self.selectedLayout mergeSourceListData:selected.savedSourceListData withLayer:nil]; - } - } else { - self.selectedLayout = selected; - } - } else { - if (selectedCount > 1) - { - [self.stagingPreviewView.sourceLayout mergeSourceListData:selected.savedSourceListData withLayer:nil]; - } else { - self.stagingLayout = selected; - } - } - if (selectedCount > 1) - { - [sender deselectRow:selectedRow]; - } - } - } - -} -(void)clearLearnedMidiForCommand:(NSString *)command withResponder:(id)responder @@ -3388,10 +3364,11 @@ [self.objectController commitEditing]; - self.previewCtx.layoutRenderer.transitionName = self.transitionName; - self.previewCtx.layoutRenderer.transitionDirection = self.transitionDirection; - self.previewCtx.layoutRenderer.transitionDuration = self.transitionDuration; - self.previewCtx.layoutRenderer.transitionFilter = self.transitionFilter; + self.livePreviewView.sourceLayout.transitionName = self.transitionName; + self.livePreviewView.sourceLayout.transitionDirection = self.transitionDirection; + self.livePreviewView.sourceLayout.transitionDuration = self.transitionDuration; + self.livePreviewView.sourceLayout.transitionFilter = self.transitionFilter; + self.livePreviewView.sourceLayout.transitionFullScene = self.transitionFullScene; if (self.stagingLayout) { diff --git a/CocoaSplit/LayoutRenderer.m b/CocoaSplit/LayoutRenderer.m index 794fe27a..bd8d870a 100644 --- a/CocoaSplit/LayoutRenderer.m +++ b/CocoaSplit/LayoutRenderer.m @@ -128,7 +128,7 @@ CGLSetCurrentContext(self.cglCtx); - + if (!self.rootLayer) { self.rootLayer = [CALayer layer]; @@ -136,54 +136,24 @@ } - - _transitionLayout = _currentLayout; - if (self.transitionName && _transitionLayout) + + [CATransaction begin]; + _currentLayout.inTransition = NO; + + if (_transitionLayout) { - [CATransaction begin]; - [CATransaction setDisableActions:YES]; - _layoutTransition = [CATransition animation]; - _layoutTransition.type = self.transitionName ; - _layoutTransition.subtype = self.transitionDirection; - _layoutTransition.duration = self.transitionDuration; - _layoutTransition.filter = self.transitionFilter; - _layoutTransition.removedOnCompletion = YES; - [CATransaction setCompletionBlock:^{ - [CATransaction begin]; - if (_transitionLayout) - { - [_transitionLayout.rootLayer removeFromSuperlayer]; - _transitionLayout.isActive = NO; - _transitionLayout = nil; - } - - - [CATransaction commit]; - }]; - [self.rootLayer addAnimation:_layoutTransition forKey:nil]; - [self.rootLayer addSublayer:self.layout.rootLayer]; - [CATransaction commit]; - - } else { - [CATransaction begin]; - _currentLayout.inTransition = NO; - - if (_transitionLayout) - { - - [_transitionLayout.rootLayer removeFromSuperlayer]; - _transitionLayout.isActive = NO; - _transitionLayout = nil; - } - - [self.renderer.layer addSublayer:self.layout.rootLayer]; - [CATransaction commit]; + [_transitionLayout.rootLayer removeFromSuperlayer]; + _transitionLayout.isActive = NO; + _transitionLayout = nil; } - - + [self.renderer.layer addSublayer:self.layout.rootLayer]; + [CATransaction commit]; + + + _currentLayout = self.layout; [_currentLayout didBecomeVisible]; diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index 4d902d6a..6e278634 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -28,6 +28,8 @@ GLuint _rFbo; dispatch_queue_t _animationQueue; NSMutableDictionary *_uuidMap; + bool _noSceneTransactions; + } @@ -73,6 +75,14 @@ @property (nonatomic, copy) void (^addLayoutBlock)(SourceLayout *layout); @property (nonatomic, copy) void (^removeLayoutBlock)(SourceLayout *layout); +@property (strong) NSString *transitionName; +@property (strong) NSString *transitionDirection; +@property (strong) CIFilter *transitionFilter; +@property (assign) float transitionDuration; +@property (assign) bool transitionFullScene; + + + @@ -88,7 +98,7 @@ -(InputSource *)inputForUUID:(NSString *)uuid; -(void)frameTick; --(NSObject *)mergeSourceListData:(NSData *)mergeData withLayer:(CALayer *)withLayer; +-(NSObject *)mergeSourceListData:(NSData *)mergeData onlyAdd:(bool)onlyAdd; -(IBAction)runAnimations:(id)sender; -(void)addAnimation:(NSDictionary *)animation; -(InputSource *)sourceUnder:(InputSource *)source; diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 990617fc..bc8380e9 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -33,6 +33,7 @@ _animationQueue = dispatch_queue_create("CSAnimationQueue", NULL); _containedLayouts = [NSMutableArray array]; + _noSceneTransactions = NO; self.rootLayer = [self newRootLayer]; self.animationList = [NSMutableArray array]; @@ -459,6 +460,27 @@ -(void)replaceWithSourceLayout:(SourceLayout *)layout { + + _noSceneTransactions = YES; + CATransition *rTrans = nil; + + if (self.transitionFullScene) + { + if (self.transitionName || self.transitionFilter) + { + rTrans = [CATransition animation]; + rTrans.type = self.transitionName; + rTrans.duration = self.transitionDuration; + rTrans.removedOnCompletion = YES; + rTrans.subtype = self.transitionDirection; + if (self.transitionFilter) + { + rTrans.filter = self.transitionFilter; + } + } + + [CATransaction begin]; + } for (SourceLayout *cLayout in self.containedLayouts.copy) { if (self.removeLayoutBlock) @@ -471,6 +493,7 @@ [self removeSourceInputs:self.sourceList withLayer:nil]; + for (SourceLayout *cLayout in layout.containedLayouts.copy) { if (self.addLayoutBlock) @@ -481,8 +504,19 @@ [self.containedLayouts addObject:cLayout]; } + [self mergeSourceListData:layout.savedSourceListData onlyAdd:YES]; - [self mergeSourceListData:layout.savedSourceListData withLayer:nil]; + if (self.transitionFullScene) + { + if (rTrans) + { + [self.rootLayer addAnimation:rTrans forKey:nil]; + } + + [CATransaction commit]; + } + + _noSceneTransactions = NO; } @@ -501,7 +535,7 @@ return; } - [self mergeSourceListData:toMerge.savedSourceListData withLayer:withLayer]; + [self mergeSourceListData:toMerge.savedSourceListData]; [self.containedLayouts addObject:toMerge]; if (self.addLayoutBlock) @@ -531,9 +565,169 @@ --(NSObject *)mergeSourceListData:(NSData *)mergeData withLayer:(CALayer *)withLayer +-(NSArray *)mergeSourceInputsScene:(NSArray *)inputs onlyAdd:(bool)onlyAdd { + NSMutableArray *undoSources = [NSMutableArray array]; + + + CATransition *rTrans = nil; + if (!_noSceneTransactions && (self.transitionName || self.transitionFilter)) + { + rTrans = [CATransition animation]; + rTrans.type = self.transitionName; + rTrans.duration = self.transitionDuration; + rTrans.removedOnCompletion = YES; + rTrans.subtype = self.transitionDirection; + if (self.transitionFilter) + { + rTrans.filter = self.transitionFilter; + } + } + + if (!_noSceneTransactions) + { + [CATransaction begin]; + } + + for(InputSource *src in inputs) + { + src.sourceLayout = self; + src.is_live = self.isActive; + InputSource *eSrc = [self inputForUUID:src.uuid]; + + if (eSrc && !onlyAdd) + { + [eSrc.layer.superlayer addSublayer:src.layer]; + eSrc.layer.hidden = YES; + [undoSources addObject:eSrc]; + } else { + [self.rootLayer addSublayer:src.layer]; + } + [NSApp registerMIDIResponder:src]; + + + + [[self mutableArrayValueForKey:@"sourceList" ] addObject:src]; + [_uuidMap setObject:src forKey:src.uuid]; + + } + + __weak SourceLayout *weakSelf = self; + + if (undoSources.count > 0) + { + [CATransaction setCompletionBlock:^{ + for (InputSource *dInput in undoSources) + { + [weakSelf deleteSource:dInput]; + } + }]; + } + + if (rTrans) + { + [self.rootLayer addAnimation:rTrans forKey:nil]; + } + if (!_noSceneTransactions) + { + [CATransaction commit]; + } + + return undoSources; +} + + +-(NSArray *)mergeSourceInputsIndividual:(NSArray *)inputs onlyAdd:(bool)onlyAdd +{ + + NSMutableArray *undoSources = [NSMutableArray array]; + CATransition *rTrans = nil; + if (self.transitionName || self.transitionFilter) + { + rTrans = [CATransition animation]; + rTrans.type = self.transitionName; + rTrans.duration = self.transitionDuration; + rTrans.removedOnCompletion = YES; + rTrans.subtype = self.transitionDirection; + if (self.transitionFilter) + { + rTrans.filter = self.transitionFilter; + } + } + + for(InputSource *src in inputs) + { + src.sourceLayout = self; + src.is_live = self.isActive; + InputSource *eSrc = [self inputForUUID:src.uuid]; + + if (eSrc && !onlyAdd) + { + src.layer.hidden = YES; + [eSrc.layer.superlayer addSublayer:src.layer]; + + [CATransaction flush]; + + [CATransaction begin]; + __weak SourceLayout *weakSelf = self; + + [CATransaction setCompletionBlock:^{ + [weakSelf deleteSource:eSrc]; + }]; + + + + if (rTrans) + { + [eSrc.layer addAnimation:rTrans forKey:nil]; + [src.layer addAnimation:rTrans forKey:nil]; + } + + eSrc.layer.hidden = YES; + src.layer.hidden = NO; + [CATransaction commit]; + [undoSources addObject:eSrc]; + } else { + + src.layer.hidden = YES; + + + [self.rootLayer addSublayer:src.layer]; + + [CATransaction flush]; + [CATransaction begin]; + if (rTrans) + { + [src.layer addAnimation:rTrans forKey:nil]; + } + + src.layer.hidden = NO; + [CATransaction commit]; + } + [NSApp registerMIDIResponder:src]; + + + + [[self mutableArrayValueForKey:@"sourceList" ] addObject:src]; + [_uuidMap setObject:src forKey:src.uuid]; + + } + + return undoSources; +} + + +-(NSObject *)mergeSourceListData:(NSData *)mergeData +{ + return [self mergeSourceListData:mergeData onlyAdd:NO]; +} + + +-(NSObject *)mergeSourceListData:(NSData *)mergeData onlyAdd:(bool)onlyAdd +{ + + if (!self.sourceList) { @@ -545,13 +739,6 @@ return nil; } - if (!withLayer) - { - withLayer = self.rootLayer; - } - - NSMutableArray *undoSources = [NSMutableArray array]; - NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:mergeData]; [unarchiver setDelegate:self]; @@ -572,66 +759,25 @@ { [self.undoManager beginUndoGrouping]; } - for(InputSource *src in mergeList) + + NSArray *undoSources; + + if (self.transitionFullScene) { - src.sourceLayout = self; - src.is_live = self.isActive; - InputSource *eSrc = [self inputForUUID:src.uuid]; - if (eSrc) - { - CATransition *rTrans = [CATransition animation]; - rTrans.type = @"flip"; - rTrans.duration = 2.5; - rTrans.removedOnCompletion = YES; - [CATransaction begin]; - [eSrc.layer.superlayer addSublayer:src.layer]; - src.layer.hidden = YES; - [CATransaction commit]; - - [CATransaction begin]; - __weak SourceLayout *weakSelf = self; - - [CATransaction setCompletionBlock:^{ - [weakSelf deleteSource:eSrc]; - }]; - - - - //[eSrc.layer addAnimation:rTrans forKey:nil]; - // [src.layer addAnimation:rTrans forKey:nil]; - - eSrc.layer.hidden = YES; - src.layer.hidden = NO; - - [CATransaction commit]; - [undoSources addObject:eSrc]; - } - - - if (undoSources.count > 0) - { - NSData *undoData = [NSKeyedArchiver archivedDataWithRootObject:undoSources]; - [[self.undoManager prepareWithInvocationTarget:self] mergeSourceListData:undoData withLayer:nil]; - } else { - [[self.undoManager prepareWithInvocationTarget:self] removeSourceListData:mergeData withLayer:nil]; - } - - - [NSApp registerMIDIResponder:src]; - - if (!src.layer.superlayer) - { - [CATransaction begin]; - [withLayer addSublayer:src.layer]; - [CATransaction commit]; - - } - - - [[self mutableArrayValueForKey:@"sourceList" ] addObject:src]; - [_uuidMap setObject:src forKey:src.uuid]; - + undoSources = [self mergeSourceInputsScene:mergeList onlyAdd:onlyAdd]; + } else { + undoSources = [self mergeSourceInputsIndividual:mergeList onlyAdd:onlyAdd]; } + + + if (undoSources.count > 0) + { + NSData *undoData = [NSKeyedArchiver archivedDataWithRootObject:undoSources]; + [[self.undoManager prepareWithInvocationTarget:self] mergeSourceListData:undoData]; + } else { + [[self.undoManager prepareWithInvocationTarget:self] removeSourceListData:mergeData withLayer:nil]; + } + if (self.undoManager) { [self.undoManager endUndoGrouping]; @@ -641,26 +787,94 @@ } --(void)removeSourceInputs:(NSArray *)inputs withLayer:(CALayer *)withLayer +-(NSArray *)removeSourceInputsScene:(NSArray *)inputs +{ + NSMutableArray *undoSources = [NSMutableArray array]; + + CATransition *rTrans = nil; + + if (!_noSceneTransactions && (self.transitionName || self.transitionFilter)) + { + rTrans = [CATransition animation]; + rTrans.type = self.transitionName; + rTrans.duration = self.transitionDuration; + rTrans.subtype = self.transitionDirection; + + if (self.transitionFilter) + { + rTrans.filter = self.transitionFilter; + } + rTrans.removedOnCompletion = YES; + } + + if (!_noSceneTransactions) + { + [CATransaction begin]; + + } + __weak SourceLayout *weakSelf = self; + + [CATransaction setCompletionBlock:^{ + for (InputSource *dInput in undoSources) + { + //NSLog(@"DELETING SOURCE %@", dInput); + [weakSelf deleteSource:dInput]; + } + }]; + if (rTrans) + { + [self.rootLayer addAnimation:rTrans forKey:nil]; + } + + for(InputSource *src in inputs) + { + src.sourceLayout = self; + InputSource *eSrc = [self inputForUUID:src.uuid]; + + + + if (eSrc) + { + + eSrc.layer.hidden = YES; + [undoSources addObject:eSrc]; + } + } + + if (!_noSceneTransactions) + { + [CATransaction commit]; + } + + return undoSources; +} + + +-(NSArray *)removeSourceInputsIndividual:(NSArray *)inputs { NSMutableArray *undoSources = [NSMutableArray array]; - - if (self.undoManager) + + CATransition *rTrans = nil; + if (self.transitionName || self.transitionFilter) { - [self.undoManager beginUndoGrouping]; + rTrans = [CATransition animation]; + rTrans.type = self.transitionName; + rTrans.duration = self.transitionDuration; + rTrans.subtype = self.transitionDirection; + if (self.transitionFilter) + { + rTrans.filter = self.transitionFilter; + } + rTrans.removedOnCompletion = YES; } + for(InputSource *src in inputs) { src.sourceLayout = self; InputSource *eSrc = [self inputForUUID:src.uuid]; if (eSrc) { - CATransition *rTrans = [CATransition animation]; - rTrans.type = @"flip"; - rTrans.duration = 2.5; - rTrans.removedOnCompletion = YES; - [CATransaction begin]; __weak SourceLayout *weakSelf = self; @@ -669,23 +883,49 @@ }]; - - [eSrc.layer addAnimation:rTrans forKey:nil]; - // [src.layer addAnimation:rTrans forKey:nil]; + if (rTrans) + { + [eSrc.layer addAnimation:rTrans forKey:nil]; + } eSrc.layer.hidden = YES; - [CATransaction commit]; [undoSources addObject:eSrc]; } - if (undoSources.count > 0) - { - NSData *undoData = [NSKeyedArchiver archivedDataWithRootObject:undoSources]; - [[self.undoManager prepareWithInvocationTarget:self] mergeSourceListData:undoData withLayer:nil]; - } } + + return undoSources; +} + + + +-(void)removeSourceInputs:(NSArray *)inputs withLayer:(CALayer *)withLayer +{ + + + if (self.undoManager) + { + [self.undoManager beginUndoGrouping]; + } + + NSArray *undoSources; + + if (self.transitionFullScene) + { + undoSources = [self removeSourceInputsScene:inputs]; + } else { + undoSources = [self removeSourceInputsIndividual:inputs]; + } + + + if (undoSources.count > 0) + { + NSData *undoData = [NSKeyedArchiver archivedDataWithRootObject:undoSources]; + [[self.undoManager prepareWithInvocationTarget:self] mergeSourceListData:undoData]; + } + if (self.undoManager) { [self.undoManager endUndoGrouping]; @@ -740,10 +980,17 @@ -(void)restoreSourceList:(NSData *)withData { + CALayer *oldSuperLayer = nil; + CALayer *newRoot = nil; + if (self.rootLayer) + { + oldSuperLayer = self.rootLayer.superlayer; + } if (self.savedSourceListData) { - CALayer *newRoot = [self newRootLayer]; + + newRoot = [self newRootLayer]; [CATransaction begin]; newRoot.sublayers = [NSArray array]; @@ -759,7 +1006,7 @@ { withData = self.savedSourceListData; } - NSObject *restData = [self mergeSourceListData:withData withLayer:newRoot]; + NSObject *restData = [self mergeSourceListData:withData]; if (restData && [restData isKindOfClass:[NSDictionary class]]) @@ -782,8 +1029,10 @@ self.layoutTimingSource = ((InputSource *)timerSrc); } - [self.rootLayer.superlayer replaceSublayer:self.rootLayer with:newRoot]; - self.rootLayer = newRoot; + if (oldSuperLayer) + { + [oldSuperLayer replaceSublayer:self.rootLayer with:newRoot]; + } for(InputSource *src in oldSourceList) { diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index adb99c89..32b2075d 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -390,147 +390,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSIsNotNil - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSIsNotNil - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSIsNotNil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSIsNotNil + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - From ebac4d9a57d9ce2f6617c597621c313a8f03b50c Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 11 Oct 2015 12:47:41 -0400 Subject: [PATCH 006/156] Added a layout edit contextual menu to layout buttons. When a layout is set to single-source (via cmd-click) the target now inherits the resolution and frameRate of the layout. This also happens on staging->live. Added contextual menu item for builtin staging and live layouts for changing resolution and framerate --- CocoaSplit.xcodeproj/project.pbxproj | 4 + CocoaSplit/CaptureController.h | 3 + CocoaSplit/CaptureController.m | 67 ++- CocoaSplit/CreateLayoutViewController.h | 3 + CocoaSplit/CreateLayoutViewController.m | 10 +- CocoaSplit/CreateLayoutViewController.xib | 86 +-- CocoaSplit/Interface/CSLayoutCollectionItem.m | 10 + .../Interface/EditBuiltinLayoutView.xib | 106 ++++ CocoaSplit/PreviewView.m | 46 +- CocoaSplit/SourceLayout.m | 11 + CocoaSplit/en.lproj/MainMenu.xib | 517 +++++++++++++----- 11 files changed, 651 insertions(+), 212 deletions(-) create mode 100644 CocoaSplit/Interface/EditBuiltinLayoutView.xib diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 224f4a35..703b6aec 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ 343644081B78F01D0069B8F2 /* CSAnimation.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3494616C1ABD399B00F28883 /* CSAnimation.py */; }; 343644091B78F01D0069B8F2 /* pluginbase.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 34E983841B78B19D00F26F1E /* pluginbase.py */; }; 343692501B6243D4007EC2D9 /* CSShapeCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 3436922B1B62364E007EC2D9 /* CSShapeCapturePlugin.bundle */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 343ED9421BCAC1C80061FC4B /* EditBuiltinLayoutView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 343ED9411BCAC1C80061FC4B /* EditBuiltinLayoutView.xib */; settings = {ASSET_TAGS = (); }; }; 3444D8E819A0CDE8000DC46B /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3444D8E719A0CDE8000DC46B /* Quartz.framework */; }; 344825D21B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344825D11B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib */; }; 344825E61B253D6900AF9EAC /* CAMultiAudioMatrixCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 344825E51B253D6900AF9EAC /* CAMultiAudioMatrixCell.m */; }; @@ -610,6 +611,7 @@ 343DD65C19AAD3060017232A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 343DD65E19AAD3060017232A /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; 343DD6AB19AAD3660017232A /* CSChromaKey.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CSChromaKey.xcodeproj; path = ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj; sourceTree = ""; }; + 343ED9411BCAC1C80061FC4B /* EditBuiltinLayoutView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = EditBuiltinLayoutView.xib; path = Interface/EditBuiltinLayoutView.xib; sourceTree = ""; }; 3444D8E719A0CDE8000DC46B /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; 344825D11B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CAMultiAudioMatrixView.xib; sourceTree = ""; }; 344825E41B253D6900AF9EAC /* CAMultiAudioMatrixCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CAMultiAudioMatrixCell.h; path = Interface/CAMultiAudioMatrixCell.h; sourceTree = ""; }; @@ -1235,6 +1237,7 @@ 34F52A261BC1CE2700662911 /* CSLayoutCollectionItem.xib */, 34F52A291BC1E0F800662911 /* CSLayoutButton.h */, 34F52A2A1BC1E0F800662911 /* CSLayoutButton.m */, + 343ED9411BCAC1C80061FC4B /* EditBuiltinLayoutView.xib */, ); name = Interface; sourceTree = ""; @@ -2039,6 +2042,7 @@ 34348C2B19BDBDC000A122C2 /* PluginManagerWindowController.xib in Resources */, 34ABEF3C17C0C2CB00AA5E62 /* advancedPrefPanel.xib in Resources */, 3435E396188B902C0015CC01 /* 420v.fgsh in Resources */, + 343ED9421BCAC1C80061FC4B /* EditBuiltinLayoutView.xib in Resources */, 3415CED31AE257DA002F11F5 /* CSTextCaptureBaseView.xib in Resources */, 342B33B3198073EC00492CB7 /* line.fgsh in Resources */, 344825D21B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib in Resources */, diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 6bd33be4..8e24dc2c 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -432,6 +432,9 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , - (IBAction)mainCopyLayoutClicked:(id)sender; -(IBAction)stagingDeleteLayoutClicked:(id)sender; -(IBAction)stagingCopyLayoutClicked:(id)sender; +-(void)openLayoutPopover:(NSButton *)sender forLayout:(SourceLayout *)layout; +-(void)openBuiltinLayoutPopover:(NSView *)sender spawnRect:(NSRect)spawnRect forLayout:(SourceLayout *)layout; + - (IBAction)stagingAnimationSelected:(id)sender; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 56c0534e..7f0da68e 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -64,9 +64,44 @@ } -- (IBAction)openLayoutPopover:(NSButton *)sender +-(void)openBuiltinLayoutPopover:(NSView *)sender spawnRect:(NSRect)spawnRect forLayout:(SourceLayout *)layout { + CreateLayoutViewController *vc; + if (!_layoutpopOver) + { + _layoutpopOver = [[NSPopover alloc] init]; + + _layoutpopOver.animates = YES; + _layoutpopOver.behavior = NSPopoverBehaviorTransient; + } + if (!_layoutpopOver.contentViewController) + { + vc = [[CreateLayoutViewController alloc] initForBuiltin]; + + vc.controller = self; + + _layoutpopOver.contentViewController = vc; + _layoutpopOver.delegate = vc; + vc.popover = _layoutpopOver; + + } + + SourceLayout *useLayout = layout; + if (!useLayout) + { + vc.createDialog = YES; + useLayout = [[SourceLayout alloc] init]; + } + vc.sourceLayout = useLayout; + + + [_layoutpopOver showRelativeToRect:spawnRect ofView:sender preferredEdge:NSMinYEdge]; +} + + +-(void)openLayoutPopover:(NSButton *)sender forLayout:(SourceLayout *)layout +{ CreateLayoutViewController *vc; if (!_layoutpopOver) { @@ -88,9 +123,24 @@ } - vc.sourceLayout = [[SourceLayout alloc] init]; - + SourceLayout *useLayout = layout; + if (!useLayout) + { + vc.createDialog = YES; + useLayout = [[SourceLayout alloc] init]; + } + vc.sourceLayout = useLayout; + [_layoutpopOver showRelativeToRect:sender.bounds ofView:sender preferredEdge:NSMinYEdge]; +} + + + +- (IBAction)openLayoutPopover:(NSButton *)sender +{ + + + [self openLayoutPopover:sender forLayout:nil]; } @@ -617,17 +667,6 @@ } -- (IBAction)openLayoutPanel:(id)sender -{ - if (!self.layoutPanel) - { - - [[NSBundle mainBundle] loadNibNamed:@"NewLayoutPanel" owner:self topLevelObjects:nil]; - - } - [NSApp beginSheet:self.layoutPanel modalForWindow:[NSApp mainWindow] modalDelegate:self didEndSelector:NULL contextInfo:NULL]; -} - diff --git a/CocoaSplit/CreateLayoutViewController.h b/CocoaSplit/CreateLayoutViewController.h index 8df6b771..10031fbc 100644 --- a/CocoaSplit/CreateLayoutViewController.h +++ b/CocoaSplit/CreateLayoutViewController.h @@ -16,7 +16,10 @@ @property (weak) NSPopover *popover; @property (strong) SourceLayout *sourceLayout; +@property (assign) bool createDialog; - (IBAction)createButtonClicked:(id)sender; +-(instancetype) initForBuiltin; + @end diff --git a/CocoaSplit/CreateLayoutViewController.m b/CocoaSplit/CreateLayoutViewController.m index 31a275f4..61299f66 100644 --- a/CocoaSplit/CreateLayoutViewController.m +++ b/CocoaSplit/CreateLayoutViewController.m @@ -21,10 +21,18 @@ } +-(instancetype) initForBuiltin +{ + return [self initWithNibName:@"EditBuiltinLayoutView" bundle:nil]; +} + + - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { + _createDialog = NO; + // Initialization code here. } return self; @@ -36,7 +44,7 @@ [self commitEditing]; - if (self.sourceLayout) + if (self.sourceLayout && self.createDialog) { [self.controller addLayoutFromBase:self.sourceLayout]; } diff --git a/CocoaSplit/CreateLayoutViewController.xib b/CocoaSplit/CreateLayoutViewController.xib index 5b09e9e4..ddccdcd5 100644 --- a/CocoaSplit/CreateLayoutViewController.xib +++ b/CocoaSplit/CreateLayoutViewController.xib @@ -13,7 +13,7 @@ - + @@ -38,48 +38,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -124,6 +82,48 @@ DQ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.m b/CocoaSplit/Interface/CSLayoutCollectionItem.m index a637c2f1..fcb63638 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.m +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.m @@ -62,6 +62,13 @@ } +-(void)editLayout:(id) sender +{ + SourceLayout *toEdit = self.representedObject; + [self.captureController openLayoutPopover:self.layoutButton forLayout:toEdit]; +} + + -(void)deleteLayout:(id) sender { SourceLayout *toDelete = self.representedObject; @@ -83,6 +90,9 @@ self.layoutMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] init]; tmp = [self.layoutMenu insertItemWithTitle:@"Save To" action:@selector(saveToLayout:) keyEquivalent:@"" atIndex:idx++]; tmp.target = self; + tmp = [self.layoutMenu insertItemWithTitle:@"Edit" action:@selector(editLayout:) keyEquivalent:@"" atIndex:idx++]; + tmp.target = self; + tmp = [self.layoutMenu insertItemWithTitle:@"Delete" action:@selector(deleteLayout:) keyEquivalent:@"" atIndex:idx++]; tmp.target = self; } diff --git a/CocoaSplit/Interface/EditBuiltinLayoutView.xib b/CocoaSplit/Interface/EditBuiltinLayoutView.xib new file mode 100644 index 00000000..d7b36d99 --- /dev/null +++ b/CocoaSplit/Interface/EditBuiltinLayoutView.xib @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index ff4e87c1..481f1841 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -266,7 +266,19 @@ - + NSString *resTitle = [NSString stringWithFormat:@"%dx%d@%.2f", self.sourceLayout.canvas_width, self.sourceLayout.canvas_height, self.sourceLayout.frameRate]; + + NSMenuItem *resItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:resTitle action:@selector(showLayoutSettings:) keyEquivalent:@""]; + [resItem setTarget:self]; + [resItem setEnabled:YES]; + + [sourceListMenu insertItem:resItem atIndex:[sourceListMenu.itemArray count]]; + + if (self.viewOnly) + { + return sourceListMenu; + } + NSMenuItem *midiItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:@"Midi Mapping" action:@selector(doLayoutMidi:) keyEquivalent:@""]; [midiItem setTarget:self]; [midiItem setEnabled:YES]; @@ -386,9 +398,17 @@ -(void)rightMouseDown:(NSEvent *)theEvent { + NSPoint tmp; + + tmp = [self convertPoint:theEvent.locationInWindow fromView:nil]; + + if (self.viewOnly) { - return; + NSMenu *srcListMenu = [self buildSourceMenu]; + + [srcListMenu popUpMenuPositioningItem:srcListMenu.itemArray.firstObject atLocation:tmp inView:self]; + } bool doDeep = YES; @@ -397,9 +417,6 @@ { doDeep = NO; } - NSPoint tmp; - - tmp = [self convertPoint:theEvent.locationInWindow fromView:nil]; NSPoint worldPoint = [self realPointforWindowPoint:tmp]; self.selectedSource = [self.sourceLayout findSource:worldPoint deepParent:doDeep]; @@ -1240,6 +1257,25 @@ } +- (void)showLayoutSettings:(id)sender +{ + + + + NSPoint tmp = [self convertPoint:[self.window mouseLocationOutsideOfEventStream] fromView:nil]; + + NSRect spawnRect = NSMakeRect(tmp.x, tmp.y, 1.0f, 1.0f); + + if (!NSPointInRect(NSMakePoint(tmp.x, 0), self.bounds)) + { + spawnRect = NSMakeRect(self.bounds.size.width-5, tmp.y, 1.0f, 1.0f); + } else if (!NSPointInRect(NSMakePoint(0, tmp.y), self.bounds)) { + spawnRect = NSMakeRect(tmp.x, 5.0f, 1.0f, 1.0f); + } + + [self.controller openBuiltinLayoutPopover:self spawnRect:spawnRect forLayout:self.sourceLayout]; +} + - (IBAction)showInputSettings:(id)sender { diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index bc8380e9..7ee3ca52 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -494,6 +494,13 @@ [self removeSourceInputs:self.sourceList withLayer:nil]; + if (self.addLayoutBlock) + { + self.addLayoutBlock(layout); + } + + [self.containedLayouts addObject:layout]; + for (SourceLayout *cLayout in layout.containedLayouts.copy) { if (self.addLayoutBlock) @@ -517,6 +524,10 @@ } _noSceneTransactions = NO; + self.canvas_height = layout.canvas_height; + self.canvas_width = layout.canvas_width; + self.frameRate = layout.frameRate; + } diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 32b2075d..809c6121 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -3,6 +3,8 @@ + + @@ -331,19 +333,19 @@ - - - - + + + + - - - - + + + + @@ -354,7 +356,7 @@ - + @@ -369,7 +371,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + @@ -479,8 +410,11 @@ - + + + + @@ -488,10 +422,10 @@ - - + @@ -540,7 +474,7 @@ - + @@ -564,7 +498,7 @@ - + @@ -573,8 +507,11 @@ - + + + + @@ -582,14 +519,17 @@ - + + + + - + @@ -605,10 +545,10 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -628,7 +693,7 @@ - + @@ -637,7 +702,7 @@ - + @@ -646,7 +711,7 @@ - + @@ -654,7 +719,7 @@ - + @@ -662,8 +727,11 @@ - - - + @@ -693,7 +765,7 @@ - + @@ -712,7 +784,7 @@ - + @@ -739,7 +811,7 @@ - + @@ -748,7 +820,7 @@ - + @@ -757,7 +829,7 @@ - + @@ -769,7 +841,7 @@ - + @@ -778,8 +850,11 @@ - + + + + @@ -787,7 +862,7 @@ - + @@ -796,7 +871,7 @@ - + @@ -857,11 +932,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -871,8 +988,11 @@ - + + + + @@ -890,8 +1010,11 @@ - - - + + + + @@ -921,8 +1050,11 @@ - + + + + @@ -942,8 +1074,11 @@ - - - + - + @@ -1128,6 +1263,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -1188,8 +1343,11 @@ - - - - + - + @@ -1363,7 +1524,7 @@ - + @@ -1376,6 +1537,11 @@ + + + + + @@ -1400,7 +1566,7 @@ - + @@ -1421,14 +1587,22 @@ + + + + + - + + + + @@ -1440,13 +1614,18 @@ + + + + + - + + + + + + @@ -1499,7 +1684,7 @@ - + + + + + + @@ -1908,14 +2117,16 @@ - - - - - - - - + + + + + + + + + + @@ -1928,10 +2139,10 @@ - - - - + + + + @@ -2191,6 +2402,14 @@ MgA3AEEARwBQAFcAXABkAHkAewB9AH8AgQCLAJAAlQCgAKMApQCnAKkArgC5AMIAygDNANYA2wDoAOwA + + + + + + + + From 1ba5c737508084cb6318a7f22c42e26c0358e92b Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 11 Oct 2015 12:50:20 -0400 Subject: [PATCH 007/156] Added separator in preview view contextual menu --- CocoaSplit/PreviewView.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 481f1841..0c2bbfd4 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -285,6 +285,8 @@ [sourceListMenu insertItem:midiItem atIndex:[sourceListMenu.itemArray count]]; + [sourceListMenu insertItem:[NSMenuItem separatorItem] atIndex:[sourceListMenu.itemArray count]]; + for (InputSource *src in sourceList) { NSString *srcName = src.name; From f6b3067ddd66fd954de242c2ebcb159728a71f76 Mon Sep 17 00:00:00 2001 From: Zakk Date: Fri, 23 Oct 2015 23:15:35 -0400 Subject: [PATCH 008/156] Start of the 'input library' feature --- CocoaSplit.xcodeproj/project.pbxproj | 40 +++- CocoaSplit/CSInputLibraryItem.h | 16 ++ CocoaSplit/CSInputLibraryItem.m | 13 ++ CocoaSplit/CSPreviewGLLayer.h | 1 + CocoaSplit/CSPreviewGLLayer.m | 25 ++- CocoaSplit/CaptureController.h | 11 + CocoaSplit/CaptureController.m | 78 +++++++ CocoaSplit/CreateLayoutViewController.xib | 117 +++++----- CocoaSplit/Interface/AudioMixer.xib | 24 +- ...AMultiAudioMatrixMixerWindowController.xib | 20 +- .../Interface/CSInputLibraryItemView.xib | 42 ++++ .../CSInputLibraryWindowController.h | 20 ++ .../CSInputLibraryWindowController.m | 57 +++++ .../CSInputLibraryWindowController.xib | 123 +++++++++++ CocoaSplit/Interface/CSLayoutCollectionItem.m | 4 +- .../Interface/CSLayoutEditWindowController.h | 28 +++ .../Interface/CSLayoutEditWindowController.m | 67 ++++++ .../CSLayoutEditWindowController.xib | 206 ++++++++++++++++++ .../CSLibraryInputItemViewController.h | 16 ++ .../CSLibraryInputItemViewController.m | 33 +++ CocoaSplit/Interface/CapturePreview.xib | 35 --- CocoaSplit/Interface/advancedPrefPanel.xib | 23 +- CocoaSplit/LayoutRenderer.m | 6 +- CocoaSplit/PreviewView.h | 1 + CocoaSplit/PreviewView.m | 53 ++++- CocoaSplit/en.lproj/MainMenu.xib | 34 +-- 26 files changed, 953 insertions(+), 140 deletions(-) create mode 100644 CocoaSplit/CSInputLibraryItem.h create mode 100644 CocoaSplit/CSInputLibraryItem.m create mode 100644 CocoaSplit/Interface/CSInputLibraryItemView.xib create mode 100644 CocoaSplit/Interface/CSInputLibraryWindowController.h create mode 100644 CocoaSplit/Interface/CSInputLibraryWindowController.m create mode 100644 CocoaSplit/Interface/CSInputLibraryWindowController.xib create mode 100644 CocoaSplit/Interface/CSLayoutEditWindowController.h create mode 100644 CocoaSplit/Interface/CSLayoutEditWindowController.m create mode 100644 CocoaSplit/Interface/CSLayoutEditWindowController.xib create mode 100644 CocoaSplit/Interface/CSLibraryInputItemViewController.h create mode 100644 CocoaSplit/Interface/CSLibraryInputItemViewController.m delete mode 100644 CocoaSplit/Interface/CapturePreview.xib diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 703b6aec..1c66667d 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -8,6 +8,11 @@ /* Begin PBXBuildFile section */ 3400777016E6FE5D00097E8F /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 347B7FC916907AFA00B5F4B3 /* libz.dylib */; }; + 3400A0621BD44DF0003E1828 /* CSInputLibraryItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0611BD44DF0003E1828 /* CSInputLibraryItem.m */; settings = {ASSET_TAGS = (); }; }; + 3400A0791BD4533A003E1828 /* CSInputLibraryWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0771BD4533A003E1828 /* CSInputLibraryWindowController.m */; settings = {ASSET_TAGS = (); }; }; + 3400A07A1BD4533A003E1828 /* CSInputLibraryWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3400A0781BD4533A003E1828 /* CSInputLibraryWindowController.xib */; settings = {ASSET_TAGS = (); }; }; + 3400A07E1BD49406003E1828 /* CSInputLibraryItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3400A07D1BD49406003E1828 /* CSInputLibraryItemView.xib */; settings = {ASSET_TAGS = (); }; }; + 3400A0841BD522A5003E1828 /* CSLibraryInputItemViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0831BD522A5003E1828 /* CSLibraryInputItemViewController.m */; settings = {ASSET_TAGS = (); }; }; 3408235519BC677A00CD1F5F /* CSNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408235419BC530300CD1F5F /* CSNotifications.m */; }; 3408235619BC677C00CD1F5F /* CSNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408235419BC530300CD1F5F /* CSNotifications.m */; }; 340D8C971959C7C100BE5144 /* CompressionSettingsPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 340D8C961959C7C100BE5144 /* CompressionSettingsPanel.xib */; }; @@ -144,7 +149,6 @@ 3498D94A1A94685000906532 /* CSAudioSwitchCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3498D9491A94685000906532 /* CSAudioSwitchCell.m */; }; 3498D94F1A9472BD00906532 /* CSAudioSwitchControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3498D94E1A9472BD00906532 /* CSAudioSwitchControl.m */; }; 34A64A2F165EFE4C00A68428 /* PreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34A64A2E165EFE4B00A68428 /* PreviewView.m */; }; - 34A64A35165F047900A68428 /* CapturePreview.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34A64A34165F047900A68428 /* CapturePreview.xib */; }; 34A64A37165F208800A68428 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34A64A36165F208800A68428 /* QuartzCore.framework */; }; 34A7C1AD19B9A57600BC6882 /* CSLayoutSwitcherExtraPlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34A7C1A119B9A41A00BC6882 /* CSLayoutSwitcherExtraPlugin.bundle */; }; 34AB1C311B944F48003F2C03 /* CSPreviewOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AB1C301B944F48003F2C03 /* CSPreviewOverlayView.m */; }; @@ -316,6 +320,8 @@ 34ED8CB91B073C1B002C0674 /* CSMidiManagerWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34ED8CB61B073C1B002C0674 /* CSMidiManagerWindowController.xib */; }; 34ED8CBC1B07763F002C0674 /* CSMidiWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */; }; 34ED8CBD1B07763F002C0674 /* CSMidiWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */; }; + 34F1EB921BCCA41F00B38E6C /* CSLayoutEditWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F1EB901BCCA41F00B38E6C /* CSLayoutEditWindowController.m */; settings = {ASSET_TAGS = (); }; }; + 34F1EB931BCCA41F00B38E6C /* CSLayoutEditWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F1EB911BCCA41F00B38E6C /* CSLayoutEditWindowController.xib */; settings = {ASSET_TAGS = (); }; }; 34F5141216FD6E4F00BA894D /* x264Compressor.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F5140F16FD6E4F00BA894D /* x264Compressor.m */; }; 34F5141316FD6E4F00BA894D /* AppleVTCompressor.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F5141116FD6E4F00BA894D /* AppleVTCompressor.m */; }; 34F52A271BC1CE2700662911 /* CSLayoutCollectionItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F52A251BC1CE2700662911 /* CSLayoutCollectionItem.m */; settings = {ASSET_TAGS = (); }; }; @@ -553,6 +559,14 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 3400A0601BD44DF0003E1828 /* CSInputLibraryItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSInputLibraryItem.h; sourceTree = ""; }; + 3400A0611BD44DF0003E1828 /* CSInputLibraryItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSInputLibraryItem.m; sourceTree = ""; }; + 3400A0761BD4533A003E1828 /* CSInputLibraryWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSInputLibraryWindowController.h; path = Interface/CSInputLibraryWindowController.h; sourceTree = ""; }; + 3400A0771BD4533A003E1828 /* CSInputLibraryWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSInputLibraryWindowController.m; path = Interface/CSInputLibraryWindowController.m; sourceTree = ""; }; + 3400A0781BD4533A003E1828 /* CSInputLibraryWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSInputLibraryWindowController.xib; path = Interface/CSInputLibraryWindowController.xib; sourceTree = ""; }; + 3400A07D1BD49406003E1828 /* CSInputLibraryItemView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSInputLibraryItemView.xib; path = Interface/CSInputLibraryItemView.xib; sourceTree = ""; }; + 3400A0821BD522A5003E1828 /* CSLibraryInputItemViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSLibraryInputItemViewController.h; path = Interface/CSLibraryInputItemViewController.h; sourceTree = ""; }; + 3400A0831BD522A5003E1828 /* CSLibraryInputItemViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSLibraryInputItemViewController.m; path = Interface/CSLibraryInputItemViewController.m; sourceTree = ""; }; 3408234619BC50AD00CD1F5F /* CSNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSNotifications.h; path = PluginHeaders/CSNotifications.h; sourceTree = ""; }; 3408235419BC530300CD1F5F /* CSNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSNotifications.m; path = ../CSNotifications.m; sourceTree = ""; }; 340D8C961959C7C100BE5144 /* CompressionSettingsPanel.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CompressionSettingsPanel.xib; path = Interface/CompressionSettingsPanel.xib; sourceTree = ""; }; @@ -698,7 +712,6 @@ 3498D94E1A9472BD00906532 /* CSAudioSwitchControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSAudioSwitchControl.m; path = Interface/CSAudioSwitchControl.m; sourceTree = ""; }; 34A64A2D165EFE4B00A68428 /* PreviewView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreviewView.h; sourceTree = ""; }; 34A64A2E165EFE4B00A68428 /* PreviewView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PreviewView.m; sourceTree = ""; }; - 34A64A34165F047900A68428 /* CapturePreview.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CapturePreview.xib; path = Interface/CapturePreview.xib; sourceTree = ""; }; 34A64A36165F208800A68428 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 34A7C17A19B98EA200BC6882 /* CSExtraPluginProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSExtraPluginProtocol.h; path = PluginHeaders/CSExtraPluginProtocol.h; sourceTree = ""; }; 34A7C19C19B9A41900BC6882 /* CSLayoutSwitcherExtraPlugin.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CSLayoutSwitcherExtraPlugin.xcodeproj; path = ExtraPlugins/CSLayoutSwitcherExtraPlugin/CSLayoutSwitcherExtraPlugin.xcodeproj; sourceTree = ""; }; @@ -887,6 +900,9 @@ 34ED8CB61B073C1B002C0674 /* CSMidiManagerWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSMidiManagerWindowController.xib; path = Interface/CSMidiManagerWindowController.xib; sourceTree = ""; }; 34ED8CBA1B07763F002C0674 /* CSMidiWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSMidiWrapper.h; sourceTree = ""; }; 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSMidiWrapper.m; sourceTree = ""; }; + 34F1EB8F1BCCA41F00B38E6C /* CSLayoutEditWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSLayoutEditWindowController.h; path = Interface/CSLayoutEditWindowController.h; sourceTree = ""; }; + 34F1EB901BCCA41F00B38E6C /* CSLayoutEditWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSLayoutEditWindowController.m; path = Interface/CSLayoutEditWindowController.m; sourceTree = ""; }; + 34F1EB911BCCA41F00B38E6C /* CSLayoutEditWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSLayoutEditWindowController.xib; path = Interface/CSLayoutEditWindowController.xib; sourceTree = ""; }; 34F5140E16FD6E4F00BA894D /* x264Compressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = x264Compressor.h; path = Compressor/x264Compressor.h; sourceTree = ""; }; 34F5140F16FD6E4F00BA894D /* x264Compressor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = x264Compressor.m; path = Compressor/x264Compressor.m; sourceTree = ""; }; 34F5141016FD6E4F00BA894D /* AppleVTCompressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppleVTCompressor.h; path = Compressor/AppleVTCompressor.h; sourceTree = ""; }; @@ -1117,6 +1133,8 @@ 34BB29801B7652EA00F201C2 /* CSPreviewGLLayer.m */, 34AB1C2F1B944F48003F2C03 /* CSPreviewOverlayView.h */, 34AB1C301B944F48003F2C03 /* CSPreviewOverlayView.m */, + 3400A0601BD44DF0003E1828 /* CSInputLibraryItem.h */, + 3400A0611BD44DF0003E1828 /* CSInputLibraryItem.m */, ); path = CocoaSplit; sourceTree = ""; @@ -1208,7 +1226,6 @@ 34BD1E611B2481C20015CBEC /* CAMultiAudioMatrixMixerWindowController.m */, 34BD1E621B2481C20015CBEC /* CAMultiAudioMatrixMixerWindowController.xib */, 344825D11B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib */, - 34A64A34165F047900A68428 /* CapturePreview.xib */, 340D8C961959C7C100BE5144 /* CompressionSettingsPanel.xib */, 349461721AC49BB300F28883 /* CSAnimationChooserViewController.h */, 349461731AC49BB300F28883 /* CSAnimationChooserViewController.m */, @@ -1238,6 +1255,15 @@ 34F52A291BC1E0F800662911 /* CSLayoutButton.h */, 34F52A2A1BC1E0F800662911 /* CSLayoutButton.m */, 343ED9411BCAC1C80061FC4B /* EditBuiltinLayoutView.xib */, + 34F1EB8F1BCCA41F00B38E6C /* CSLayoutEditWindowController.h */, + 34F1EB901BCCA41F00B38E6C /* CSLayoutEditWindowController.m */, + 34F1EB911BCCA41F00B38E6C /* CSLayoutEditWindowController.xib */, + 3400A0761BD4533A003E1828 /* CSInputLibraryWindowController.h */, + 3400A0771BD4533A003E1828 /* CSInputLibraryWindowController.m */, + 3400A0781BD4533A003E1828 /* CSInputLibraryWindowController.xib */, + 3400A07D1BD49406003E1828 /* CSInputLibraryItemView.xib */, + 3400A0821BD522A5003E1828 /* CSLibraryInputItemViewController.h */, + 3400A0831BD522A5003E1828 /* CSLibraryInputItemViewController.m */, ); name = Interface; sourceTree = ""; @@ -2023,12 +2049,15 @@ files = ( 34F52A281BC1CE2700662911 /* CSLayoutCollectionItem.xib in Resources */, 347B14DD198492D900DC7DF0 /* InputPopupControllerViewController.xib in Resources */, + 3400A07A1BD4533A003E1828 /* CSInputLibraryWindowController.xib in Resources */, 34ED8CB91B073C1B002C0674 /* CSMidiManagerWindowController.xib in Resources */, 340FE4AC15F3417E00E4CE4E /* InfoPlist.strings in Resources */, 34BD1E651B2481C20015CBEC /* CAMultiAudioMatrixMixerWindowController.xib in Resources */, + 3400A07E1BD49406003E1828 /* CSInputLibraryItemView.xib in Resources */, 340FE4B215F3417E00E4CE4E /* Credits.rtf in Resources */, 340FE4B815F3417E00E4CE4E /* MainMenu.xib in Resources */, 34D4351B198BE3B700266169 /* NewLayoutPanel.xib in Resources */, + 34F1EB931BCCA41F00B38E6C /* CSLayoutEditWindowController.xib in Resources */, 342B33B61980771200492CB7 /* line.vtsh in Resources */, 34938EEF1AE4D24200F3B1CF /* CSFilterChooserWindowController.xib in Resources */, 3435E39B188B93150015CC01 /* passthrough.vtsh in Resources */, @@ -2037,7 +2066,6 @@ 340D8C971959C7C100BE5144 /* CompressionSettingsPanel.xib in Resources */, 34CFE49D18F1459600092C6A /* AudioMixer.xib in Resources */, 344988131893CF0500044259 /* LogWindow.xib in Resources */, - 34A64A35165F047900A68428 /* CapturePreview.xib in Resources */, 34D696FC1871B8F700B50EB6 /* Defaults.plist in Resources */, 34348C2B19BDBDC000A122C2 /* PluginManagerWindowController.xib in Resources */, 34ABEF3C17C0C2CB00AA5E62 /* advancedPrefPanel.xib in Resources */, @@ -2156,17 +2184,21 @@ 34A64A2F165EFE4C00A68428 /* PreviewView.m in Sources */, 34ED8CAB1B07371C002C0674 /* MIKMIDITrack.m in Sources */, 34ED8CA91B07371C002C0674 /* MIKMIDITempoEvent.m in Sources */, + 3400A0841BD522A5003E1828 /* CSLibraryInputItemViewController.m in Sources */, 34ED8C631B07371C002C0674 /* MIKMIDIErrors.m in Sources */, 34ED8C551B07371C002C0674 /* MIKMIDIControlChangeCommand.m in Sources */, 349461681ABC57C100F28883 /* CSAnimationItem.m in Sources */, 34ED8C971B07371C002C0674 /* MIKMIDIPlayer.m in Sources */, 34ED8C591B07371C002C0674 /* MIKMIDIDevice.m in Sources */, + 3400A0791BD4533A003E1828 /* CSInputLibraryWindowController.m in Sources */, 345F8B691A16C348009A81E3 /* CAMultiAudioGraph.m in Sources */, 3431FFE119786502000965FE /* InputSource.m in Sources */, 34ED8C911B07371C002C0674 /* MIKMIDINoteOnCommand.m in Sources */, 3498D94F1A9472BD00906532 /* CSAudioSwitchControl.m in Sources */, + 3400A0621BD44DF0003E1828 /* CSInputLibraryItem.m in Sources */, 34ED8C831B07371C002C0674 /* MIKMIDIMetaSequenceEvent.m in Sources */, 34ED8C6D1B07371C002C0674 /* MIKMIDIMapping.m in Sources */, + 34F1EB921BCCA41F00B38E6C /* CSLayoutEditWindowController.m in Sources */, 34ED8CA31B07371C002C0674 /* MIKMIDISourceEndpoint.m in Sources */, 34ED8C4D1B07371C002C0674 /* MIKMIDIClientSourceEndpoint.m in Sources */, 34ED8C811B07371C002C0674 /* MIKMIDIMetaMarkerTextEvent.m in Sources */, diff --git a/CocoaSplit/CSInputLibraryItem.h b/CocoaSplit/CSInputLibraryItem.h new file mode 100644 index 00000000..069fa467 --- /dev/null +++ b/CocoaSplit/CSInputLibraryItem.h @@ -0,0 +1,16 @@ +// +// CSInputLibraryItem.h +// CocoaSplit +// +// Created by Zakk on 10/18/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import + +@interface CSInputLibraryItem : NSObject + +@property (strong) NSString *name; +@property (strong) NSData *inputData; + +@end diff --git a/CocoaSplit/CSInputLibraryItem.m b/CocoaSplit/CSInputLibraryItem.m new file mode 100644 index 00000000..ae7b931f --- /dev/null +++ b/CocoaSplit/CSInputLibraryItem.m @@ -0,0 +1,13 @@ +// +// CSInputLibraryItem.m +// CocoaSplit +// +// Created by Zakk on 10/18/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import "CSInputLibraryItem.h" + +@implementation CSInputLibraryItem + +@end diff --git a/CocoaSplit/CSPreviewGLLayer.h b/CocoaSplit/CSPreviewGLLayer.h index e860bb5d..795bf57d 100644 --- a/CocoaSplit/CSPreviewGLLayer.h +++ b/CocoaSplit/CSPreviewGLLayer.h @@ -36,6 +36,7 @@ @property (assign) float snap_y; @property (assign) float snap_x; +@property (assign) bool doRender; -(NSPoint)realPointforWindowPoint:(NSPoint)winPoint; diff --git a/CocoaSplit/CSPreviewGLLayer.m b/CocoaSplit/CSPreviewGLLayer.m index 56cce2ec..1d09b558 100644 --- a/CocoaSplit/CSPreviewGLLayer.m +++ b/CocoaSplit/CSPreviewGLLayer.m @@ -34,6 +34,7 @@ { + CGLSetCurrentContext(ctx); if (!_initDone) { @@ -44,8 +45,25 @@ } glClear(GL_COLOR_BUFFER_BIT); + if (!self.renderer) + { + return; + } - CVPixelBufferRef toDraw = [self.renderer currentFrame]; + + CVPixelBufferRef toDraw; + if (self.doRender) + { + toDraw = [self.renderer currentImg]; + CGLSetCurrentContext(ctx); + + if (toDraw) + { + CVPixelBufferRetain(toDraw); + } + } else { + toDraw = [self.renderer currentFrame]; + } if (!toDraw) { @@ -103,6 +121,7 @@ glMatrixMode(GL_PROJECTION); glLoadIdentity(); + glOrtho(0.0, self.bounds.size.width, 0.0, self.bounds.size.height, 0, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -112,6 +131,7 @@ if (_resizeDirty) { + NSLog(@"RESIZE DIRTY"); glGetDoublev(GL_MODELVIEW_MATRIX, _modelview); glGetDoublev(GL_PROJECTION_MATRIX, _projection); glGetIntegerv(GL_VIEWPORT, _viewport); @@ -248,8 +268,7 @@ glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); glDisable(GL_TEXTURE_RECTANGLE_ARB); - - + [super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts]; diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 8e24dc2c..761cdb1c 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -28,6 +28,8 @@ #import "CSMidiManagerWindowController.h" #import "MIKMIDI.h" #import "CSTimerSourceProtocol.h" +#import "CSInputLibraryWindowController.h" +#import "CSInputLibraryItem.h" @@ -37,6 +39,7 @@ @class InputSource; @class SourceLayout; @class LayoutPreviewWindowController; +@class CSLayoutEditWindowController; @@ -126,6 +129,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , NSPopover *_animatepopOver; NSMutableArray *_screensCache; + NSMutableArray *_layoutWindows; @@ -134,6 +138,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , +@property (strong) NSMutableArray *inputLibrary; + @property (weak) IBOutlet NSMenu *stagingFullScreenMenu; @property (weak) IBOutlet NSMenu *liveFullScreenMenu; @@ -401,6 +407,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) PreviewView *activePreviewView; +@property (strong) CSInputLibraryWindowController *inputLibraryController; @@ -461,7 +468,11 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(void)toggleLayout:(SourceLayout *)layout; -(void)saveToLayout:(SourceLayout *)layout; -(void)switchToLayout:(SourceLayout *)layout; +-(void)openLayoutWindow:(SourceLayout *)layout; +-(void)layoutWindowWillClose:(CSLayoutEditWindowController *)windowController; +-(void)addInputToLibrary:(InputSource *)source; +- (IBAction)openLibraryWindow:(id) sender; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 7f0da68e..f8d1c4c0 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -26,6 +26,8 @@ #import "MIKMIDI.h" #import "CSMidiWrapper.h" #import "CSCaptureBase+TimerDelegate.h" +#import "CSLayoutEditWindowController.h" + #import @@ -135,6 +137,67 @@ } +-(void)layoutWindowWillClose:(CSLayoutEditWindowController *)windowController +{ + if ([_layoutWindows containsObject:windowController]) + { + [_layoutWindows removeObject:windowController]; + } +} + + +- (IBAction)openLibraryWindow:(id) sender +{ + CSInputLibraryWindowController *newController = [[CSInputLibraryWindowController alloc] init]; + + [newController showWindow:nil]; + + newController.controller = self; + + self.inputLibraryController = newController; +} + +-(void)addInputToLibrary:(InputSource *)source +{ + NSMutableData *saveData = [NSMutableData data]; + NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:saveData]; + [archiver encodeObject:source forKey:@"root"]; + [archiver finishEncoding]; + CSInputLibraryItem *newItem = [[CSInputLibraryItem alloc] init]; + + newItem.name = source.name; + newItem.inputData = saveData; + + NSUInteger cIdx = self.inputLibrary.count; + + [self insertObject:newItem inInputLibraryAtIndex:cIdx]; + + NSLog(@"ADDED NEW ITEM %@ %@", newItem, newItem.name); +} + + +-(void)openLayoutWindow:(SourceLayout *)layout +{ + CSLayoutEditWindowController *newController = [[CSLayoutEditWindowController alloc] init]; + + [newController showWindow:nil]; + + newController.previewView.isEditWindow = YES; + + LayoutRenderer *wRenderer = [[LayoutRenderer alloc] init]; + + newController.previewView.layoutRenderer = wRenderer; + + newController.previewView.controller = self; + newController.previewView.sourceLayout = layout; + [newController.previewView.sourceLayout restoreSourceList:nil]; + + + [_layoutWindows addObject:newController]; + +} + + - (IBAction)openLayoutPopover:(NSButton *)sender { @@ -968,6 +1031,8 @@ if (self = [super init]) { + _layoutWindows = [NSMutableArray array]; + self.transitionDirections = @[kCATransitionFromTop, kCATransitionFromRight, kCATransitionFromBottom, kCATransitionFromLeft]; @@ -1758,6 +1823,8 @@ // [self.stagingLayout mergeSourceLayout:tmpLayout withLayer:nil]; } + self.inputLibrary = [NSMutableArray array]; + } @@ -2897,6 +2964,17 @@ } +-(void) insertObject:(CSInputLibraryItem *)item inInputLibraryAtIndex:(NSUInteger)index +{ + [self.inputLibrary insertObject:item atIndex:index]; +} + +-(void)removeObjectFromInputLibraryAtIndex:(NSUInteger)index +{ + [self.inputLibrary removeObjectAtIndex:index]; +} + + -(NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { diff --git a/CocoaSplit/CreateLayoutViewController.xib b/CocoaSplit/CreateLayoutViewController.xib index ddccdcd5..59d1afa6 100644 --- a/CocoaSplit/CreateLayoutViewController.xib +++ b/CocoaSplit/CreateLayoutViewController.xib @@ -13,11 +13,11 @@ - + - + @@ -25,12 +25,11 @@ - - + @@ -39,7 +38,7 @@ - + @@ -48,7 +47,7 @@ - + @@ -59,8 +58,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/CocoaSplit/Interface/AudioMixer.xib b/CocoaSplit/Interface/AudioMixer.xib index 3a6f9ac3..aabc1de2 100644 --- a/CocoaSplit/Interface/AudioMixer.xib +++ b/CocoaSplit/Interface/AudioMixer.xib @@ -1,8 +1,8 @@ - + - + @@ -23,15 +23,16 @@ - - + + - + + - + @@ -71,21 +72,27 @@ + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CSLibraryInputItemViewController.h b/CocoaSplit/Interface/CSLibraryInputItemViewController.h new file mode 100644 index 00000000..544f8e1b --- /dev/null +++ b/CocoaSplit/Interface/CSLibraryInputItemViewController.h @@ -0,0 +1,16 @@ +// +// CSLibraryInputItemViewController.h +// CocoaSplit +// +// Created by Zakk on 10/19/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import +#import "CSInputLibraryItem.h" + +@interface CSLibraryInputItemViewController : NSViewController + +@property (strong) CSInputLibraryItem *item; + +@end diff --git a/CocoaSplit/Interface/CSLibraryInputItemViewController.m b/CocoaSplit/Interface/CSLibraryInputItemViewController.m new file mode 100644 index 00000000..ada10409 --- /dev/null +++ b/CocoaSplit/Interface/CSLibraryInputItemViewController.m @@ -0,0 +1,33 @@ +// +// CSLibraryInputItemViewController.m +// CocoaSplit +// +// Created by Zakk on 10/19/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import "CSLibraryInputItemViewController.h" + +@interface CSLibraryInputItemViewController () + +@end + +@implementation CSLibraryInputItemViewController + +-(instancetype) init +{ + if (self = [super initWithNibName:@"CSInputLibraryItemView" bundle:nil]) + { + + } + + return self; +} + + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do view setup here. +} + +@end diff --git a/CocoaSplit/Interface/CapturePreview.xib b/CocoaSplit/Interface/CapturePreview.xib deleted file mode 100644 index 30ae3bef..00000000 --- a/CocoaSplit/Interface/CapturePreview.xib +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CocoaSplit/Interface/advancedPrefPanel.xib b/CocoaSplit/Interface/advancedPrefPanel.xib index fada8bc7..d15ecce6 100644 --- a/CocoaSplit/Interface/advancedPrefPanel.xib +++ b/CocoaSplit/Interface/advancedPrefPanel.xib @@ -1,8 +1,8 @@ - + - + @@ -21,8 +21,9 @@ - + @@ -105,6 +113,7 @@ DQ + @@ -113,6 +122,7 @@ DQ + @@ -124,6 +134,7 @@ DQ + @@ -135,6 +146,7 @@ DQ + @@ -143,6 +155,7 @@ DQ + @@ -154,6 +167,7 @@ DQ + @@ -172,6 +187,7 @@ DQ + @@ -190,6 +206,7 @@ DQ + diff --git a/CocoaSplit/LayoutRenderer.m b/CocoaSplit/LayoutRenderer.m index bd8d870a..1d6a6394 100644 --- a/CocoaSplit/LayoutRenderer.m +++ b/CocoaSplit/LayoutRenderer.m @@ -112,6 +112,7 @@ glLoadIdentity(); glOrtho(0, _cvpool_size.width, 0,_cvpool_size.height, -1, 1); + NSLog(@"CVPOOL %@", NSStringFromSize(_cvpool_size)); glMatrixMode(GL_MODELVIEW); @@ -157,7 +158,6 @@ _currentLayout = self.layout; [_currentLayout didBecomeVisible]; - } -(void)renderToSurface:(IOSurfaceRef)ioSurface @@ -218,6 +218,10 @@ -(CVPixelBufferRef)currentImg { + if (self.cglCtx) + { + CGLSetCurrentContext(self.cglCtx); + } CVPixelBufferRef destFrame = NULL; CGFloat frameWidth, frameHeight; diff --git a/CocoaSplit/PreviewView.h b/CocoaSplit/PreviewView.h index af69c372..6dc5b818 100644 --- a/CocoaSplit/PreviewView.h +++ b/CocoaSplit/PreviewView.h @@ -101,6 +101,7 @@ @property (strong) NSViewController *activePopupController; @property (strong) NSMutableDictionary *activeConfigWindows; @property (strong) NSMutableDictionary *activeConfigControllers; +@property (assign) bool isEditWindow; -(void)needsUpdate; -(NSRect)windowRectforWorldRect:(NSRect)worldRect; diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 0c2bbfd4..0df19bc1 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -87,6 +87,7 @@ if (_glLayer) { _glLayer.renderer = layoutRenderer; + _glLayer.doRender = self.isEditWindow; } _layoutRenderer = layoutRenderer; @@ -98,6 +99,8 @@ { return _layoutRenderer; } + + -(SourceLayout *)sourceLayout { return _sourceLayout; @@ -106,7 +109,7 @@ -(void) setSourceLayout:(SourceLayout *)sourceLayout { - if (_sourceLayout) + if (_sourceLayout && !self.isEditWindow) { [NSApp unregisterMIDIResponder:_sourceLayout]; @@ -115,7 +118,10 @@ [self.undoManager removeAllActions]; sourceLayout.undoManager = self.undoManager; - [NSApp registerMIDIResponder:sourceLayout]; + if (!self.isEditWindow) + { + [NSApp registerMIDIResponder:sourceLayout]; + } if (self.layoutRenderer) { @@ -199,6 +205,33 @@ } +- (IBAction)addInputToLibrary:(id)sender +{ + + InputSource *toAdd = nil; + + if (sender) + { + if ([sender isKindOfClass:[NSMenuItem class]]) + { + NSMenuItem *item = (NSMenuItem *)sender; + toAdd = (InputSource *)item.representedObject; + } else if ([sender isKindOfClass:[InputSource class]]) { + toAdd = (InputSource *)sender; + } + } + + if (!toAdd) + { + toAdd = self.selectedSource; + } + + if (toAdd) + { + [self.controller addInputToLibrary:toAdd]; + } +} + -(void) buildSettingsMenu { @@ -210,15 +243,14 @@ tmp.target = self; tmp = [self.sourceSettingsMenu insertItemWithTitle:@"Move Down" action:@selector(moveInputDown:) keyEquivalent:@"" atIndex:idx++]; tmp.target = self; - tmp = [self.sourceSettingsMenu insertItemWithTitle:@"Auto Fit" action:@selector(autoFitInput:) keyEquivalent:@"" atIndex:idx++]; - tmp.target = self; tmp = [self.sourceSettingsMenu insertItemWithTitle:@"Settings" action:@selector(showInputSettings:) keyEquivalent:@"" atIndex:idx++]; tmp.target = self; - tmp = [self.sourceSettingsMenu insertItemWithTitle:@"Delete" action:@selector(deleteInput:) keyEquivalent:@"" atIndex:idx++]; - tmp.target = self; tmp = [self.sourceSettingsMenu insertItemWithTitle:@"Clone" action:@selector(cloneInputSource:) keyEquivalent:@"" atIndex:idx++]; tmp.target = self; + tmp = [self.sourceSettingsMenu insertItemWithTitle:@"Add to Library" action:@selector(addInputToLibrary:) keyEquivalent:@"" atIndex:idx++]; + tmp.target = self; + tmp = [self.sourceSettingsMenu insertItemWithTitle:@"Midi Mapping" action:@selector(midiMapSource:) keyEquivalent:@"" atIndex:idx++]; tmp.target = self; @@ -309,6 +341,13 @@ [delItem setRepresentedObject:src]; [delItem setTarget:self]; [submenu addItem:delItem]; + + NSMenuItem *libraryItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:@"Add to Library" action:@selector(addInputToLibrary:) keyEquivalent:@""]; + [libraryItem setEnabled:YES]; + [libraryItem setRepresentedObject:src]; + [libraryItem setTarget:self]; + [submenu addItem:libraryItem]; + NSMenuItem *cloneItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:@"Clone" action:@selector(cloneInputSource:) keyEquivalent:@""]; [cloneItem setEnabled:YES]; [cloneItem setRepresentedObject:src]; @@ -1382,7 +1421,7 @@ -(CALayer *)makeBackingLayer { _glLayer = [CSPreviewGLLayer layer]; - + _glLayer.doRender = self.isEditWindow; return _glLayer; } diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 809c6121..1b52fce9 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -180,6 +180,12 @@ + + + + + + @@ -388,14 +394,14 @@ - + - + - + @@ -410,7 +416,7 @@ - + @@ -422,7 +428,7 @@ - - + @@ -474,7 +480,7 @@ - + @@ -507,7 +513,7 @@ - + @@ -519,7 +525,7 @@ - + @@ -529,7 +535,7 @@ - + @@ -590,7 +596,7 @@ - - - - + From f8e9481697c2f7d2a62a3f276fd8fc5cedba0e5b Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 24 Oct 2015 17:05:24 -0400 Subject: [PATCH 009/156] Input library items are drag+droppable onto the preview views --- .../Interface/CSInputLibraryItemView.xib | 23 +++++++---- .../CSInputLibraryWindowController.h | 2 +- .../CSInputLibraryWindowController.m | 17 ++++++++ .../CSInputLibraryWindowController.xib | 9 +++-- CocoaSplit/PreviewView.m | 39 +++++++++++++++++++ 5 files changed, 77 insertions(+), 13 deletions(-) diff --git a/CocoaSplit/Interface/CSInputLibraryItemView.xib b/CocoaSplit/Interface/CSInputLibraryItemView.xib index b8d92d53..ff071c37 100644 --- a/CocoaSplit/Interface/CSInputLibraryItemView.xib +++ b/CocoaSplit/Interface/CSInputLibraryItemView.xib @@ -1,5 +1,5 @@ - + @@ -12,26 +12,33 @@ - - + + - - + + + + + + + + - - + + + - + diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.h b/CocoaSplit/Interface/CSInputLibraryWindowController.h index 20232da7..9ee797c0 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.h +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.h @@ -10,7 +10,7 @@ @class CaptureController; -@interface CSInputLibraryWindowController : NSWindowController +@interface CSInputLibraryWindowController : NSWindowController @property (strong) CaptureController *controller; @property (weak) IBOutlet NSTableView *tableView; diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.m b/CocoaSplit/Interface/CSInputLibraryWindowController.m index a99c7bda..82ba7a8c 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.m +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.m @@ -29,12 +29,29 @@ [super windowDidLoad]; // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. + [self.tableView registerForDraggedTypes:@[@"CSInputPasteBoard"]]; } //Table view delegate +-(BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard +{ + NSMutableArray *dataArray = [NSMutableArray array]; + [pboard declareTypes:[NSArray arrayWithObject:@"CSInputPasteBoard"] owner:self]; + NSArray *draggedItems = [self.itemArrayController.arrangedObjects objectsAtIndexes:rowIndexes]; + + for (CSInputLibraryItem *item in draggedItems) + { + [dataArray addObject:item.inputData]; + } + + NSData *pbData = [NSArchiver archivedDataWithRootObject:dataArray]; + + [pboard setData:pbData forType: @"CSInputPasteBoard"]; + return YES; +} -(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.xib b/CocoaSplit/Interface/CSInputLibraryWindowController.xib index 5a5bbcd8..b590ebbc 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.xib +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.xib @@ -1,5 +1,5 @@ - + @@ -23,14 +23,14 @@ - + - - + + @@ -81,6 +81,7 @@ + diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 0df19bc1..486add4c 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -1415,9 +1415,48 @@ [self setWantsLayer:YES]; self.layer.backgroundColor = CGColorCreateGenericRGB(0.184314f, 0.309804f, 0.309804f, 1); + [self registerForDraggedTypes:@[@"CSInputPasteBoard"]]; } +-(NSDragOperation)draggingEntered:(id)sender +{ + NSPasteboard *pboard; + pboard = [sender draggingPasteboard]; + if ([pboard.types containsObject:@"CSInputPasteBoard"]) + { + NSLog(@"INPUT FROM PASTEBOARD!"); + return NSDragOperationGeneric; + } + return NSDragOperationNone; +} + +-(BOOL)performDragOperation:(id)sender +{ + NSPasteboard *pboard; + + pboard = [sender draggingPasteboard]; + + if ([pboard.types containsObject:@"CSInputPasteBoard"]) + { + NSData *aData = [pboard dataForType:@"CSInputPasteBoard"]; + NSArray *iArray = [NSUnarchiver unarchiveObjectWithData:aData]; + for (NSData *iData in iArray) + { + NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:iData]; + + + InputSource *iSrc = [unarchiver decodeObjectForKey:@"root"]; + [self.sourceLayout addSource:iSrc]; + + [unarchiver finishDecoding]; + } + return YES; + } + return NO; +} + + -(CALayer *)makeBackingLayer { _glLayer = [CSPreviewGLLayer layer]; From 841f1891544af6040d9f0c556da090c0fc0a89bd Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 24 Oct 2015 17:06:21 -0400 Subject: [PATCH 010/156] Input library items are drag+droppable onto the preview views --- .gitmodules | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitmodules b/.gitmodules index 237fc4de..c2991a0d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "CapturePlugins/CSSyphonCapturePlugin/Syphon-Framework"] path = CapturePlugins/CSSyphonCapturePlugin/Syphon-Framework url = https://github.com/palana/Syphon-Framework.git + ignore = all From 51a6b839dceaa857721e28bcaffb941254d91488 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 25 Oct 2015 02:55:00 -0400 Subject: [PATCH 011/156] Update to more modern drag+drop API, block dropping onto live layout --- CocoaSplit/CSInputLibraryItem.h | 3 +- CocoaSplit/CSInputLibraryItem.m | 58 +++++++++++++++++++ CocoaSplit/InputSource.h | 2 + CocoaSplit/InputSource.m | 13 +++-- .../Interface/CSInputLibraryItemView.xib | 30 +++++++--- .../CSInputLibraryWindowController.m | 13 +---- .../CSInputLibraryWindowController.xib | 43 +++++++++----- .../CSLayoutEditWindowController.xib | 2 +- .../InputPopupControllerViewController.xib | 2 +- CocoaSplit/PreviewView.m | 41 ++++++++++--- 10 files changed, 160 insertions(+), 47 deletions(-) diff --git a/CocoaSplit/CSInputLibraryItem.h b/CocoaSplit/CSInputLibraryItem.h index 069fa467..cd968d1c 100644 --- a/CocoaSplit/CSInputLibraryItem.h +++ b/CocoaSplit/CSInputLibraryItem.h @@ -8,9 +8,10 @@ #import -@interface CSInputLibraryItem : NSObject +@interface CSInputLibraryItem : NSObject @property (strong) NSString *name; @property (strong) NSData *inputData; +@property (strong) NSImage *inputImage; @end diff --git a/CocoaSplit/CSInputLibraryItem.m b/CocoaSplit/CSInputLibraryItem.m index ae7b931f..8ba457f4 100644 --- a/CocoaSplit/CSInputLibraryItem.m +++ b/CocoaSplit/CSInputLibraryItem.m @@ -10,4 +10,62 @@ @implementation CSInputLibraryItem + + +-(instancetype) init +{ + if (self = [super init]) + { + self.inputImage = [NSImage imageNamed:NSImageNameUser]; + } + + return self; +} + +-(void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.name forKey:@"name"]; + [aCoder encodeObject:self.inputImage forKey:@"inputImage"]; + [aCoder encodeObject:self.inputData forKey:@"inputData"]; +} + +-(instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super init]) + { + _name = [aDecoder decodeObjectForKey:@"name"]; + _inputData = [aDecoder decodeObjectForKey:@"inputData"]; + _inputImage = [aDecoder decodeObjectForKey:@"inputImage"]; + } + + return self; +} + + +-(id)initWithPasteboardPropertyList:(id)propertyList ofType:(NSString *)type +{ + return [NSKeyedUnarchiver unarchiveObjectWithData:propertyList]; +} + ++(NSArray *)readableTypesForPasteboard:(NSPasteboard *)pasteboard +{ + return @[@"cocoasplit.library.item"]; +} + +- (NSArray *)writableTypesForPasteboard:(NSPasteboard *)pasteboard +{ + return @[@"cocoasplit.library.item"]; +} + +-(id)pasteboardPropertyListForType:(NSString *)type +{ + if (![type isEqualToString:@"cocoasplit.library.item"]) + { + return nil; + } + + return [NSKeyedArchiver archivedDataWithRootObject:self]; +} + + @end diff --git a/CocoaSplit/InputSource.h b/CocoaSplit/InputSource.h index 40d4299e..8bb375a2 100644 --- a/CocoaSplit/InputSource.h +++ b/CocoaSplit/InputSource.h @@ -222,6 +222,8 @@ typedef enum resize_style_t { -(void)deleteBackgroundFilter:(NSString *)filteruuid; -(void)buildLayerConstraints; -(void)restoreConstraints; +-(void)createUUID; + diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 2401a082..7753643d 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -579,10 +579,7 @@ static NSArray *_sourceTypes = nil; _multiTransition.removedOnCompletion = YES; - - CFUUIDRef tmpUUID = CFUUIDCreate(NULL); - self.uuid = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, tmpUUID); - CFRelease(tmpUUID); + [self createUUID]; self.layoutPosition = self.layer.frame; @@ -608,6 +605,14 @@ static NSArray *_sourceTypes = nil; +-(void)createUUID +{ + CFUUIDRef tmpUUID = CFUUIDCreate(NULL); + self.uuid = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, tmpUUID); + CFRelease(tmpUUID); + +} + -(void)setRotateStyle:(input_rotate_style)rotateStyle { [self registerUndoForProperty:@"rotateStyle" withAction:@"Order"]; diff --git a/CocoaSplit/Interface/CSInputLibraryItemView.xib b/CocoaSplit/Interface/CSInputLibraryItemView.xib index ff071c37..3632ed2a 100644 --- a/CocoaSplit/Interface/CSInputLibraryItemView.xib +++ b/CocoaSplit/Interface/CSInputLibraryItemView.xib @@ -13,14 +13,11 @@ - + - - - - + @@ -31,14 +28,29 @@ + + + + + + + + + + + + - - - + + + + + + - + diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.m b/CocoaSplit/Interface/CSInputLibraryWindowController.m index 82ba7a8c..d164ef47 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.m +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.m @@ -29,7 +29,7 @@ [super windowDidLoad]; // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. - [self.tableView registerForDraggedTypes:@[@"CSInputPasteBoard"]]; + [self.tableView registerForDraggedTypes:@[@"cocoasplit.library.item"]]; } @@ -38,18 +38,11 @@ -(BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard { - NSMutableArray *dataArray = [NSMutableArray array]; - [pboard declareTypes:[NSArray arrayWithObject:@"CSInputPasteBoard"] owner:self]; NSArray *draggedItems = [self.itemArrayController.arrangedObjects objectsAtIndexes:rowIndexes]; - for (CSInputLibraryItem *item in draggedItems) - { - [dataArray addObject:item.inputData]; - } + [pboard clearContents]; + [pboard writeObjects:draggedItems]; - NSData *pbData = [NSArchiver archivedDataWithRootObject:dataArray]; - - [pboard setData:pbData forType: @"CSInputPasteBoard"]; return YES; } diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.xib b/CocoaSplit/Interface/CSInputLibraryWindowController.xib index b590ebbc..88bb064e 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.xib +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.xib @@ -17,24 +17,25 @@ - + - + - - - + + + - - + + + @@ -87,7 +88,7 @@ - + + - - - - + + + + + + - + @@ -121,4 +135,7 @@ + + + diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.xib b/CocoaSplit/Interface/CSLayoutEditWindowController.xib index 289c007c..72a46ef1 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.xib +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/Interface/InputPopupControllerViewController.xib b/CocoaSplit/Interface/InputPopupControllerViewController.xib index 56e4195c..b0e60773 100644 --- a/CocoaSplit/Interface/InputPopupControllerViewController.xib +++ b/CocoaSplit/Interface/InputPopupControllerViewController.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 486add4c..6ddd376a 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -1415,7 +1415,7 @@ [self setWantsLayer:YES]; self.layer.backgroundColor = CGColorCreateGenericRGB(0.184314f, 0.309804f, 0.309804f, 1); - [self registerForDraggedTypes:@[@"CSInputPasteBoard"]]; + [self registerForDraggedTypes:@[@"cocoasplit.library.item"]]; } @@ -1423,9 +1423,8 @@ { NSPasteboard *pboard; pboard = [sender draggingPasteboard]; - if ([pboard.types containsObject:@"CSInputPasteBoard"]) + if ([pboard.types containsObject:@"cocoasplit.library.item"] && !self.viewOnly) { - NSLog(@"INPUT FROM PASTEBOARD!"); return NSDragOperationGeneric; } return NSDragOperationNone; @@ -1437,19 +1436,45 @@ pboard = [sender draggingPasteboard]; - if ([pboard.types containsObject:@"CSInputPasteBoard"]) + + if ([pboard canReadItemWithDataConformingToTypes:@[@"cocoasplit.library.item"]]) { - NSData *aData = [pboard dataForType:@"CSInputPasteBoard"]; - NSArray *iArray = [NSUnarchiver unarchiveObjectWithData:aData]; - for (NSData *iData in iArray) + + NSArray *classes = @[[CSInputLibraryItem class]]; + NSArray *draggedObjects = [pboard readObjectsForClasses:classes options:@{}]; + + for (CSInputLibraryItem *item in draggedObjects) { + NSData *iData = item.inputData; + NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:iData]; InputSource *iSrc = [unarchiver decodeObjectForKey:@"root"]; + [unarchiver finishDecoding]; + + NSPoint mouseLoc = [NSEvent mouseLocation]; + + NSRect rect = NSRectFromCGRect((CGRect){mouseLoc, CGSizeZero}); + + mouseLoc = [self.window convertRectFromScreen:rect].origin; + mouseLoc = [self convertPoint:mouseLoc fromView:nil]; + + if (![self mouse:mouseLoc inRect:self.bounds]) + { + return NO; + } + + + NSPoint worldPoint = [self realPointforWindowPoint:mouseLoc]; + + iSrc.x_pos = worldPoint.x; + iSrc.y_pos = worldPoint.y; + + [iSrc createUUID]; + [self.sourceLayout addSource:iSrc]; - [unarchiver finishDecoding]; } return YES; } From 0f896bd6197a421887ed82658766bc25b1935676 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 25 Oct 2015 04:32:22 -0400 Subject: [PATCH 012/156] Input library now saves/restores. Added drag+drop reordering of the input library window --- CocoaSplit/CaptureController.m | 7 ++- .../CSInputLibraryWindowController.h | 5 ++ .../CSInputLibraryWindowController.m | 47 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index f8d1c4c0..03e07992 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1644,6 +1644,7 @@ [self saveMIDI]; + [saveRoot setValue:self.inputLibrary forKey:@"inputLibrary"]; [NSKeyedArchiver archiveRootObject:saveRoot toFile:path]; } @@ -1823,7 +1824,11 @@ // [self.stagingLayout mergeSourceLayout:tmpLayout withLayer:nil]; } - self.inputLibrary = [NSMutableArray array]; + self.inputLibrary = [saveRoot valueForKey:@"inputLibrary"]; + if (!self.inputLibrary) + { + self.inputLibrary = [NSMutableArray array]; + } } diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.h b/CocoaSplit/Interface/CSInputLibraryWindowController.h index 9ee797c0..47933871 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.h +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.h @@ -11,6 +11,11 @@ @class CaptureController; @interface CSInputLibraryWindowController : NSWindowController +{ + NSRange _dragRange; + NSArray *_draggingObjects; +} + @property (strong) CaptureController *controller; @property (weak) IBOutlet NSTableView *tableView; diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.m b/CocoaSplit/Interface/CSInputLibraryWindowController.m index d164ef47..d7dfbbd6 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.m +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.m @@ -35,6 +35,53 @@ //Table view delegate +-(void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes +{ + NSUInteger dlen = (rowIndexes.lastIndex+1) - rowIndexes.firstIndex; + _dragRange = NSMakeRange(rowIndexes.firstIndex, dlen); + _draggingObjects = [self.itemArrayController.arrangedObjects objectsAtIndexes:rowIndexes]; +} + +-(void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation +{ + _dragRange = NSMakeRange(0, 0); + _draggingObjects = nil; +} + +-(NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation +{ + if (dropOperation == NSTableViewDropAbove && (_dragRange.location > row || _dragRange.location+_dragRange.length < row)) + { + if ([info draggingSource] == self.tableView) + { + return NSDragOperationMove; + } + } + return NSDragOperationNone; +} + + +-(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation +{ + [tableView beginUpdates]; + NSArray *classes = @[[CSInputLibraryItem class]]; + + [info enumerateDraggingItemsWithOptions:0 forView:tableView classes:classes searchOptions:@{} usingBlock:^(NSDraggingItem * _Nonnull draggingItem, NSInteger idx, BOOL * _Nonnull stop) { + NSInteger newIdx = row+idx; + CSInputLibraryItem *dragItem = _draggingObjects[idx]; + NSInteger oldIdx = [self.itemArrayController.arrangedObjects indexOfObject:dragItem]; + if (oldIdx < newIdx) + { + newIdx -= idx+1; + } + + [self.controller.inputLibrary removeObjectAtIndex:oldIdx]; + [self.controller.inputLibrary insertObject:dragItem atIndex:newIdx]; + [self.tableView moveRowAtIndex:oldIdx toIndex:newIdx]; + }]; + [tableView endUpdates]; + return YES; +} -(BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard { From 475b8d65b9db8453b33d18fb4458b8742108d510 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 25 Oct 2015 04:56:12 -0400 Subject: [PATCH 013/156] Input library allows multiple selections for drag+drop and reordering --- CocoaSplit/Interface/CSInputLibraryWindowController.xib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.xib b/CocoaSplit/Interface/CSInputLibraryWindowController.xib index 88bb064e..d1bad806 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.xib +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.xib @@ -29,7 +29,7 @@ - + From 2749544f71f7e236dd6dac8b241d8a2170c3de96 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 25 Oct 2015 20:39:10 -0400 Subject: [PATCH 014/156] Added some capture type icons for the library. Library now filterable/searchable --- .../CSDesktopCapturePlugin/DesktopCapture.m | 6 +++ .../CSImageCapturePlugin/ImageCapture.m | 10 +++++ .../CSCurrentTimeCapture.m | 12 +++++ .../CSTimeCapturePlugin/CSTimeIntervalBase.m | 12 +++++ CocoaSplit/CSCaptureBase.m | 7 +++ CocoaSplit/CSInputLibraryItem.h | 4 ++ CocoaSplit/CSInputLibraryItem.m | 42 ++++++++++++++++++ CocoaSplit/CSTextCaptureBase.m | 6 +++ CocoaSplit/CaptureController.m | 10 +---- .../CSInputLibraryWindowController.h | 1 + .../CSInputLibraryWindowController.m | 12 ++++- .../CSInputLibraryWindowController.xib | 44 ++++++++++++------- CocoaSplit/PluginHeaders/CSCaptureBase.h | 2 + .../PluginHeaders/CSCaptureSourceProtocol.h | 2 + 14 files changed, 145 insertions(+), 25 deletions(-) diff --git a/CapturePlugins/CSDesktopCapturePlugin/CSDesktopCapturePlugin/DesktopCapture.m b/CapturePlugins/CSDesktopCapturePlugin/CSDesktopCapturePlugin/DesktopCapture.m index e69a728b..e360991e 100644 --- a/CapturePlugins/CSDesktopCapturePlugin/CSDesktopCapturePlugin/DesktopCapture.m +++ b/CapturePlugins/CSDesktopCapturePlugin/CSDesktopCapturePlugin/DesktopCapture.m @@ -85,6 +85,12 @@ } +-(NSImage *)libraryImage +{ + return [NSImage imageNamed:NSImageNameComputer]; +} + + -(void)frameTick { diff --git a/CapturePlugins/CSImageCapturePlugin/CSImageCapturePlugin/ImageCapture.m b/CapturePlugins/CSImageCapturePlugin/CSImageCapturePlugin/ImageCapture.m index 2c451ef1..738ff6b8 100644 --- a/CapturePlugins/CSImageCapturePlugin/CSImageCapturePlugin/ImageCapture.m +++ b/CapturePlugins/CSImageCapturePlugin/CSImageCapturePlugin/ImageCapture.m @@ -91,6 +91,16 @@ +-(NSImage *)libraryImage +{ + if (self.imagePath) + { + return [[NSImage alloc] initWithContentsOfFile:self.imagePath]; + } + return nil; +} + + -(NSString *)imagePath { diff --git a/CapturePlugins/CSTimeCapturePlugin/CSCurrentTimeCapture.m b/CapturePlugins/CSTimeCapturePlugin/CSCurrentTimeCapture.m index d3b119ec..ee14631b 100644 --- a/CapturePlugins/CSTimeCapturePlugin/CSCurrentTimeCapture.m +++ b/CapturePlugins/CSTimeCapturePlugin/CSCurrentTimeCapture.m @@ -61,6 +61,18 @@ } } +-(NSImage *)libraryImage +{ + NSString *calPath = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.apple.iCal"]; + + if (calPath) + { + return [[NSWorkspace sharedWorkspace] iconForFile:calPath]; + } + return nil; +} + + +(NSString *)label { diff --git a/CapturePlugins/CSTimeCapturePlugin/CSTimeIntervalBase.m b/CapturePlugins/CSTimeCapturePlugin/CSTimeIntervalBase.m index 233ebce9..9b82a958 100644 --- a/CapturePlugins/CSTimeCapturePlugin/CSTimeIntervalBase.m +++ b/CapturePlugins/CSTimeCapturePlugin/CSTimeIntervalBase.m @@ -58,6 +58,18 @@ } +-(NSImage *)libraryImage +{ + NSString *calPath = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.apple.iCal"]; + + if (calPath) + { + return [[NSWorkspace sharedWorkspace] iconForFile:calPath]; + } + return nil; +} + + -(void)setFormat:(NSString *)format { _format = format; diff --git a/CocoaSplit/CSCaptureBase.m b/CocoaSplit/CSCaptureBase.m index 05faa56a..e0f40a92 100644 --- a/CocoaSplit/CSCaptureBase.m +++ b/CocoaSplit/CSCaptureBase.m @@ -76,6 +76,13 @@ return self; } + +-(NSImage *)libraryImage +{ + return nil; +} + + -(NSString *) configurationViewClassName { return [NSString stringWithFormat:@"%@ViewController", self.className]; diff --git a/CocoaSplit/CSInputLibraryItem.h b/CocoaSplit/CSInputLibraryItem.h index cd968d1c..6c2e5add 100644 --- a/CocoaSplit/CSInputLibraryItem.h +++ b/CocoaSplit/CSInputLibraryItem.h @@ -7,6 +7,8 @@ // #import +#import "InputSource.h" + @interface CSInputLibraryItem : NSObject @@ -14,4 +16,6 @@ @property (strong) NSData *inputData; @property (strong) NSImage *inputImage; +-(instancetype) initWithInput:(InputSource *)input; + @end diff --git a/CocoaSplit/CSInputLibraryItem.m b/CocoaSplit/CSInputLibraryItem.m index 8ba457f4..d51e4873 100644 --- a/CocoaSplit/CSInputLibraryItem.m +++ b/CocoaSplit/CSInputLibraryItem.m @@ -11,6 +11,48 @@ @implementation CSInputLibraryItem +-(instancetype) initWithInput:(InputSource *)input +{ + if (self = [super init]) + { + NSString *inputType = @"None"; + NSString *inputName = @"No Name"; + + if (input.videoInput) + { + inputType = [input.videoInput.class label]; + NSImage *img = [input.videoInput libraryImage]; + if (img) + { + NSImage *thumb = [[NSImage alloc] initWithSize:NSMakeSize(32, 32)]; + NSRect fromRect = NSMakeRect(0, 0, img.size.width, img.size.height); + [thumb lockFocus]; + [img drawInRect:NSMakeRect(0, 0, 32, 32) fromRect:fromRect operation:NSCompositeCopy fraction:1.0f]; + [thumb unlockFocus]; + self.inputImage = thumb; + } + } + + if (input.name) + { + inputName = input.name; + } + + self.name = [NSString stringWithFormat:@"%@ %@", inputType, inputName]; + NSMutableData *saveData = [NSMutableData data]; + NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:saveData]; + [archiver encodeObject:input forKey:@"root"]; + [archiver finishEncoding]; + self.inputData = saveData; + if (!self.inputImage) + { + self.inputImage = [NSImage imageNamed:NSImageNameUser]; + } + } + + return self; +} + -(instancetype) init { diff --git a/CocoaSplit/CSTextCaptureBase.m b/CocoaSplit/CSTextCaptureBase.m index c6e13a91..96d33480 100644 --- a/CocoaSplit/CSTextCaptureBase.m +++ b/CocoaSplit/CSTextCaptureBase.m @@ -101,6 +101,12 @@ } +-(NSImage *)libraryImage +{ + return [NSImage imageNamed:NSImageNameFontPanel]; +} + + -(void) buildString { diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 03e07992..3aad0ac0 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -159,20 +159,12 @@ -(void)addInputToLibrary:(InputSource *)source { - NSMutableData *saveData = [NSMutableData data]; - NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:saveData]; - [archiver encodeObject:source forKey:@"root"]; - [archiver finishEncoding]; - CSInputLibraryItem *newItem = [[CSInputLibraryItem alloc] init]; + CSInputLibraryItem *newItem = [[CSInputLibraryItem alloc] initWithInput:source]; - newItem.name = source.name; - newItem.inputData = saveData; - NSUInteger cIdx = self.inputLibrary.count; [self insertObject:newItem inInputLibraryAtIndex:cIdx]; - NSLog(@"ADDED NEW ITEM %@ %@", newItem, newItem.name); } diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.h b/CocoaSplit/Interface/CSInputLibraryWindowController.h index 47933871..58dddc53 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.h +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.h @@ -22,4 +22,5 @@ @property (strong) NSMutableArray *tableControllers; @property (strong) IBOutlet NSArrayController *itemArrayController; +- (IBAction)deleteItem:(id)sender; @end diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.m b/CocoaSplit/Interface/CSInputLibraryWindowController.m index d7dfbbd6..e75541c9 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.m +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.m @@ -83,6 +83,7 @@ return YES; } + -(BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard { NSArray *draggedItems = [self.itemArrayController.arrangedObjects objectsAtIndexes:rowIndexes]; @@ -100,7 +101,7 @@ self.tableControllers = [NSMutableArray array]; } - CSInputLibraryItem *cItem = [self.controller.inputLibrary objectAtIndex:row]; + CSInputLibraryItem *cItem = [self.itemArrayController.arrangedObjects objectAtIndex:row]; if (cItem) { CSLibraryInputItemViewController *vCont = [[CSLibraryInputItemViewController alloc] init]; @@ -111,4 +112,13 @@ return nil; } +- (IBAction)deleteItem:(id)sender +{ + [self.tableView beginUpdates]; + [self.itemArrayController removeObjectsAtArrangedObjectIndexes:self.tableView.selectedRowIndexes]; +// [self.tableView removeRowsAtIndexes:self.tableView.selectedRowIndexes withAnimation:NSTableViewAnimationEffectFade]; + [self.tableView endUpdates]; +} + + @end diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.xib b/CocoaSplit/Interface/CSInputLibraryWindowController.xib index d1bad806..c6e537b1 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.xib +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.xib @@ -23,7 +23,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -102,23 +102,40 @@ - + + + + + + + + + + + + predicate + self.name CONTAINS[cd] $value + + + + - - + - + + @@ -135,7 +152,4 @@ - - - diff --git a/CocoaSplit/PluginHeaders/CSCaptureBase.h b/CocoaSplit/PluginHeaders/CSCaptureBase.h index b1c4afe3..ebc6bd01 100644 --- a/CocoaSplit/PluginHeaders/CSCaptureBase.h +++ b/CocoaSplit/PluginHeaders/CSCaptureBase.h @@ -115,4 +115,6 @@ typedef enum frame_render_behavior_t { -(void)frameArrived; +-(NSImage *)libraryImage; + @end diff --git a/CocoaSplit/PluginHeaders/CSCaptureSourceProtocol.h b/CocoaSplit/PluginHeaders/CSCaptureSourceProtocol.h index a6e11eac..1196b7b8 100644 --- a/CocoaSplit/PluginHeaders/CSCaptureSourceProtocol.h +++ b/CocoaSplit/PluginHeaders/CSCaptureSourceProtocol.h @@ -121,6 +121,8 @@ If your source is 'shared' between inputSources each new one will call this func -(void)frameArrived; +-(NSImage *)libraryImage; + From 68220c9237ce614e5cde24c40fbd2a7fe04e4c37 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 26 Oct 2015 05:58:39 -0400 Subject: [PATCH 015/156] Added contextual menu and delete item to the input library --- .../Interface/CSInputLibraryWindowController.h | 4 ++++ .../Interface/CSInputLibraryWindowController.m | 11 +++++++++++ .../Interface/CSInputLibraryWindowController.xib | 15 +++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.h b/CocoaSplit/Interface/CSInputLibraryWindowController.h index 58dddc53..2dcf84f7 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.h +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.h @@ -23,4 +23,8 @@ @property (strong) IBOutlet NSArrayController *itemArrayController; - (IBAction)deleteItem:(id)sender; + + +- (IBAction)doDeleteFromMenu:(id)sender; + @end diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.m b/CocoaSplit/Interface/CSInputLibraryWindowController.m index e75541c9..854c228a 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.m +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.m @@ -120,5 +120,16 @@ [self.tableView endUpdates]; } +- (IBAction)doDeleteFromMenu:(id)sender +{ + if (self.tableView.selectedRowIndexes.count == 0) + { + NSIndexSet *toSelect = [NSIndexSet indexSetWithIndex:self.tableView.clickedRow]; + [self.tableView selectRowIndexes:toSelect byExtendingSelection:NO]; + } + [self deleteItem:sender]; +} + + @end diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.xib b/CocoaSplit/Interface/CSInputLibraryWindowController.xib index c6e537b1..c88d2109 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.xib +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.xib @@ -84,6 +84,7 @@ + @@ -151,5 +152,19 @@ + + + + + + + + + + + + + + From 4e87760b9884ee1e6e2bc8b653cec1d510f8762c Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 1 Nov 2015 03:41:08 -0500 Subject: [PATCH 016/156] updatePosition for input changed so it doesn't freak out when a rotation is active --- CocoaSplit/CSInputLibraryItem.h | 3 + CocoaSplit/CSInputLibraryItem.m | 25 ++++++ CocoaSplit/CaptureController.h | 2 +- CocoaSplit/CaptureController.m | 9 ++- CocoaSplit/InputSource.h | 6 ++ CocoaSplit/InputSource.m | 42 +++++++--- CocoaSplit/Interface/AudioMixer.xib | 2 +- .../CSInputLibraryWindowController.h | 13 +++- .../CSInputLibraryWindowController.m | 78 +++++++++++++++++++ .../CSInputLibraryWindowController.xib | 5 +- CocoaSplit/Interface/advancedPrefPanel.xib | 2 +- CocoaSplit/PreviewView.m | 4 +- 12 files changed, 172 insertions(+), 19 deletions(-) diff --git a/CocoaSplit/CSInputLibraryItem.h b/CocoaSplit/CSInputLibraryItem.h index 6c2e5add..4bcf04a4 100644 --- a/CocoaSplit/CSInputLibraryItem.h +++ b/CocoaSplit/CSInputLibraryItem.h @@ -15,7 +15,10 @@ @property (strong) NSString *name; @property (strong) NSData *inputData; @property (strong) NSImage *inputImage; +@property (strong) InputSource *editInput; -(instancetype) initWithInput:(InputSource *)input; +-(void)makeDataFromInput:(InputSource *)input; +-(InputSource *)makeInput; @end diff --git a/CocoaSplit/CSInputLibraryItem.m b/CocoaSplit/CSInputLibraryItem.m index d51e4873..573112a9 100644 --- a/CocoaSplit/CSInputLibraryItem.m +++ b/CocoaSplit/CSInputLibraryItem.m @@ -84,6 +84,31 @@ } +-(InputSource *)makeInput +{ + if (!self.inputData) + { + return nil; + } + + NSData *iData = self.inputData; + + NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:iData]; + + + InputSource *iSrc = [unarchiver decodeObjectForKey:@"root"]; + [unarchiver finishDecoding]; + return iSrc; +} + +-(void)makeDataFromInput:(InputSource *)input +{ + NSMutableData *saveData = [NSMutableData data]; + NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:saveData]; + [archiver encodeObject:input forKey:@"root"]; + [archiver finishEncoding]; + self.inputData = saveData; +} -(id)initWithPasteboardPropertyList:(id)propertyList ofType:(NSString *)type { return [NSKeyedUnarchiver unarchiveObjectWithData:propertyList]; diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 761cdb1c..6746086b 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -468,7 +468,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(void)toggleLayout:(SourceLayout *)layout; -(void)saveToLayout:(SourceLayout *)layout; -(void)switchToLayout:(SourceLayout *)layout; --(void)openLayoutWindow:(SourceLayout *)layout; +-(CSLayoutEditWindowController *)openLayoutWindow:(SourceLayout *)layout; -(void)layoutWindowWillClose:(CSLayoutEditWindowController *)windowController; -(void)addInputToLibrary:(InputSource *)source; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 3aad0ac0..24a7b091 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -139,6 +139,8 @@ -(void)layoutWindowWillClose:(CSLayoutEditWindowController *)windowController { + + NSLog(@"LAYOUT WINDOW WILL CLOSE"); if ([_layoutWindows containsObject:windowController]) { [_layoutWindows removeObject:windowController]; @@ -168,7 +170,7 @@ } --(void)openLayoutWindow:(SourceLayout *)layout +-(CSLayoutEditWindowController *)openLayoutWindow:(SourceLayout *)layout { CSLayoutEditWindowController *newController = [[CSLayoutEditWindowController alloc] init]; @@ -183,14 +185,17 @@ newController.previewView.controller = self; newController.previewView.sourceLayout = layout; [newController.previewView.sourceLayout restoreSourceList:nil]; + newController.delegate = self; [_layoutWindows addObject:newController]; - + return newController; } + + - (IBAction)openLayoutPopover:(NSButton *)sender { diff --git a/CocoaSplit/InputSource.h b/CocoaSplit/InputSource.h index 8bb375a2..0f27a7d7 100644 --- a/CocoaSplit/InputSource.h +++ b/CocoaSplit/InputSource.h @@ -76,6 +76,8 @@ typedef enum resize_style_t { NSDictionary *_constraintAttributeMap; NSArray *_constraintObserveKeys; NSMutableDictionary *_restoredConstraintMap; + CGFloat _topLevelWidth; + CGFloat _topLevelHeight; } @@ -194,6 +196,9 @@ typedef enum resize_style_t { @property (assign) CGFloat gradientStopX; @property (assign) CGFloat gradientStopY; +@property (readonly) CGFloat topLevelWidth; +@property (readonly) CGFloat topLevelHeight; + -(void) updateOrigin:(CGFloat)x y:(CGFloat)y; -(void) positionOrigin:(CGFloat)x y:(CGFloat)y; @@ -223,6 +228,7 @@ typedef enum resize_style_t { -(void)buildLayerConstraints; -(void)restoreConstraints; -(void)createUUID; +-(void)updateRotationTransform; diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 7753643d..5a3d1a58 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -116,6 +116,7 @@ static NSArray *_sourceTypes = nil; + -(void) encodeWithCoder:(NSCoder *)aCoder { @@ -143,6 +144,16 @@ static NSArray *_sourceTypes = nil; [aCoder encodeObject:self.videoInput forKey:@"videoInput"]; } + if (self.sourceLayout) + { + [aCoder encodeFloat:self.canvas_width forKey:@"topLevelWidth"]; + [aCoder encodeFloat:self.canvas_height forKey:@"topLevelHeight"]; + } else { + [aCoder encodeFloat:_topLevelWidth forKey:@"topLevelWidth"]; + [aCoder encodeFloat:_topLevelHeight forKey:@"topLevelHeight"]; + } + + [aCoder encodeBool:self.doChromaKey forKey:@"doChromaKey"]; [aCoder encodeObject:self.chromaKeyColor forKey:@"chromaKeyColor"]; [aCoder encodeFloat:self.chromaKeyThreshold forKey:@"chromaKeyThreshold"]; @@ -283,13 +294,6 @@ static NSArray *_sourceTypes = nil; self.constraintMap = constraintData; } - - - - - - - _rotationAngle = [aDecoder decodeFloatForKey:@"rotationAngle"]; _rotationAngleX = [aDecoder decodeFloatForKey:@"rotationAngleX"]; _rotationAngleY = [aDecoder decodeFloatForKey:@"rotationAngleY"]; @@ -420,7 +424,15 @@ static NSArray *_sourceTypes = nil; self.gradientStopY = [aDecoder decodeFloatForKey:@"gradientEndPointY"]; - + if ([aDecoder containsValueForKey:@"topLevelWidth"]) + { + _topLevelWidth = [aDecoder decodeFloatForKey:@"topLevelWidth"]; + } + + if ([aDecoder containsValueForKey:@"topLevelHeight"]) + { + _topLevelHeight = [aDecoder decodeFloatForKey:@"topLevelHeight"]; + } self.layer.filters = [aDecoder decodeObjectForKey:@"layerFilters"]; @@ -442,6 +454,18 @@ static NSArray *_sourceTypes = nil; return self; } + +-(CGFloat)topLevelHeight +{ + return _topLevelHeight; +} + +-(CGFloat)topLevelWidth +{ + return _topLevelWidth; +} + + -(CGRect)globalLayoutPosition { return [self.sourceLayout.rootLayer convertRect:self.layoutPosition fromLayer:self.layer.superlayer]; @@ -1921,7 +1945,7 @@ static NSArray *_sourceTypes = nil; newFrame.origin.x = x; newFrame.origin.y = y; [CATransaction begin]; - self.layer.frame = NSIntegralRect(newFrame); + self.layer.position = newFrame.origin; [CATransaction commit]; } diff --git a/CocoaSplit/Interface/AudioMixer.xib b/CocoaSplit/Interface/AudioMixer.xib index aabc1de2..b6f3b74f 100644 --- a/CocoaSplit/Interface/AudioMixer.xib +++ b/CocoaSplit/Interface/AudioMixer.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.h b/CocoaSplit/Interface/CSInputLibraryWindowController.h index 2dcf84f7..1f414668 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.h +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.h @@ -7,10 +7,13 @@ // #import +#import "InputPopupControllerViewController.h" +#import "CSInputLibraryItem.h" @class CaptureController; +@class CSLayoutEditWindowController; -@interface CSInputLibraryWindowController : NSWindowController +@interface CSInputLibraryWindowController : NSWindowController { NSRange _dragRange; NSArray *_draggingObjects; @@ -22,9 +25,17 @@ @property (strong) NSMutableArray *tableControllers; @property (strong) IBOutlet NSArrayController *itemArrayController; +@property (strong) InputPopupControllerViewController *activePopupController; +@property (strong) CSInputLibraryItem *activePopupItem; + +@property (strong) SourceLayout *editLayout; + +@property (strong) CSLayoutEditWindowController *editWindowController; + - (IBAction)deleteItem:(id)sender; - (IBAction)doDeleteFromMenu:(id)sender; +-(IBAction)doEditFromMenu:(id)sender; @end diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.m b/CocoaSplit/Interface/CSInputLibraryWindowController.m index 854c228a..f1d0a34e 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.m +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.m @@ -9,6 +9,7 @@ #import "CSInputLibraryWindowController.h" #import "CaptureController.h" #import "CSLibraryInputItemViewController.h" +#import "CSLayoutEditWindowController.h" @interface CSInputLibraryWindowController () @@ -120,6 +121,37 @@ [self.tableView endUpdates]; } + +-(void)popoverWillClose:(NSNotification *)notification +{ + if (self.activePopupController && self.activePopupItem) + { + InputSource *editInput = self.activePopupController.inputSource; + + //[editInput frameTick]; + + [self.activePopupItem makeDataFromInput:editInput]; + } + + self.activePopupItem = nil; +} + +-(void)popoverDidClose:(NSNotification *)notification +{ + self.activePopupItem = nil; + self.activePopupController = nil; + self.editLayout = nil; +} + + +-(void)layoutWindowWillClose:(id)controller +{ + [self.activePopupItem makeDataFromInput:self.activePopupItem.editInput]; + self.activePopupItem.editInput = nil; + [self.controller layoutWindowWillClose:controller]; +} + + - (IBAction)doDeleteFromMenu:(id)sender { if (self.tableView.selectedRowIndexes.count == 0) @@ -130,6 +162,52 @@ [self deleteItem:sender]; } +-(IBAction)doEditFromMenu:(id)sender +{ + + CSInputLibraryItem *cItem = [self.itemArrayController.arrangedObjects objectAtIndex:self.tableView.clickedRow]; + + + + + + InputSource *iSrc = [cItem makeInput]; + cItem.editInput = iSrc; + + //self.editLayout = [[SourceLayout alloc] init]; + + CGFloat parent_width = iSrc.topLevelWidth; + CGFloat parent_height = iSrc.topLevelHeight; + + //self.editLayout.canvas_width = parent_width; + //self.editLayout.canvas_height = parent_height; + NSLog(@"PARENT WIDTH %f HEIGHT %f", parent_width, parent_height); + + + //[self.editLayout addSource:iSrc]; + + /* + self.editWindowController = [[CSLayoutEditWindowController alloc] init]; + self.editWindowController.previewView.sourceLayout = self.editLayout; + [self.editWindowController showWindow:nil]; + */ + //self.editWindowController = [self.controller openLayoutWindow:self.editLayout]; + //self.editWindowController.delegate = self; + + InputPopupControllerViewController *popupController = [[InputPopupControllerViewController alloc] init]; + + NSPopover *popover = [[NSPopover alloc] init]; + popover.contentViewController = popupController; + popover.animates = YES; + popover.delegate = self; + popover.behavior = NSPopoverBehaviorTransient; + [popover showRelativeToRect:self.tableView.frame ofView:self.tableView preferredEdge:NSMaxXEdge]; + + //[iSrc frameTick]; + popupController.inputSource = iSrc; + self.activePopupItem = cItem; + self.activePopupController = popupController; +} @end diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.xib b/CocoaSplit/Interface/CSInputLibraryWindowController.xib index c88d2109..6ff590bc 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.xib +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.xib @@ -30,7 +30,7 @@ - + @@ -156,6 +156,9 @@ + + + diff --git a/CocoaSplit/Interface/advancedPrefPanel.xib b/CocoaSplit/Interface/advancedPrefPanel.xib index d15ecce6..7397f998 100644 --- a/CocoaSplit/Interface/advancedPrefPanel.xib +++ b/CocoaSplit/Interface/advancedPrefPanel.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 6ddd376a..0a3d2d28 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -1468,13 +1468,11 @@ NSPoint worldPoint = [self realPointforWindowPoint:mouseLoc]; - iSrc.x_pos = worldPoint.x; - iSrc.y_pos = worldPoint.y; [iSrc createUUID]; [self.sourceLayout addSource:iSrc]; - + [iSrc positionOrigin:worldPoint.x y:worldPoint.y]; } return YES; } From 27d61122a0889c475985b9ae88779d84ff157d3b Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 1 Nov 2015 08:30:10 -0500 Subject: [PATCH 017/156] Inputs are now resolution independent. Example: If you setup the size and position of an input at 1280x720 and either merge or drag it into a 1920x1080 layout the input will be the same apparent size and position as it was in the original layout. --- CocoaSplit/InputSource.h | 7 ++--- CocoaSplit/InputSource.m | 41 ++++++++++++++++-------- CocoaSplit/PreviewView.m | 4 ++- CocoaSplit/SourceLayout.m | 65 +++++++++++++++++++++++++++++++++++++-- 4 files changed, 97 insertions(+), 20 deletions(-) diff --git a/CocoaSplit/InputSource.h b/CocoaSplit/InputSource.h index 0f27a7d7..c5bb4ca0 100644 --- a/CocoaSplit/InputSource.h +++ b/CocoaSplit/InputSource.h @@ -76,8 +76,6 @@ typedef enum resize_style_t { NSDictionary *_constraintAttributeMap; NSArray *_constraintObserveKeys; NSMutableDictionary *_restoredConstraintMap; - CGFloat _topLevelWidth; - CGFloat _topLevelHeight; } @@ -196,8 +194,8 @@ typedef enum resize_style_t { @property (assign) CGFloat gradientStopX; @property (assign) CGFloat gradientStopY; -@property (readonly) CGFloat topLevelWidth; -@property (readonly) CGFloat topLevelHeight; +@property (assign) CGFloat topLevelWidth; +@property (assign) CGFloat topLevelHeight; -(void) updateOrigin:(CGFloat)x y:(CGFloat)y; @@ -229,6 +227,7 @@ typedef enum resize_style_t { -(void)restoreConstraints; -(void)createUUID; -(void)updateRotationTransform; +-(void) directSize:(CGFloat)width height:(CGFloat)height; diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 5a3d1a58..ae39c988 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -455,16 +455,6 @@ static NSArray *_sourceTypes = nil; } --(CGFloat)topLevelHeight -{ - return _topLevelHeight; -} - --(CGFloat)topLevelWidth -{ - return _topLevelWidth; -} - -(CGRect)globalLayoutPosition { @@ -522,6 +512,9 @@ static NSArray *_sourceTypes = nil; _nextImageTime = 0.0f; _currentSourceIdx = 0; + _topLevelHeight = 0; + _topLevelWidth = 0; + self.changeInterval = 20.0f; @@ -1625,7 +1618,7 @@ static NSArray *_sourceTypes = nil; { [self registerUndoForProperty:@"width" withAction:@"Width"]; _width = width; - [self updateSize:_width height:_height]; + [self directSize:_width height:_height]; } -(float)width @@ -1637,7 +1630,7 @@ static NSArray *_sourceTypes = nil; { [self registerUndoForProperty:@"height" withAction:@"Height"]; _height = height; - [self updateSize:_width height:_height]; + [self directSize:_width height:_height]; } -(float)height @@ -1770,6 +1763,17 @@ static NSArray *_sourceTypes = nil; +-(void) directSize:(CGFloat)width height:(CGFloat)height +{ + NSRect newLayout = self.layoutPosition; + + newLayout.size.width = width; + newLayout.size.height = height; + + NSRect iRect = NSIntegralRect(newLayout); + + self.layer.bounds = iRect; +} -(void) updateSize:(CGFloat)width height:(CGFloat)height { @@ -1818,7 +1822,15 @@ static NSArray *_sourceTypes = nil; newLayout.size.height = height; self.layer.allowResize = tmpResize; + NSRect iRect = NSIntegralRect(newLayout); + NSRect cFrame = oldLayout; + cFrame.origin = iRect.origin; + + //self.layer.frame = cFrame; + //self.layer.bounds = iRect; + self.layer.frame = NSIntegralRect(newLayout); + self.layer.allowResize = oldResize; } @@ -1941,12 +1953,15 @@ static NSArray *_sourceTypes = nil; if (self.layer) { + /* NSRect newFrame = self.layer.frame; newFrame.origin.x = x; newFrame.origin.y = y; [CATransaction begin]; - self.layer.position = newFrame.origin; + self.layer.frame = newFrame; [CATransaction commit]; + */ + [self updateOrigin:x-self.layer.frame.origin.x y:y-self.layer.frame.origin.y]; } diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 0a3d2d28..23e871e0 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -1472,7 +1472,9 @@ [iSrc createUUID]; [self.sourceLayout addSource:iSrc]; - [iSrc positionOrigin:worldPoint.x y:worldPoint.y]; + //[iSrc positionOrigin:worldPoint.x y:worldPoint.y]; + iSrc.x_pos = worldPoint.x; + iSrc.y_pos = worldPoint.y; } return YES; } diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 7ee3ca52..226015e9 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -548,6 +548,7 @@ [self mergeSourceListData:toMerge.savedSourceListData]; + [self adjustAllInputs]; [self.containedLayouts addObject:toMerge]; if (self.addLayoutBlock) { @@ -716,6 +717,7 @@ src.layer.hidden = NO; [CATransaction commit]; } + [NSApp registerMIDIResponder:src]; @@ -1104,6 +1106,58 @@ } +-(void) adjustInputPosition:(InputSource *)src +{ + if (src.topLevelHeight > 0 && src.topLevelWidth > 0) + { + float wRatio = self.canvas_width/src.topLevelWidth; + float hRatio = self.canvas_height/src.topLevelHeight; + float new_xpos = src.layer.frame.origin.x * wRatio; + float new_ypos = src.layer.frame.origin.y * hRatio; + NSLog(@"NEW POSITIONS %f %f", new_xpos, new_ypos); + src.x_pos = new_xpos; + src.y_pos = new_ypos; + } +} + + +-(void) adjustAllInputs +{ + + NSArray *copiedInputs = [self sourceListOrdered]; + + for (InputSource *src in copiedInputs) + { + [self adjustInputSize:src doPosition:YES]; + } +} + + +-(void) adjustInputSize:(InputSource *)src doPosition:(bool)doPosition +{ + + [src frameTick]; + if (src.topLevelHeight > 0 && src.topLevelWidth > 0) + { + float wRatio = self.canvas_width/src.topLevelWidth; + float hRatio = self.canvas_height/src.topLevelHeight; + float old_x = src.x_pos; + float old_y = src.y_pos; + float new_width = src.layer.bounds.size.width * wRatio; + float new_height = src.layer.bounds.size.height * hRatio; + [src directSize:new_width height:new_height]; + if (doPosition) + { + src.x_pos = old_x*wRatio; + src.y_pos = old_y*hRatio; + } + } + + src.topLevelWidth = self.canvas_width; + src.topLevelHeight = self.canvas_height; + +} + -(void) addSource:(InputSource *)newSource { @@ -1113,10 +1167,12 @@ [[self mutableArrayValueForKey:@"sourceList" ] addObject:newSource]; - [self.rootLayer addSublayer:newSource.layer]; + + [self adjustInputSize:newSource doPosition:NO]; [_uuidMap setObject:newSource forKey:newSource.uuid]; + [NSApp registerMIDIResponder:newSource]; [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationInputAdded object:newSource userInfo:nil]; @@ -1230,7 +1286,7 @@ -(void)frameTick { - + bool needsResize = NO; NSSize curSize = NSMakeSize(self.canvas_width, self.canvas_height); if (!NSEqualSizes(curSize, _rootSize)) @@ -1239,6 +1295,7 @@ self.rootLayer.bounds = CGRectMake(0, 0, self.canvas_width, self.canvas_height); _rootSize = curSize; + needsResize = YES; } NSArray *listCopy = [self sourceListOrdered]; @@ -1246,6 +1303,10 @@ for (InputSource *isource in listCopy) { + if (needsResize) + { + [self adjustInputSize:isource doPosition:YES]; + } if (isource.active) { From 9803c947311f1c53d8e51e24b340179b253b195a Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 2 Nov 2015 01:37:43 -0500 Subject: [PATCH 018/156] Layouts now save the source list when encoding regardless of isActive status --- CocoaSplit/SourceLayout.m | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 226015e9..76909425 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -296,10 +296,7 @@ { [aCoder encodeObject:self.name forKey:@"name"]; - if (self.isActive) - { - [self saveSourceList]; - } + [self saveSourceList]; [aCoder encodeObject:self.savedSourceListData forKey:@"savedSourceData"]; From 00ea1a6fcbe77b71a001182b9facc022cbc22a8b Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 2 Nov 2015 02:03:30 -0500 Subject: [PATCH 019/156] Preview view's right click menu now highlights the source corresponding to the active menu item --- CocoaSplit/PreviewView.m | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 23e871e0..fa443090 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -288,6 +288,19 @@ } +-(void)menu:(NSMenu *)menu willHighlightItem:(nullable NSMenuItem *)item +{ + if (item.representedObject) + { + InputSource *hInput = (InputSource *)item.representedObject; + if (_overlayView) + { + _overlayView.parentSource = hInput; + } + } +} + + -(NSMenu *) buildSourceMenu { @@ -295,7 +308,7 @@ NSArray *sourceList = [self.sourceLayout sourceListOrdered]; NSMenu *sourceListMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] init]; - + sourceListMenu.delegate = self; NSString *resTitle = [NSString stringWithFormat:@"%dx%d@%.2f", self.sourceLayout.canvas_width, self.sourceLayout.canvas_height, self.sourceLayout.frameRate]; @@ -355,7 +368,8 @@ [submenu addItem:cloneItem]; [srcItem setSubmenu:submenu]; - + [srcItem setRepresentedObject:src]; + [sourceListMenu insertItem:srcItem atIndex:[sourceListMenu.itemArray count]]; } From 47b040afe7e0a06d1b70d90d8b7f5518c3aad8bf Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 2 Nov 2015 03:46:40 -0500 Subject: [PATCH 020/156] Added new source button to layout edit window --- CocoaSplit/CSPreviewGLLayer.m | 1 - CocoaSplit/CaptureController.m | 1 - .../Interface/CSLayoutEditWindowController.h | 1 + .../Interface/CSLayoutEditWindowController.m | 6 ++ .../CSLayoutEditWindowController.xib | 87 +++++++++++-------- .../Interface/EditBuiltinLayoutView.xib | 2 +- CocoaSplit/en.lproj/MainMenu.xib | 30 +++---- 7 files changed, 75 insertions(+), 53 deletions(-) diff --git a/CocoaSplit/CSPreviewGLLayer.m b/CocoaSplit/CSPreviewGLLayer.m index 1d09b558..81ff2195 100644 --- a/CocoaSplit/CSPreviewGLLayer.m +++ b/CocoaSplit/CSPreviewGLLayer.m @@ -131,7 +131,6 @@ if (_resizeDirty) { - NSLog(@"RESIZE DIRTY"); glGetDoublev(GL_MODELVIEW_MATRIX, _modelview); glGetDoublev(GL_PROJECTION_MATRIX, _projection); glGetIntegerv(GL_VIEWPORT, _viewport); diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 24a7b091..4d57178d 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -140,7 +140,6 @@ -(void)layoutWindowWillClose:(CSLayoutEditWindowController *)windowController { - NSLog(@"LAYOUT WINDOW WILL CLOSE"); if ([_layoutWindows containsObject:windowController]) { [_layoutWindows removeObject:windowController]; diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.h b/CocoaSplit/Interface/CSLayoutEditWindowController.h index b83bc2d5..12d932a3 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.h +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.h @@ -24,5 +24,6 @@ @property (strong) IBOutlet NSObjectController *layoutController; - (IBAction)cancelEdit:(id)sender; - (IBAction)editOK:(id)sender; +- (IBAction)newSource:(id)sender; @end diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.m b/CocoaSplit/Interface/CSLayoutEditWindowController.m index 7a054b45..c6781bb4 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.m +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.m @@ -63,5 +63,11 @@ [self close]; } +- (IBAction)newSource:(id)sender +{ + [self.previewView addInputSource:self]; +} + + @end diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.xib b/CocoaSplit/Interface/CSLayoutEditWindowController.xib index 72a46ef1..63c4046d 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.xib +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.xib @@ -28,12 +28,12 @@ - + - + @@ -57,7 +57,7 @@ - + @@ -72,7 +72,7 @@ - + @@ -117,7 +117,7 @@ - + @@ -128,31 +128,31 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + - - - - - - - + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/EditBuiltinLayoutView.xib b/CocoaSplit/Interface/EditBuiltinLayoutView.xib index d7b36d99..076f0a26 100644 --- a/CocoaSplit/Interface/EditBuiltinLayoutView.xib +++ b/CocoaSplit/Interface/EditBuiltinLayoutView.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 1b52fce9..11d00443 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1,5 +1,5 @@ - + @@ -394,14 +394,14 @@ - + - + - + @@ -416,7 +416,7 @@ - + @@ -428,7 +428,7 @@ - - + @@ -480,7 +480,7 @@ - + @@ -513,7 +513,7 @@ - + @@ -525,7 +525,7 @@ - + @@ -535,7 +535,7 @@ - + @@ -596,7 +596,7 @@ - - - - + From 8d65d1a894e1fe4282f33845f5c3a3ced94d4acd Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 2 Nov 2015 05:11:46 -0500 Subject: [PATCH 021/156] Port over the null retain/release fix from 1.9 branch. Actually an improved version of said fix --- CocoaSplit/CapturedFrameData.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CocoaSplit/CapturedFrameData.m b/CocoaSplit/CapturedFrameData.m index 101e3225..d2336a0d 100644 --- a/CocoaSplit/CapturedFrameData.m +++ b/CocoaSplit/CapturedFrameData.m @@ -70,7 +70,11 @@ CFRelease(_encodedSampleBuffer); } - CFRetain(encodedSampleBuffer); + if (encodedSampleBuffer) + { + CFRetain(encodedSampleBuffer); + } + _encodedSampleBuffer = encodedSampleBuffer; } From e8acd9b14292d507cad74977bffc8a0fdae9cb2e Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 2 Nov 2015 05:12:45 -0500 Subject: [PATCH 022/156] Set version to 2.0.0 --- CocoaSplit/CocoaSplit-Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index 12ff12db..4b0a44b2 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.9.12 + 2.0.0 CFBundleSignature ???? CFBundleVersion - 1.9.12 + 2.0.0 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion From 6fee9a8333eac2592f591452e5346aa1c2e83a1a Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 2 Nov 2015 08:19:42 -0500 Subject: [PATCH 023/156] Fix save/restore of non-preview layouts --- CocoaSplit/CaptureController.m | 3 +++ CocoaSplit/CocoaSplit-Info.plist | 2 +- .../Interface/CSLayoutEditWindowController.m | 1 + CocoaSplit/SourceLayout.h | 3 +++ CocoaSplit/SourceLayout.m | 22 ++++++++++++++++++- 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 4d57178d..52fce2e6 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1886,6 +1886,7 @@ self.currentMidiInputStagingIdx = 0; _stagingLayout = stagingLayout; + stagingLayout.doSaveSourceList = YES; @@ -1922,6 +1923,7 @@ selectedLayout.isActive = YES; + [selectedLayout restoreSourceList:nil]; [self setupFrameTimer:selectedLayout.frameRate]; self.livePreviewView.sourceLayout = selectedLayout; @@ -1930,6 +1932,7 @@ self.currentMidiInputLiveIdx = 0; _selectedLayout = selectedLayout; + selectedLayout.doSaveSourceList = YES; } diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index 4b0a44b2..3159abd9 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -37,6 +37,6 @@ OSAScriptingDefinition CocoaSplit.sdef SUFeedURL - http://www.cocoasplit.com/cocoasplitcast.xml + http://www.cocoasplit.com/cocoasplitcast2.0.xml diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.m b/CocoaSplit/Interface/CSLayoutEditWindowController.m index c6781bb4..ff4a7a8a 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.m +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.m @@ -59,6 +59,7 @@ if (self.previewView.sourceLayout) { [self.previewView.sourceLayout saveSourceList]; + [self.previewView.sourceLayout clearSourceList]; } [self close]; } diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index 6e278634..e211197f 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -35,6 +35,8 @@ } +@property (assign) bool doSaveSourceList; + @property (assign) bool inTransition; @property (strong) NSMutableArray *animationList; @property (strong) NSIndexSet *animationIndexes; @@ -111,6 +113,7 @@ -(bool)containsLayout:(SourceLayout *)layout; -(void)applyAddBlock; -(void)replaceWithSourceLayout:(SourceLayout *)layout; +-(void)clearSourceList; diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 76909425..76d15975 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -296,7 +296,11 @@ { [aCoder encodeObject:self.name forKey:@"name"]; - [self saveSourceList]; + if (self.doSaveSourceList) + { + [self saveSourceList]; + } + [aCoder encodeObject:self.savedSourceListData forKey:@"savedSourceData"]; @@ -1176,6 +1180,20 @@ } +-(void)clearSourceList +{ + self.rootLayer.sublayers = [NSArray array]; + @synchronized(self) + { + [self.sourceList removeAllObjects]; + + } + [self.animationList removeAllObjects]; + self.selectedAnimation = nil; +} + + +/* -(void) setIsActive:(bool)isActive { @@ -1230,6 +1248,8 @@ return _isActive; } +*/ + From 78011b56067959774900447987d513aee8459354 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 7 Nov 2015 04:36:01 -0500 Subject: [PATCH 024/156] Don't call inputSource frame tick outside of render threads. Input size/position adjustment is now done inside frameTick based on needsAdjustment* flags --- CocoaSplit/InputSource.h | 2 ++ CocoaSplit/InputSource.m | 35 +++++++++++++++++++++++++--- CocoaSplit/SourceLayout.m | 49 +++++++-------------------------------- 3 files changed, 42 insertions(+), 44 deletions(-) diff --git a/CocoaSplit/InputSource.h b/CocoaSplit/InputSource.h index c5bb4ca0..3ea55c87 100644 --- a/CocoaSplit/InputSource.h +++ b/CocoaSplit/InputSource.h @@ -196,6 +196,8 @@ typedef enum resize_style_t { @property (assign) CGFloat topLevelWidth; @property (assign) CGFloat topLevelHeight; +@property (assign) bool needsAdjustment; +@property (assign) bool needsAdjustPosition; -(void) updateOrigin:(CGFloat)x y:(CGFloat)y; diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index ae39c988..6d3e4c2c 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -511,7 +511,8 @@ static NSArray *_sourceTypes = nil; [CATransaction begin]; _nextImageTime = 0.0f; _currentSourceIdx = 0; - + _needsAdjustment = NO; + _needsAdjustPosition = NO; _topLevelHeight = 0; _topLevelWidth = 0; @@ -1680,6 +1681,31 @@ static NSArray *_sourceTypes = nil; } + +-(void) adjustInputSize: (bool)doPosition +{ + + if (self.topLevelHeight > 0 && self.topLevelWidth > 0) + { + float wRatio = self.canvas_width/self.topLevelWidth; + float hRatio = self.canvas_height/self.topLevelHeight; + float old_x = self.x_pos; + float old_y = self.y_pos; + float new_width = self.layer.bounds.size.width * wRatio; + float new_height = self.layer.bounds.size.height * hRatio; + [self directSize:new_width height:new_height]; + if (doPosition) + { + self.x_pos = old_x*wRatio; + self.y_pos = old_y*hRatio; + } + } + + self.topLevelWidth = self.canvas_width; + self.topLevelHeight = self.canvas_height; + +} + -(void)frameTick { @@ -1714,8 +1740,11 @@ static NSArray *_sourceTypes = nil; [self.videoInput frameTick]; [self.layer frameTick]; - - + if (self.needsAdjustment) + { + [self adjustInputSize:self.needsAdjustPosition]; + self.needsAdjustment = NO; + } } diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 76d15975..43263448 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -1107,20 +1107,6 @@ } --(void) adjustInputPosition:(InputSource *)src -{ - if (src.topLevelHeight > 0 && src.topLevelWidth > 0) - { - float wRatio = self.canvas_width/src.topLevelWidth; - float hRatio = self.canvas_height/src.topLevelHeight; - float new_xpos = src.layer.frame.origin.x * wRatio; - float new_ypos = src.layer.frame.origin.y * hRatio; - NSLog(@"NEW POSITIONS %f %f", new_xpos, new_ypos); - src.x_pos = new_xpos; - src.y_pos = new_ypos; - } -} - -(void) adjustAllInputs { @@ -1129,35 +1115,12 @@ for (InputSource *src in copiedInputs) { - [self adjustInputSize:src doPosition:YES]; + src.needsAdjustPosition = YES; + src.needsAdjustment = YES; } } --(void) adjustInputSize:(InputSource *)src doPosition:(bool)doPosition -{ - - [src frameTick]; - if (src.topLevelHeight > 0 && src.topLevelWidth > 0) - { - float wRatio = self.canvas_width/src.topLevelWidth; - float hRatio = self.canvas_height/src.topLevelHeight; - float old_x = src.x_pos; - float old_y = src.y_pos; - float new_width = src.layer.bounds.size.width * wRatio; - float new_height = src.layer.bounds.size.height * hRatio; - [src directSize:new_width height:new_height]; - if (doPosition) - { - src.x_pos = old_x*wRatio; - src.y_pos = old_y*hRatio; - } - } - - src.topLevelWidth = self.canvas_width; - src.topLevelHeight = self.canvas_height; - -} -(void) addSource:(InputSource *)newSource @@ -1170,7 +1133,10 @@ [self.rootLayer addSublayer:newSource.layer]; - [self adjustInputSize:newSource doPosition:NO]; + + newSource.needsAdjustPosition = NO; + newSource.needsAdjustment = YES; + [_uuidMap setObject:newSource forKey:newSource.uuid]; @@ -1322,7 +1288,8 @@ { if (needsResize) { - [self adjustInputSize:isource doPosition:YES]; + isource.needsAdjustPosition = YES; + isource.needsAdjustment = YES; } if (isource.active) From e4315b837be50cbadf554832475f672eb6aa0971 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 7 Nov 2015 13:53:49 -0500 Subject: [PATCH 025/156] Resolution menu now has some helpful suggested/standard resolutions. Changing framerate of staging/live now pokes capture controller to change the rendering loop timing --- CocoaSplit/CaptureController.h | 2 + CocoaSplit/CaptureController.m | 15 +++--- CocoaSplit/CreateLayoutViewController.m | 2 + CocoaSplit/PreviewView.h | 2 +- CocoaSplit/PreviewView.m | 62 ++++++++++++++++++++++--- 5 files changed, 67 insertions(+), 16 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 6746086b..a58599e5 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -473,6 +473,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(void)addInputToLibrary:(InputSource *)source; - (IBAction)openLibraryWindow:(id) sender; +-(void)updateFrameIntervals; + diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 52fce2e6..51855b05 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2633,6 +2633,12 @@ } } +-(void)updateFrameIntervals +{ + _staging_frame_interval = 1.0/self.stagingPreviewView.sourceLayout.frameRate; + _frame_interval = 1.0/self.livePreviewView.sourceLayout.frameRate; +} + -(void) newFrameTimed { @@ -2695,15 +2701,6 @@ } -/* --(NSArray *)sourceListOrdered -{ - NSArray *listCopy = [self.selectedLayout.sourceList sortedArrayUsingDescriptors:@[_sourceDepthSorter, _sourceUUIDSorter]]; - return listCopy; -} - */ - - -(InputSource *)findSource:(NSPoint)forPoint { diff --git a/CocoaSplit/CreateLayoutViewController.m b/CocoaSplit/CreateLayoutViewController.m index 61299f66..cccfa2fb 100644 --- a/CocoaSplit/CreateLayoutViewController.m +++ b/CocoaSplit/CreateLayoutViewController.m @@ -56,6 +56,8 @@ -(void)popoverDidClose:(NSNotification *)notification { self.popover.contentViewController = nil; + //This is only relevant if we're a custom edit popup for staging/live, but just do it unconditionally because reasons/lazy + [self.controller updateFrameIntervals]; } diff --git a/CocoaSplit/PreviewView.h b/CocoaSplit/PreviewView.h index 6dc5b818..ce8f812c 100644 --- a/CocoaSplit/PreviewView.h +++ b/CocoaSplit/PreviewView.h @@ -23,7 +23,7 @@ - +#define LAYOUT_RESOLUTIONS @[@"1280x720@60", @"1280x720@30", @"1920x1080@60", @"1920x1080@30", @"Custom"] @interface PreviewView : NSView diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index fa443090..d90e8458 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -301,6 +301,38 @@ } + +-(void)resolutionMenuAction:(NSMenuItem *)sender +{ + NSInteger tag = sender.tag; + + if (!self.sourceLayout) + { + return; + } + + if (tag < 2) + { + self.sourceLayout.canvas_width = 1280; + self.sourceLayout.canvas_height = 720; + } else if (tag < 4) { + self.sourceLayout.canvas_width = 1920; + self.sourceLayout.canvas_height = 1080; + } + + if ((tag % 2) == 0) + { + self.sourceLayout.frameRate = 60.0f; + } else { + self.sourceLayout.frameRate = 30.0f; + } + + [self.controller updateFrameIntervals]; + +} + + + -(NSMenu *) buildSourceMenu { @@ -313,9 +345,30 @@ NSString *resTitle = [NSString stringWithFormat:@"%dx%d@%.2f", self.sourceLayout.canvas_width, self.sourceLayout.canvas_height, self.sourceLayout.frameRate]; - NSMenuItem *resItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:resTitle action:@selector(showLayoutSettings:) keyEquivalent:@""]; - [resItem setTarget:self]; - [resItem setEnabled:YES]; + NSMenuItem *resItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:resTitle action:nil keyEquivalent:@""]; + + NSMenu *resSubmenu = [[NSMenu allocWithZone:[NSMenu menuZone]] init]; + + [LAYOUT_RESOLUTIONS enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + NSString *resOpt = obj; + SEL menuAction = @selector(resolutionMenuAction:); + + if ([resOpt isEqualToString:@"Custom"]) + { + menuAction = @selector(showLayoutSettings:); + } + + + NSMenuItem *item = [resSubmenu addItemWithTitle:resOpt action:menuAction keyEquivalent:@""]; + item.target = self; + item.enabled = YES; + item.tag = idx; + + }]; + + [resItem setSubmenu:resSubmenu]; + + [sourceListMenu insertItem:resItem atIndex:[sourceListMenu.itemArray count]]; @@ -1316,7 +1369,6 @@ { - NSPoint tmp = [self convertPoint:[self.window mouseLocationOutsideOfEventStream] fromView:nil]; NSRect spawnRect = NSMakeRect(tmp.x, tmp.y, 1.0f, 1.0f); @@ -1603,8 +1655,6 @@ - (void)popoverDidClose:(NSNotification *)notification { - - NSString *closeReason = [[notification userInfo] valueForKey:NSPopoverCloseReasonKey]; NSPopover *popover = notification.object; if (closeReason && closeReason == NSPopoverCloseReasonStandard) From 1dcb5568f498ae0e33462b0037c51df1f3c6b1f0 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 14 Nov 2015 08:53:56 -0500 Subject: [PATCH 026/156] When importing a 1.9 config, detect if staging and live layouts are the same and make a copy. Fixes mysterious/weird crashes --- CocoaSplit/CSInputLayer.m | 11 ++++++++--- CocoaSplit/CaptureController.m | 8 ++++++++ CocoaSplit/CocoaSplit-Info.plist | 4 ++-- CocoaSplit/InputSource.m | 3 +-- CocoaSplit/en.lproj/MainMenu.xib | 28 ++++++++++++++-------------- 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/CocoaSplit/CSInputLayer.m b/CocoaSplit/CSInputLayer.m index 1832db50..0d113ac3 100644 --- a/CocoaSplit/CSInputLayer.m +++ b/CocoaSplit/CSInputLayer.m @@ -281,7 +281,7 @@ _allowResize = YES; - _sourceLayer = [CALayer layer]; + self.sourceLayer = [CALayer layer]; _sourceLayer.anchorPoint = CGPointMake(0.0, 0.0); _sourceLayer.contentsGravity = kCAGravityResizeAspect; _sourceLayer.frame = CGRectMake(0, 0, 1, 1); @@ -509,9 +509,14 @@ -(void)setSourceLayer:(CALayer *)sourceLayer { [CATransaction begin]; - [self copySourceSettings:sourceLayer]; - [_sourceLayer.superlayer replaceSublayer:_sourceLayer with:sourceLayer]; + if (_sourceLayer) + { + [self copySourceSettings:sourceLayer]; + + + [_sourceLayer.superlayer replaceSublayer:_sourceLayer with:sourceLayer]; + } _sourceLayer = sourceLayer; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 51855b05..f7a79e66 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1817,6 +1817,14 @@ if (tmpLayout) { self.stagingLayout = tmpLayout; + if (tmpLayout == self.selectedLayout) + { + SourceLayout *tmpCopy = [tmpLayout copy]; + self.stagingLayout = tmpCopy; + } else { + self.stagingLayout = tmpLayout; + } + // [self.stagingLayout mergeSourceLayout:tmpLayout withLayer:nil]; } diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index 3159abd9..daeb8a10 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.0 + 2.0.1 CFBundleSignature ???? CFBundleVersion - 2.0.0 + 2.0.1 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 6d3e4c2c..69e62406 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -1684,7 +1684,7 @@ static NSArray *_sourceTypes = nil; -(void) adjustInputSize: (bool)doPosition { - + if (self.topLevelHeight > 0 && self.topLevelWidth > 0) { float wRatio = self.canvas_width/self.topLevelWidth; @@ -1734,7 +1734,6 @@ static NSArray *_sourceTypes = nil; } self.layer.allowResize = self.videoInput.allowScaling; - self.layer.sourceLayer = _currentLayer; } diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 11d00443..4efd6bdd 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -394,14 +394,14 @@ - + - + - + @@ -416,7 +416,7 @@ - + @@ -428,7 +428,7 @@ - - + @@ -480,7 +480,7 @@ - + @@ -513,7 +513,7 @@ - + @@ -525,7 +525,7 @@ - + @@ -535,7 +535,7 @@ - + @@ -596,7 +596,7 @@ - - - - + From 876dd087ac7e57dba0a9e4643ce657bbe7b0eb95 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 14 Nov 2015 22:40:55 -0500 Subject: [PATCH 027/156] Slightly rearrange how adding outputs works, WIP --- CocoaSplit.xcodeproj/project.pbxproj | 10 + CocoaSplit/CaptureController.h | 14 +- CocoaSplit/CaptureController.m | 91 ++----- .../Interface/CSNewOutputWindowController.h | 23 ++ .../Interface/CSNewOutputWindowController.m | 84 +++++++ .../Interface/CSNewOutputWindowController.xib | 102 ++++++++ .../InputPopupControllerViewController.xib | 2 +- CocoaSplit/en.lproj/MainMenu.xib | 224 +++--------------- 8 files changed, 283 insertions(+), 267 deletions(-) create mode 100644 CocoaSplit/Interface/CSNewOutputWindowController.h create mode 100644 CocoaSplit/Interface/CSNewOutputWindowController.m create mode 100644 CocoaSplit/Interface/CSNewOutputWindowController.xib diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 1c66667d..db513d5c 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -201,6 +201,8 @@ 34D6580319B342E70012E32B /* CSFileStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC33019B0AD500007C07B /* CSFileStreamServicePlugin.bundle */; }; 34D6581819B387DE0012E32B /* AppDelegate+AppDelegate_ScriptingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D6581719B387DE0012E32B /* AppDelegate+AppDelegate_ScriptingAdditions.m */; }; 34D696FC1871B8F700B50EB6 /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 34D696FB1871B8F700B50EB6 /* Defaults.plist */; }; + 34DA1D3E1BF823E700132486 /* CSNewOutputWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DA1D3C1BF823E700132486 /* CSNewOutputWindowController.m */; settings = {ASSET_TAGS = (); }; }; + 34DA1D3F1BF823E700132486 /* CSNewOutputWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34DA1D3D1BF823E700132486 /* CSNewOutputWindowController.xib */; settings = {ASSET_TAGS = (); }; }; 34DC2FB01B512362008F12A2 /* CSCaptureBase+TimerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DC2FAF1B512362008F12A2 /* CSCaptureBase+TimerDelegate.m */; }; 34DC2FB11B512362008F12A2 /* CSCaptureBase+TimerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DC2FAF1B512362008F12A2 /* CSCaptureBase+TimerDelegate.m */; }; 34DF75581AA272F100DA9FDE /* LayoutRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DF75571AA272F100DA9FDE /* LayoutRenderer.m */; }; @@ -773,6 +775,9 @@ 34D6581619B387DE0012E32B /* AppDelegate+AppDelegate_ScriptingAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "AppDelegate+AppDelegate_ScriptingAdditions.h"; path = "ScriptingAddditions/AppDelegate+AppDelegate_ScriptingAdditions.h"; sourceTree = ""; }; 34D6581719B387DE0012E32B /* AppDelegate+AppDelegate_ScriptingAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "AppDelegate+AppDelegate_ScriptingAdditions.m"; path = "ScriptingAddditions/AppDelegate+AppDelegate_ScriptingAdditions.m"; sourceTree = ""; }; 34D696FB1871B8F700B50EB6 /* Defaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Defaults.plist; sourceTree = ""; }; + 34DA1D3B1BF823E700132486 /* CSNewOutputWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSNewOutputWindowController.h; path = Interface/CSNewOutputWindowController.h; sourceTree = ""; }; + 34DA1D3C1BF823E700132486 /* CSNewOutputWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSNewOutputWindowController.m; path = Interface/CSNewOutputWindowController.m; sourceTree = ""; }; + 34DA1D3D1BF823E700132486 /* CSNewOutputWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSNewOutputWindowController.xib; path = Interface/CSNewOutputWindowController.xib; sourceTree = ""; }; 34DC2F9B1B50FBCD008F12A2 /* CSTimerSourceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSTimerSourceProtocol.h; sourceTree = ""; }; 34DC2FAE1B512362008F12A2 /* CSCaptureBase+TimerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CSCaptureBase+TimerDelegate.h"; sourceTree = ""; }; 34DC2FAF1B512362008F12A2 /* CSCaptureBase+TimerDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CSCaptureBase+TimerDelegate.m"; sourceTree = ""; }; @@ -1264,6 +1269,9 @@ 3400A07D1BD49406003E1828 /* CSInputLibraryItemView.xib */, 3400A0821BD522A5003E1828 /* CSLibraryInputItemViewController.h */, 3400A0831BD522A5003E1828 /* CSLibraryInputItemViewController.m */, + 34DA1D3B1BF823E700132486 /* CSNewOutputWindowController.h */, + 34DA1D3C1BF823E700132486 /* CSNewOutputWindowController.m */, + 34DA1D3D1BF823E700132486 /* CSNewOutputWindowController.xib */, ); name = Interface; sourceTree = ""; @@ -2056,6 +2064,7 @@ 3400A07E1BD49406003E1828 /* CSInputLibraryItemView.xib in Resources */, 340FE4B215F3417E00E4CE4E /* Credits.rtf in Resources */, 340FE4B815F3417E00E4CE4E /* MainMenu.xib in Resources */, + 34DA1D3F1BF823E700132486 /* CSNewOutputWindowController.xib in Resources */, 34D4351B198BE3B700266169 /* NewLayoutPanel.xib in Resources */, 34F1EB931BCCA41F00B38E6C /* CSLayoutEditWindowController.xib in Resources */, 342B33B61980771200492CB7 /* line.vtsh in Resources */, @@ -2152,6 +2161,7 @@ 34ED8C9F1B07371C002C0674 /* MIKMIDISequence.m in Sources */, 34ED8C671B07371C002C0674 /* MIKMIDIEventIterator.m in Sources */, 34ED8CBC1B07763F002C0674 /* CSMidiWrapper.m in Sources */, + 34DA1D3E1BF823E700132486 /* CSNewOutputWindowController.m in Sources */, 34ED8C691B07371C002C0674 /* MIKMIDIInputPort.m in Sources */, 34ED8C531B07371C002C0674 /* MIKMIDICommandThrottler.m in Sources */, 345F8B611A161552009A81E3 /* CAMultiAudioAVCapturePlayer.m in Sources */, diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index a58599e5..7a4e14ba 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -30,6 +30,7 @@ #import "CSTimerSourceProtocol.h" #import "CSInputLibraryWindowController.h" #import "CSInputLibraryItem.h" +#import "CSNewOutputWindowController.h" @@ -319,11 +320,11 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) IBOutlet NSWindow *outputEditPanel; @property (strong) IBOutlet NSWindow *layoutPanel; -@property (weak) IBOutlet NSView *streamServiceAddView; +@property (strong) CSNewOutputWindowController *addOutputWindowController; + +@property (weak) IBOutlet NSWindow *mainWindow; + -@property (unsafe_unretained) IBOutlet NSWindow *streamServiceConfWindow; -@property (strong) NSViewController *streamServicePluginViewController; -@property (strong) NSObject*streamServiceObject; - (IBAction)openLogWindow:(id)sender; @@ -433,12 +434,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(SourceLayout *)addLayoutFromBase:(SourceLayout *)baseLayout; -(SourceLayout *)getLayoutForName:(NSString *)name; -- (IBAction)layoutTableSelected:(NSTableView *)sender; - (IBAction)openLayoutPopover:(NSButton *)sender; -- (IBAction)mainDeleteLayoutClicked:(id)sender; -- (IBAction)mainCopyLayoutClicked:(id)sender; --(IBAction)stagingDeleteLayoutClicked:(id)sender; --(IBAction)stagingCopyLayoutClicked:(id)sender; -(void)openLayoutPopover:(NSButton *)sender forLayout:(SourceLayout *)layout; -(void)openBuiltinLayoutPopover:(NSView *)sender spawnRect:(NSRect)spawnRect forLayout:(SourceLayout *)layout; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index f7a79e66..7c50e086 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -678,57 +678,32 @@ self.advancedVideoPanel = nil; } --(IBAction)openCreateSheet:(id)sender +-(IBAction)openCreateSheet:(id)senderddd { - - - self.streamServiceObject = nil; - - NSMutableDictionary *servicePlugins = [[CSPluginLoader sharedPluginLoader] streamServicePlugins]; - - - Class serviceClass = servicePlugins[self.selectedDestinationType];; - - - if (serviceClass) - { - self.streamServiceObject = [[serviceClass alloc] init]; - } - - - - - - if (self.streamServiceObject) - { - NSViewController *serviceConfigView = [self.streamServiceObject getConfigurationView]; - self.streamServiceAddView.frame = serviceConfigView.view.frame; - - [self.streamServiceAddView addSubview:serviceConfigView.view]; - self.streamServicePluginViewController = serviceConfigView; - [NSApp beginSheet:self.streamServiceConfWindow modalForWindow:[NSApplication sharedApplication].mainWindow modalDelegate:self didEndSelector:NULL contextInfo:NULL]; - } + self.addOutputWindowController = [[CSNewOutputWindowController alloc] init]; + [self.mainWindow beginSheet:self.addOutputWindowController.window completionHandler:^(NSModalResponse returnCode) { + if (returnCode == NSModalResponseOK) + { + NSObject*serviceObj = self.addOutputWindowController.streamServiceObject; + + if (serviceObj) + { + OutputDestination *newDest; + + NSString *destination = [serviceObj getServiceDestination]; + + newDest = [[OutputDestination alloc] initWithType:[serviceObj.class label]]; + newDest.destination = destination; + newDest.settingsController = self; + + [self insertObject:newDest inCaptureDestinationsAtIndex:self.captureDestinations.count]; + } + } + }]; } --(IBAction)closeCreateSheet:(id)sender -{ - - - [self.streamServicePluginViewController.view removeFromSuperview]; - - - [NSApp endSheet:self.streamServiceConfWindow]; - [self.streamServiceConfWindow close]; - self.streamServicePluginViewController = nil; - self.streamServiceObject = nil; - -} - - - - -(AVCaptureDevice *)selectedAudioCapture { if (self.audioCaptureSession) @@ -1978,30 +1953,6 @@ } - -- (IBAction)addStreamingService:(id)sender { - - - OutputDestination *newDest; - - [self.streamServicePluginViewController commitEditing]; - - NSString *destination = [self.streamServiceObject getServiceDestination]; - - newDest = [[OutputDestination alloc] initWithType:[self.streamServiceObject.class label]]; - newDest.destination = destination; - newDest.settingsController = self; - - [self insertObject:newDest inCaptureDestinationsAtIndex:self.captureDestinations.count]; - [self closeCreateSheet:nil]; - - -} - - - - - - (void) outputEncodedData:(CapturedFrameData *)newFrameData { diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.h b/CocoaSplit/Interface/CSNewOutputWindowController.h new file mode 100644 index 00000000..14fcf1a9 --- /dev/null +++ b/CocoaSplit/Interface/CSNewOutputWindowController.h @@ -0,0 +1,23 @@ +// +// CSNewOutputWindowController.h +// CocoaSplit +// +// Created by Zakk on 11/14/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import +#import "CSStreamServiceProtocol.h" + + +@interface CSNewOutputWindowController : NSWindowController + +- (IBAction)cancelButtonAction:(id)sender; +- (IBAction)addButtonAction:(id)sender; + +@property (strong) NSString *selectedOutputType; +@property (strong) NSObject*streamServiceObject; +@property (strong) NSArray *outputTypes; +@property (weak) IBOutlet NSView *serviceConfigView; +@property (strong) NSViewController *pluginViewController; +@end diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.m b/CocoaSplit/Interface/CSNewOutputWindowController.m new file mode 100644 index 00000000..11bf8b1c --- /dev/null +++ b/CocoaSplit/Interface/CSNewOutputWindowController.m @@ -0,0 +1,84 @@ +// +// CSNewOutputWindowController.m +// CocoaSplit +// +// Created by Zakk on 11/14/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import "CSNewOutputWindowController.h" +#import "CSPluginLoader.h" + + +@implementation CSNewOutputWindowController + +@synthesize selectedOutputType = _selectedOutputType; + + +-(instancetype) init +{ + if (self = [self initWithWindowNibName:@"CSNewOutputWindowController"]) + { + NSMutableDictionary *servicePlugins = [[CSPluginLoader sharedPluginLoader] streamServicePlugins]; + + self.outputTypes = servicePlugins.allKeys; + NSLog(@"OUTPUT TYPES %@", self.outputTypes); + } + + return self; +} + + +-(NSString *)selectedOutputType +{ + return _selectedOutputType; +} + + +-(void)setSelectedOutputType:(NSString *)selectedOutputType +{ + _selectedOutputType = selectedOutputType; + NSMutableDictionary *servicePlugins = [[CSPluginLoader sharedPluginLoader] streamServicePlugins]; + Class serviceClass = servicePlugins[_selectedOutputType]; + + + NSObject*serviceObj; + + if (serviceClass) + { + serviceObj = [[serviceClass alloc] init]; + } + + if (serviceObj) + { + if (self.pluginViewController) + { + [self.pluginViewController.view removeFromSuperview]; + } + self.streamServiceObject = serviceObj; + NSViewController *serviceConfigView = [self.streamServiceObject getConfigurationView]; + [self.serviceConfigView addSubview:serviceConfigView.view]; + self.pluginViewController = serviceConfigView; + } +} + + +- (void)windowDidLoad { + [super windowDidLoad]; + + // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. +} + +- (IBAction)cancelButtonAction:(id)sender +{ + [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseCancel]; +} + +- (IBAction)addButtonAction:(id)sender +{ + [self.pluginViewController commitEditing]; + [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseOK]; +} + + +@end diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.xib b/CocoaSplit/Interface/CSNewOutputWindowController.xib new file mode 100644 index 00000000..4b347698 --- /dev/null +++ b/CocoaSplit/Interface/CSNewOutputWindowController.xib @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/InputPopupControllerViewController.xib b/CocoaSplit/Interface/InputPopupControllerViewController.xib index b0e60773..794ee2fa 100644 --- a/CocoaSplit/Interface/InputPopupControllerViewController.xib +++ b/CocoaSplit/Interface/InputPopupControllerViewController.xib @@ -508,7 +508,7 @@ - + diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 4efd6bdd..1dcdab23 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -29,14 +29,13 @@ + - - @@ -394,14 +393,14 @@ - + - + - + @@ -416,7 +415,7 @@ - + @@ -428,7 +427,7 @@ - - + @@ -480,7 +479,7 @@ - + @@ -513,7 +512,7 @@ - + @@ -525,7 +524,7 @@ - + @@ -535,7 +534,7 @@ - + @@ -596,7 +595,7 @@ - - - - + @@ -994,44 +993,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - + @@ -1263,30 +1157,30 @@ - + + - - - - - - - - - - - - - - @@ -2273,48 +2167,6 @@ - - - - - - - - - - - - - - - - - - - @@ -2419,7 +2271,5 @@ MgA3AEEARwBQAFcAXABkAHkAewB9AH8AgQCLAJAAlQCgAKMApQCnAKkArgC5AMIAygDNANYA2wDoAOwA - - From 239743fbb51153a9d8b3d5ff04c56bab19cf6990 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 15 Nov 2015 18:24:34 -0500 Subject: [PATCH 028/156] Combined status and output tabs --- .../xcschemes/CSAVFCapturePlugin.xcscheme | 13 +- .../CSDeckLinkCaptureViewController.xib | 13 +- .../xcschemes/CSDesktopCapturePlugin.xcscheme | 13 +- .../xcschemes/CSImageCapturePlugin.xcscheme | 13 +- .../xcschemes/CSMovieCapturePlugin.xcscheme | 13 +- .../xcschemes/CSQTCapturePlugin.xcscheme | 13 +- .../xcschemes/CSSyphonCapturePlugin.xcscheme | 13 +- .../xcschemes/CSTextCapturePlugin.xcscheme | 13 +- .../xcschemes/CSWindowCapturePlugin.xcscheme | 13 +- .../WindowCaptureViewController.xib | 8 +- CocoaSplit/CaptureController.h | 1 - CocoaSplit/CaptureController.m | 14 +- .../Interface/CSNewOutputWindowController.h | 4 + .../Interface/CSNewOutputWindowController.m | 12 +- .../Interface/CSNewOutputWindowController.xib | 96 +++- CocoaSplit/Interface/NewLayoutPanel.xib | 2 +- CocoaSplit/en.lproj/MainMenu.xib | 462 ++++++------------ .../xcschemes/CSChromaKey.xcscheme | 13 +- .../xcschemes/TextureWrapPlugin.xcscheme | 13 +- .../CSFileStreamServicePlugin.xcscheme | 13 +- .../HitboxStreamServiceViewController.xib | 39 +- .../CSTwitchStreamServicePlugin.xcscheme | 13 +- .../TwitchStreamServiceViewController.xib | 21 +- 23 files changed, 396 insertions(+), 432 deletions(-) diff --git a/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme b/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme index e74808be..09ca5b04 100644 --- a/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme +++ b/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> + + - + - + @@ -17,6 +17,7 @@ + @@ -25,6 +26,7 @@ + @@ -44,6 +46,7 @@ + @@ -52,6 +55,7 @@ + @@ -70,6 +74,7 @@ + @@ -78,6 +83,7 @@ + @@ -96,6 +102,7 @@ + @@ -104,6 +111,7 @@ + @@ -123,6 +131,7 @@ + diff --git a/CapturePlugins/CSDesktopCapturePlugin/CSDesktopCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSDesktopCapturePlugin.xcscheme b/CapturePlugins/CSDesktopCapturePlugin/CSDesktopCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSDesktopCapturePlugin.xcscheme index 71b523dc..5fb453d7 100644 --- a/CapturePlugins/CSDesktopCapturePlugin/CSDesktopCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSDesktopCapturePlugin.xcscheme +++ b/CapturePlugins/CSDesktopCapturePlugin/CSDesktopCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSDesktopCapturePlugin.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> + + + shouldUseLaunchSchemeArgsEnv = "YES"> + + + shouldUseLaunchSchemeArgsEnv = "YES"> + + + shouldUseLaunchSchemeArgsEnv = "YES"> + + + shouldUseLaunchSchemeArgsEnv = "YES"> + + + shouldUseLaunchSchemeArgsEnv = "YES"> + + + shouldUseLaunchSchemeArgsEnv = "YES"> + + - + - + @@ -18,6 +18,7 @@ + This capture method sucks. The API for grabbing window images really isn't made for video framerates and depending on what window you are capturing it can't keep up. Set the framerate for the source low if you can get away with it. Otherwise expect to drop lots of frames. @@ -27,6 +28,7 @@ + @@ -35,6 +37,7 @@ + @@ -45,6 +48,7 @@ + diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 7a4e14ba..d651b74a 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -356,7 +356,6 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (assign) int maxOutputDropped; @property (assign) BOOL captureRunning; -@property (strong) NSArray *arOptions; @property (strong) NSString *resolutionOption; @property (strong) OutputDestination *editDestination; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 7c50e086..dad11468 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -684,18 +684,11 @@ [self.mainWindow beginSheet:self.addOutputWindowController.window completionHandler:^(NSModalResponse returnCode) { if (returnCode == NSModalResponseOK) { - NSObject*serviceObj = self.addOutputWindowController.streamServiceObject; - - if (serviceObj) - { - OutputDestination *newDest; - NSString *destination = [serviceObj getServiceDestination]; - - newDest = [[OutputDestination alloc] initWithType:[serviceObj.class label]]; - newDest.destination = destination; + OutputDestination *newDest = self.addOutputWindowController.outputDestination; + if (newDest) + { newDest.settingsController = self; - [self insertObject:newDest inCaptureDestinationsAtIndex:self.captureDestinations.count]; } } @@ -1065,7 +1058,6 @@ self.showPreview = YES; self.videoTypes = @[@"Desktop", @"AVFoundation", @"QTCapture", @"Syphon", @"Image", @"Text"]; self.compressorTypes = @[@"x264", @"AppleVTCompressor", @"None"]; - self.arOptions = @[@"None", @"Use Source", @"Preserve AR"]; mach_timebase_info(&_mach_timebase); diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.h b/CocoaSplit/Interface/CSNewOutputWindowController.h index 14fcf1a9..633190ac 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.h +++ b/CocoaSplit/Interface/CSNewOutputWindowController.h @@ -9,12 +9,16 @@ #import #import "CSStreamServiceProtocol.h" +@class OutputDestination; @interface CSNewOutputWindowController : NSWindowController - (IBAction)cancelButtonAction:(id)sender; - (IBAction)addButtonAction:(id)sender; + +@property (strong) OutputDestination *outputDestination; + @property (strong) NSString *selectedOutputType; @property (strong) NSObject*streamServiceObject; @property (strong) NSArray *outputTypes; diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.m b/CocoaSplit/Interface/CSNewOutputWindowController.m index 11bf8b1c..294562a3 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.m +++ b/CocoaSplit/Interface/CSNewOutputWindowController.m @@ -8,6 +8,7 @@ #import "CSNewOutputWindowController.h" #import "CSPluginLoader.h" +#import "OutputDestination.h" @implementation CSNewOutputWindowController @@ -22,7 +23,7 @@ NSMutableDictionary *servicePlugins = [[CSPluginLoader sharedPluginLoader] streamServicePlugins]; self.outputTypes = servicePlugins.allKeys; - NSLog(@"OUTPUT TYPES %@", self.outputTypes); + self.outputDestination = [[OutputDestination alloc] init]; } return self; @@ -55,9 +56,15 @@ { [self.pluginViewController.view removeFromSuperview]; } + self.pluginViewController = nil; + + self.outputDestination.type_name = [serviceObj.class label]; self.streamServiceObject = serviceObj; NSViewController *serviceConfigView = [self.streamServiceObject getConfigurationView]; [self.serviceConfigView addSubview:serviceConfigView.view]; + + + [serviceConfigView.view setFrameOrigin:NSMakePoint(0, self.serviceConfigView.frame.size.height - serviceConfigView.view.frame.size.height)]; self.pluginViewController = serviceConfigView; } } @@ -77,6 +84,9 @@ - (IBAction)addButtonAction:(id)sender { [self.pluginViewController commitEditing]; + NSString *destination = [self.streamServiceObject getServiceDestination]; + + self.outputDestination.destination = destination; [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseOK]; } diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.xib b/CocoaSplit/Interface/CSNewOutputWindowController.xib index 4b347698..3cca2432 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.xib +++ b/CocoaSplit/Interface/CSNewOutputWindowController.xib @@ -23,7 +23,7 @@ - + @@ -31,6 +31,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + + + + + + + + + + + + + + + + + + + - + - - - + + + - - - - - + + + + + + + + + + + + @@ -90,7 +156,7 @@ Gw - + diff --git a/CocoaSplit/Interface/NewLayoutPanel.xib b/CocoaSplit/Interface/NewLayoutPanel.xib index 7a908750..10872155 100644 --- a/CocoaSplit/Interface/NewLayoutPanel.xib +++ b/CocoaSplit/Interface/NewLayoutPanel.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 1dcdab23..4f00e024 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -503,7 +503,7 @@ - + @@ -550,7 +550,7 @@ - - - - - + + + + - - + + - + - + - + - + - - - - - - - - - - - - - - - - NSIsNil - - - - - - + - + - + + - - + + - + - + + - + + - - + + - + + - + + - - + + - - - - - - - - - + + + + + - - - - NSIsNil - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -1146,42 +1172,56 @@ - - + + - - - - + + + @@ -1818,198 +1858,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2108,10 +1956,6 @@ - - - - name @@ -2145,11 +1989,6 @@ - - - - - @@ -2167,19 +2006,6 @@ - - - - - - - - - - - - - diff --git a/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme b/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme index c28eb194..8ef5c004 100644 --- a/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme +++ b/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> + + + shouldUseLaunchSchemeArgsEnv = "YES"> + + + shouldUseLaunchSchemeArgsEnv = "YES"> + + - + - + @@ -14,11 +14,12 @@ - + - + + @@ -26,7 +27,8 @@ - + + @@ -34,7 +36,8 @@ - + + @@ -45,7 +48,8 @@ - + + @@ -59,7 +63,8 @@ - + + @@ -74,7 +79,8 @@ - - + + + - + + @@ -109,8 +118,8 @@ - + NSIsNil @@ -120,6 +129,8 @@ + + diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSTwitchStreamServicePlugin.xcscheme b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSTwitchStreamServicePlugin.xcscheme index 9bf09213..8f5e530b 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSTwitchStreamServicePlugin.xcscheme +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSTwitchStreamServicePlugin.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> + + - + - + @@ -13,11 +13,12 @@ - + - + + @@ -25,7 +26,8 @@ - + + @@ -33,7 +35,8 @@ - + + @@ -53,7 +56,8 @@ - + + @@ -64,6 +68,8 @@ + + @@ -79,6 +85,7 @@ + From 4c60010dc43d25ffabefe3305a6703a5cdf9139b Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 21 Nov 2015 21:50:37 -0500 Subject: [PATCH 029/156] Added edit functionality to output list. OutputDestination now saves an instance of the streaming service which is restored into the edit view for regenerating an output destination string --- CocoaSplit/CaptureController.h | 2 + CocoaSplit/CaptureController.m | 35 +- .../CSMidiManagerWindowController.xib | 19 +- .../Interface/CSNewOutputWindowController.h | 1 + .../Interface/CSNewOutputWindowController.m | 57 ++- .../Interface/CSNewOutputWindowController.xib | 36 +- CocoaSplit/OutputDestination.h | 4 +- CocoaSplit/OutputDestination.m | 25 +- .../PluginHeaders/CSStreamServiceProtocol.h | 2 +- CocoaSplit/en.lproj/MainMenu.xib | 404 +++++++++--------- .../FileStreamService.m | 17 + .../HitboxStreamService.m | 30 ++ .../TwitchStreamService.m | 17 + 13 files changed, 420 insertions(+), 229 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index d651b74a..755a9ad3 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -440,6 +440,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , - (IBAction)stagingAnimationSelected:(id)sender; +@property (weak) IBOutlet NSTableView *outputTableView; +- (IBAction)outputEditClicked:(id)sender; @property (weak) IBOutlet NSArrayController *sourceLayoutsArrayController; @property (weak) IBOutlet NSTableView *mainSourceLayoutTableView; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index dad11468..261a3571 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -678,23 +678,40 @@ self.advancedVideoPanel = nil; } --(IBAction)openCreateSheet:(id)senderddd + +-(void)openOutputSheet:(OutputDestination *)toEdit { self.addOutputWindowController = [[CSNewOutputWindowController alloc] init]; + self.addOutputWindowController.compressors = self.compressors; + if (toEdit) + { + self.addOutputWindowController.outputDestination = toEdit.copy; + } [self.mainWindow beginSheet:self.addOutputWindowController.window completionHandler:^(NSModalResponse returnCode) { if (returnCode == NSModalResponseOK) { - + OutputDestination *newDest = self.addOutputWindowController.outputDestination; if (newDest) { newDest.settingsController = self; - [self insertObject:newDest inCaptureDestinationsAtIndex:self.captureDestinations.count]; + if (toEdit) + { + NSInteger idx = [self.captureDestinations indexOfObject:toEdit]; + [self replaceObjectInCaptureDestinationsAtIndex:idx withObject:newDest]; + } else { + [self insertObject:newDest inCaptureDestinationsAtIndex:self.captureDestinations.count]; + } } } }]; + } +-(IBAction)openCreateSheet:(id)sender +{ + [self openOutputSheet:nil]; +} -(AVCaptureDevice *)selectedAudioCapture @@ -2893,6 +2910,12 @@ [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationOutputDeleted object:to_delete userInfo:nil]; } +-(void)replaceObjectInCaptureDestinationsAtIndex:(NSUInteger)index withObject:(id)object +{ + [self.captureDestinations replaceObjectAtIndex:index withObject:object]; +} + + -(void)insertObject:(OutputDestination *)object inCaptureDestinationsAtIndex:(NSUInteger)index { [self.captureDestinations insertObject:object atIndex:index]; @@ -3594,4 +3617,10 @@ } +- (IBAction)outputEditClicked:(id)sender +{ + OutputDestination *toEdit = [self.captureDestinations objectAtIndex:self.outputTableView.clickedRow]; + [self openOutputSheet:toEdit]; +} + @end diff --git a/CocoaSplit/Interface/CSMidiManagerWindowController.xib b/CocoaSplit/Interface/CSMidiManagerWindowController.xib index cf19ba9f..79853e26 100644 --- a/CocoaSplit/Interface/CSMidiManagerWindowController.xib +++ b/CocoaSplit/Interface/CSMidiManagerWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -23,6 +23,7 @@ + @@ -33,12 +34,13 @@ - + - + + @@ -112,19 +114,24 @@ + + - + + @@ -134,6 +141,7 @@ + @@ -145,6 +153,7 @@ + diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.h b/CocoaSplit/Interface/CSNewOutputWindowController.h index 633190ac..cd3d68c9 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.h +++ b/CocoaSplit/Interface/CSNewOutputWindowController.h @@ -24,4 +24,5 @@ @property (strong) NSArray *outputTypes; @property (weak) IBOutlet NSView *serviceConfigView; @property (strong) NSViewController *pluginViewController; +@property (strong) NSDictionary *compressors; @end diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.m b/CocoaSplit/Interface/CSNewOutputWindowController.m index 294562a3..7d1d2eee 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.m +++ b/CocoaSplit/Interface/CSNewOutputWindowController.m @@ -14,6 +14,7 @@ @implementation CSNewOutputWindowController @synthesize selectedOutputType = _selectedOutputType; +@synthesize outputDestination = _outputDestination; -(instancetype) init @@ -30,19 +31,62 @@ } +-(void)setOutputDestination:(OutputDestination *)outputDestination +{ + _outputDestination = outputDestination; + if (outputDestination.streamServiceObject) + { + self.streamServiceObject = outputDestination.streamServiceObject; + Class serviceClass = self.streamServiceObject.class; + self.selectedOutputType = [serviceClass label]; + } +} + +-(OutputDestination *)outputDestination +{ + return _outputDestination; +} + + +-(void)setupServiceView +{ + if (!self.streamServiceObject) + { + if (self.pluginViewController) + { + [self.pluginViewController.view removeFromSuperview]; + self.pluginViewController = nil; + } + } else { + NSViewController *serviceConfigView = [self.streamServiceObject getConfigurationView]; + [self.serviceConfigView addSubview:serviceConfigView.view]; + + [serviceConfigView.view setFrameOrigin:NSMakePoint(0, self.serviceConfigView.frame.size.height - serviceConfigView.view.frame.size.height)]; + self.pluginViewController = serviceConfigView; + } +} + -(NSString *)selectedOutputType { return _selectedOutputType; } + -(void)setSelectedOutputType:(NSString *)selectedOutputType { + _selectedOutputType = selectedOutputType; NSMutableDictionary *servicePlugins = [[CSPluginLoader sharedPluginLoader] streamServicePlugins]; - Class serviceClass = servicePlugins[_selectedOutputType]; + Class serviceClass = servicePlugins[selectedOutputType]; + if (self.streamServiceObject && [self.streamServiceObject isKindOfClass:serviceClass]) + { + [self setupServiceView]; + return; + } + NSObject*serviceObj; if (serviceClass) @@ -52,6 +96,7 @@ if (serviceObj) { + if (self.pluginViewController) { [self.pluginViewController.view removeFromSuperview]; @@ -60,19 +105,14 @@ self.outputDestination.type_name = [serviceObj.class label]; self.streamServiceObject = serviceObj; - NSViewController *serviceConfigView = [self.streamServiceObject getConfigurationView]; - [self.serviceConfigView addSubview:serviceConfigView.view]; - - - [serviceConfigView.view setFrameOrigin:NSMakePoint(0, self.serviceConfigView.frame.size.height - serviceConfigView.view.frame.size.height)]; - self.pluginViewController = serviceConfigView; + [self setupServiceView]; } } - (void)windowDidLoad { [super windowDidLoad]; - + [self setupServiceView]; // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. } @@ -87,6 +127,7 @@ NSString *destination = [self.streamServiceObject getServiceDestination]; self.outputDestination.destination = destination; + self.outputDestination.streamServiceObject = self.streamServiceObject; [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseOK]; } diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.xib b/CocoaSplit/Interface/CSNewOutputWindowController.xib index 3cca2432..16923d1b 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.xib +++ b/CocoaSplit/Interface/CSNewOutputWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -119,6 +119,18 @@ Gw + + + + + + + + + + + + @@ -133,19 +145,12 @@ Gw - - - - - - - - - - + + + - + @@ -164,5 +169,10 @@ Gw + + + + + diff --git a/CocoaSplit/OutputDestination.h b/CocoaSplit/OutputDestination.h index d52ca76f..2c1179ff 100644 --- a/CocoaSplit/OutputDestination.h +++ b/CocoaSplit/OutputDestination.h @@ -15,7 +15,7 @@ @class FFMpegTask; -@interface OutputDestination : NSObject +@interface OutputDestination : NSObject { NSString *_destination; @@ -32,6 +32,7 @@ @property (strong) NSString *server_name; @property (strong) NSString *type_name; +@property (strong) NSString *type_class_name; @property (strong) NSString *destination; @property (strong) NSString *output_format; @property (strong) NSString *stream_key; @@ -42,6 +43,7 @@ @property (assign) NSUInteger delay_buffer_frames; @property (assign) BOOL buffer_draining; @property (strong) NSString *name; +@property (strong) NSObject*streamServiceObject; //stats, mostly we just interrogate the ffmpeg_out object for these, but bouncing //through this class allows us to be a bit smarter about the UI status updates diff --git a/CocoaSplit/OutputDestination.m b/CocoaSplit/OutputDestination.m index 9e5774c8..f02fe522 100644 --- a/CocoaSplit/OutputDestination.m +++ b/CocoaSplit/OutputDestination.m @@ -16,17 +16,34 @@ @synthesize name = _name; +-(instancetype)copyWithZone:(NSZone *)zone +{ + OutputDestination *newCopy = [[OutputDestination alloc] init]; + newCopy.destination = self.destination; + newCopy.name = self.name; + newCopy.type_name = self.type_name; + newCopy.type_class_name = self.type_class_name; + newCopy.output_format = self.output_format; + newCopy.active = self.active; + newCopy.stream_delay = self.stream_delay; + newCopy.compressor_name = self.compressor_name; + newCopy.streamServiceObject = self.streamServiceObject; + return newCopy; +} + + -(void) encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.destination forKey:@"destination"]; [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeObject:self.type_name forKey:@"type_name"]; + [aCoder encodeObject:self.type_class_name forKey:@"type_class_name"]; [aCoder encodeObject:self.output_format forKey:@"output_format"]; [aCoder encodeBool:self.active forKey:@"active"]; [aCoder encodeInteger:self.stream_delay forKey:@"stream_delay"]; [aCoder encodeObject:self.compressor_name forKey:@"compressor_name"]; - + [aCoder encodeObject:self.streamServiceObject forKey:@"streamServiceObject"]; } -(id) initWithCoder:(NSCoder *)aDecoder @@ -41,15 +58,15 @@ self.active = [aDecoder decodeBoolForKey:@"active"]; self.stream_delay = (int)[aDecoder decodeIntegerForKey:@"stream_delay"]; self.compressor_name = [aDecoder decodeObjectForKey:@"compressor_name"]; + self.streamServiceObject = [aDecoder decodeObjectForKey:@"streamServiceObject"]; + self.type_class_name = [aDecoder decodeObjectForKey:@"type_class_name"]; } - - - return self; } + -(id)init { diff --git a/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h b/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h index 10d2b4cb..834154e5 100644 --- a/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h +++ b/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h @@ -9,7 +9,7 @@ #import #import -@protocol CSStreamServiceProtocol +@protocol CSStreamServiceProtocol @property bool isReady; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 4f00e024..354ba324 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -31,6 +31,7 @@ + @@ -993,200 +994,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m index 5f5fe494..08ff0640 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m @@ -24,6 +24,23 @@ } +-(void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.fileName forKey:@"fileName"]; +} + + +-(instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [self init]) + { + self.fileName = [aDecoder decodeObjectForKey:@"fileName"]; + } + + return self; +} + + -(NSViewController *)getConfigurationView { diff --git a/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamService.m b/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamService.m index 9e53543d..4234d881 100644 --- a/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamService.m +++ b/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamService.m @@ -32,6 +32,36 @@ return @"Hitbox"; } +/* +@property (strong) NSString *authKey; +@property (strong) NSArray *ingestServers; +@property (strong) NSString *authUsername; +@property (strong) NSString *streamKey; +@property (strong) NSString *streamPath; +@property (strong) NSString *selectedServer; +*/ + +-(void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.authUsername forKey:@"authUsername"]; + [aCoder encodeObject:self.streamKey forKey:@"streamKey"]; + [aCoder encodeObject:self.streamPath forKey:@"streamPath"]; + [aCoder encodeObject:self.selectedServer forKey:@"selectedServer"]; +} + + +-(instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [self init]) + { + self.authUsername = [aDecoder decodeObjectForKey:@"authUsername"]; + self.streamKey = [aDecoder decodeObjectForKey:@"streamKey"]; + self.streamPath = [aDecoder decodeObjectForKey:@"streamPath"]; + self.selectedServer = [aDecoder decodeObjectForKey:@"selectedServer"]; + } + return self; +} + -(NSString *)getServiceDestination { diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m index e1297c8a..56c7f301 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m @@ -22,6 +22,23 @@ } +-(void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.selectedServer forKey:@"selectedServer"]; + [aCoder encodeObject:self.streamKey forKey:@"streamKey"]; +} + +-(instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [self init]) + { + self.selectedServer = [aDecoder decodeObjectForKey:@"selectedServer"]; + self.streamKey = [aDecoder decodeObjectForKey:@"streamKey"]; + } + return self; +} + + -(NSViewController *)getConfigurationView { From 504c4f3fa7a261a2185b95806687975352469b50 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 23 Nov 2015 07:55:04 -0500 Subject: [PATCH 030/156] Moved compressor configuration to output configuration dialog. All outputs MUST have a chosen compressor now. Two default compressors named "x264" and 'AppleVT" are created if they don't exist. If a "default" compressor exists it is renamed to the appropriate new default compressor. To create new compressor "profiles" just save one of the default ones to a new name. --- CSNotifications.m | 3 +- CocoaSplit.xcodeproj/project.pbxproj | 32 +- CocoaSplit/CaptureController.h | 4 +- CocoaSplit/CaptureController.m | 357 ++---------------- CocoaSplit/Compressor/CompressorBase.h | 1 + CocoaSplit/Compressor/CompressorBase.m | 3 +- CocoaSplit/Compressor/h264Compressor.h | 4 +- .../Interface/CSNewOutputWindowController.h | 6 +- .../Interface/CSNewOutputWindowController.m | 88 +++++ .../Interface/CSNewOutputWindowController.xib | 81 ++-- .../Interface/CompressionSettingsPanel.xib | 255 +++++++++---- .../CompressionSettingsPanelController.h | 29 ++ .../CompressionSettingsPanelController.m | 62 +++ CocoaSplit/OutputDestination.m | 41 +- CocoaSplit/PluginHeaders/CSNotifications.h | 2 + CocoaSplit/en.lproj/MainMenu.xib | 8 - 16 files changed, 510 insertions(+), 466 deletions(-) create mode 100644 CocoaSplit/Interface/CompressionSettingsPanelController.h create mode 100644 CocoaSplit/Interface/CompressionSettingsPanelController.m diff --git a/CSNotifications.m b/CSNotifications.m index a298a2d5..de0bf98e 100644 --- a/CSNotifications.m +++ b/CSNotifications.m @@ -22,7 +22,8 @@ NSString *const CSNotificationOutputDeleted = @"CSNotificationOutputDeleted"; NSString *const CSNotificationCompressorAdded = @"CSNotificationCompressorAdded"; - NSString *const CSNotificationCompressorDeleted = @"CSNotificationCompressorDeleted"; +NSString *const CSNotificationCompressorDeleted = @"CSNotificationCompressorDeleted"; +NSString *const CSNotificationCompressorRenamed = @"CSNotificationCompressorRenamed"; NSString *const CSNotificationInputAdded = @"CSNotificationInputAdded"; diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index db513d5c..89a31395 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -8,11 +8,11 @@ /* Begin PBXBuildFile section */ 3400777016E6FE5D00097E8F /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 347B7FC916907AFA00B5F4B3 /* libz.dylib */; }; - 3400A0621BD44DF0003E1828 /* CSInputLibraryItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0611BD44DF0003E1828 /* CSInputLibraryItem.m */; settings = {ASSET_TAGS = (); }; }; - 3400A0791BD4533A003E1828 /* CSInputLibraryWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0771BD4533A003E1828 /* CSInputLibraryWindowController.m */; settings = {ASSET_TAGS = (); }; }; - 3400A07A1BD4533A003E1828 /* CSInputLibraryWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3400A0781BD4533A003E1828 /* CSInputLibraryWindowController.xib */; settings = {ASSET_TAGS = (); }; }; - 3400A07E1BD49406003E1828 /* CSInputLibraryItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3400A07D1BD49406003E1828 /* CSInputLibraryItemView.xib */; settings = {ASSET_TAGS = (); }; }; - 3400A0841BD522A5003E1828 /* CSLibraryInputItemViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0831BD522A5003E1828 /* CSLibraryInputItemViewController.m */; settings = {ASSET_TAGS = (); }; }; + 3400A0621BD44DF0003E1828 /* CSInputLibraryItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0611BD44DF0003E1828 /* CSInputLibraryItem.m */; }; + 3400A0791BD4533A003E1828 /* CSInputLibraryWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0771BD4533A003E1828 /* CSInputLibraryWindowController.m */; }; + 3400A07A1BD4533A003E1828 /* CSInputLibraryWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3400A0781BD4533A003E1828 /* CSInputLibraryWindowController.xib */; }; + 3400A07E1BD49406003E1828 /* CSInputLibraryItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3400A07D1BD49406003E1828 /* CSInputLibraryItemView.xib */; }; + 3400A0841BD522A5003E1828 /* CSLibraryInputItemViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0831BD522A5003E1828 /* CSLibraryInputItemViewController.m */; }; 3408235519BC677A00CD1F5F /* CSNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408235419BC530300CD1F5F /* CSNotifications.m */; }; 3408235619BC677C00CD1F5F /* CSNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408235419BC530300CD1F5F /* CSNotifications.m */; }; 340D8C971959C7C100BE5144 /* CompressionSettingsPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 340D8C961959C7C100BE5144 /* CompressionSettingsPanel.xib */; }; @@ -56,7 +56,7 @@ 343644081B78F01D0069B8F2 /* CSAnimation.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3494616C1ABD399B00F28883 /* CSAnimation.py */; }; 343644091B78F01D0069B8F2 /* pluginbase.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 34E983841B78B19D00F26F1E /* pluginbase.py */; }; 343692501B6243D4007EC2D9 /* CSShapeCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 3436922B1B62364E007EC2D9 /* CSShapeCapturePlugin.bundle */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 343ED9421BCAC1C80061FC4B /* EditBuiltinLayoutView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 343ED9411BCAC1C80061FC4B /* EditBuiltinLayoutView.xib */; settings = {ASSET_TAGS = (); }; }; + 343ED9421BCAC1C80061FC4B /* EditBuiltinLayoutView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 343ED9411BCAC1C80061FC4B /* EditBuiltinLayoutView.xib */; }; 3444D8E819A0CDE8000DC46B /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3444D8E719A0CDE8000DC46B /* Quartz.framework */; }; 344825D21B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344825D11B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib */; }; 344825E61B253D6900AF9EAC /* CAMultiAudioMatrixCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 344825E51B253D6900AF9EAC /* CAMultiAudioMatrixCell.m */; }; @@ -150,6 +150,7 @@ 3498D94F1A9472BD00906532 /* CSAudioSwitchControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3498D94E1A9472BD00906532 /* CSAudioSwitchControl.m */; }; 34A64A2F165EFE4C00A68428 /* PreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34A64A2E165EFE4B00A68428 /* PreviewView.m */; }; 34A64A37165F208800A68428 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34A64A36165F208800A68428 /* QuartzCore.framework */; }; + 34A7ADB81C01EF1400685044 /* CompressionSettingsPanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34A7ADB71C01EF1400685044 /* CompressionSettingsPanelController.m */; }; 34A7C1AD19B9A57600BC6882 /* CSLayoutSwitcherExtraPlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34A7C1A119B9A41A00BC6882 /* CSLayoutSwitcherExtraPlugin.bundle */; }; 34AB1C311B944F48003F2C03 /* CSPreviewOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AB1C301B944F48003F2C03 /* CSPreviewOverlayView.m */; }; 34ABEF3C17C0C2CB00AA5E62 /* advancedPrefPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34ABEF3B17C0C2CB00AA5E62 /* advancedPrefPanel.xib */; }; @@ -201,8 +202,8 @@ 34D6580319B342E70012E32B /* CSFileStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC33019B0AD500007C07B /* CSFileStreamServicePlugin.bundle */; }; 34D6581819B387DE0012E32B /* AppDelegate+AppDelegate_ScriptingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D6581719B387DE0012E32B /* AppDelegate+AppDelegate_ScriptingAdditions.m */; }; 34D696FC1871B8F700B50EB6 /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 34D696FB1871B8F700B50EB6 /* Defaults.plist */; }; - 34DA1D3E1BF823E700132486 /* CSNewOutputWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DA1D3C1BF823E700132486 /* CSNewOutputWindowController.m */; settings = {ASSET_TAGS = (); }; }; - 34DA1D3F1BF823E700132486 /* CSNewOutputWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34DA1D3D1BF823E700132486 /* CSNewOutputWindowController.xib */; settings = {ASSET_TAGS = (); }; }; + 34DA1D3E1BF823E700132486 /* CSNewOutputWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DA1D3C1BF823E700132486 /* CSNewOutputWindowController.m */; }; + 34DA1D3F1BF823E700132486 /* CSNewOutputWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34DA1D3D1BF823E700132486 /* CSNewOutputWindowController.xib */; }; 34DC2FB01B512362008F12A2 /* CSCaptureBase+TimerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DC2FAF1B512362008F12A2 /* CSCaptureBase+TimerDelegate.m */; }; 34DC2FB11B512362008F12A2 /* CSCaptureBase+TimerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DC2FAF1B512362008F12A2 /* CSCaptureBase+TimerDelegate.m */; }; 34DF75581AA272F100DA9FDE /* LayoutRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DF75571AA272F100DA9FDE /* LayoutRenderer.m */; }; @@ -322,13 +323,13 @@ 34ED8CB91B073C1B002C0674 /* CSMidiManagerWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34ED8CB61B073C1B002C0674 /* CSMidiManagerWindowController.xib */; }; 34ED8CBC1B07763F002C0674 /* CSMidiWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */; }; 34ED8CBD1B07763F002C0674 /* CSMidiWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */; }; - 34F1EB921BCCA41F00B38E6C /* CSLayoutEditWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F1EB901BCCA41F00B38E6C /* CSLayoutEditWindowController.m */; settings = {ASSET_TAGS = (); }; }; - 34F1EB931BCCA41F00B38E6C /* CSLayoutEditWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F1EB911BCCA41F00B38E6C /* CSLayoutEditWindowController.xib */; settings = {ASSET_TAGS = (); }; }; + 34F1EB921BCCA41F00B38E6C /* CSLayoutEditWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F1EB901BCCA41F00B38E6C /* CSLayoutEditWindowController.m */; }; + 34F1EB931BCCA41F00B38E6C /* CSLayoutEditWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F1EB911BCCA41F00B38E6C /* CSLayoutEditWindowController.xib */; }; 34F5141216FD6E4F00BA894D /* x264Compressor.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F5140F16FD6E4F00BA894D /* x264Compressor.m */; }; 34F5141316FD6E4F00BA894D /* AppleVTCompressor.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F5141116FD6E4F00BA894D /* AppleVTCompressor.m */; }; - 34F52A271BC1CE2700662911 /* CSLayoutCollectionItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F52A251BC1CE2700662911 /* CSLayoutCollectionItem.m */; settings = {ASSET_TAGS = (); }; }; - 34F52A281BC1CE2700662911 /* CSLayoutCollectionItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F52A261BC1CE2700662911 /* CSLayoutCollectionItem.xib */; settings = {ASSET_TAGS = (); }; }; - 34F52A2B1BC1E0F900662911 /* CSLayoutButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F52A2A1BC1E0F800662911 /* CSLayoutButton.m */; settings = {ASSET_TAGS = (); }; }; + 34F52A271BC1CE2700662911 /* CSLayoutCollectionItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F52A251BC1CE2700662911 /* CSLayoutCollectionItem.m */; }; + 34F52A281BC1CE2700662911 /* CSLayoutCollectionItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F52A261BC1CE2700662911 /* CSLayoutCollectionItem.xib */; }; + 34F52A2B1BC1E0F900662911 /* CSLayoutButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F52A2A1BC1E0F800662911 /* CSLayoutButton.m */; }; 34F7C5871B2C9A5300345230 /* CSDeckLinkCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34F7C5611B2C908700345230 /* CSDeckLinkCapturePlugin.bundle */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 34FDA83E1A84C46500E7F65E /* CSTimeCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34FDA8191A84BF9400E7F65E /* CSTimeCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 34FDD6F21A215268009A7413 /* CSPluginServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 34FDD6F11A215268009A7413 /* CSPluginServices.m */; }; @@ -715,6 +716,8 @@ 34A64A2D165EFE4B00A68428 /* PreviewView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreviewView.h; sourceTree = ""; }; 34A64A2E165EFE4B00A68428 /* PreviewView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PreviewView.m; sourceTree = ""; }; 34A64A36165F208800A68428 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 34A7ADB61C01EF1400685044 /* CompressionSettingsPanelController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CompressionSettingsPanelController.h; path = Interface/CompressionSettingsPanelController.h; sourceTree = ""; }; + 34A7ADB71C01EF1400685044 /* CompressionSettingsPanelController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CompressionSettingsPanelController.m; path = Interface/CompressionSettingsPanelController.m; sourceTree = ""; }; 34A7C17A19B98EA200BC6882 /* CSExtraPluginProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSExtraPluginProtocol.h; path = PluginHeaders/CSExtraPluginProtocol.h; sourceTree = ""; }; 34A7C19C19B9A41900BC6882 /* CSLayoutSwitcherExtraPlugin.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CSLayoutSwitcherExtraPlugin.xcodeproj; path = ExtraPlugins/CSLayoutSwitcherExtraPlugin/CSLayoutSwitcherExtraPlugin.xcodeproj; sourceTree = ""; }; 34AB1C2F1B944F48003F2C03 /* CSPreviewOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSPreviewOverlayView.h; sourceTree = ""; }; @@ -1272,6 +1275,8 @@ 34DA1D3B1BF823E700132486 /* CSNewOutputWindowController.h */, 34DA1D3C1BF823E700132486 /* CSNewOutputWindowController.m */, 34DA1D3D1BF823E700132486 /* CSNewOutputWindowController.xib */, + 34A7ADB61C01EF1400685044 /* CompressionSettingsPanelController.h */, + 34A7ADB71C01EF1400685044 /* CompressionSettingsPanelController.m */, ); name = Interface; sourceTree = ""; @@ -2213,6 +2218,7 @@ 34ED8C4D1B07371C002C0674 /* MIKMIDIClientSourceEndpoint.m in Sources */, 34ED8C811B07371C002C0674 /* MIKMIDIMetaMarkerTextEvent.m in Sources */, 34F5141216FD6E4F00BA894D /* x264Compressor.m in Sources */, + 34A7ADB81C01EF1400685044 /* CompressionSettingsPanelController.m in Sources */, 34DC2FB01B512362008F12A2 /* CSCaptureBase+TimerDelegate.m in Sources */, 34ED8C791B07371C002C0674 /* MIKMIDIMetaEvent.m in Sources */, 34F52A2B1BC1E0F900662911 /* CSLayoutButton.m in Sources */, diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 755a9ad3..fbafbbaa 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -31,7 +31,7 @@ #import "CSInputLibraryWindowController.h" #import "CSInputLibraryItem.h" #import "CSNewOutputWindowController.h" - +#import "CompressionSettingsPanelController.h" @class FFMpegTask; @@ -321,7 +321,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) IBOutlet NSWindow *layoutPanel; @property (strong) CSNewOutputWindowController *addOutputWindowController; - +@property (strong) CompressionSettingsPanelController *compressionEditPanelController; @property (weak) IBOutlet NSWindow *mainWindow; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 261a3571..73235644 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -37,7 +37,6 @@ @implementation CaptureController -@synthesize selectedCompressorType = _selectedCompressorType; @synthesize selectedLayout = _selectedLayout; @synthesize stagingLayout = _stagingLayout; @synthesize audioSamplerate = _audioSamplerate; @@ -387,236 +386,15 @@ } --(NSString *)selectedCompressorType -{ - - return _selectedCompressorType; -} - - --(void)setSelectedCompressorType:(NSString *)selectedCompressorType -{ - _selectedCompressorType = selectedCompressorType; - self.compressTabLabel = selectedCompressorType; - - if (!self.editingCompressor || self.editingCompressor.isNew) - { - if ([selectedCompressorType isEqualToString:@"x264"]) - { - self.editingCompressor = [[x264Compressor alloc] init]; - } else if ([selectedCompressorType isEqualToString:@"AppleVTCompressor"]) { - self.editingCompressor = [[AppleVTCompressor alloc] init]; - } else { - self.editingCompressor = nil; - } - if (self.editingCompressor) - { - self.editingCompressor.isNew = YES; - } - - } - - -} --(IBAction)newCompressPanel -{ - [self openCompressPanel:NO]; -} - --(IBAction)editCompressPanel -{ - [self openCompressPanel:YES]; -} - - --(IBAction)deleteCompressorPanel -{ - - if (self.editingCompressor) - { - NSString *deleteKey = self.editingCompressor.name; - - if (deleteKey) - { - self.selectedCompressor = nil; - self.editingCompressor = nil; - - [self deleteCompressorForName:deleteKey]; - } - } - - [self closeCompressPanel]; -} - - --(void)deleteCompressorForName:(NSString *)name -{ - id to_delete = self.compressors[name]; - - [self willChangeValueForKey:@"compressors"]; - [self.compressors removeObjectForKey:name]; - [self didChangeValueForKey:@"compressors"]; - [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorDeleted object:to_delete userInfo:nil]; -} - - --(IBAction)openCompressPanel:(bool)doEdit -{ - self.selectedCompressor = nil; - - if (self.compressController.selectedObjects.count > 0) - { - id tmpCompressor; - tmpCompressor = [[self.compressController.selectedObjects objectAtIndex:0] valueForKey:@"value"]; - - - self.selectedCompressor = self.compressors[tmpCompressor.name]; - } - - - if (doEdit) - { - self.editingCompressor = self.selectedCompressor; - self.editingCompressorKey = self.selectedCompressor.name; - - - if (self.editingCompressor) - { - self.selectedCompressorType = self.editingCompressor.compressorType; - self.compressTabLabel = self.editingCompressor.compressorType; - } - } else { - self.selectedCompressorType = self.selectedCompressorType; - } - - - - if (!self.compressPanel) - { - NSString *panelName; - - panelName = @"CompressionSettingsPanel"; - - [[NSBundle mainBundle] loadNibNamed:panelName owner:self topLevelObjects:nil]; - - - - [NSApp beginSheet:self.compressPanel modalForWindow:[NSApplication sharedApplication].mainWindow modalDelegate:self didEndSelector:NULL contextInfo:NULL]; - - } - -} - - --(NSString *)addCompressor:(id )newCompressor -{ - NSMutableString *baseName = newCompressor.name; - - NSMutableString *newName = baseName; - int name_try = 1; - - while (self.compressors[newName]) { - newName = [NSMutableString stringWithFormat:@"%@#%d", baseName, name_try]; - name_try++; - } - - newCompressor.name = newName; - [self willChangeValueForKey:@"compressors"]; - [self.compressors setObject:newCompressor forKey:newName]; - [self didChangeValueForKey:@"compressors"]; - - [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorAdded object:newCompressor userInfo:nil]; - - return newName; - -} --(void) setCompressSelection:(NSString *)forName -{ - - for (id tmpval in self.compressController.arrangedObjects) - { - if ([[tmpval valueForKey:@"key"] isEqualToString:forName] ) - { - [self.compressController setSelectedObjects:@[tmpval]]; - break; - } - } -} - --(IBAction)saveCompressPanel -{ - - NSError *compressError; - - - if (self.editingCompressor) - { - - if (![self.editingCompressor validate:&compressError]) - { - if (compressError) - { - [NSApp presentError:compressError]; - } - return; - } - - - - if (self.editingCompressor.isNew) - { - - self.editingCompressor.isNew = NO; - - NSString *newName = [self addCompressor:self.editingCompressor]; - - [self setCompressSelection:newName]; - - - - } else if (![self.editingCompressorKey isEqualToString:self.editingCompressor.name]) { - //the name was changed in the edit dialog, so create a new key entry and delete the old one - NSString *newName = [self addCompressor:self.editingCompressor]; - - - - - [self willChangeValueForKey:@"compressors"]; - [self.compressors removeObjectForKey:self.editingCompressorKey]; - [self didChangeValueForKey:@"compressors"]; - [self setCompressSelection:newName]; - - - - } else { - [self.compressors setObject:self.editingCompressor forKey:self.editingCompressor.name]; - } - } - - [self closeCompressPanel]; - -} - - --(IBAction)closeCompressPanel -{ - - [NSApp endSheet:self.compressPanel]; - [self.compressPanel close]; - self.compressPanel = nil; - self.editingCompressor = nil; - self.editingCompressorKey = nil; -} - - (IBAction)addInputSource:(id)sender { if (self.selectedLayout) @@ -685,7 +463,7 @@ self.addOutputWindowController.compressors = self.compressors; if (toEdit) { - self.addOutputWindowController.outputDestination = toEdit.copy; + self.addOutputWindowController.outputDestination = toEdit; } [self.mainWindow beginSheet:self.addOutputWindowController.window completionHandler:^(NSModalResponse returnCode) { if (returnCode == NSModalResponseOK) @@ -1074,7 +852,7 @@ self.showPreview = YES; self.videoTypes = @[@"Desktop", @"AVFoundation", @"QTCapture", @"Syphon", @"Image", @"Text"]; - self.compressorTypes = @[@"x264", @"AppleVTCompressor", @"None"]; + mach_timebase_info(&_mach_timebase); @@ -1497,56 +1275,50 @@ -(void) migrateDefaultCompressor:(NSMutableDictionary *)saveRoot { - if (self.compressors[@"default"]) + if (self.compressors[@"x264"] && self.compressors[@"AppleVT"]) { //We already migrated, or the user did it for us? return; } - - id newCompressor; - if ([self.selectedCompressorType isEqualToString:@"x264"]) + id defaultCompressor = self.compressors[@"default"]; + if (defaultCompressor) { - - x264Compressor *tmpCompressor; - - tmpCompressor = [[x264Compressor alloc] init]; - tmpCompressor.tune = [saveRoot valueForKey:@"x264tune"]; - tmpCompressor.profile = [saveRoot valueForKey:@"x264profile"]; - tmpCompressor.preset = [saveRoot valueForKey:@"x264preset"]; - tmpCompressor.use_cbr = [[saveRoot valueForKey:@"videoCBR"] boolValue]; - tmpCompressor.crf = [[saveRoot valueForKey:@"x264crf"] intValue]; - tmpCompressor.vbv_maxrate = [[saveRoot valueForKey:@"captureVideoAverageBitrate"] intValue]; - tmpCompressor.vbv_buffer = [[saveRoot valueForKey:@"captureVideoMaxBitrate"] intValue]; - tmpCompressor.keyframe_interval = [[saveRoot valueForKey:@"captureVideoMaxKeyframeInterval"] intValue]; - newCompressor = tmpCompressor; - } else if ([self.selectedCompressorType isEqualToString:@"AppleVTCompressor"]) { - AppleVTCompressor *tmpCompressor; - tmpCompressor = [[AppleVTCompressor alloc] init]; - tmpCompressor.average_bitrate = [[saveRoot valueForKey:@"captureVideoAverageBitrate"] intValue]; - tmpCompressor.max_bitrate = [[saveRoot valueForKey:@"captureVideoMaxBitrate"] intValue]; - tmpCompressor.keyframe_interval = [[saveRoot valueForKey:@"captureVideoMaxKeyframeInterval"] intValue]; - newCompressor = tmpCompressor; - } else { - newCompressor = nil; - } - - if (newCompressor) - { - - newCompressor.width = [[saveRoot valueForKey:@"captureWidth"] intValue]; - newCompressor.height = [[saveRoot valueForKey:@"captureHeight"] intValue]; - if ([saveRoot valueForKey:@"resolutionOption"]) - { - newCompressor.resolutionOption = [saveRoot valueForKey:@"resolutionOption"]; - } - - - newCompressor.name = [@"default" mutableCopy]; - [self addCompressor:newCompressor]; + [self.compressors removeObjectForKey:@"default"]; + defaultCompressor.name = defaultCompressor.compressorType.mutableCopy; + [self.compressors setObject:defaultCompressor forKey:@"x264"]; + NSDictionary *notifyMsg = [NSDictionary dictionaryWithObjectsAndKeys:@"default", @"oldName", defaultCompressor, @"compressor", nil]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorRenamed object:notifyMsg]; } + + + + if (!self.compressors[@"x264"]) + { + x264Compressor *newCompressor; + + newCompressor = [[x264Compressor alloc] init]; + newCompressor.name = @"x264".mutableCopy; + newCompressor.vbv_buffer = 1000; + newCompressor.vbv_maxrate = 1000; + newCompressor.keyframe_interval = 2; + + self.compressors[@"x264"] = newCompressor; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorAdded object:newCompressor]; + } + + if (!self.compressors[@"AppleVT"]) + { + AppleVTCompressor *newCompressor = [[AppleVTCompressor alloc] init]; + newCompressor.name = @"AppleVT".mutableCopy; + newCompressor.average_bitrate = 1000; + newCompressor.max_bitrate = 1000; + newCompressor.keyframe_interval = 2; + self.compressors[@"AppleVT"] = newCompressor; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorAdded object:newCompressor]; + } } @@ -1571,7 +1343,6 @@ [saveRoot setValue: self.selectedVideoType forKey:@"selectedVideoType"]; [saveRoot setValue: self.selectedAudioCapture.uniqueID forKey:@"audioCaptureID"]; [saveRoot setValue: self.captureDestinations forKey:@"captureDestinations"]; - [saveRoot setValue: self.selectedCompressorType forKey:@"selectedCompressorType"]; [saveRoot setValue:[NSNumber numberWithFloat:self.audioCaptureSession.previewVolume] forKey:@"previewVolume"]; [saveRoot setValue:[NSNumber numberWithInt:self.maxOutputDropped] forKey:@"maxOutputDropped"]; [saveRoot setValue:[NSNumber numberWithInt:self.maxOutputPending] forKey:@"maxOutputPending"]; @@ -1584,12 +1355,9 @@ [saveRoot setValue:[NSNumber numberWithBool:self.renderOnIntegratedGPU] forKey:@"renderOnIntegratedGPU"]; - NSUInteger compressoridx = [self.compressController selectionIndex]; - [saveRoot setValue:[NSNumber numberWithUnsignedInteger:compressoridx] forKey:@"selectedCompressor"];\ - //[saveRoot setValue:self.sourceList forKeyPath:@"sourceList"]; [saveRoot setValue:self.selectedLayout forKey:@"selectedLayout"]; @@ -1673,14 +1441,8 @@ } - NSUInteger selectedCompressoridx = [[saveRoot valueForKey:@"selectedCompressor"] unsignedIntegerValue]; - if (self.compressors.count > 0) - { - [self.compressController setSelectionIndex:selectedCompressoridx]; - } - self.captureDestinations = [saveRoot valueForKey:@"captureDestinations"]; @@ -1709,7 +1471,6 @@ self.selectedVideoType = [saveRoot valueForKey:@"selectedVideoType"]; - self.selectedCompressorType = [saveRoot valueForKey:@"selectedCompressorType"]; @@ -1999,27 +1760,6 @@ } - if (!self.selectedCompressor) - { - - if (self.compressController.selectedObjects.count > 0) - { - tmpCompressor = [[self.compressController.selectedObjects objectAtIndex:0] valueForKey:@"value"]; - if (tmpCompressor) - { - self.selectedCompressor = self.compressors[tmpCompressor.name]; - } - - } - } - - - if (self.selectedCompressor) - { - - self.selectedCompressor.settingsController = self; - } - for (OutputDestination *outdest in _captureDestinations) { //make the outputs pick up the default selected compressor @@ -2037,7 +1777,6 @@ _compressedFrameCount = 0; _min_delay = _max_delay = _avg_delay = 0; - //self.videoCompressor = self.selectedCompressor; return YES; @@ -2226,12 +1965,6 @@ self.selectedVideoType = [cmdargs stringForKey:@"selectedVideoType"]; } - if ([cmdargs objectForKey:@"selectedCompressorType"]) - { - self.selectedCompressorType = [cmdargs stringForKey:@"selectedCompressorType"]; - } - - /* if ([cmdargs objectForKey:@"videoCaptureID"]) { @@ -2273,22 +2006,6 @@ } - if ([cmdargs objectForKey:@"compressor"]) - { - NSString *forName = [cmdargs stringForKey:@"compressor"]; - - for (id tmpval in self.compressController.arrangedObjects) - { - if ([[tmpval valueForKey:@"key"] isEqualToString:forName] ) - { - self.selectedCompressor = tmpval; - break; - } - } - - } else { - self.selectedCompressor = [self buildCmdlineCompressor:cmdargs]; - } } diff --git a/CocoaSplit/Compressor/CompressorBase.h b/CocoaSplit/Compressor/CompressorBase.h index fb52a9fa..4a185bac 100644 --- a/CocoaSplit/Compressor/CompressorBase.h +++ b/CocoaSplit/Compressor/CompressorBase.h @@ -37,6 +37,7 @@ @property (strong) NSString *compressorType; @property (strong) NSMutableString *name; @property (assign) bool errored; +@property (assign) bool active; diff --git a/CocoaSplit/Compressor/CompressorBase.m b/CocoaSplit/Compressor/CompressorBase.m index 310dce1e..df2f476d 100644 --- a/CocoaSplit/Compressor/CompressorBase.m +++ b/CocoaSplit/Compressor/CompressorBase.m @@ -34,7 +34,6 @@ return self; } - -(bool) validate:(NSError **)therror { @@ -148,6 +147,7 @@ -(void) addOutput:(OutputDestination *)destination { [self.outputs setObject:destination forKey:destination.name]; + self.active = YES; } -(void) removeOutput:(OutputDestination *)destination @@ -157,6 +157,7 @@ if (self.outputs.count == 0) { [self reset]; + self.active = NO; } } diff --git a/CocoaSplit/Compressor/h264Compressor.h b/CocoaSplit/Compressor/h264Compressor.h index c4b71287..88b44825 100644 --- a/CocoaSplit/Compressor/h264Compressor.h +++ b/CocoaSplit/Compressor/h264Compressor.h @@ -18,7 +18,7 @@ @protocol ControllerProtocol; -@protocol h264Compressor +@protocol h264Compressor //compressFrame is expected to be non-blocking. Create a serial dispatch queue if the underlying compressor //is blocking @@ -39,7 +39,7 @@ @property (assign) int height; @property (strong) NSString *resolutionOption; @property (assign) bool errored; - +@property (assign) bool active; -(void) addOutput:(id)destination; -(void) removeOutput:(id)destination; diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.h b/CocoaSplit/Interface/CSNewOutputWindowController.h index cd3d68c9..1e7303b8 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.h +++ b/CocoaSplit/Interface/CSNewOutputWindowController.h @@ -8,6 +8,7 @@ #import #import "CSStreamServiceProtocol.h" +#import "CompressionSettingsPanelController.h" @class OutputDestination; @@ -15,7 +16,9 @@ - (IBAction)cancelButtonAction:(id)sender; - (IBAction)addButtonAction:(id)sender; +- (IBAction)openCompressorEdit:(id)sender; +@property (strong) IBOutlet NSObjectController *outputObjectController; @property (strong) OutputDestination *outputDestination; @@ -24,5 +27,6 @@ @property (strong) NSArray *outputTypes; @property (weak) IBOutlet NSView *serviceConfigView; @property (strong) NSViewController *pluginViewController; -@property (strong) NSDictionary *compressors; +@property (strong) NSMutableDictionary *compressors; +@property (strong) CompressionSettingsPanelController *compressionPanelController; @end diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.m b/CocoaSplit/Interface/CSNewOutputWindowController.m index 7d1d2eee..ac2de48f 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.m +++ b/CocoaSplit/Interface/CSNewOutputWindowController.m @@ -40,8 +40,18 @@ Class serviceClass = self.streamServiceObject.class; self.selectedOutputType = [serviceClass label]; } + + if (self.outputDestination.compressor_name) + { + id oCompressor = self.compressors[self.outputDestination.compressor_name]; + if (!oCompressor) + { + self.outputDestination.compressor_name = nil; + } + } } + -(OutputDestination *)outputDestination { return _outputDestination; @@ -118,11 +128,15 @@ - (IBAction)cancelButtonAction:(id)sender { + [self.outputObjectController discardEditing]; + [self.pluginViewController discardEditing]; + [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseCancel]; } - (IBAction)addButtonAction:(id)sender { + [self.outputObjectController commitEditing]; [self.pluginViewController commitEditing]; NSString *destination = [self.streamServiceObject getServiceDestination]; @@ -131,5 +145,79 @@ [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseOK]; } +- (IBAction)openCompressorEdit:(id)sender +{ + + NSObject *editCompressor; + + if (!self.outputDestination.compressor_name) + { + return; + } + + editCompressor = self.compressors[self.outputDestination.compressor_name]; + + if (!editCompressor) + { + return; + } + + + self.compressionPanelController = [[CompressionSettingsPanelController alloc] init]; + + if (editCompressor.active) + { + self.compressionPanelController.compressor = editCompressor; + } else { + self.compressionPanelController.compressor = editCompressor.copy; + } + + + [self.window beginSheet:self.compressionPanelController.window completionHandler:^(NSModalResponse returnCode) { + switch (returnCode) { + case NSModalResponseStop: + if (self.compressionPanelController.compressor.active) + { + return; + } + [self willChangeValueForKey:@"compressors"]; + [self.compressors removeObjectForKey:self.compressionPanelController.compressor.name]; + [self didChangeValueForKey:@"compressors"]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorDeleted object:self.compressionPanelController.compressor userInfo:nil]; + + break; + case NSModalResponseOK: + { + if (self.compressionPanelController.compressor.active) + { + //if it was an active compressor the edit was in-place + return; + } + + if (![editCompressor.name isEqualToString:self.compressionPanelController.compressor.name]) + { + [self.compressors removeObjectForKey:editCompressor.name]; + } + self.compressors[self.compressionPanelController.compressor.name] = self.compressionPanelController.compressor; + NSDictionary *notifyMsg = [NSDictionary dictionaryWithObjectsAndKeys:editCompressor.name, @"oldName", self.compressionPanelController.compressor, @"compressor", nil]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorRenamed object:notifyMsg]; + break; + } + case 4242: + if (self.compressionPanelController.saveProfileName) + { + self.compressionPanelController.compressor.name = self.compressionPanelController.saveProfileName.mutableCopy; + [self willChangeValueForKey:@"compressors"]; + self.compressors[self.compressionPanelController.compressor.name] = self.compressionPanelController.compressor; + [self didChangeValueForKey:@"compressors"]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorAdded object:self.compressionPanelController.compressor userInfo:nil]; + + } + default: + break; + } + }]; +} + @end diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.xib b/CocoaSplit/Interface/CSNewOutputWindowController.xib index 16923d1b..e527d617 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.xib +++ b/CocoaSplit/Interface/CSNewOutputWindowController.xib @@ -7,6 +7,7 @@ + @@ -23,20 +24,20 @@ - + - - + + - + - + - + @@ -77,19 +78,19 @@ Gw - + - - + + - + - - + + @@ -102,41 +103,29 @@ Gw - + - - + + - + - - + + - - - - - - - - - - - - - + - + - + @@ -151,6 +140,29 @@ Gw + + + + + + + + + + + + + @@ -175,4 +187,7 @@ Gw + + + diff --git a/CocoaSplit/Interface/CompressionSettingsPanel.xib b/CocoaSplit/Interface/CompressionSettingsPanel.xib index b06fc54a..e1748fa5 100644 --- a/CocoaSplit/Interface/CompressionSettingsPanel.xib +++ b/CocoaSplit/Interface/CompressionSettingsPanel.xib @@ -1,15 +1,15 @@ - + - + - + - - - + + + @@ -25,37 +25,16 @@ + - - - - - - - - - - - - - - - - - - - - - - - + @@ -109,6 +96,7 @@ Gw + @@ -120,6 +108,7 @@ Gw + @@ -131,6 +120,7 @@ Gw + @@ -139,6 +129,7 @@ Gw + @@ -160,21 +151,60 @@ Gw - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + - - + + - + + @@ -182,7 +212,8 @@ Gw - + + @@ -190,7 +221,8 @@ Gw - + + @@ -198,7 +230,8 @@ Gw - + + @@ -206,7 +239,8 @@ Gw - + + @@ -214,7 +248,8 @@ Gw - + + @@ -222,7 +257,8 @@ Gw - + + @@ -230,7 +266,8 @@ Gw - + + @@ -238,6 +275,11 @@ Gw + + + NSNegateBoolean + + @@ -246,7 +288,8 @@ Gw - + + @@ -268,7 +311,8 @@ Gw - + + @@ -284,10 +328,11 @@ Gw - + + @@ -303,7 +348,8 @@ Gw - + + @@ -321,6 +367,11 @@ Gw + + + NSNegateBoolean + + @@ -329,7 +380,8 @@ Gw - + + @@ -348,6 +400,11 @@ Gw No Value + + + NSNegateBoolean + + @@ -356,7 +413,8 @@ Gw - + + @@ -375,6 +433,11 @@ Gw No Value + + + NSNegateBoolean + + @@ -383,7 +446,8 @@ Gw - + + @@ -391,7 +455,8 @@ Gw - + + @@ -425,13 +487,19 @@ Gw - + + + + + NSNegateBoolean + + @@ -440,7 +508,8 @@ Gw - + + @@ -448,7 +517,8 @@ Gw - + + @@ -463,15 +533,17 @@ Gw + - + - + + @@ -479,7 +551,8 @@ Gw - + + @@ -487,7 +560,8 @@ Gw - + + @@ -495,7 +569,8 @@ Gw - + + @@ -503,7 +578,8 @@ Gw - + + @@ -519,7 +595,8 @@ Gw - + + @@ -535,10 +612,11 @@ Gw - + + @@ -554,10 +632,11 @@ Gw - + + @@ -579,7 +658,8 @@ Gw - + + @@ -587,7 +667,8 @@ Gw - + + @@ -616,13 +699,19 @@ Gw - + + + + + NSNegateBoolean + + @@ -631,19 +720,24 @@ Gw + - + + + + + - + @@ -682,6 +776,11 @@ Gw + + + + + diff --git a/CocoaSplit/Interface/CompressionSettingsPanelController.h b/CocoaSplit/Interface/CompressionSettingsPanelController.h new file mode 100644 index 00000000..7dbbb633 --- /dev/null +++ b/CocoaSplit/Interface/CompressionSettingsPanelController.h @@ -0,0 +1,29 @@ +// +// CompressionSettingsPanelController.h +// CocoaSplit +// +// Created by Zakk on 11/22/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import +#import "h264Compressor.h" + +@interface CompressionSettingsPanelController : NSWindowController + +@property (strong) IBOutlet NSObjectController *compressorObjectController; + +@property (strong) id compressor; +@property (strong) NSArray *compressorTypes; +@property (strong) NSString *selectedCompressorType; +@property (strong) NSString *saveProfileName; +@property (strong) IBOutlet NSObjectController *baseObjectController; + +-(void)saveCompressPanel; +-(void)deleteCompressPanel; +-(void)closeCompressPanel; +- (IBAction)saveCompressPanel:(id)sender; + + + +@end diff --git a/CocoaSplit/Interface/CompressionSettingsPanelController.m b/CocoaSplit/Interface/CompressionSettingsPanelController.m new file mode 100644 index 00000000..30d76bcd --- /dev/null +++ b/CocoaSplit/Interface/CompressionSettingsPanelController.m @@ -0,0 +1,62 @@ +// +// CompressionSettingsPanelController.m +// CocoaSplit +// +// Created by Zakk on 11/22/15. +// Copyright © 2015 Zakk. All rights reserved. +// + +#import "CompressionSettingsPanelController.h" + +@interface CompressionSettingsPanelController () + +@end + +@implementation CompressionSettingsPanelController + +-(instancetype) init +{ + if (self = [self initWithWindowNibName:@"CompressionSettingsPanel"]) + { + self.compressorTypes = @[@"x264", @"AppleVTCompressor", @"None"]; + } + + return self; +} + +- (void)windowDidLoad { + [super windowDidLoad]; + + // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. +} + + +-(void)saveCompressPanel +{ + [self.compressorObjectController commitEditing]; + [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseOK]; + +} + +-(void)deleteCompressPanel +{ + + [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseStop]; +} + +-(void)closeCompressPanel +{ + [self.compressorObjectController discardEditing]; + [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseCancel]; +} + +- (IBAction)saveCompressPanel:(id)sender +{ + [self.compressorObjectController commitEditing]; + [self.baseObjectController commitEditing]; + [self.window.sheetParent endSheet:self.window returnCode:4242]; + +} + + +@end diff --git a/CocoaSplit/OutputDestination.m b/CocoaSplit/OutputDestination.m index f02fe522..728d57fe 100644 --- a/CocoaSplit/OutputDestination.m +++ b/CocoaSplit/OutputDestination.m @@ -210,7 +210,10 @@ _delayBuffer = [[NSMutableArray alloc] init]; self.delay_buffer_frames = 0; _stopped = YES; - + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(compressorDeleted:) name:CSNotificationCompressorDeleted object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(compressorRenamed:) name:CSNotificationCompressorRenamed object:nil]; + + } return self; @@ -218,6 +221,34 @@ } +-(void)compressorDeleted:(NSNotification *)notification +{ + id compressor = notification.object; + + if (self.compressor_name && [self.compressor_name isEqualToString:compressor.name]) + { + self.compressor_name = nil; + self.compressor = nil; + } +} + + +-(void)compressorRenamed:(NSNotification *)notification +{ + + NSDictionary *infoDict = notification.object; + + NSString *oldName = infoDict[@"oldName"]; + id compressor = infoDict[@"compressor"]; + + if (self.compressor_name && [self.compressor_name isEqualToString:oldName]) + { + self.compressor_name = compressor.name; + self.compressor = compressor; + } +} + + -(void) attachOutput { FFMpegTask *newout; @@ -278,9 +309,7 @@ if (!self.compressor) { - NSLog(@"NO COMPRESSOR, SETTING TO %@", self.settingsController.selectedCompressor); - - self.compressor = self.settingsController.selectedCompressor; + NSLog(@"NO COMPRESSOR"); } @@ -429,10 +458,8 @@ [self.ffmpeg_out removeObserver:self forKeyPath:@"errored" context:NULL]; [self.ffmpeg_out removeObserver:self forKeyPath:@"active" context:NULL]; [self.compressor removeObserver:self forKeyPath:@"errored" context:NULL]; - - } - + [[NSNotificationCenter defaultCenter] removeObserver:self]; } diff --git a/CocoaSplit/PluginHeaders/CSNotifications.h b/CocoaSplit/PluginHeaders/CSNotifications.h index 89cfbff5..2192c5fa 100644 --- a/CocoaSplit/PluginHeaders/CSNotifications.h +++ b/CocoaSplit/PluginHeaders/CSNotifications.h @@ -24,6 +24,8 @@ extern NSString *const CSNotificationOutputDeleted; extern NSString *const CSNotificationCompressorAdded; extern NSString *const CSNotificationCompressorDeleted; +extern NSString *const CSNotificationCompressorRenamed; + extern NSString *const CSNotificationInputAdded; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 354ba324..ece723f1 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1016,14 +1016,6 @@ - From 7bbc60de3987a34f3f8c7be63d49367ac8738ec5 Mon Sep 17 00:00:00 2001 From: Zakk Date: Wed, 25 Nov 2015 22:08:47 -0500 Subject: [PATCH 031/156] Change save/add button label depending on if existing output is being edited or a new one is being created --- CocoaSplit/Interface/CSNewOutputWindowController.h | 2 ++ CocoaSplit/Interface/CSNewOutputWindowController.m | 4 +++- CocoaSplit/Interface/CSNewOutputWindowController.xib | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.h b/CocoaSplit/Interface/CSNewOutputWindowController.h index 1e7303b8..00aaa02b 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.h +++ b/CocoaSplit/Interface/CSNewOutputWindowController.h @@ -29,4 +29,6 @@ @property (strong) NSViewController *pluginViewController; @property (strong) NSMutableDictionary *compressors; @property (strong) CompressionSettingsPanelController *compressionPanelController; +@property (strong) NSString *buttonLabel; + @end diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.m b/CocoaSplit/Interface/CSNewOutputWindowController.m index ac2de48f..8fd7f539 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.m +++ b/CocoaSplit/Interface/CSNewOutputWindowController.m @@ -24,7 +24,8 @@ NSMutableDictionary *servicePlugins = [[CSPluginLoader sharedPluginLoader] streamServicePlugins]; self.outputTypes = servicePlugins.allKeys; - self.outputDestination = [[OutputDestination alloc] init]; + _outputDestination = [[OutputDestination alloc] init]; + self.buttonLabel = @"Add"; } return self; @@ -34,6 +35,7 @@ -(void)setOutputDestination:(OutputDestination *)outputDestination { _outputDestination = outputDestination; + self.buttonLabel = @"Save"; if (outputDestination.streamServiceObject) { self.streamServiceObject = outputDestination.streamServiceObject; diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.xib b/CocoaSplit/Interface/CSNewOutputWindowController.xib index e527d617..8a9efeff 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.xib +++ b/CocoaSplit/Interface/CSNewOutputWindowController.xib @@ -61,6 +61,7 @@ + - - - - - - - - - - - - - - - - - - - diff --git a/CocoaSplit/Interface/NewLayoutPanel.xib b/CocoaSplit/Interface/NewLayoutPanel.xib deleted file mode 100644 index 10872155..00000000 --- a/CocoaSplit/Interface/NewLayoutPanel.xib +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CocoaSplit/PreviewView.h b/CocoaSplit/PreviewView.h index ce8f812c..3b0dbf9b 100644 --- a/CocoaSplit/PreviewView.h +++ b/CocoaSplit/PreviewView.h @@ -26,7 +26,7 @@ #define LAYOUT_RESOLUTIONS @[@"1280x720@60", @"1280x720@30", @"1920x1080@60", @"1920x1080@30", @"Custom"] -@interface PreviewView : NSView +@interface PreviewView : NSView { diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index ece723f1..3d8cbfab 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -23,7 +23,6 @@ - @@ -1976,11 +1975,6 @@ - - - - - diff --git a/InputPopupControllerViewController.m b/InputPopupControllerViewController.m index c92b7542..0ea34bb3 100644 --- a/InputPopupControllerViewController.m +++ b/InputPopupControllerViewController.m @@ -216,10 +216,6 @@ } [self.inputSource editorPopoverDidClose]; - - - - } @@ -439,7 +435,7 @@ - (IBAction)resetConstraints:(id)sender { - NSDictionary *oldConstraints = self.inputSource.constraintMap; + NSMutableDictionary *oldConstraints = self.inputSource.constraintMap; [[self.inputSource.sourceLayout.undoManager prepareWithInvocationTarget:self.inputSource.sourceLayout] modifyUUID:self.inputSource.uuid withBlock:^(InputSource *input) { From f22efcdbb5d3b787196540fdef4224b31c5e1562 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 29 Nov 2015 07:17:22 -0500 Subject: [PATCH 034/156] Image and window captures now set magnification and minification filters on the CALayer. Fixed save/restore of Window Capture plugin (wasn't saving captureFPS) --- .../CSImageCapturePlugin/ImageCapture.m | 4 +++ .../CSWindowCapturePlugin/WindowCapture.m | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/CapturePlugins/CSImageCapturePlugin/CSImageCapturePlugin/ImageCapture.m b/CapturePlugins/CSImageCapturePlugin/CSImageCapturePlugin/ImageCapture.m index 738ff6b8..3bdcbd16 100644 --- a/CapturePlugins/CSImageCapturePlugin/CSImageCapturePlugin/ImageCapture.m +++ b/CapturePlugins/CSImageCapturePlugin/CSImageCapturePlugin/ImageCapture.m @@ -86,6 +86,10 @@ } else if (_animation) { [newLayer addAnimation:_animation forKey:@"contents"]; } + + newLayer.minificationFilter = kCAFilterTrilinear; + newLayer.magnificationFilter = kCAFilterTrilinear; + return newLayer; } diff --git a/CapturePlugins/CSWindowCapturePlugin/CSWindowCapturePlugin/WindowCapture.m b/CapturePlugins/CSWindowCapturePlugin/CSWindowCapturePlugin/WindowCapture.m index f5374d15..64776843 100644 --- a/CapturePlugins/CSWindowCapturePlugin/CSWindowCapturePlugin/WindowCapture.m +++ b/CapturePlugins/CSWindowCapturePlugin/CSWindowCapturePlugin/WindowCapture.m @@ -28,6 +28,35 @@ return self; } + +-(void)encodeWithCoder:(NSCoder *)aCoder +{ + [super encodeWithCoder:aCoder]; + [aCoder encodeFloat:self.captureFPS forKey:@"captureFPS"]; +} + + + +-(id) initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super initWithCoder:aDecoder]) + { + self.captureFPS = [aDecoder decodeFloatForKey:@"captureFPS"]; + } + + return self; +} + + +-(CALayer *)createNewLayer +{ + CALayer *newLayer = [super createNewLayer]; + newLayer.minificationFilter = kCAFilterTrilinear; + newLayer.magnificationFilter = kCAFilterTrilinear; + return newLayer; +} + + -(NSArray *) availableVideoDevices { NSArray *windows = CFBridgingRelease(CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly|kCGWindowListExcludeDesktopElements, kCGNullWindowID)); @@ -81,12 +110,15 @@ NSNumber *windowID = self.activeVideoDevice.captureDevice; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + CGImageRef windowImg = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, [windowID unsignedIntValue], kCGWindowImageBoundsIgnoreFraming|kCGWindowImageBestResolution); [self updateLayersWithBlock:^(CALayer *layer) { layer.contents = (__bridge id)(windowImg); }]; CGImageRelease(windowImg); + }); _nextCaptureTime = currentTime + (1/self.captureFPS); } From d726675faf838c16150ebc8aa2fb276826e50cad Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 30 Nov 2015 07:32:41 -0500 Subject: [PATCH 035/156] layout merge/replace now only removes (and applies transitions to) inputs that have actually changed. Change is determined by using NSKeyedArchiver and comparing the two NSData results. --- CocoaSplit/CaptureController.m | 2 +- CocoaSplit/InputSource.h | 1 + CocoaSplit/InputSource.m | 31 ++++++++++++++++-- CocoaSplit/SourceLayout.m | 58 ++++++++++++++++++++++++++++++++-- 4 files changed, 87 insertions(+), 5 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 6195e274..5958021d 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1749,7 +1749,7 @@ if ([self startStream] == YES) { - self.selectedTabIndex = 4; + self.selectedTabIndex = 2; } else { [sender setNextState]; diff --git a/CocoaSplit/InputSource.h b/CocoaSplit/InputSource.h index 3ea55c87..94e5a27e 100644 --- a/CocoaSplit/InputSource.h +++ b/CocoaSplit/InputSource.h @@ -230,6 +230,7 @@ typedef enum resize_style_t { -(void)createUUID; -(void)updateRotationTransform; -(void) directSize:(CGFloat)width height:(CGFloat)height; +-(bool)isDifferentInput:(InputSource *)from; diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 69e62406..76fb2b60 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -1642,7 +1642,7 @@ static NSArray *_sourceTypes = nil; -(void)setX_pos:(float)x_pos { - [self registerUndoForProperty:@"x_pos" withAction:@"Position X"]; + //[self registerUndoForProperty:@"x_pos" withAction:@"Position X"]; if (x_pos > 0 && x_pos <= 1.0) { CALayer *sLayer = self.layer.superlayer; @@ -1661,7 +1661,7 @@ static NSArray *_sourceTypes = nil; -(void)setY_pos:(float)y_pos { - [self registerUndoForProperty:@"y_pos" withAction:@"Position Y"]; + //[self registerUndoForProperty:@"y_pos" withAction:@"Position Y"]; if (y_pos > 0 && y_pos <= 1.0) { CALayer *sLayer = self.layer.superlayer; @@ -2087,6 +2087,33 @@ static NSArray *_sourceTypes = nil; _selectedVideoType = selectedVideoType; } +-(NSData *)saveData +{ + NSMutableData *saveData = [NSMutableData data]; + NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:saveData]; + [archiver encodeObject:self forKey:@"root"]; + [archiver finishEncoding]; + return saveData; +} + +-(bool)isDifferentInput:(InputSource *)from +{ + if (![from.uuid isEqualToString:self.uuid]) + { + return YES; + } + + NSData *myData = [self saveData]; + NSData *fromData = [from saveData]; + + if ([myData isEqualToData:fromData]) + { + return NO; + } + + return YES; +} + -(NSViewController *)sourceConfigurationView { diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 43263448..a58b6f68 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -492,7 +492,25 @@ [self.containedLayouts removeObject:cLayout]; } - [self removeSourceInputs:self.sourceList withLayer:nil]; + [self.animationList removeAllObjects]; + //If an input exists in both lists, only remove it if the new one is different/changed + + NSMutableArray *rList = [NSMutableArray array]; + for (InputSource *src in self.sourceList) + { + InputSource *nSrc = [layout inputForUUID:src.uuid]; + if (nSrc) + { + if ([nSrc isDifferentInput:src]) + { + [rList addObject:src]; + } + } else { + [rList addObject:src]; + } + } + + [self removeSourceInputs:rList withLayer:nil]; if (self.addLayoutBlock) @@ -608,7 +626,16 @@ src.sourceLayout = self; src.is_live = self.isActive; InputSource *eSrc = [self inputForUUID:src.uuid]; + bool isDifferent = YES; + if (eSrc) + { + isDifferent = [eSrc isDifferentInput:src]; + if (!isDifferent) + { + continue; + } + } if (eSrc && !onlyAdd) { [eSrc.layer.superlayer addSublayer:src.layer]; @@ -675,8 +702,20 @@ src.is_live = self.isActive; InputSource *eSrc = [self inputForUUID:src.uuid]; + bool isDifferent = NO; + + if (eSrc) + { + isDifferent = [eSrc isDifferentInput:src]; + } + if (eSrc && !onlyAdd) { + if (!isDifferent) + { + continue; + } + src.layer.hidden = YES; [eSrc.layer.superlayer addSublayer:src.layer]; @@ -703,6 +742,10 @@ [undoSources addObject:eSrc]; } else { + if (eSrc && !isDifferent) + { + continue; + } src.layer.hidden = YES; @@ -761,10 +804,12 @@ [unarchiver finishDecoding]; NSArray *mergeList; + NSArray *mergeAnimationList = nil; if ([mergeObj isKindOfClass:[NSDictionary class]]) { mergeList = [((NSDictionary *)mergeObj) objectForKey:@"sourcelist"]; + mergeAnimationList = [((NSDictionary *)mergeObj) objectForKey:@"animationList"]; } else { mergeList = (NSArray *)mergeObj; } @@ -773,6 +818,16 @@ { [self.undoManager beginUndoGrouping]; } + + + if (mergeAnimationList) + { + for (CSAnimationItem *aItem in mergeAnimationList) + { + [[self mutableArrayValueForKey:@"animationList"] addObject:aItem]; + } + } + NSArray *undoSources; @@ -831,7 +886,6 @@ [CATransaction setCompletionBlock:^{ for (InputSource *dInput in undoSources) { - //NSLog(@"DELETING SOURCE %@", dInput); [weakSelf deleteSource:dInput]; } }]; From d2306f8662a9dd17cc8bf432cf8355e7e52b1d63 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 7 Dec 2015 09:51:35 -0500 Subject: [PATCH 036/156] Animation Items now have a uuid and are refcounted/tracked just like inputs across layout merges/removes/replaces. Start of animation UI for individual layout edits --- CocoaSplit.xcodeproj/project.pbxproj | 18 +- CocoaSplit/CSAnimationItem.h | 4 + CocoaSplit/CSAnimationItem.m | 19 +- CocoaSplit/CocoaSplit-Info.plist | 6 +- CocoaSplit/InputSource.h | 1 + CocoaSplit/InputSource.m | 1 + .../Interface/CSLayoutEditWindowController.h | 3 + .../Interface/CSLayoutEditWindowController.m | 28 + .../CSLayoutEditWindowController.xib | 598 +++++++++++++----- CocoaSplit/LayoutRenderer.m | 5 +- CocoaSplit/SourceLayout.h | 1 + CocoaSplit/SourceLayout.m | 111 +++- 12 files changed, 621 insertions(+), 174 deletions(-) diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 6afa8702..15f43b8b 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -1744,8 +1744,8 @@ 34D43556198DD00F00266169 /* Copy Files */, 3470F41519C849D9000A81C4 /* Copy Files */, 3460E5891AC766120080358E /* CopyFiles */, - 34FB04A31B349A0B00379548 /* ShellScript */, 343644051B78EFF90069B8F2 /* CopyFiles */, + 34BAAD3B1C13DF8F00A48C76 /* ShellScript */, ); buildRules = ( ); @@ -2096,7 +2096,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 34FB04A31B349A0B00379548 /* ShellScript */ = { + 34BAAD3B1C13DF8F00A48C76 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -2107,7 +2107,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "LOCATION=\"${BUILT_PRODUCTS_DIR}\"/\"${CONTENTS_FOLDER_PATH}\"\nIDENTITY=\"Mac Developer: Zachary Girouard (5ZF5EX2CV8)\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/Frameworks/Sparkle.framework\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/MacOS/CocoaSplitCmd\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSAVFCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSLayoutSwitcherExtraPlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSFileStreamServicePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTwitchStreamServicePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSChromaKey.plugin\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/TextureWrapPlugin.plugin\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDesktopCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSMovieCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSWindowCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSImageCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTextCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle/Contents/Frameworks/Syphon.framework\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/XPCServices/zakk.lol.QTCaptureHelper.xpc\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonInjectExtraPlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/CSAnimationRunner.plugin\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDeckLinkCapturePlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSNowPlayingPlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSShapeCapturePlugin.bundle\"\n\n"; + shellScript = "LOCATION=\"${BUILT_PRODUCTS_DIR}\"/\"${CONTENTS_FOLDER_PATH}\"\nIDENTITY=\"Developer ID Application: Zachary Girouard (L3JLUY4S5E)\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/Frameworks/Sparkle.framework\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/MacOS/CocoaSplitCmd\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSAVFCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSLayoutSwitcherExtraPlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSFileStreamServicePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTwitchStreamServicePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSChromaKey.plugin\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/TextureWrapPlugin.plugin\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDesktopCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSMovieCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSWindowCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSImageCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTextCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle/Contents/Frameworks/Syphon.framework\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/XPCServices/zakk.lol.QTCaptureHelper.xpc\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonInjectExtraPlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/CSAnimationRunner.plugin\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDeckLinkCapturePlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSNowPlayingPlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSShapeCapturePlugin.bundle\"\n\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -2408,7 +2408,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = "compiler-default"; GCC_DYNAMIC_NO_PIC = NO; @@ -2438,7 +2438,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = "compiler-default"; @@ -2461,8 +2461,8 @@ ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; - CODE_SIGN_IDENTITY = "Developer ID Application"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; + CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -2500,8 +2500,8 @@ ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; - CODE_SIGN_IDENTITY = "Developer ID Application"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; + CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/CocoaSplit/CSAnimationItem.h b/CocoaSplit/CSAnimationItem.h index 3a020b14..c16ab2b1 100644 --- a/CocoaSplit/CSAnimationItem.h +++ b/CocoaSplit/CSAnimationItem.h @@ -16,6 +16,10 @@ @property (strong) NSString *module_name; @property (strong) NSString *name; @property (readonly) bool onLive; +@property (strong) NSString *uuid; +@property (assign) NSInteger *refCount; + + //label -> 'whatever' //input -> InputSource diff --git a/CocoaSplit/CSAnimationItem.m b/CocoaSplit/CSAnimationItem.m index e3e358ba..e8b5b2e2 100644 --- a/CocoaSplit/CSAnimationItem.m +++ b/CocoaSplit/CSAnimationItem.m @@ -19,7 +19,8 @@ { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sourceWasDeleted:) name:CSNotificationInputDeleted object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sourceWasAdded:) name:CSNotificationInputAdded object:nil]; - + [self createUUID]; + self.refCount = 0; } return self; @@ -39,6 +40,10 @@ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeObject:self.module_name forKey:@"module_name"]; [aCoder encodeObject:self.inputs forKey:@"inputs"]; + if (self.uuid) + { + [aCoder encodeObject:self.uuid forKey:@"uuid"]; + } } -(instancetype)initWithCoder:(NSCoder *)aDecoder @@ -48,12 +53,24 @@ self.name = [aDecoder decodeObjectForKey:@"name"]; self.module_name = [aDecoder decodeObjectForKey:@"module_name"]; self.inputs = [aDecoder decodeObjectForKey:@"inputs"]; + if ([aDecoder containsValueForKey:@"uuid"]) + { + self.uuid = [aDecoder decodeObjectForKey:@"uuid"]; + } } return self; } +-(void)createUUID +{ + CFUUIDRef tmpUUID = CFUUIDCreate(NULL); + self.uuid = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, tmpUUID); + CFRelease(tmpUUID); + +} + -(instancetype)copyWithZone:(NSZone *)zone { CSAnimationItem *newItem = [[CSAnimationItem allocWithZone:zone] init]; diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index bfe3f34a..00692ec4 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.2 + 2.0.3 CFBundleSignature ???? CFBundleVersion - 2.0.2 + 2.0.3 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion @@ -37,6 +37,6 @@ OSAScriptingDefinition CocoaSplit.sdef SUFeedURL - http://www.cocoasplit.com/cocoasplitcast2.0.xml + https://www.cocoasplit.com/cocoasplitcast2.0.xml diff --git a/CocoaSplit/InputSource.h b/CocoaSplit/InputSource.h index 94e5a27e..7377309e 100644 --- a/CocoaSplit/InputSource.h +++ b/CocoaSplit/InputSource.h @@ -198,6 +198,7 @@ typedef enum resize_style_t { @property (assign) CGFloat topLevelHeight; @property (assign) bool needsAdjustment; @property (assign) bool needsAdjustPosition; +@property (assign) NSInteger refCount; -(void) updateOrigin:(CGFloat)x y:(CGFloat)y; diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 76fb2b60..e27da62f 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -534,6 +534,7 @@ static NSArray *_sourceTypes = nil; self.crop_left = 0; self.crop_right = 0; self.videoSources = [[NSMutableArray alloc] init]; + _refCount = 0; self.constraintMap = [NSMutableDictionary dictionary]; diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.h b/CocoaSplit/Interface/CSLayoutEditWindowController.h index 12d932a3..8e805313 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.h +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.h @@ -14,6 +14,8 @@ @interface CSLayoutEditWindowController : NSWindowController { float _frame_interval; + NSPopover *_animatepopOver; + } @@ -25,5 +27,6 @@ - (IBAction)cancelEdit:(id)sender; - (IBAction)editOK:(id)sender; - (IBAction)newSource:(id)sender; +- (IBAction)openAnimatePopover:(NSButton *)sender; @end diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.m b/CocoaSplit/Interface/CSLayoutEditWindowController.m index ff4a7a8a..87f4cb0e 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.m +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.m @@ -70,5 +70,33 @@ } +- (IBAction)openAnimatePopover:(NSButton *)sender +{ + + CSAnimationChooserViewController *vc; + if (!_animatepopOver) + { + _animatepopOver = [[NSPopover alloc] init]; + + _animatepopOver.animates = YES; + _animatepopOver.behavior = NSPopoverBehaviorTransient; + } + + if (!_animatepopOver.contentViewController) + { + vc = [[CSAnimationChooserViewController alloc] init]; + + + _animatepopOver.contentViewController = vc; + _animatepopOver.delegate = vc; + vc.popover = _animatepopOver; + + } + + vc.sourceLayout = self.previewView.sourceLayout; + [_animatepopOver showRelativeToRect:sender.bounds ofView:sender preferredEdge:NSMinYEdge]; + +} + @end diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.xib b/CocoaSplit/Interface/CSLayoutEditWindowController.xib index 63c4046d..2f4c6441 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.xib +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -17,143 +17,18 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + - + + + + + + diff --git a/CocoaSplit/LayoutRenderer.m b/CocoaSplit/LayoutRenderer.m index 1d6a6394..60acf793 100644 --- a/CocoaSplit/LayoutRenderer.m +++ b/CocoaSplit/LayoutRenderer.m @@ -291,7 +291,10 @@ @synchronized(self) { - CVPixelBufferRetain(_currentPB); + if (_currentPB) + { + CVPixelBufferRetain(_currentPB); + } return _currentPB; } } diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index e211197f..9324b9c6 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -71,6 +71,7 @@ @property (strong) NSMutableArray *containedLayouts; + @property (assign) bool in_live; @property (assign) bool in_staging; diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index a58b6f68..44556c61 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -38,7 +38,6 @@ self.rootLayer = [self newRootLayer]; self.animationList = [NSMutableArray array]; - //self.rootLayer.geometryFlipped = YES; _rootSize = NSMakeSize(_canvas_width, _canvas_height); self.sourceList = [NSMutableArray array]; @@ -316,6 +315,7 @@ { [aCoder encodeObject:self.containedLayouts forKey:@"containedLayouts"]; } + } @@ -353,6 +353,7 @@ self.containedLayouts = [aDecoder decodeObjectForKey:@"containedLayouts"]; //set live/staging status for each layout } + } return self; @@ -411,6 +412,46 @@ return retInput; } + +-(NSInteger) incrementAnimationRef:(CSAnimationItem *)anim +{ + anim.refCount++; + return anim.refCount; + +} + +-(NSInteger)decrementAnimationRef:(CSAnimationItem *)anim +{ + anim.refCount--; + if (anim.refCount < 0) + { + anim.refCount = 0; + } + + return anim.refCount; +} + + +-(NSInteger)incrementInputRef:(InputSource *)input +{ + + input.refCount++; + + return input.refCount; +} + +-(NSInteger)decrementInputRef:(InputSource *)input +{ + input.refCount--; + if (input.refCount < 0) + { + input.refCount = 0; + } + + return input.refCount; +} + + -(InputSource *)findSource:(NSPoint)forPoint deepParent:(bool)deepParent { @@ -459,6 +500,7 @@ } + -(void)replaceWithSourceLayout:(SourceLayout *)layout { @@ -630,9 +672,12 @@ if (eSrc) { + isDifferent = [eSrc isDifferentInput:src]; if (!isDifferent) { + [self incrementInputRef:eSrc]; + continue; } } @@ -641,10 +686,12 @@ [eSrc.layer.superlayer addSublayer:src.layer]; eSrc.layer.hidden = YES; [undoSources addObject:eSrc]; + eSrc.refCount = 0; } else { [self.rootLayer addSublayer:src.layer]; } [NSApp registerMIDIResponder:src]; + [self incrementInputRef:src]; @@ -683,6 +730,8 @@ NSMutableArray *undoSources = [NSMutableArray array]; CATransition *rTrans = nil; + NSInteger origRefCnt = 0; + if (self.transitionName || self.transitionFilter) { rTrans = [CATransition animation]; @@ -713,6 +762,7 @@ { if (!isDifferent) { + [self incrementInputRef:eSrc]; continue; } @@ -736,6 +786,8 @@ [src.layer addAnimation:rTrans forKey:nil]; } + origRefCnt = eSrc.refCount; + eSrc.refCount = 0; eSrc.layer.hidden = YES; src.layer.hidden = NO; [CATransaction commit]; @@ -744,6 +796,8 @@ if (eSrc && !isDifferent) { + [self incrementInputRef:eSrc]; + continue; } src.layer.hidden = YES; @@ -765,6 +819,7 @@ [NSApp registerMIDIResponder:src]; + src.refCount = origRefCnt+1; [[self mutableArrayValueForKey:@"sourceList" ] addObject:src]; [_uuidMap setObject:src forKey:src.uuid]; @@ -824,7 +879,14 @@ { for (CSAnimationItem *aItem in mergeAnimationList) { - [[self mutableArrayValueForKey:@"animationList"] addObject:aItem]; + CSAnimationItem *eItem = [self animationForUUID:aItem.uuid]; + if (eItem) + { + [self incrementAnimationRef:eItem]; + } else { + [[self mutableArrayValueForKey:@"animationList"] addObject:aItem]; + [self incrementAnimationRef:aItem]; + } } } @@ -903,7 +965,13 @@ if (eSrc) { - + + NSInteger refCnt = [self decrementInputRef:eSrc]; + if (refCnt != 0) + { + continue; + } + eSrc.layer.hidden = YES; [undoSources addObject:eSrc]; } @@ -943,6 +1011,12 @@ InputSource *eSrc = [self inputForUUID:src.uuid]; if (eSrc) { + NSInteger refCnt = [self decrementInputRef:eSrc]; + if (refCnt != 0) + { + continue; + } + [CATransaction begin]; __weak SourceLayout *weakSelf = self; @@ -1031,16 +1105,35 @@ [unarchiver finishDecoding]; NSArray *mergeList; + NSArray *mergeAnim; if ([mergeObj isKindOfClass:[NSDictionary class]]) { mergeList = [((NSDictionary *)mergeObj) objectForKey:@"sourcelist"]; + mergeAnim = [((NSDictionary *)mergeObj) objectForKey:@"animationList"]; + } else { mergeList = (NSArray *)mergeObj; } [self removeSourceInputs:mergeList withLayer:withLayer]; + + if (mergeAnim) + { + for (CSAnimationItem *aItem in mergeAnim) + { + CSAnimationItem *eItem = [self animationForUUID:aItem.uuid]; + if (eItem) + { + NSInteger eCnt = [self decrementAnimationRef:eItem]; + if (eCnt <= 0) + { + [[self mutableArrayValueForKey:@"animationList"] removeObject:eItem]; + } + } + } + } return mergeObj; } @@ -1379,6 +1472,18 @@ } +-(CSAnimationItem *)animationForUUID:(NSString *)uuid +{ + for (CSAnimationItem *item in self.animationList) + { + if ([item.uuid isEqualToString:uuid]) + { + return item; + } + } + return nil; +} + -(InputSource *)inputForUUID:(NSString *)uuid { From e498b9e2485d2dd9646bbdae26fd0e9b69a5b423 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 13 Dec 2015 16:49:15 -0500 Subject: [PATCH 037/156] Added animation editing to layout editor --- CocoaSplit/CSAnimationItem.m | 2 +- .../Interface/CSLayoutEditWindowController.m | 35 +++ .../CSLayoutEditWindowController.xib | 212 ++++++++++++------ .../Interface/EditBuiltinLayoutView.xib | 4 +- 4 files changed, 181 insertions(+), 72 deletions(-) diff --git a/CocoaSplit/CSAnimationItem.m b/CocoaSplit/CSAnimationItem.m index e8b5b2e2..b9ed4665 100644 --- a/CocoaSplit/CSAnimationItem.m +++ b/CocoaSplit/CSAnimationItem.m @@ -114,7 +114,7 @@ if ([inputType isEqualToString:@"input"]) { InputSource *inpsrc = inp[@"value"]; - if (inpsrc == srcDel) + if (inpsrc == srcDel && inpsrc.sourceLayout == srcDel.sourceLayout) { inp[@"deletedUUID"] = srcDel.uuid; inp[@"value"] = [NSNull null]; diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.m b/CocoaSplit/Interface/CSLayoutEditWindowController.m index 87f4cb0e..3c84eb2e 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.m +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.m @@ -98,5 +98,40 @@ } +- (id)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row +{ + + NSView *retView = nil; + + + CSAnimationItem *animation = self.previewView.sourceLayout.selectedAnimation; + + NSArray *inputs = animation.inputs; + + NSDictionary *inputmap = nil; + + if (row > -1 && row < inputs.count) + { + inputmap = [inputs objectAtIndex:row]; + } + + if ([tableColumn.identifier isEqualToString:@"label"]) + { + + retView = [tableView makeViewWithIdentifier:@"LabelCellView" owner:self]; + } else if ([tableColumn.identifier isEqualToString:@"value"]) { + if ([inputmap[@"type"] isEqualToString:@"param"]) + { + retView = [tableView makeViewWithIdentifier:@"InputParamView" owner:self]; + } else if ([inputmap[@"type"] isEqualToString:@"bool"]) { + retView = [tableView makeViewWithIdentifier:@"InputBoolView" owner:self]; + } else { + retView = [tableView makeViewWithIdentifier:@"InputSourceView" owner:self]; + } + } + + return retView; +} + @end diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.xib b/CocoaSplit/Interface/CSLayoutEditWindowController.xib index 2f4c6441..f53dfb7d 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.xib +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.xib @@ -41,8 +41,22 @@ DQ - - + + + @@ -231,14 +245,14 @@ DQ - + - - + + @@ -293,6 +307,7 @@ DQ + @@ -311,166 +326,219 @@ DQ - - - - - + + + + - - + + - - + + - + - + - - + + - - + + + + + - - - + + + - + - - + + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - + + + + + + + - - - + + + + + + + + + + + + + + + + + - - - + + + + - - - + + - + - + + + - @@ -500,8 +568,14 @@ Gw + + + + + + diff --git a/CocoaSplit/Interface/EditBuiltinLayoutView.xib b/CocoaSplit/Interface/EditBuiltinLayoutView.xib index 076f0a26..79c53dfc 100644 --- a/CocoaSplit/Interface/EditBuiltinLayoutView.xib +++ b/CocoaSplit/Interface/EditBuiltinLayoutView.xib @@ -1,8 +1,8 @@ - + - + From a00dde4a1eb638c67d90a3096817d6f9ee9063c3 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 13 Dec 2015 17:16:57 -0500 Subject: [PATCH 038/156] onLive animation flag is now honored when merging a layout into another layout --- CocoaSplit/SourceLayout.m | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 44556c61..f9ba0602 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -607,7 +607,15 @@ return; } - [self mergeSourceListData:toMerge.savedSourceListData]; + NSArray *mergedAnim = nil; + + NSObject *dictOrObj = [self mergeSourceListData:toMerge.savedSourceListData]; + + if ([dictOrObj isKindOfClass:[NSDictionary class]]) + { + NSDictionary *dict = (NSDictionary *)dictOrObj; + mergedAnim = [dict valueForKey:@"animationList"]; + } [self adjustAllInputs]; [self.containedLayouts addObject:toMerge]; @@ -615,6 +623,21 @@ { self.addLayoutBlock(toMerge); } + + if (mergedAnim) + { + for (CSAnimationItem *anim in mergedAnim) + { + if (anim.onLive) + { + CSAnimationItem *eItem = [self animationForUUID:anim.uuid]; + if (eItem) + { + [self runSingleAnimation:eItem]; + } + } + } + } } From 6ef88bcc3f541fcc536b9e082e7d3704dbdb7445 Mon Sep 17 00:00:00 2001 From: Zakk Date: Fri, 25 Dec 2015 05:27:35 -0500 Subject: [PATCH 039/156] Only run onLive animations when they are initially added to a layout --- CocoaSplit/CSAnimationItem.h | 2 +- CocoaSplit/SourceLayout.m | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CSAnimationItem.h b/CocoaSplit/CSAnimationItem.h index c16ab2b1..bf4ffef3 100644 --- a/CocoaSplit/CSAnimationItem.h +++ b/CocoaSplit/CSAnimationItem.h @@ -17,7 +17,7 @@ @property (strong) NSString *name; @property (readonly) bool onLive; @property (strong) NSString *uuid; -@property (assign) NSInteger *refCount; +@property (assign) NSInteger refCount; diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index f9ba0602..1cc70e09 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -524,6 +524,8 @@ [CATransaction begin]; } + + for (SourceLayout *cLayout in self.containedLayouts.copy) { if (self.removeLayoutBlock) @@ -533,6 +535,17 @@ [self.containedLayouts removeObject:cLayout]; } + //Only run animations that aren't already in the layout + + NSMutableArray *runAnimations = [NSMutableArray array]; + + for (CSAnimationItem *anim in layout.animationList) + { + if (![self animationForUUID:anim.uuid] && anim.onLive) + { + [runAnimations addObject:anim.uuid]; + } + } [self.animationList removeAllObjects]; //If an input exists in both lists, only remove it if the new one is different/changed @@ -584,6 +597,15 @@ [CATransaction commit]; } + for (NSString *anim in runAnimations) + { + CSAnimationItem *eItem = [self animationForUUID:anim]; + if (eItem) + { + [self runSingleAnimation:eItem]; + } + } + _noSceneTransactions = NO; self.canvas_height = layout.canvas_height; self.canvas_width = layout.canvas_width; @@ -631,7 +653,7 @@ if (anim.onLive) { CSAnimationItem *eItem = [self animationForUUID:anim.uuid]; - if (eItem) + if (eItem && eItem.refCount == 1) { [self runSingleAnimation:eItem]; } From 55629836b0009c3dd2a53eec29ca31c30f38f0ec Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 26 Dec 2015 06:40:43 -0500 Subject: [PATCH 040/156] Animation inputs use input UUID to find the object to animate --- CocoaSplit/CSAnimationItem.m | 13 +++++++++++++ CocoaSplit/InputSource.m | 2 ++ CocoaSplit/SourceLayout.m | 16 +++++++++++++++- CocoaSplit/en.lproj/MainMenu.xib | 2 +- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CSAnimationItem.m b/CocoaSplit/CSAnimationItem.m index b9ed4665..a0b887d6 100644 --- a/CocoaSplit/CSAnimationItem.m +++ b/CocoaSplit/CSAnimationItem.m @@ -39,7 +39,20 @@ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeObject:self.module_name forKey:@"module_name"]; + for (NSMutableDictionary *item in self.inputs) + { + if ([item[@"type"] isEqualToString:@"input"]) + { + if (item[@"value"] && ![item[@"value"] isEqualTo:[NSNull null]]) + { + InputSource *inp = item[@"value"]; + item[@"savedUUID"] = inp.uuid; + item[@"value"] = [NSNull null]; + } + } + } [aCoder encodeObject:self.inputs forKey:@"inputs"]; + if (self.uuid) { [aCoder encodeObject:self.uuid forKey:@"uuid"]; diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index e27da62f..06738b51 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -1279,10 +1279,12 @@ static NSArray *_sourceTypes = nil; } +/* -(NSString *)description { return [NSString stringWithFormat:@"Name: %@ Depth %f", self.name, self.depth]; } + */ -(void)setName:(NSString *)name diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 1cc70e09..dbba0756 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -183,9 +183,23 @@ for (NSDictionary *item in animation.inputs) { + if (item[@"value"]) { - inputMap[item[@"label"]] = item[@"value"]; + if ([item[@"type"] isEqualToString:@"input"]) + { + NSString *suuid = item[@"savedUUID"]; + if (suuid && ![suuid isEqualTo:[NSNull null]]) + { + InputSource *nSrc = [self inputForUUID:suuid]; + if (nSrc) + { + inputMap[item[@"label"]] = nSrc; + } + } + } else { + inputMap[item[@"label"]] = item[@"value"]; + } } else { inputMap[item[@"label"]] = [NSNull null]; } diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 3d8cbfab..8794dd16 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1,5 +1,5 @@ - + From f93fd89086985b5ef2d8d7d595cfb1b11db99a15 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 27 Dec 2015 07:59:36 -0500 Subject: [PATCH 041/156] Staging animation section now hides/reveals with staging layout toggle --- CocoaSplit/CaptureController.h | 3 +- CocoaSplit/CaptureController.m | 8 +- CocoaSplit/en.lproj/MainMenu.xib | 640 +++++++++++++++---------------- 3 files changed, 318 insertions(+), 333 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index fec24ec0..4e5187e8 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -52,7 +52,6 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @interface CaptureController : NSObject { - bool _stagingHidden; NSArray *_inputIdentifiers; @@ -108,6 +107,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , +@property (assign) bool stagingHidden; + @property (strong) NSMutableArray *inputLibrary; @property (weak) IBOutlet NSMenu *stagingFullScreenMenu; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 5958021d..6f39403b 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1942,7 +1942,7 @@ -(void)newStagingFrame { - if (_stagingHidden) + if (self.stagingHidden) { return; } @@ -1970,7 +1970,7 @@ while (1) { - if (_stagingHidden) + if (self.stagingHidden) { return; } @@ -2918,7 +2918,7 @@ [self.canvasSplitView display]; self.livePreviewView.viewOnly = NO; self.activePreviewView = self.livePreviewView; - _stagingHidden = YES; + self.stagingHidden = YES; } @@ -2954,7 +2954,7 @@ [self.canvasSplitView display]; self.livePreviewView.viewOnly = YES; - _stagingHidden = NO; + self.stagingHidden = NO; self.activePreviewView = self.stagingPreviewView; dispatch_async(_preview_queue, ^{ diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 8794dd16..9db28486 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1238,88 +1238,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -1369,7 +1290,7 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -1824,42 +1833,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - - From 1b785ad0ed6c1a86866a68d2c8a2c2b758000219 Mon Sep 17 00:00:00 2001 From: Zakk Date: Tue, 29 Dec 2015 19:45:36 -0500 Subject: [PATCH 042/156] Animations are only editable in staging view, live view only allows running of existing animations. --- CocoaSplit/CaptureController.m | 53 +--- CocoaSplit/SourceLayout.h | 2 + CocoaSplit/SourceLayout.m | 11 + CocoaSplit/en.lproj/MainMenu.xib | 439 +++++++++---------------------- 4 files changed, 144 insertions(+), 361 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 6f39403b..c20d2491 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -360,12 +360,7 @@ } - if (sender.tag == 1) - { - vc.sourceLayout = self.stagingPreviewView.sourceLayout; - } else { - vc.sourceLayout = self.livePreviewView.sourceLayout; - } + vc.sourceLayout = self.activePreviewView.sourceLayout; [_animatepopOver showRelativeToRect:sender.bounds ofView:sender preferredEdge:NSMinYEdge]; @@ -1452,6 +1447,7 @@ [stagingLayout restoreSourceList:nil]; + [stagingLayout setupMIDI]; self.stagingPreviewView.sourceLayout = stagingLayout; @@ -1522,6 +1518,8 @@ selectedLayout.isActive = YES; [selectedLayout restoreSourceList:nil]; + [selectedLayout setupMIDI]; + [self setupFrameTimer:selectedLayout.frameRate]; self.livePreviewView.sourceLayout = selectedLayout; @@ -2480,14 +2478,13 @@ - (NSArray *)commandIdentifiers { - NSArray *baseIdentifiers = @[@"GoLive", @"StagingRevert", @"LiveRevert", @"InputNext", @"InputPrevious", @"ActivateLive", @"ActivateStaging", @"ActivateToggle"]; + NSArray *baseIdentifiers = @[@"GoLive", @"InputNext", @"InputPrevious", @"ActivateLive", @"ActivateStaging", @"ActivateToggle"]; NSMutableArray *layoutIdentifiers = [NSMutableArray array]; for (SourceLayout *layout in self.sourceLayouts) { - [layoutIdentifiers addObject:[NSString stringWithFormat:@"SwitchStaging:%@", layout.name]]; - [layoutIdentifiers addObject:[NSString stringWithFormat:@"SwitchLive:%@", layout.name]]; + [layoutIdentifiers addObject:[NSString stringWithFormat:@"ToggleLayout:%@", layout.name]]; } baseIdentifiers = [baseIdentifiers arrayByAddingObjectsFromArray:layoutIdentifiers]; @@ -2663,6 +2660,7 @@ __weak CaptureController *weakSelf = self; + if ([_inputIdentifiers containsObject:identifier]) { InputSource *currInput = [self currentMIDIInput:command]; @@ -2684,9 +2682,11 @@ } - if ([identifier hasPrefix:@"SwitchStaging:"]) + if ([identifier hasPrefix:@"ToggleLayout:"]) { - NSString *layoutName = [identifier substringFromIndex:14]; + + + NSString *layoutName = [identifier substringFromIndex:13]; NSUInteger indexOfLayout = [self.sourceLayouts indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { SourceLayout *testLayout = obj; if ([testLayout.name isEqualToString:layoutName]) @@ -2701,32 +2701,7 @@ { SourceLayout *layout = [self.sourceLayouts objectAtIndex:indexOfLayout]; dispatch_async(dispatch_get_main_queue(), ^{ - weakSelf.stagingLayout = layout; - }); - - } - return; - } - - - if ([identifier hasPrefix:@"SwitchLive:"]) - { - NSString *layoutName = [identifier substringFromIndex:11]; - NSUInteger indexOfLayout = [self.sourceLayouts indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { - SourceLayout *testLayout = obj; - if ([testLayout.name isEqualToString:layoutName]) - { - *stop = YES; - return YES; - } - return NO; - }]; - - if (indexOfLayout != NSNotFound) - { - SourceLayout *layout = [self.sourceLayouts objectAtIndex:indexOfLayout]; - dispatch_async(dispatch_get_main_queue(), ^{ - weakSelf.selectedLayout = layout; + [weakSelf toggleLayout:layout]; }); } @@ -2740,10 +2715,6 @@ dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf stagingGoLive:nil]; }); - } else if ([identifier isEqualToString:@"StagingRevert"]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [weakSelf stagingRevert:nil]; - }); } } diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index 9324b9c6..1cbf4d9e 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -115,6 +115,8 @@ -(void)applyAddBlock; -(void)replaceWithSourceLayout:(SourceLayout *)layout; -(void)clearSourceList; +-(void)setupMIDI; + diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index dbba0756..449e062e 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -1314,6 +1314,17 @@ +-(void)setupMIDI +{ + [NSApp registerMIDIResponder:self]; + for (InputSource *src in self.sourceList) + { + [NSApp registerMIDIResponder:src]; + + } +} + + -(void) adjustAllInputs { diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 9db28486..6dc88246 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -993,8 +993,11 @@ - - - + - + @@ -1227,7 +1233,13 @@ + + + + + + @@ -1238,107 +1250,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + - - - - - - - - - - - - + + + + @@ -1913,8 +1712,8 @@ + - @@ -1939,7 +1738,7 @@ - + From 136ec19d331aaf878af2d906e224ebc1a2ccb73d Mon Sep 17 00:00:00 2001 From: Zakk Date: Thu, 31 Dec 2015 08:56:55 -0500 Subject: [PATCH 043/156] Midi bindings for inputs and animations no longer have 'staging' and 'live' bindings. Just one binding and live/staging is controlled via which is selected via the live/staging/toggle midi commands --- CocoaSplit/CSMidiWrapper.h | 1 + CocoaSplit/CSMidiWrapper.m | 47 ++++++++++++------- CocoaSplit/CaptureController.m | 33 +++++++++++++ CocoaSplit/InputSource.m | 18 +------ .../Interface/CSLayoutEditWindowController.m | 6 +++ .../Interface/CSMidiManagerWindowController.h | 2 +- .../Interface/CSMidiManagerWindowController.m | 20 +++++++- .../CSMidiManagerWindowController.xib | 2 +- CocoaSplit/PreviewView.m | 7 +-- CocoaSplit/SourceLayout.m | 9 +--- 10 files changed, 97 insertions(+), 48 deletions(-) diff --git a/CocoaSplit/CSMidiWrapper.h b/CocoaSplit/CSMidiWrapper.h index 789e98dd..61504a6f 100644 --- a/CocoaSplit/CSMidiWrapper.h +++ b/CocoaSplit/CSMidiWrapper.h @@ -17,6 +17,7 @@ @property (strong) MIKMIDIDevice *device; @property (strong) MIKMIDIMapping *deviceMapping; +@property (nonatomic, copy) id(^redirectResponderBlock)(MIKMIDICommand *command, MIKMIDIMappingItem *item); diff --git a/CocoaSplit/CSMidiWrapper.m b/CocoaSplit/CSMidiWrapper.m index 94c3f5d4..bb7b7fde 100644 --- a/CocoaSplit/CSMidiWrapper.m +++ b/CocoaSplit/CSMidiWrapper.m @@ -74,25 +74,40 @@ for (MIKMIDIMappingItem *item in items) { - id responder = [NSApp MIDIResponderWithIdentifier:item.MIDIResponderIdentifier]; - if ([responder respondsToMIDICommand:command]) + + id responder = nil; + + if (self.redirectResponderBlock) { + responder = self.redirectResponderBlock(command, item); + } + + if (!responder) + { + responder = [NSApp MIDIResponderWithIdentifier:item.MIDIResponderIdentifier]; + } - NSString *dynMethod = [NSString stringWithFormat:@"handleMIDICommand%@:", item.commandIdentifier]; - - SEL dynSelector = NSSelectorFromString(dynMethod); - - if ([responder respondsToSelector:dynSelector]) + if (responder) + { + if ([responder respondsToMIDICommand:command]) { - NSMethodSignature *dynsig = [[responder class] instanceMethodSignatureForSelector:dynSelector]; - NSInvocation *dyninvoke = [NSInvocation invocationWithMethodSignature:dynsig]; - dyninvoke.target = responder; - dyninvoke.selector = dynSelector; - [dyninvoke setArgument:&command atIndex:2]; - [dyninvoke retainArguments]; - [dyninvoke invoke]; - } else { - [responder handleMIDICommand:command forIdentifier:item.commandIdentifier]; + + NSString *dynMethod = [NSString stringWithFormat:@"handleMIDICommand%@:", item.commandIdentifier]; + + SEL dynSelector = NSSelectorFromString(dynMethod); + + if ([responder respondsToSelector:dynSelector]) + { + NSMethodSignature *dynsig = [[responder class] instanceMethodSignatureForSelector:dynSelector]; + NSInvocation *dyninvoke = [NSInvocation invocationWithMethodSignature:dynsig]; + dyninvoke.target = responder; + dyninvoke.selector = dynSelector; + [dyninvoke setArgument:&command atIndex:2]; + [dyninvoke retainArguments]; + [dyninvoke invoke]; + } else { + [responder handleMIDICommand:command forIdentifier:item.commandIdentifier]; + } } } } diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index c20d2491..d6543b8e 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2655,6 +2655,35 @@ self.currentMidiInputStagingIdx = cVal; } } + + +-(id)dispatchMIDI:(MIKMIDICommand *)command forItem:(MIKMIDIMappingItem *)item +{ + + id ret = nil; + + SourceLayout *currLayout = [self currentMIDILayout]; + NSString *responderName = item.MIDIResponderIdentifier; + + if ([responderName hasPrefix:@"Layout:"]) + { + ret = currLayout; + } else if ([responderName hasPrefix:@"Input:"]) { + NSString *uuid = [responderName substringFromIndex:6]; + InputSource *input = [currLayout inputForUUID:uuid]; + if (input) + { + ret = input; + } + } + + return ret; +} + + + + + -(void)handleMIDICommand:(MIKMIDICommand *)command forIdentifier:(NSString *)identifier { @@ -2760,6 +2789,10 @@ for (CSMidiWrapper *wrap in self.midiMapGenerators) { + wrap.redirectResponderBlock = ^id(MIKMIDICommand *command, MIKMIDIMappingItem *item) { + return [self dispatchMIDI:command forItem:item]; + }; + self.midiDeviceMappings[wrap.device.name] = wrap; [wrap connect]; diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 06738b51..8dd587ca 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -2187,27 +2187,13 @@ static NSArray *_sourceTypes = nil; -(NSString *)MIDIShortIdentifier { - if (self.is_live) - { - return @"Live"; - } - - return @"Staging"; + return nil; } -(NSString *)MIDIIdentifier { - NSString *liveStr; - if (self.is_live) - { - liveStr = @"Live"; - } else { - liveStr = @"Staging"; - } - - - return [NSString stringWithFormat:@"%@:%@", liveStr, self.uuid]; + return [NSString stringWithFormat:@"Input:%@", self.uuid]; } -(NSArray *)commandIdentifiers diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.m b/CocoaSplit/Interface/CSLayoutEditWindowController.m index 3c84eb2e..efa4e2ee 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.m +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.m @@ -44,6 +44,12 @@ { [self.layoutController discardEditing]; } + + if (self.previewView.sourceLayout) + { + [self.previewView.sourceLayout clearSourceList]; + } + [self close]; } diff --git a/CocoaSplit/Interface/CSMidiManagerWindowController.h b/CocoaSplit/Interface/CSMidiManagerWindowController.h index 85b2a7c7..6c9997cb 100644 --- a/CocoaSplit/Interface/CSMidiManagerWindowController.h +++ b/CocoaSplit/Interface/CSMidiManagerWindowController.h @@ -13,7 +13,7 @@ @class CaptureController; -@interface CSMidiManagerWindowController : NSWindowController +@interface CSMidiManagerWindowController : NSWindowController @property (weak) CaptureController *captureController; diff --git a/CocoaSplit/Interface/CSMidiManagerWindowController.m b/CocoaSplit/Interface/CSMidiManagerWindowController.m index 56f7b24a..1b50e08c 100644 --- a/CocoaSplit/Interface/CSMidiManagerWindowController.m +++ b/CocoaSplit/Interface/CSMidiManagerWindowController.m @@ -18,6 +18,7 @@ - (void)windowDidLoad { [super windowDidLoad]; + self.window.delegate = self; // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. @@ -26,6 +27,13 @@ } +-(void)windowWillClose:(NSNotification *)notification +{ + self.responderList = nil; + self.commandIdentfiers = nil; +} + + -(void)buildIdentifiers { NSMutableArray *identList = [NSMutableArray array]; @@ -58,7 +66,16 @@ [midiMappings unionSet:commandMaps]; } } - [identList addObject:@{@"command":ident, @"responder":responder, @"count":@(midiMappings.count), @"display":[NSString stringWithFormat:@"%@-%@", responderName, ident]}]; + + NSString *displayName; + + if (responderName) + { + displayName = [NSString stringWithFormat:@"%@-%@", responderName, ident]; + } else { + displayName = [NSString stringWithFormat:@"%@", ident]; + } + [identList addObject:@{@"command":ident, @"responder":responder, @"count":@(midiMappings.count), @"display":displayName}]; } } @@ -158,4 +175,5 @@ } + @end diff --git a/CocoaSplit/Interface/CSMidiManagerWindowController.xib b/CocoaSplit/Interface/CSMidiManagerWindowController.xib index 79853e26..d6f5569a 100644 --- a/CocoaSplit/Interface/CSMidiManagerWindowController.xib +++ b/CocoaSplit/Interface/CSMidiManagerWindowController.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index d90e8458..4e4c9f6a 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -195,12 +195,7 @@ if (self.selectedSource) { - InputSource *mapCopy = self.selectedSource.copy; - mapCopy.uuid = self.selectedSource.uuid; - - mapCopy.is_live = !self.selectedSource.is_live; - - [self.controller openMidiLearnerForResponders:@[self.selectedSource, mapCopy]]; + [self.controller openMidiLearnerForResponders:@[self.selectedSource]]; } } diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 449e062e..b513507d 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -68,13 +68,7 @@ -(NSString *)MIDIIdentifier { - NSString *liveStr = @"Staging"; - if (self.isActive) - { - liveStr = @"Live"; - } - - return [NSString stringWithFormat:@"%@Layout:%@", liveStr, self.name]; + return [NSString stringWithFormat:@"Layout:%@", self.name]; } @@ -1372,6 +1366,7 @@ } [self.animationList removeAllObjects]; + [_uuidMap removeAllObjects]; self.selectedAnimation = nil; } From 816c246f50d2cc20b5ba49af50c248b646685194 Mon Sep 17 00:00:00 2001 From: Zakk Date: Thu, 31 Dec 2015 15:11:05 -0500 Subject: [PATCH 044/156] Midi commands now work property when staging view is hidden --- CocoaSplit/CaptureController.m | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index d6543b8e..2b7fb6cf 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2533,6 +2533,13 @@ -(SourceLayout *)currentMIDILayout { + + if (self.stagingHidden) + { + return self.activePreviewView.sourceLayout; + } + + if (self.currentMidiLayoutLive) { return self.livePreviewView.sourceLayout; @@ -2582,19 +2589,29 @@ -(void)handleMIDICommandActivateLive:(MIKMIDICommand *)command { - self.currentMidiLayoutLive = YES; + if (!self.stagingHidden) + { + self.currentMidiLayoutLive = YES; + } } -(void)handleMIDICommandActivateStaging:(MIKMIDICommand *)command { - self.currentMidiLayoutLive = NO; + if (!self.stagingHidden) + { + self.currentMidiLayoutLive = NO; + } } -(void)handleMIDICommandActivateToggle:(MIKMIDICommand *)command { - self.currentMidiLayoutLive = !self.currentMidiLayoutLive; + if (!self.stagingHidden) + { + self.currentMidiLayoutLive = !self.currentMidiLayoutLive; + } } + -(void)handleMIDICommandInputNext:(MIKMIDIChannelVoiceCommand *)command { From 7dc520399e902116df383ea67b49d3b5309e9144 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 3 Jan 2016 23:27:02 -0500 Subject: [PATCH 045/156] Change background color of a layout view if it is the current midi target --- CocoaSplit/CSPreviewGLLayer.h | 2 ++ CocoaSplit/CSPreviewGLLayer.m | 29 +++++++++++++++++++++++++++-- CocoaSplit/CaptureController.m | 19 +++++++++++++++++-- CocoaSplit/PreviewView.h | 2 ++ CocoaSplit/PreviewView.m | 11 +++++++++++ 5 files changed, 59 insertions(+), 4 deletions(-) diff --git a/CocoaSplit/CSPreviewGLLayer.h b/CocoaSplit/CSPreviewGLLayer.h index 795bf57d..981e6531 100644 --- a/CocoaSplit/CSPreviewGLLayer.h +++ b/CocoaSplit/CSPreviewGLLayer.h @@ -20,6 +20,7 @@ NSSize _lastSurfaceSize; bool _resizeDirty; CIContext *_cictx; + bool _resetClearColor; GLint _viewport[4]; @@ -37,6 +38,7 @@ @property (assign) float snap_y; @property (assign) float snap_x; @property (assign) bool doRender; +@property (assign) bool midiActive; -(NSPoint)realPointforWindowPoint:(NSPoint)winPoint; diff --git a/CocoaSplit/CSPreviewGLLayer.m b/CocoaSplit/CSPreviewGLLayer.m index b3c50e8c..2f560eb4 100644 --- a/CocoaSplit/CSPreviewGLLayer.m +++ b/CocoaSplit/CSPreviewGLLayer.m @@ -9,6 +9,7 @@ #import "CSPreviewGLLayer.h" @implementation CSPreviewGLLayer +@synthesize midiActive = _midiActive; -(instancetype)init { @@ -30,6 +31,18 @@ } +-(void)setMidiActive:(bool)midiActive +{ + _midiActive = midiActive; + _resetClearColor = YES; +} + +-(bool)midiActive +{ + return _midiActive; +} + + -(void)drawInCGLContext:(CGLContextObj)ctx pixelFormat:(CGLPixelFormatObj)pf forLayerTime:(CFTimeInterval)t displayTime:(const CVTimeStamp *)ts { @@ -39,10 +52,22 @@ if (!_initDone) { glGenTextures(1, &_renderTexture); - glClearColor(0.184314f, 0.309804f, 0.309804f, 0); - _initDone = YES; } + + if (_resetClearColor) + { + if (self.midiActive) + { + glClearColor(0.309804f, 0.184314f, 0.309804f, 0); + } else { + glClearColor(0.184314f, 0.309804f, 0.309804f, 0); + } + + _resetClearColor = NO; + } + + glClear(GL_COLOR_BUFFER_BIT); if (!self.renderer) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 2b7fb6cf..14cb2d59 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1450,7 +1450,7 @@ [stagingLayout setupMIDI]; self.stagingPreviewView.sourceLayout = stagingLayout; - + self.stagingPreviewView.midiActive = YES; [stagingLayout setAddLayoutBlock:^(SourceLayout *layout) { @@ -1522,6 +1522,7 @@ [self setupFrameTimer:selectedLayout.frameRate]; self.livePreviewView.sourceLayout = selectedLayout; + self.livePreviewView.midiActive = NO; @@ -2592,6 +2593,8 @@ if (!self.stagingHidden) { self.currentMidiLayoutLive = YES; + self.stagingPreviewView.midiActive = NO; + self.livePreviewView.midiActive = YES; } } @@ -2600,6 +2603,8 @@ if (!self.stagingHidden) { self.currentMidiLayoutLive = NO; + self.livePreviewView.midiActive = NO; + self.stagingPreviewView.midiActive = YES; } } @@ -2608,6 +2613,8 @@ if (!self.stagingHidden) { self.currentMidiLayoutLive = !self.currentMidiLayoutLive; + self.stagingPreviewView.midiActive = !self.stagingPreviewView.midiActive; + self.livePreviewView.midiActive = !self.livePreviewView.midiActive; } } @@ -2938,6 +2945,7 @@ [self.canvasSplitView display]; self.livePreviewView.viewOnly = NO; + self.livePreviewView.midiActive = NO; self.activePreviewView = self.livePreviewView; self.stagingHidden = YES; @@ -2977,7 +2985,14 @@ self.livePreviewView.viewOnly = YES; self.stagingHidden = NO; self.activePreviewView = self.stagingPreviewView; - + if (self.currentMidiLayoutLive) + { + self.livePreviewView.midiActive = YES; + self.stagingPreviewView.midiActive = NO; + } else { + self.livePreviewView.midiActive = YES; + self.stagingPreviewView.midiActive = NO; + } dispatch_async(_preview_queue, ^{ [self newStagingFrameTimed]; }); diff --git a/CocoaSplit/PreviewView.h b/CocoaSplit/PreviewView.h index 3b0dbf9b..97f2bf0b 100644 --- a/CocoaSplit/PreviewView.h +++ b/CocoaSplit/PreviewView.h @@ -84,6 +84,8 @@ @property (strong) NSMenu *sourceSettingsMenu; +@property (assign) bool midiActive; + diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 4e4c9f6a..3ba7559c 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -37,6 +37,17 @@ @synthesize selectedSource = _selectedSource; +-(void)setMidiActive:(bool)midiActive +{ + _glLayer.midiActive = midiActive; +} + + +-(bool)midiActive +{ + return _glLayer.midiActive; +} + -(void)cursorUpdate:(NSEvent *)event From e7f1e21b3494aa78d4cdcc4a8ea2e086c12419ed Mon Sep 17 00:00:00 2001 From: Zakk Date: Tue, 2 Feb 2016 09:18:13 -0500 Subject: [PATCH 046/156] Split input source configs into an advanced tab. Layouts are now drag and drop reorder able. Go live button hides when only one preview view is visible --- CocoaSplit.xcodeproj/project.pbxproj | 6 + CocoaSplit/CSLayoutButton.h | 4 + CocoaSplit/CSLayoutButton.m | 26 +- CocoaSplit/CaptureController.h | 3 +- CocoaSplit/CaptureController.m | 113 ++- .../Interface/CSInputLibraryItemView.xib | 4 +- CocoaSplit/Interface/CSLayoutCollectionItem.m | 9 + .../Interface/CSLayoutCollectionItem.xib | 12 +- .../Interface/CSLayoutCollectionItemView.h | 13 + .../Interface/CSLayoutCollectionItemView.m | 15 + .../InputPopupControllerViewController.xib | 877 ++++++++---------- CocoaSplit/TestView.xib | 4 +- CocoaSplit/en.lproj/MainMenu.xib | 84 +- 13 files changed, 656 insertions(+), 514 deletions(-) create mode 100644 CocoaSplit/Interface/CSLayoutCollectionItemView.h create mode 100644 CocoaSplit/Interface/CSLayoutCollectionItemView.m diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 15f43b8b..99d6bab3 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -62,6 +62,7 @@ 344825E61B253D6900AF9EAC /* CAMultiAudioMatrixCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 344825E51B253D6900AF9EAC /* CAMultiAudioMatrixCell.m */; }; 344825E71B253D6900AF9EAC /* CAMultiAudioMatrixCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 344825E51B253D6900AF9EAC /* CAMultiAudioMatrixCell.m */; }; 344988131893CF0500044259 /* LogWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344988121893CF0500044259 /* LogWindow.xib */; }; + 3450239D1C60B3EF00B461B5 /* CSLayoutCollectionItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3450239C1C60B3EF00B461B5 /* CSLayoutCollectionItemView.m */; }; 3451A1C417111BD900DF6A8B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34AE3C2F164E3E020052C95E /* Foundation.framework */; }; 3451A1C717111BD900DF6A8B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3451A1C617111BD900DF6A8B /* main.m */; }; 3451A1D31712C41000DF6A8B /* CaptureController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FE50715F444AA00E4CE4E /* CaptureController.m */; }; @@ -632,6 +633,8 @@ 344825E41B253D6900AF9EAC /* CAMultiAudioMatrixCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CAMultiAudioMatrixCell.h; path = Interface/CAMultiAudioMatrixCell.h; sourceTree = ""; }; 344825E51B253D6900AF9EAC /* CAMultiAudioMatrixCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CAMultiAudioMatrixCell.m; path = Interface/CAMultiAudioMatrixCell.m; sourceTree = ""; }; 344988121893CF0500044259 /* LogWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LogWindow.xib; path = Interface/LogWindow.xib; sourceTree = ""; }; + 3450239B1C60B3EF00B461B5 /* CSLayoutCollectionItemView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSLayoutCollectionItemView.h; path = Interface/CSLayoutCollectionItemView.h; sourceTree = ""; }; + 3450239C1C60B3EF00B461B5 /* CSLayoutCollectionItemView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSLayoutCollectionItemView.m; path = Interface/CSLayoutCollectionItemView.m; sourceTree = ""; }; 3451A1C317111BD900DF6A8B /* CocoaSplitCmd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CocoaSplitCmd; sourceTree = BUILT_PRODUCTS_DIR; }; 3451A1C617111BD900DF6A8B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 3451A1C917111BD900DF6A8B /* CocoaSplitCmd-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CocoaSplitCmd-Prefix.pch"; sourceTree = ""; }; @@ -1252,6 +1255,8 @@ 34348C2919BDBDC000A122C2 /* PluginManagerWindowController.xib */, 349461441AAD73BC00F28883 /* TestView.xib */, 34F52A241BC1CE2700662911 /* CSLayoutCollectionItem.h */, + 3450239B1C60B3EF00B461B5 /* CSLayoutCollectionItemView.h */, + 3450239C1C60B3EF00B461B5 /* CSLayoutCollectionItemView.m */, 34F52A251BC1CE2700662911 /* CSLayoutCollectionItem.m */, 34F52A261BC1CE2700662911 /* CSLayoutCollectionItem.xib */, 34F52A291BC1E0F800662911 /* CSLayoutButton.h */, @@ -2191,6 +2196,7 @@ 34A64A2F165EFE4C00A68428 /* PreviewView.m in Sources */, 34ED8CAB1B07371C002C0674 /* MIKMIDITrack.m in Sources */, 34ED8CA91B07371C002C0674 /* MIKMIDITempoEvent.m in Sources */, + 3450239D1C60B3EF00B461B5 /* CSLayoutCollectionItemView.m in Sources */, 3400A0841BD522A5003E1828 /* CSLibraryInputItemViewController.m in Sources */, 34ED8C631B07371C002C0674 /* MIKMIDIErrors.m in Sources */, 34ED8C551B07371C002C0674 /* MIKMIDIControlChangeCommand.m in Sources */, diff --git a/CocoaSplit/CSLayoutButton.h b/CocoaSplit/CSLayoutButton.h index 1a4d9cdd..44eac089 100644 --- a/CocoaSplit/CSLayoutButton.h +++ b/CocoaSplit/CSLayoutButton.h @@ -12,6 +12,10 @@ @interface CSLayoutButton : NSButton +{ + NSEvent *_savedMouseDown; +} + @property (weak) IBOutlet CSLayoutCollectionItem *viewController; diff --git a/CocoaSplit/CSLayoutButton.m b/CocoaSplit/CSLayoutButton.m index 3a160b3a..f671639c 100644 --- a/CocoaSplit/CSLayoutButton.m +++ b/CocoaSplit/CSLayoutButton.m @@ -18,7 +18,6 @@ - (void)drawRect:(NSRect)dirtyRect { [super drawRect:dirtyRect]; - NSColor *redColor = [NSColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:0.3]; NSColor *greenColor = [NSColor colorWithRed:0.0 green:1.0 blue:0.0 alpha:0.3]; @@ -55,8 +54,33 @@ } +-(void)mouseDown:(NSEvent *)theEvent +{ + [self highlight:YES]; + //[self.nextResponder mouseDown:theEvent];' + _savedMouseDown = theEvent; + + return; +} + +-(void)mouseDragged:(NSEvent *)theEvent +{ + [self highlight:NO]; + [self.nextResponder mouseDown:_savedMouseDown]; + [self.nextResponder mouseDragged:theEvent]; +} + +-(void)mouseUp:(NSEvent *)theEvent +{ + [self performClick:self]; + [self.nextResponder mouseUp:theEvent]; +} + + + -(void)rightMouseDown:(NSEvent *)theEvent { + [self.viewController showLayoutMenu:theEvent]; } diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 4e5187e8..8bd6c10e 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -50,7 +50,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @class PreviewView; -@interface CaptureController : NSObject { +@interface CaptureController : NSObject { NSArray *_inputIdentifiers; @@ -106,6 +106,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , } +@property (weak) IBOutlet NSCollectionView *layoutCollectionView; @property (assign) bool stagingHidden; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 14cb2d59..1c3ee27d 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -260,6 +260,7 @@ newLayout.canvas_height = self.captureHeight; } + [self insertObject:newLayout inSourceLayoutsAtIndex:self.sourceLayouts.count]; @@ -660,7 +661,7 @@ _layoutWindows = [NSMutableArray array]; self.transitionDirections = @[kCATransitionFromTop, kCATransitionFromRight, kCATransitionFromBottom, kCATransitionFromLeft]; - + NSArray *caTransitionNames = @[kCATransitionFade, kCATransitionPush, kCATransitionMoveIn, kCATransitionReveal, @"cube", @"alignedCube", @"flip", @"alignedFlip"]; NSArray *ciTransitionNames = [CIFilter filterNamesInCategory:kCICategoryTransition]; @@ -1253,6 +1254,7 @@ //all color panels allow opacity self.activePreviewView = self.stagingPreviewView; + [self.layoutCollectionView registerForDraggedTypes:@[@"CS_LAYOUT_DRAG"]]; [NSColorPanel sharedColorPanel].showsAlpha = YES; [NSColor setIgnoresAlpha:NO]; @@ -2371,6 +2373,84 @@ +-(NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation +{ + + NSPasteboard *pBoard = [draggingInfo draggingPasteboard]; + NSData *indexSave = [pBoard dataForType:@"CS_LAYOUT_DRAG"]; + NSIndexSet *indexes = [NSKeyedUnarchiver unarchiveObjectWithData:indexSave]; + NSInteger draggedItemIdx = [indexes firstIndex]; + + NSInteger useIdx = *proposedDropIndex; + + if (*proposedDropIndex > draggedItemIdx) + { + useIdx--; + } + + + if (useIdx < 0) + { + useIdx = 0; + } + + + + if (*proposedDropIndex == -1 || labs(draggedItemIdx - useIdx) < 1) + { + return NSDragOperationNone; + } + + return NSDragOperationMove; +} + + +-(BOOL)collectionView:(NSCollectionView *)collectionView writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard +{ + NSData *indexSave = [NSKeyedArchiver archivedDataWithRootObject:indexes]; + [pasteboard declareTypes:@[@"CS_LAYOUT_DRAG"] owner:nil]; + [pasteboard setData:indexSave forType:@"CS_LAYOUT_DRAG"]; + return YES; +} + + +-(BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id)draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation +{ + NSPasteboard *pBoard = [draggingInfo draggingPasteboard]; + NSData *indexSave = [pBoard dataForType:@"CS_LAYOUT_DRAG"]; + NSIndexSet *indexes = [NSKeyedUnarchiver unarchiveObjectWithData:indexSave]; + NSInteger draggedItemIdx = [indexes firstIndex]; + + + [self willChangeValueForKey:@"sourceLayouts"]; + SourceLayout *draggedItem = [self.sourceLayouts objectAtIndex:draggedItemIdx]; + NSInteger useIdx = index; + + if (index > draggedItemIdx) + { + useIdx--; + } + + + if (useIdx < 0) + { + useIdx = 0; + } + + [self.sourceLayouts removeObjectAtIndex:draggedItemIdx]; + [self.sourceLayouts insertObject:draggedItem atIndex:useIdx]; + [self didChangeValueForKey:@"sourceLayouts"]; + + return YES; +} + + +-(BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event +{ + return YES; +} + + -(SourceLayout *)getLayoutForName:(NSString *)name { NSUInteger selectedIdx = [self.sourceLayouts indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { @@ -2488,6 +2568,11 @@ [layoutIdentifiers addObject:[NSString stringWithFormat:@"ToggleLayout:%@", layout.name]]; } + for (SourceLayout *layout in self.sourceLayouts) + { + [layoutIdentifiers addObject:[NSString stringWithFormat:@"SwitchToLayout:%@", layout.name]]; + } + baseIdentifiers = [baseIdentifiers arrayByAddingObjectsFromArray:layoutIdentifiers]; baseIdentifiers = [baseIdentifiers arrayByAddingObjectsFromArray:_inputIdentifiers]; return baseIdentifiers; @@ -2762,6 +2847,32 @@ } + if ([identifier hasPrefix:@"SwitchToLayout:"]) + { + + + NSString *layoutName = [identifier substringFromIndex:15]; + NSUInteger indexOfLayout = [self.sourceLayouts indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { + SourceLayout *testLayout = obj; + if ([testLayout.name isEqualToString:layoutName]) + { + *stop = YES; + return YES; + } + return NO; + }]; + + if (indexOfLayout != NSNotFound) + { + SourceLayout *layout = [self.sourceLayouts objectAtIndex:indexOfLayout]; + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf switchToLayout:layout]; + }); + + } + return; + } + if ([identifier isEqualToString:@"GoLive"]) { diff --git a/CocoaSplit/Interface/CSInputLibraryItemView.xib b/CocoaSplit/Interface/CSInputLibraryItemView.xib index 3632ed2a..97613e72 100644 --- a/CocoaSplit/Interface/CSInputLibraryItemView.xib +++ b/CocoaSplit/Interface/CSInputLibraryItemView.xib @@ -1,8 +1,8 @@ - + - + diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.m b/CocoaSplit/Interface/CSLayoutCollectionItem.m index 9451422e..82263d43 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.m +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.m @@ -42,6 +42,9 @@ - (void)viewDidLoad { [super viewDidLoad]; + + //self.view.layer.backgroundColor = [[NSColor blackColor] CGColor]; + // Do view setup here. } @@ -55,6 +58,11 @@ } } +-(void)mouseDragged:(NSEvent *)theEvent +{ + [self.nextResponder mouseDragged:theEvent]; +} + -(void)saveToLayout:(id) sender { @@ -86,6 +94,7 @@ -(void)buildLayoutMenu { + NSInteger idx = 0; NSMenuItem *tmp; diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.xib b/CocoaSplit/Interface/CSLayoutCollectionItem.xib index f8163a9b..3515ed9a 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.xib +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.xib @@ -1,8 +1,8 @@ - + - + @@ -13,12 +13,12 @@ - - + + - + diff --git a/CocoaSplit/Interface/CSLayoutCollectionItemView.h b/CocoaSplit/Interface/CSLayoutCollectionItemView.h new file mode 100644 index 00000000..215efdcd --- /dev/null +++ b/CocoaSplit/Interface/CSLayoutCollectionItemView.h @@ -0,0 +1,13 @@ +// +// CSLayoutCollectionItemView.h +// CocoaSplit +// +// Created by Zakk on 2/2/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import + +@interface CSLayoutCollectionItemView : NSView + +@end diff --git a/CocoaSplit/Interface/CSLayoutCollectionItemView.m b/CocoaSplit/Interface/CSLayoutCollectionItemView.m new file mode 100644 index 00000000..f2a9fccd --- /dev/null +++ b/CocoaSplit/Interface/CSLayoutCollectionItemView.m @@ -0,0 +1,15 @@ +// +// CSLayoutCollectionItemView.m +// CocoaSplit +// +// Created by Zakk on 2/2/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSLayoutCollectionItemView.h" +#import + +@implementation CSLayoutCollectionItemView + + +@end diff --git a/CocoaSplit/Interface/InputPopupControllerViewController.xib b/CocoaSplit/Interface/InputPopupControllerViewController.xib index 794ee2fa..6b00fc74 100644 --- a/CocoaSplit/Interface/InputPopupControllerViewController.xib +++ b/CocoaSplit/Interface/InputPopupControllerViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -38,7 +38,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -76,7 +76,7 @@ - + @@ -84,9 +84,9 @@ - - + @@ -123,7 +108,7 @@ - + @@ -136,7 +121,7 @@ - + @@ -144,7 +129,7 @@ - + @@ -153,7 +138,7 @@ - + @@ -166,7 +151,7 @@ - + @@ -174,7 +159,7 @@ - + @@ -183,7 +168,7 @@ - + @@ -196,260 +181,15 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -458,7 +198,7 @@ - + @@ -466,7 +206,7 @@ - + @@ -475,7 +215,7 @@ - + @@ -487,7 +227,7 @@ - + @@ -496,7 +236,7 @@ - + @@ -507,68 +247,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -577,7 +257,7 @@ - + @@ -585,7 +265,7 @@ - - + + - - - - - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - + - + - - + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -873,6 +541,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/TestView.xib b/CocoaSplit/TestView.xib index 9c06f1e0..5651be1d 100644 --- a/CocoaSplit/TestView.xib +++ b/CocoaSplit/TestView.xib @@ -1,8 +1,8 @@ - + - + diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 6dc88246..e09338d1 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -26,6 +26,7 @@ + @@ -636,6 +637,12 @@ + + + NSNegateBoolean + + + @@ -644,13 +651,14 @@ - + - + + @@ -993,11 +1001,8 @@ - - - + - + @@ -1233,13 +1238,7 @@ - - - - - - @@ -1250,10 +1249,10 @@ - + - - - + @@ -1294,7 +1293,7 @@ - - + - + - + @@ -1475,7 +1474,7 @@ @@ -1485,14 +1484,14 @@ - + - - + + - + @@ -1527,17 +1526,36 @@ - + + + + + + + + + + + + + + + + + + + + @@ -1550,7 +1568,7 @@ - + @@ -1640,10 +1658,14 @@ + + + + From de719439c5a0f151dc9f0ddad24d6970eba28c87 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 15 Feb 2016 17:29:12 -0500 Subject: [PATCH 047/156] Audio channel mixer window now has proper title set Added audio level preview/display to each audio source --- .../CAMultiAudio/CAMultiAudioDownmixer.m | 7 ++-- CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m | 7 ++-- CocoaSplit/CAMultiAudio/CAMultiAudioNode.m | 8 ++++- CocoaSplit/CAMultiAudioMatrixView.xib | 8 +++-- .../CSAnimationChooserViewController.xib | 4 +-- ...AMultiAudioMatrixMixerWindowController.xib | 4 +-- .../CSFilterChooserWindowController.xib | 4 +-- .../Interface/CSLayoutCollectionItem.xib | 2 +- .../CSMidiManagerWindowController.xib | 2 +- .../Interface/CompressionSettingsPanel.xib | 8 ++--- .../InputPopupControllerViewController.xib | 2 +- CocoaSplit/Interface/advancedPrefPanel.xib | 33 +++++++------------ CocoaSplit/SourceLayout.h | 3 +- CocoaSplit/en.lproj/MainMenu.xib | 22 +++++++++---- 14 files changed, 61 insertions(+), 53 deletions(-) diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioDownmixer.m b/CocoaSplit/CAMultiAudio/CAMultiAudioDownmixer.m index 872d09d2..f30ac968 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioDownmixer.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioDownmixer.m @@ -56,7 +56,8 @@ { UInt32 enableVal = 1; OSStatus err; - err = AudioUnitSetProperty(self.audioUnit, kAudioUnitProperty_MeteringMode, kAudioUnitScope_Input, bus, &enableVal, sizeof(enableVal)); + //err = AudioUnitSetProperty(self.audioUnit, kAudioUnitProperty_MeteringMode, kAudioUnitScope_Input, bus, &enableVal, sizeof(enableVal)); + err = AudioUnitSetProperty(self.audioUnit, kAudioUnitProperty_MeteringMode, kAudioUnitScope_Output, 0, &enableVal, sizeof(enableVal)); if (err) { @@ -71,7 +72,9 @@ Float32 result = 0; OSStatus err; - err = AudioUnitGetParameter(self.audioUnit, kStereoMixerParam_PostAveragePower, kAudioUnitScope_Input, bus, &result); + + //err = AudioUnitGetParameter(self.audioUnit, kStereoMixerParam_PostAveragePower, kAudioUnitScope_Input, bus, &result); + err = AudioUnitGetParameter(self.audioUnit, kStereoMixerParam_PostAveragePower, kAudioUnitScope_Output, 0, &result); if (err) diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m index 832bcab4..1742b4ea 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m @@ -150,11 +150,12 @@ OSStatus encoderRenderCallback( void *inRefCon, AudioUnitRenderActionFlags *ioAc -(void)updateStatistics { - /* for(CAMultiAudioNode *node in self.audioInputs) { - [node updatePowerlevel]; - }*/ + dispatch_async(dispatch_get_main_queue(), ^{ + [node updatePowerlevel]; + }); + } } diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioNode.m b/CocoaSplit/CAMultiAudio/CAMultiAudioNode.m index c99afe32..3ce5e740 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioNode.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioNode.m @@ -138,7 +138,10 @@ if ([self.connectedTo.class conformsToProtocol:@protocol(CAMultiAudioMixingProtocol)]) { idmixerNode = (id)self.connectedTo; - self.powerLevel = [mixerNode powerForInputBus:self.connectedToBus]; + float rawPower = [mixerNode powerForInputBus:self.connectedToBus]; + + self.powerLevel = pow(10.0f, 0.05f * rawPower) * 10.0f; + } } @@ -164,8 +167,11 @@ { self.mixerWindow = [[CAMultiAudioMatrixMixerWindowController alloc] initWithAudioMixer:self.downMixer]; [self.mixerWindow showWindow:nil]; + self.mixerWindow.window.title = self.name; } } + + -(void)nodeConnected:(CAMultiAudioNode *)toNode onBus:(UInt32)onBus { self.connectedTo = toNode; diff --git a/CocoaSplit/CAMultiAudioMatrixView.xib b/CocoaSplit/CAMultiAudioMatrixView.xib index 34ce3684..91e83f2f 100644 --- a/CocoaSplit/CAMultiAudioMatrixView.xib +++ b/CocoaSplit/CAMultiAudioMatrixView.xib @@ -1,19 +1,20 @@ - + - + - + + @@ -24,6 +25,7 @@ + diff --git a/CocoaSplit/CSAnimationChooserViewController.xib b/CocoaSplit/CSAnimationChooserViewController.xib index e174bd53..115447b9 100644 --- a/CocoaSplit/CSAnimationChooserViewController.xib +++ b/CocoaSplit/CSAnimationChooserViewController.xib @@ -1,8 +1,8 @@ - + - + diff --git a/CocoaSplit/Interface/CAMultiAudioMatrixMixerWindowController.xib b/CocoaSplit/Interface/CAMultiAudioMatrixMixerWindowController.xib index 6947b861..ac0afea1 100644 --- a/CocoaSplit/Interface/CAMultiAudioMatrixMixerWindowController.xib +++ b/CocoaSplit/Interface/CAMultiAudioMatrixMixerWindowController.xib @@ -1,8 +1,8 @@ - + - + diff --git a/CocoaSplit/Interface/CSFilterChooserWindowController.xib b/CocoaSplit/Interface/CSFilterChooserWindowController.xib index 9c9ecbbf..f67fcdb2 100644 --- a/CocoaSplit/Interface/CSFilterChooserWindowController.xib +++ b/CocoaSplit/Interface/CSFilterChooserWindowController.xib @@ -1,8 +1,8 @@ - + - + diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.xib b/CocoaSplit/Interface/CSLayoutCollectionItem.xib index 3515ed9a..7aa0e5ab 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.xib +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/Interface/CSMidiManagerWindowController.xib b/CocoaSplit/Interface/CSMidiManagerWindowController.xib index d6f5569a..ef410c22 100644 --- a/CocoaSplit/Interface/CSMidiManagerWindowController.xib +++ b/CocoaSplit/Interface/CSMidiManagerWindowController.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/Interface/CompressionSettingsPanel.xib b/CocoaSplit/Interface/CompressionSettingsPanel.xib index e1748fa5..a52ee236 100644 --- a/CocoaSplit/Interface/CompressionSettingsPanel.xib +++ b/CocoaSplit/Interface/CompressionSettingsPanel.xib @@ -1,5 +1,5 @@ - + @@ -191,14 +191,14 @@ Gw - - + + - + diff --git a/CocoaSplit/Interface/InputPopupControllerViewController.xib b/CocoaSplit/Interface/InputPopupControllerViewController.xib index 6b00fc74..59beed2b 100644 --- a/CocoaSplit/Interface/InputPopupControllerViewController.xib +++ b/CocoaSplit/Interface/InputPopupControllerViewController.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/Interface/advancedPrefPanel.xib b/CocoaSplit/Interface/advancedPrefPanel.xib index 7397f998..a230de58 100644 --- a/CocoaSplit/Interface/advancedPrefPanel.xib +++ b/CocoaSplit/Interface/advancedPrefPanel.xib @@ -1,8 +1,8 @@ - + - + @@ -91,19 +91,8 @@ DQ - - + @@ -112,7 +101,7 @@ DQ - + @@ -121,7 +110,7 @@ DQ - + @@ -133,7 +122,7 @@ DQ - + @@ -145,7 +134,7 @@ DQ - + @@ -154,7 +143,7 @@ DQ - + @@ -166,7 +155,7 @@ DQ - + @@ -186,7 +175,7 @@ DQ - + diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index 1cbf4d9e..cf9264e6 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -21,8 +21,6 @@ NSSortDescriptor *_sourceDepthSorter; NSSortDescriptor *_sourceUUIDSorter; - CVPixelBufferPoolRef _cvpool; - CVPixelBufferRef _currentPB; NSSize _rootSize; GLuint _fboTexture; GLuint _rFbo; @@ -35,6 +33,7 @@ } + @property (assign) bool doSaveSourceList; @property (assign) bool inTransition; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index e09338d1..bae463e0 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1,5 +1,5 @@ - + @@ -637,12 +637,12 @@ + NSNegateBoolean - @@ -1315,7 +1315,7 @@ - + @@ -1491,7 +1491,7 @@ - + @@ -1836,7 +1836,7 @@ - + @@ -1873,8 +1873,16 @@ MgA3AEEARwBQAFcAXABkAHkAewB9AH8AgQCLAJAAlQCgAKMApQCnAKkArgC5AMIAygDNANYA2wDoAOwA + + + + + + + + - + From 7230843334d1911be6afbb2aa93619d69006940b Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 21 Feb 2016 13:05:44 -0500 Subject: [PATCH 048/156] Added swapping between staging and live --- CocoaSplit/CaptureController.h | 1 + CocoaSplit/CaptureController.m | 55 ++++++++++++++++++++++++-------- CocoaSplit/SourceLayout.m | 3 ++ CocoaSplit/en.lproj/MainMenu.xib | 12 +++++++ 4 files changed, 57 insertions(+), 14 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 8bd6c10e..c62dd57c 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -198,6 +198,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , - (IBAction)openMidiManager:(id)sender; +-(IBAction) swapStagingAndLive:(id)sender; - (IBAction)stagingGoLive:(id)sender; - (IBAction)stagingSave:(id)sender; - (IBAction)stagingRevert:(id)sender; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 1c3ee27d..2f94ad41 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2480,13 +2480,7 @@ -(void)toggleLayout:(SourceLayout *)layout { SourceLayout *activeLayout = self.activePreviewView.sourceLayout; - [self.objectController commitEditing]; - - activeLayout.transitionName = self.transitionName; - activeLayout.transitionDirection = self.transitionDirection; - activeLayout.transitionDuration = self.transitionDuration; - activeLayout.transitionFilter = self.transitionFilter; - activeLayout.transitionFullScene = self.transitionFullScene; + [self applyTransitionSettings:activeLayout]; if ([activeLayout containsLayout:layout]) { @@ -2984,16 +2978,49 @@ [self.pluginManagerController showWindow:nil]; } + + +-(void)applyTransitionSettings:(SourceLayout *)layout +{ + [self.objectController commitEditing]; + layout.transitionName = self.transitionName; + layout.transitionDirection = self.transitionDirection; + layout.transitionDuration = self.transitionDuration; + layout.transitionFilter = self.transitionFilter; + layout.transitionFullScene = self.transitionFullScene; +} + +-(void)clearTransitionSettings:(SourceLayout *)layout +{ + layout.transitionName = nil; + layout.transitionDirection = nil; + layout.transitionDuration = 0; + layout.transitionFilter = nil; + layout.transitionFullScene = nil; + +} +-(IBAction) swapStagingAndLive:(id)sender +{ + + //Save the current live layout to a temporary layout, do a normal staging->live and then restore old live into current staging + + [self.livePreviewView.sourceLayout saveSourceList]; + + SourceLayout *tmpLive = [self.livePreviewView.sourceLayout copy]; + + [self stagingGoLive:self]; + + [self applyTransitionSettings:self.activePreviewView.sourceLayout]; + [self switchToLayout:tmpLive]; + [self clearTransitionSettings:self.activePreviewView.sourceLayout]; +} + + + - (IBAction)stagingGoLive:(id)sender { - [self.objectController commitEditing]; - - self.livePreviewView.sourceLayout.transitionName = self.transitionName; - self.livePreviewView.sourceLayout.transitionDirection = self.transitionDirection; - self.livePreviewView.sourceLayout.transitionDuration = self.transitionDuration; - self.livePreviewView.sourceLayout.transitionFilter = self.transitionFilter; - self.livePreviewView.sourceLayout.transitionFullScene = self.transitionFullScene; + [self applyTransitionSettings:self.livePreviewView.sourceLayout]; if (self.stagingLayout) { diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index b513507d..e841ce4b 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -292,6 +292,7 @@ newLayout.canvas_width = self.canvas_width; newLayout.frameRate = self.frameRate; newLayout.isActive = NO; + newLayout.containedLayouts = self.containedLayouts.copy; return newLayout; } @@ -595,6 +596,7 @@ [self mergeSourceListData:layout.savedSourceListData onlyAdd:YES]; + if (self.transitionFullScene) { if (rTrans) @@ -914,6 +916,7 @@ NSArray *mergeList; NSArray *mergeAnimationList = nil; + if ([mergeObj isKindOfClass:[NSDictionary class]]) { mergeList = [((NSDictionary *)mergeObj) objectForKey:@"sourcelist"]; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index bae463e0..de8f79b2 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -680,6 +680,18 @@ + From 84fc2cce8113a9f293175e4d8923aa389b210e1e Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 21 Feb 2016 13:13:38 -0500 Subject: [PATCH 049/156] Made layout buttons more space efficient (no huge margins) --- CocoaSplit/Interface/CSLayoutCollectionItem.xib | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.xib b/CocoaSplit/Interface/CSLayoutCollectionItem.xib index 7aa0e5ab..1d708cb8 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.xib +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.xib @@ -14,11 +14,11 @@ - + - + From 4952335ece40134d7c1b5e8defc01a93293f764b Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 21 Feb 2016 22:13:58 -0500 Subject: [PATCH 050/156] Update to latest Sparkle framework Outputs now always query the underlying stream service plugin for the destination string. Output format is now determined by asking the stream service what format to use. Format can be forced via the stream service config dialog. --- CocoaSplit.xcodeproj/project.pbxproj | 14 ++- CocoaSplit/CocoaSplit-Info.plist | 4 +- .../Interface/CSNewOutputWindowController.m | 3 - .../Interface/CSNewOutputWindowController.xib | 25 ++++- CocoaSplit/OutputDestination.h | 5 +- CocoaSplit/OutputDestination.m | 63 ++++++----- .../PluginHeaders/CSStreamServiceProtocol.h | 1 + .../Versions/A/Headers/SUAppcast.h | 14 +-- .../Versions/A/Headers/SUAppcastItem.h | 6 +- .../A/Headers/SUStandardVersionComparator.h | 5 +- .../Versions/A/Headers/SUUpdater.h | 82 +++++++++----- .../A/Headers/SUVersionComparisonProtocol.h | 1 + .../A/Headers/SUVersionDisplayProtocol.h | 2 +- .../Versions/A/Headers/Sparkle.h | 15 ++- .../Autoupdate.app/Contents/Info.plist | 20 ++-- .../Autoupdate.app/Contents/MacOS/Autoupdate | Bin 113368 -> 166964 bytes .../Contents/Resources/AppIcon.icns | Bin 163740 -> 155776 bytes .../Contents/Resources/SUStatus.nib | Bin 6583 -> 6572 bytes .../Resources/ar.lproj/Sparkle.strings | Bin 7338 -> 8076 bytes .../Resources/cs.lproj/Sparkle.strings | Bin 6692 -> 7430 bytes .../Resources/da.lproj/Sparkle.strings | Bin 7258 -> 7996 bytes .../Resources/de.lproj/Sparkle.strings | Bin 7298 -> 8046 bytes .../Resources/el.lproj/Sparkle.strings | Bin 6600 -> 7338 bytes .../Resources/en.lproj/Sparkle.strings | Bin 8372 -> 9108 bytes .../Resources/es.lproj/Sparkle.strings | Bin 7008 -> 7746 bytes .../Resources/fr.lproj/Sparkle.strings | Bin 7450 -> 8188 bytes .../Resources/is.lproj/Sparkle.strings | Bin 4744 -> 5478 bytes .../Resources/it.lproj/Sparkle.strings | Bin 7188 -> 7926 bytes .../Resources/ja.lproj/Sparkle.strings | Bin 7146 -> 7884 bytes .../Resources/ko.lproj/Sparkle.strings | Bin 5136 -> 5874 bytes .../Resources/nb.lproj/Sparkle.strings | Bin 8266 -> 9004 bytes .../Resources/nl.lproj/Sparkle.strings | Bin 7816 -> 8554 bytes .../Resources/pl.lproj/Sparkle.strings | Bin 7582 -> 8142 bytes .../Resources/pt_BR.lproj/Sparkle.strings | Bin 6380 -> 7160 bytes .../Resources/pt_PT.lproj/Sparkle.strings | Bin 6702 -> 7440 bytes .../Resources/ro.lproj/Sparkle.strings | Bin 8680 -> 9418 bytes .../Resources/ru.lproj/Sparkle.strings | Bin 6714 -> 7452 bytes .../Resources/sk.lproj/Sparkle.strings | Bin 6532 -> 7174 bytes .../Resources/sl.lproj/Sparkle.strings | Bin 6830 -> 7568 bytes .../Resources/sv.lproj/Sparkle.strings | Bin 6652 -> 7412 bytes .../Resources/th.lproj/Sparkle.strings | Bin 7386 -> 8124 bytes .../Resources/tr.lproj/Sparkle.strings | Bin 8442 -> 9252 bytes .../Resources/uk.lproj/Sparkle.strings | Bin 6696 -> 7472 bytes .../Resources/zh_CN.lproj/Sparkle.strings | Bin 4948 -> 5500 bytes .../Resources/zh_TW.lproj/Sparkle.strings | Bin 4694 -> 5416 bytes .../Versions/A/Resources/Info.plist | 22 ++-- .../A/Resources/SUModelTranslation.plist | 106 ++++++++++++++++-- .../Versions/A/Resources/SUStatus.nib | Bin 6583 -> 6572 bytes .../ar.lproj/SUAutomaticUpdateAlert.nib | Bin 7166 -> 7184 bytes .../A/Resources/ar.lproj/SUUpdateAlert.nib | Bin 15510 -> 16687 bytes .../ar.lproj/SUUpdatePermissionPrompt.nib | Bin 13018 -> 12785 bytes .../A/Resources/ar.lproj/Sparkle.strings | Bin 7338 -> 8076 bytes .../cs.lproj/SUAutomaticUpdateAlert.nib | Bin 7159 -> 7175 bytes .../A/Resources/cs.lproj/SUUpdateAlert.nib | Bin 15542 -> 16718 bytes .../cs.lproj/SUUpdatePermissionPrompt.nib | Bin 13135 -> 12915 bytes .../A/Resources/cs.lproj/Sparkle.strings | Bin 6692 -> 7430 bytes .../da.lproj/SUAutomaticUpdateAlert.nib | Bin 7066 -> 7081 bytes .../A/Resources/da.lproj/SUUpdateAlert.nib | Bin 15415 -> 16591 bytes .../da.lproj/SUUpdatePermissionPrompt.nib | Bin 12892 -> 12672 bytes .../A/Resources/da.lproj/Sparkle.strings | Bin 7258 -> 7996 bytes .../de.lproj/SUAutomaticUpdateAlert.nib | Bin 7104 -> 7120 bytes .../A/Resources/de.lproj/SUUpdateAlert.nib | Bin 15480 -> 16656 bytes .../de.lproj/SUUpdatePermissionPrompt.nib | Bin 13050 -> 12834 bytes .../A/Resources/de.lproj/Sparkle.strings | Bin 7298 -> 8046 bytes .../el.lproj/SUAutomaticUpdateAlert.nib | Bin 7207 -> 7224 bytes .../A/Resources/el.lproj/SUUpdateAlert.nib | Bin 15549 -> 16728 bytes .../el.lproj/SUUpdatePermissionPrompt.nib | Bin 13145 -> 12915 bytes .../A/Resources/el.lproj/Sparkle.strings | Bin 6600 -> 7338 bytes .../en.lproj/SUAutomaticUpdateAlert.nib | Bin 7124 -> 7078 bytes .../A/Resources/en.lproj/SUUpdateAlert.nib | Bin 16060 -> 16580 bytes .../en.lproj/SUUpdatePermissionPrompt.nib | Bin 12823 -> 12614 bytes .../A/Resources/en.lproj/Sparkle.strings | Bin 8372 -> 9108 bytes .../es.lproj/SUAutomaticUpdateAlert.nib | Bin 7119 -> 7134 bytes .../A/Resources/es.lproj/SUUpdateAlert.nib | Bin 15586 -> 16762 bytes .../es.lproj/SUUpdatePermissionPrompt.nib | Bin 13223 -> 13007 bytes .../A/Resources/es.lproj/Sparkle.strings | Bin 7008 -> 7746 bytes .../fr.lproj/SUAutomaticUpdateAlert.nib | Bin 7143 -> 7137 bytes .../A/Resources/fr.lproj/SUUpdateAlert.nib | Bin 15530 -> 16684 bytes .../fr.lproj/SUUpdatePermissionPrompt.nib | Bin 13209 -> 12993 bytes .../A/Resources/fr.lproj/Sparkle.strings | Bin 7450 -> 8188 bytes .../is.lproj/SUAutomaticUpdateAlert.nib | Bin 7133 -> 7148 bytes .../A/Resources/is.lproj/SUUpdateAlert.nib | Bin 15521 -> 16697 bytes .../is.lproj/SUUpdatePermissionPrompt.nib | Bin 13133 -> 12913 bytes .../A/Resources/is.lproj/Sparkle.strings | Bin 4744 -> 5478 bytes .../it.lproj/SUAutomaticUpdateAlert.nib | Bin 7069 -> 7084 bytes .../A/Resources/it.lproj/SUUpdateAlert.nib | Bin 15446 -> 16622 bytes .../it.lproj/SUUpdatePermissionPrompt.nib | Bin 13067 -> 12850 bytes .../A/Resources/it.lproj/Sparkle.strings | Bin 7188 -> 7926 bytes .../ja.lproj/SUAutomaticUpdateAlert.nib | Bin 7166 -> 7088 bytes .../A/Resources/ja.lproj/SUUpdateAlert.nib | Bin 15425 -> 16602 bytes .../ja.lproj/SUUpdatePermissionPrompt.nib | Bin 12857 -> 12571 bytes .../A/Resources/ja.lproj/Sparkle.strings | Bin 7146 -> 7884 bytes .../ko.lproj/SUAutomaticUpdateAlert.nib | Bin 7039 -> 7056 bytes .../A/Resources/ko.lproj/SUUpdateAlert.nib | Bin 15380 -> 16556 bytes .../ko.lproj/SUUpdatePermissionPrompt.nib | Bin 12770 -> 12550 bytes .../A/Resources/ko.lproj/Sparkle.strings | Bin 5136 -> 5874 bytes .../nb.lproj/SUAutomaticUpdateAlert.nib | Bin 7085 -> 7100 bytes .../A/Resources/nb.lproj/SUUpdateAlert.nib | Bin 15375 -> 16551 bytes .../nb.lproj/SUUpdatePermissionPrompt.nib | Bin 13026 -> 12806 bytes .../A/Resources/nb.lproj/Sparkle.strings | Bin 8266 -> 9004 bytes .../nl.lproj/SUAutomaticUpdateAlert.nib | Bin 7074 -> 7089 bytes .../A/Resources/nl.lproj/SUUpdateAlert.nib | Bin 15426 -> 16602 bytes .../nl.lproj/SUUpdatePermissionPrompt.nib | Bin 12868 -> 12648 bytes .../A/Resources/nl.lproj/Sparkle.strings | Bin 7816 -> 8554 bytes .../pl.lproj/SUAutomaticUpdateAlert.nib | Bin 7159 -> 7175 bytes .../A/Resources/pl.lproj/SUUpdateAlert.nib | Bin 15525 -> 16701 bytes .../pl.lproj/SUUpdatePermissionPrompt.nib | Bin 12917 -> 12697 bytes .../A/Resources/pl.lproj/Sparkle.strings | Bin 7582 -> 8142 bytes .../pt_BR.lproj/SUAutomaticUpdateAlert.nib | Bin 7126 -> 7152 bytes .../A/Resources/pt_BR.lproj/SUUpdateAlert.nib | Bin 15552 -> 16742 bytes .../pt_BR.lproj/SUUpdatePermissionPrompt.nib | Bin 13154 -> 12925 bytes .../A/Resources/pt_BR.lproj/Sparkle.strings | Bin 6380 -> 7160 bytes .../pt_PT.lproj/SUAutomaticUpdateAlert.nib | Bin 7142 -> 7158 bytes .../A/Resources/pt_PT.lproj/SUUpdateAlert.nib | Bin 15586 -> 16762 bytes .../pt_PT.lproj/SUUpdatePermissionPrompt.nib | Bin 13181 -> 12965 bytes .../A/Resources/pt_PT.lproj/Sparkle.strings | Bin 6702 -> 7440 bytes .../ro.lproj/SUAutomaticUpdateAlert.nib | Bin 7170 -> 7186 bytes .../A/Resources/ro.lproj/SUUpdateAlert.nib | Bin 15570 -> 16746 bytes .../ro.lproj/SUUpdatePermissionPrompt.nib | Bin 12902 -> 12683 bytes .../A/Resources/ro.lproj/Sparkle.strings | Bin 8680 -> 9418 bytes .../ru.lproj/SUAutomaticUpdateAlert.nib | Bin 7210 -> 7226 bytes .../A/Resources/ru.lproj/SUUpdateAlert.nib | Bin 15620 -> 16797 bytes .../ru.lproj/SUUpdatePermissionPrompt.nib | Bin 13215 -> 12999 bytes .../A/Resources/ru.lproj/Sparkle.strings | Bin 6714 -> 7452 bytes .../sk.lproj/SUAutomaticUpdateAlert.nib | Bin 7188 -> 7204 bytes .../A/Resources/sk.lproj/SUUpdateAlert.nib | Bin 15572 -> 16748 bytes .../sk.lproj/SUUpdatePermissionPrompt.nib | Bin 13131 -> 12911 bytes .../A/Resources/sk.lproj/Sparkle.strings | Bin 6532 -> 7174 bytes .../sl.lproj/SUAutomaticUpdateAlert.nib | Bin 7098 -> 7114 bytes .../A/Resources/sl.lproj/SUUpdateAlert.nib | Bin 15484 -> 16660 bytes .../sl.lproj/SUUpdatePermissionPrompt.nib | Bin 13046 -> 12830 bytes .../A/Resources/sl.lproj/Sparkle.strings | Bin 6830 -> 7568 bytes .../sv.lproj/SUAutomaticUpdateAlert.nib | Bin 7089 -> 7163 bytes .../A/Resources/sv.lproj/SUUpdateAlert.nib | Bin 15478 -> 16723 bytes .../sv.lproj/SUUpdatePermissionPrompt.nib | Bin 13078 -> 12826 bytes .../A/Resources/sv.lproj/Sparkle.strings | Bin 6652 -> 7412 bytes .../th.lproj/SUAutomaticUpdateAlert.nib | Bin 7135 -> 7150 bytes .../A/Resources/th.lproj/SUUpdateAlert.nib | Bin 15489 -> 16665 bytes .../th.lproj/SUUpdatePermissionPrompt.nib | Bin 12939 -> 12745 bytes .../A/Resources/th.lproj/Sparkle.strings | Bin 7386 -> 8124 bytes .../tr.lproj/SUAutomaticUpdateAlert.nib | Bin 7174 -> 7188 bytes .../A/Resources/tr.lproj/SUUpdateAlert.nib | Bin 15492 -> 16670 bytes .../tr.lproj/SUUpdatePermissionPrompt.nib | Bin 13026 -> 12870 bytes .../A/Resources/tr.lproj/Sparkle.strings | Bin 8442 -> 9252 bytes .../uk.lproj/SUAutomaticUpdateAlert.nib | Bin 7228 -> 7244 bytes .../A/Resources/uk.lproj/SUUpdateAlert.nib | Bin 15640 -> 16817 bytes .../uk.lproj/SUUpdatePermissionPrompt.nib | Bin 13125 -> 12908 bytes .../A/Resources/uk.lproj/Sparkle.strings | Bin 6696 -> 7472 bytes .../zh_CN.lproj/SUAutomaticUpdateAlert.nib | Bin 7067 -> 7022 bytes .../A/Resources/zh_CN.lproj/SUUpdateAlert.nib | Bin 15337 -> 16513 bytes .../zh_CN.lproj/SUUpdatePermissionPrompt.nib | Bin 12685 -> 12469 bytes .../A/Resources/zh_CN.lproj/Sparkle.strings | Bin 4948 -> 5500 bytes .../zh_TW.lproj/SUAutomaticUpdateAlert.nib | Bin 7011 -> 7028 bytes .../A/Resources/zh_TW.lproj/SUUpdateAlert.nib | Bin 15341 -> 16517 bytes .../zh_TW.lproj/SUUpdatePermissionPrompt.nib | Bin 12684 -> 12479 bytes .../A/Resources/zh_TW.lproj/Sparkle.strings | Bin 4694 -> 5416 bytes Sparkle.framework/Versions/A/Sparkle | Bin 398500 -> 466940 bytes .../FileStreamService.m | 6 + .../HitboxStreamService.m | 7 ++ .../TwitchStreamService.m | 5 + 160 files changed, 291 insertions(+), 115 deletions(-) diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 99d6bab3..ae2b91e4 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -28,6 +28,8 @@ 340FE4E115F3581200E4CE4E /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340FE4E015F3581200E4CE4E /* QTKit.framework */; }; 340FE50815F444AA00E4CE4E /* CaptureController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FE50715F444AA00E4CE4E /* CaptureController.m */; }; 3415CED31AE257DA002F11F5 /* CSTextCaptureBaseView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3415CED21AE257DA002F11F5 /* CSTextCaptureBaseView.xib */; }; + 341A2D5C1C7AB04700FF7566 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 341A2D5B1C7AB04700FF7566 /* Sparkle.framework */; }; + 341A2D5D1C7AB0D100FF7566 /* Sparkle.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = 341A2D5B1C7AB04700FF7566 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 34210B3E1606001200362FC8 /* OutputDestination.m in Sources */ = {isa = PBXBuildFile; fileRef = 34210B3D1606001100362FC8 /* OutputDestination.m */; }; 34213E1A196680880054E238 /* CompressorBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 34213E19196680880054E238 /* CompressorBase.m */; }; 34213E1B196680880054E238 /* CompressorBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 34213E19196680880054E238 /* CompressorBase.m */; }; @@ -121,8 +123,6 @@ 3463F99F1AD1594300F3B5C8 /* movement.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3463F99D1AD0DC7100F3B5C8 /* movement.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 346CF44C1A5C10C2008E5BFF /* CSInputLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */; }; 346CF44D1A5C10C2008E5BFF /* CSInputLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */; }; - 3470F41419C84989000A81C4 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3470F41319C84989000A81C4 /* Sparkle.framework */; settings = {ATTRIBUTES = (Required, ); }; }; - 3470F41619C849E7000A81C4 /* Sparkle.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = 3470F41319C84989000A81C4 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 347277FD1A5A2758008801A9 /* CSIOSurfaceLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 347277FC1A5A2758008801A9 /* CSIOSurfaceLayer.m */; }; 347277FE1A5A2758008801A9 /* CSIOSurfaceLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 347277FC1A5A2758008801A9 /* CSIOSurfaceLayer.m */; }; 34792AF616104AA70065A859 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34792AF516104AA70065A859 /* IOKit.framework */; }; @@ -525,7 +525,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 3470F41619C849E7000A81C4 /* Sparkle.framework in Copy Files */, + 341A2D5D1C7AB0D100FF7566 /* Sparkle.framework in Copy Files */, ); name = "Copy Files"; runOnlyForDeploymentPostprocessing = 0; @@ -597,6 +597,7 @@ 340FE50615F444AA00E4CE4E /* CaptureController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CaptureController.h; sourceTree = ""; }; 340FE50715F444AA00E4CE4E /* CaptureController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CaptureController.m; sourceTree = ""; }; 3415CED21AE257DA002F11F5 /* CSTextCaptureBaseView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSTextCaptureBaseView.xib; path = Interface/CSTextCaptureBaseView.xib; sourceTree = ""; }; + 341A2D5B1C7AB04700FF7566 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; 34210B3C1606001100362FC8 /* OutputDestination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OutputDestination.h; sourceTree = ""; }; 34210B3D1606001100362FC8 /* OutputDestination.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OutputDestination.m; sourceTree = ""; }; 34213E18196680880054E238 /* CompressorBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CompressorBase.h; path = Compressor/CompressorBase.h; sourceTree = ""; }; @@ -679,7 +680,6 @@ 346CF44A1A5C10C2008E5BFF /* CSInputLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSInputLayer.h; sourceTree = ""; }; 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSInputLayer.m; sourceTree = ""; }; 346EAAF6197A7B28000892CF /* Capture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Capture.h; sourceTree = ""; }; - 3470F41319C84989000A81C4 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; 347277FB1A5A2758008801A9 /* CSIOSurfaceLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSIOSurfaceLayer.h; path = PluginHeaders/CSIOSurfaceLayer.h; sourceTree = ""; }; 347277FC1A5A2758008801A9 /* CSIOSurfaceLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSIOSurfaceLayer.m; sourceTree = ""; }; 34792AF516104AA70065A859 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; @@ -942,10 +942,10 @@ 3400777016E6FE5D00097E8F /* libz.dylib in Frameworks */, 347B7FC816907AE700B5F4B3 /* VideoDecodeAcceleration.framework in Frameworks */, 347B7FC616907A1700B5F4B3 /* libbz2.dylib in Frameworks */, + 341A2D5C1C7AB04700FF7566 /* Sparkle.framework in Frameworks */, 34A64A37165F208800A68428 /* QuartzCore.framework in Frameworks */, 34792AFB1611A6B90065A859 /* IOSurface.framework in Frameworks */, 34792AF616104AA70065A859 /* IOKit.framework in Frameworks */, - 3470F41419C84989000A81C4 /* Sparkle.framework in Frameworks */, 34C6C3BF15FB5B440018A18B /* OpenGL.framework in Frameworks */, 342346BB15F5FBD700C8C77E /* CoreMedia.framework in Frameworks */, 342346B915F5FBD200C8C77E /* CoreVideo.framework in Frameworks */, @@ -1029,13 +1029,13 @@ 340FE4A015F3417E00E4CE4E /* Frameworks */ = { isa = PBXGroup; children = ( + 341A2D5B1C7AB04700FF7566 /* Sparkle.framework */, 34E9836F1B78AE9100F26F1E /* Python.framework */, 34ED8CB11B0737A3002C0674 /* CoreMIDI.framework */, 34EAFB7F1A1BA86800E12FBD /* CoreMediaIO.framework */, 345F8B341A157433009A81E3 /* CoreAudio.framework */, 345F8B1C1A12AC2C009A81E3 /* AudioUnit.framework */, 345F8B191A1218DE009A81E3 /* AudioToolbox.framework */, - 3470F41319C84989000A81C4 /* Sparkle.framework */, 34A64A36165F208800A68428 /* QuartzCore.framework */, 34AE3C6C164F04C90052C95E /* CoreVideo.framework */, 34AE3C6A164F04B30052C95E /* IOSurface.framework */, @@ -2481,6 +2481,7 @@ GCC_WARN_UNUSED_PARAMETER = NO; HEADER_SEARCH_PATHS = /usr/local/include; INFOPLIST_FILE = "CocoaSplit/CocoaSplit-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; "LIBRARY_SEARCH_PATHS[arch=*]" = ""; MACOSX_DEPLOYMENT_TARGET = 10.8; "OTHER_LDFLAGS[arch=*]" = ( @@ -2522,6 +2523,7 @@ GCC_WARN_UNUSED_PARAMETER = NO; HEADER_SEARCH_PATHS = /usr/local/include; INFOPLIST_FILE = "CocoaSplit/CocoaSplit-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.8; "OTHER_LDFLAGS[arch=*]" = ( /usr/local/lib/libavformat.a, diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index 00692ec4..c4fcdb3d 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.3 + 2.0.4 CFBundleSignature ???? CFBundleVersion - 2.0.3 + 2.0.4 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.m b/CocoaSplit/Interface/CSNewOutputWindowController.m index 8fd7f539..47cf2b26 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.m +++ b/CocoaSplit/Interface/CSNewOutputWindowController.m @@ -140,9 +140,6 @@ { [self.outputObjectController commitEditing]; [self.pluginViewController commitEditing]; - NSString *destination = [self.streamServiceObject getServiceDestination]; - - self.outputDestination.destination = destination; self.outputDestination.streamServiceObject = self.streamServiceObject; [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseOK]; } diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.xib b/CocoaSplit/Interface/CSNewOutputWindowController.xib index 8a9efeff..5c1ab685 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.xib +++ b/CocoaSplit/Interface/CSNewOutputWindowController.xib @@ -1,5 +1,5 @@ - + @@ -100,7 +100,7 @@ Gw - + @@ -164,6 +164,27 @@ Gw + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/OutputDestination.h b/CocoaSplit/OutputDestination.h index 2c1179ff..89238d14 100644 --- a/CocoaSplit/OutputDestination.h +++ b/CocoaSplit/OutputDestination.h @@ -18,13 +18,12 @@ @interface OutputDestination : NSObject { - NSString *_destination; NSString *_name; BOOL _active; double _output_start_time; NSMutableArray *_delayBuffer; BOOL _stopped; - + NSString *_destination; } @@ -33,7 +32,7 @@ @property (strong) NSString *server_name; @property (strong) NSString *type_name; @property (strong) NSString *type_class_name; -@property (strong) NSString *destination; +@property (readonly) NSString *destination; @property (strong) NSString *output_format; @property (strong) NSString *stream_key; @property (assign) int stream_delay; diff --git a/CocoaSplit/OutputDestination.m b/CocoaSplit/OutputDestination.m index 728d57fe..678d1df3 100644 --- a/CocoaSplit/OutputDestination.m +++ b/CocoaSplit/OutputDestination.m @@ -14,20 +14,21 @@ @synthesize name = _name; +@synthesize output_format = _output_format; + -(instancetype)copyWithZone:(NSZone *)zone { OutputDestination *newCopy = [[OutputDestination alloc] init]; - newCopy.destination = self.destination; newCopy.name = self.name; newCopy.type_name = self.type_name; newCopy.type_class_name = self.type_class_name; - newCopy.output_format = self.output_format; newCopy.active = self.active; newCopy.stream_delay = self.stream_delay; newCopy.compressor_name = self.compressor_name; newCopy.streamServiceObject = self.streamServiceObject; + newCopy->_destination = _destination; return newCopy; } @@ -35,26 +36,24 @@ -(void) encodeWithCoder:(NSCoder *)aCoder { - [aCoder encodeObject:self.destination forKey:@"destination"]; [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeObject:self.type_name forKey:@"type_name"]; [aCoder encodeObject:self.type_class_name forKey:@"type_class_name"]; - [aCoder encodeObject:self.output_format forKey:@"output_format"]; [aCoder encodeBool:self.active forKey:@"active"]; [aCoder encodeInteger:self.stream_delay forKey:@"stream_delay"]; [aCoder encodeObject:self.compressor_name forKey:@"compressor_name"]; [aCoder encodeObject:self.streamServiceObject forKey:@"streamServiceObject"]; + [aCoder encodeObject:_destination forKey:@"destination"]; } + -(id) initWithCoder:(NSCoder *)aDecoder { if (self = [self init]) { - - self.destination = [aDecoder decodeObjectForKey:@"destination"]; + _destination = [aDecoder decodeObjectForKey:@"destination"]; self.name = [aDecoder decodeObjectForKey:@"name"]; self.type_name = [aDecoder decodeObjectForKey:@"type_name"]; - self.output_format = [aDecoder decodeObjectForKey:@"output_format"]; self.active = [aDecoder decodeBoolForKey:@"active"]; self.stream_delay = (int)[aDecoder decodeIntegerForKey:@"stream_delay"]; self.compressor_name = [aDecoder decodeObjectForKey:@"compressor_name"]; @@ -88,19 +87,15 @@ { if (_destination) - return _destination; - - - if ([_type_name isEqualToString:@"rtmp"]) { - _destination = [NSString stringWithFormat:@"%@/%@", self.server_name, self.stream_key]; - + return _destination; } - return _destination; - + return [self.streamServiceObject getServiceDestination]; } + + -(NSString *)name { if (_name) @@ -108,7 +103,7 @@ return _name; } - return _destination; + return self.destination; } @@ -145,17 +140,6 @@ --(void)setDestination:(NSString *)destination -{ - - if ([destination hasPrefix:@"rtmp://"] || [destination hasPrefix:@"udp:"]) - { - self.output_format = @"FLV"; - } - _destination = destination; - -} - -(void) reset { @@ -220,6 +204,31 @@ } +-(void)setOutput_format:(NSString *)output_format +{ + _output_format = output_format; +} + + +-(NSString *)output_format +{ + if (_output_format) + { + return _output_format; + } + + + if (self.streamServiceObject) + { + if ([self.streamServiceObject respondsToSelector:@selector(getServiceFormat)]) + { + return [self.streamServiceObject getServiceFormat]; + } + } + + return nil; +} + -(void)compressorDeleted:(NSNotification *)notification { diff --git a/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h b/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h index 834154e5..acd74b40 100644 --- a/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h +++ b/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h @@ -15,6 +15,7 @@ -(NSViewController *)getConfigurationView; -(NSString *)getServiceDestination; +-(NSString *)getServiceFormat; +(NSString *)label; +(NSString *)serviceDescription; diff --git a/Sparkle.framework/Versions/A/Headers/SUAppcast.h b/Sparkle.framework/Versions/A/Headers/SUAppcast.h index 702f549e..8f3efc8e 100644 --- a/Sparkle.framework/Versions/A/Headers/SUAppcast.h +++ b/Sparkle.framework/Versions/A/Headers/SUAppcast.h @@ -9,22 +9,18 @@ #ifndef SUAPPCAST_H #define SUAPPCAST_H -@protocol SUAppcastDelegate; +#import +#import "SUExport.h" @class SUAppcastItem; -@interface SUAppcast : NSObject +SU_EXPORT @interface SUAppcast : NSObject -@property (weak) id delegate; @property (copy) NSString *userAgentString; +@property (copy) NSDictionary *httpHeaders; -- (void)fetchAppcastFromURL:(NSURL *)url; +- (void)fetchAppcastFromURL:(NSURL *)url completionBlock:(void (^)(NSError *))err; @property (readonly, copy) NSArray *items; @end -@protocol SUAppcastDelegate -- (void)appcastDidFinishLoading:(SUAppcast *)appcast; -- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error; -@end - #endif diff --git a/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h b/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h index 3334a1af..86843bfb 100644 --- a/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h +++ b/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h @@ -9,7 +9,10 @@ #ifndef SUAPPCASTITEM_H #define SUAPPCASTITEM_H -@interface SUAppcastItem : NSObject +#import +#import "SUExport.h" + +SU_EXPORT @interface SUAppcastItem : NSObject @property (copy, readonly) NSString *title; @property (copy, readonly) NSDate *date; @property (copy, readonly) NSString *itemDescription; @@ -29,6 +32,7 @@ @property (getter=isDeltaUpdate, readonly) BOOL deltaUpdate; @property (getter=isCriticalUpdate, readonly) BOOL criticalUpdate; +@property (getter=isInformationOnlyUpdate, readonly) BOOL informationOnlyUpdate; // Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. @property (readonly, copy) NSDictionary *propertiesDictionary; diff --git a/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h b/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h index f40d5715..d7f2a48c 100644 --- a/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h +++ b/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h @@ -9,7 +9,8 @@ #ifndef SUSTANDARDVERSIONCOMPARATOR_H #define SUSTANDARDVERSIONCOMPARATOR_H - +#import +#import "SUExport.h" #import "SUVersionComparisonProtocol.h" /*! @@ -19,7 +20,7 @@ It's "dumb" in that it does essentially string comparison, in components split by character type. */ -@interface SUStandardVersionComparator : NSObject +SU_EXPORT @interface SUStandardVersionComparator : NSObject /*! Returns a singleton instance of the comparator. diff --git a/Sparkle.framework/Versions/A/Headers/SUUpdater.h b/Sparkle.framework/Versions/A/Headers/SUUpdater.h index 4c838571..ed0072af 100644 --- a/Sparkle.framework/Versions/A/Headers/SUUpdater.h +++ b/Sparkle.framework/Versions/A/Headers/SUUpdater.h @@ -9,6 +9,8 @@ #ifndef SUUPDATER_H #define SUUPDATER_H +#import +#import "SUExport.h" #import "SUVersionComparisonProtocol.h" #import "SUVersionDisplayProtocol.h" @@ -22,15 +24,16 @@ This class is used to configure the update paramters as well as manually and automatically schedule and control checks for updates. */ -@interface SUUpdater : NSObject +SU_EXPORT @interface SUUpdater : NSObject -@property (weak) IBOutlet id delegate; +@property (unsafe_unretained) IBOutlet id delegate; + (SUUpdater *)sharedUpdater; + (SUUpdater *)updaterForBundle:(NSBundle *)bundle; - (instancetype)initForBundle:(NSBundle *)bundle; @property (readonly, strong) NSBundle *hostBundle; +@property (strong, readonly) NSBundle *sparkleBundle; @property BOOL automaticallyChecksForUpdates; @@ -45,6 +48,8 @@ @property (nonatomic, copy) NSString *userAgentString; +@property (copy) NSDictionary *httpHeaders; + @property BOOL sendsSystemProfile; @property BOOL automaticallyDownloadsUpdates; @@ -72,6 +77,16 @@ */ - (void)checkForUpdatesInBackground; +/*! + Checks for updates and, if available, immediately downloads and installs them. + A progress dialog is shown but the user will never be prompted to read the + release notes. + + You may want to respond to the userDidCancelDownload delegate method in case + the user clicks the "Cancel" button while the update is downloading. + */ +- (void)installUpdatesIfAvailable; + /*! Returns the date of last update check. @@ -107,17 +122,17 @@ // SUUpdater Notifications for events that might be interesting to more than just the delegate // The updater will be the notification object // ----------------------------------------------------------------------------- -extern NSString *const SUUpdaterDidFinishLoadingAppCastNotification; -extern NSString *const SUUpdaterDidFindValidUpdateNotification; -extern NSString *const SUUpdaterDidNotFindUpdateNotification; -extern NSString *const SUUpdaterWillRestartNotification; +SU_EXPORT extern NSString *const SUUpdaterDidFinishLoadingAppCastNotification; +SU_EXPORT extern NSString *const SUUpdaterDidFindValidUpdateNotification; +SU_EXPORT extern NSString *const SUUpdaterDidNotFindUpdateNotification; +SU_EXPORT extern NSString *const SUUpdaterWillRestartNotification; #define SUUpdaterWillRelaunchApplicationNotification SUUpdaterWillRestartNotification; #define SUUpdaterWillInstallUpdateNotification SUUpdaterWillRestartNotification; // Key for the SUAppcastItem object in the SUUpdaterDidFindValidUpdateNotification userInfo -extern NSString *const SUUpdaterAppcastItemNotificationKey; +SU_EXPORT extern NSString *const SUUpdaterAppcastItemNotificationKey; // Key for the SUAppcast object in the SUUpdaterDidFinishLoadingAppCastNotification userInfo -extern NSString *const SUUpdaterAppcastNotificationKey; +SU_EXPORT extern NSString *const SUUpdaterAppcastNotificationKey; // ----------------------------------------------------------------------------- // SUUpdater Delegate: @@ -205,6 +220,31 @@ extern NSString *const SUUpdaterAppcastNotificationKey; */ - (void)updaterDidNotFindUpdate:(SUUpdater *)updater; +/*! + Called immediately before downloading the specified update. + + \param updater The SUUpdater instance. + \param item The appcast item corresponding to the update that is proposed to be downloaded. + \param request The mutable URL request that will be used to download the update. + */ +- (void)updater:(SUUpdater *)updater willDownloadUpdate:(SUAppcastItem *)item withRequest:(NSMutableURLRequest *)request; + +/*! + Called after the specified update failed to download. + + \param updater The SUUpdater instance. + \param item The appcast item corresponding to the update that failed to download. + \param error The error generated by the failed download. + */ +- (void)updater:(SUUpdater *)updater failedToDownloadUpdate:(SUAppcastItem *)item error:(NSError *)error; + +/*! + Called when the user clicks the cancel button while and update is being downloaded. + + \param updater The SUUpdater instance. + */ +- (void)userDidCancelDownload:(SUUpdater *)updater; + /*! Called immediately before installing the specified update. @@ -311,24 +351,14 @@ extern NSString *const SUUpdaterAppcastNotificationKey; */ - (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)item; +/*! + Called after an update is aborted due to an error. + + \param updater The SUUpdater instance. + \param error The error that caused the abort + */ +- (void)updater:(SUUpdater *)updater didAbortWithError:(NSError *)error; + @end - -// ----------------------------------------------------------------------------- -// Constants: -// ----------------------------------------------------------------------------- - -// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds. -#if defined(DEBUG) && DEBUG && 0 -#define SU_MIN_CHECK_INTERVAL 60 -#else -#define SU_MIN_CHECK_INTERVAL 60 * 60 -#endif - -#if defined(DEBUG) && DEBUG && 0 -#define SU_DEFAULT_CHECK_INTERVAL 60 -#else -#define SU_DEFAULT_CHECK_INTERVAL 60 * 60 * 24 -#endif - #endif diff --git a/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h b/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h index d3fb3d2b..10c42669 100644 --- a/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h +++ b/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h @@ -10,6 +10,7 @@ #define SUVERSIONCOMPARISONPROTOCOL_H #import +#import "SUExport.h" /*! Provides version comparison facilities for Sparkle. diff --git a/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h b/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h index 697f1a87..97fae4c9 100644 --- a/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h +++ b/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h @@ -7,7 +7,7 @@ // #import - +#import "SUExport.h" /*! Applies special display formatting to version numbers. diff --git a/Sparkle.framework/Versions/A/Headers/Sparkle.h b/Sparkle.framework/Versions/A/Headers/Sparkle.h index 954ca519..20ed6979 100644 --- a/Sparkle.framework/Versions/A/Headers/Sparkle.h +++ b/Sparkle.framework/Versions/A/Headers/Sparkle.h @@ -9,14 +9,17 @@ #ifndef SPARKLE_H #define SPARKLE_H +#import + // This list should include the shared headers. It doesn't matter if some of them aren't shared (unless // there are name-space collisions) so we can list all of them to start with: -#import - -#import -#import -#import -#import +#import "SUAppcast.h" +#import "SUAppcastItem.h" +#import "SUStandardVersionComparator.h" +#import "SUUpdater.h" +#import "SUVersionComparisonProtocol.h" +#import "SUVersionDisplayProtocol.h" +#import "SUErrors.h" #endif diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist index e5578182..26a02122 100644 --- a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist +++ b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist @@ -3,7 +3,7 @@ BuildMachineOSBuild - 14A298i + 15E27e CFBundleDevelopmentRegion English CFBundleExecutable @@ -17,25 +17,29 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.8.0 + 1.13.1 git-2afc553 CFBundleSignature ???? + CFBundleSupportedPlatforms + + MacOSX + CFBundleVersion - 1.8.0 + 1.13.1 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild - 6A254o + 7C68 DTPlatformVersion GM DTSDKBuild - 14A283h + 15C43 DTSDKName - macosx10.10 + macosx10.11 DTXcode - 0600 + 0720 DTXcodeBuild - 6A254o + 7C68 LSBackgroundOnly 1 LSMinimumSystemVersion diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate index a3740cd5041ed1a3fd4fbb4f43f59c521d04433e..7caea3d5f503cfac5dd2907cee299bf319c37f2b 100755 GIT binary patch literal 166964 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 literal 113368 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 diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns index b6fa73476505d0385529ee9c2e19f0848c9ab328..75c7c379f94c38d64cb160da894f3f41149cc34b 100644 GIT binary patch delta 123931 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 delta 132380 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 delta 30 mcmeCNUuC&LjCFDyd%5a^v$NSV(#i>wvpB_c6M@z#0G*HtbYKRMl?QYPrn8{Vnas{s><{uzBG5x1@8^O& zoeE?nG9&@nrC@J@OoDi?6e%DSfbt+cAX$)(av+(+U_W^wyXfQttXz{N*esZh8B`|w bvuXQM)sD^9?9+wVb%7S=Gw4pfDd`OWov2(% delta 36 scmZp(T4J(+i*2$OtH|U995Ivm*w1X%;OY@#S70b%$Y)TPyj#W_0MeNXyZ`_I diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/da.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/da.lproj/Sparkle.strings index 8c349bd2b6c3302472c4b7c9738901e4eb388c78..266c0693a65da63215c843a44683cc97c58f58d8 100644 GIT binary patch delta 443 zcmca*vBz%1Dwbe<1}z2!1{a1@hGK?fh9ZVch608XAeqmQ2NW*>idO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5tYH@T5Vk~x#1c(S92Fn=OL5?F;EP_Gt){^a+} z;+yxeFfr1~;>pk0#e@@qRw^)*1HDlKbdmzlEBPSDup>EQ@;;Ure~{A?fsO}xH5cr` zR3HoF5qzFg{ zGlT+R0YeHyB3RauAqS|Y2&|@@Ap^*U=mW777)p^;DgaF_o*c*~%%8}R1lFYoRH4P7 zzxg3+F=I3h9Wr?;r@CMw&`Je{a-bthfX-B4$eZlXCdv+V!epQmG(jFo1bPMJfn2b6 zL0$kkHXrB_P#}PGf;@3hT38U-o8>^ANs|lNR40F9HDNYpP?@aBrcJ4Nn?2bVb2BPT rel7GCOcqb}5=mlI*t}X~H6u`9wTSlS2C-kPTnY?o3Q7#t3|tHVXnbRD delta 59 zcmaE7*JQcj3F~AQR*}i;IARvRU}M~D#x;X`@&(a1KwLE0Ks;%(gQV8xec}y_n;j%o O*f`V_lo+fTxEKJitP_#| diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/el.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/el.lproj/Sparkle.strings index 015c213ecf1f8fb449bdde13cae26c1f6bb2082c..394c159c033535562bc2331e33519afc1d89ab24 100644 GIT binary patch delta 441 zcmX?MyvlOJ6xLvU1}z2!1{a1@hGK?fh9ZVch608XAeqmQ2NW*>idO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5tYH(8!fk~x#1crqiKFn=OL5?F;EP_Gt){^p6S zu8g#@bg~Gim|!B%It7MupchJj&QSn5=Rd0`JJkBg6IqKRK@Ls?IvM1_T(GxNfh>?i z^BGFP9s%hDdH^U|isV%Vc%Xp139=&5qzFg{ zGlT+R0YeHyB3RauAqS|Yh@oWid|C0yIy_vH56Ey#{=y-^pU98|meT|3(qhn`yq-;b z^CEUNMw(d3GWivkh;Sm%LIs9$pz})@GJvc+hWyDNIfU7foG^J2dyGHG$%#NmgS?mv z_E;*A1#)mcLn+w1ApM!ZAW;DF5uR0m2TKOf1dvUsKt1-86*)yG%Q13Iw&6(erK;JR J_i}s}2LMihS{ncW delta 17 ZcmbQ@zQu7vANyt{4lBmZE4bf?0{}jc2A2Q; diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings index ee694079466290bb0a9a2ec01e38d2d8b8bea0e4..8922b3213e3a9a8f5de982f84330b80e6a8cd56f 100644 GIT binary patch delta 469 zcmaE0cF1N!25YcBgBF7Vg9}3{Loq`#LlHwJLjgkxkj!Vu1B#ab#VdfM0z(>5qzFg{ zGlT+R0YeHyB3RauAqS|Y2&|@@Ap^+Ho9xIXuC4$yqZp_@1*oqaXjTr8P6X>p0_)HN z%4sp^PoB#nzPW}~iIG+gnS6>vLN^g;r2^0ynLuY|09koJ$6z`Q$w`xISY!M_9!msz z4HOW$VDF~_S&0luKz1qE!ywZj-Yi855(S_;;o^*p6*(;5;M(0As@l{Qv*} diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings index c7b221b12b2be92af6c5e97c70f754481fbb73e9..6577569feb5a6d42e00687e463ce9e6c5cff7491 100644 GIT binary patch delta 443 zcmbPb^~Zk0Jl0@+1}z2!1{a1@hGK?fh9ZVch608XAeqmQ2NW*>idO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5tYH+eso_~Zf^j>%V~1^5#glE5nTfO@qU^e69U z5#PLtHGq+Z7PCx_;1m%~1X`=WP!9A;3D8*zK=0&Fz9=osj^vQZn^@-^BGFP-U8{*1O|@+kdN@V0z8O7o(9>J%8)eitm5P~tQPFX3@Qu`40;pO N)v0U#=I?CEVgQ|eT;u=% delta 17 ZcmexkKg(*vJl4%dY$=SJpKwZu0RTjx27v$o diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/is.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/is.lproj/Sparkle.strings index 68ae6e0ae7b71ed89581d779caaedd8a27c39f3e..74ae72802ab6eea84ff81f1c2b06038d91a854ec 100644 GIT binary patch delta 629 zcmcIhu}Z^G6g?(`f`f^EfREZ(h{RemmngW2Q|Ta1iLEpco03#w|G-gr{e^;~rGvlW zCjNk%qnm^0J{1R7CA@oY?!D*TbMCwGUi|wz>#PYM3P_^uE}0(a-6CR4h#wmB@FqKp9`r^ zzQZpzc?!FbaV0}OLn%-^nIVxO4@hSM$xNWCOd!96Ar-761576~faqj~?8)51nv*Sr b?Iu?VFPW?)qB8lGhygp;WCn%Ff})`SzJVkf diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings index 99955afc5a20cc0ce4ba3e6415334bf307a5cf50..f7fb93581c1f605eabf34ce774f53153f802f8d0 100644 GIT binary patch delta 459 zcmbPY@y&L_B-UVk1}z2!1{a1@hGK?fh9ZVch608XAeqmQ2NW*>idO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5tYH`$g~TwMWZMln!*3Q%7;(5xIFoe0*I1lFMk zl+$9+-`vj{%}6UpOg7<^&`ktdrvP+9CeVo)Kvo{mA(+mBI%je}Yq2lLLy15yfdU{G z?Cn$_E0G}y$SwtY6l4;_d!f@tbd&?hq{;GZijxidO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5ktx3i&El~Ux^D%ej+TupU98|7S{vn&|=Wve3g}#k?L0Q zO+LpVBAf`cNP(do=;RWH3?M6yA%F5iVPSTt)swHX7W;#om`V+NJUvTWJ`R5qVs^DQ<3 FQ25qzFg{ zGlT+R0YeHyB3RauAqS|Y2&|@@Ap^+Ho6O50K3RaBMY$NLJ_V?+9B5V!kWK{aN&@T9 z1IlSJ=x;V=;b)|wBP0Y9fz~MiosbE1Vg`_vH+dn8C_B{p$;K?jz90`I0=)q8a4y)J zsX$gDLlTf(3icRCXC^R!6o7n$*A;;BkU#=?8)Qc+L(;^v@{^rdteA}%R3=xmX!}vs XaE8qmtc&>Ab%Bn`XV9JeP*@)TB9&O5 delta 29 lcmeyQJ3(WE8O!EVEIf>xRXAqwu`4i?Fyu2ROg=284*-#i2$}!@ diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nb.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nb.lproj/Sparkle.strings index 05a426d15c2900c117e662f8d7828db5fdde0b88..25e207938302eca2f2264dd4158f52c2d0ac1c97 100644 GIT binary patch delta 419 zcmX@*u*Pk}B{ole1}z2!1{a1@hGK?fh9ZVch608XAeqmQ2NW*>idO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5ktvjMj7$RbGW%!6@a>nCp$_A^CvPSfo1i8`m`AIH=k#7 zXQaM`lU=wZgcE@lDKL}+tuA560J8EJ@{EB!JbJ4vOrGE zXD9`G5u_97bf9P{k_Q#wL6HG80c1xiP>=m&MrP5;zgUGP=dcTouBDgse#YqqmaVic;jWlYSkfy|D@c~?fJBSXB z&O#nQCr4jFd;@1)JU0~`B;@@MtVC*4ZyU? zqX4H%Bjf|*FL3H4>OSrRI>hI}$4IK1@DxYs2_bI%@PPQXuv9Womx_&!A<&4Qv`Tgr zs7+no*T%cTH=rPXPU2z#8Ds)a5?x{1m|jQx=dAy}QC!8tB9q^>%l`jSr8hu_%pldQ zqC+o0By-jgMNqJTXLCC6ACTD%f delta 276 zcmX?SKhJst6EjaHLn4C{V-iCpLp0-N4(1Om;#EMAY=#nsQXrkfkjYTRkk3%gkT{u} zBa^qBL4lzdC|3!TDV03>iHk^@AZ|RfJs@=?o1J~KGxN;MGxId@o<4gE9Z-oh7097Y$^qxkKhiDpfDYar z((ZzB+hEvkPvf$&lA;7Ds(Cjgn2K}&YlA=m<){LyKxM8E{ms+F43LFmNv&buhYZqVbWm#UvID838@s|I_uc%8Yo;HX3zjX@DxeKm~MNKf_n=&XP>8F~6v_=V_D!(qsW2da4LhO^d^Cx+(Z2N4%0z zhP7yxt7e$n%^+9&Q@%-x^Ob*W@lR_oo9SqsvfiE?_s%?S7`4%etX9^YN0YVH?_sD% zdd2_RS~V%wkuYBdEBxGi`U|DxYl(3$gEPJkQBn>vhg#5-*CSCRn{J@}!WUXawI4Uj zMt6#XAH#i&V<%h^oQ`U>jaJ4P$9z_R@ VP!hA*l=MzfrX1jbSeUP4BcHK9vK#;a delta 312 zcmexi{>E^^H^C%^M21X;3Lu%nkk6pNkUH6rTYRz_qlBnCkYCJD0+cBNsz?ONr7)y! z_GG-sv{{bDk8u*)8D?Du-N_f()YY*n1!{m9{*XbJA%`JidO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5ry(FbBFFq9&xQ~;VidO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5tYH@Q|oQZ*B3o&r!+K0`Usq#Pif2-cGXR<8$? z(_+xye3V_EkycKaY{f06n+UW{0qBHGpaV02tURDYFr5W;&g7%)#l9f#BmzAI@_sJZ z)2TpKB1008T?+Ol$RvpON|6FW0VogB1Cj;lCidO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5tYH`$O&eDVhl7Ug1~`V^qPa-dl`KsphuD+#Pa z4=AU_puc%Ht0^N59U-Bc2((TC=!8t56ElFUJfK4`odtEynshSBiPXVYZpP?LRQVx(#1nWrxtJed{ zX))+;e$Q&iNGm5yj^Py3O$1t}0CYko(1961RvyqHn9hPaXYza2Vt-CrAPsx0F(#m0m*`Nlmp2m2K&kVtg@5;v05=3GpI~9XVdnj Qs`;Bm*$)d&wvhAz03AtPn*aa+ delta 33 pcmZp(XffXKiFI=un;zq4CaxWV>CB_1Y5p7gBF7Vg9}3{Loq`#LlHwJLjgkxkj!Vu1B#ab#VdfM0z(>5qzFg{ zGlT+R0YeHyB3RauAqS|Y2&|@@Ap^*U=mW777)p^;DgaF_o*c+7%%8}R1lFYoRH4P7 zKiQvEe6tRl0%J4{9W%L{Q(ZU_XsrT6InW^`K&L7Ioth7F5Id4XChM@p_=3EY2=o-l zE4g5ggFFLrc0SNcpx^-M2YLs{LiHjn*dX372bz;K@vP!xH8u-oV+NJUv25DZHGH!p Hd#*45v*1|b delta 20 ccmbPWz0P!l1l#0E90ikQ*pF=1<4O_+08cpv^Z)<= diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sv.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sv.lproj/Sparkle.strings index fbebf966f32327211203eeb62720a930f9fb1088..e65ac55916230e88d83954d796de62b90c9803a1 100644 GIT binary patch delta 731 zcmcIiyGjE=6g}g*iAKbr5Mv>1G)5AMK~kuQFHo>BRqz9L^B}?O8nOw|MiGBN8L+bT z17xw&+DgPfun@mMtVBGs5g*tp!_M5jkHfk5p4aU2{P9bF1&^@Ngvrm9ePU1Bf$bfN z>n_psmb+&}K7$kttf2%K1vF4aow-%)z@fiM|1NI>WqKNX^Vs64qv&Inu!sXQGfglW2XL zn!&iLQBhUV=53wa#^k;}r)3eBm-^J-g3F`8Z17{W-c4Y!C+kofYNHdFK^!ZzTx^qd z&EJpuQ@T-`HT_L0<%|!U3;8h8tU|KpumbWzcrj6u@WBx!^b5bSu s;iTM*MCED32!8iHMG_+I^$#b7OzB~7EqW%RIo2qCN*hXj38SNdcNRmN(f|Me delta 322 zcmexj`Nw#|H_;r1M1~X~Ok^lwC}vP#$YV%lNSVycSh=~0aTgO~-ey}CL&nK9EFzPC zvByjp5pykN6nDmHKBwB?vA$HO6>&yWkW zssw0d5s*}1P-QS=P+@S`tSYpWkv*8<8$&ij>g0>U7lnP`ZYzSjOi)~NGLJ~oW((1O z%=%71#ULrD2|!jN&`~7}AR9m)$^_bz4Ys2gWb9;LN$trKBo$a;Jl)BUBvlv{HnU4< wGIHlJR01`D9F{uSUPyd%h;#>|j1Mq4K<>-~n(YfTw+P5rQ&3{CX5eA~0IFzBHUIzs diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/th.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/th.lproj/Sparkle.strings index 323bb70feb0c74f4bf25201586984df03b1491e8..fc728fd554695c0f04861bce32d3fc4961fed783 100644 GIT binary patch delta 436 zcmb_Y!3qIU6g|>IQWiAIYKYA!7B*yoVqq~WSz5edGzz1c5x=4LBg)ps2lxSB;4_>z zNj^Zg?z^4)?mg$+XZO~>WW=Ne3noTz5n_P=YwQs*``8hWh@Y5EtcV1BrS!i8_7$^Qur#2a*AW3B6NZAoQRy+7wLi$6k zga~adQ&On5wT;cVth7iUhuET?rFf!;AA{!i6dpHd78lO>QBj8IB-^MdTQuf>U5-Ag R=poCfqK<*Ka&=NC;|=8ZR^9*r delta 25 hcmdmEf6H6vn@nq)l{zhCnoE9E?W601G!JE}#hu6XQY~4p5*J8i(G8b^+ zUXyOU1V?b^6*QXo4Q1g0G?TV(=6nBsZ~AFHoxHs3#UWfc=%9=MefYS8z=XDsF?!Sl zEf3dl<(r=06;y^ibLgw=0Ya*6?tSh%)I3b$5B)S{S5e|ogDFOIP(tFY$_R$JxaC{m za*@(TlWV{v&Rn&a(q)|TiO{9pm*1=FDG#IRG?RAFnmbe|mr#u@<6Qf%nlfC@WfH`Q z93i_AqzKrDxu`EKV|1n(cG$84?9H*%{8Xm_r>Q_xC;@1Vf1#>LCPPt}3fDzT&WwV* zFpkVa?4XXybhc;zX#v!*jpO*iJXlF5my;m62<1&KitB5Qlzh!@#E`S nw^h^3GD!lI<+I4{H~G(8k;f-#kB{K)i#%;o_$a6%SmOEtjK6{! delta 143 zcmZ4D@yl_;3#Q2u%p#jZm_3*$*Kl)ewqSQ-+4fYd@IdqzP8psswNo)nuM{!9QhruwH#D}^&J`r?A{uaO)>`!@{zF>R8H-TW{fN5r@tsL z9n5H=asR%qA7y?niw*rLH>-cz9KIL+3dxelh@3x(Cao#elW0Z97CvTPJBzcgx_urm ziK57fZDL6r3xxuk9PsS>Z}xY{s`@Xno5*UxG}g(-SVT74u?aA4p2PWqY4RgJugTYVZh>hgz8jk#@hLHaIbi}(ljC?f zL>*Y{Sj<@rfusXV7>fdf3y?I~d{W>i)8-?>S?rEBECwtgEKV$@KsiSs+lIv%$g*Q` l1d183*aD#+kZ%N(cL0iofqC{owjGNxkOZpVTrRzn5det5Cb$3q diff --git a/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings index 49b68ce1e7b697bcefff97f7a62b6ca8365c74a9..0e91210e5ed31beb52fcd2324d3db6c4408ea851 100644 GIT binary patch delta 652 zcmcbj_D5@j0wa_B|IJE_HH91 z20tyoSHZu#r$?6uH$@(-xKXB%c0NEX$usaq+2$uqb&U1zgJ=75`_=aI{9lopm3WB!efEpkgfvm~C zZ0drEKm{O~OrVMkAS-XOJc}s19+0KQpg(ydbFnYb0H9$-V12n@Yf^!-i3~|Vb}86g zkj_k?0~LULgw+agM}lkx*^$bSG})0waq=N%3ud6VC;w#D4xp;(4E7A0=dg${No;Sv z7VI9pyzZfYe!{oZUx6EnC8xgc=J`K)9jDu5KK3dmDDwh)hREa2?%?D7+*P`MXzC_$ z)WOt6a9T+`?wpVgN(NZW{GkL(843)@*17qEVpK63lukBZ;o@LqJh1sLcOoMT$j-?R pxJ4%a;ggzNz+1$oA2KCQqjd8N-d9YUuL)Q%GObA1EFk2<2mo6|#DD+* delta 369 zcmeyPbwzE10wa?>!)7JM8pg>r%v?6Set#QQcYI0PkjnEvIKDahLcdQ(pC5ytmfx%3 z-`(m7)1%9Sn<5WZ+$d8>J0HMkkl%l!%(I%yFKPO>)Xle;>KLs)#h$NwA3WQi+po4? zL?OX{L$OA9OPNQJPP%@Y0)r}pF@p+&0|S%6iiE~akQ_)|bF_Gf{Qu22*hH8lmL{8} zx(6?>d+48^@GbRM;D%z!sqed)3?}<=yG{1utYU&PdAKq}E+k(IKHkq=rR#^L?i^Pg zL|uc7MmSs0gmjRP9CP1xU(LZVQ-^1h9>`&aV23F%d`rC;EMM9N_B6<9p8szC8sRGv zxcwBfLBXNGu!)z0k;Nk8Y5L@Sd}WiH_+GH=P5Ko$Igft<+lEyAkQG6jMFd_kvD^kK S-uzFidO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5tYH+eOuq-rM6JO!Yte1>wMNjX3|5v(T(tX>Z& zr^TQ@`8xA^TDf3y9h;bLBG5JkpbIjA?#lqO@__EZbQQui#r`1QBm(^d@_jDYFG zB1008T?+Ok$RvpGN|C}r0VogB1Cj;lC BuildMachineOSBuild - 14A298i + 15E27e CFBundleDevelopmentRegion en CFBundleExecutable Sparkle CFBundleIdentifier - org.andymatuschak.Sparkle + org.sparkle-project.Sparkle CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -17,24 +17,28 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.8.0 + 1.13.1 git-2afc553 CFBundleSignature ???? + CFBundleSupportedPlatforms + + MacOSX + CFBundleVersion - 0b186dc + 1.13.1 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild - 6A254o + 7C68 DTPlatformVersion GM DTSDKBuild - 14A283h + 15C43 DTSDKName - macosx10.10 + macosx10.11 DTXcode - 0600 + 0720 DTXcodeBuild - 6A254o + 7C68 diff --git a/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist b/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist index 74db0ff0..1f75b248 100644 --- a/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist +++ b/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist @@ -16,6 +16,8 @@ iMac (Core 2 Duo, 17 inch, Combo Drive) iMac6,1 iMac (Core 2 Duo, 24 inch, SuperDrive) + iMac7,1 + iMac Intel Core 2 Duo (aluminum enclosure) iMac8,1 iMac (Core 2 Duo, 20 or 24 inch, Early 2008 ) iMac9,1 @@ -25,7 +27,7 @@ iMac11,1 iMac (Core i5 or i7, 27 inch Late 2009) iMac11,2 - iMac (Core i3 or i5, 27 inch Mid 2010) + 21.5" iMac (mid 2010) iMac11,3 iMac (Core i5 or i7, 27 inch Mid 2010) iMac12,1 @@ -42,6 +44,16 @@ iMac (Core i5 or i7, 27 inch Late 2013) iMac14,3 iMac (Core i5 or i7, 21.5 inch Late 2013) + iMac14,4 + iMac (Core i5, 21.5 inch Mid 2014) + iMac15,1 + iMac (Retina 5K Core i5 or i7, 27 inch Late 2014 or Mid 2015) + iMac16,1 + iMac (Core i5, 21,5 inch Late 2015) + iMac16,2 + iMac (Retina 4K Core i5 or i7, 21.5 inch Late 2015) + iMac17,1 + iMac (Retina 5K Core i5 or i7, 27 inch Late 2015) MacBook1,1 MacBook (Core Duo) MacBook2,1 @@ -56,6 +68,8 @@ MacBook (Core 2 Duo, Late 2009, Unibody) MacBook7,1 MacBook (Core 2 Duo, Mid 2010, White) + MacBook8,1 + MacBook (Core M, 12 inch, Early 2015) MacBookAir1,1 MacBook Air (Core 2 Duo, 13 inch, Early 2008) MacBookAir2,1 @@ -76,6 +90,10 @@ MacBook Air (Core i5 or i7, 11 inch, Mid 2013 or Early 2014) MacBookAir6,2 MacBook Air (Core i5 or i7, 13 inch, Mid 2013 or Early 2014) + MacBookAir7,1 + MacBook Air (Core i5 or i7, 11 inch, Early 2015) + MacBookAir7,2 + MacBook Air (Core i5 or i7, 13 inch, Early 2015) MacBookPro1,1 MacBook Pro Core Duo (15-inch) MacBookPro1,2 @@ -90,8 +108,70 @@ MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo) MacBookPro4,1 MacBook Pro (Core 2 Duo Feb 2008) + MacBookPro5,1 + MacBook Pro Intel Core 2 Duo (aluminum unibody) + MacBookPro5,2 + MacBook Pro Intel Core 2 Duo (aluminum unibody) + MacBookPro5,3 + MacBook Pro Intel Core 2 Duo (aluminum unibody) + MacBookPro5,4 + MacBook Pro Intel Core 2 Duo (aluminum unibody) + MacBookPro5,5 + MacBook Pro Intel Core 2 Duo (aluminum unibody) + MacBookPro6,1 + MacBook Pro Intel Core i5, Intel Core i7 (mid 2010) + MacBookPro6,2 + MacBook Pro Intel Core i5, Intel Core i7 (mid 2010) + MacBookPro7,1 + MacBook Pro Intel Core 2 Duo (mid 2010) + MacBookPro8,1 + MacBook Pro Intel Core i5, Intel Core i7, 13" (early 2011) + MacBookPro8,2 + MacBook Pro Intel Core i7, 15" (early 2011) + MacBookPro8,3 + MacBook Pro Intel Core i7, 17" (early 2011) + MacBookPro9,1 + MacBook Pro (15-inch, Mid 2012) + MacBookPro9,2 + MacBook Pro (13-inch, Mid 2012) + MacBookPro10,1 + MacBook Pro (Retina, Mid 2012) + MacBookPro10,2 + MacBook Pro (Retina, 13-inch, Late 2012) + MacBookPro11,1 + MacBook Pro (Retina, 13-inch, Late 2013) + MacBookPro11,2 + MacBook Pro (Retina, 15-inch, Late 2013) + MacBookPro11,3 + MacBook Pro (Retina, 15-inch, Late 2013) + MacbookPro11,4 + MacBook Pro (Retina, 15-inch, Mid 2015) + MacbookPro11,5 + MacBook Pro (Retina, 15-inch, Mid 2015) + MacbookPro12,1  + MacBook Pro (Retina, 13-inch, Early 2015) Macmini1,1 Mac Mini (Core Solo/Duo) + Macmini2,1 + Mac mini Intel Core + Macmini3,1 + Mac mini Intel Core + Macmini4,1 + Mac mini Intel Core (Mid 2010) + Macmini5,1 + Mac mini (Core i5, Mid 2011) + Macmini5,2 + Mac mini (Core i5 or Core i7, Mid 2011) + Macmini5,3 + Mac mini (Core i7, Server, Mid 2011) + Macmini6,1 + Mac mini (Core i5, Late 2012) + Macmini6,2 + Mac mini (Core i7, Normal or Server, Late 2012) + Macmini7,1 + Mac mini (Core i5 or Core i7, Late 2014) + MacPro1,1,Quad + Mac Pro MacPro1,1 Mac Pro (four-core) MacPro2,1 @@ -101,7 +181,9 @@ MacPro4,1 Mac Pro (March 2009) MacPro5,1 - Mac Pro (August 2010) + Mac Pro (2010 or 2012) + MacPro6,1 + Mac Pro (Late 2013) PowerBook1,1 PowerBook G3 PowerBook2,1 @@ -164,14 +246,6 @@ Power Macintosh G3 (Blue & White) PowerMac1,2 Power Macintosh G4 (PCI Graphics) - PowerMac10,1 - Mac Mini G4 - PowerMac10,2 - Mac Mini (Late 2005) - PowerMac11,2 - Power Macintosh G5 (Late 2005) - PowerMac12,1 - iMac G5 (iSight) PowerMac2,1 iMac G3 (Slot-loading CD-ROM) PowerMac2,2 @@ -198,6 +272,8 @@ iMac G4 (17-inch Flat Panel) PowerMac5,1 Power Macintosh G4 Cube + PowerMac5,2 + Power Mac G4 Cube PowerMac6,1 iMac G4 (USB 2.0) PowerMac6,3 @@ -214,6 +290,14 @@ iMac G5 (Ambient Light Sensor) PowerMac9,1 Power Macintosh G5 (Late 2005) + PowerMac10,1 + Mac Mini G4 + PowerMac10,2 + Mac Mini (Late 2005) + PowerMac11,2 + Power Macintosh G5 (Late 2005) + PowerMac12,1 + iMac G5 (iSight) RackMac1,1 Xserve G4 RackMac1,2 @@ -224,5 +308,7 @@ Xserve (Intel Xeon) Xserve2,1 Xserve (January 2008 quad-core) + Xserve3,1 + Xserve (early 2009) diff --git a/Sparkle.framework/Versions/A/Resources/SUStatus.nib b/Sparkle.framework/Versions/A/Resources/SUStatus.nib index b16eb2212775a25e9cf5f10caadc69bda6dc6d46..30f3c2c4d1f6e3a63dd1df160ac5abec8443ced8 100644 GIT binary patch delta 3369 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 delta 3936 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 J`QQD*zXACXNxc97 diff --git a/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib index e58bbdafc57cc719d2fa27b843572d49f75ce3be..1fafb0334bda8daa78419b9d533f39c37d398c46 100644 GIT binary patch literal 16687 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 literal 15510 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

s+-@3?<@ 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 yQ%|g?g{P&bwWp&e-P76AJH|7_(_ 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 sLSNr5@Euct4>_4o88cqQ`N^c|S@-~Y!IZ2$lO diff --git a/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings index 28c2c217250892ca0e65bc1b3a11c272d94626a5..057e2f821b9215bcf4755e524f97481337bc2139 100644 GIT binary patch delta 454 zcmcIgO$$Lm6g|@TSnB0tXBMO=#L7Za7Iu`ZtcLeQ@$epzoxQS{e_^HkL1%`AA3#(0 zp6U+sD0& delta 30 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%0A+ILr(@Ep2sv?J{KhT8h@p<#09G_JS z8g9bPoF!X`G(2wl+X(a4b5;n+et;AjTuka}D#W#s?`*0!d$G7nSzGLPpT|+rW zrJ)-WjS7RPaEL4|z{8QF(NpdX=%v|VPgRxZoKY4^|nQN`}>WCL8`8i3!i_o96 z+iG$H36c}L2Cbw~wu3qx1=DaMp>GE6H+{}ntv}g!Ly5O@33#M+cW%RtNRmT8tHmc5p* zS!8cuJG0%`K5RBSk}YH_*h%bU*3V9118f~Thc($H?8EG%>=W!}b{Bh)J;Hv(o?*|j z=d6@fw8mQ7Ta&EathZTbTjyHmS?{)n=3DQxF0d}LF1D_-?zbMdeqlYwF&xj?Igyh% zh0{0}7tbYg>0B>v05_b=<3@5Gu9gdNcX9V}E4g*tHtr4X0C$jkmwS(UpZkFOnERId zgQs|jS9pzY!{5Xw@qPI$egHp+AHo;#6ZuNs$Jg-l_=Wt65Wj|hf#1o0%74y($)Dm+ z^Jn;P`R{D3?Pgn&E!o!DmSRh@b+rw$xosnD9@`jOy=|p!lWmJ_t8JTYhi#{Aw{4H@ zRoiQ}leW|Lw)S*;mVKPP!al>kz`nx%xcw>nTKhWt2Kz?)X8ViwZT21ZUG|slC+*+c zf4Bc>|H~e_C`dxA5HGY5+6mVSNkXR3PskO<3dKUD@PM#LFog$&hlEFjrNVMyg|J1~ zBm64-F8m>!7cPh(QX(y;is@p$SRfXPj{ zh?1@3D7ng5r9!Dxd`gY7PQ14U?b(XqJ zeO7%_-KV~-zM~#e535Ji)9O!}q$!%FxwKYVoYq>)(1vIuv^s6NR1*P2sb&4oVPnCI7^*n&T=y`zKig<^QiNf z^F!xJ=f}=ZO+9}6Ekj&GUBg@+*J#&RSFx+gRqdMVTHt!dwJmxFq{vAg{!j~|e_MXL GcKjO;-DBYZ diff --git a/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib index 57d4e99fd3c48dfca6431704467ed25f15e2d05d..122c0e03a3795fe3dbae886109ba3d81e762e592 100644 GIT binary patch literal 16718 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 C%=zX3 delta 6439 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 bvuXQM)sD^9?9+wVb%7S=Gw4pfDd`OWov2(% delta 36 scmZp(T4J(+i*2$OtH|U995Ivm*w1X%;OY@#S70b%$Y)TPyj#W_0MeNXyZ`_I diff --git a/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib index 1731d8fe896af04d82ed2a323ad90d8a5862f4d7..a1fbef90bb9a12518db38554fa7fa3e832236fea 100644 GIT binary patch delta 4011 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 diff --git a/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib index 487672c8d9b760006409883e4934c638baa3a62e..05bf2cb333fe7793d90a8dfc0dc2e29d4a4bdb11 100644 GIT binary patch literal 16591 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 literal 15415 zcmc(Fd0bOR*Z<62Lc*4t5Fii;Az@7}H-Lz^gCa_ch=Qo7&06ohS^iz<1&M z@xyo>-h>~;kKt|jCHykpfp_9v_-*_S-i<%Nzv7elH+%~Jj!)x1C`?6D@syEDpb{w) zl}cq&IaEH?k1C-CQG=;6s+_8z#!zFa3DhL2k@8YEQGRMJbu)DfwTN0w-A>(2-9tS< zZKa-~o}*r%UZh^8c2I9o?@}L9`>D^UW7HSax6}{RkJL%(H|jKXp8AvehgQ*Hw1JML z6X-DjbM-$pN`SI{fzhv;?mX8H;GS^6dV zHF`Jw5xt-Oj6Oymr+=h>qJO4;p?{@M(ZAE@==1ai`XWO!YDU9EGg>BrNoK5!jY(tD z89UR1DPVdsg-k!DKQn+SW`;7um~v($Gm5EZ#xZrwc&3qQV%$s%<7K8Y?aVZ0Ix~lv z%iPQ?U~Xd;GRv6d%$>}B<`DBKo6H808~=cI(QVW|v=d!Ki`aj$@6*q-AFv;?AK_ov zkJ(SyJ?vg~AG@DDz#e1|v7fS^v4`2u*(2;x_89vG`z8Ao`!)Lwdz}52{f_;fJ;DCK z{>c8s{>=Wu{>q+Ye`8Ovzq6;=KiD(uS@s-zp8b>ki~XDZhrPgFR3Q~sQ7T%+s92Rs z6{b?FG^%hMu8L4as-jfUDy@oB=~Q}EjLM*jS0#>4Yi;*>4fb+E2~HOe8Gv8)q{PltzaNvD}f1>)gwGjfm)Zh-5qG) zwD7NDJjxU39Qyxy_e^L{sH`q&Y;*?#o=G0BCpfeFyIf^;tp^&s?lGR$Cf{`E9)FGQ z*B&S&lFuKgO>6YJ0)aY3FsV18NSKJjMXVMvE8-i7^h?AIB6f*bvja1TmH87LEF)hXk*La(vPM|YqeUTqHqeN&aiu7iHr zV>_3=2RUE@9_4^YLddnOAu44+C&~pC4sQ>-VBOX3;Ckdlc_@2yWi|Yxyx9YlZR7N) z0QE$Ls23_iy-^?37xhE^(Ev0M6{8X~2n|N1Xb4f0G}40%Amhj+vWM&=2g#@8F!_r7 zKz=5_lk?=Fh$*ss9~y?r(RCn{0ac*ks1ii2_O<&P-LPGy?m*Df>XJ5hOl5V2Ym(aw z`qL0Au^mNKXe1his!jmjXe*%hL+ZwX%9htF-7Q85LE2_hh%1z*;@iYaefCy!N z&~yW51}J#FfQkxVv!~JJRXUY={0a~OoP*t7FYIA;dz;%o4JLzCO)K-dngK`YmDM%w z8No7-+uKy)^)$Cmb+-mb!JFl+0e3J^t2llczLn5#lsnMoYi)A-8#oJS#8>GH*7#km z0j~sx_Mp%24tQpHTAPQv0xb%rTZ5j#zNu}{AVrWWzsKhXbj#}=*52Fle4$zc+%A*n=9bO%7EUNjYStp^RaA|Gl)Hz7Zg5MA9qNm^L|mMN>H z+B3^d5V?_TB~OqQI*h<%Iy&-l3wcYAyuvxWrK6yC0dL7Gm@`Mg(lj)49h#12kSL-h z+##5v1IOyzd8L>5BX`Abk*hnAx3YqlKhwmxNb%VBjZV0ExI63tODdN^Z7mxO_b$VMjwOB$gOSGBN16Vh&a9Lyw~^Xe&td1loq4L{EWDNB{vlm@LZy z|4Y8jR-B=%Sr?f^;z)c0XA_3Gz0=%5u&YXUyBl0UOL=S1?Vs#wbmxq6H@ACTenmac zqUT_gGGA+O9eNgJ?}y2rM=zik(M#xMv;zX)E9g~e>C#f9xg@!z&(&=(l%xk&(B<_t zOHH6=xrro^L{3E#h^e-EW&qGL0l*?DOK#nZ-h}b>=qihBcPR!BBb{@#jp$Q!7=4b8plkpE09b~E;u)b|m)9BJ zEvf_; zo=)E0Y7iA}4YH=MM z1-&G{k}tWKydL@BZt^=_%o#LuEjmlGuI*kV1N<8uM;E{ZFOq05!1|B@rgKNRuyGyv zU}C*`<|@_}`g{b_=mE@N7OT)290r!R8X&O>tFZ=$;|Lsy9>LLAi#c>0>v0S=;8?U= z_6SvOaK%lYMj6i2TwZ|Sp!Q(U*BS~8F;Y|kq(i`SOB*8Dn!MG(8;0D}?txd}k?gR# z`jt<0HG>ZWs?#}oDfq~lum#fB|sIzzIOo%_Xj}X0i@Tz1r#2P`EG!!C9=*)L0w0lf0@7F7G#{q}J30!u7ZT)aQbHvmQ5L zH*Ubqs0n`R@r~n#Ld0m3yeOc2bigeIkusluy35~G0om<%g-y9zfoTKcB}xN$mV!^6 z!l6b3zaA$u2x$!PJ*9qEbIr^)cYusilWHh5EL&HaBpoN;eqX65>x+cJCUh zs@$g90kqZPf|N!fMJ&uYMsu6k)Gy>68jqAe&we`0t!Ng)M@;#QX;d+`HOa)TeltMEe*dW9B9x7Ms7qZQY( z8n0>Kz{Q5rn^KP)CSCrS>+x#5R*syPo++=a#~bQFL)`$p4sV3`cKI` zdINq$39R6%{cf+@6>tM-cL$`l?!Ida-YT139dQxcVaQ^nP$-4JItYYPMx#d~@ss!| zFuZ5*vkN)RXaQGLcNsfaii>sF78dm)oN&4CaNxU|mOkcehjYKX*H?%5G;1 zexsY)xdGfx9chr<&iLv!Y5Ofcs7O`S1zJ39SNoRt@W12*Hj+<>?HH%SAL5Vj$M_Sx z2k*uE@P2#%11rXd@Td4Qd>DU@kKm*D82$o(i5l_O_#1p2{L6Rvdwc@_fPch4!T$dO zp+w2ZrHrY8ORlU2m*ekZh!W$!gb(mHN@v+}fagF$C$Z43K|&mOxTjTmEaOA=L{efE za7}Y7UM;S3m{3#>jUuxkW&H905GKgQq#P0kuWt0a-K~m*SH0Xh7sPDkWyxWJDnYz4 zHJuz?X^~3+;1MM;<ZBfb$5QUX#E-yUPb@YN4#pm#O2v%Ew{diFYzDQcgY%(8$RUNR5rI09WAj`WG zKYeG2p(tEW(Wstck&6nW)H2qkti7I!g5+aJlSeK~kef85O-P9#jF-U`uIsK`k1 z2vR;N%_wgSr5aQzHAJSnN_&g;+P|425 zg)}vvYZ|Y_HM#yF*FwM*N!z*nt>DYNY(-vm;aaW4+9SJ&5-($2gu!Oau;ys^~#1kNbXP^0Ve|`FS)eK>Liy6u5})u_7hx#z0^KxpJa8fo(y4W zAX&<>R}Z%cJg^rGR2lB-_FZ!Ou26ez2dpu7&OynAURH)%PklvwO??9;0WBbI6?vGf zC5B6|`VO0^?HZj=Xgqss?5(^Yv|Csm&6yi!$NE^jIO{}=T)6#M~38>qjO9sM*!P4!*G zbR>0wx(IRMS5Uk{O6$ocvQZ68R7P8fjzZc-aP>~MRVpHy|Q>htGky^&{|pp zx_Xt4q@(afT1#^{25rExbc~caN@LQZKq@wqM}U^ba#RD? za~N2T#n)^JRSn#Ji%&i~kq9gN;{tLAVapR}v3M+#{qCtj4_JP;ctsoK0QD%4pz7(K zVB?fMvpvXb&akAx756KE>3!N%+NQDZ^qAF(@>u8HqzU^XMvMJDMXy!I9 znNFuO=uA3`&Zh0OgXZZRTA-bDE}ci`(>>?{x+h&o_o9pF-gFabMRt+5$vb2>d6&FL z{?#omU9u3m3`j>Kz-E^mmkL4_(n7+oVNP^~)Vb4~iVOd9=TSfl&!U}*?R9mYOtiTha$^2`#pX+R&eXV6q1rmFX zZVTze5}HgyW^>H7x(6ZJR9w}4KG8^>!MTC9=Y~8I9Bx4A;yjQ&DY^kSzFaGbWLao$p?d7OS;8U=dL|d`l73627fARZVPBec7S!)8tfi? z5qrC4&I--Efn4F7FLoPjgS3pg%eDbSyUceb=PkEi%X!lq@fL6ho!ihkSsmHX?bxVG zD^S;^AD5GmPQ-P-0BOj-d*LZ~;p*iST)7+`#(o}9wS|736lk~zX+hW0&Q5^nad5Re zFSDg^k}l0J!+?Ih>zu0|YKF(@x9N8zFhIN?-tG;0fDgO<5;6)%x^3Wz`|n=^D&|_{ z_oY)ZSZ?PzSv~zPDc_<$?9xz=&~`x1rNgJMCEy--gYPoQP6eftg3GoC)=&?tkb>b( zk}jL%Rqe7qc+iL3UU03+zLK;-x6y5~Hadj^ZOENvqv%?TlsnQtbeaXEjoef@p2#5< z($@T*Qb{(iXD^5+ok?h~eE6uOruq4EF3(xzutuMxf0I)QC9AD*Pi>QOxpnkOlwCVr zKH~2x&EWTtfj$G3i$*x9*h_3)I$(~F^0PJFsq>%&8mWJOPy!k-Fe(_n4u(HO4uIfNfu&}Or}K0esA=c1`ElqQ z34PO{?`I%NDCj9^e4m5RPf8Tvh@H_fdVG;F&@oIb6UW3e#s)4)KB^f6vO{R>IN*{={Uy{$sQSt>jwueasEY~whvSO>J0C#PYj}M^Kt06}eEtnZN z+%hUvno{><7a%(zl~LeK4GtOBGZrRQqL%-*2Ux?U?r=H?ham0lJ{I{;K&T!qRcfSQ z4(X?Nrn2bKaw9D6KXp>1%V07)_vlI`tY@;AY)Lez@xm5f*?h$z*C9pEjN=MT3$Q!6 zOdgXjaees^Eg-A#TiC6y$#L=x6q%=Znt*@wvA_!8N_3v9$T65fR&gK5oVpGPrII$xaK)3W_2ZS1SOMc!G9#FL zh(ceIlQ8lx4BtJ?m6L4O1&AVKn(|Ei;Ck`d=yGY7uK> z5$i$38yFXeI1ofU10tR#fBg3%PG+V^A~ut=YZ(tY_x~y4d0E6Z5Yf*BK*aeV;@=?R zpX9IqUc?#9EJ?(fx%q~CT~zw9)2Iy-}%$~{8f_67Du_9gaZb_ctYeT99MeT{vceS>|IeT&`2zRkYF?q=T=afFB?MI0sK zXc22g%!ybhV!eoCL~IZ-*m<0Y<3(%~ae{~wMQjprl8BQ)5nm_b>qT54;^88$6!8cV zSBZF}h)0RITEsOX9xdWp5swk^SP_pCah-_Ai+F;FCyKb9aGZt<=OVc%E}G*w9jE7F zI0F~U#c}bRkxSqbITM$}C39vjg|l#}oRzb2XFo1!#tad*KmqFI>kYG8w=; z?Mx9t&wCNGf?3UMVzw~PF`qL>nJ<{Hm~WVGneUk&n4g$mn3K#Y z<}`DLImi6T{LNfoF-x-sxDW1Nd$2v(UTkl+FB=4tSpiVr4)?x~!maM#K_fY;DwS77 zRP$7~sFtYiP%Ts4sk%#buWF_00o8-5hg7RoYgI3)cBwv5?N#kp9aMd)I;=XXIv0k+ zRAK6{@UY0RoUo#>;bCLLn!N0h+I-nNSx2spHA6IWzzp37>eoy_r`a|`{>OJax>QB|5 zsee?TQvao)G!dF;4X4p-iZmsfVVdEZNt#wohh~xHPR(7Kdo=fH?$~KC@2=5hM9zH6(A$)SUFT5jsLHP3U`@+|U zZwr4R{G;##;m5)b&xrqeeuLsCiMhMBN&-AZlUM;;1E2cSJ3Vx-;sos4Y>?MZFO9Qq+#9 zBT>hqzKA*z^<&hTXdGP_T@>9Xx?l8w=;G)>(WTLz=$7c|(F>y&M=y!KBYJuCuIP`V zzllB>eL<_y#%NQtsamTxO`D<3)MjfP+8nJ@o2Sj!7HEfSM`%ZCtF@!GW3+YJMlI3K z)6Ul}&@R+2)-KWBp<>WXzkb>+J2b;EUax=Ff5U6XFI&ZoOow?ucpZk_Ha-FDqB-G{mZx?{Ri zdRouw!}J<`guY1MN8eB1Uq4V^q93F$)tBjq>C5$#^i%aS^jr1Y^iS!Z(LbkuUjL&0 zW&Jz)-TJ-yZ}i{lzt{hu|0$+NOmWN&F|9E(Vs4FD7PB$tm6-i8U&Z`oh%&?*(hYfr zA%>xba>Mn8;f4{0k%nr+XhW@Gtf9^@!BB5#Hh2szhN*^yh6fDm4Nn<%7~U~_Z1~!6 z-0+>@gyBcS&xT(OzZrfv{9!m7n-$w5wr6Z%Y*B3Q*uJs-V+Y2T#14ub96KboGIo6I z#Mp*dS8QXfJGMF26MJjyy4VA;zr>!6y%2}us5mB06_*mn#|d%HxV*R?aaD1n;;Q2& z#MQ^S;^xMYI5BQ<+>*GhanHr=jN2XeaonD`eR2Ea4#s^RcOvdw+@EoO$6bh5#V5ww z;tS*Z#+Sxd#gB=JE5J$`fiWATs2Z;gK<{>k{KoCnCMPyPV^++ znCMMxO`M)MD{*$>+{D`w7bh-Byd&|x#7&7?6W>bwAaP&fFNtSOl!-B^OlniODbf^e za+q>Vf~l9Ow`r8A#x&YA#x%|}%{0R_(=^XC-?YHA(6rXH-n7BA$+X$@y6H{RTc)>7 zyG5~jesY!)NMM-^<`XvoWs!4JsH6=|>>PVWCbaRrJ zbW745N%ti^l(Z@7Ur8S%eU$WZ(w?NfN&AxyCLK!pE!m!2l-xggU~)-vS@N*t>yj&y zE0e2|MX`N8Cel2<2hPJSwRXY#AbuP48kyf^to@-NBf&6Ihdxx_r!Jj6WI zTyDPJJls6OJknfk9&H|D9%mkJo@j0`yUdMdx4GHuF}IkfntkS*%mH(|dAfO~xx>8D z{DApE^9J)K^Jeod^E>9<=1DLYbLNjaQyB;{zzcPS@Q zezd49;g$$XltpXFve+#SOOC~9sjyU9Mp(vL>MRp1Gc6sK*_K-^w^$@KHd-FB zJZgE{vfJ{mWshZ_<$&c^%WsxbmeZCqsoGRssy@|_8kgE5wP$K!>cG^J)WNAusgqNi zQ`=Jgsln8HQtwM$nYuQ0ed@;4S5jX~eLeNf)Lp6Xq<)k7ZR&TaCsR+Qp0>tXt=2Sa zx;4|9ZOyk9SVvpOSjSpj)<&z_I>mac^)~B5>z&rStoK--us&&h%KD7;IqQekkFB3r z_geQ`Pgze}|FB-LAsb~&v8CFqwlrIYEz4G7tFVo+xoxdB(YC<0)b_A#jcuK6gKd*- zo9#8*8@9J>Z`*d;4%)u3owHp`i%v^POHH$-rKe@4^+~%vZFt&j=$q`i~&S=!;WBWd5J<8*bpEj>5AHhn^RNBaEqRq5-~Urv87 z{m1k_($A)!PyZ|ZpY)3vID^he%W!0rW{k|J$*9d3moYwLV#c(Lg&B8d+?(-C#&a3Z zXS|s4a>mY#S2GS}{E!)u8I`Hc)MdtG#%9K6CS>-^EYGaX9G5vhvp(~N%t@IYnM*UD z$b2&M>C9&{w`abP`BLVN%tM(!WuDLcJM%&o&Z4u}EOSa4X{8?rWKZO(c{Xiu~!+0Ax~-D*#>XV|msb~|qu z?78-Qdx5>sUS#iM?`I!iFSZY|m)gth!|d1DE9{l_D*GsVjlI@B)?R0yV6V5|V4q}f zvQM^8vEOL-+FR{ycE3GnpJtz7pJktIpKB-fdG`7CrS|3a74|juM;(GA*OBiia1=U< z9DN-990MH1jzNx6N10=o<2px$qta3380DyO)H=pG>Kqds^^O}HlN?Qs$&M+G8y#Lp ztE0`~cLW{N95WoV9J3vB9mFxuG2gMkvCy&DvBYtQW4U96<8H^jj+KrF9IG4;JJvYX zIW{;pIW{{Ub8K-u;ds*VwBu!dGCzfH;ivLG{w6-axAW8anS2L7hrgK@`CIr~`P=wK z{O$Zwei?r!e;0obe;^Zbka%luCM zRsMDUO@0^u4*xFyFa87mBmNV9FTbBZ$bZTo=8y2l_%Hdd`Q!X|{0aU?{%8JI{x|-2 z{tx~vf1dw~|A)VrgLCK{HYY4clM|5>mBZ!eb4)pJ=e(Qqe$GcZdvf;Y9LhPIb2R76 zoNscz%lRSa=bV!{zvrCEIiK@)&P9O|SV1jB2+@L0FbMHNqL3_D1e=f{WDC6D6!L|h zLXpr{7$B4grNU6*I$^j_B~%Nw!Z=}q&>&0_+`<&0MQ9an5`w~XVU{pQAi^!e0%4J` zL|7)Q5bhCH3J(eo3u}c9!Xv_C!dBr);Td7O@S?CocvW~qcuRO&*e$##yf1txd@Sq{ z_6Y}sL&9gm=fY9p3*jr_8{u2wd*KJ+C*c?2q;N_&Eu0a~34aQI3m2ToNjVv(%BgmS zJ0qRZPR^-!8k})XqchQ&WG+MT>paOOJmodwQ9XOXjyv!8Q-v)DPv zS?Vlv4s%}TtZ-I3tDK{pHO^XRgYyRGBxj4$>uhyScP?<=?tI9($@!-96XooNl5SDK Om&&UA?fmWB`~Lv$$_2y# diff --git a/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib index 21280e173643e20fc93d8daca20f61c5dcbcee4d..21fca7b92f4972e1b50874cc8e7e29983c35c4e5 100644 GIT binary patch delta 6220 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 delta 6472 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 delta 3836 zcmbVO33wD$60Yj$o}TWRzI#T(A(050kU$O~2nZw`5<(_~aKr$C90Mc_8Av7xY{*U{ z;DL%rFCrjUI7I}xF_4ZfSE80-h$ci4!j4eU^T3Rjj$c| zz$b7NPQ%ymE&K#O!!K|duD}hriGVb+D4~pxV0~QHf1Iut-2T%wAp61YGO zr@Yh%s+96kBdJkT8D(Z+eam?2`89q#gxK5cW@!^4L05PNxev{M-1&dx3@^LR>oc?$jJEV{(@tRWgXoYBwJm`0Z5qk zWfN?^-!4}vG+sui!$D;1fYB=m5S?z=m2&4}~IqfFp%Qg4dy2Z4LZyg(% zkX%#qCCq_O3Cg{&4?YX!v7hjEfDm~IzJR`P#B9s;l)i*xaGZFZfUn>roHA!}(dm)R zx_P{n9)EFRzS~pb>Fg;Vo>uDjlnu!*^u(q5yhUNS-@q9HzpJm*Ukl$r^kEX^J2(s9 z!#Vf?&cg+`2tS%MpK1SVtxCB3#d3I5KD@jNkQNgiM%mh(7j!j6#H?4Y>yiHxi8mo6($zS>y)EuIlQ9_?EGe ztrKcuBdbGoNJ{uObqK(IBHsh3-6;f-Z!;swXks)q>|em`ieMd#z`AfMs$&xfeH2H1 zqlM9UkR0`&%G1j;w8EQTb{jrEN{A2c1F{RSAx6SPY=m4?P%_wr2 z-|s68*E1b69;oNNa%N)BoIAdOMVR?eF&|)~7iJSS`rutMj8vne%}6oY-z#TgYeL9v zZsPw(ZW`StCoe=!73SX|$FLinjkcs+bu#0`#{;2#{Q$C|IE)}G2_u7%kZW`^y4s9q z?njmogcC-V&?5Q&s#g z{~>|k#D^sEJdsE_zJ!xt48DS|lGQXKk|_h-*=}Fih@1v zA$pMPtga@u_~4dFXwibawl?R=i5X$NF2i?12SLB$(js3~Z_kL4-h98O7MGD`Ulke) z`>nv0gJhj>P+X8%;rDt-Ybz}!=cBJ|0j|LJ%=St>wi0w)i|fq6N?pqa+-TN>zBh$z zRm8T9*tRHuqxs+7psKh7QmX_uwa_2zzk~ z?!(V;KYnhy)E0WWQDS(Ep+>Pm7(Ga~cP@Tm=Bf29NARdwqc&i^#A6Um-s+ii)jZ27 zJUvyb%Y2Qb=}*<_m<=`OBlp5r1j7?N-{UzFK3#kIKAZox?HBx&*yd`@@3WQPw*3>Y z65Cm=T~oY8DJx|a|AbW1u*%69?k8tn1=>ifX$V!=3r6EmlFnG%XZFw|ic(4b-H2{7 zNHSFifyjo^ppj8&&_rq}BS(74c^2&dVg75WM{0u=58W%Mh|p4?lPA1b4p}URwCNmj z&&VM+jT~~<$bm8D9=&1PE~G=G6ROD~OxMy2>BaO?dKtZ(UO}&q)*Z3=t~UCL@1ldfGuW+vm;m^JCZG9tJn#w$xdUZvoqNF>^gQEdw@N{o@Otym)NT|$|l+(Y*Drt zTPs_C+j!eV+Y7cAZGlO)S8S7QuiK{DmfQB(PT0=cu5t{=a}G}AWKQLD&c)T^V!0%) z9oLEL!DVt;TsBw91-R$Am$`Y|a&9BHo7>MF;0|$zxue`M?rZKR?ix?=GOzMF-+*t- z$M7Ba6uuMRg@1<6<%jYmyqB-wU*Mj_EYxrjz=9y zjub~fN3mn9W3pqmW3FSVW0_;QW0hl#W1VBYW20lUW1C}#iI^^Ch?!zfv6t9e>?`Jo&x&PYjksD|E50vo5I2ci#BJgZ@vwMAydqu|uZuUt zTM|f=WC=+1r9M)jG)yXyywWJCT&j?&q%l&pR3inXkEO%XQR$d;Li$enNxCXsmu|{d zS&|#eF>;ceDyPX=@&MT*d*uo8Yw~J&v;3KSNIouqD_>Jkk(I}kD5bITgc7Z^RN5(@tn7wbR-++PB(S?UpX<5qd{GRqw2KZKHS7yX!r4x876lrT5nR>N$F@K0wdY z2kQlTkv>HC>7(>=eVjf?e@%Z=->&b}|E}-Sck6r1kLxxNes(_LjCMA4#yOii6U<9> zn+wC7^PLNvi=0cGZ#&;Ho7EfmlAo diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib index b1c45c536ae89978d22fb5c8210db6cff58fcb71..a457c2f643078c1f19e21fa8cb2ce29e14b0ed36 100644 GIT binary patch literal 16656 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

KyTNXHmU}$+WbSu)>3NxX);wFDBd;j0 zDz7@PCa*THE^l(){Je|vuE@JB@1DHJ^PbMzlJ{2LJ9+Qry`Q%y@8i6adEe!IpZ8|Iz%n^7rK*$^R_>i~O(h zzsdhL|9JjS1-gQ`f`o$Pf|7#Lg7Sj71@jATELd6ac){j^9R*(%d{^*&!H)$$7yMfA zd%>TDsL)=RUpTn1vT%H1P2t4CNrm-=k;2OguP?l%@Ug-t3O5x#UAVdM*}~@wKPddN zD7Hvf6kn8BBorBo%tgsXQql0DnxctClZvJkO)F|BB1M-JEibyF=&GV?i*6{ospyfS zmx|shdbenI(Vn7xMf;0>EBd48KgCQjR~%EUD~>PDFYaGlQ9P!&vUq%PO>u2;xHww8 zpmR(!blbn)-58(cTLZgs72-QoI|>n_(l zu2rrzu63^aTo1S&bUp0a=z7fcglm)QY1d}gv##e|FSxe4UUt3Wde!xs>vh+guD4w8 zxZZQU@7m+q=i2W&=sM*3#C62=nd=MJSFUed-@1;wPP)Exeee3w^|R|&*YB=B-N?gnt0?-}SR^9=C}^9=Wl^o;V1@l<-MJk_2F zo{64Go_fzz&vefW&rDB~XO?HSXO5@E({ zapHKfMywU<#L40mahlj5`ou=jFE)z-ajrN|42ko_h}b4B6c>x_;u3M0D2tbhmx))1 zSBck%*NHcXH;K21w~4olE5$p-yTyCO)#6%ly?DR4L3~JjM0`|yTzpb|N_g6 zMSM|wN!%uG7k7v|#W%!V;@jf8;%@N+aj*EHctHF}{8&6Jeky)0ekpz<9urTB--*AK zY%Y1OvPr+N4ENyR=l2rRCBU($&&+(v8wB(h6y%beD9mv_@JlJs>?K zZIm9DHc8J&&q`aQtRcWX6ru4S-uC!bFK-w#PC>@YKl0KFWOP@-gOJ7P~OGl++ z(h2F5bXxjB`bqjl`c3*n`i~cTS+B+$CN)my-shA zH_uz(E%Lg&9&d@)>+K2WQ~G%Oc?Wn0c?Wxkdds~dycOQj-m%_s-tpcVZ>_h^JJ~zM zJI&kR^?4h;es8lk;GOH8=M8!1dn4X9?^5qFuk5|rdyV%x?+WjF?}Ogwz1zJ| literal 15480 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 J`a4JW{{XD&Bd`Df diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib index ea967a112bad1738f1fba9c3919f8e5cc01240b8..92499cbb12a667ba96930698d50d47c843db50ea 100644 GIT binary patch delta 6321 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 delta 59 zcmaE7*JQcj3F~AQR*}i;IARvRU}M~D#x;X`@&(a1KwLE0Ks;%(gQV8xec}y_n;j%o O*f`V_lo+fTxEKJitP_#| diff --git a/Sparkle.framework/Versions/A/Resources/el.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/el.lproj/SUAutomaticUpdateAlert.nib index 4cb03b9f8d6ed5dceb152a49e8912ffc48e388c4..a3db760fe9d1a3a898fe43048b15003dfd0bdd18 100644 GIT binary patch delta 4244 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 delta 4172 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 I%pLgu01fL=OaK4? diff --git a/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.nib index 390bfdc97ebf2e640542f2c4ed7a4800bb0ecb81..157168bbc45bcb2025f5ca94dd673ea5251a649d 100644 GIT binary patch delta 7850 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 delta 3975 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 literal 16060 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 diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib index e962ae2f0f065b2594fcd08508ed94382a3183db..9c0c887c0ed8bc11356d02df4f441b7d277ab331 100644 GIT binary patch delta 6470 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 delta 6504 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 jz^K54KqxRTur%;);Be%xK7hi5qzFg{ zGlT+R0YeHyB3RauAqS|Yh@oWid|C0yIy_vH56Ey#{=y-^pU98|meT|3(qhn`yq-;b z^CEUNMw(d3GWivkh;Sm%LIs9$pz})@GJvc+hWyDNIfU7foG^J2dyGHG$%#NmgS?mv z_E;*A1#)mcLn+w1ApM!ZAW;DF5uR0m2TKOf1dvUsKt1-86*)yG%Q13Iw&6(erK;JR J_i}s}2LMihS{ncW delta 17 ZcmbQ@zQu7vANyt{4lBmZE4bf?0{}jc2A2Q; diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib index 06e1a62b3460b1b66634722a4fe642f726dd146f..4fc4bbc4f790fd35d0796866fb51c7bbe6151456 100644 GIT binary patch delta 3953 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 cZWUzL<$wI2b)R z3=45Ij=?hY;sgv}HBQE9A^aUS;0&CJ^Kd>siwkivK94Wpa$JF{a5cV!FXLKVha2$? z+=AP27w*Qt;=6bdKgQ$uDSn10@HC#s3wRNm@msu#*YQWZ!Ke&jT+H1}7bY7@U>r0v zKBfXLFqMp-nZ#5v0j8Rn%+xUEFpPz< zf(LS8sJS@mo~V&fV!jtO&g{z)#~4puUTKZjTQ%HU8Z;NP71oCh$tVzvd{g5(GH$n- z#^%<1if>;rBFlB80%8vpoWj!VH)Rv*0l(pwAO98w#P&{GO|m=RlWL@JE;n z^I$%h@QgX#a=yb-I`{=x1}{PrEQb}a5>~-#`plw#FT)yhCZBJMr7>$^9ju29W;35U zW)r+#B+H(>{&ls%z@*{c+CW`RskaF>LHr@O7dpWkuw}F-FKbe9xwpU9?_W+E-h}v3 zbOim?60!}pw}y=JdFxlgHh2qmz)o|P^`4Hu&Z-i2(X4jE9t!E5NKWrk^$N|s)*E4)Gt; zS-ym?;0&CFb8sFmz(u%ZvSP073T;*4AJ7cv%yD9D=%4UiKFvGe57aclKkpoQEi&@D zkzgbmzcsp0R!iv;H39z!@6=#q&_~cR<4@rkGm^kahyX%Frbu>r^1^`weO`ZAnA#Pz zIVwywHDP*b&=;r*{lYkMXrYY%62B6;7RDj|liO?*AsnqJ+)lXRHj=Hz{nX2nP$at= z8j_Q`CB~*DHzvk5M07|={tr5Y-~hGnLDX7>p!V%*q!^uy&W7zU+*Abb#%OEu(9mAHvPSh~p+B)YY zB~ib)!;sxcX^F8Z?#9N#26s2wn%XU?@dS2;rI?6auq&*<`>CUr(<%335+9;VE$TWJ=a@F5VkYW-d`}#Iy=<1y-vT6_X$!!&#fpQejz)E{%rBBx6ltO5gI z45LLm*YKD#oVB4}iYhKJ+8XVQu$p=GzF_IZL-;39aS=Y(S|B~elf1@oBkxv3xXR)Z zTv{Y+tsaO}+q{-aj7x4-VqAtVj`QT@)CG%6{ND7Mn&N58X{xb{5_6BA4V$7*o-R*-MSlvyBSFYm^&4 zgHm{i?%YB=Z2Hxhs3UmPd{S-49m7u`p1!p;*Qw*8PU7dLq_yErAuZ_i?e0X%l*d=n zKTuUgkM2OtoeS567p6$h;9308d|2y!*DX-Nn|yZ={xwKx0zh1Y1`w_2|d z{=_I7WEFpg4C=F5dSVCZ30H?!T39+jJr0MdSWXk2j_(_FhCnx|Y(&$eKaN&UH$DE- z=#I*uYz?A*%Aq;e9|CG8MuRwGiouSh%2rqV>4_FT0a}!4V(w}R%O1H|#52*6^+Bgk z3xWcQpnz8D0(#XbpqGsTdfh01Y35PAL(c(p{cNfXU4>ptn6BZmZ7C1`19~%=bnfzN zq*i0BG2SRK%8W{*%9z|b=a9&pOb+8QXA!r#o%jbo0=-xP1nA?8WuDJWr{HYdBbh2D>jps_ZGHwDlk*nbR+yd@-ZUy%j?jU!9 zJIgh5SGn&(-1poy?mBma``N-+qAaY%VQFKDv9!0uTH-9fv2?QBXUVjTw@kGxu&PwN`3(_U&vh+>JX?3PMbDblcqnriKvCblAv9r|ab(TAQ&PwMI z=NHbeoM)Zqoz2ecGA|3VP1faha*CWLr^`d-e7Q)jkZa}N$)>zi-YxHwPspd`^K!Ey zD6-N)NmAU(14?%#P03Vp6tCh}8kDD$Im%pRzVeLHq-;_`o0TofR%N@gS2?3{s#A?t z+p6u<4(dH>NA+H{tD3H6sF`YxI#CU%v(<&_4)xFKY4xHOrHNXcmaKWSq1te5gf>bm z&!0Z-^;7z3{Y(9feonujU(zq@SM+B6s(yoXCuyVy=|%dGek6lrl7VCp8BB%{4;e~^ zlM!STDIkR;G=_{L<4FlABNNC(QbGKriqw-=$!p|w@&PCb JyY;`z{5M%9Y&-w} diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib index a59b1afff686c1c19c27a0157bfeb33d2da0c050..5ae5adefa115c69f3f3232a3cbcdbd76ec981f48 100644 GIT binary patch literal 16762 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 literal 15586 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 ei0kfeKfnFs_vZ7;yz}lk=X?5HH}Xheo*GYQ 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 H^>P0L)^Rv1 delta 6526 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 KkDeGL4*Wlc+fZ=; diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings index ee694079466290bb0a9a2ec01e38d2d8b8bea0e4..8922b3213e3a9a8f5de982f84330b80e6a8cd56f 100644 GIT binary patch delta 469 zcmaE0cF1N!25YcBgBF7Vg9}3{Loq`#LlHwJLjgkxkj!Vu1B#ab#VdfM0z(>5qzFg{ zGlT+R0YeHyB3RauAqS|Y2&|@@Ap^+Ho9xIXuC4$yqZp_@1*oqaXjTr8P6X>p0_)HN z%4sp^PoB#nzPW}~iIG+gnS6>vLN^g;r2^0ynLuY|09koJ$6z`Q$w`xISY!M_9!msz z4HOW$VDF~_S&0luKz1qE!ywZj-Yi855(S_;;o^*p6*(;5;M(0As@l{Qv*} diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib index 7bb50b3529683a3a8b110d48cc29674999e31a41..bc13d0c06c81faa50e4f1404a05506619fa8324e 100644 GIT binary patch delta 4032 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 AW&i*H diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib index 46e6ee95143dbce40563af3d54eaa98ac951f1d4..f8f1f1c37f799b47ef73cecac3e8d8149d6e8001 100644 GIT binary patch literal 16684 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 delta 6670 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 diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings index c7b221b12b2be92af6c5e97c70f754481fbb73e9..6577569feb5a6d42e00687e463ce9e6c5cff7491 100644 GIT binary patch delta 443 zcmbPb^~Zk0Jl0@+1}z2!1{a1@hGK?fh9ZVch608XAeqmQ2NW*>idO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5tYH+eso_~Zf^j>%V~1^5#glE5nTfO@qU^e69U z5#PLtHGq+Z7PCx_;1m%~1X`=WP!9A;3D8*zK=0&Fz9=osj^vQZn^@-^BGFP-U8{*1O|@+kdN@V0z8O7o(9>J%8)eitm5P~tQPFX3@Qu`40;pO N)v0U#=I?CEVgQ|eT;u=% delta 17 ZcmexkKg(*vJl4%dY$=SJpKwZu0RTjx27v$o diff --git a/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib index 27a8e8d7c7cd0f1707bc49a6fe9153a4fdb79de2..3550df4c34d6bd559f73a3f4b1a0ae9fa89194e0 100644 GIT binary patch delta 4072 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 EAFcp_ivR!s delta 4051 zcmbVO33wD$wmzp))zwwqU0vHP2n2|rj0p)Q!LSGt!V-Z%ha@a9Kth%#3!QXGItel4 zbuob3C=aaXxPlNi#f%%GEP~+3Fer+kvZx^P7?4GWi3ozoyxZMG!0&zUdoxwv?W(@# z+pz?HZP*Wg-w5nsYK z{1d*8Z{gdx1-Ii4{0r{FefT+kfnVZRcm$8*X*`2xu^oTF3-~i$#a|eeA&kLvW)hi9 zD24)PXDXOVIK#|hd`uNn&G?xbW;RpHSlJj8HJ^EKeE>g2oM?@Xx+mHV8E_wrhA}V} zGGQEy2NgV!1rx02qHc?t1jW{eQ3X~SOI*`Dxw$2^UT<}dwYQAwbjCqwNM8EsD}nRS#$FzIab;P)^e7QjMy5c25#2s{e;kZ)b$>g7d{ zxCZ_c7Q+&F0xbA1Yp(5dk7ac53$PqkKr5_-Rj?Y?z*>4Qr0peGXD#5TIAW*deQk-i71l%Cez*gA!&~t7R8Q`hs-iOQ2(Qn# zl6Gu_xXE+`{TFfB3|l%}CRcbHSHos_2e!gCYoYzNUN=WI3%1j!cEEcS();00vlW2yt*+L=Wq-o)X4UugvHH*lQ7&+u0V zTHzar`<%{l0{#Xk;S_uer{N5og>x1wW;xE&UKRcU?eMKtAjSrNgo{&X+*e|7Lz#*srCW&BtF)yPE{hq%MH$S6!W+EKWba5KeBwwrfR zElWb7Y&16~C#5FD4oq%Ih;2?y8ki8+rEVB|h{W(60b{U@R=eo+$JR zNd|jU!TjJz$mvJrk`h9kJTQeKPHAb$Z%#=~N{Ahhn$&Ux`@k|xz(ni|tMD!=sFifa zJ(z^am;!sTA56wn?2iMW0SDndI2ecEz1D2!zFjMFQbtIjcIR2J&-pFPaPRQ%<4X(zl-{kTZGIB7Nk}(N?<-#0p z4zru-=Fl72Oz9u`lp@^pAM~$r)AKqx1z~a;v8aO_(_xM@2h(ab!Wt;W2E(8AEy&8S zoFc1?AcGpnH%FTpcJscQktHY5{9H$tLSO%ltks2qkvZ6K6SA=s*(h_2^^HU#$ZnF) zTx_AZ!hD5MjW@^HZ^cBlpE@w4q<$eKB@b+AIr>}q;KJVs=s_x=I(!5lg(iFqAE#I} zDxt;GJw0}G}}klR=h zC@J5MPlJlj;Ikb?)l*dEHFM0|8y=y`j7xD@p{#WXC%j&6q(v{VIIyL9<0q`@%UjUQ0H z_uyju2tUTX_(`E0WA)I8HCBz$GtElVYnGW6CZ%vcRX{#|W<8+BL><6`)-!51?hqb^ zIQrJr+M*Uj9mTJ$7_AF;4Cy97-#RByrXuJfunxjdnui+;*M}CSpibf`{KP8L?(KBL z7PxNvJD#VuE!tf-+3K#_e!|PthWd~`c#TnBl~w#F45uZnj_&dSx+~VBomQhB(1>8cK2a z-W-D6oNmrAi_KDVmRW7i?wE62cur)1B- z74}v3b#^_wfqk2Ohuy|*XWwIwut(WbY&*wu(cJA^5;uq&%-zeSap~MhZag=QE8u2u z#at;jlPl*cIUn~V_dK_X+sWXT@5%S&`}0HjF?=>Zjj!Nm@m0K^uiwg(@zKW1NK zUt)j4-e&*E{-ynI_R9h%h=Nm)1X)l8T`+{MLW0mw7$S@i#tB(Mwva0{2tnaN;Sa)c zp-tE%>=O10`-D%0&xM1+Vd0qYop42DL|IftUF;^_A;yboV!Aj&93|c-=8I)wrRWpu z#fQYj;?khFMtnouDjpY4h$qEU;%V`$_?`H@gLmBNh<7A7`Z|&vDUQ1xqZ}Sbwjx1F1uTb$dR+nwJzueo@a=yJM(lBt$D)Yp3fIiIaFqkQ|ara!ZP&NqwY5DMy+pO_rue_e)cy z=~AIILu!&1NSmZB(pKqRX@~S@X{WSH`dm67U6L+KKTB7oYi@8e?x>(U#y!bh;x2br zx_$21?mBn9yV2d`Zg#i0gYFaVf4F~e|LDFXgDl8I?j%RcJ>@=fx||_r$px}ku9D}- z^W=x+6>^)rS3V@4mCwtU6i_-T-IYXTs4`3$u8dSNlpJNMQl~tiJfb|SJg+QMmMg8w zYswBK_-AFOvP;>m98@l-n%YhMof@b1Q4`g>)MT}vIz-J1QNm`mVO)Jo5XvJEoHd8Ct=4qDpn)ZhFruLS$QQNG&qwUoWYZtYjv@6GgV}-lR9{EqYL&r_a|P(--NB z^=0~6y-nYsf2AMQkLkzt6Z%R0Tm6iFPXAs%uea+L^o#mW`W5}EevJTOh=YtI8DumW zOU4lonLu*LL^7G=k$f_Z6p$IDn3R&4q?`mRiH}s18d6IFq=C#K50JTJA=yT@llRE` zkEbb!NB(cqX2OoA4aG7%#y~@s)T5z6#%nZ^Ad@TkvYU5#NKiQ4=z22o|yNNO}So|-~6P&27n)Ep{8wNMMGR%!`#Ikk+sl3GFCNUfsQP#dVbsr#sh zsYj^CsK=?Nsb{DcskfLY3&wV(Qwrf8aGXqM*aC_0)p(N?;EE~JZSC+(so zx`gga51>cTmGo%3njS|_qwDELdNw_mUP!mnx6|wB&Ga_(8uXh^pEs!^q&mF=okZ&#H2AcCXdNy3YbEsh;cI>rVG=R>B;nB`Z0r;GG-Vv zoEghZU?wwDm^x-E)4UnEA{?MrM{WmowKe*D}{JH#2LPwalH&Cgwio ze&zvYJM%R24D&3rlX-=CmE~CzYi8@%7w{o;8rvu@)rc*46q30t&dOlU#@RUsjk#&A8GO1K_ePp%i&o9n~%<@#}@Tz_r= zH;@~|m2rc)A>2@|oEyds=SFZNxe9I+SILd$#&A_!H8+;4;l^>}xd~h?H<6pfP3ESc zySO@TD(B^ZC z#i4kVfOup;Mr1-}l!%g0GD<-flnTG;C~O?ISc{CRdFe+uY!d`1&{bLXkZv2j!wXlwYfjAAnZlwU55=6zJL# zjs$0Gi`@wA3dXlDeGe)E0#4+DDY@I6&w9dX1A34EEF9Sq@xr>Re34DagNjkX*orFn zqV<%}(1&<4>VmqWZm2sdK|N4U)C=`SeNbQ250#?+XaE|B2B9)E7!4uO#6h}~L1YwJ zMQ$hS$>-z?a+Dk+$H{5(EBO!kOUAT}fgyS_?*lXp4M!tjdS+CCMxjcWbXBk=RPO`9 z4f2H}{(x5z^SFwt5#DLOCg7xw*ogfA8iT4(HS`;cYS1_|9!)^CXd;?~CZj2+4o!t? z8mdQipfdw~O-;~$a0nPy$7g~>o0>qlBZ7_odT-MR?}A`UWRO3k=~EqV1;W9KV5Bv_V=?%|Pm8`-yKQhJ_ZVm<-d?65ARZFukG}rH&SH~L^HS)~^ zg$PGNUVk7GhDFUC+~jQxPpGIW3n+|kAO;c>O{_Yihbz{AV|5?FLZ+ieSc(xAGXwe2 zOf(BMq1hm{s+MWW*kK@~E~Co7&_@v2N}eY#kOc;e>iDGA)?%TX)7quSVyCsWOOLKj zt0*j9tVysLg*T!(C`95&0^tt;g%&gy%|r9i0<;jdqD5#iT7oVE#>r?Y2x2K(2A2$! z$M}E+Ab>jF2-BDmY-ws3;Ono&tp@exV1Fna=^u%N{L@+@z8VoasY~|;BFc1?r{xjf zY*4cH+cl!fq$*!MaId3h9d7~(=igIWf>oYRg2bEtYWvag(T>vINc|x?9%(AQ99^l- zOcU)nIc!ABQNg7af3>>!Yhm%%YKtfFJk~i%o$aG*W8Z*Qf-dzBg}e(kq8m`bA#@YE z8Qp?zMXS(l=ytRk-GSBsf7hZr(K>V&T8}oMjc60vjJCkg_n@t48@dV5dpMNV15@fLHQVkS_*<{R%XCCh~&A3xcLw zLB|7dg#q0}+U~cYX1Jz9%Mjde0zC~uyD&UG4Bw_h{}A+_u8uKX{X82q*$1QfQTPM& z5PBFr0_=YjZAXux$HDp)Qvv&%u5uB+E6&wXnyX3G5SvcSBoSoc?%&)D{%=7TRCR3m zU|^9Z?;YqV=%jq#h<2cYz33Sj{aN%JdLF%?NUPmn15>~qsGdu8-^s*6Qb1Ew#wt#2 zoEW=@$&~Hrl0XgeC~JrRFv_ zqPI~&Wu->wJ@h{4gVsjTip}UfFp<5e0Pglz!>4k$%|&WmK13e@DXq&E^dZ`Z_M?wc z0q8@!+GySl=GWo=>Uf(MeB^9!6yQ*s7Leug1pl;AEs-W) z1O`$uxFJRC+}pi1!n*`yn>9|AX7i;k)>U<~;G37{}F5DSdx z82TC=2U|XYzJ*xu9mIipbQ=EFp&!tX=qD8cREB)heW8%AVWfAy<|M}X8zM96_?(KW zYH;j>{l2D#{!RYIz-%z7F)%?`k}ndj(Ga|bA_5Wrz~JoWkb)(Gfl4ss5a0>bvkh%& zY=mIZevjmWA6c?qRXLIqO^S$~r-)uhx{^Xt03f5ybxXzFG~eCDX)W&3?z?|geD`nY zEXgDJgg*#N?CiV$xX61SMoTg7@ZTMCh}V&919twK`#XHj{XvJ?R;jDtwD#!HWAQ`? zFYpom2#fcF%UcZ-S&Ma85ANuR;{>!38&oa~@Yc_23YWAwwV4xRN zEZC?#0xQ!76^NVXh>Lh?G&`PDuX#H4>0X?L%|OM9Z8#aajGN()_(lruZtXwa5l<6A z)l-~}bJ|DUh_g|_`P0i+r&mY>A_6rDY`Kk4$NJidxfEgp1k^sRfQwas+M#5sRboN2 zN{zOJyR@-NRl_YPU}h(ih-}Rng5pq_+wxx^!2xQB)MOSQ4F9No-S0 zT#mvU@G#QrpOg}!DjtO^VQ!UpjG~ly6p7dIQI66nng=E&{Gkc0B4}3ku7ajyZJ$5A zD6)2ntGEV_14WyFYw<)Fd@|aG>maILts;YEFtqw%`O;D)Bn>b|!yVF}l#qT9kV?mw z2NZLj>FtOYcp9!(;)SEMP@9&4F)M+gbAv{u0naP9N5@U}Yd%hMZk?qNz(G|CWu)St zq!0qeL_i92J4vAxFCs&9WNezyW+k zCn-2eYlym9QdZkqtk}6Cg4)&|J-TZj|4{;Hy()ogR0#y|_3aV>evbrJmyr<)tAo4& z$`iBO0(}HrmsS0y1phEP37*-DLZj0rDmXiIF*8@;+f-&&l3R)WWAHdt&~G}Z@;LDI zfcfzqcnw~Q?*t|)YPf09jS^Y<47f`R2+97Qd7q#wzj&!Bt!t(U>-db_t@^X z@#BhIo*-lYT`teS)Ski5by$a^bb_XYWDMUhu~k$g^Y?BSzX)Ap@lM6<;@9x&3J@!W zMRp+*RNp!td}~T+0LnoT07!>{a|*m_0mwBA?f~ae&khYokK(uR+vssaTn4FCAW_oA zkZ3@#so^u8$M2%?_&xkS-UAXDhxbDCRbp=={s4c7rsI$BKD-}dZyi2}Kf$Y@P*Jb& z5g!KY{{kPuHUJZ&rcYM_D&S8w&1&|BAkYGiC?5deBRIc2JT?pgbWpIqMTx+G2NYD= zhFCj&Q_xK?1Q}TMf@a9=Ao;KM1FWbFhW(0*RQ#y&UGcI&6b4q>5t+0`>&RqsHL2vW zBF=?mDVe0H%270Q13m~3=V|%aI8Zsr$M6>X4g7wKn(%j^LsQ^)zLIzuwO*%{US~)h zC>Q<_|Ac?Wzu;e$p7=KvoB(_9S^OVRtUvIdsE$Gu#{aY`4w)|YN_m4s8&o+6GLSTSoNTgw^3PY zn9PYLA=0cPK{A)jfn`nBk*VsOsc7VSkkV0lDu#-s;;48kf#N9xWu#1$nM$ORh?h(w z^`wFL$aK<3W)MG_NoJ8IGMfYlrzFz8@zvJq^1*|xbGx_&YqJ-y^Ryt$*&0!$k*FkY zkdwfa!jx4Cyccz)q{SXbYBDOv{7oI(9y;TO{oW? z@D^$aHIyo+hEc=GBC?n)A(s(y>7s|4_k;i4f}hbqGvE_4QGv-&Afd*n1(Nw4AiE9# z-4=X?8b^(TPjG<;(rOk;jYI89>Ky$}YYzO-T$XsV;A zhtwXGsjE=oIk{iiQgx}vu>g`1_MdGU<%&O8>nrveNF7LV?i$j!^620wH3XGA>{fM`?uhU|V%p$>p{B?gWrbE%g%hGMY@i zLcNN#3U9qq>m_%RJEF;2vPP?=T6Jx;P^kkjcLyC%(w15cOSPk1MM(hg{x482+N7Xd znB(3~C^r*O?rO45L%E3%?3^THh8=mEFz6k142dIN8 z12&M)i2XC(L>;0&qdun&Q(sU=s4uCb)K}Co>TBva^$qy(6V$iVN$NZ56m^<9Lw!&E zfTmJEQ9o0^0Gjv>;MYFtcj^yxn);La3(cT0h*8_oP)Zqfd`3kTfQ*n@bes<9wBowX z1r9(MT4Ob$0&IdJiBd%C7(@}Ba@!wJZmWSq#U4tXJnWt8({M~u`!H>At!)&w{G*Lu z9)=1Mlzx(J1xw4RQEip(k;pq|4esDf-GJ4iOT zq%u(15-82i>s%iI5U)Xa+KkWAiKvcFMw4j^ovP-hO6jbQ&Vu4_S%Y8QB_a>$$b->j zJ9$#gvUKELjj|27?xyX4AoX+(olEJ+eSjFJk^9L5fF%Jjw!yE;iXj&QojSe^6jqiG ztiJeRv5K9_0`=bJaEp>EHdq1TM?g2A6rx~5@!~#^n~93=FHvi1-Jpoktvw3RZWP`` zduV|!CJ&QG$fK9?{G))6dL$!Rty%yRx3zinwvCf>#W$#O(7m8_FS<{sJg%}WkK1OT zt(WYHzS1Z%5sl9z~Sm^y8{>D@YfLwo0;8ULOpoj-MVwSAi9% zMP(&(+C-00YR1~Lv2;!QGsR4{&|}-HQ-7;bP?kMLj|cs!1&x{nC0L~#t7z0|>Q(Zz zjyx4jo`q~$P1e_Rs)R}2bgn| z7PpCEhk@2zRJx=CbPSHA=V+x%y2Z%wkVEePf`@1*ZM2VL}Jo1?Ug#*Is26RJ_|xQX6$4jQN(yZviN#qH40QNbuG z(p3D;B?(~*IH{@a?KKd*gXk~a-Uh8>=%VXc__GQKDYEH6bCv%{NO9)p69R93$%Vjjp92I4 z>BYH)uf8M-1pQxiuH6n&c@W%N=k%w|zUZB>N36nOQ~`7O^xUE=iOxVTy9EEK=TODD z;a3ygC8v!outhqR{+j;!99sa?IZC_!8$WG8;yL;|`nz*;(vj7U()@qa45ib#nL&q3 z&Wr*rg0_(Lool~?tkyPT=ApS4ncvl5MRg#AfHJ9b=CGQS{VkUmth8mYaw!Q~420>j zOU?$yE4fg8O3qUsMvpotJed& z_`oIULWTq5oWCOIdWjXOG}~9Ckht`?US&Oum9d^nT3|hnQb`k^Quu98#?M<8Fs+2i z)fT0!1F#K0yS-AP)?|yNZg3`|dzY>X`qzL`cM(2n@JSRGpO3557{@pn7i25#$gA2n zyIH{;8yP1msF|mp4C=^or~}B%hydI-z|Q1hVjtfCiBTi8?r4Dn(4vIt0UV&n5%T4f zkZ(4OG14~zT7`OQ6nis$VA}0_pUUn$Al|l(QKmQ3_tG1qU|nWr01UqxhX0Cu2@_ZH zi|QHv_T5S-@wT0@0WO=Fq0qJj+I|gFY1_omHfnqBgLXz{gmNB-8Oc&x~fq zFjY)-9iOgFZvf04&~wN1+O|XiO+!ht(i@oppW500%sfTDA>Wek$jLoS4G6K08Lu+7 zY6jGM8`N!LsA=lR35^T2%tXMYTH{A<5swS7f4mbd{iK%5KskJC28_@36@eVll z(BkW9RsV(ERb!Pbq+=&qTiICkA*|q^8fjDTGSk`xap6igF>(7uM$oEh{o#AhQa$Qd=?3KfLq>hQV?VHzVk0G1=`{!*n zJ!TFQW?D8dA@b7(CPIEDzd#SjVHCEgwe{)2&}^T&hpHCHD^&Fy5DY>Bui-ta8?#`e zQs%o*0S+q)0P9%7T*g#G`fv*7{u?<pp2tstW#vjx5+S~Y>_C^o6zy;!g2I%@ZO|$fc-awSI>pA24t6U0vrZ~ z1n(S!RaUZzDl6gWq`8fmkgh_)s-R>**1$~Vn%c(9Ex=OkQp%Z|;cmwTZ2}Odra~~8 z3e1FH49rw6Wn1Wa9MvwUl)?oYs~wjfqGcJh zTn)b^aOr`U%B38Z{J&n5!b#ZtV5chFnhe(P|4jAJ|Mp-l*zW%~CH+5~^=*^Fi>egZ zm)Muto$M>@tL$s+>+Boso9tWc+w3m(9d?iD}>>>6u_H*_y`vrT1{gOS(e#IVRzh;lK->@gxZ`qUVckC(lG<$~qp8bLSk^PDN znf-07G*5SxQmRt%D9`1yUVyl z#yw=*Q^vhy+*`(dWZYNA{bXD!kLo^SpsK@+RKQC-O;r zGM~a*_*6cPPv>bvHtu3ejq=HFXIREL-?V5IX{da!H?uC_)&Z%KbjxI zSMk;SSiXiI$B*YH@U{FzeiA=fbp%`p4P8%QlLMRr*Mh?96$b(PirjooIon!3Ks!S} z2u_%7ynj0wX~pFcjV;838!B9^N0B$1I08Ms9&OMHEnRAM+T*<~Nw#%s!T48J1(CSv?!e z#={#UMtEZ+iA`Zs*>pCOwX$|Lo6TbjSr_YJOWAUE9K28BW$RfV+sLkDZ)5LbUj*Cw z32Y>h%Y-*b3e~qqly^r&cyFYe`o>5VHwE76Xo5F7nz@kjJ_omwTg|QG)^i)V&D=ZO ze(q!x6%`j{iOP-Y8C4loALWY*LfNaQQ3s-q zM4gB_9bFLJH+op~_~<}1iM}p+ee{FT&qlu<{eJY3=#Moj= zV*15Y#MH%jW9nmkF^w_nW1fxqG8V;}W0PW&W393FSVwG5Y+h_ZY*DN;)*UOvim@YN z$HvyiPKuopJ2m#Y*xO_8h+PwVXYBgeH)G$9-4(k#_T$*2aa>$#Ty9)`Tw$Cu&K)Pj ziE-WIM#PPe^TmbZTH_YST^1+DT^@Hu+_iD5{7dmW z<6n(`J^qdOx8irjAC3Pm{!IK2@joTl6S5O>67mv+1TmpYLf?d836~|TNVqZK=7d`l z?nqdhur6VJ!p4Nn2@fPZpYVFZTM4@ob|-w6a5&*e!qJ3d2|w{1AFUdHJQ$~9nu=i# z0iztQnq(!I<19YH&*K;Ht^8L0Uj9D*G5!huC4QFy8)yS-h%)F5F@`upf}x9{n_+;V z$}rY2&M?6+(LfAK4a*G64J!;+8?H56XSl&|yWvj5U4{*YO@{r31BQc!PYs6*pBug~ zd}%mpIA%C*IANrXvBm_W!Dup;8V48$8b=r_jFrYo#>K{^#%0Fk#udh^jn^8lH{NV~ z*!Yt172|8hH;ji(*(SHCw`r;=U}`m8XIgFAWZGi7$F$Y7&2*pX0nt^oHpz(-G5A(=pR=(+Sf_(`nOhrr%9}0vPLR?q{wxPc;Y33(S|BZ!q6z zzR7%xd6oG#^J?=N^PT3q%p1%b&6~{+nBOw*GVeCOXWnD}!2FSUzxjaq6Z0YS=jJcW zUz)!%f1RjHv?caUoRxT0;+n)K6JJjJDv3%;PLh&FCXG*OPMVXnBQ~pl}n9I)uqOy#-(;kElKT>+AFnB>fqGIRDbHs)TY!x>J6zkrrwl#OX{lB zCsUtFeLD5o)aO%QP2HV(F!jqclx9dXr6r~%r&-dRX?@cArS(r6m{yh+N{gh;O`Dgt zAgwiRQQDF;lD0JM^0c*S_oO|Vb}a39+KIH2X{XZ8r2UZgQ@TCfmEJeKG<`t&p!C7% zx2A7Qe>wfV^aJU~($8c>Wmq%1XAH{lW-Q6LEn{28_KcS@-pM$eaU|nt#<7g!87DGM zW}M16lkt7Vj~PE_{F-q#_Pg&2}ifk^M z+a}nGZIZ34t-Gy=pJ(`xtw*y~aM?UTdFZ zpJJbCpJs2cPq)vo&$Kt$1NLV7YWo`dTKhWtdiyr}9{UIO5AFNxAKSlh#5m#{@ebZ$ zbo6rcarAYRItDmqIc7Toj%G*5(dt<1Sm(IQvB9y)vCFaB@vh^2$6m+pjz1lLW#eo* zJ2ty(cK7U(?4H@Zvwhi(*)y_dW;bQuntfaL?b&x^ug!ig`-SWmvtQ1BCHqYF57|Fv z|D646_J4BHb24+Xa%?${oDn${Iiqq$=TzlP%DE!v%A6HBSLa-tb8F5MIXiNm%6TT| zxty&Nex^QOU zyuyWriwZ9*lnXB}TwC~H;gf~W7JgiKu<+Bu&k7G09w|Ip_-7GcR9qw#buH>%)T5|Z zQJ8>2t4%aiT=UgwiUUKbpz3O`1^``4>*E_CvUGKa0x;}L6 zbA9YO==#+4nd`9Yi0i29nCrOfgzKd1llx>n;F;)| z?5Xp3J@p=+r_tm0%<|0k1U+*+VNZ)^o@arl)w9@hnMd|q?zzHqrROToHJOOctgJ(}V_Lx-dhSDKrTIp;-tC5n-+{UsxzC5|#)=SSlxGrVO~Nh0D&cnF4q>gZPFOE&6gCTY3tNSIh5LmEg@=Vlg~x;^gdM`u!n4Bj!i&Po z!YjgS!W+U{!Y*OA@Sd>}9OSw|MR46$mw}9&5&kF zO;SK=mO@fQnk&th7D|hxB@&UAO3S3>(hBKn>00S}X{B_Nbc?h~x?Q?MS}U!S?vb`i q_e$HP$D}8u7o^?NUg@axU6+_H7HunsQVt`)4|kdNzx{8QwEqD;dpXwt literal 15521 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 ZEASL_miKNb@!%EwDeUrh%V$B?{|5uG75@ML diff --git a/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib index 64506f52799c7525c21a82c9c319afb89fb1f5d9..6551540dee74d58a785249ef17fa845620764026 100644 GIT binary patch delta 6166 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 delta 6411 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 diff --git a/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings index 68ae6e0ae7b71ed89581d779caaedd8a27c39f3e..74ae72802ab6eea84ff81f1c2b06038d91a854ec 100644 GIT binary patch delta 629 zcmcIhu}Z^G6g?(`f`f^EfREZ(h{RemmngW2Q|Ta1iLEpco03#w|G-gr{e^;~rGvlW zCjNk%qnm^0J{1R7CA@oY?!D*TbMCwGUi|wz>#PYM3P_^uE}0(a-6CR4h#wmB@FqKp9`r^ zzQZpzc?!FbaV0}OLn%-^nIVxO4@hSM$xNWCOd!96Ar-761576~faqj~?8)51nv*Sr b?Iu?VFPW?)qB8lGhygp;WCn%Ff})`SzJVkf diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib index d8177c67f5244d4c3d2b10f16ef35df4a31dd942..74eb0267e72576f714a2290118fea9195b6f12a0 100644 GIT binary patch delta 4040 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 delta 4039 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 diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib index e439f2cb96b0e006005e5baf1a9e2851adb68707..a7bc37b45bd1d4fb2e524cd0c786d0da60e461cd 100644 GIT binary patch literal 16622 zcmd5@d3+Pa+n?F1P0vk}9_g8*cbjCh;V5^xDQBVODwGo1&<4_`Bq=vI>w$RUiK3#M z3f_tbiU?+b+` z=^(<0K`i1Bj|5@9uwX*=Y;Q2+3p7p04osWjtqq4JW_yCQ4L-PCnH>%^Cm_6J)f0Lg zLJ=quWg#2NMuo_MWK@PmBQI(~0Tf2pprz<$bSrucJ&vA3&!ZR7cC-V%f?h?hqc_l7 zXdikT9YlxG5%dZA0{x7BLBC@L3pfHt;sl(IGjJxh;apsVi?I{SxHIm8d*H!%2p*0r za3vm#r(zGDj%VPR*pFx7MR+m35?_m#;_L9O_%?hyz5}noYw$yO6MhD7#xLV-cn^LZ zzlHbVFYs~v1OAbTU{V+plggwq=}ZQb$z(BR#==+`8v2jgbCGCi2y zOkbuSGk_V$j9^AH6PPJX9W#TO$;@KHObaugS->o2u41lcu4R@ow=&C_dzsbDgUln$ zlgv}hGt9Hhi_8{gJF}O0lX;8T$Gp#cz#L*eW*L@cIhJPyHiC_04Xl|hU<=tIwwSfE zZnlK&&Guu5v*qk)wvrvsPGf7?dbW|B&CX{Ruy?cfv+LN6?Bnb+>@N0ob|3pL zdx$;Ce$IZw{=lAP&#`}U9H-;-ToRYYS-3ndpDW-BxgyTNIk`?;XRbTfgX_Z$;0AI- zxnbN`ZX#FBP2p;|saze`$Te{Ru9=(7&Ee*9^ErjPlDmq#fxD5riMyS?jHWmxn zLXMCtk}oVS+GGs1ha#lZ9$w z3VJ}O5vB?rVVY1Y)Cpc;x==4P2tHwkFjMdgjY5+U5SoQqLRgqHHoK|C?>~ZcC<;ZR z7!-@*P&^Wm9wi_HGNMG3gpyGTGNDxXO-C6hbKJ;^F@Zq1dSpfaKvNT#5Li=a^2mx& zzPivjkH5tmsuAPit7cx>9cbM8eVBJ1JU5N3=v!Os4TXHue12beUdO)T$ck}3c;NSr z_chf8=0Nl0ziIyW1GP>m5DbmWuJwCDp(<@+v^8N!gn|#(#CIsRui<3-p~~2 z+7b!}8nwl)fp!HG+LnF*6#;=_WQQp^TAj}-B4`6TkpwIp(GvE+x+}clwaAHFs9@~K z3izV+bfY0ph(^>2bw*uKS5$(!q3);$>WO-x-lz{MMSW2})E^B%1JNKfm_!mA=}HEW zQDix}o2(+AlF!JOglyrHnK$wS3Feq_aP&or+eIH@BRVm*w;pbAt8{l=nkXgr#LCZZ}d2~9@TXbP%9 zQ{kG1YEcd7Onup2jLD6)ca~Z{^6c^ftK(9Ur^Jh8qo}d10w_B z%Alty0uCG2T#fpsCIq1i@9bG<$=yecm}WqMoXe zcMd2-C>-?on!+Ji)a*fiPkm_O$clkYl+krWPog78Ku-k^qZo zKt41B%|w3G2vVzPnMTJB0U>o66~6gig2)E)GTBDv=`pGilNKy+NnMJ~ow_Y5HZSPZ zt#h$imKH72B-o5XYtSqdB(Wr(h=+kf3!07Qpt)!snvWKsg=i64jIIF2DdeQQqe8Et-Z#W$EO=}5z$H~x1UAm_!Os7kq zmW92Ipk!^g$H^*_D!jG8z4o3pq5&vec#pOOtGti|i8K7w`lAygZKXYt`a^Ug(o}j0 zx>lW;Cff6ISc8_Jg3B%bdUf$P!s2h#7Ej_tth1FCw~eliy$sy~y3{uq^vqj>mZ5^9 z=r(jax&z&bmZQ7S-Dm~62i*(&y$`KK_oD~UDzqA{L2J=Ev>t|j2yH+c(ZlEw^r$++ za&OQVsPom9HHATYJbvl{KwDK^0R!mQ5)KEN)Nd+x`ud?67=#zr6!wB*sj3JbX5g$A zA9ROXl+A4;Xv}NxRMzOJr)EVv2LpbpqwsBHAlT^ftIssasRM(ef<`w7f?<_J+dKz= zHp~NG(_vz=I4pq!9wiLvIU11+l9>Rw2a!~;(82>f22gX*rs)MDG^oxeri{4bFtua|`sky{8XfG-#FV_g|NAG~F zwKi1Z>(G8s|94RV-0iD|MtZl^{b^m^L+=AAt;>4!9{K6`2F+BG=XVxDWr|1js6k(xJERB5PZ`{wS@iNFbqnAbRf7EeT0sp0$?LNYrosk z^&dl@p>pu;*`y1x9t9Uzg}zk%`xx-;6VX@T8pi_fzDCEqdCyY7St$uP)qBBj${(s061y$mjLf_4WJeo2XiifeFHr zyy4I|4V`NU0rahZps_hfaYCS}9E>ywSV8q#Ls~#9o9f%{kzDW*i&v>CM{*)b5s4BR z5~U-ZNg*i!0MY7}-L5X0U+z?Fc6Dm=%m1N%`5gL{=sgAP>-+?}OjbGL5Y7EOZC0UzOywCE7HvlTFr`>+m2fh)TU zT-Y%jgC53lI3BIRdX)?PJhe0HgMpT&y8Z!wfCfOyTlF&tu@fCb`09R9S8nrLlliGk98sKw9vqz2l{XO6l0`>F}SeZ7cL>!_(?8G@vv*XFN znio@_zKgT45vZ841t&w7@eRJPcZB5V()QC8i7b&+J;m8Lr)|_VI2#pQIK6yzdWA$H zGEj4aEw>VCUtb$BJ0;dnLT%$p*roc)b|q7-5=)v@YP8+BQ!A@fHC&I~ZAJ)$>b#-a zps$%mTlHxN1HmP@n`$5>q(8BKq#6i?Kbmp#Hx#6Q*ZdFWNhC-|HP}1X{loBE)9)-(cZsm9k zRZ2XH#OcHcTj>pFh4NYIca3cpM%NiZ&5f;Yl!fHQI=4 zAYxvxM*XW{X!XOAD@$p(>6Z`*cSv7SLi#|kDV@;jpgisI0#C!WG+x+B3$nMdL98je&kc|8%DFlHrVUWV?4pLZv7m~p`GANP^Ym>rI zQl?5l?$)hc3SHpic_~~$r9jA#f0x2FxCvj=K?=6gaYS7$8CbQzMeUr5plU(4Ze6vH z|0n^pN|nG3ssx(w&216@evbfF4*pD4-8~Z~z5S9rB-{`bS6iWv$W$JQ#m&(*~awoBV2%e_``b`Iw9uGbra6P^U-;3|VD}k9*omZn; zatFDA+)hSQ?5ra+Li_+T zd74z}NJS(WPs&L-b>O|oxEe8W!2-JsSQ@}Im`OMI*zUgZvs6CMk+J_SpDi%8EqH6Y zmDoxrYRX8)h;@?|$W%gq?|$)i=o*7}Qum8@@5xVJPG2z>STc^3{2Y*g)E5Fk!o^1DHk!7;(T%?nXGBZmuSdpd;}iO(NeAPplOh5 z;q~|g{CbE*Wb*D2cTG^qid!e{YM_-FhJ{txYm&#Bl1*n@w?zkxpe zf&WA`3}P_;4Icr<9D#4b#K90Hn`tNmAUZbWrGax$AUMYptQ!u6!buuj@isw8f`V}f zq5$V9H>$KObu1JjCaO6f9RpT9An2*5OAV1(kt9f(btFJ$lUcB=Y8{!X&Y6is_Qx3= z6U9U`F-$BI$HX%tqh}Hr17l%xQwo)<4>T#Isz}>Bq;kaYOFI>+qmJ>_ zHkfIQGy@v|@tbG6{*FT0c<;2aV}^&u`@#*Xpf8{k-`q0I@2hpR1pRh82|#TcW$1D- z;i}fQ%}w>7g<3Nh+}xVPUfjHWsPX}WE`3ImV90a<|8-ckNn2RupaGY5NNxo%7e8s6 z6|6w@F<}38H4t~AE=Hz4ru{VrTU?;xmK5uZGR@x$nw2;udjFXmk z7>RK)G5{OLOei?5T1B)Rhv~$0R+EX=0?z=Sni_b5^VY(nE^4-L{+;bB;~ z3=jkg6|}r{i0Qvp8>I?r7_FSplzI>ft!D-^LzpsVC^L*KB#X#mas?rmuV<(!J-FTV zc#DRa0iKXa6eUCLgBhdNKIXP#>>9vx>+xx3JTo3X!37>jD@V}sh1!+W*!rB({PyKX zG2zpAJyXq81CoS`cB~zNyv8=0G!o0(RnXg%OSd|(x!4MCu9D$9WWZ&wKJKvyR1-PG(aKDD!4$1*h0qzNMb8Z z(G=%z2>>(J1BrHpnMBI}wjB%z?b`JNWPO=-bi(U9PIwYj0;rX0+?2m({i_$OFWB z1Rx{LTxcq}wqzW}*tEd{wS$9Fq`+)MzuE6Dv633t^ABbr;WD z6`JX5z68xOhnXYlVpo$-i1icEz#L^hVLoM!F`qG?GhZ-YGG8%YGsl^4m=oZ$zh%B- zzGqG{KQO15)65y>M>LiBiTRoN1(3rzfLb3gzcYWJQ_P>tU#Nk_ATn)Zf>teR#Eg*@ z04RcL?Ql9|&eTnv4-$YTw8m=m1c(In5Lz#5AB2jD-u5-o+iH+daRx1Shdi^r8fHmq z8>SVSwT_}zdbIJ&LQpJ%Di1AdQ7+HW8a4|mx&!Nc>edc< zLPs8tB%8?dYTBeD4{MYy$o?Q}1#B3_=CHYpjywWba2k1(JO(HcuwW~&DjzxcVhB?s zw!*#gvi_BqK6I(5Xkb&Vr#aL@bH6$>fcG$H0@OGt>XR?+1Id<5y?TjSEb9WbvMz1@ zopqqlTGq)*tcyHJo+3|Q&Zmz8K1Lx0DQYwAt;@(gV`Y}@~B2vvqRZo0MFFQBm7qt z5yaEC$p;|V8=|*hH_9s_@?0c&CIM>bP|R&FNVB5|tvWxesxrl}P$;KqP+4uDNpoM=}NnV2VSk1og?NH)$muPXBmN>h%R+88{$dOqu*`mR;^P5f`!~o2k!A8Tc zza6I8N?omD*sN!Dm((QLCN>(!u(Pz9B-@g}iI5a;228WHz3^x(Z3i}Z8aqc#fFo0A z0$jDA-Gnt8ScpPTh^g!%b}@SeOIU@ylD&$(n!Scy!d}ZRWv^qeXK!F{WN%_`W|y(I zu(z_evA45#uy?Y{$#$}Xyh3)8UF21=o4iK$kk`o@WG{J>yhZkrx5<9;4mm*HB?rlS z^?KOD2nM7T_y#-oFvzypW9aps3R_f3u_V+NSo_fObD*-on zc>*SM?BWS!|Ko({*z8Vr=Xrbv`vI&Re>%V33K`Q{G!W=PS0L_8U8a{ z(a7_|uOPb1P8*wGUvnyZoIQS?EdbYSrJetcpB5mol|9LxJU=HLSz#;9|3}TBozBk; zI$U;U3}_Lwg?#RO`^{v9w#zaH&A!C^t_Lfs0U*36t`FuJ8>#>!(HSy6(Zd;mt!Lop9 zC0wqyD7p^7HezF24MZ)ny4+phAVb$qofowOrLHo3)ZmjWFS-y{sWFZ#=IoG%v>~rb zZ(}pX9Ba5@R4{IidYq>{e_;+IBPRn)UkzK1$B1=89i%+<(7L?^Zh{siTsPnVLp~>8 zObL1$VT=*p;m|7BU8C5O>jl$p+tj36>VR)scRabCT<^>8c!G5qxqdMG3K;$?@&!zs zW)qbSzP4>hDBiXni~%kixgpTD1lk^lskH7+XgjdoKY(@#+;Dn`h8w|+L?gL!^e8u) z8^cv_l{I3zI=y}{cfiW+(`()91ndmO#&S=%0Y0_10hsv%IYGW7C&~8*xN#uF8g7Eh z*op>#wsq?E3REj~EeIc%^GO4_AAMAP#9vdlfl~4mP17G{UE(f}I zb1Q&u4f#RA3}F-u_#XfFr0?fe{Tu0ZD(MG-^agGtkRC%x3zRgcVE(@+{W$mJg`_W% zARA2y1KH=f&0HmbT9BZEBNeQpG89{77^a&aRC*KJKV3XdRO>j~xg9XhMs1vE1;=#M z1S|SF(ZZhiy{B@EZVxT1_*cUo|zDNs|ut)K8 z9gA`hUuI(hQF#aK?3Uu8fE^~$gK7T__U1+_I1YR`;9N*+wVZG>WF}ic>x&3IQBe+h zS`9jLzE(U2cK60!P#GKu8?r;d5w8RX+Z#5#b#O9|o|5}-fc*&~s)spwJ+dk|9!_vV zf_I+5Dl7R!m6dSb(b&pNNLL|Yr6?JYH87K2Q(Kw29$2bfv{1PY?zUghrU~NIR0t+h zfte7DftmE8`=tNZ%Lum2wDJ-%X1Jn2^8nZbFXQSE{nC|s~p+I~erv>XU6 zSHN!xTv5PFdeIY(|JRG5oP=!+ek$cwHCV&{Gu1=?+taXMyZ_&m^#5=`w^a(;RVna0 z_*eLy{4V}gemDObzlVRFe}mu4zsbMF@8jR*_w(=Y2l#jSgZz8^`}_y|A^t=DFn@&q zi2s;B%74Ot${*uD<3H!W;J@U*;=ksP^WX3%_;2~|`0x3X{15yo{xpAv|B*k-|HS{y z|HA)=Kga*d|Hl8$|H1#s|0N&+3yi=DoWKi$5FtbgIw4Ak7Gi{0Ax?-FL_sek2nN9@ zBnnAFvXCN}gj69-NEb2`Y*4UK!HEh^QgE_@Qxt4caH@jS6r8SLXppJkECrhtY*8>6 zuT8<(3eHh*u7dLvoUh;l1s5u~NWsMlwkz17V5fp51-le1E7+~zP73a<;4TX8s^Ag@ zcT;e81@};JPX+f4%M?6R!NU|hT)`t0 zJQC_x3NBYLc)2kOu268Lg2yU&oPx(Ic!Gi_D!59)lN3Bz!PN?$qTm_@PgSr-!P696 ztKd2Xdlfug!SxDmP_R$IGZZ{i!F~ldD!56(0V0YzF-nXPW5qa86!l_)Xb_EJqL?Hm ziz%W>Ocm3_bTLEB6thILXc4WVP0SW^#9T2?%ohv9La|6J7VV-#bc&Mb5@pdXb`m>_ zUBs?piP%l-F7^<6ioL|%VjnmO)>rH&_7?|;1I0n&U~!08CJq&cizCF5;wZ6P94(F! zE5u51tT;{_FHR6AidEtyak5ygIszexhO8p6eF08EXhES>)Iq?Gp)gmV2U5%WX$Rj2 zz|pZa!d$w`2$f<$x8Azeecs>!VWF@H9~Blu-LkBoBcvV&rH4N?=+=sftKpG$L>>;_ zdkBVCaZJbxR6E0&_df6vi4#IzEjtTJMYq6fA}_LUv0rm67sVxV$()Hx=dw5}mjkbZ z6moV>;@pr341pIwh64_+g_l0&a7*Adk2~P?4hkwB;hurmyocMzeZVt3#|wNUAH~P; zaqyZ)0=(vt#HaA7d^(@Wn|Ujr&FArjyq$OQrF0U{=GmAXF`vc!9LvOVu|jNQ zY*cJaY+S4%Hb1sgY~R>XvEySW#!iZ@j;)FH#5TmX#9kSDeeB(__r%^8yFT`@*r#J( zi+w$IZ|qyKZ^wQX`$O!R*t4;J#Kp&@#989(aV2rX;wHyUiJKZXEv_!^&bYhc?vA@B z?%ueSaSz0;j$0eIF7Cm&4RJf--iUiE?(MjD;{J?B@i?B1kBN_q7vodobK@t)*Tpx+ z2jXYN&yJrPKRl^el^nQJlzF9v@AJQ+>EBdSS*XXa+zodUzzfHeG z|B8N>ez$&){&oFc{agCC^3`J!r2i!$J0UkAFF{I>6FMc7CU_F2Cp09?Nbn~# zB{U}l6Xqn`kZ@nZ0|~1W)+W4^@RvbnNH+8^lo`eu8Vq5>VgoT;X}HR8wPA^2so{FV zjfR^I%M7;~Za3U%xZkkau-35N@UmgM;T6L!!*0VK!(PKd!v}^B4M&WkG1cfa_Ar(i zD~(f(GmL&?qcLEdWegg_#@WWX#`(sD#zn>}j7yE{jSm?&8Xqw}W_-fyA@ z7mQnsTaDX{JB&MxUl@N+G$js7tV^7ocw6Gi#2twrC!R@)OUh4jCk;y)o-{G3E@@^` zV^Sb#R?_06B}vyNEls*U>Gq_JNlzwiP1>FGUee*DZ<5X={hG`s$0VmETa&vb_e(BI zu1u~@Zb+Vy>`!h=ZcYv+hm%((KajjCc}?=(giIk^OHl^%J*`2Z{<-L>> zDc_}>OgWWu#uRBvG^LnQO-_@`2A{trY)wIOfQ?Zn~s@2H+^CH%5*$cpK3@orY5DPq*_w@r4C3Pm^wJMEOkbzKeaJ6 zkUA^%w$wXP?@YZbbw%o`)QzdnrEW_-lKNfh$<$M+XHw6mMWm&qrKY8)Wu}?aMx>2O z8=W>Ltuk#~+W54IX_L~b)25`&NxL%brnFbmcBSo3+mrT2+M8+n()Oo)lXf?~tm#<|Su?WySvO@Z%ep1&wyZm{wq|Y1+Me}# z*50grS-)hR%lb9zcXNh0$80y3m`lz5%md5=&4bOu%@fU&%+=-^bI82VywtqRe7AX> z`3du<=FiNZo4+)FWj<~`VgAm1()@$@v?bbNv?N|fTiuGFSb=K>xH(GDD-euix zeZ{)d`l|Ic>nZCQ>yOr-tiRaIHml8M%dzFzB-?0Pg{{&y&NjiO*sii&ZChenYJ1AI z$@YxxIooF24%-Raced|sKiE!Zr)H;TXJlt(Te62{56>QvJt}*2b}&1f-I6^gdtUZ~ z*&DJqW_a&?ht1(~gq+A6eNOkBo;kg8`sDP@8JaUQr!l7~ zr#UB>b8pVdocnWD<*dnhJLjF8133qC-p~0Z=UmROIlt%pnTv7@a*J|{a~-)-?!?^b zxed9#+?lzJxwCWU=C00No4YRe!Q2hGujlT~eKU7o?*80!xxeN9p8IDW%G2dJ@}xXh zo;$B|Ue~-)c~yDdyinf4yk&WJ{3`#IJ&U5&|f&K@aDo>3U4dCqi}iQ-G%oQZYq4W@Tcw$HZDwa>RNv@f<3`<3>q z?Mv)S?bq9HwBKyM#eSRp4*PQZ-S&Iz_u22aud=VPud_dB-(Y{({;2(N`;+#k?a$bs zvv0P)Xn)E6vVFV#75gsxZu=hl8}>Kt`|SJe2kZy!@7oXA58FSoAGLpK|IGe{{VV%% z`w9DZ_LKHg_A~ag_Mh$lvHxoS-TtQoIdqN~N1P+wk>l9xc+v5a<7LNo$19Fqj@^zu zjyD`{I`%pCI}SJwI^K62avXMiLc})`bz_)!BUwtOd27Ll157v(pYJ{G*Ox)RZBIJN2-;)QoZDp zW=f4xK$<0mq!ww8G*4O}Et0N~6zMAI8tGc;I_U=KCTW>;t8}|`r*xOJLb_L4DLo*q zmexw^rH7=A(j(Gi(i75C(kAIy>3Qh|X^XT~+9vIgc1o{Gd!)V6K54)7p=-Hoh3h`o z1Fki$^{x%BM_iA)o^n0odfxS-YpZL!Yo}|s>vh+guD4wWT<^IKxsJGwx{kTNaDDAM z;riZn%Jrk`XV*E`@2n*(}@ST)99lmYuRJca}@!9&&HF zuRK5=EDx1O$mMc{JWie{PnK)sX|h*tkY~zG@+>(l&ynZLi)12SB`=Y$lW&xl$+yXO z%6H56%J<8w<#qBy^273D@)Pn?@+SFN`FZ&Td5gSN-X`ymcgnBIugR~=d*!#}x8--_ zcjfow59AN!Bl5@cC-O1*bNNg8Yxx`bTlstW2l=%8qx_Tni+oQ0P5wjv%Z=Tvn|DXJ zb?#_)tUKPVcN^S^?qs*go#xJPXSpqIn>)vy=Pqy;x$SPJ+vRq=yS5ZVj z5JVOic30d{6u}+$6#)eia6v&_5K%x;e&^n#r7S+5_kDhUyyQch-kCdd=FIn;^F3!~ zQd7Vmj^yX>MHo?tMhs$+OqL-tjm@0y3x)l`#<7{fNmG5bk?^=oZ>V;PA0Ag`MuJTm zgl}E{gc?smaY&BL$c{3R1M#R34MxLI1B#$#G#lNH?m%~;RcJL@gC0hYpr_F@=sENX zdKJBf-a_x9kI={HQ}j7HjEQ4=zN~lt*j2c6YrEZ`mQMFWnx{(S|bE$dM&D28bc4`rI7qyaFOFc$C zMLkPBPrX3BNbRKFpx&WAr1ntO1NO>LhiF`jt9Eou~e!{-$Mg9Id5wbQ+yb zn`kp_qwVwnx|AM9kD{ySiL{TNO5aG&py$v6y?|aqFQ-@2_t6{ahv>)YZS)TM75Z)Z zBYGcwkUl~mqfgR5(m&BZ)4$NC>EGyc^m+Op`XWO!az?=Z>A5^j~UDiVM>`1%t)q!8OKyH!&K_V7vR|-=*e}_`>=E`T`xW~&`wjaodyM^#{hmF}o?w4qPqII< zKe0cvzp$s+U)j^_Z|oWNclHnVEPIYU&;H5&#a>|lX8&O?%8(4pC>bqdWUNdki<8M^ z3YiisW%05ES)wdSrjl_owM-*RmT6_Fvh-1zjm?3;7f6AWC>|xCM3jV7h(l_mLCHvq zbSMR-B0Wk&>G0o(GLUI>dBww+_&d+Ig1UwfdK zNWoBebY^Y98xB`R1rvJ{io^+6DPXyPSpiQZ;tv7W2-quN#U5mVHCvHwJSsm>em6$gBw$R3o1vQZAot%{D{2))Kezxu+}@M?275}X!Y>_+I9H@0o* zdyo?*a3ME{#K&CAdLoMs=t23Q!lBI(FRZ)57uke7r~u`SDzAV)qHlIWB~Ne~RD?RC zE~qQ&hPtC3s3+=$dZRw5FY1SiQGYZ54Mc;8oMe(tqz@TKCXqd4FZqldAYYKL$q(cw z@*6o%E((|;%l4uns1#iXLTOPM8j8w6)QVtpsMZJDHP9E1_#3_A=8h?^DDzJ81wela zVk7p$XgC^yMxqK-iAJH(Xbc*Q#-S=0XFR$AO+eMC22Dg>GzrzBI^=_&)o2Rxqp3BV zTHIUT4A`Y`B;@rsf^#je7}O{(x=upH@Q`n^FBJ0C4fW0}^Uex3N5=T;B2z$wk`QRR zhBE;a0s%lpS+L$;>kULZ4fKbiKm>3O@C5>}hZW6DzR+}-3|2M0B;c(F9A%YPRQhH{ zO8mY+U2(u)-#E?J7#Rs~mNtfck?`oK@!cD=(I$x-Uvw%i|<-tg0$lDkW zh+t@r1Vg^Cf40A|eyBIx5XE$3#6KW7tqB^$2r@k64~78U(z=H<*VjYewr3M6hb1RE1D;XD+|LiCAC!e zXZr{uQ^{lGak5;E5tvL%OF@1Ym!(rdmsXdhrE@`%%TiF(+8V{ubTn%tnt^7LM4}?x z=P*SJnuA)=Tr>|6B%qtn&9G^=04x@u+t5Ooa-?WB))sy(H}* zqEKTOhd6oER2HGdk`U3IzXYX?XbH-@X3J+C))!sfGFaVmSRJg5Bykw#a<$DBon$4t z8!%TK3VA_MD^XrmOQ+8HE=%|B-CM_lV&Njne^!4SMBB31ex z)oui!D!SSB;R-d3h#dv75FOEz45HO={WvsyFM1ShMUR10kE18hljte12@xP*2a_c^ z;BV2l+52Tj*Q`!3k`$6!!`b;EzQA-}1njEZ*X#oq&`{bK@r5RPYklsKzWU~XHxyOR zHuNlvQW9*8Y((2o-aeRYJ9-|yfOeo4(M||_FQJ#krHe}u=Mv=>zgINDP@*2Z5pN(^ zFE)Xir6yt|>70zD5yR+;Sz$oW4FDEVSyJn#=ye!hgWf>9(TniPm?{2rR`r= z#L>hUmF{iyPTQy((c4#w_r4_FhcKTBW-|i{V-vM2ylt{i#L4>SqqcGPqJ5HYX!jxF zUTj8t(SGz9%7Zl)OTkcl8uLR@c@Ch1vHg@h&lYq5eSr?4FHs(V001mOBI+5TU%S^C zU*`+ghWt&U*+mCBioUAhw6J~tNyC~W0UzK)ion6pCUg{ijq)G>L0kLNjvoFP`VN(Y z3(q2j#C}L};g=k^Msnby`#u4daT1*OPm=TgMRMM!(QhP2L9*q+axz~0tq5)n&$Iw4uf)_~=7+`hG0JFHmT->;p zLNKweo%5sC7W@7srqNo=U>3{JdK?Fqw+tvB^UL`ysxIXodeY=?{F6So>K z8w)`QtRmoTH(;#CX`%t!`#GY@Q8QZ6QZIGLz^2POaGcmaB2j`1w&P3yWmFmos_-Q1 zDyT;L=HOg#5YfI{a84UQC-|d6MH@Qc3A?ac!c!6H{U7jz^HDV}L|$BU2~W5??m@aJ zNM||e(T1n)q??4NPWfHi@zhleUu}58y#Y_S59#`^c)|m)s{@`!6G>;JsH&wvbloDD zs#>~thw;U){}D@QgM_705lgVpvNkNi#`S_dDWp{IAAS#|?(S(Ih%k0Q;!0PmCoc!O#qEsICl>-0@LT&W$_j0`2^WEhc&bk8@o(o$JkQev52#OGU@ybu~D1z}~D z2nbli=|lmgxo8 zn!zx}H)+(!vhWyxWJ;wUyzXW5sG6E51^l&qb12{zg#aEHof%%aa^k93-=@a;8qON+ z27_B-H0sLk?L!S8SaNlnNW*|g0i*1&>a^&>DoX}l{X%Li&|cZnCKaqeGC_Bt%i=DG zl18wb!h%k%t;0XXcL5q#qDH(5udXVs18?Y`?DvI6NAo)%pQB0Tr+BTHuToJ=4$D8Pe3OjJm!E6BeT4aLAHdatUM z!jA5z+yC7Cyezq&t@yPL?q?#npDI!#x*wRaw7xMI@>*_$oIB#R#OhYQ;Z@-Vf78{D z=3V@rwAxzo39%pH)c8aE5&jr|g7@H0@m{|NGsKr@mM&&dHC#q{1^Ay(J8KlPfJSE zhJ3!psDxL&+%^})@#xE<_XM*7@y1lP@%CtoR2BgDD2ge4mzaCBts*ij;1d%;Qb+2E zk9-KI_<(#wrYOk!~6#pm#O z2xD7;76nilzDOF#95NrmSQXHZC6GaECd)c9LQPxHp(tEU(WshYk(Y|2BCMfoh~TrZ4EQYp5H_W_(GRiA7Zx8ueZPz(lq6$_b)q6y{A~VP=G85j4@meU=h!F~MK{5X*t&Qa%)Ie&G#Dk-SuC@_2 zQUg(*Xw9Q*EFq!B0fD5d$UMSbYX@rZISQ02 z)&pP%3S#>;M@=g_IPj~|eX0(hLz}4jXu3}|Xc!Ll1LLxgo7z)yZNGNDPEDg4sbEJ! zFV~Zs#njvKpHlDs!9d-YS7dA*N^VpbG}H_lnjz^YR&b-{P_5)v1-V5|ZjWlnN*0pa zVsQ$nbz%1+(d~5aSQw&+s3d_b_*a%q-HOjsA_AjX+qjsb=5ux9qk&GUi%2yR@I)fh zzFKLE@p(|%Qc-Eta%zQG$LI(C$U+uNN?QbV41GV*w?fRe)cGwTKh$Gu{lOlW6nQtb zDyqn~8b)GA+60=~g6pXVJ80`R z>QQPd+6_K`*yPD#DG)-HRO)L2zuOqAb&FY{h+1#~{evMW3r3kH1P&>lfd}%7rUC$$ z{uaRx1NINj6#J322wx>u z7oBexnze;`iF%oOg?g2GjjSYhlT~CjSrfIBwz^<@-Hdt*f=HX4v~B;A%l&0#%wGlo zC4EH~xuo6XM1Lw37^|sIa3u~Ka96kQmfCm6 z+DEs*8uME}6aD99#koz?*VH%Ew@@fh0p9K<_md4odkI$GV-s~;w9go<$bBUBhO*{b zf1P(QRDSDxmsPr`pTtrU^$V1e)v#i~ivX(U#Y3ZR;F`5=F^*P}Ly z^{A?VSZkMxUeW#ki@E^E005)S)L+pZJrHB6ns%N#g8GNL2tnZ&P<)i5R+9(F7C8`8 z32m3GzNou|mV(ZJn{KVGhp#ND(DIH&6|{j?fUaJq6X-;Ikyg(wcZef6pPOiD=c^| zULbc6vEZplcYK!mfZyVk=#Q9BL7veeYSDTrOg#)#sA7gcQafc2Z9p2@NN2Q#6)BWG zO156=A({hip{){~jIv@$=IBw!M%p4)ciYLAWD|5In)L*iL1)p~bPkK=ih zQ+8GN`9vXh1}_KNo*Q#baP|Qujq^bH#2^O@`EvQd4@q~qT1xQBz z?S-e{g{zlSbmekfF!pvp)mC~tDN=Cp;)1TFom~LYW8ialU1m#4k|oYB!GM0X{TQqo zYKq6`H|e)TFhJlR+8l`Zfff5gA~K3dmc8$ZHEY&`in&JVeen+ROryM{b%FSfp4BRI;$Mn9de-?h1jWEfwur z2w$TKYGGmP<(aD#-{@2HuTnx0&21}v)0)JLZXynVblAjL7^}!J|Fs8L!=>(UcnD`C&AuKM=~tMq7$p{MqH#SCm=#_0D5((^_n$gN zrORe=+V<#5C2V4HnLJT6sQtngUfF!b8QAAhJu}WLG|j{A36CNFH1{1h;d#oJFbY;3TJvT7j$oCtV9^^PV z0dGJNNmQ4VV@wtcJ<>6$bedEyA-aDs2zAToxgXxZ^xY^{NUy*QDibjS>lnxkV)RhQ z`3ht|Nq!_pU@+zckS3PS}LM1a=RKh6o>jq{FIsLy*2x zObhwveA9 z$DswxbcCVz@=_AO@QNoA?`D>Zyt|lL0gk>FN@8)*q8yZFMo?A2k7j^`E?k8B0OxoT z9fL#av%s4wFJ-Sl$tH>STJS~cpZ}h{GdcmwAjT+RHO;Y#;2fwl&4W$69cm**aBkTZ zLO?aRb|;*0F9G~rN}CmMmq)x-vl%k5|2_>kL^$b28nYkS1RMv~&@QXTMb&jsQWsp` z(nb{qrC#`e>duKo9E!f@;in78L@fj^k@XydZ-Gl6cvdETYJu#DdE>~MEjW5&O`=9B!RY?a zA%y-X7xe(o|Mx)qAKey=>9<+ZFFT!`!Omo7v9sA0b`IOh&SmGZaGjF9iM^Sf&)&k` z$}V7UV;8cwvy0fp>=O14b}74zy^~$eu3+zCSF(4rtJu}-8g?yv4|^|rAA3K$j$O}g zU^lXx*v;$~_5t=m_96CR_7V0`b}RcB`#Adq`y~4m`!xFuyN!L8eU9DEKF_|u?qFYJ zce1** zl7QU;<^}8#aK3;G1Y9WKP693xaAyH`5pY)lcN1`T0rwDaPXYH5aBl(k5pZ7t_Y-ij zfcp!0fPe=Ic#wcg1Uy*4Lj+tZ;Ohi@y@1OEJXFBt0v;yd;Q}5Z;E@8Z5OAe{M+tbe zfX4`UtboS}xJtm|1$={mCkVKjaGZiuatT}_m&9?Ln$vK}oR-sZDO@V2=hC=z&cGSD z49>)vISXgyY@D6T&$iGx^msP?pzP9 zC)bPX&Gq5>!o9O%u0J<`8^{gfO1Qz?5U!NFjw|Daa^>7GZa6oB8_890m6DChbf{!~ ztk@~jqgm@k+l3m9%pfxYcPs55y*xV*u83`v8AP536;`0TzPi{sd1#N!EVCe=3`#ob zrTzJ^bX`omj20zkF_Jt1nxfZi;qtDRV7RQGhHT&^I>Wu$zHs3@5vn%DaK-!vx)Cmx zucjZRchg_d$KlHO@AO&vPx^1j1!#taYvb{7ZCuTyGugmA9ZWZ-m?>jM!KH9N#P$~H z8u&tHIkS#=fZ57C%N$}3Ge?=PnQxiznB&Y3%#X~^%qiwHbB6hYImi6TTwwlTF-x;r zxGwHwJF%VFu55R6a`(*268)Q3VyJerqK9%j0eI`2~`$BeDb}kOb$>QX3%D99$cU-r)p>bp5 z>f(ZNH^oY^+{U;^;~tB9GVbZPZE?He_QZV__oG}PkC!LPljN!LG`UUgkbC4k zUS| z-4w-&A&Q}jNs2~Ai(;YTPQ?nvO2sP08pS<|jfy7}I~8vz_9*r$_A8DkzE}JRchhMl ztBg}BltyKq(xv2;U6rNEk;)q7WMxpiD(s_r~8J z|4{t4_!IH}BqSu*5{eQACyYy&k}x$PoG>S0ZURZTC1F9r!h}T$OA?kQEKj&6VQa#( z3C}0&NZ6V1LBjro&l3(N97;Hx@O{FWgufG&iOGq^#GJ&=i6x0c60b`vODs>EmnbCO zlsG@}mc#{#3lkS5E=jy2aarQ>#77giC2miAA@Rk;Ly3nIk0c&X{2}r8B$U)SscTaA zq@GE=llmqVCk;qyN(v>-Ox8&sQATU2kV4y*nG6EES$auIGGw~2e1+smC&E7dwRulA^WsRyge)x*^z)s^y?8l@&dlceD^8cknKv1Wi~pr%AK zL{qA{UNclPOfy{L*F-e)G}|=KX`a{Y(CpN_qOjoWO zrW>IfsjJkD){WIw>Bj4B&{gZ|brIck-AvtV-5lLq9nsySyI=RB?w6Ff6fPw-B`w8} zl96Ig>6S7mWpK)nlE_n<*cr>`(bBGzMlF<>YJ%= zrM{E;Ug`&_AEkbrx+nF=)ZbIjrT&?EL7%2K=#Ba;eU9Ft@2nrKAFrRFuhDz;wR)ev zULVl6>TlIA)GyL6(Lbp_rvF}lT>pdqr2Z%UFZy5gr}by_f9TJpsngQaGSbXx*0la< z1Jeejm8T6)8<|#}HZ^Tg+Oo9eX?LaFowhn{ZQ8wQ8`7Rldo%5$v^{Bi)Apz9(#`4a z^q%QM(yP)Zr#GdC(j)23=`+%2rMINFrq4?!={Kd%PhXP0EPZ+UUFr9wuTS5YzB&D| z^quLiryorJCjAEkV@NdU4e17>!DO%)Y=%rjv0;E=pkb(Cm|==xs-eL!%@8y!Hr!!Y zYFKSpYq-~NzhS%K1;Y-*PQy!v&kP3)2Mvb|hYiP!l#wyYjB=yWm|)B>W*c*j4r5ni znX%kB+&I!$X`E`DVVrH8W4zP2!no47%DBe3+4z|88RJglSH^FQ$Bf?@j~h=IPa1zR z{+tn)(J!MsqatHe#+Zy7GO9BsW=zVc%b1)oC1YyFqZ!XvuNV z#@b{yl}&9+wiVfmZ3AorZ6&rLwh^`pTf{cqHp512H`(Uf7T7l19#}RJo3g{%&Dk@vXJ^mJ zUYY%1_LJGqX79<~o4r5#^X!A!hq4c6pUqL^IC5M$d`^B&VNOv_mz-`nl{r&#nsa96 z%+6`enU^Evtj*b)^Fhu>IiKWwnzJwGvz!AtU*w$4jnCER8gesoExESb%-r6&!*ZK) zL%EUM>A5p=XXnnzotwKh_wn2pb6?7RCHM8*-MMe&9?dp2O*IJ3Nj8M<+*TM^{I8M^8s@ zM_)&=V}N6jW3Z#talK=xW0+%vqrx%DF~%{@G2Su3QRDDBY8^gDy~FQla7=Rq9XC3{ zj%LRU$1F#Sqt!9bAvkV!+~Qc^Sm;>fSmIdfxYM!1vC^^1vBq(a<37ha#|FnH$5zJ^ zj;9n9-R)ZKTI;&kb-!!9Yolwk>jBq8u18#3U5~q-bUp3b=6cTcylaPRr|TuxE3VgE zZ@Aucz3qC}^}g#v*T=3suD!1PuFqWuU58wUT}NGCyS{aO=Q{5C!S$o-XV)p$Y1bLo zAFgw*KV27G|G1Hxax-q3Tkcl66WmE|&aH84-6?LpJKb$`o7@(+&7JAacIUbsZkOBR zE^zm7A9EjfpLGB1{?&cPeb)V_`)?lcG%w>7d;+iHHN1}3^9J6;Tlq{rhj;L9KA-Qz zcj3G9z4*R-e|``@guk9I=ST3B{20E9pTJM#Yx&8%pAYasKEyZkGx-*NE-&!&`33y# z{1Sc{zk{7L>N{ulmN{x|-2{w#l<|BL^dzv#gp+QWL{JPJ>|C()zws6ELZ zohQ|k<}r9OJZ6v8WA|ivay)q+r^oH_cnUn7Je@sVJ>5M$J-t1BJ;j~@oI^C zo}r#$o)Ml3&nV9r&p6L`&je46$Lp!}_&oIZLLK}0V_ zLlZ@PR}m{9az#J^>BRyf0wN$yPyu;+W{A)G?)~2VJu7YdfMz{sO3Ae!y;7<54{1om13b+q`0S~}0;aPYNeg`kW>+olI1Kx)B z;RA#bgJejKR7j2Vh(+aNRDgz{p=cNip;4#`Rihd-8BIYm&`dNJ z%|lDjQnVVaLF>^5v=MDaucJ56-_dro2YrV2qJ3yT`W$_M4xp3hEA%xwi_W9((GTb% zx`ZyHAJJ8G4c$Vw(LMA4J;VrOtj8=48?X^uu?^d?3;S>)PQx8>C)^o#!5O$4&ceAk z59i~axIYf!C-G1`3>V=L9)(BaYFq<@pcvQUDR?S=3eUs~@It%@KZ_;296yKO#UJ1g z@yGa6ya#`VKgS2~&x{Wgf#t9}QwW}B1~3DeK{{qIGlUt+3}cFzVx~k=p)5R$nJbl{ zoAF+y$B-B zNeOYB0R6ylPzpT22!db)xCw57+u#luMgU17!$=V+J_3>`@h-@21oyzNB$*5%IcHft zxDOtHKHwpx{Q(|<{*+M=0tmryh#-axltDRtDxnIh!Bub-#z7s_LzaOCXq0ZNk9BDV zve(fS2B;=2Nni3L$@z*h>jQ06qkfd(eQ2jF9nc9~&<#D%OXc5#0s7&gATip!Z~@DZ zR#c;8l0s4pDnNRuqT0gdAp2z)pl_+B778y2Tf$bLFHE6~D_|-x!qzYiwt;P7JJ=qk z!w#Sjb_D%lC)gQwff=wXD2Cm^Aecq<6X-Js_JFxC59Y(3uowMZKN-IO4DQDkjdD1~*FL4)96IE0!tjkGa6q89-W44RtSHrdlU zWm?o-um~0xl@tWCs%xu4wFAmS6W7Bc@EX_>aVK>G98R48OW_F8j%1RY)AUUUj*@QZ znyJBZs!=Vhg8|8?U*2;9oCxaRWH<#Jgije60=kh-L`Tv|2jVj*!BOxmm`8U{r`s0x zPHCAIxmtHfZ`%%#_~X8_!zYCm{2=4`2( z(VQO>aS$FFLIa|rye1Y72V*N}qQJv6`}%?h@JKXSg77Fj29LuN@Fb1f(~(r6$uflA zC!~|c9Emrj<(!A#Q)a=k+UkmmQ0)eIzDeN!#qJUq1V;T6yS1jA^qcS&tvfMRG0kqq zG&>CnqIwx)T7f5NX5E3mP$q*TRX}n!%h3E9i3?B<8W4JWRI{xxb3j2b!XyeADUgz~ z&T6Quuda-;Mv55gVU^Xjp}eY5)seTyKn~~ua%sdhg8>vL6(%G;X+)-IWh)~u5XV{8 zfD(`yS&$XkkR3UY6SN=FLHtOf{s+@+33W_-ts>-6pIaF02ET0mJ5lbiiJEGLtJSk}fQIqFXj1Jhp^m5%>J0Kx2I>m7k};%; z)Dab#OlA`o$vN}b$nR13v{IrhTDuETHhKaKLOsBCFa!*NL3moqwK(EZJ0yEjqwHI! zw3WtNlH6I~bMOV~gZfhB{ZSAcrosk*W8gSA0fT6;^r2;NyCPKl7hb19F{vTdN-~xR z6pUI`!p2k0Y3Yh_PEDh|EUoo4X@J%1j<6jQW!njji?Kz6iI3Eh07WrgT47BdJs#CY zBZ4Z5CelV*Od3eNlGq~54Nyt>Q_DmG0wz*B zS;<6VplLcmO0=c-24~PLG#e0u(n2N?mNwsi?X#KH6(djmugEP#^U(sTWz?Kh%VIK> zOp$ik(u8HSzC|kC{>O%V790eJ&~s=7_0~%C0>xYhPM}qi-R@M(pgx;Mo|3xSlf!5& zjlP%A%cv2p8yd;#(z?2W(#jAmBK<>k)eW^}p~#oJR-O+4O2|5d`8n&yJ&(qL42 zBYG1gHU(EKwBCw_*4t<+dWQzYyOGdBAE1d+qQjB0m^`f{%OXA_b5ya;i*|q(8_`bm zG1`SbLA%jE$Xqgy%qI)TLb6C|aC~P!hz_AI(cwsoKu6F~+FY|}>k6Xd=!7)h$%mJ! z$TLPno9EHLnCnc`CQG6{C^96KmzCC+S6AhgRaeE#@(ud733a3~twZ1ZIRv3|=({Fb zq;hOP=bGx?5Snu7G_KmE#~Ltr4Z#bN*;UYOz|@pv&*Qd?uArZyHXm4CHL`l*lcCC* ziqiT}Bf0_-2TY8<`?DIMj-VO3fo@7`Tn>B({UU95+35FOsjt$eM4c${cS?NV3SfF3a!Fw&)n4owSl>mzPCsRa!f_5j!3ahS-fgG>4^9 zcf4X9{lg0qr6r#Dbf!rj91)erVIB)uq|?S`@*3Gnwvl&^ScX>0{mc;J#RtmimI$KWV6Ighs722oI)u&z2te zyw1Pa5oJX84yP+d;4->mveePv#Tv8Z7(5PJ8gV%uOLmb@8gT`#l$QEC{+s;`bpJ#= z3G3+oOa7dU*#2oaj4e$bAe+c5Cu44GGAhV_tlV5YkBU}Nqaw1Od@ijBwDWs#Nd@z94pZTaO+6uOU z_c2HN?XU0-od6g*GMBmChZt9j#lIvS}_}_GFn=xrqcehSo&OW zCmkiHjzmrc_&wkwM+ielv%e(XQT!1lB~#b$z&oXfoHhO=IToE!@h&=};!p5ya-5uy zlK575FWx7Gd3$&r{k0z?Mtb|79*%|wd>?<&NXMqwkc$sS0fJ^USE3Lp%ue*~OiNEb z{m!6wSNeNvWJLrby_+Bg;E3p?(u`URJ%*^J5Y-f-MolrQDMmGo3a8-hP4Pw2=SDN3E?VwY<>z)$1mVU{5sx7kIDP-QT#Q&gfHVO_%;I=1rx_4FddjqlE1k( zT){LjvzSH9VrB`mjFFi4n4QdL%w^_xnOvrqwU>35Wyzk9<;Zen`LbTJKC*tY{<6`s zTG@0NkMr2Gf@HTlo-oATT8U*z}Xe<(Bxi^8L5sYp?@ zR&-KiDRLD>iV{VsqD&D|Oj68I%vUT_NQw=LHxwT#K2dzGIH@?VxT?6Vc%)2Fx|Qve zU6j3)MamLosj^HNQZ7`kQNE;XRIXEQP;OFgR=%cuL;0q1kMgi8ELYi8iK?!ueyWkG z3931&d8(zVXI0BpFR1>eTCG~EdRetjwNdqoYP0GC)o#@u)n3(p)mN%-RA*J+sm`l@ zQvIriYPH&=cBxyaGt}MGnd)qHj=Dr$sxDK9)T7nq>RRiz1Y>hIKd zHAth^1T-m{%&;a~lc(va>8a~_wN|ZN>(sinUaeotYej9Mwzamcw!OB4c9nLg_ABkfIDcHrxV*T+ zxRSW(af{+s#;uRr5qBW&a@@nXM>?d#I+;$c3oCVMomQvQu{x{Hr%Tec(Y4d1>pJQ> z>9Tb>x?EkpuBUE*ZnUmkH%?cno1hEp=Id7I*6Lo-y{>yx_jldfx>LIEbvJbP^=iFU z@6{*k)Ab$oo%I>|9{OB;Km8E>F#TlxbUo3})X&z>)z8;2(y!ES)W4$NuHUKO71r<8 zf2u#JKc~N=f5duNjuqHMHi>P)wqjG+c5FAckR8YlW{0vxY#mG3S?nD48Fm%>GP{S} z%kF2tU=Oe-*i-B;>^=53_CEWNePqxYYzBv+i=nHbyCKW)grSEa&(PmcY8YdvG0ZW{ zGb}JHGAuT1G<;~-ZV2x*>@w^&959?QoHcxBxMH|#ghq?eYfLt_HI6XW8|NCA7*`r! zG_EqPF|IW>8rK^)8ecKKYTRPnYdmiJ*7&3Gj>&8Cn>dqT5>3rb$)=X36jN(czNyqS z)-=&XOdCv_Oq)%wnzoqUF#VV5@1}jGE2gWa>!ur~Tc$f<)7|)G@vGw3#czp!KmL>W zL-FV0&&OYgzZicx{(gcsL6^WL7!#T$3{4o5Fh5~M!b=ISC%l_*FySY&(j0GYY3^pu zHxDw8G*2>5F+XLVZYJiL=Go>s=6U7?=0)bk<|XFk<`w3Z=C{lrn)jFwnZGrkGoLqK zFkduZHeWGcHHWWT%oeA`ZSh)smVkw~h?eG-BuloXk7d4PndL>xD$5$nI?D#jCd+2a zYnIn7Z(2UL9I)K7+_BuX+_U^%Bd1M7vi?z44kF}pQXf3o3v<|iowN_fIt;?+| ztShZASpQ~SZCz_^w63#mw|;9qXFYGdV7+L)Y`qe;S#8a2Eo`l9skVIEI9sKy+E!z$ zwbk1u*e2SR+Vgeq#cg%3CaU5~ncB-98&NOEyXO6SL+1J_M8FUsphd4(&%bnw#mChN? zh0Ybu)y|F1x18IZd!2`!r<^yP4_s~+?`q}BboFo*xJq25t}<81HQLqSn(kWRTJ756 z+V0xv+U45q`qXvQb-{Jfbvf+1;=1bk!|irwxO3h8-NW3)?&0nc?vd_M?lJDM?uG7U z?#=FP?j7!3?%nP^?!E5)?(f~dxc~5IJgmp+N%f?AdU!^9MtR0~#(F9|Rh}Bp9MAKf zt)AVU%bqKqpFGz**F85pzj=|D@yfkQuiC5in!N#Us<*SZyEmNW?d2`@mU%0@#Jj+| z#`~K0u=k|*uFvF)_nCcGpWWy5xqVr_;l63Uuy2NMmT!)4o^OHgIp2%E4}IHxJAJ!+ zyM3SfKJ)GKUGV+tm-*FxtzYLi`Q!a&zt!KupX2Z0ALAeEukcs-Yy7qTdjACf3jZ7a z5B)p*ABX+B{h#_j^Iz~^^k4R0@n7{{_umL;0`5TPKt`ZjATy91$O+^ICIn^$)&;f% zt_6M$+zi|f{1Uhq_$_ch@G$U*gB<2$oPtwv8ZM60a|X`D#dBuP%Go(5=jObepW`@z zOXQNc7F;_no$JWua)n$4SILE|x$)c-F3io~W^r@4mE0EY9qvo+BzJ+k#@*uX^PTw& zz8jy(XY)CHE}zf$;tTk`e1HB)egHp+AHomgi}~UF2!13#iXX#|-h=% zBz_A26hDW*%wOTJ^4Iwr{4M?tf0zH2|DAup{~-VYg#|{C3rayPXa$|X3Pz!skRVtD zo8S;!f=BQP0f84pp}CMOv=mZ=)W6^ zOSmK46@C?d7aj>=ifJ;mN)AF-bp6br?H;$U&8SR|H+rDB;F5=V>W;yAHVtQNZWp%DvA{UQqw zHH)&kN4^AKfvey;xB-3wzk=VP5!zt_OoRhr0UQF0U2) z6xEt<+Z^I+-Js^R{;79NTY=CFrIruHS3a`N%@E3R+{tE9Qj2NUqO0X5h zAq~UR1&`$I^I)sj+579^H1UiX6MyJqebQxVipQEqPx9BSR4qZn#(D&#^ z^b`68-A4B?zz~bE1naQ@N8+&&JFpYGuottqC2og1;tbpgXW}f}8F$0IaBtiP_r-&7 zAs&o}<5D~Vm*cUx0#CrTpa=}bb$BwKf~VqHcs8Dc7h?g};}v)%UWH%4Z{x%GU3?6m zz$fv?xDlVjcbEj!8q~vVrWnj+h6y&*$uyan!c1kJWu`IHnHkJXW)?G>na3;?iqTK; zpO8!B^kk?aBKnvN<0eBjxh#b6Pxv@FAq-+}Ln!nSC7T6OuZ5skW1KiKDKRy{-7aZT zf_q|0s<1-zjo;U@Yp8resJg7QBrjAG$_`bH=~hu43Xd!)4YlYS8dXzX65d%awjik7 zxlI~`1)qT{AOeUlqZx=@8VyksP4Ckn0D|Ca@Xe6C{LGr_>dK0&P0-%Es zBG8vI&4(B=U>FoZF_b_ll+mXGDq)-k+ypnF25O-W>Y)L~3;X0}(oGtt=!1SL|1MY8jc7mB;D9i>0Fo){bl|H+{T-Y7_z|YL+A6MNCNwVqMgf?nbSJrj zM#V;QNf((fL)zp;YFTS(;lz~IDGBbRq?Ac#r~)NTxWhs?7>uMir;yZwiAk*!+{uZP zVlIS3VR2D0bw*{lA`~7_7OH&_4g*`k%YgsuaFemascT><96{QUOp+70K&=}EpMYg> zG#mrV;aFG!E8#de9)>|Z)w>$jKvp=fs_*tBtOHeWB77R0fY0a{0y0Q@q9W}`8u4nS zpaCofGbl4c$!2#?Y?%_hlGD-viEpGPOsA7G!7MNvJ}bPT4&qsGws1vll+6L_;oN9! z(l?q3jH;~;uoT_ zGn1&uCS=yabwzpk{Yr+Hhq5ZmYsOZrgKGi*?@itSH^NOZlQ+XHG#WaQ&Lqp1u^=Pn z8tS7l!-O7ccccl1?M*Pm5Xg=q@W}j~|7!mKw1Y;Tg(BI37)g4Q;``x&p?Uc|YpSEF zcM69~>ej>k@F3s^`e_PB-~Wo~p%@77l6caU=twu=u(oylhhR%n6wpMCK@bfM0qRVa zztVmjr3LdTZJsbo>&R`=pb?%ej3#*5xTc6|Y~n?84xR_SKyUB>UWnygKD-Do!OQRy z_$f_+E77c@dG{5)KM{uOa%B1k^dbNP;U!&4&Uf%SWt(3bt}HJPg*U+O9x3_X82$bE={bObi5-xrMD`6gTK@DgQ7)5Sgr4%xEBo>Pz`F3eCJjDE@+7v zh*U^T$+K#zsw>CF$dO9e7w^I>G6^F1uc8Y_aOWErv33WglWiCoByJjjcD$PaWV zfP#oc9O6+k)SQ;a6R0I9M2TQ1N=7Lt6}3ifP+K})Bn&oI2~tz7>Ukn3OJw9ZvXqR} zAYp;Y3fl-qHN8LS&j3H%GGMcbdqFfehJISeuw5%jY+fH&4?LaBX zlO`2TOm0m_h3;mjs|z>|K1BJbA2nnE8VF8Ng$ltL&xFKq@>hX7fnf`Vp4@QqIfGsFpQ?e{5=iSQUopJ zNus5xRV#dFX*UebM6=NBKXp#6)J*D#rdZ?tZ#_7(vV6q(haQOGA47jWT0j+zVNVqu zN}eVYg-UA*`#h~y(Yp1)LqwN?6W}CTfmTx2zJOL!v#Y>av`#o?bx5XA2R}n53Ex{2 z+5_WSXHTp-LKejSICTtzr1^7q7))Z=Q#Eg9t z?Llu*=kKF|R)`Kp4F*H0lfb9Yyb>V`K)INoJARWDc1tw6cG0Yd~jEBRU(c_2?WrPg`jY6;gyQqDw+^ zN6@}VMi%H0EyxXjLh3UTg=V2J)?v;40)6?&?&!v6J^CWrTAD!m8h!I6w}fJ+9si2%2+ugJ^!Ki?!fBIqq;vP_+r`smQvM42%V+GiSZ;aa3)#39+l2RAts`#ip;arpEVhd)3D>Q| z?uYhaANCh(;`8$J%7$lBEz2rKWmQ&Ggi5O`!|QPX2Lb<|rfH~AqCZxjqt@xL^pT!$ zL`=_SxH(Sn;TCk)u$gQnyU6QgcO!0v6LAtwrt4GaPP;X|+X~a%qa}h-8x;F*I=w?ozB#)BQ@%k_sBhBYKA`pQL7VjjH$0!%Y;qxO=fi`>^j(EvuWF z$BVcJ?uqlFbpJY8tkLD=_ZmK$njfPOmU&7||1hcap-BVqK-@ymd-E-S%%QC49Cb=D z9!9O5CPcg*$DiDWGGnx(=!!Btnyz?C*zZlZG&!ykhp~Mf9*4)1cgUf2xC&Pbdf#LJ zhW=?v{|t^`9i<=b%ZYEIe-=;2_O*B#IkpzhARh?tyIQdS(1*n^wVHhK^KM!UI$?xaiU#&87O5Z#311EhhJ((HbMcA5&>1*&P0 zmJubbW>3?GHD6E!T!R|P#naJD#qR(wIYSt_8S6A|Tsb}EL=Pbi_z0a!qA_z6zhA5| zJe&+wbsIZ2G@`7eI#gaKBNxco*v1uqKsT=VIR22FBj<&wfmV@I_;j(xoR{CfDiqER zjV!4tudez>c&x___)Ii7{^N>h`~M@FVxa~P;%Gq2a(~s%T3}6N_1cBM9)otZ97H>Nw&lj+6uVe+Y!1F40BnIfi`85d#d=mCEL)n1@# zJ4%qW+=*qA{WgqA8+hMbkwyMYBco zL>om%MGd0QMb||S#0s%d>=Se1X5s{KOL3w&S)3|P6L%L65toX~#Z}^`#S!sj@l^3< z@ec7G@d0t9LHwEchWM@oNf?P(B9+J`N{L?Lmb8$xmSjmfOS(vUO9~`KlCY#&GC}gB zB_B)9Nv=q4NN!7^R4O${n@dxr-KBk{CDO38S~@}cr1UB2 zYUxhtZs{A+H>Gb$_el>(-X{YGYs$P#58Wc_3#Wp%PSvgNXsvJJ9Lvdyw> zvR7q0WV>Xq%ifgjmF<@uke!sBmtB&5BKu7CqwJ3Cp6qwo138e(RZE9K+mv*kBr&y}ks@SD?UGb*k9mNNVQ;G&fqvD+6f>Ny1D6LAr zGFRC{nWyZn?5pgj9H1;v7AlLB#mZsIGG)24LOD*^p!_9H7nd4W7#E5oadYFA#O;nd z6n8T2Qrs;SqjITIRc%yhs>dR#$5rX7j;c8ABYL059>IKyr)jHKy)h^W`)p6AY)fcL7Ro7J4Ro|<1YKOX+y0to6ov$9O9;pti ztJM?KPpT)Yr>N(s>(xutJJoNh-%{^WA5g!oKBPXPKCS*#eMNms9l5Q(qrRv9U8B~R zH3^!wn(mqcO`YZ$4be=|Jgb?mnW>qrS)f^_*`|3_vqQ5>^Sb6k%>~V6&8M1gHMcZ( zwJxnk>(d6bEw!z*?X;b=S=wRR;o1?}k=iG;qqVi#soH7UjoO#ATeL50w`pJ1?$GYl zexN<2y`a6R{Zae3i1uggFFK%$)9G{uokPd#Qgs=+fx2>Cg>IZKtgF_|(=E}h)osz8 z(_Pcu(=+-wy;`r;>-7e`NpI2H^bUPc&*_`d^I5)rh<=nltY58Pt6#6*px>x}Nxwz^ zvVNQXRsH+=&-7RIxAgZ7K10C38aP8ULxQ2DA=1jw#qfk-w4vNkVHjr!8>)?Jqt)m$ zCK}U>ImUs;LB_$xB4e>JY@BMGW}IQ1Wt?ODz{E_*j`IPyr`Mmj}`Lg*_^A+(3!BZx+gjQZZOOK_wlrINTe_{It&=Uw*4Z}NR%@GXn`xVEn`^7Lt+H*j?XexO z9kn&s8g1unS8Ug85A2M+g+0xlZO^fHwRf|3xA(O7viGs~jo9<;L+oYtG4`?cO8a?MLljIn0hUM{mb?N1bD`W3Hp#vBa^|vCOf;vBvR=W4q%u$4XysNn@-8IxT$u+~Z$hE??%C*|H*0tWX!L`Y?*>%kIvFobqmg{#n za3i^|Z?>b~s0=}~yBo{pYQ zo=i`+r?aPvr?+R2XRxQpQ|u}6lzJ*6o{65B9>KHJv)r@Zv)l8Q=R;4U=bGnlUa{Ba z<-B>`e%>nYLhoX4y?2Rssdu?|rT1;`C*Hf>-@NyIz=wQ{PwdnAOulx$$9#|bI`}et znZ9gaj<3X5FY;IV=lbXS7y1|b>-|goOZ_|jNBv**RVu@Y9sD%dzy&1zXa8_$|p3u|K?tc&%qJ~qIzEYCJ) zTd=LzBsPU@&9-IJ*!FBX+mY?cZe?F#x3jOYk)7;r_6>FqyO-V19%SEP53@(uqwF#E zIQtQMl0C&Xu#N0F_5yo}{e=CD{ha-h{hIxjy~bW=zh{47e`5d6-ePaFci4OE@9YB( za+niw5>Cb`xH!(p)o~NKNnC`R%uVH{aWlAC+#GHmw}4y33EXqs^W3rsw}M;6t>)Hp z>$wfwCT=sgm3xKT&b`L%idO(h1%@=BND+_@ zW(Wns0)`ZZM6j$QLk>_)5m-$*Lk5tYH`$g~TwMWZMln!*3Q%7;(5xIFoe0*I1lFMk zl+$9+-`vj{%}6UpOg7<^&`ktdrvP+9CeVo)Kvo{mA(+mBI%je}Yq2lLLy15yfdU{G z?Cn$_E0G}y$SwtY6l4;_d!f@tbd&?hq{;GZijx>oy5^Jy)>u?s%MgyP6rT8Mgg0JFAT!U-zHC&Gy za3lT&H{lz&1-IinxD)r{K|F-Vu@OJS^Y|%#hM(gX_&2dYR?nd?uaeNQxu3G3#a`q(&%q4l|~UK8A(Rl$QUw$-j5qQ z%x##s9>!nItyCZQp&S&LOc_-|0IFb$A+SlK+$2{+QV+xL!Gk9 z3MY8_dA!~RYS;@gBdG`d6@l!7{dXZFOFUE8z&l4}!ve}t3a2#xS49HaCa z!||P@dCfNpxq+R!_e|;%6_-?3cMeul0Tnm{XW_$eOdnAV&%t@P0H44Z_|!PV4HG|y zFW^gxx(Hvv-{9{?ye%fp^+;NIx!2>KUK#L|jmXNRnNRn7iz6hzhD(%m$hHc;hL{hj z?`8NGd<*}E@8Cah1+K#P##-A@`*mtn;3v2N-!0~&f;ZupQ8ZY;*I%&;Za(0M5OPF@ zbRu0y2hx>FSwwfJ@OyJT(*j|qGZ0=7+0cUNu|PV7`5=e30!hqvhk%(S9&d3-&(+k- zhxDbTnpPAj@%ysw$&3yZsLc29YtRvq8Dh@=rjEiYqlnT2Du2yC6b!4J5cm5k*T6Y! zeph8$r;m^X(w=lC_OozDZfuQF*arR{o!TD4AKCE`=}y`eNXq}${thc_N97FFH?3|3 z+hYfqhcVbGlz!|=lfTy9*`1I`b01&VC8{Q_2Q7ny_`15sYvL1QyF?`=#@2m`@vs^b zusbHg2JAtrV?AB+3?|{D*b_d&WEg|Ju@ClzT1>?>OviqhVYGGZ4Bo2}91x-{o3#+z zd*Q%E92~MsQph}9h-79M4yW>`R|NuoUnD8RB1wrnc4O}7yN}nP`+*$XA1ww);;7$7 zOVUUxN0LZi+FP8o09-XS39&uy1s~rt68s;DxG)@X9Twk>nAk}_(u?+%bkc_;m)50c zr_7EW6+1q5b?o=CJ7SN<-i*CGyv6Ti1xs<#uQXu_8K?jQK!(z`JA^z&$s`yrh$+D{aIZPy64HXS zB-u2%?x`h#qKT*RB~Wk~zI?a2g_xH;V9N0s=B z{Zn&2W#wLqTZOOFMm{xci{Q56Hbaz~nYQAaMrXN2+gi}@ZQMZ*EQaKhg1i!6WuVaO z&Gt`CjyUYX-A1Y0+_Ve#gdD^=>ad?Wq)>-KQebS6nkM!Lx=*>7I~9N{NR|ASHw*Fz$(k z6`tboLcSu8jf{^_x`3Y;^OY9X2E2fOg&1RztX4)(V)D)#!GmXcEVE1-Al^IL}RKNcOS0$4($b|?!Wjm#YtgY1*xPsS&QoejJjD;7=(1%6sObkznY$rH7L?{)*k9`B-CRm zRi++Kkt)NdH7QP`VrJ4x9!!;)dK#iYVRU$yOd;m6w3_G{SW-mG!S9PGvYKf|OD$B1 zbShz5gf|0?UXktc=yrK@M#-a7N*I=A>ON=&^j<-7BJ5@}>WUCk`c5))nP=(ymX$tqTq#X+Mq!|E6*D*VCeagj zuxGlbIIW^+V#yRw#cAeG%mSFmEHq}gdItkojqC7r+=a*R6THN*bnuO5vY8Rglgv1# zm>JJZWJ(z?oqNma%o|{)FhOP>U11^f8ncDj#T;VJGUu6#%w^^pbDgsOy#C&rfO5Isoq3PjX~2n(@$oLSu(dYcQE%c z=b9&*>&?r|Z<-IAKQMo0{>FTZ1(spWtcB%Ro^`MSE3z`HvO3#@ZN|1@qu7VpwrmQU z%4V^-YzbS#&Sn?0%h*@g|ypOdz^ibJ;`2YZ&@ss4whho zCB>3u$+e8MjJAxij~@o)>GEg*0a|0)_+*9a>$uDma}pq7tM9yQn(Cm z2seg%lAFMlbG6(Y?m2F0kXy|i*xs@2w(Yg;vt6)#W&6hV9dG6(z9rw8Pv8^zB)%u# zi|@l{@Wc6hemo!Gr|{GGr}(-20=|J?!>{Al^Beg+e6W!}$$!9~=P&a=*wN10UG_Hi zO#49lAp2nZ5c^R3aC?q@l6}5?fqjvEvHf}b3-+b<_4cjy?e@3qJM1Uz-#e@ho5SvK zIGhg2p*S>06Gu}=oTIm6vSYU6dB+CFF309m(W*8719N_FhUq5j1lsLVqvmSEzA(+3rmDu!XDvWVV`h7I3yeqjtR$wubfSt z&7BW9TREeg4?EjB+dF$X`#8rri=E@06PzW^NzO8--&yXQ>)hjf*SX($(0SN-)OpC-P#@Aqrx9u|O;nE5v{}MXV9)#Gv?;I76Hz&JpK|hs87EhvLWL zdGVrnS-dXZ5Pz1;k|0G(9i=!aRT>}-l^&Ohq*7^yv_RS-9hXi?7o=~ctI`dbk(Zj{f<*A!i8t;8su zm99!RB~D3D5|zHna3x2{RmLjQl%O(S*{Zy)e5`z-{G{AgooZ*btJ+PCQxnugHAx+& zj#Go`Q|b(LmO4kBtIktjRbNvNsYldfYNL8WeP2DLexu&hSgniph!%|1;$&=$^o9C!x}pDBU!uRLFVkPqm+LF_27Qgb zPG7HY)Hmsy^)31~eY^gazC+)s@7DL~`}70)A^nJcOm8%vXc5!%rv8h5+r_zTF1t%} fMY}q>l3o2=Pr7`OQJ$gmQRu@giu}F%?JEBtpX}8h delta 4452 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 literal 15425 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Îk<2YljvDMgSoNc__xX5^?afxxG z@iF7$#!bd8#&?Z7jk}B=7(X)ZHU4HiZT!=C#(2*7w@GP=HN~3}Oc|ydOnpuLO#@5= zO=C=xOdit|6EWRpnrB*IT4-8nddSpn+GP6FwA-}Tw9mBP^o8k5(;?Gg(_e{>#J-6| ziN%Q}i9-^HCJsv+o>-YUGO;>wOya$X>k>C4KAQM=;xmb_B)*rpEAfNGy@`htPbZ!= z(`Kc))I7vI)I7{Q++1lMX|6VpF^@HmH`ke6=6bW++-UZgrZ9Zr|Y(8qfV7_R+lq64zOj0JLCuJsO zC0Uc~Nu^0clFE`sCRHbmN%AKJlUkCdC(TS+k#u*`JxQyQ?oWCl>7}HXlio^tC+Xd! zok_=%en>i=^jp&Dq(3cMi_Q{jiMJ$J@+|q5?v|dG0?R1NXv-MOL`#EZl4Y)CzGZ=B zsb#rkrDd~atK~_{)0Sr~pIUZX_E-*Cj#$33oU{CGxnQ}NjFJlTRi8 zmV7?>Lh{9wq!fD!pW;Z#P3e}>C#7FXU5YDZV#<`1sVTk`f6CI7SL)-q;5{#n)+1g%c<|Dewg}k>Zhr@Q@>66zKct;Xk4o33 z=cM;epO8K&eSZ2~=^N9xr0+=IoBn6|r3{=wXRsL&8H$Xk3{?i7(LJL)V{Ark#)ORe z40lFj2FX~F@nFW9jO`h(XS|v5cE*m3_cC^6e3S7XpSr?&jMrX^i z<=MvU^z5SS;_Q;_!P!Hy%d;!8J=v|<^Q;Q1(i&~$tXiwi8fVp84OWxYY_(WZtZCK^ zYnIh&wOe_s)0$_^xAw61vi7$2vG%hTT8pg3))MPr>rK`&Yq_<;I>K6I9c3MDt+9@? z)>ToHQAbNep}Es%{Ie!t8JETwvE_sv(2+Dur0LRVOwmw%eKt6!gjaqUfX@P z2W$`799?VIdd>`&UC zwm)ls-u|NfW&11k?e^F0Z`$9s@36mT-(~;6{*nC?`)Bq&_I>vK_5=2V_QUq0_OI>V z+K<_Pu>WZP$^MJ|SNm`F)Am2@XYA+ff7}1DU&_HbbPk&nk)z0o%2DO0b2K?IIk7qM zIffilPI}I#IeT(G&pD8DDCcO-H#x_0j_3T8b28_*oIi5Thetfk%XkH^Wt0TlpN`$#>&>@CAGyzCT~Y-^dT`F4H-{}{iC-^xGDKgYkwZ{xS~ zZ}4yP@AA9&5BZPzPx;;aUjB3b3;s*~5PyXKivNcHj{lxN&Y$3a=1=mc_}}?I_`mqG z{CWNYf6;*)l!I}|9CAmbL+OZia1O0Q=ZJIY9R`QVVRl#?DULKph9k>ib=V!e!|BL# zN%u;V62nWNlM;TYkla*T3}cGNh=Icgmf93IEb4zHud nG0ic@%}7bH4e``+n_wGdqUA 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 diff --git a/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings index faa546c86d66b947157270fe6bab01f99bbde633..1925ba49ba6ca45875e261be25205e196d09547b 100644 GIT binary patch delta 418 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�_sIUKz(^eB1`fbTWi@}Skz)E>_YJ>Z zlX005Zgen$Zb+{x^yf`&#uebkmAL9!eND+J_84hK`i+QSk;b*S&b;7i^T67xRU7N@ z*{qcGF%|xtT(2jwtSo2dde&ACk*tD+er8s)^}(VIk=ZKKh3%v0 z(B_JcWe!T{)!WQbqsO#*dlUXObY@H{EXns(jrSCndUO1qdfdd$g{n|nYusjhDO)9s zg~Hsi6@IUWmBEq{c9i%g1=c9N_LC9K~Z0$=<@vYIYIZhFU!1uB9IFhr;DG+V%-54fq%f3@#h{Eqcy>-XN&SAMnc-*}1jZP5F7 z$19xnlIq6aVF)X4Ys4 zbvPY58Sd>2@U&=Epq{&B1Nm}xE`o%#)D^(2{*%@$!77_MhH9~{%o^Vh&E}Rxxgp0yY0pVxilJKi= zS@_+`SuIxHDqGuG+gm$YBdndRcUiky@39WEK4hI?U1r^DJ!eB(XIoEOZ`(jyk}cIX z*;Z(qW-GS&Y^Am`Ta|5&&9p7EJ#AZQd)Btiw%c~l_Ob1A+j(1y?UJ3dEB3bbF7|Hr z-u4IVkJ;zi=i48*2Nv2F*_YU#v@f+c+V|T(wg1b0Nfbm$bc%|oif)mJVPd!#CB}*U z#i8P8ajcjsri+zgK%6H&A=ZhF;tuhBu}M5A9ug0WN5o^|7vcr+7m1Tp$t@A7gLJpl zO&TO6N<*dL(*07VR3H^eUa3NwFV#wG1JXw6RcV)WQu<0dC7qVeO6R2u(l-v9;~qyh zN0g(dBia$`=;avhNO7b((j5~V)s8yHR>y0O?T#IeHypbhZ#mv}yz6++al&!d+0hy2 zOmt3i7CL7+mpIotpK(6#+~jO@zT({C+~$1Uxx@K}bGLJk^Puyj^StvL=XcIPi)@jd zvLdUpTPAV`xtkm(50;bUH2Fb!wme6kC(oA`$WO?N<-f?a@(c1-`K)|iz94@qe=q+a z|0w^gSQWd{L%COpQDT)|N^hl)(pTxHq$^p9sVq~TR#qyjm9@$<%CkzN@}hD;`A}(A z4k?F~Bg!%5lYsJrE6UZ^HOQ6d8tNM98s!@8N^y;IrMbqtCc5Uko^maBt#GY!t#>uL zw!3z^-gLd^I^g=sb=K9QqH0%FHC(+*?XC`0Q`G6|!|Gynsk&0FS9hp;)F$-{^`!ch zdP+T`UQ{n@RBNww*ZOM%wZYmDZJ3s(>K-;f1X$Q4K z+F|X4_Py4kUDPhS+qgTq`?~LU7rV>dOWmv8TiiR{&F(MVS9H)ho!70pU6=GOdc2;d zkJl&a8G5EZS(%-SeU-jOU#HjU^?HN8OK;MT>c0~t79s?QjfliSWa1(k(FrAY zkhUb8bReC`oumu7oAe~nB$f;&NhF0#B99P*%qDZlJn}eMNEVSLq?RltPm$$h1zAPb zkaeVv)RPACA~{9QkaOf~@(uZpw2+JBC-QId3;B&)p+GsxQ!BMoi3Xfhp(=G#Lc?eq z+K#rT9qFIwLo}D>(JbhT1%JG zr|5FJg07-#=sH?Q>uCesNS~*hXd~TBU#73pt@Jgzo$jP>(%p0qeTTkF|3;ho&<|-d n{gi%2Pteo!C;Drc92OQ97naz1rR3N}Ao$^yw0>XvA2#$q@?Uo( diff --git a/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib index 23fc9a8632b2380b9b101a0167e55e40cd3ef4bc..5a815712879ce26b67c8d013fe39d18bb9762bfe 100644 GIT binary patch literal 16556 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 literal 15380 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 D6G8*H diff --git a/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib index 98d29a932f36a852e2e298849510c3c318fce49e..8cecd70a4901aa4c1946dfefe6c3efcd27306465 100644 GIT binary patch delta 6511 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 g4F705qzFg{ zGlT+R0YeHyB3RauAqS|Y2&|@@Ap^+Ho6O50K3RaBMY$NLJ_V?+9B5V!kWK{aN&@T9 z1IlSJ=x;V=;b)|wBP0Y9fz~MiosbE1Vg`_vH+dn8C_B{p$;K?jz90`I0=)q8a4y)J zsX$gDLlTf(3icRCXC^R!6o7n$*A;;BkU#=?8)Qc+L(;^v@{^rdteA}%R3=xmX!}vs XaE8qmtc&>Ab%Bn`XV9JeP*@)TB9&O5 delta 29 lcmeyQJ3(WE8O!EVEIf>xRXAqwu`4i?Fyu2ROg=284*-#i2$}!@ diff --git a/Sparkle.framework/Versions/A/Resources/nb.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/nb.lproj/SUAutomaticUpdateAlert.nib index 78424ebc141b7c2040825ca977bfcb74ff77c95c..ab9491fb0f986cef00b1a676e3da78ab068cd1f0 100644 GIT binary patch delta 3991 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 diff --git a/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.nib index ab23fb746566d81a66c4c5503b91f5f1b6c4d75b..14bcaf7264f78e29a215d4a0e1815224fd2eee6a 100644 GIT binary patch literal 16551 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 Q9~9|_nN#;{xC@8=1?~+8F8}}l delta 6355 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 KB=#$?;=ch%Ofl^M diff --git a/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings index 05a426d15c2900c117e662f8d7828db5fdde0b88..25e207938302eca2f2264dd4158f52c2d0ac1c97 100644 GIT binary patch delta 419 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 bpf}4~>J3D%s0>~G;TN+e`v2;?clLh(-z0N{ delta 3907 zcmb7G33wD$wmzp))zwwiwRP1Egf$pJ5)uqS2(pEQ5D6i{5SF}%iCLP^p-Ds1Auu7Y z%VASQ1WQCk5E2&I#0*Acmr;htC^CSGsNgorfXiSI5gB!EcY-Y6``-7a>g%qmd(J)e zpa1-I?rlnLNM0Hl@hG!sS=7*ADU^W+CPO*QfI4^_o`x0h3_J_Z!Af`@R>2l{8Jgfv z&jW@6jLxAGjSB= zU@jKm12_rG(1VlFkJE7m&JN-quny~*T4|om#g}*RvhA@##dnSR&f)Xf% z7RJj|zy)S1<71{Vm5iU6&dgw{7&{j`Ma*Ru>h=EZmWWaqe5;9>FWWi|2 z1~=ru7`WeF8PP3bJe1gPMHJd8ERiSW}Gn~_5TD$`Lh;vlW ze(}+LlI!a~fYtC8#rQTHg?GYP9HXoqr!<~~cVPm&Zx0ggS3iK$@FDg32tI~0aMpfK zh|P-bJ<{Ww=?QpCi*r0Ro^((3)Xd6&r)qL>sV5=L?<;Es`x$&r!Dsj@0}b#Q#J)$P z{2ji8uizZ~1J1(*_!_>kS#gYXk&e3IduV}w*o9(r@G|^3k!J1p`Kub>^6fLPhG$;0 z;;eY#xlGop0pOLHYjOe?4-od_(N%TSOG58=WZJMt6qPB{(2Hx^JKVo$eYq zj>dJmsYH8QeXSl=FH3qC+IYwI7=<0+Y|OA85I%HQC+i-odyy9Ne-&Y@r@Y2jTonS@ zjY=K6P<}&Vr&7nR7!C9B4vY!O0(($VT$19)CQ(r&)yGHI^-1nS0Vmbh7t|&7ON@_B z?w44927AG3jK>7*4eRi3Dw{?c@NG=QK9~f@urEx&e%K$AVJ6;-191=z#v%3$*S_HO zG=^bnYZ`HFX|QG}jT?E6z>HfQG%aM$m0K&9g`;VC(rN+$e`RaYvM~FWqTQ(37`#9K zx^Hkjj=8O3w{S5Q^C%bNZ*XCyS;L%Gsx_20A4MqABJ1js2HfB#M96=_O+_0yg<*1P zvG_VUmSm+{gJ?$@ZVj;p7HLLiWp$v~=ks`~qD#CL(Rl&?^xTeZBD)20IZmOFD_SAL zbSSV!S{Y93KHI0XADh(wKf~7suR08G7S6m0-Y5!hgq3N(r9|DM!A6juySdK9%JR$^VReb zzjshvZgsReTcNt<)p`S^Q%>MB;Kpb1x$E69r+Avj8f)d<@Cdb3T!pJ`MQcBNRa=k6 zHMq7gCoj7uP+a2kq*hfG&u*k+4G>EkPWZ8)u796o`YrTJs&DOL`*3|@xW#(4%~@D=b1L$R~+y(;AYybYr|u$elOwnBF)Un%kh?ssR{Tzv^!N+(&f!x z)rc?Q%XU}2BR>;Nd0SFL4btvL{F+dF3g|05 zN8`sELvFGK+HC*Ci_~Trci&{IZnOP_SE=nU#^7G~E2D4M-1r-$(RNf#SK$C%wQA5w zJ4sil#j!98%V|Dy@Ti?&Mww}pfRR)p*)*Hl6F?Qh7=HxNwk(AOAWF$oZx7s=x`N;1U!; z6WoF+L<${+c%iQ_SQsvh7RCsF2nq{?$AmS)R$-TLSU4se7fuTA38#e9!l%Nw z!p|ZjYNA^-#m-`PF-}YoQ^n!p2=P9#Kr9z4M4wnAE)$j``4@?QCS z`I3BDz9L_hugSm2zbQm%rwmqxD#MgiWwXC5#Qns1ng%){p2h(IJF6P4)1AcV9dQKTd3OuCY8B!+Y+cad1q zizJZX-J}ocOZt&yaxWP~hL9AJN=A{nWIkC)9wm>F$H^098L`Q7vVuHIR+3fZ1+tbj zlJ#UG*+jOGZDc!XB0ESk*-3VhJ!Bs_Kn{{O$RTo=93gL!qvRMlPEL~d$SHD~d_>NW zPsnHF3-Tp7N6wR$0pt?7OnxQ5MPj5F85P+jGBNVr$O(~Ut=m0@F72U%S<-sF{vSE{ E-}DeqeEDYQ^1loHxd0;MTQ%2mNx6hyr6 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 DnU+9* literal 15426 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 delta 6426 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 V8$gi*CjBr=V^4aQM1S#j{s}O@NhbgR diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings index 95923ee0bb2689fc1a3808b5394e0b9ea840bbec..de38912253dc032215601ad3b25edd3d2dc564d1 100644 GIT binary patch delta 423 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 E3v$nr0ssI2 delta 3969 zcmb7G33$}h7Ct9UCX-~6Nivy{wk#DCZ7I-|vP0QR=@clGTCt@|pi_nx+8GL#G67i> z1%ZeQi((6?h$yniBAcJe13_dFaRCuU1YB`NP~M%HvVQNq?>YHqCb{?AlXL$6zvtZ9 z9e+=o?}~VYnzJCXd!PhLL5I;W1|~o)%!Mc6DR>&5fyJ-{mclZ48D4{R@H%XSEwB^z z!an#2K8I8AC42|p!w>Ka{0>*(F9f8KMLWuP2R6lKcrV6c9CpVZ*atIkAi8k~=HvZ1 z5=&9X(O8M&aRN>b;DcC;58(`4fD7?Sdsds1`LEu7zA0Mf*Z17 zu(>4S&WPbqY`zy!VD_M$;z)N+PDz!nR}9rleC86myzPC4WaM$i2qWJRWl9}C3Ba%! zAY-B2q_#FOxl?>hhlG^6_?X%b9a7AWOmjyWc%YoTVJr-XaZmx3Fy8bqX(NUkxeCHz zXhY_zpz8}z4LuEn!t@pG^oo`-s9fEBP3R>2G8 znn}Jd!D@2`J3@#dHf!J&SPQS37umFt>tREoEW2}h`>TDG>|wYY zTEixI<9>He#<-#}dT-t9Z6E`iAvTw+AWvbFt+4HyNv=n)SqWR=P1p`Q%$e3ZTiu-1 zSlC6f+6`}!klqgEw1;q;Z|=1Yh)YdLijPT5tE)Q>&%%2o%KdNv-Vfz*kl=QR0C@zC zLM|LLyKsZ;$Khl6gjjtFpTP+@X)fksGh^Bf(7h9NpQohAt^4&pdiB_h3ZGszx~N2N z+pE%B8V>ghI8DOuS6Sh!hc6)ZL*nHtI0Ik9S@;Id!Fjj<-&t8cf7a*crQESL|j^u)P(ymPSuZ52q2=mpqnTc7q(0PN+Y#f|-%{H(Svv1?_7BGfl4gq60 zUdO`dW%RTf=|=Y(Y$hcWHpAE?b|Sa`1e=zP;1qJk^) z*0)492Fplf<>AO+Jmeb#jDA+5zd28e3?%-uC>n#P4h1m@C*BmqKoUe>Bg5!sbROyU z=rNv(YG0ApUq1NwZOWg9Q?QOi6hx{dFBDLgG01u|P$Ai;b_|Lrxnr>WbgZj8dAo9O z=55-UMYL0mkKi1bjE~`55}SjlXTCYr?ve(oK#_(qgjDow!)?~v>jKv+E-o^njb=uW z>zo>oucYiSJ`E~9gNv_KPj}Hc-56@*+^`6iU|fdJ7Rrum3JI0soN$@OWsPMTm*evV z?wl;Yuc+9or&m=KO>Q7#^$?pzN>=DOKiIHHj;Tp?;X1e-S2hI8G{hFl&e~eCa}t6` zB&MX0+m7ZjIf)Bvc{RRlCMwSMt4ZCj@l=#n)`Z8`;;V(S=FV|@inIMbuTH95MFr`j zl~oP67GE1|57Xs!SJre6JK2m|$m>H+$ns#lyvfUE+#2+f zP(!@zAYOV9FGWV-1C3q=6_M)R`6zUU9?+BQ?@7e$ZDQ8fY^p}x@vq=0?!|qCr~Nn| z58(TF5I-=p)RaJ`QEuqQ7{g-_77ml8`FJ$c2Xo4bs`S!~pr|TJbj}zZj`A3OMEbuw zXLz+<)khy)Ba)zsH`4J3(;=yTjb}+Z(;eMzO4Zjm_XGY&=8ieq-!xaNH+-Z$`_W3uVhgCjp)d)@5csCx0n_V@)OwMvH-Kn6i-1Q& zK%`AM%-6K24)xR>^+C0TPCHa&$SY{%3j56?e)CB4$RnqpJaYcYBUI(VXY@-^s16F&qTfIF!d<)7!*@; z&Bd;*ft?ZiBfgFJlcs5fj;5379&{dEPW$NT^gOzrUO}&-U!+&lYv{G~tMod0J-v~B zgMO3VLGPm9qEFB#>9h1jhGim|yO;!~6Vrw1#`Iv)nLbPwGm27v{GB^E-2ixy<~{xajTgi@RtJoTL25Yj5*r(WM*yq`e z><;!2dyM^@y}({%FIg$8WR0}8vc_3ESnsz!WSwc9ZGG4pm}7m+I?uYmy3o4DdcgXr z^^Elr$8bDn<0MYzR8HeuTr?NYC39W5-rOKAn;XLAa1*%zH;a3eTh6WFws3p6gWMtR z2=^iP5%)27iu;cHlc#u@S9y(Z#^24y@jdu-zBk{O@6YG+WB793%lrA+{Cs{{fM3PG z&Tr>W^I!2_^Jn>U{006y{(FHH?iJ#Mc%hw;AS4MXLSMlx3=wjK;Xul?78*Ojcw%E4W zcGz~=PTGF3{b9Ro`^y%%D#~J{7%esvTZngxablX-Q_K=`#X_-Md|X^0n&K1Ulj76j zVsWXsOxz^y7Jn1}5dRdfh<{5UQ4%esNu8tuX_Qnfl}NfYM)F8wC9gD7nlHU0?UD9M z?@0%wgVG`Ch;&N&!cN&~yT#7hIlEvN?NY#gkA0NA!d`9n+iUDo>{IQAeY$;yeU|-U z`yBgK*(OV}EUR*~e3zUcC&?*tH@TlYQZACq<;k)kKP;Q_Qn^9iCci76lP@Za!Yhgr zr6ejHmHtYelCO+Z3Y1ZbSMe)zl_!)2WrMOw*{p0;-cQn0L>Q42Hdcnav9F8`QB*#F9#~kMzKWnn4YMSQKnrKm4Q!Q2NuMO5}w8>hn zR!3_AZJN0^s#)YJ?L}?1wprV)y{jG6e$)QY{?x8$e>=gv8r4j^+gacoqQBq!>zDatcXsC9bMHO%d(NGi)6x`* z#suLVgb{^k#2^-N+;XmMs(W!T5)Fl$r@F&)<_GIz(P{2Lq<&rqE>CjD!YyWmFKz#q z2}e;Jibpxfh1{qJ`H+Z4qw`P@HKQp@4}zpFYpn3oQk8;DJzvhWl~vGHf5u7C_Ck#oRo`lQ@Kib>kX}qLr`zaT>9zC*dNchXy@h^)ewu!seudse z@1gh6hv<*#FXY$3tPuNgAbvj*g*xTMr_3skj&+9b_R0}&dIrG z%(=N-E|1IS3b;b9h%4qioR{-)eoo*@IFXaMQmz-*o9n}saecXdTz_r=H;@~|4d%+Z zA>2@I7&n|7!HwibaTVNXZVWe;8^?|3D!B<<6?Yytk*nq=aW&jzZVES*o5t00)43Vk zOl}ssi>u>ia{+D+SI;$YL2fSB$j#$I+#o1b8A!60i;8E zlzBD6rE97 zJt5Q(og8Rt4MyvDBmC6NOS=M%JAaQ2E`$5l%IYEY^}%Q~G$+&)iY@Eem#?gz9D*B7 z!6~8UhVT+-p7s~b|C&(el){ndWOsd2AR4XJCZ@C|6p53uS;oAK6J@-Ju<#+{78yrm zY}$?Nux1BxPKSjlJu3qXgM=o`%<7t&mWDtqIHV~UiS0(YC=cbMf?AD!Gqjqjod%<` zplfS17G9_=wgcJ~PVHLyZd42dc#s#SE`< zWi|ZJdP=C`U%UmCqF$&s>VwKqU(^rvM+4A6GzbkwTqkM zJ_v#v9*o99%>hNsQ!1;+1?B{sfRj4nAkO`0BC1A{pkED|jHaNeXd0?T)6onx6U{<( zXf_;kP(7*xof#HvYJ&bFBfzja-UbqFY69Vo3pa-915M)s%fhX(;h~78Pj$Q<1`bz- zW0N9*=4g|`{nl7G5{!nHhngG52cip9C94cBjZF+jTf)r^!3YShy0s-3SsV&3spCzG z8U>etLPTScK&Uwug+(nM*%WAuPOGdQ(X24KftW}_JhAJD9u9*E8+7l%Lgu1ISc(}I zGY^H(e6#>Hp@kr|>ee|5?I;YSE~7fMJV+4PM4l$kkYy%}>iE>Qwi2PY$6nfZg~#4j z+P9a-E($AFXcBBe(GIi-MMxqs5`I67(25qLC1@#HhL)o?bUs>vR-y}laWc9P1aTp{ z7!Damo)`ocfB@=vGfZP%xV5QaXmE%Yw;I%oBSVpBY)C8?3C(GZ1t*KpNnLuNIi^fk zxjQ-*TnI|mb$PO=GO0RP58UhSS;r^C2&Z3DT7p%cJ_Jch{$H%+M2O#y2=y;^5 z^rh%Bb!M7qPsyPJU5X0NwfHO5#a|7Jzgk;7N#e22RqpAcuF<{@tpZ&d5{U$sb)f4| z;URPbx)I%kZbqxoE$CLX2Hl2k2maoH?nG3h&7v>Dxt?nC#h zGpq_mLg9u`{pjWxXiuO?@c^K$s;+}hf4~ZyC`VP>+UpqVW3elE2VQJ+@$Cz{HhE`76zKsdz$1_!l0<2(JkRfOdXi}3nD_DfmQfaXat}e$z)xNE8 zcLB6fzMDEJDs%(ypnsu<(7!<(52HuW7W6211I2W}9_OlDh2M&^b(QC7QZ^Z~h=rtp zYdw=Mm865_sEk&e+>%hNex62iCwg90bIpTyb?ZPoQQ>a%BG7*cy$rO~t}3xil63}& z*U;;#hG>FOTWW5!1HFa{tE#kt-a>DKerRnJE!lwH0+ZQ;3gPMyHJmC}J6)#M%Q7ETpUIpp(=<6Zql1L4}sgPMW3oM zVIstXY3MU>r!~O4&(Rm?OR(*)(KiqqzJs_>kB-7;9XgJFKqpj0P!$Qz4MrlthVg-= zn$wsPYKYCN<8v#kCxN3M845Nv3~35AHZKGdn+OwxB?V*A$r_^9P(^brG%UQZC8A)9 zaB~$Hb_DQ+>gg(48yg{bbX_BP;8#|*t13rw<4G~m^AyqRNH0=E3ITL&+Qzmj}XK==c&#GbzVkF&h_VRRwJ-Tu6L4oN!VHet^{xx>S!+#z(R zZIgNl9(&)ueOF9}a093CA*|R3E^rM@H9MYBuX#T8?jD?jEij55J8&9wnKCaF z3yv3jy}SPUAf6_Is;AhEbGxW^U^gl}eR>7z^ooc;L>Ns1TkagFdwpGld6mJ23aE>& zfJ;>W+O1@&RboN2N^NWjmv*vBRl|)~>M}wYs391wkAzy32(8}jVIa5+_f-v~j0_{r zgQ|fjkV!KSvuYk-9C!e#!-LRFT&|kNEX6eN2t1PX(~-XMWDvj;yP}%|$p95(l=hK8 z>Y}2UB@&!UVy9x_(I~nOk0Jg4PAMVE;t9A4=2nF#DoTkbkR%-+=PIA2d0e985s-#svP)O3ph=2Qmymt5Ml$%yCVmlgX@*Z;VLiECTLlE)Y_T9t=XQr0bx zUI6+|$>Rb=9)wipE-$irr zdw4J22O+r*AHWCkYN%(_D=fu_!6|%%KgJHg7!&5sRpKnbR5crG2}B_N0=yVK6fjA6 z>F8)p6yoaeaDA&1m;ojz;I$Lj_V}fMo^S*bwMolbAO(aP!K4tNjjC`oq@ZVWl0BNn5;*%p_NmDjqA6T~00}Gc>LF6jiLl2jJ!sEp3|u+6QSH-iW_~|8Gze z{tnb>7W^+&@-ws6>!{M}7^wq2!$05?_(%K`{#ogXe^D_Dum}H&e*+!+1D`~76rwQx z4Ico;9DrZkv{4W}Ta*w70JSC>R08VAaAZj!(l8E+j?*<56Ksa^h63y%xI${6aHCes zcx#}jF-^@M6&kSW;gLY2veYP96i*_gMMuJ9Fpc z)&?%Ys|M)OzKRD@+)mXVst}o}A~cWkP~O_n4PYmsxuIZWvQ{P|h_sUE9?GwjiYS39 zp+o>Yz6DUcYHuf6?n9MQz0@S5vsg4dq^1mk$g=fttGAj(oVuoh7pjcvI|~@pLo++5 zegNxFzoxYvKn9H4DHTfsvHu5&SBNudp$K+$-W_Z0IUoiP{YZva1o#h z6g`wu**Yp(uPtBQM-~l*Wja?D?c|C zD?WxdQZuQUfH2`uI@Xctu4n$KBNgcC2nAv|6pY0vUC%ibl#x3pOf@Qp(t`!}RX15t zCt<~2fcU2Yd~Bc=Qq5EtP**L)l#9qEJm*MI&&;QPJK!>)lt+#>dLXGD^T=q>PqS=>T2p5>RReLat*nbTt`-s z>&Xp--`7LxJte*x0fP#Y#2qK1@BLBx7pzS+m`T zyO?Z^1e=0^Xb`HY!Kf0C0cC^Bfv!Dq@iA(v3gqg@EyM{}yl1B~+EUx8r`5J=$X&#F zptA_9r1)AHcp6BimU@A-G;C36nd?ZSmv|a=TV?wd+)fRwDGsW}tei zpyyf*RdqpLMM(ht{x2XeTCYG}nB$%vkkFNuKBouGcCegXvX3qY>D)bG?E=qPoP`V-BgF^Epv>`n5UzOSv3sRxYc-Ld6?O2|XHE z9MrH&Y8RPKh}KC(tpsWGM@ONU1XUoVRIa$r`baR?tj#b(B|j4Oj)Qn}Mb0 zxOvvFU9$u{s12+59f-%Uf+>@_YOvZJwXO$t)X8sBIgs@O#9=>(|4tj5jMc3g%k z$!4;ZxWV6y0DUZj^6ZkHH32~A8a}5j_*Xgw)zN8aCT*oN)GSmfm(|fZP#_-B5K?!F z$iH;t!Fcird0fq=bmU%bWC!xzO*;V|>gilMkJ6F*01nO}_mc+zC;}Yp#8y?6qs~Mz zb$ln{s~SCQ(%CmlRA4lsxjxVmZB*o zu2prWYnx59{hU3K+_NW=6-U2Wsj8XjVf1i%1U(W#RgE4+SE%4)Cc2m&LyrZ7rWPgP zTh&1j&yeO2;NW0XxdgS>Adkpn@nnk`O7c+W?XFeR6NplfepJ_1$*N2-` zuTD>-t3ln>Lb8$;t*0j{bz<#a4L!N*o?;Ih>6)&J)L&{8lwv=pr-J^}f=11Nva3>p zRW#}-^#XZPN1li$PeInKCgr#HsD4UiT4+|PpM5%uOmqWe&UBD$(~#P!J**yL0A|jo z6X3t88>zXzeF=RjeHnc@eFc3beHDE*eGPpr zeI31uzMj5;zLCC(zL{Q4c93Vub7UuZp1eR_BrlPd$t&bl@)~)ayg_!6H_2P%ZL*u} zA@7iP$$Mlk*+<^*=EPs2P&6A9@=p5BQ@BJ=HoMA8HEx^}cuHxU6p1Dn@ebGB%pIFImR-;Oo%Lk_xT}5;z z`r>o&pW2QpPmy0kbmyElK%z=u%NO()r`Q6B%~js(pZMv3A-2=s(chh#la8!$l^6W2 zW+X=btlhy8JQCaHVkoqOez zwcC)Y{`LLNf*rGni88J0mU$xqM&k`;w5YTdh?cP-=K*D!^ey0bm^~nG2XnkUkuNx&K0bCEvmbDl7Zhd+b3fwOAP8j4NmH z2X9o>>QbP4IdcWm1ht1F>Jvj)bkBS&OR5lY5@@9}>>^jfCXoj&v#5~LH9fnnIknXSwu0JR`N8OO_5r^t}+lwnNS|4^hit^4duI{HpJJD6vI z&Ss5Hf{YD4bs=ziE&;l5#uXJIGcPI#xq^8KT&Dt1ty&@mz-|T|1pM`#@_d6*b%L#- zW2fr0Pz<{tKi0D@2k~VwCJ>dMg-zdbJO;4Cbmcj>{|0+A=gBw;d^q4-NNcs6a4Tdc z+d%7!iSn>T73k?q(3w-^;)$^7S94l%a0KkoR)8bE6CCUy*bCRegMP|GcmEBr|BCSH zv!SdBIc02w2SOpiJH=p?m28U2N_c$I(#cFnS0Q0lP%x4}d-JQaSXUyqpdk)eb0w z!T}qo-G?5cHpz*-%cs)P^G{=%Ra~MWS?hWU|(ckVqa!oVP9omV_#?AV0W=^vTw0(v%A?n>^tnc z?0f89b|3pbyPrM49%MgY53wJz|6vcaAF&^^pRk{@pRu2_U$9@YU$I}a->~1Z-?2y7 zqwF#Ed-gc{1ABt~k^PDNnf-uqjFV+-k#UNQQ)Qec<8&EYWt<`7Oc`g% z7#i4QoFikqj2$ut<8{f{E#q7n=gBx<#sxAilyQ-ai)HMQu~)`E8T(}{$hbttqKqXO zm&&-8jC;$tkBrM?+*ii^WZYlI17ti<#)D)$SjOct9wOtRG9D)5;W8c}8RCF2Si zkCyQm8IP6mI2n(ZaV6BRWLza<@NyGnTrJ~CGOm&FWEoG9@l+X4lX0z#r^|STjAzPt zmW=CUJX^*A8PAb%y^I@V9F*}~88^y!o{U2>o-gACGH#ObLK!#9I81n6$Lo0mpU5Zi zJa6L7d@^t0Q}|RqjZf#TdFHiRF_595dPBlwa0D87Op&5z;7 z@#FbQega>`pT|$+tNBTM4L_Nm!cXO=@wNPPeg;2Nbp%`lRkRb>!2qYgwW4Ud;vitt zkXy8bQ^5w-0F?&=FaC<;6vO>s9TO6>WivRiYm{A zYS66{6VHTO+7tKi9Djgdc(ccfoG@xHc!Yj1yp!UGkXKJHf>O~cchG)zeV4!e?b43ey9Fb{T}^6 z{pb2)`kxb+go1>Ugo=a-39}Ny35yb<39SiB5*|u;J>drfZ*Uv(4EYAZAQ~h?FGC+g zUqgSx0K*_dxnZbbh9PK}Z)h?!8(Iu^8a5g3HQZ--!0?daeZv96LBk=#mxdFGsfk62 zy%Wn4`y~!Y9F$m|I5cro;*7+3iLHqjC0>4q=KZ9q+v1)k(J| zy^{1=((6gPlHN>uJ84hSyGeVK_9g94I+%1K>7)@GX(MYCjitt3#y-Y!<51&pW2Ldy zc%AW9<2vJd<3{7X#`}#A8Xqz~Y}{ge$+*vW*!YR@GvgP=UyQ#Q|1kc^W8Me`?F3`a z14Evs8rm$rjt}tle2{PC=kfFTCjJusTK;M%#>-$HszQc zCYLGKly53DRhcH5W|_jKMW(2!)wINPhiR>;-PB>)V7lA1$+X#YpJ|Kf3DY*ycGEMa zA51@*elq=H`qlKi>7*H+q%qTG)*NTHn+wezv(GG;XPWEGv&|v%0`o%iGV^WbyUgp% z>&+X@_n0@E?=wGS-fRBC{I&U8^O5BEEV-6^%M8n0 zOPl2~%gvT{%e|JzEL$y4ShiWVTb{P;usmmZ-twa5Wy>p;*DUW?j#-XdPFQ}j{9^gd z@`vTm6r4h*uqkmVx|D>J#1vzSkW!HnOt~TDp_J!R4yAmVnwVOcIw-X^HI{lo>Mg0a zrfy7qDE0BwCsMbiZclwRb$9BX)OS+fOZ_nQMC$Kpx-@f|BP}njSK6Sok!cgsrlvKf zHK$#Yc5T|tY3*s7)3&5NmbNwR$+V}^o=)45_GQ}FY2T!Mm!6jHPR~ovPcKX_PA^TL znO>JZJAF=iL;Aw>)#{m%5e(qB%0HT|{pH`3ose>;6&`ibmchSYrxuIooj8guCQKUm8}<9ueIJ{z0-QPb%*s8>wDIH z*8SFl)e;x%-b{X%v_tWveK7lr z?BBCb+K`R1F*eQ?Z`0chwnUrJX0j#QQfz59yUl5H+wyEfY}K|Iw)wVJ8?jwsyUlio zZLO`{)?wRVyW6(OcCYPz+XuEUY+u>FwtZ{+&UV!Hz3m6vkG7v|KihuIp>y~gbB-k^ zH77kMBPT1zmeVh1O3qa|>vQhUc_io2oX2yX$k~>2Fy~OthdGCHKDHa|Np_<>-JW63 zwvV(|*hkyP+MDb#`}y|E?AO_^x8G>L$-dftyM2@WUiyBNH zw;a12?>OFb9B_Q&IN~_wIPN&YhPZ~hhPy_(!mdTGh%4q=?7G0!?&@%@cWrdt<9f@r+qK8_u4}IwxhXg8 zX5Dda-rd*T-#x%R$X)IZxfi&b+|BM5_Zs)@?mOIT-R^|ZC$^EnY zSNHGkKXdK5&Rkb+Zf<^VRqn*x>fD;#DY>(AugJYB_v+khb64fA$$c{Ssod?k&*VOv z`&I5Yx!>j<$vu{5%d_V>@?3ejc_Z^G@yPJyGqRghayS}?GnreH?F zf`ao4Ru+(g3kxnTxTRoI!Mz3d7d%+-P{A_=2Mc~HWDAXjro!aHl)|(^Yhh-gyRc7T zSz*7zVTH2_gN2d8TMO3~ZZCYX@KE8Wg+COf6y+2-id;pxMfpXAMa4zlqROJ0qUNHu zqLoFY=%S)aiY_Z^FM7CWThWf94~jl4I$ZQ|(Wgb97kybw6x!err1+xZONuWqzOwl0;s=WVRs8SbEya%&KT-Tt@zcfoi@z)Wt@xw|d1w#o ziSrbAiaZ{V-&5i#_4M)d_0)Jmp2ePJo;J@)5Aj^+xy!T8v);4Ov&nOx=K;?S&#Ru# zJzsjh_I&F(>N)N?;Z5?|y@lSVyw7-__3re(;C;#aiuX0|8{Rj)Z+rK6-}UbGzVAKY z{lNR7_ptY4@2B3+yceVM*&Uyje=bNO<8`MyG5vCr%C`$~M0ua~cnudlDaZ=i3mZ-{T0Z-j4@ zZ?tc$Z@h1UZ>n#)Z>Dd7FXoT)>--7+M8DB*@+bRK{AqrxKhvM>&+$9_E`P2+-(To2 z_Iv$)e~Dl6_wx7g_x1Pp5A+ZA5AhH4kMNK3kM@uCkM~dTpXaak*Z8OSr}?M*XZq{> z0e`(e=x_9g{0saG{bBzif7IXVU*ccpZ}YG4U*MPh7x^#oU*^BUf0h3l|8@TB{Wtn= z_TS=P%oXMd^Mxj%S!fX=LQGgJEESdu=L;(ZB3vk3EL^Yh3bzS&2y2CQp+ndp+%0Sp?iKDA9uyuD9u~F;j|p3aCxxekr-dEDbHek& zi^9votHSHTF5xX621|>6OIbs3qJ@y3O@_K z3cm{{OHc__!jy0&@g@2aLrGEzUt%t?l%$nplw_CWloXVFTJlB7*CpST94q;ua)>x|k{2M2F}W^Ti_3D+;0{_7?k!1H{4NP;rD&3ZZNNf_rVnl2emx^uTN>LUs7B3U86t59ii8qR?#Wms`;$32gxKZ3B z-X}gN{#)E4J}y2fZWnimJH;2pSH#!FH^trJyW&3afOtqeEPf(>E`B9`D;^b(i$99L zh`);`B_vT2BXLr^q?Zg*lEh19$s(mn=~9N2CD|mqU+eNgl~32@*WkCiRxe zq<+!>X^>Pd4V8vVBc%#yj5JQFl&YkO(j;lJG*zmVW=ON7+0q=TL7FSgljciJQnS<| zMWmRtSXwGAm(G_~N<_L)x>&kYx?H+ax>~wcS|!~e-6XA+Zk2A6?vU0>?NWzypLD3m-HYx=E6_^xAbJ8liJnLQ zLNB5>(3|Kj^e%cIeT?>^{peG43>`<`pp)n<`U73W2xCm)1e}OdaXPl*ES!t&n8!Ea z9=JE|j|bp^cnBVfhvDIP6rO^EcrKoY@4$EByYSt3KE4Mpzzgvrd@o*%m*D$Q6kdv# z;Ro?*ybeExpTJMzEqEJ#6~BhJ<6Zb2{4U;&Kf=G_)A%=h2LF!F;y)-%#ZifrkxHVH zsT3-m%BEaY0o8*lrutBQsR2|8RZ5MbMpNUc8mgA^Q@2q;YBn{8noG^6?x7Y?_fyNM zRn*hebJPpe%hW5>tJG`MPU<~s4|S0Gj5bLarhcQ&QWvQ|sefn%9YyPD z1D!-C(CFse1~DbfFlIPY&WvFynXybQQ^$CjDU6?KV49h!%rs^e zGn<*i+{xU<+|4XzmN54*2boWqBWxNQMqc~_+C?`}2hetO8O>)uU_Yc^Vn1T{upi@J z*uCs0>^^osdw@O29%2u(pRz~T&)Cn|qwE*#G4?q7CHocoHTw>uno_B?xmy~zH_{>A>y{=;5kFDsA&D<}o6U=*xE zp@>o_6)J@qs}<3T7)7iiPN7k73avt?h*#(piHhVA8I8?;|K~`B)F>LopjZ@#G>Ai5 zq(kvYj|?aQB_bnALdo!(iqep2WLf#}Kp;H6th{fau@M{ud?hrltbB;CE;Q2PZ}x_& zISqW3okzX{og?3G^|nBJQdxO%ZLK#H^40kKzHm#&XSuTSkv?efdq?>i>jKlDd*Thc z-*}*iNP%EzWJayu6AD$zf{DEeMWO_(7O+yltbivF@sEJ31?&;9Y9F$|n$wYWEG$fX zvdq)qB{X5imya0HRObnMi~ZhUcpu6{StuLjRLbKwLa)*Cr8iUsk2Z(Gfd+Z8>!4rm z=(eTrLk^h0iCiF(I|40hh(aEaM|q&a!OdY0th?MBUXOT`k8($pmBSbL$xdj%7EXr> zQD@Wz6``)E8|sd3LOoDVbTjIOdZS|02lYk$P=BH%8Ke`rnT#PdWFI*|4wEC~bMiI$ zf&5HV35yzuc*xFDM%#7-wIv-w%6O-rVF3PKC)}RZ|D}J@sHmnPue_ z-s#~1KCi#7*zc=vZ16UQhr^R4jUjJ1G*SkB$$ZP8-*9iJDbQHw4OVj&&`6*x5UvP% z8bf~37@EU@pf}{3;cKiP>l!EMkJrbj` z^`5;3i9aM-N#coGi(@!U)GCrrbVPdybm~V9plcmyxDf?V6S@rrk!aE7%{Ai6La6G7PmebN&*saiM$uFEWOSYw{sAV0RhNhEP zq9NR;FhwhxiDseMXbvJsK)0j0uxWRIS=@#0M)P6H;a*rZtf`vQ!Tgf~&HlPR-eNf} z)XyRlU~MFh!!Vb#Z7z9| z<>&#hx#D2Z1BzOXaw}Uqb7MvtO3Xf2Go z9&JDy(PQXwv`GXLut&-MWW)>y1Afs5!0^FDn*zbGq?TkaH6Ny>l*H@Z}xkF zvU;|n7hseDfyVGUv=!wZgvnk)FQZq`HuNfb4FccmXot9TaVg?lqTJ$jc@qpJ>cJEC z_yhG~6R25gBB>;qQ;;N*GP1lS1lBVSj73zI)Vd$N4dd(3PP7ZX3XhDMfh!b<5R>1j2;iom4PwrrmbK_S$+2g@2sB%P7M z%GP`l#6`2JZ0*(!#uqRDqgA1`l2w(6Rs{F{`o zV*$g$Rk#`y=z-L;3fEyTuEzDK4t}ff;_C*j6;<&of-jDdyGUT#4!Md`UO4p6)jEP5E-r{;3>aXUTIkNRGlhwRd*!+o`rEFzv;Kv@l* zuw`ogjb=z0<*gYpyfie*7oJq%1LVDG9!*nojo(-6ZVvigq7c9Z<(c7;YbUOZ^lfUa zujbO_ZZNndLZzmNvr1lwy{+N6RNNY3X1 zhjZo2#1TBEAivYBSwr{Z`@tHQqei>}udFPo14Q&q^m&6LdINr3joO+8BfNk0J|VAswCCr=XGkwtwPY9 z7!fO53pxT%*Z(>2?2v$GGk&WB@Js;UsU+1h@Mr*dM8NUkegHRN2on|{_FgejK$CIO z(8|yhU(@w~^FIDST6Hb?gxHRATD%8;jQ8SC@IJgBAHWCkAq=b;e~ORb&+zB?DEaK&f< zgyhbWI{^=ZgimCt?Sn)(@?c-1cv~_W37*8nE99B#m7y-7ZJ0>Zj*KF)BzgRj5D+TJ z)x;bV1~0D-dcBRZgx5XXHW$Qn`C$=7!M#AdQ59_*UT%>}1OStwn9{Yx;^nsTaEsq7 zCWWMq)Dth+1J>~o`It;nkq^mU;^QcZ3Y?w}3}7NboTi#HwzhUF5@SVz#h1wxGLy`M7*+`^WDz718_1H5#8B53cPI*1Q8cQeSmdFiD5c~8Vpd;8 z#X@q@zs@I>Ey!&u(xfEKq*e3>m5TT!{HHX?^%%tg-ZxY6lpcpk1K@jK(ntb;{DAKf zupC-8@LE`Ehwz~#eJieS%$Ja^e`BquDFnGm*jr~A8VH49i-9zYNM3OLGltgI0syyy zu2Ndu1+wBUZCNpuidxoFX_SdFlOPF^FyRhCMm!VpVI5^f1fPc`Uq-jX|M{XNN!hGu z)ntl_#E~gtnt62+T}9dPdCJ+&afiy}jZD$fmK*iXi}Z%16c}-PZ!yc%QJttlsx#F^ z%rdDWsw)h7H}LeksqWNGfU{CL1O7|42b)sd=!0PPjL=&)SxY8zo4 z)eq%LP)rS^27!A>qlk=iJv9(Pk|ej?LfzWdCi>4t>XtT^c|-ey`qEfxFj(6Vu)kqY zOA_l!qWyWPkz}@t%u*5oiYB7b5z?Xb(Mj?px%5#K$xEm)z#geeGKX+C+JS0(fdZw9 zWdYcM{K$UI)Y7UB7=B&WPu1ZIXgyUgXZ_R^9mApC;9M4RdwXWC@7+$;sRpW%3Up-i zN+X#oX5g0pl!5mN`0Ks^xF05ksOu_kR0uTG3>umy=_gWmqh?aG$ek*3hmzbQYbc$} zCwE`bQbD&uDSONB42aS03PjYBK<@gt9GkimU!+76l(V-n5lzkG>c+~!PO6VcwGx0L zk!N48wT1X1Xl=2mHEJofOsr@020*fqg_715Kt03QTjbW|z^rTG*Nf_bPxk?qEe5$3 zumX?7tv#sw73Drat&o-5R^EtB6P0_M(@+ngq13~uoO%R26+%0;T1Zr(P7xRS^H6{s$W>QMj%^I12LfMGp{**GH*s>)WW2 zSSHLDHz-migiDF+$@6VTEgPxVsU6fC)SJ{>WI1_&tRO4NgR<|ml?>ZUYSg0lWldPqi2n1bc%{q2%wS`u8thb=Gv= zb2uJtzy>;A%rC`c$}fSxZcvY5V#Q;E4$fH-c@kL0Ch|CtR|7`{xNdN2(F{kXB8Bz9 z{}##5#q8M&J}&0cHPW@1TU+4D0{=bmzY*wd7_R*Aw47(l*>?!d0DKUi1tg3d#)`e< z5yiir4$+S`O5yGapj744eBs(j`{)#;qf_a$w(ul{#HYySD?LOPqAhf~#7JdgEv-{N zIaxKvQ=$`b=bT7I$T}-x+XUTKqdGar^mApV+BrlPd$tz?Vd6m3Iwv*S%4)O+h zle|UVCOgS4@(y{I>?ZG#_sItxqTChtq6YwlsRf(cB}KWyhKphXT`G2N^Tpm> z{&VNyKr+vx?Xu&xcb-Y6TWRWPpG={_^JM7s!ag6o}^%41Cup3EtkJ!0=&*Z-7 z`k4WYCCzOH%}D53d85IWv(@#k$O`FBFJpf6~zkA?0c;Ncw6kfX=Cyf0PSk-3w zB~qy3qQwQ>NIToXL{9)tZ@e26^#MN!r*3q*az&| z8x$?0kYw6=oqF)WHK1ayQF>lHlY`~9oyt|wABfo-y{BD6og&)-8JrfMy^(oBKMeiEv;z+G87-s3ml-`B&ls2l zCXq2#bE(q7P#=&T${FqFLy-e-prTL=9_k5C5=p7t2g3AMlq7^F7ncU+XKAe zN_RMmgd>+`Z+DCIFXS#CA=Z5$qZQBm{VnpMM@WsZxc}5imM)9QZrh`4m9U=4VRA*$ zpo|P#cy04FM{1wSdS)EgXxa_ClgH#U1!AHg9odB>6@CZ1^$j^ezJ)sWBwrmAO}krQ z1@Hnx`-0@fghtBE-~u;pk5pEfBBmR2(^{r0`F<_aotz}6;0dThiRzN_l8L~*ywa(w zbU0NeS#+O307{_pF(O{e^jaqtTd%PhR4UpGtfL>(pD{u`=qr%@NAeRn4l_t9?r!OD zBq>(SVTNn&T(2L$WQnCPZW%L#DS#;S6*&zf|3ZEhwUX4PmCz(m3cO~}Ua5tO+I9EZ zlu*Hp6qPW7{I-@EMb7-MlyJR>6_SWmAmRkZ10wbU5zm2$XUQM`y@(T;Nur4L%SLqIx|BQv4#AzmT4uI{#PPiV?6jm#CYa1 z^T2p!ipC>gBw#F>4;L|?uy}SN8qS#Zt82$O9~oyMvk1nSB9B80nCWPSo~uhzV20P+ zk$5+=ROH>o%rXG_S}3hW$;CY=@eHFXfgeo+37xnQ-wd4NS#$!r4SB3iy#D40kk{dz`b<(6ybY$86$T|^_<-szh(sKU z#~0zR6Uam@1TK;FoPaC;l@Hu2l|HpV_QYKCzx(LHtf`2;rhv{MF9CZ3+7J4g2Y(CU zqXvBetALLh^mXN<2G|lmYS5Q>DD&TaC{bH*ip82ljZ}cs{hyl<`k%b_2lo7bZ)pFc zmk%TQZI<-QPGzUD)7chw2HVQcWM{Fn**Pq{oyp$L&SmGZcd&P|cd>V~^VxgY1?)n0 z5qmGYm|eo&$1Y`;vG=pf*$3Da>`L}Qb`|>&`!M?myPAEJUBj+r*Rku_4eUntG4^qG z6Z-`FB>NP*nSGjlhTXzG%Ra|G&;E@M~l_FZ;2`<{TK1so&bSOLcgSR-Igz*+(81RO75y@0{b69k+nV55MO1e`43 z6al9SI8DGN0hfU^XgE#Mph=L*;^Unqy9@Xx0rwDaPXXU7;9dgmE#P7S_YrVk0rwMde*q5= z@IV0%5^#xtZxQgV0xlKsU;&p2c!+?93V4`+hYPq|z!d@>A>fe$9wp$>0v;paN&$}* z@HhdF7jPBfI2EVnVz^i?j^j8jr{m%|J!jw&xJ1s#C2`4I3YW^IaVE~pS-5o0%GtOK zE|bgRvbh{Cm$P#Y&dIqrH^*~%Ts~L8b>a%S&RiF+i0jIA%;Zs`f>fa0o*`t5Ld$8!j*D^xiW4DH+=KfRW`zZL6;RSiF6rYANpGKt@3zUr zEJBjULzDd0F1!ouAsF8MPeN8eiO%pEZZCL$Jr=4q#qh@ZIJyzuQ(s9xMem}&qEEsb z=zq}X=|AazAQzw+7T!XShPTkQOfr)N%+t9GRK%NnXj2|neUjB%n!^@%rDGo<_vR|ImcXJ{$&1UF0q)USv|ac?qEByo!KI` z8+#KQ2A5e1rv4(lWqu6aA^#mT;!+G%_!UHPyJD_lq2gY}V#R%mWr_zBD;2904=El| zJgQi$*rwQ}_(ZW^aZqtsaYXUC;+Wz>6pm6vDWlX;F;T9lu2F-dMn}~}1)}CgJrK1r zYHifIsHdWyj(Rrg`KYZ?+oSeH9gg}*sZvHOW0i5rL}ilFs`ch0x zj5Ve(W?;;im`O2{V?r@AV`j&Ym^)(bikTm?AZAg_;+Ul|8)IIK*%9+r%+8p1Vh+cA z8S{0_w=v(voQ(M`=2C1_tUfj^HY+wiwpZ-X*x|7iu_I$g$Ig#k5W6t;-q^*l_r)%Y zT^_q4c4h3U*oR|ZhvCL&0@`cnq`{hniZM{H4kYX(LAbIt68tvsCiuT zgywzC*P6@V+P84yxar(n?s4vI?o;lpHcp$QEzow-_SW929j>j=j?|9UdbJJOMr}ZQ zn|6kFiFSo{gZ63dYuY!pd$mWjUul2P{-cZ2aXOt&uS?MN)%Dj6)D60Z~pp?gcWQ}>SUd)-Oh@9|8$B3>DPHpCh<2CX69U@#;a1{ul?BMc)AqYYyW zV-4dC)dr8D#!zeU8X66)hFOL=2Ej1baEIY8!+gU=!&`=P32_OD38n-~f;Ax{AuFL* zLTN%-!jObv3FQe*3BiO=!pwx(2|~i^gf$6k6P`@iobXY?!GtdoP9~gAIFoQT;g5v# z34bT55{-$;iK&UE#H_^biG34CCXP+4OKeJ9^#(aVb?P)hUxwCa26zxg+Jyl)F>zNqIcwiIgW( z{+04V%1bG)r0h#Mka95PaLSRCGbv|N{zy5WaxoR9rlp!w(^GA!nW@>ST~muw`=<6! z9iCdB>PwxH+K?JZy(4vL>hjbTshd-uNqsi;`P8kcJ5qP2?nynI`giK3G?a$Z=rkrx zk)}*jrCHO)ruotu)0)zPY17hL(puAIrOinb(&nb!k@lx4%A_(yn_^7~CbP+5a+!Ej zS5vWRlxdu)-qd7z+O);=oatYt7fdgiUNOCD+HTrmdeii_X_x6;(|e{5Odpv(Hhp5+ zZ#rl?Y&v54-1LR%xalj?H>MM&?@g!73bWFzGV9EGbAq{(xwE;8xtF=v+}Aw8Tw|^^ z`^}B!Ci8sr0`o%iz2+t6r_Ec;&zfH`ziQrYK4kvXe8l{@`3v(o^9A!o^IztFEXkHs zOPVFil4G%3oR$*Ht(H>D2+JtT7|T@4bW4k+)iTTSfMuoSLCZsyM=aYcuUWQR-m&bq zyl?s5a?0|9<#)>;mhEqL@(u_s@b%eFbI>B0FooiiUU20usU2a`rU1MEmecQUr`i}Ku>nGOz)% zI&){{`a%=VQ?eSe0$I0ZEzNo`>-nr5S#M?S%z8KL zy{r$izRfz9bvc{KPS3VwXJ%(-=Vm*yUD*S&M`yQWw`R}Eo|7$P&&|Fg`>yQu*)L`9 z%ziifz3dOO_hj$QK9&7fPHK)R$C6{s$;ipd$;q+j49Ka>sn405E>vHRJC+GTe z=j6`MeJpoV?vuHjbGPI^pSv~pquk@UC+!XPCVS8xwokQBx6iQ8w9mE^`|b95_B-u& z+wZY2wBKuAVqa>%-~NDorG1tCVf$+P8v8o?2K!_7P4*}4o9)lopS3@4-)eu+{<3|W z{WbgR_BZTr*>~FCvG2COZ~xG~$G+FT&wjvu$o{GQGy75dG5eSHukGL3zq6mT|6u>g z{)_#z{fzxD`y~f*#5ocj4?9*n);QKVHaH%0Y;rv5*z9=5@vP%{$5zLSj+Y(V9IrWE zcf8?v%dyk(j$^mueaDB6J&wJOeU1Z;Lyk`!pE-^?jyb+`eC_zw@txzO;|Ir2j$a(7 z9cLV89p@Yu9Dh3gc3g5IC*@?E3a8SkcE&j4oSakV)H@TLMrX1!)oF5CoVm^e&O^>4 z&d;4+IFCEOa(?4H;r!lt%K4-7XXmfZ-<-cY|8SmnUUdHD{Kt9OgEw_jLDm_jM0&m$*yaL)^pNBiy6iW8GD5kGsxY@1E>#a5uR_?y2q; z_e}R3_wDXG+;_VdxbJn}=f2;)!oAAPbe=vhKd+a3c0-BpWWkTZD*tc$n^*k*0L-{1EC2ui diff --git a/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib index c1ddfd0669e772ca721182718e86ed4d1367561c..616cf6a058d3cd63e970ca25a9611b55ed0c2714 100644 GIT binary patch delta 6311 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 delta 6452 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 delta 276 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 delta 3941 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%0D8}SzKB2C-SG+8Ct(Bk~6 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 diff --git a/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib index 95c042b7a55a63148600f823b9961c7bca9b2e39..da41ed28e35dafdcaece3fd7c5f2ff7b25a69f03 100644 GIT binary patch delta 6851 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 diff --git a/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings index 0f2ef4da0f3eaec46701dc17d3233ab414d018ce..300fc86abbd16d76fbda6f5510bfe2ba97bb5bcf 100644 GIT binary patch delta 830 zcmcIiO)mps5S~?CRbMIkK_XsKL8TgTC@wT{6A{5#-qoT)x4NV~aPS9&%*D|^aM-`# zE>03>iHk^@AZ|RfJs@=?o1J~KGxN;MGxId@o<4gE9Z-oh7097Y$^qxkKhiDpfDYar z((ZzB+hEvkPvf$&lA;7Ds(Cjgn2K}&YlA=m<){LyKxM8E{ms+F43LFmNv&buhYZqVbWm#UvID838@s|I_uc%8Yo;HX3zjX@DxeKm~MNKf_n=&XP>8F~6v_=V_D!(qsW2da4LhO^d^Cx+(Z2N4%0z zhP7yxt7e$n%^+9&Q@%-x^Ob*W@lR_oo9SqsvfiE?_s%?S7`4%etX9^YN0YVH?_sD% zdd2_RS~V%wkuYBdEBxGi`U|DxYl(3$gEPJkQBn>vhg#5-*CSCRn{J@}!WUXawI4Uj zMt6#XAH#i&V<%h^oQ`U>jaJ4P$9z_R@ VP!hA*l=MzfrX1jbSeUP4BcHK9vK#;a delta 312 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 delta 3958 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
    ~QRI z>~ZXM9Cv)__|9?B@uMU1caalSQ5W4}J26r0CZ>u5#NlGGSSnVC4~UDzhsDL>Z^dPz zC9V)35x0mt#q;8K;`ibY;!olw@v?YDk|kBjk_JeFq-<%hG(^gihDrI-WXUhBl2%JC z(i&-9KH_vZ^POI2sk6*E$?0=eI1Oi&)9;+- ztaS#R=bV?FSDZh~DD$!=cad+EyU8hXhFmD$E#D(o%R#wOzF&SwUM_Exx5+2uPvwj9 zB?S~tNmA}mGL;cZfl{axDaFb}rBa!r%vF{vt;$+uz4EN`oU%iCTZtS{-c|mr98o?| zuBaW=?rN%WAtjjnWdeTeSh&NX^iy zG`}`YtJQ+q3~iD2l(s|LrR~;U(_Yv9sO{5EXrF06>!>H_jLzzuF6g)EnR<>sRj<}- z^Z>2b>C>(4iJjW7&>z(w*VpSW=-c!?`sey-{fvHA|3*J=olEQ_>aHSJv8%-8b&YdP zu-bL#BQ9~h<=XFh$92$k$aUBn+u_~;neHt20C%2ys5{^7ao_8n;tso;-A}kT#P5a_ RIm)9SYDxU>)!*)o{{~(CWSsy2 diff --git a/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib index 067cf68ee02e0ebeb3ba5489eb1a1cbcb92c845d..7ae5322387248317ffe05ca2d12b6c672e7111b2 100644 GIT binary patch literal 16762 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 delta 3838 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
  1. BaPA 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%0AAHT|`yf!so_Avcq; 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 diff --git a/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib index d6f508993b6df6f3258fe4553e1199ea35a07b7a..fbb2a4bfb67f660b4979d7d0ce6d8667da0973c6 100644 GIT binary patch delta 6463 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 diff --git a/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings index 3cd694d59dd3db13f47bfbe6088b7aba34852e58..28a407bc99316ddd09ddaede03725dd0eafc2adb 100644 GIT binary patch delta 457 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 MSs3|l{O`K-e}t1|=>Px# delta 3931 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 literal 15620 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
    #5#L6nA0n<6agB&o+mQ{{Y)6i9 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 delta 6848 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 D&?>%F diff --git a/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings index 17fcca0a9938f057c103173fadc5180affd4e7ef..ea8c82f97f3208c9b6f8beca72610bbacba390cb 100644 GIT binary patch delta 474 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 z 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 s>Bbf5V6e~E_Xpf>%(kkLtKc#A+! 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 UBGz;2`Qo-fa!9B{Yxv*)2LZ@Nj{pDw literal 398500 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�EC^zLLvrfAP%w|=kOMy5oU#?QG(RKL8 z96+heGzHc-6Nc(8FL{$Ra^g0TE6eaV_KAB#W^4Wu@nBh|7NybuO9%-2+9e$6FLFj1QQ zZ(a&Le=c#9V5|*?VrI`MbKxbIK~C1Rl#-x@&q3hyJ5y!BHcqquK){H78{h@&3CKTx zCTO>YveV(IlFKVyNQtc|)X3!Ci~=|+k_$4Lg`1^4?gm+HwD#O#JlTnUW?`F_vl}+Z z8sBS6a4NkD6hLMuvm%!mVMG<|!z5p{mL-n?VvVqT$w%Sh- zoOx=T2)txFRhdm(N%S2sJ;5=ZPT`klTj2)^&9j~V!Us0}m{77pMAMiis(5Bz zSjAk(zY;myLILV`3#>1zY;QQVK{*Ka{j7?CP3dg)?DDyonTg>guM=Ez*}$o3uX>8v zytVmZxHy}?0Tj-}uxU3Fl`t@oppvjunJs4c6+)09}Z zZ8rViOm#(;9wY)W_8pCItEjs#vx+qu4>`+(&m~S3sBS~MiF*M39H>rM(XD+Awb@_w zqIrat28$4rznmG+?LxU?ECpbrUG!M1d%iguqp9lh|)gwGy3x%;~B*aZaFt!@R1aoSw6UBSqSqI?*I#GIX{HjuEDbuY*Ndg zLKH7?U!HKk5Nd>8L>O+EoEesTiOcd-KR#F3sKF6cdA?EI1Hy0BrBSw&M+}%$p{EJ=t^+Hym8_j=RjZ404>S+3qU9eRmlNrbJy(Q%#vh1(>) z_cY_V(X1fwKNnglzJM*?`HxHLWF5WZ{7K!0Eyni+aw&ukf&_gce&-oDVDvi)mN9vZ z*%+9KCUL&LkWex~oxGaKrqdaLoBN||qaG=A5YaJxD?N8Wq=O0M=RC-5j zTbb#wEj}{_drf|vcN<{MJI9)5u^!Ui^h{_~3$0m%20AgvKypNXaYSo~GJ^mSqJa_7 zUpGrM%n@y0R8#ke=t4(CT6(n_U0h)gN4w4zLiqHJCQY;d(R_82JKVn5Y#{Z8*7W4B zVCPh!aieKZ$4tnb#p`b|Bbc$$bep=;;kP%eFpZTlzH$QJ%j`&Bfb3Re);%xHj=G1r zlhMAgbqwax-0&oL^bsU8%(#ipcVxx<0gETUCrs1X*js$J&29x%U18MnPo=A~sXnxh zL#Vqv#1olC)#xlBs6vNDI&Fy8|Can6lKti+>$#(0XEN;zD;fLicvM`1p~A7G|CIYB zit^@s*tW?GlQ6kEZJSRn6m&Y4?rrv`LhM!xTZe`D9-cs9V12eS(RhF6F`N8|IOOHX z2a{kxxF<2ja0T1!AMQi~{;Y!40BsSjN##|E~~LWe%p3S~@Wd@@PI}Wv-zVTH)4E)+ z2KHaRkJq1!$8s7&bx4_dT+3_toS=h@Uu*tB4J}VfqJ||-MO(Q#rc;MvJ?A?E%;z0u z6PPZ?zv(#;_L;O&ppxyVghiY^ZF2mBiW{`@!w%#1!)$ojF%p;NT1*M5{S;AHtFT71 zGbCPC@G!M6A^i8AKy=U6f+u?WZ{S@ew}xueSVo2~7*ND*Xa7?(G^hQPO5C6#tuT_y z+;DqjPEfjvS8CX}C%15T01BL|m;4>5#zB3$Yh}U18a30-QCo;(M^nIQN?TW5iW(iA zf4yW?u-hn22UX>dlE$9U`q^wzU84`a=BoM*oTq8M5;q; z5B{rgHMKhhn=IazhA3WQt32T)A=DOcUz7jYgz)wd#Y-%wJg6}lLXEI-bA&@f6fbdq zp7591g`)m(bADp-Es6QX#Dz4L^r5Nd>-H%B-sMB!W|S)4#K9YUxP)=;pC zN)HTB!Ug|H$^qG_!(AxB_umx(wswGq2=LRRhH-HO@EzdP2(ZEd4vzqf9N>2mV2%TH zi~#pJz&A?&m>jn{fbvNWaJ>UGMu1Bl;JyejRDkxS9)QBsLnUC10@A%*n7!GMHxh8dVU~$=IDZ+@8a3=tnTrzu2>Juy<@1u zEsbvk&axG_Ena8;T^=?04}ECcAfF?)YBMW~Pdw*SANEeOz4Jtlp~t>TWO&K*DkOXA zRJd8Lqk`5aOG8O4+49N5YONh2-PQ_}(Ugdt22JJ4*402v4*P5$_w|Zo!S<%3RuI~0XuK<5(K93zdw)9Pv;iCYb#JE#}F1?0}cko69Zb=QdX^+l{_ zA&m>^zUv>9iu|-@7}X1_c;*JIZsjK1mCNO`|%O?+r*ua&Y9b0xL*}=KVA8+ zl<`fTYkbYxa{mkkJ()7ow87T^*EFj+`%uu)8t*#|ZW#~ zyj8@xdBD)XQAji+X4OR1?7Y_=y>00)Kut;O<$MxjoCK7y3 ztFZJp?^cWL&69DF6icNId8y!ql3ZdoXarWHZLys?#Xgds&Ctt8ymY|J@6DX9Wv8%BRSP&?@A7Wad z@C*emPzVE>PI;;a@>KU1QDrxwdOIi&V++d<*_{47CBznHp9XkTfcB-zpJLE9ItI7w z6VONVHT&}#60MjQL*m&xwGXaA;iYP|66f4&UnI{hbF1@*g{Dc+M$O@>K`Xhz?C2y1 z6_xEqnVYMo8+<)0Gc&afMy$!|Mn~Y5Y|OC7QMnC0&AaS)ai~v;2^-*iB-dj&Hj7y0 zjrY6Cp@UC2WU)lX?mIe9ay}%7xVi&*Z-T_-H|{i6VLQf0thNO|h!EWL7o8M{-E#-h z*&B-AKupfl-uJ^VO`)LDJBr#qq#&1=^fx(s=YXfSAbZ^yVzakdb~_C+WJf0 z=KY1LKD5de$>4dK@cJm^Si(4}PAA9dot z3SGeL%fCwv=Ik29%{Fr3G?xccH~vVd#Cbr12b%q)(aE4L!&I#T3p4Hn?xs?+qC~Bj zddXoRnH8;2(tHp4aZ$yJc8e;O%gNvATH0thuC~MgM|ZM5oJ>@DR8(oX3G2A$K)pGH5Th*^KYt$5fsL4 z{w}7*p9~Ua!%000n_pZgufpmW_)+5PrA|hF)|JivcXx*^JB>1{!F6%cbe!A{ zsMNBaBchIZ!P`az*mm~^@AoB3jdgO}G_gj!WY>@%at~gOOWdfA%~bf5^-1zIJ9)J~ zP}OtGhXQRUZ6VK>&Fdxajd(Tz2$b!3KA7kEu*$@<-6lN4Tdsl|HttaOcs))qwl<-C zc~>|){VKDIX4z%H-J0eG*Y9q6z%F-$*d&Q&sno$*FnYT1XySb*oJW6u&M; z+0J*l1#~psY-Xa_WJb`so|{iN#5VIb%LvwO+#+6oJ>IHrV>|9-vhkCA(pr}q14_}@ zOx>!5sF!^B;K=R&I3s9Y=cj2lU6hW*Tm)9(970=jiQmB!4u^wWz}iKpt+>4@GGrqn{oD|An)CW1u|u0@0$bHC~vV&3H&?`kxM0#)2Jpe1!77Y z7h3NSSt}sA+bHCvTYIw2wHKhPt%;=rop_2rlh+kA#G+D6vEb$3T#w!$s~f-_11{$o zb_^g2;$;2Z$}?}2XBaXY758)jv8(Elwp#ye+Bzbv#DL2M%nV+MvRl<3nTplWj6ww* zqgcWJH?ZNAe(Fve7YGwwxB=Q*pp`8}im7lh^T>}DnMDS$n{M7Tog%~qfN(;41!M4X zSEt6{lR{y;_jWtpl7#ob3VxKc(8eWOty}3wOgxbL0>klkEgsa6&iXm>H zedgj!n!j?iCg1j62Nvq(D$3l%Qh}sSBhm?jxQ9m~}eFLfxyL1eJy^Rql4GqJy%|hIy%DX`Yh$B| z%3MVbJjlR`h7LD12j`p04J_^N;@Gt#8~k?=9gvVy@zpr*%7BQBA*0Nvg#-ZtMMz$*U`<6e3Ew%}ftz$o2v-mK>xjtnj;p6;S((L!`J(_)Q7sM6WNQa7}@|HN9@ z?9Z7drRn@#%`wRExXQiM_nu81ff?Nbj z)5fJ?MYCWf4OUr2FY$hkE*Kd=T_?J_ZY-*+2WYs~#pRiQyDCSyDlaXlQs*d9UH{A{ zth^TI64l0mQ+NIOQvZHU*R)r9n5qrZQ@D%PPVyRwJ%K*aPSbq1meWZ<)6_0P)L@M= zqRB@B8%}(AlaqbwZRV8hedaISD98xM>+uR0!62uNqrh`gKfa$S>KR4g<_X-m`nxft zvLNJau2{lsplorx;qS&cHO?*TI?2qu(hDJQV`*C_LzSKKPi`HEXru4jTdfZn7kwS^ zFE}|zwcLu7H(nx7XpW9N5`}de+Qp|e#h+@@M5oniYD?-WP=g|}6|G&MAr8uHQ4+`s zt7*oHz~VK)>f3Qvi#u@F;`DQ=aJ(M>1S7AXGcurXI!~$91*9{~Bl1GDS@dosq^bM#bJf%6Wq#1g)FAq$ECVLI3U>Re54A(D+l_ zURoHA7LQL$9xCX&4O}P2DcB8qm;k_yakb$$2r9K@W1dY6UFd_~Ne8kloCxp#+~O=i zG3!y#YB-ZBNWRM8$@6*Hu;j$9LjBe)M*T0~u3H{*_|c+OR)QK_Hs)x=Dt5l%icnX3sHy(|Uv;q;S&1O$S%vGVkbB=KBF;Ss@Tmphkq*2I z;Qj^R0S1+x>oML_{8qSfp!nEF4cDJ`Zc>_YY7|(?23LSoHHdWjr&3HY& z6NU|3sdwsBsaNypDLn(l*_v|_a8q2u#yjWrC=SOvyMeu)2-!sQXs+g3*z70sw^(46 z9R{>1a(yj%!*rY4m;_Qy@O6N_}jo;CzYDklXp>Uoy6fdm-h+cG?9ChSlMyTr?bBSCXFotKTW(AE}hUO>0>YF(HTEk8#Hyl(<_xm5r z@1!yNzw7k%7Mx+LN}d8ah#bx^ITZz6VSQo=S?W8=;4<|xQ&|Y#$KV=hm3ydNdWkS# zwXGG&A!F8OQw0Okr3|DY`=$h&E~@AUeJ96Pk!7NXNnf)s;Da348nqo@6rW2Z_#)YJ ziS`DDH#Tm}4gRsgWn4!T!CwJxG9@*B&A7g>NZVcEC3o50T5Rsp zJSFoQ-JwC}rFL>lrQY4;yh7nF3uMT~rYp2F#cCQko|@@Wjl{rys{*OAu^S@HCNQU) z-a@Rs0~s@e<%0KjRlf8)npfn4#nVexs7rW5(;P~Ry~>FK)Q-Nj>bW-UNDel9tICVb zzShYbzMa{p(5&{A7}?l4N`7WLUuz$w5A!kq5e;{x%eg1^UH_BJrYoyKfu)@kRNyS_ zFg4TbaR)%zIM&t|S~scw2bG$l48A9DXF7A#eO~fwimi7E5;duwE5;W37?JH(P6Thc ztixGPP{qnAVHI~2RncT{&8YX9McJ@Jq*=h7g&eN_vl-P`NvCVBiF9g72+KdD+Odd% z&u@2=ReTnB{-FW?Z0sfla=ZmkzFZD1v zH>%k-!cK98?GdG?jwYrK&ibBTuBj zb@mhpbcky56kMfUlV+5?3<3A93$9ZKJ5gUlt8EQmzUW!OnVhlwnM6F(^Kb5denZ%U z(=}+A=cvV+sXjK36M5FjQ%$dvYuyKNle9ejYNx(%Tns847r#NufrXw`+YwB8`?1vT{hf44x*f#R4Uzt|ndXQ3$au#fy_uX9yib8sz39wg7<_@jH9btkMDts3Y3sPFIS zHA(!a!4?gX{Y);!N}v7KdQ;XN*aTBDn3C;fX8}p%_>P znaJ9{m0=FGdJxwH*wLC9jlv+$VrCp_%Bz@FuG?NxTT?yk_Jm!)t7|Bl@mfk(1_c|h zH=VfpU$ia`>R=Js&Ge$FuKc=R)^Hjie)Crx$8YTv!KrM9TMs<7bHwvOcse&VS`3jt zsO)A}8KMoPV4fvyg3b0|G=yOd%~Q3cEjWM^Z`dAGsD4WwEGLKuaOS3?BO;DFn(Ua7 zhNi5{i|r}N2>-*Y1mP8_fC%cY{+wopC?)l=4jwK z)+T9^es~f(DmmRurh7rDgSppo*bZ=wgACJyI^d6w|1YBkdgud0q4S5nf-&$*-q zyXT=iDOQPcRs#DleYxJXBfDY-yH{`Rz5_qwshkyxW>VFaX zjiw)2QiB&vMqKkB$@3ut^G9U?vYoeM(Ll7fkF6b=1MF#Fqq!1J54OWsp+xb@IA+x1Te9Yg!XfUs*f>5F`p5;WmuID;`9Aa^?i(Be0 z+Cd8G^%%gQ;|EAK3*Y`sLy-e`c-C(!XgcecKn+)$8VL6%0Bl)rjyJZGEm6rkW@BBW z`CgI1S=w;4d)00mE2YA?q6r`SwXJ-T*ZziL?(e~u1Y*2=MK~2+EKSJH z&|!C;?EwLng}3DBS0f5NyFV3v>V&fBs`}(N+jHOkTco{?ghO!$UH4^Ax-jEzT(>31 z{7XVjEtxXyPa^f8Qh|Rub$4elQoq$|b%wn&h==fY)oKo~#FDb(aY{ zV^_DMhC`fD2I@YGGPeMEQtF9lj&?L1UF}niCUm!Z8;z#(bP>&VjwW~``TQc9?=BC! z^)y$1+MA}kLvGp=%qV)f(ArRI77%u7yrBob z#fnz^ieMH2UVfFDbg4m z7oEtQk^dWOQz+*g=$!l`P4l7qn_+O-vg|Y%8i7RD1$BAJzT237!c_z3e~pYq@%=Vb zm5eQY^g{PuxQ#5=*gdtVCO-{%z_XW=gNsz$i~q^Fp&^($w+qEdb#tWuf)u;zL!0dI z^jqT7+|ZNfAYgx5{gllLGLNx<1_)t)4&o}WQE;~jmrHa-Lbv9?DkQj=xf|K+TWT9y zIt4%cnd~9avf1t+s%~$Z49+g{UOt65tx*NJ#Pg%o!*&y%GrD@ZqR~cWvK865lEZF8 zup?f%L@nrcyUK>ZGO>=9t5~^XEKiPtRhU~(ZD)&zJ2YZf zjh8iqZh118*v%!RYZ$M)gT{3q-9?v;9p*xQ5|LGz1p)Ovj#{m9Q);YlBmi-5Dyx+N zzb_{NqMuv17$Ub2+s;+DyQ))+$MxGQ1J1`8XXQ?{(5`lTKJO&)ibG;+#m>euI{y>& zio|mLBZGGR^S!OrV?WqT)rHvLXszLgcSOpmaIem+4Fp(pY3Mj6X`pe-xHXc*2{o>Q zne!4Y`?y>CcL9mc-34Lq zv3^MnuvKjGqmE!@6KAnxu%%qHzh5NU>#pp%Nzi3GUk(Z#HC2m?%&N-FYXSboacWA% zOkRb!(`x8Ml0*BCzbdE?e$s@IpBjJay1mwdrGEpZ1jY6xWA5Fn5-kIOHs+3#hD|Ech|!8L+4U+PQ~F8SS7 zYChTPZ1q%kJ*S*t@)LnQyCj2QWeWAOQX|9G&9O1#CcpHw%*=J5b~#BJe2BSO7s|P@ zb?lkwWWzdxC%JQpJxo(}MTRPD)I}sB{UDsx-K@aaH2;IsG2r zAGnJ{#@g^+@9Ndwj=cqpH~R2=)nl7$cymNkj6}BYOPtGm%Hs7+?4QE9!I~J(G$%xy zC#sjDaPZ(j5~-+8ti8mi*0sqW5tp8@dCSnz)G6@&s)+CRV?xLCh{&Q7vuI)^MOd@C zl5vgbd*(&gY!qIGX?J46_&h3zVkW$AxSI)W5{x}%(Q4o&l7qG^?Ec*xX)qV|rwoPx+bvv~jSlw{;}}C) zZS;~`u-K!&x3Q1p!_WmpuU~Ac&|NWz>uK~FLsFxhtC6C!iE5-*!ar=@?a<)T;XVNF z;GKr!$eZYuR!n?5XAs4;jap8?CbqYfknMbw>Ee}ioSpW}w4oGw(>73j{Zc@S)0ylj zW14Dq0c_7LB*V0R0O#>r%_cYZ{>T-&8)g`x(xhz?z7Vu({Y7e3v#c;QMX=RK8{JZo zeUTpZC3&yoC$A3+xpsL083;FPCA96YX#JOAGQ-#mN#^dLrCEOs=RkM4Z8r9u7N*06 zVLj}{Ivbe)1wiYHv5}*g-_c8HZj7r`jD3_zpcCG~tw|_ey`L5r} z2o#CSDbk)ju)BPZ_!n9yJHMGcx1Gcft>!f=BN1*t#sF!qy*45>E~2fsS&m*#k(s3y z6&yWOnoyG_(Iiax9v2uNUNi*9LFX0&FM{vF$(gXnrsk1Xu~fTlbz1O#G}vxJn1ZRM z9m9_#Y<6I6I-8a9!YiA#Qg}l}p53Cvq~L}`Rw}nx&RBjkS`F7gyhj7EU|OfxP3s!f zfoVIpuRd_L;=W01?wfS$zR57$w~l<{9MBLt#Z3`rC~xzOmd>{icSJ?knrqcvxNZ8L z#LLDmQTjgHxwkT|+0wy$%&$;980AZE18<-*bEI0m&X=4k=7-TJ8=sjMS>vBYO~NRA zcO$JIl;U@ZL9g_-q~n%A@(=WoOYA4X@I-Hpa{7^v-CZy(3vRMlH1$`aSqNt5)U+Ny z!6k^5?tsYk>jP%Z6-^2YpuHMez2XoW69*O8U!2^;J)mlXPGosK9<;Bk zU}D{{OzY|fcj0sD2`58WbNHnb!DL(__f94PykhSThLMH9L=nkXF)o{Ug!J7=HO{v0 z>(u+aEaboUUk?;4r4ppxJtPQevj%u60_F_)TPmY&aZ*oMf<%?wc(t3fn&?Q$*jOO zhC+*N=pbR>XzX_Md*Fp^(`|T0FNBuqV-C9VV@Khj-#C@*3TX@YP1u zU3wygZU)C7zZxDIiVZB@mr|Nxc}M6 z*0kMUr~|CNA_gwOu+8ZVZh7;(a9Y5#C)S|f;x_>Q6PA04r4$BKw}()B+i>0{RLx;I z_n7CYhKEq2@*=8&E75KaQM`omV?lMl51~eQRzw(HSTZOq_YxI(svm|GHf{fis-U{v z^MqaVgwGTaZp3zj_v=g?yAJ;I0401ea=8rLUW{By2^QZN0bX!``y#+>2k;`m-3~B5 z0^BS>`_eN36uw+}IpA=#xm}X$zMP9Itjus-8JFht=yQe!YX{zD)jVB#JCE|#x{aqc zn9?ey$VSY5w}zdYgS#`9%yiCxLNzw~f9F+7ypS#Q){>xx-2WRe8N4R=?k?|V!DwcV zB5PH`%L1g0#<53Ll^vrqF3t=4BaM=1|5v{cDrXCz;V%dtxpF*MHhHqhGGF+|3Yj0z zPB$#A*$-9TWN~$}4*Sj}=A7<^&Y43cpZ(-s;vc{`>d%mX%T588k^(Nh;L_i5Ng0>1 z0hb*d7dgIM;yi#=nGu>c{AbUNn%dA;jq_5U43u)?@arZ| z2QsEMUjKVNW>c%!n|dxmLv4@Df0f#pq5VuJO40E&M06dnYMpfe?t}e*SC8`S+nD0# z^q~sE^0Yp(srSWnhluHAFl7^;6Mw7xleSSuaZdU}e;!|v7X0Uh-#NlR7JUEt!D?O* zcQ>jN)0sv7UxB(lCwUpKXLSJQ(rqjp&-o2T!&H;}Nj@_3A`{s@k~P`{eF>#GYvYI+ zOXAW=KMIl5iTj;XtjaLR4CsVn0o*e6n1$7|yMZ=T@>x)_%t|n^ zf6>1l?3RO!iPrZg2*GW~G>k%H!Sv9e1uAOZmXw$OlKP#Vea3Xv>_2Fq4FgQUnE(Al zMdVeBcg zuV!b+`?F8?+%AzJPey9qQN*9E@egHHFTEdwjBZ3_zjq_b8_alSR859cwRe<8RYLJ+ zHg%ZTaSwcWSHn;KesJVuOiQ%|sIl)(mPK?!cz>0NliaXD4Ql58Z@B5?S2j61#-pS2g!O#91S@i*&(${g26jjP5Q@0|Pdsac)!0-fTtfyK`lASq|amB|_sKk7L{ z-18-00yj!4J~TAEu?$73(wEZ3!m()!$D#EPFA&%~r$tSoKP%en7HT3a3{77|Qcad~ z)g9q)uOF4JYaW&M{*bO)G-`0m69`%~pAs%I`RT>wbE%Q|%FQtLMV_Jy&1TG&Nk|Lr zoUPsSoy4PEI-@zoz3Gzxhu3BKjqc>f=G-af8s&8-nd1CA&g4c3-kZ(k65kt0zmJ$p ztg`R!Ml^o8dazw@(Xw$+Ue4fTNGfHCi{$BRrPk8Bp+i%QfN~fI7O>j&)kRVDbe2Qf z6(k0xRe5n?m5QKS{#a0*g&6~Ki4(zstv}!lQ8xSUfn$wNeMv}6BRiu5QZjp=Ck^$8 zgRX%1CtKEYeyLXs2=$r6Smpl>a`_T3Iq)07*E2>9wb`#V&T?$vQeuB|{@}2}WF3== z!MXSiOV9ZmTx;~Bj~MVIQvg%Rnjjv38-UF5B17X!2FpOP{&zB{sH>s4)MQ)bUqg${ zNbD|=?xasx*S=Y;SYSIgMSNx|a*zznMLutBp^DV;P9qzC;78TF+OWm{{3oF3TkTKm zL}=dK-lOz)MTjC3#QC;*lS$z`?wU07N7 z3v{nggie`XG|#rT_=9sLANq%Z)jBCX_k-YHW#+h!m6@%|n~&=vNb88Y4cktnx~qDp zvvZpG)y(-N5c_*WmL}YrawCj`68IB6_z$ps(0V{RJ7Xx=>bW;g$Ca+LJMR3&d^fxg z{eSVbKdvW1M?@=8Wx}MV!V$j&MEv^W?Ckk>g53I+$UbyX?K}E62>J{-4SJfSr$^dq zU%wiK1NiC$^)RlvVo5GBpvsNfl>=qAK}t6HvrJyI!SAfNqKR;JG1M9dS+yxUx#>9> zfWJsGVD1W>@6g1MwHx65e;dD5{=<}G%oc3Fr24b>D;0^My@43z@u!a)RJXVT8jd&o znPRq-Tzs@j0d*rY=X_OzC99{hFs<~i?d`v8dTsU(uv!>wZtn|}t%8!SLbV{mB7&U1 z{xkzf^PH=ueZ2RJ1d^Q&`V(ThO4tCS2ls>=ROJdNUE`Rk5e=0%Zo!&Wb(XtGvbOc^ ze+K`m>>NcMtP_4_zpd>3{_&^!m)5fCXns-t-qOZ+4u2!KjOog{MO&onHg=t;Ji@iV zAPn!zealC7n%MAr@5fs=_{W*-#FnLHKr45DF7ih~=fcvtxcQ(4R|yAqux+Rm zGI=d2ZZp@E6<2C&yI!wBgD*6vTY8iU(PI#ttpgMaBE)oXjAQs4Cb@MB&Jbg8dYo*>%Jd6<_lady*%7t!quWv) zpI9Z%BW4eri}>9C`V@3gw{WONt0id&ZWG#s%y!<@K1wV3n12*T%zz5te}iah{$D7B zR@|IcY)q?<7x_DH$mLid^v5dh&{X23Zl%QL2g{n2scOuZ_wrk0G>QApHXSji*V~VV z(d1lWBs6-}o&F;>Ig=;-WSG;#rdcJFFv(6$&X|M&`lp|)Dr{edYIZd#lAYlJYwKd} zzXZjlpJF!Oxvp>aZ#7a$*GO09@vky?MXgp-olV!WAkjN%#T1K9^ z(Jcb_mOKP;LTAA5e;F+en_OF^3xwbEkNJk>f?XfYUO!=o7rXLUOp>2KJ^?2?rMY4% zz5il!g(fQcDb{MnKoU0_yVUvDnXu0#7D5F9nflb3`kI|M#V=9gNd2}}QZl=_La`vM zo()(Hb*!3Twa&a5C;!Fj3df36NoqUCYPLT|g6nRR#Hj+gm6ybwT&ursb#m@WAk{6L zR51IeE0rE?fnhFLV17cAGSBS z8)WIs&nV&F0WiwlGRpc?W?t7Nz#8zcQ7-2fzBLifwc$>Y>vdj+_^PI3WpjlZDC1}< z%lSL7pvx>Ex5{fbg z@e_KZqc`PUtejl+^D1Yj$mQlnh7#|E#HS%~OO=LvHr12wM1m(ASyJ*0kX%bjaNg@+ zUB*i!)pMUy{OAA9=z-6b_}!(lL^`8aJ}1xef1prbDl-*Ka3@mnbsKm5`PbaUiKu?I zX_euDFtgF!TPG;hGLid3c*8!M>gei!HD!vM?LT~?c(H52@1n}TWjk*P1~c?GN1LEburs?Z*yYWDW`ClDx$)g4~;&^VHt!jfG zjSYYOD0K_D1%y8SW2Du+ahjNIvRQ~a(wPSBal4;B>H_QF$By_=Ovi_9p)>Yq3dlXx zMcG)jd+P0;hPWrKmMOc`J@s=>b?!-vV=U=21)*N@*pK+gP7||vWM)Hw4t4_Rd=g0a zI3!npR?$;k`U{S3jZ~qR?2V{|2<2oo1NoV1 zgLSE2DZzE9X={gdHdr>qZR7f7E4KCMcTyhhdJ2#WJ^GnEojZxbdqn18S=!)aAa=Uu zD6QYk^r_$G zOAj~857H_@yEQUPTaFYvCdxESG>jBLYvrW@R^ZV5(-Fi5;pwMx515eYPWsgCdSuNnw*W%Lq9cPZ` za0+}C;IY=?lYD&A?i9(I0GO-Z#|(3_@1Az%$y{}Kf7IXwF2)SxN4`@&Q#U0~FacKt z@ly+2U1uJ=3c>mPXB&nJ@WQuE_JDvl<_c~|I{j4UV*d{j=^!}Ujwbh>q}2RXnnqjV zAhh*igIJ_1#P(vtg=wb~xHPlJOGbxOSY5*`mVW*UQjL6{$#;Z*2&QF&~Rd3A0e{FshCA`!*u?l(-)f??sVU1Z|t#-vg(GJ zKzRDvCamCRR7srZ5`GfVGOKjf*!Yc3uDQqs=TVe2H;i-q;9TRriSsRv^CY8I0KF*$hdG=$exi$p7kB8000*Z{!(LzsLB|&?o;^ zQ+d(yLfR|~+zwV6*|NZMO%LCr8vh#Pec_D+8%@3FYuBdiHZ|s zG&}H~!woY$76-v!9D%}cQp2P4k&WHsfaBcL6Yfb%6~^Ek1zcWo$M+?Wt)PPwaps-d zTN4|WSf61;Cm|_B(;ZRedv2!ll85q*2ImrcgW$YkSL2u%q1v*Yui=C4 z4Pr}(GZec)6(U)06HrzVuymYGXX|a1*Ch~(wH&4V4zjVeL9-7dda8J3Q(vFr^uUbK z=mXNk@hSPv7Iw|izrkF{GXO3GIsM#6Z}-ui51E7G$30kmByK~Km~)@hyF6v535g?m zOZbT564rYTbv39AG7YU|iW|HJv3AD?SGqFZMdOQgdr+8FNf@Q5GXITobx=c3Xpi^0 zZb0&m#>O?uOD;l>^foCD#%U#02Lta5(PbLCIOG!hNR~4b1m&+#j>Te$wCBtZBlzP6 zX9FIM!<8A|#@XKt%sBoA6aL~*H~Ft&Q%x0U?ww(MXrAU6YH{%sN0cwcZnCLbwq?kx zuypW;9EAQkz)0h0Og9N;R1L@gmEOI`HVB+cTuD8wy>-@_V}=I09FRq06c6V+XRYl$ zkw?TYUaviRx{bkdEQLY*rLpFj+T5>Bs%PTY%QxqLbrKMIC|l9CU)lHhgY~?K=*+Zd zeHL#x$^^Fugi}}X`?o^%QWNZB&TL@*PUx-WNsVv&aR};|_>LNdm%h^&H~aniIWNta zKb-P`VfocTd3Va?Te7LM*rL(s`&xc`r!qAaM{^E%t=%Z@OEEtCw4(zo|A*e10au}o zKE}(UQF=?>j4pFh^Ck5{Qi9K!D~U%?9ltng{loh)%CTf)C1Ravm`kJC`f}rGPLouS zjdgHki}l34p(5b^TUx;g5y3nL9H7|4R6;u}4U^pc-zrb|Cz>+Y=Lv$=gO8Fj$nKOj zfNoN1KwA$^=S$#V>?eO`I2oNU<2*J5=35$f5LSTp-*9Sxd8%Q6qF27^M&$6N}uFh6l7&jqyS zIoiHJH=mCwYeT(6FPtvcdwjKsnFHUVtoWvY zX-%qs+JcS?bPaOrHq4MhoDCvzyo|-NwE1lDRBK;hE{Q8bnA!Cc5r}@RYOwo|6n6z_ zTJ49L^^z>mPEAMV8DhtHeK)>T*^fackA2IUejxOC3$PU?c*)0@!QAh<+a1z2u|C~5 z3}SAl)U?7P*!{31e&&ZVDL_$7y#7V>%3#0r6Qtt3gr#oe5eQ9yhg)@g08rC~rVwL4 z$g!`=jA)_(xx{_&gU9QR$6ZT;(VN^$ldHw1R=I+zot->saxYb!6{*Z{yplJGw2-k0 ztaK2(<@v5=nRqe(lUEFFan58nUJ^xvyvc<`EaB-2B6({n0i z&%}QAhch6odhH^m$#W|jKAm{J){{f(CNFF^@xZ#tO5@`$YqnuCYLD3Lmg*1MVsBRBZrPSaygXSaXoG2lA<;(kEL9qgUBUv?;N_g zRGZSyJ(41n`?GBhau?SB`y1nV)+NsSe?M=ZPkTMjoMVnL=9puSIp&y`XB!EPsp!?# ze9h5)`VFfdqu=z)wda#pBWFhwNRu!!U+rmQaBB|)e8rz7;Li~76}z%Jx{c3Shp2cy zdu5W@mnD@`$j7WdL}69b`!NW$X=($hcZlja)5Z zo8XC;Os-M1oC?!Qo&UD>6&==%v^v=n>Pa`!XB6Rg9qc-Pg+~{cEoA8wtCn$9}{3ieXBR{gj82jtoXe1~+-oxl42H3thk%eX@_Z z##}VlPU2mvG>P{qzC#_b2Lwj0$4#4U!<_@>Z9c}$QO&jENCEb$7f50br*Ek4EN6g2d5@y0>hqS$O3kG!0s#c??W0S!3Jw(c&m*ur#k zMwjTH=iE`iYmk?=g{S zk4*HR0O^JOr_|;8bgm0)r__xZ(YZ}}?8neWBX1EqVNY8?@9}E%HwPXa1CNe@{f6As z@u*h6@ZuCDCR&(u%+u`K`Zg|=_vx{yH0rTF%nPVrcy8wy&7Go2qc`5fL%%UkIX~eD zep5TZNPXB94oBC81C+A9rSv4FsXputAw0+*qGfw)a$myC;C3!z+MC5Y`tz)vRI39! z$yP5$r(39xWV)2KAhIW|oxPc|%i&WF|BS)Q^B=Nyk@riy!>M?;+B(w}tnLo0IH)G6 z@X*e>r+RyM$r)~zU!(Qc#%du1(-DIV8HY9LEIlSyZ0y-a11ZGbDJf3Z|o2iHV9O?R8!bfeQ zdsU^pZF=;CNuHo?<_T9=!pKSfc7eam_O~vk|^VHszsXxIW9<@H2HhBI}`&Y4ki9_o<o4l!t@Mmagco)7w^{zy-QVu@x1RoXv%mGWH?L326{J;;3uRu$SzV=A=(f8V zS16d}Zbp5xGz~Z7*&e3x<`JHS1HpFhrZx@QTKt7^9NPPF^>FfW(!Tmf;;#tY%T4#k80gYQiP7U#cBzWen^#8B3S{lWrClD>2g)8QX+Fo?#}$ z*B<(&WMFvzrlyilzX-c_b}RP@R811_!oF49S|d;TS;3kf&Ex5}oxI{yM-~IuY@l;} zHH_eFjiQ`w9@1pxFN=)1*z@XSOlw+jKt=lZdnC=fm(uf@GZ^m`F8P59a03q4FvJ*M z0+P07V%Wthg<3M9U~f3(DX#DP~3g5qqkrNuyef0-CV{#~DP6VNx)J;kJ zhD6(fNZg;~R*j2avVg@1^)+k6K{s*8}LUxQJvjl+bL*wds72msT zd76rsq-UnwtYt-Vr zpD7nx|D8-nY>@ySKJX0sv(;Au&pjO%T11{SAPiPR#r0o&Pq%a&rRsHzNgNC7%lf<6 zp848M%Raa%6@!zVT;$w7eUJV-Z#(P1!gqr4AhBKv(};DGePgkjD)ljPL^^1?Ybd4V zFt%p|BcC?l%Q5B}PcmncM?AR>tN))RCY=3DD-&(~Vb?@k4{22AtM0LEO>Sf4*T%@h znh&-W_td*|ht zub1KD`^E(C6sD3Ozv-F?p8>0{@n-|8RseJa!!_7;BW4?35o5tlb6sxigET>DO%!Y_ zLr4xp)f(-KX2?q&i)ay-md73F3Zus8navTr0@tW-0UAk{-lzus~!+uKPkk(wUBwRUZ0q0sE8{^zOp%+{LA!WzQGuk_V=%w4y>Ya@+ zxkiz=-5(8~EN$n~te|BOaEY?_AzFIrr=xL=G3ZmPH8Wig4wgfHJ?Uy#^96~qFL4b8 zWon7LG#M9h`UOT9pU)W}Kh!v23c_yc6TZ`|8;e9GKzI)bJIMd>j(in{QvHAh zyQCj{R-=A01YKP~EN3xjgy3(Ymakp>m>dlRQ-YrZJPcCfG>l*?^(j5;1tMpo+P7ON z0|WIL4-{TYoz@3KqE5+)pBemE>gO{_>z;7Y`J+@U=>?#}m10o6k0MIcBf{%H>% zCmp!uqwUvfJo#ctWVYL_hIm=hA~g%42tIq)9p$VZ7c!>-M0J>XWnaP*hp~IanC_7) zR_9B|cst+hD5wq}IaEt>kBRYwQma|5{`7+HTdsF8|A;}u?P+H~TGd9+tHP*12kT$A7h0QMef(8cLPW??0$I_eQfp(Q;A5kIGn^y$I1<={4a!|h@nXNH-kmcpMs$txYmn0NYLSsoZM8Vi!Xz}>pEf74keLdA z3G)^`;P1v5Gh;2IIqDi?66n z{fj9q+}7-zRyEg$gB6eCpsvTmdvmOEFwObTj0Eof>}sCXbXQYO!-cBx4rx@wxiNqB zmu*V@JYi-usEwIf242q0L`!LodQ~#>3p^MzKbJ9c8nDUo$`GE7gJYHG_x`h@@|%ZW zh&yIea__>-OwduqS^RMS4@FU*-eiAderj;VY^Ap)UHUzhs>qhewECxBGv}*3=j5dD zXOZ2aAU5TX^YX)INCCPvZ7TJ%ap%Ms2Y$bb#&;z>&LseC9#b&V*Xs~r4BrEI@5zPC zrJ%te?d7;PG18g6S)ZihG59(Lt|-Y*Pl{=j<;OVd{PS zTR(=x=1?lG$+1q=T5p@9h%YAogZllKn~0z6eR8ZqZn)x84fUbSVK8r|QCQCEWe>uK zO#(!KCnq#C(=A&)ZFysBR}xy}WTsK(k_>M7DoM3#Qw|}c&ulp>$+aolfo`Dfk;v>* zDmAB~RCTdb*|jNA0urV^Ll4&a*8Q6#6~A?#T#&L<`eGNP{F}mDZt^4vS}As2AKY>i z$!o9QBb@wFHg2>Gi3uvorRB_1>5+&0j;>^PlC4@;JHE}r+N&kZ>ID*Jum??4$czI- za@$=bQM`P^1PDgk(a7lOPAJ|4(#Eskdv&xci9|977m~sO$Y)7*}f5<@8DR>XfmxOrxRANpxNx13py? z1@JxdQB(MrH*kiOfW?XQ(o%Y1%Y<56%nSy~=0&FCA6OQj$`A{3WbJQ(zexUmxjV$SAs%;$8Gt+G zd5<}!P-mr+sMigaP33imgCUWaKj@^Iu#OsLuUVqU)Rp`giC}a^#r`U86vz$Q$!1i) zsZL`bp{*JZpgaq0%k4h}9$Ky^VsCYM2Or6Okwt={j%S%GEI!W{I; zC5c^(VJLX5tu@Ap|6eyL-(k)SOiPmU`5?{ck<+ooL&l{WXTk_br*IF3Zr;$uCQ~wgQuk% zm(ZJ9{%(}Br^>_PyC#ed9t?rhEir=LAfQXxj4y9Jkcw9S)pR3~!PdZ_cGJxhwfjiG zb_UpD!Tq#(QKm(?MWop%T_!hOMJR7`u+Q$2Hlwx(O3K4MgbZJ8VJ+R*)0z+8^~WkY z1A=UM$@ch-MAd^sA5sTNhMJ3wmYq^8HQXtl=$dBw%6bJ+kQUu(vYl;#8#2z-ZIUS1 za+8|yTHbWD6_PG3dfEA;wQjHVpxP!joRHlErJAfQmIho<41FNf>*40i?+xg=(9y{@v*R;>soqg!D?XsAz+liouJ!tX+#AC! z?ONqzB)(%)mnio|GeX1Ow7T5ZJ7T7}feQtl!nCh{F6ysldLH`qxid-bwn(g~5m0vx zitewWj$}4WZyf+r&p1=JLYDZCijsq+hLzKyRG-_MThSDaWC05bqRa{w-@S0uROBR{ zZ2ZiFRB+O}F2h`H4 ze0Idn^6#RXeS7~pnqqK1Wtx7fU!asp@_D_p3@Ar|?A`C>HJ=$wQRB7VuM~Y-Q-Uzq z-*U^Z6m3t68Y1_!Ve96v_I&hz97pDa^^N3-{KPn^b8=&XE`2Nub#?8T#JJLFZAS2C0Bb!@>TP8QpGuv$y_YDh2h)m$-5n_ zOd+$Jho~CpmZ5Tsa`U53hM2Fc@w>K+NA%CVs1FRt$Fc+I$oy7AMPJhuKBhWMNa<^e zRoJ!_^)HfaHx(aGNsoPuPJsXi%EiDQtGpj?kK=k_<^T<@#A%TrS*OAo=4xycH_tIh zaU3K)mi0xlQn#q^S)@E^6_BdgcL~6u7G{afkm4R0V??5FypZNZF>b;+{0N zdRDDF<2j&LY*xMv9KXF^rHt-yTv)Z%er`=JwBN?ykN6GvN(K(YOa^-wnb=ZHti4~RM1R8) zK4+tQk&X1WycUT5F5lUHCU&x)86ET!rW)F- zCeppdY_n=(dGwNeZ6}gu)0H@c(T0wtxjy~;Ec`m!_Tf9Jc;;S}r8;4^@jRhLwhvu5 zuij{4>TkZ2dAwK!jsI3agF7-jV|&>oT~~5+M`>(ufCjjH_V=XQu*_;pmCJ3h{VMqV z?R_GtkqNPWuT515|B;Q#+y)CgFSUMG-DD1HwwL_`8^BbII0PX(sm(G4Pv0%NnKj$F zja=!WE;Cnr{|!jaI%t2Ud>D&1+}lpgE)%MecZd7qz34VdV&j!|7dOnXDFmU@sM;{~aM3ty#w9v>Ck`18Au@QCp%q~3BbdRs2pVB#w2t;L_ zH|kE=(hR@SieLKaBB1-{UUC--LvGp;riR2w-Gyq_oA&K5#dJ&gV%ckHaI$L`Mp>EC zF?SPq>8+Q1@N5@V(n3A?)LXouQq!<-U;5*89@jZ>6@oWun+HT)rKdt1d~XA za9c^h2AA_xhVShnS(;!9TlFV-TuX8egEhCSm0?QX#Ig&qP5NCoh=m#a#fC`Vx0-8j z&ZlWxvG#lda7#335zucu{Yoqt)w+>ilsP+WpQi zpqEe52zeTrwCe3Cr>c%zZhzU_0yjL4Sx^^;$y7h8)+rgo>%)T?LJ#Xn#pYO-=(yu! zGCvleY-Zg@RK_gm#AZ}K&!h42D>&(j&3}T-cwqFOp8tD175te0OL*b$0{q{K@Lgm4 z{)0f6yk1mSq*gj#RpCEu@_$>t?EZn`zN$+*7nO@~L_DMsLZdUh|9*C?jtld4{as8h;$kWA|$7T;q65@i??DeOA-Z z^go)uN{=EkRLrNpr-nGFy5t|$25mwymJ-OIInTN^>74N=H`ayCLgu@l#C>yg^SY{4 z*4Lp@|7KN)?_Ve{3^rvbNBS=sLe0}ray{5*d{DW(I45@zJt#@^&wZS}Y$r0Yg~fBest z%tAoWig|(z=M>MKDge!Uq9S2x9|LeJy9H9Vw!3tJI#ao^oeHJI*d{w4bS`kET)r?E zB*BE;`hkp*&W7ONNE=ps9OV8}g0Ye#=VYa?#UMF;Ht#G#!8IOK@e5s8F;>%(8(j-E z-~QkXfM62}5dS1W!R(2@@l9lQ6D=AotF0qkM+(pl0u0a8TYQj_=*FDhqtLKtTzFl1 z##Pw_5PHls-kKYy^Ov58@9?NU$#&eL_yfn0N#X4}hHu`Q^yZN|>C5CrmODpilGf?T zGnhy7)7&_YzmEATe-h@)9rFZIcstE8Ptu!V#uw#m^c2gTBQ()CXT7_U*e7wD+97!A zd)2@KiD=332BOa{{J^TZ^}9O2^}vndKSuq(GW5hfDMtU_L@qjU6SOVv1l3^hMja&r zMa(HnmpeS3#$IbPT+~*Qro~gIeQVnLf5C90J%+J!)Pw2;9t1M$*y)&c}yvs;xB zl*sfG2#T28`517p{D`fTx`e6a!t7U!H%G&bU~_bmq1D!;oB_(q&j$zLE~w8O97`iN zxeG$j93XQOSc+m{N*7Zjq9Hx#EYaq(8`~zyLX@@gjglY~&URMNn*Jb({nr1sQN6^# z=*h9T%%ggpbg}TX{i-iSpQOXJ1Qbu*&PUX!EQ}C_5 zpQBvHD*c4nCL!gTQ{JMJt$K3=z`Yk_lrb+a_1$PfEI;jzJQOIz6G^trt)jp4%c3M_ zr?O`VX*i>&kfxQ5v(7UTzLy+;k%bz!bw9bUdQg-;y2>!U57=b_a~RNVZEuc(lX7#Y zI8EmVLs#h~oMB3l&wivWh-_-;XpI^j55m?|biLul9wvK#INlFYZ&)$uPm79AU3rRj z{6(0p;VnPa__bW49885 z;|#-55wD5MpSV`}e#P>|(9`*@t+28qnMwR6F2CJc<<~Ek4-QhfeCGH~ts2o+31dMw z&lu_%FPAbl^^7w;V`eF1jrlN{VV*I$l=0k6>V-PPKaRv?#$7SoF``UE(aY!C0}4{z z)HkcWJ$$}>6bOp*?GprHu@3jaG=HRH*<4T~gl2a137=dJ(n}aTBn#<_8T6VuOU!;L z8uDzul@8F&ulmWln5Iu?=9PD;Ot2xmS049^XzD8|noYfoZ1*dk zyxy{B{LaQWzYO12QkKV{M;Rs!psFjCC}gI5sXAe2ZnOvdrmOW3X7?03`0*M@ZJK?P z=Fm3He)Nl^!JAlZVFSv8r+PDN=vBDuS{1GQEWM`L*OLydwWrxn{U{Nreyvvb$x?)5 zjmJJWLE}i1C}=A^x+30qe%~00KQ@_N%3I3A7l~5MSHc}S#H5qD?LHuow+9@<>v6*V86`4exX&8NjBd!U$ zq68vDGi*-fEfbBT-Y7cjn+$AP$I}mM^!j00vqH&=q>839b;;-63ds$7>YXKjaenmm z4{ip_*Oo@G;>ktdU6A!CHAYx72`t7Q`@bj<%SbT&!{G`a91mO!(AfagV;-NRmi*2p z38sWUe{X6`%t#V3%{mCo;NghpQ5@=I#-8kB;ylqris$<;_75SC1EX%wtyY2DLVcI| zYBfoi4X2<;VQ|;@A`26tGj8%JMnjAoEtS_&%7=7Y3D>$mt9=%`@;SKv%(~6zCrP z@U;sbw=mD8c2d9a;I1T10Uhy?nghV#N-%BQ;6;+IzfG^tHO%f89^c!{N_^9aXEjm( z`$aL|Fgp4R)ka99Rew&J1xsez-|6;uS`s)Zi<%kl3Z?vNIfQUZeRxzCEr}?cQg7ju zgL_l$(=k)&xrY%*YQJN>wk}>E4lJCK-qxo-^i@@uOKh3%u;veZjjtIa0t1yTXm=er#S9~9+0q^Dsn zgI1wqfzk$v_t9*I={pUZmZKV6Zu?NsCd>Hd4l>#ag1CuFaPRXcuugpN8e`gFjxC}& zPOT%JS9{I@mP3SylGj?v>?ZP)nE!IR{x0q*e8E*+gvT1=J1 zV2fvM?tAt&#Gp4AD6@8U6s10FQ40~$5n28))z2QSxC-a9uPkCe$*}`N`mS*AyXnR@ zg|)A7mm=YnbYowvTx&aGP*#CFcrEG@JmF@N{VztUIod2iCi+7X`m#*OlA+B0x=G@Q zqG*m;(6clswVcdFx0SsJuQH|TzXZYuBDEU~#(~R@PM|J7M_&h-+qONIHmnN=ersSG z(pXRYf~&juS>->A{in%)ru)wn|C!)FqxorW>_ll=3}P#zz2S<1?*uZC(O*qQgpxEyiej2u=+~s+x;v7kp`@R5@0GEDY1vT#_9ex($NdSDf zh=es82rQhaGBI0s#RWLu0|@=%D39{S*^Ol5J94}s*{>8Vyu#pKHfJ5uGe0Vs&HwOh zW^*RegZi#6jWslRjBsy5D6_elbM~>+A)gtI&mDtoTx4m9^$*PEH*Wp>i-LvBA&{X` zPg-^ognILHv8qr}UpO=qH)jA9HIKz2t+RnJsWLCmt|zvWz(?y2WEOf`mAWAv5~O1pA(0@26TfOZv<{TwyUfD za&Pp{eV^3dkg$+EV~~-{9&5xI$>K0ge>=gqzwDT|e_U|+f32|~@g}-~b+AaXY2O^O zG&<%c_coEx{91%Ry-{j0L%JekQXFEgc1)xJ*JqAwuWwP)KG&cl^^QpnDdIiVcn!|M z!|B8Axy%Jfi20+;gi@IvltIepkdJD4ToykVX(5%)Y{}pXO4YnpyUzS`Rn5^)pIP^D z6aL6pRWJF1;k#tnjvw0Iuwv?V`9SSuwwvIb4UuGu$HJ1(SnGo`ko(xKSaT1 zfHtmI-pJ7gvg$|XM2?-HuW1`FL(uc@YY6%|y>pv3qdI6e@&^`mpCj4I&XR4!A*qVU zYMWBogLKFqtml%I+Enmyz=ej{S2BIl0T) zg)WB#>)iJotA!0}x)@K(ta?;J-5=pw1IKQ0l!pklovGS}-BzlvjOR?U|Z9D6C z(J6w;HQH^V#6JNB%0c|n$3oN>5T9_KZjv))i?5dDoUCMpshUZ3FyLdeHlGh>$zsN# zi{_}xs5D1Ew7TAg!L~+;PO!9p?iXR#?D_yP=_o0Sdlj7!WBu3-(7QMz)M*{`9OYWk z&bu7XhbXL&A za7s)Vwmo}1$r!k6Ey9qxj^Uy{>`84~h`xJpV)IpTZT(XOEGQsU6ykg90@+hlG7Q>U z)hAkFvYJOb)4gPNS}#>we@vfB_5+|{%~5AnmEWu2u~cQ-CtdT!N`enB;sW#y^XEV+ zoT2N=9|vWd$GCS7OUiaqzVrR_Cenz(6Xq%r(MElQG@os=j+#E2|EBegYrzK3T|v=o z7ZU?ahypP|&~Evxe!A>cdMmXYeOy2J~}4Cv%QT#8bcs~ydB zf1L4(jiC?``t7Xh7TJor!~VGWV^=h6LEU%MOo)Rvc)+e`(UWh8^{KPXQe?+Yur`}K zO6Jd6;_65y8g0}P!$7mPIP^az-R70#@~@}gp>8XN4P}!ICZnD=HeC)o5s5wVJL7$T zGcC(NO$O|-jFw@r2|uF)sP5i0}debPK_sKGJ4;`L$h7MPZ9LCJqlnn@~Ighgrg3o5~&O2C?$7fCwkji zd3<>eB!x@|1PVkKOUs@oXN>PyU2f~25Yzl?U#qL#XI+>m#4SB7CA+)xcJ?wUlQ&h7 z{heT+tL8-np~(u-qor?bHuS`7tsKrU7>e3qo3}M&eD}+$*c@&6ky~V)OtcSEhpC_B z@$$(RA>+GI*#7#k3s3b-z}*yIxPscq6x%jM)U|`PO!igtm4h=ziqu3)%;(#X=ev}U z>=%?Qn&m?T$JbJfUACu}ndM<>7Hm}XfqvVWJ${n1W~I9QnJ0PxE|qklwF{m6V6l{+ zp(cyIQ{ixqgk8v7u8gpHl>N-ncxqmOHH%LKwXS5x9@2J8s4naE())%7LAmOau zGnMP_wxzYK9$$<}>hV`tEA8ir`9GY*a{ha*&A&d{iI(cHAJS(2i}85i4ca*L4|g&H zsG^Lmq!0;~Ux$B9JgN{h}nG+Kq_cOjH3G?kCIHw!6 z(1SIyPXR8RaTkAoJ+gPHl4u4`DUR%?2uD7(Gq%_U#2jB-$G2DY6f90Ifc3p8jE`*v zm>)Pg+JwGFpikRrblc^JKbnc1_9_L#>~Q&+%vVMf=K`0)qmP8L3l`c+<^qJ*<}I@+ z@35m8lLo@h(;J$sPLSln$tK(QD9H~(O*h#B}ckQi9An28o4NmtiK$x|i6cf%~qK z@R*sE)KLp5)N&7D$fx$y0AzX?E9NDdT%SbYxEH0SE=?dbPUE)t;GX?iGe+)17%n^$ zEis=LNYSWo1rtT1em-z&ys+C{hH#?M3-fBClG}Z~st4a4>=*maX6m6GwhaCsg>0yeNy1IiZUdw6?$6}MO2l8EUI>>Nk@nyT{xE~4y zxrM{nPVBG8Y*b8$1e`HmU$z z-32!Y)&zBvkcFv`eGpAFBb>$ki8eS?i45y1Q2_7(EC_d}(GaDhg zYMcvGJq!;u(6QU#I=#hPB>gBLA&>bB8_xz<5^txOJ7g)0r_!Op-C;Njy3=pCDlRi=>nJ>>Whf(`+N29h4zRTh^0 zno?NKKbR=B@up?A>JSFK;RNBv@#`Cwn`GMnM&6FbB_6K@q%O3)=4dFt48k3N@j
    ~N2a5wO)d3;Wu^;nbrqN{LIubTh-W^t4=;cQTGmj$>?s zCIwtULBD_=E;e(EEyA%xPGx6{+V4pFmCjr!7^_L_#QU<=DKwhCtEQ0UcyRJfG<|*{ zm@lJS6#f=5I&GM7!@JvWqw8$?0Z?U5ox6R(q)G0xDP# zVY>;{XyZyllD@II2!yFg&-3GPy=IH&(G7^8^ra9_u#oDe*^)>1cstd6vc>_bS7-r4 z@&@rnyK(=4V>`ievwOR!)E^3&+sKN;em%)9OswOth5Z5*%Fj@0^x;z2b8V(C2oLwb zlFtPWExXeXFbC?h?0!?V+N8(+9a}^-zGSq8kuJ(345h)reCRfwu#Xn{y^q$P)CKqx zpGzP{3nI)e5(4h)IFp}z=4tlN=)#F68@`su`aSM7$+d&N-D}72B*R>B96^~X`V^K)b5>@ zPE1~6*~H?T-Zs|XhV7yLhV&}2ce))9jVNR`1Stx6eUr4ZyDX!o$2*&eOx>zcwkr9lXokC<38XMa`_DTWH;l&1hQ2Wq<~wXG2B2*OM4;B*&#QRTHDr~?Z!X}y!j%|MtFOb^qrU?s01dW(%birBD!1{V!ydpAHIr!}df7A_6`<7kF~X<>N9S!zQ@ zDzdP~@ATztLN#q6D;QRP(`?o$-tW;j_x)NCs?r4ue-!m!7Q2l94tgj>ukzd6W;+=X z+4+0G7JUj#pLulZLhG%9dCSVIjIIZ^qPloa9i)bKQG9!fmd^`M*1JOS**9$@48A%= z7A8xwwCP=tN+M&jH!TE5dhFR|BeGK+cqYKi*wR4TnyF339;6J~9HCnjC(v$~+~5NQs6fI(~^h_LE5W$(wn-{B@7J5ok~f4R|m@C#!* z*Z?+?ts#)X;HW+^qNiS#U~PfQceW_}Q9LPc$C7#LL?S$N8VU~{oX7PXKw{Z3G~$DP zi_vVga{LW)x4Qtcu_Q^d*m82j?0Z;=qL-{hXW;6?y_eILb2TRogO@QEF{7Pfly;7f zDzQHbvDvU{(gw)JoI@p$!u;pB>##lp+ zN0o5vFxHN~+vQ}tJ)^DdKo)EKni4fq36-xLK<1v4rHpcO#K=hH zH8$Z{54#wdJ!jlljR4&dP#YkV9SMg4ExfZ~1|%zi8Ki+Ww512;$2R>_z!^*4#@Zy< z7bGN$SSKrP#|Zscj&6Kf&St-cFox&*-*5mUZ#*40o_9XJI_j3@6|q%N&(E$SIhrG+ARlWeY9=n=o|*TqJY$Fv!w{7{PBP zF_zw+UXU2%incYWqCh6qok>^o%3cmP9GNLtE8tp^M#hO7b^-~JG&>y3Hpry#C(o;} z%zDvo7}8fscVb7%@@YT3pEO{0@eO=!BtnLTio=L~uwdkL@cbm^w978@-cu&G=yIoF zw^a{24o~Yb`EKg*I-(ss9~X$LGsvLXRAHL{jx!e|_zsV)u3{5F485!KY0l||&{H#H z&K2P>dy~e{FnHtyce>GupPqA394aE(;v5o0Cz^hEKlwxRKRfV8!!4eB0WKARvM13Z99WB^1x z3{mzNg>2Xde|%AXPf|!@DCe!s1sXyeLNc6Cf%=9b>h6XbvlZ(Oj>yt^QVP_s_&I>! zlTvB6*w^P)Rk{p*XRWRd=xirNgZF?p2c?i1W!UUXe~+5SWMBHbMopR@8AbnHL?w00 z(^{9k#A1E}Q6lC)fFu_43Kg(EHW{rciFrQh>LwENCZZW;>P>HgM&K&MtjPsB6C=E` zh;VDQX@!`dBd~&+e#HQV3_BiI6!So%CNYn~7pu=DV&0_!^`1r4&zb-$#C(=;SBiN| zsr3IAvtL8nNrKkS`aMD8U7>-}R{f47p;0^5t5joo<}si1&BIvj$5k3}f#i#tVh9gzul_`0R?!LgsAHja^~fHXKg9 zKevH17yxLD?#pKq26wAOx8rZ1>jJvbYuY}ck$B7s#sZqLBWbzim0k5$@#vm>waCQ! z5oJvt*}l%oKySIZq|;g$q!WxGMUyXcMI~8b!u#cmgu!G?NjxjjAWVThDWFk;4QqZ~ z08rl{FYmSVRys}-FWTRqISxAHA8!VU3XGiXTlm=^Z{I#OJylCA(Hd1@5h^`BJ(fr% zB+i`Hhc2(%J3h1MHMX6=cCeM<`q7!WgJ>qBKgO|;Sq+~W0fG74I{hbwCG4s1(`!M) z)_unOw9c^2$ZaC`%Q!bPn-Zl;Ypsz4r~geB zg&IIuyLvZ{KjpYw64P!*j8khi4LHKNB?Bc24sjDjN=g z2pA>bm*>kCzTxKZmt#ar;p4(9%n{S7qRfj%JNv7tB0Pc=ZTiZIs2f zfg~RLk;WWe8P}YWtIH%&<8SN2ft*H@yrr|2WIJk?qFU)jh2BuFwhh}+!bt=VTUYwA zkol`<5wq{zax7dE-WE*5UP1z&2IUv{A|<+qJ@=ZQ9nN|=KMnTcAgNCStB=wIm*QiVHiWu~XV5fspbxch@>xoLvvSLzLwh$!))i;~ z3Q+R=I)H44@xUpZ`xnxBy`-iI-X@#a8Pf7sA5e5v?E<0Tw2yAM{I zCC)4PQ$*4)M)FxxjAWr9F-REu1D+G2N9bI?TMaA-`=@L9P&=c4hIiHsT6>C?i0~Df z@7oUBDCVTK3nrj-b7l75;*#<>Yo$XM+^v()}}sgTVeEbboBb;?(X zl5SJA0@fG+F;`IeKoH$_)n zR!N&{-UXPe{2mF5#p};LcvK^MVHmd;1d~)!DsQFE@>26s=w`I1bnzrfr5*mZGsj=P ze@=N)2UisReUV^)(&MUx*%5-Z)}zF36(!mhOWf~%&9LP$tV=@8|1WY%?7ciEsZ@@1 z48C3^Gyd{56wPDw6@}6#CCVKJ~JE?PB~O3$$y<@qZPk*b1Ah)>yhGv9}#jo?ca~!NI^QE{|#ZgfT5H z_t}#^2JjsaSaQJ`*7%4BMgX-?Pe3iomfc$pprCb0yQ}h5IHy`){ij&1>&bV0_(-*q z)Qr)KogfLE{{tM%@`77dKT)P;1NqL6b{VWrZ(O_BKGM-`8n8Al%CMrvBaVz4iaUH5 z7rTuxT(a9XE;10;oM}a@xx!#E&K8wlo$gdig%l=Q=qc9oHKF|KalaH-r`1)@&mn?~@X?1!~>X|hREStn%xk&F)JDnWvsS?D-@m{_l=g9GUrklD( z*MlLpwp>-6xxkT6AXpxq=*as|Yu(6^P66qJ^ikXt9UN_VzJr2cHsd8n;dVn?I)|gn z=eS?Vsm3O5J0qFI3-?U=!7?3lqPpuSoAG~l*!cvvq>j^jv>?|Q$HBU2(PLig(W>>b zAE`B`VQmMn^T~auw)IZ+pG|go{msw8)%E7cY=xoO9aO`CELN?x~WH# zPaqEh0wDn!`K~;!P9M7nI`&MBw@c`Zi|OnRCj32pH%N3gb~@cDiJC><5?~f4ZE8#C zlt-;i=AX&a3+`qYfcF`n9uZ(m!CH4{82Klc~|4Ir*B!}2GvqB(leRO znhY*oupBE<7UCMnvX%vKOA(kO2K32kZSx2*5oVu!FqUw0G}sv-?+Pc^*BukQWwXCF z+|*o00iji>g7|`A3C=exW@I-nV(I5tFuuu&^rHm!tM97C78lKXc6IuAX;?xGX z#jE?IH}1F|bW%pAW+M=wpc)17J8XnSvNoLGHq#m(6{=mlI{kF&rtc61R}NnC^qBYB z0{wh(JjNQn^nh7^H^$pl;5iCBt}M5cjNSIkneq3M?+^$sctWv=_ z6$J+t3npI;YEAOnWqXquP34{LF}UT(QpV0?)a70u-11y0Z7TtfNPu@PWvr6`Pma@) zZw9r|nje@v=<>mrHfzr;ynL2+9@|8z2nfA+uR9Xg$wA zMhK!=8rirnuHL%xm-l*CChoytj>57qWrnIbx=eMmsdf7SWaTph*<^&Dcb0zKW5p63 z3zT^@H4lNx(&=Yejf+sZqfXH)*{?~53qA9Eo3|tj+Q27HY0H%Vl(DM*&DwBhf_D}{ zPDRsHJ6<#uXC_r=)cm{;^FMhaVYeL;7M4OPdJ2S$hw-VKQ5tE8dm}!xtL(uiU#6dZ z!7qw+yI*v%KXRu|>O+5&b^XyFnHpskX8_L$)Qshg>5sLiQ^g1e7{cb}#(EZ`NY)XC z-aHC~l8w&6LH&yyY-=3a6z_Z-z#VNcOg-qtbnVO2{>W}fc7fXWgtDWY{;GqG{)8fZ z)}P#iC@n1_gE{|J9pz_#4#Va(YAY+YzmWO)9@ToXPT;U)*x6PNXLQm!T0VQhN?6X% zP(@f*RV8ehIjW|)o9(P915bfqU!zQBXf+=5{qGvmIm@ii2M5D?>sDjFU(Zt-)+cQf zrLD)qpLu{8zJmr2j3_qlwQh zV~1Xx>WI>!#XaG*CQW&JWzu{O%kW#$JP2ei%@JyawWK+AYNa%({ta*cwj3X%S)^qH z8M{JLEos>{E{S~Iw_|=-C*Jz@&pptqy{J~}i6~ve9<_~#JoS{;E%Vto^^>mUd`2f| z)9G8c8T0+g4ck*>TNP2+eRwdP{Om4(eLtPR);HCi4F*%)bON?eU^&}%N0Xe&P!7F~ z$*p6Hu4I=_?ci_nW@(b20V!(mq{E6Dyv0L_y+K}y!~dLcBFnrpOuEzE?*P@&&Sd(;R@og? z2Zq1(tvQan(?qJHl-S5N!k4dVVMiOPFE5$5HU8%A_KYq{ES}mrOygP@Ocx>FAyOvA z4d@<7<5$+;@&~L*C^uWucl{;IjwD&TU>^L`9a0ud0dDaevBne4VL^kH(P64UKD*Nj z{ruX9E+<=iDn3s)>bO4Wb`_J@KdVP_z9Gt^lHGqb-O8tiTOr>jl~3jTZ8Qm}hKiH4}%`0+g>!R2cK zT?SB5u-f8>wVR)%InIfZe~rIicTksw+H=g zw%~IQHu=vY<%QYpRDkuoKdGEuN**hOe7Lu)6JuMrOq#7cCdy-B!Ij}^IJCZmy&;Qu z*)6xJlRUUsV&*%TGDb-aE+9)SQLW;QO|Y+evT}oZrpM--`%RtuYUg)?bHAs*O)|Ep zPVt{<&izSpRQc}X{>HrulySdJk^ADvZ#B4ST2g}-sI{+{B{g{SR@n5L5;};deD=j< z`ms&S2&g+G++wz;k!AKalVzN}V(*#DE_-LI1M9w<+Ec9Mmef7P9k^l8$6V>um266+ zLC#SgmtOnZ2)%{b*S!*>%+GgOHb>vwBPJUcxyFum$OnL2U6kr^p~DlT zoFiiXBv#E_eiJt?a_j=RSdP=R72fZFK#t0AIX+2iNRC~R<5%fRZ0GsV^xspRsov1^ zv8gWhdol5*qfy%H~DTY z0#6mQe$73e@Cgolr~?;p2h&}RNE|gd&B~a1=zul6E7CRh^5t-UR!$73FDNQ57>K;JS`4nZe z2(w%$};96534~2352Q;d?ebpw|zapEzgd_PFCUT0G+WR}AxE1fDA};vJ z>I;h5_%=o~S;p>c*Yp^=0ciJF_N93t9H$RXuw=fIgUmTmwZ8a>SCg1=PrS*uozWi5 z1MJF+E6l(J8&=TR*l^kU+pGHt3nQTE$oF?@Bw|ro^SEWMCgy20M{kqmwHOZl#Qa)N z?P;=nwVj6D7#@I=TIlX4_Pt62v{qejXa0ijR-DntC|+Jf+f~()aC}9cwddfOf2lg`EInbBY3-sLwE2G^*DA-lXhhzeUr7+X@!x0C9zRmg8QxDHI5W=9jz)XRAp zb~12ta4oI8+1O2r+|-!#l1{Sb_N0X;lAbK}nz%fwjM+`?dZYSnPmqoP$U=(NErN~7 z=ohm6DmaA!u}QHuZN5)xb@pOT-_X9TqM5-2uu_3f;GOoocPRjEZkO7Ha-V`r4Le zL|snb9t@r{8`Et!Kw|B9VM{}yKz2MgV(1kv%_FXF9}pDokn0eAZ`TCa{}~MTQaSnK?~feM$(1R zVRpI`>O(Uy_kA3vy)^$CXZWm#?V@JNXO3Y}w?3a;BHun={i(V5#PWWy^Jd1wkzQsR zs0TXgk5GjY&b>WcV-O=EjkT zsor^uGo4RWGoId6&^cZIOV;tG6bl{~i^{XCl1vxTcR8h^+}8M-c%vV_b^fkU3!S(8iqZ#Z`!B<~H!{C}d$oX1EgTvQ=5?|XD zDb4r1VX!6q`Kr@_g0nFt;ID78de(=j*Ucjcmhr1>7iwlrKx$zy4vCiV9tvJ>^Jx|7 z`xrfIf{#_#qO_}vj67^)yfRWgT<2p&LfsvIG}+d|OY4P5^;8SJ1kb`~+{~~3%V^`z zX=LnLL4T&@N#~~f2oaaLm2~g9Q!HKNjdrkVd`!Ejc;Y~^`LARCjqN9GnNKWXa`7eq zPh*ZTP)okacjVX~^PfV9)NRr_*ql zu^+Eo-IkTqjcYj?Y_{smNl62z9Zrj*t;d10>ITQTD1G@8Z4{Ww4hErS=DHujaL{bM zoXB%~8j%B?$Uh(wf7n5qX44M&s-p#&Po1Zq;^bo$KC-vomY5ql*AW0u*Ik)f z(OzyYfN?zwKm`cHn)M-NvWkZebvN7C?>oaywBp9A_J+y$iHs5k7ZA(nSAoke|VX2sd-GdsdL046uuE znb&2y$j(NAE0h<#>1tc26v(QT*B5r1d6h`oAbymQ)a+~*^9UIjE&WeL?1vWz;GzA} zXT3y3qw4%+7SX7>#C|VkAHyJdEQc`$F)K)Sex-4)SvR&!fSJUxqk8wP`Nm}i*wRMMh|1%yeht9T>SCV9X zeHqOZbuBWujyhdpy1D;VCAoKrYDxa)Z21nNe&h@+A5Q#inVrd)VYLi)0wj)#G+!G_ zDEq9<-hyLbgQi(>eG%j?1CgW;^1OYu5jS7;1t2ur`V+;l^*0zE4zNq~aA=uNB*Uq( z@^vi1qvIrmm9&)=iQ{vi-pV)|iPF))7L@5$#B>MPJfrryOoWac6f)mjVH>0v zGx{&K?%ntqnw-9p=qjy|J`aksniBvO;9=Znx`5rmzHz_V#A#T zk;wKHAiS1q%*R5evX+-KHkyYfG2N|6uSZ`mafnTS(SWcx`LiH8+qTtQ~r5sX)Gw|%#IIpgP_QLN0*7A=IE@Lnv`*_(irCYQsupj zuk4*9#VrJIpCW5xBrVkkmMJ+_C6SXc?C|xu27KF;;(oBYirkg77pyLi-U^M+|8<&Y zP+gAeDE&Ty`HVLd$J44_Y=c1d#2u8ve!0$81DwKq=0$vEg#7KLCS=>)zeJ`Imai5q zKGhEWJykNFnere|`KmWmCZAf(4{!`M{q=nWD{~BGd?c8Fehkt8L)>k9(bf1UwEH^R zDP$~HMm}?z&}#T-u><-BwXq?R27M(U`&gZ2e1B!q#`oaowaB|4>@2QLA>dK6p4u zC5`%=g>mmTJ*-`e8nu^7^4&2C#m9_c$295$8}MsaksDaQM5C@0n*ZbZFuvWOeBl}7ggMr~UJhK;GDn{YCPU94TsA-lYaMh8joA;ZG3OF(?QA&%EU z4EKpe+&fg@?q}&5VRx&jdXI!=5JFQ!t_7QnYV0#p8xP=M?UECHgjIj-`EqpRI2^FY z1nd`o+>PkeroA7;9jN*$l1+J5%Ue^n|U=O=r>zrnv@4>-HLFCd3K z+;5RkzK8qoae-pYiyh1aE|4pif-+}H?QpR)f_KfnvyFPwL1SASx8XtNDmS$aQ4hvM zwl-)(AV1ps$B#C)@nf6b!r)L15Ztc{7R1IJlxBU2eLrk|=m4PfV{0HPZbd5I=_K&^ z+Lfx^d<)EZF!aR1mFo97)%WT-tRou=gf7}vs6#s%c4)Zc7g#$eylVc-C-^@XX?#wP1U;y&N+@J=yZIQO5Jmz%Rb)P@Euzl)HWqOYuR=z zTN^f`nu#0W4!E6`4JO#o5Il=WnejaiGWv$k5S~f2e5sn?5U`l56f{<=&Y4^9_WNhi z>>vC#8iDNy7?r1Xd>mJ`x)BM9%#RvE!{ES#zv7YMe*-N`*^Ata@t2Gu`z3{gIVxPX zl_C*Xq2`~IPTqda&@(h2Vn3+F(8rg?bb&eIlZP9aMjkL+8_vSqRkbv6D6`3D#CGsEbMkGbW)d30>~+hvE6 z8r{h|qzAYBrIayH8CND5y-FE>RG-$-poinM#M1Ae3{LxOt3qM6WBl4lukEV8k(c#t zqFsYq&WKBw%)V`f;x1?%v%l?pb#6MTU5H^`i@fEq+d|O%Iox!&*vD*^Fx|)eNpi_o zHQqrF#LY#x z+vVUW+RVeP>9JU505*rD+sr;G_>KzTFGeQfxQ}$hSi-xlq%8H47kF)^ z_(C;iC*?91s$3Y1A=`@=cU~pNbx=jgOOld7Z>NX=!v3#Wv#m8=6>1**Co=i9afRN7 z6z=gVo%k|9Bz@Ap!)JWFT^roDLd_Ya+*$~Y@A$dLfkC8XKKWk z6T;vuKxxL!fr`~@_Qlc<9MbILZod!Nl=|m03vj7pkckGOaPX`xB|4PH8gnG+8ZlXy z5nA*_KC3if-g$`z7_?$}$?ol-)vU6%a#)O_XA#NoKw^To^e#s9nM5_RTl?tu4W$(+ zn>a@&%M9|{i;@nqicHsSDd;<-yBFcgb%$4MLtAt};g+%2YwP-a%`vyC|Ke(F>|FC5 z2p))5ae&3oR|Vq@vEMe&lsG%yMKzja6FkUPr+3#BxWOUC8s~y|(Uj97JKT??AtmI4 zH0F(n#r=$Rtpa{Xo;svQd3Xp@7oKaUah&-XJ{-kWZda_b(qTR+N7JYuT~PtO^uk0y z%kVTy0-8g5?D4RlRbR8n+-j~U*9~!4<#MuH)5ix^X(H#9rPTDwMwm>&7Y?Uv-h8%So@@O*VOxf@Hho@ zy~TdmpBroHckIl=6g_m}VM1M~c+Qc;IQYl{5;S>812d9Cc;>idDvM^sHl>|OC<(4T zdqJYJU*WA<<0Z`z!!MB+>rF-r{i_Hc`(3sfqJ(`0&}B`$QAOcnt*{^2<6It{CtP;S@e2)tpZ^dMkr4=B;5NheKB<&=hZC7%e_2iFA|>m7mM9i zET;MfPG+=KhKs1~cU~?tUCgYwiD6Cm1Q#+VoMk;#_06qp*$R^f%QsihXc?~hB_iL~ z=(v_NM=z4+Bk9f?m&X*>Fj_zJrGG;QcI--ghm`+95aj9Gg>CkMj}a z*$OO28J1dE-$@l3uz!*4;wm?4y6eDvHwf4^F>A`rifoLqs>YqY$b>b&>}k@TWm++K zG&&+9<}%aYOBZN7C{67uy%Xk8Tym!o|9Sc}ru@@?XdJMZVg7tomW^Ghf-I%2GCe4x zYKp0rJOcwLZrHX8mho$t!u)w+3e?OpKWw6%Fu0cMX8&xemv-42iW;5=F4 z-C5OoDV;mm(i5LS*jJpPaT9$dPv$7By^BF=TjuU(Du-CCrt5wcYy9DNTVSs~)U)k+ zHQ#qecj-kUw?pWodOiOS?akuo&kJjp=}w1b5NDHU(PQ^O7__HdzRcP_xpgOwu1j96+i0X&S*#U}TZV&Tg zMksS%UtHD>lX(x9pdXScVaZRB2;*_X)(wkkE7TsqI)a^IT8%`Gu*&dp(XPUuUj-&~ zc|PKg-d=JKm?d3{wpKmpn0|(J?K~z zUgC8Dn@2A3nx)O7QY7Qq*_zWXHfaP&)#)?Tc73VKB2x;WRoDR5b77s6A!<(Cubx+ypWCFKqd6_W{s9pL;2%{GQmk41cPDW$A_i(Y$i1aJ zGmVfhROp#PEU=V(gRRIUiHzqbzz24%6wUHrB(T*reVf#w$C8P7W{1T>rDLkRRDOI9?k6ojo%VRj7szI} zk7OsR;@66E=ue~r)DacyUsO;=kank^MP_Pf?HOeFB89t8!a1>-wr_6u^$4e;OZi>~ ze&37M)=4^SxGaAz#C+Hhgxh$kt#5av=1=*0UWoLnHPkJx4CR)gD_OEs`DzekM}*)# z#x2DL#Az-J-&b;nx+p%==FS}kM@iMJt@R3W(ki52jbsx)D&c1T8S9x&w|+R_mz&(*9*xZe8jJDGxmKWVjWHy@6x#E(FCUJp?oc%QHy&>wf`QP7k8># ztfMI-QpHz+62|s(*nmJj!_>uXc2fOgwWN0lOQ9{mWV@*X=VjUGa!^2UKWewb<&8Wp zyeQ#Z{<;-y&Q@CdFJ9}LKJHe?bryn zTQ9P0r$!tHG+cYK9SVY1HnJXAY$7YrdGBmCV@2jr&^^~604*d69TEr~5+8@7KORZ( zz_|pGIOWHw;JI@kiF-<-ZvXhYO$v=l`F^R9lej0kYe)@nFb10NBV$0SxE%-3{7v*Rq^30;fLLhu~SjGW~@hsGX`C z#vj@-BNqpCCb2 ztg_o>JRbx=5clHi+?Pa z(Cz{TOuUtld4Hge#W_3?1il0!jBNFwblP7apJOh?2IZrcTgn{3^m+l@)J?|=0b=ii8)8om#Hq{(DB_PP?g*A6Urm(q{{=&ix? z(Kz_>B$w|fJ08Zn3ZNwYUT$}Zrcew!c)swcnR-#XqIVQ|x~<4xEl48Rv_(o0a6wVxfZ zV&uJd9|Me{UvG&Yj)@i5<-ouT#iqqV-)7*|WFD@Y@p0@|y%+f&&wxf=c{83Xh_A(5 ze}T}_Z*h3O%M4S)hf4g*xNn6V5FUmYWIpgY+!g^}u0tiWCVtO_tyryVMP=AA{R7Is z2V)_9JpwUG7x&ZyFcA^4Md0OsG#l1LKB42C6Ql4UjndOEFHdL034?slz zLi5=+KIM4}UEQSGv(ywuQay=?{8Xc|sdi*jZO%(YdpJMUdo~{D`ViUcF8(VJzYRLPeAA$%Z{eRsuLqz0XVndu=I#eY=071O$m=hJg20=q?{*7d*@_Ug;j2M}qto@oKLjcYtrJU%D?@;dqhu>a_D*POcD zO<$7{hVFy(V3WPh1;8#>>+dr1^E>EQ>C+@71nU<~?)VN#hr=lBK%^k2JZB-yNIl1f ziqxw>M85ngwehLK;}O|QehouVR(_=lhxS476e7svb)_wpR_Qij59XS)2I4;)%=I6olTjiyHw zN*qmOTCjwqW!iNjmAi}?J%1hr8QWuNfWfQPZQG)c|8iIz&)LYQhH>woq(nc(1`BhK z0!)<6=z0=_4Iwn$3zv&~NQUJ#U$FIuRAGVuF#$vV)%5a!7L5CWy2RWm;e0}D{O9aK za>n!M8AyWfG*KAnrjR%jVjYNcr&P(W5bv&H;(O7w!C6TzN-oAr(F5D{9sAy4QJpP9 z1$QcJM;0ewMf-$|r$w^x9gZ?uO2AxzP^}S$@@7;_OQwP=XF&JIDy*>m)sKS;Aaf9j zb4=&)3O48PG00D31wZc!;#eNac%EJ)rt2(Jc?@MI{B)2+pmQ%GK!h`bv(L9p`V~gn zCJtArA|hc}UkyYg`_X4iR&uGl>G`OXZ`~&>45TBua|-7-%o!hE!uJ~F5cdmpojjpL z!x;O$kk)X39L3U9;R%hTIvuG$Abr=h*1g0Q>2sav^mi^TsQm;NUp1)cmmzBRw{#tGJJt~q2<>_` z6XH7v6zC+h#t<5nCB*y2_g6w2N$7*cvb;U}IB7;H$`piCIC4~63Um})++;VNo70qLs~Bf? z$53{p%J-8W-_;+3R+r}>$W>IbESuenNX{7Dzbgd!kkkLf#Dm)oKGRUM5w*p&D zkf%Oj5#Yg)@T(-8UAO3?-0;;xoo=!}0l%-CY_X(cpS^vdsjS;)|D&7i59jo%HKv){ zAUd=cH&JP%it9lWO#nC4m1rg30SGPP#ocIKw)j`5uX#aJKMji7)NSlclo2xV--K|> z_rV~D8Kd;wpMFI)@&5ch>F)r?_FY{A$9D{sddBm_>B7PEg(d?SlkEG8H2oD^N1v6G zej{(kmsY-(3Gp2$6i530Izwn|mJoWPXNV9om)pOb{_t#+#oV;N2HRa_;gOxDPRW&8 zay~=u1teg_Q7)2u0BYIab^iiRHc_-+liWc%2R|QSpr}!x_~imA;6O|9HNJzD-&2bG zLX#mHR-%&((Rn#UE0m~4f#?lN^p{i=9PvNEI~|FqL8M>=S8w1j<^}=$JBYy0t}{Wx zUYyUBOoovj5V|_dJF{VeHB5e^O%7ma-PKkmTn%nd)O=0j-+z|v6k}*Yr?5tA#{U{K z{>?gamuv&EQb2nT2HFer$q`jIzGu~-HKdzd(xVWbl^bezbBo6HdH7R+&wdDhY+m@0 zE}icq+~2(g6@}4^Z{vL^Tf9gQ`guM|Lbn=rI?JblK&L8?&eLbws$Pi>WlRU&q2bA` z!_d4mzi`u>$p$uKhSddM-Ih{;%a$VJ^^Gl14aQ?*2TBtAAa^ACU8)bUYo~CY#xQ-O z6}neI=wg>guFw@z)@A(p^Kux!Ovyk>tL)xv$=m@lSdcYj>{Q2B4}575H{=L}WJSeq z&#Xe(GLJVnPuIG(^QoCblSXHM1$A>MnDV+h-YuEMXO_mEjEbiH0 z6Amap4iVz3`Z^mnk;u1L2Si@~H;dPC$Ra2)Lg%0T*`83iJ9qeLdg2UaPM)=Cw;- zk2J5}(bq%t75=833>Yx{LkySPEy~*vj0+ph9~+O;SaX!W{CXXMw^E3u%3rRb(IF0- z?~z4!ZyXIAzd=MtSn!{takuix|R!d}*mTpB=`a0PHNOz{1et5i!b9D$b7JRQi2ip+1pZf62Q4bNo6Kvb7f|L37JwyQYiCB{X$o(YELNj zym5N3>cVX{7LzBDg1ZV-&8Uy#6T||#5i+_V|V%nrG~`Y z-efo|C2VUIb1@}_;RcF~=fzWKE@l$LrS5;jn-l?AZ2?@<`OhBMh`@NaXx(lAwb+f0 zJ*6;QFULwhHb(IS7Ul18&X@B23>k58%y$_8vVm~U(G z?-4T{mH?!l^vT@|Y@bZN#iGB3-HN)RinQaUh$7RY z=Aew{%DF5^`Bj>-RER&j;UAde-?Q%NeO62;97~JBm>?$9WM4B$&2>J1R5yg1s z4eOIPrz_@x0oX_GV&mhWn|Ch+m7*)Rtb4lXs)yEXW>E5E?_;w21Ov=GjR9=_+h_Ln@o@G<=hzJS_f9j%;I>0 zpW|J&a`{T6HvBtczHQNGWbS38jFm2nBp=?AV5EynSLPi}`B~$$5oZe@G^qVrex5KLi`W28&fo5Bp zo@+@H```K$=-a@y1={&~Zh;DIV&9Uz7O1@60?~t@eL`*sO-s4T_m^@>8{b^3!?mlh zjmkqV)ZB#D6Hx+Jy&$az5@lVgipo8ESkK z<3)1Wb8MZU#-kRvGS&C)YeX_9YK1_NDH`rqkO>8xkPyp%$2GE|w`wKv9&D*DTK@x- zpyw6(8nG{njMW?BsOla)&B~)?qTC=MZMAMg6gvsalv|&xmC&Er2G(ko60J4~x(ZK$ z0?F=->=YqxW%3!CBMNB^RBF?9+oD401i^ul!v@5UrT(Avkm=lR!`*2}a5OqDtZg9! zFACJm*_F)Hcf9myv}eABTYLhey9ysZMT-W%qms;cj$jOUasR301=#l~Ean3w&>s4( z>3oSA*AMzzr6puT6BBJfB66v#@NGzL?IC_p2HTXC*xm~m``{|rn$UjeNG#{KL5H`> z$cUC&mm5-$d)kjp|0`lJ>>fm&1D2I?8TFrt1wJ16X)f} zwVff%Y>Kb=kcoYrujUqezDxT;(AEKk-7{EVcm*GKMFF%O)@8|}hjZmIZ{7m3Q$RMS zM}O+q27w9xW#HIZKQ zT(xD+h6r zkEWAVtmt|=OuMU}g&Y7!%D;~$V?RLF8PBnT-JRYFOc_{(*Of7S^~Ub%8-f2&cl9lj zuB#9ma2at21bq+tx!jCB{5_zvy|LZTc#35$m4^kezl}?&<;zI1E4eX!4C{^alrQkz zb7xp8o$*{FId-Q{meR842L4I<=m2X>)F_GSP7k%k^o@qP+%ynHlTLaj@Tj=({cAwl zS3m%rX)>Ind(sEbVcEs$eJF}TCuw@1gzZdkmQoe|W(MjJXqsTsq;Kl_?l3lVCk&h@JRL5I6rYeedrQ!1sKspgs!`oMS5S>NN&`@ zG|66L4b9HC&G-?eh?o1>ciNi@`nDJH>vzCm zS5JL=EYyH%nwFNn_+J|Qct7}30PJ2*t@KWQddPORvS$#)$^*vxKM(TZJFNP-; zOBt~l;4do$hc-wR2uo|C_j5fH*Tc#Pk@inwVJnlq5VX<%o<}hb1U52-oouG85Pp-a zC=}tB)81!kIl<__Q|I*%T`@whlElZ$u9^ri2-^tB7;R?QgeX?|IoX+AB z-o=Rj9pb@<34%b`!13{zpka01bFIt^d{+@meEdj?cH?TB8P6jEKp)-@pt9(0p1sO3H2SC!?)<+LvJLm1Apx@+t0kmo z>D!15AriG{QM#rU1A#;NhVu!C)}pFiG*_sgw(2&=1x2sRLjN%&BX<7Lz<}sCx@pra zOKB=Pr%-}Lw{!OZk+YvoMOdo*1$1oW_2DxtO8JWjWa^Z!MlxrA6>2Px%|}!l2<2Bl zQ+xvw+s3rMk4u&OPn7({F8Q}P@!+P9EcpjHhoEld%+DpSx1gSuL)vwI@VBW%vR2)F!LMH>qxZsH3h zUfeh1pOeCxi1bVj1TNN30XBG~4mWnKCnO5uzkF#E#Xn_#x0GY}fl?Fbb#!i#1A3AW zQyLKBJO&zkArhgsI42;Xzx$iKQuV(?>QO^IRbIe;fqi;XS{Zirh+~KCD*Pv;uRk>i z(J!Ldwk@flA%!+fp%g-(WN;+1rJ2;_c|HJFt2t2Nd*&GlHr4(7BvolC&quU>asRVK zQ;T6V*CXK9dH9b4Ux&_CwU>4B$2rFa`gNf>_dzLuVhREm46^3uY?24}JP1+C;(1=4 zj6xs`^q=7jfozdazhED!zMJx$W%6SWx(SKcgD9Qqkh^ppbmQ*y32v#9d8v;wwL>DF zW|+=y;vP-^x{Ou-r`F~!X$=^$#^0+|IgvTKRY6iYnD+TjA%k^4MDHF6!Y69#jOXh~ zj6wzf4FEJUo{uHuEezz`d1&!J5o`ytj5gTBINVtNiMGOl+d(JgyB%0&qOt&`m7)$g z8&yP4sHf?M`@Ud509kG$)4r;M=3*oTy>*2Y8}iE!knCJ+%-rU) zsuc%qpk15tq6GhVT9~T+4LCm)9DYbOaW10&2pX!Q5qA;dYVlDOx_-nUt%kM*Uql-| zx1steNQysv$?Q)~tTYNgjx66?a!l!>%VX_Veau;z1@5J<5aoL`Dw< z&eJF-`_K;iCAk`;#m?|Y`s?;NUs}-{t%hHNegaS8J7ONdhCc+UbwJm4z6ZTGj^<%< z6y(|rU?RV_ci^YX^SiV7Gvs0XOx~RFJPtfWUiY|AdjM}zvA>bK=boV4g&!L2g)u7r zN*#--@x_i3LWg6d^FW3rWL z)9~S1nU~L$%6y6+Rwgr6Dzp8stc>piyg`K-9r(j3wveAggtCw8JrKu{63Zt>a9FV9 z3eQa>CgKtN8U9!*rek>p0Bg1lsTXMTxZ}{A!hL2)4 zeKlE&g#JP@xwh^rh@wA^{tRUwzIFK~-I?$blrNNQ=cYhA`a9fbm@nY7{Ty z`32}o_~r!cuJXf`{zlY_Q%cWwnJp+Br==H;n3tzu4_)M<8nz4Z9(0I8rplt9 z{H5Ca38+j{DnHwb^j%l^;RBugsHx5OK#L`W|Kl&r>VBThHF3*KJ}J*?Dkt14K@<_* zmbKR(rv}ez#10Yy_HeJEF-B;tPisMapaVbB6R3sQV`5qjwAuKMK{Qy9jp~^oeH~%w zN7Ip)2rP_6IBf1GO+dVTCAFT#hDekp+Q;ZZ#QpP9T3w^-PX9tk@#z1JG7haGxD4U! zLild8glq27yOv3mlpRX$-jUe`LkV0bx343YaguO~|t(xH$r}B zZSkFG_6osJ(txp_S*nQS2cqGmYm}f2kQPPjehoJd$X})8Z+OTh|EJ?wo%Q#CoNk2Y z=JNatrSawxJa3F(!>+#(FUam+TkzI(6_Na1T?_EzUM4L?T)&xkEXG?R ze9bl0q;LmfCclXG7|O({F24I`43fL0Nj<%FJPU5Ft)2;IZQ%$R|H5VQZ(X;GX;QE5rlHWA;K45cxW5e%zEOT_5dHr~#1Bd^_;MDz0h;fH+ z$(Al)Nue=+BQd_aW#V@~MPtTui4ej4f8*Ftx)J5?G$Do~)3ew6(!tdvndaay-nx7&us;4Xx7Q2B;!P}?HQdp4IinTRCCU4uYB6DuJqlR&mOA(@e~{_L=12`$jA&pjf@-$Y zf4IT1bI3DCW4?lb@+Ke=3pF-g7K`cgjD_7_b!U=nZKZtO$izOQB z8WCpe85eJ!L?y7_nKV;{_lmAmJ9P*me}wkPc;bxgT$~2NE_T|^>h}@%mp=pSTAfb6 zT8y&MDX9jEowctfcj)n-isZj9@Sju|M@Z6xq?^DoDcuo>;)#weMR#uj30xxJ+BlZX zdk~Eo&-+I)MR)p2g~W#ECXEV_~dCF8jj z$h!wrbA1}4|Ce}!R_~VFrJK6WnUrtg10?T@6Gx4dpoYS2thKWZ^k?7vAE}~Y(yBBJ!!8Xya3!E3>JdInGo^QhmEmssfYB9v(Og z7D+(twlQfWK^w%RS2Z#RIa8S&HHxaHQ(LuOy5aD2* znMou2rIMFS&(Lmn2_e`M<$nSv5beJgKV6Nlf<(CyO8y|My{R3HZOctse@KmxtkA zjr4G#LSBH-L*%S(hY^n{Lf5@0Ul3~bFlIV%?gox@)r_b9Fa-8o?Ay3J2DMF}f2{Zj zGM*ho%~f=Aen|IO<0}Wg{e>oU(j7o#XXh~6lkxmWv!F@8uV%3eWqM6I*y`ueU()|R zhFN4Xo``0FB{>k)F)_ zQ^T(ZHmhWodHd|KTU1ZcN)3J~Fm)VPAS-l6bexRmTrI&-$Y63#aJ2;E8r?^zW%o$I zW*`h&HtWTJ^%O#%L^6ID31?eWONv^lMMSH78gwP8fNuNYAUFANK{H;r}$jah9=~J^LYx$4=U=|i&KCHekPx8k#vWE)A|MwnX7_vY_ilBZ`$F6cwjaY^2uCHb#mQt{Cwd5%kR zE2sI|JYNIBRQ%rv&9C^al7hU9WJzADBu_olaUNh_NDtTA(-<#v&)X z%2$Jdcdt;}nSP7EUFC0_fv|28gDHiy(~w}7>f1QQ4Cvc=ig}K{ zJ*=3G`gX8l&eyk2#jMe{|5eO6`liRv3(NKGPQ^S?-_|JRWPN)JhqqCd)b-C_2@xEd`;g;T2!1||TAf;cw2xWqya_6_m0CgN446jid zmCAaJwx-9U)cJEDz3SB8*)@n1IAJUX=Dy>`F`8)dKcQ| zyV?qJj`)wcjK{YKUk6*gD2)9Up|JZWP(m)dr|v={kK>jCYEWM{%y69lVu@wXaW8HY z^RK~lqCoV`l50)hiT$8Aw?DbLcfm8Bdyxtz1B<-=3=|Jv$xankA<**M zL&r;Bmj4MQcUjI2P}o-kOYY0`6hy!gxMz;HAUUXVPt_=IL1F?$;87SJuux$prH2Ak zaSg-S-?_zZ?CAOJA>>ElIRpI#TPrh9C2tYR z_s9^%JkD7wIXXq_FxZ`x6bx>3Ub@qGqdYgJ4qE%gw~_~>PM=;|fDN0C_v}7m?HBtb z4^5puD0Sh`+Jg5`tBo3UW9oF|vm>)D`Ivw0>Kj3|g^F_R>Wu);QScss3vx4t84ce( z79@Cj1?KUZ%C$2`9Z|F%V-RDZZjHa|bbqR{!rwJ;jepCof&Q+l0zc|>g@49FMQh)n zl<91|qv-D06>C4+uW0>4B6h0b$5}ZRLZ@cSzXlYoyVV5xQ+}_1K-~s^XWiAQiYidq zOfFS+4IIe(cTxi{xfhsg{4=&CE-VLBk+?vz#OIw-M;D+T+nvOjl@RgBbim?`SaIl@ zS^)~%aOvUuyrb%Nm?UVN1FLvQ@-KdTqBQo>?$L@-_5M(33``fUPV9GT>HyphILJl} z!i9<0k&DZizbd*^FIR57!@u^S1^$y7uPD0oC^9Am#-yr74Xi1^(unXXv-u=xucGx2 zQo65wxHU&7a9CqjKdGkk^U0g*)<0Ub?kbd;F1V+55AbKYFW-+df}*=Oul=kv`7eLw zAwM=EjC*wV>u8Ggk0zG+*M3ou4AqW%%HMSc*7$bBVP91i)OA(uU*I3tU9oP@J?MGP zra5@^&K%WwF~9WfyS0uut3QMHwR2ngvLd{t zsyU&Vl=W)!)OY8X6rYJxt5WevRjKBwwc}nxcTazS1R_D9(Xev(Vfsx3oYr;pmh` z+H!w5=4U*gd*f@vXbC5Wn1 zx>RBm!rnyKED2hUF7@p}{H!OosbwnnR6F|=t!t({OU?0WcNc+h58kmS3Mb}L1N^De zP+@++ta@V&dKmGpARv;105R9pqy~Sf=8|MmGu1wNLxbk7p>a`-XJFZsf0aThtpa$Yj>ei)1^`sgKAQ%C!tbB z>&AnTRjK&{C%;&|{!yBCPQq7}I(G7lm750PrK)q=hB-pn`1(8H6d#(UUi)4llYL&ZCCI!RDtEg$09CO9o~(&v-ueCfU6vv7#nb zJ+!8?Vkmy`b*hT#m1_pA+1-JTzS-Z2Mo94r5;Q`J-&Q~)q^dVU_JI3r1vCbDkD)`n z4Frg|h5#^gZ+NTWU12qy14p5qdoDrU(d(Xs87Mg;*P70ilfY9rvD23$7LCB^`F91B z&=0erZ)HQrfWZd$Xn@j#WVUwJAK0-y-$NkgPv@N~Xz2hZZ)~|C-(nXlJfJ{3EI-YB zuv#9uGAVs2(5$^-H{xUO)7N#WsFzzd7ou+ubP^{*a95@l!yk70OT5WtQ2I;cgU&Y` zOl=sBUIh2rBk9-o=Y7iPE>UmwNuhzU$1C^jH!yKvO=_;!kM45`dc-h#5&JvSL~DmR z*Q8Dv%TYcCb|1Q1;#gRetV&`Vb#A%~S#-WYB(Ad$ioKb&p4??PtKo;$bbbsyzO62G z@u&(~H1jLheiyazqqC+?tSY+wqtm)BJ`rLt`E2@F)~E9?r==1n4#H;3Y>An2P8}hh@gt8%J zTCVzRh*v`@O^B|8tu5y^3MY98ruIMf!=zb*#`AX;)+6-t!r#Cv$J0;aD9E}B*8%}? zT(4lKXJBXH48C<2P9qt%U{~QvMVq8(8AThfXk)Ty0Yw|3XybIodz7LL%c7m4Xa_6W zx5a=jJV4R*&!Uwm+5kmsQM7;4)74%01%6D~hAG;|jKH_b6zx4l+nq(roFa95L(!%x z+D=7#DU0^DqCKZ*$12)(MSCKP_M)P7E8202wnfn%$fE5~w0jioKt=n5qTQZFdqUA} zQnZ5=?bnL7F^l$?qWxUa{;ll2Qqg{tMY}-G+ZU!3?J2fkXW@E9yEKcoSkW$4v@MFZ zT+z6;!@oxg6M(2?hts77g$`PJxNmV!=wsEkmlwVd=NNQ%Bl!PrwPbf2Lh!aw5)|IZ zx9-B<;D>*R*rjN{RJ1BZ`yWO7sX=?B@MnOS`T6+WgiZ(N{rewjrtp|vO7xWPq+4a^ z%=}7+D?&zS$aoVXt1=kC7`-3i-UXU)nZyb7s^P#!CjEr48;dh9r}yY2kY?M9iGvVn zY@@pcg?Dn;$zMN`_bc4uQnc|>?X^k^0+i&g-2<=`$D|ia(r)NNk;(p4#h^VoG#e{=i zvpn3%l^ABS8A!X2>T?G;Ha+4>y4NW8IMsYm+LjxTEApD+1wp%8#G}mmw_QE}Q-gMNCOidqq{i z+e`=)Ps;aagu&@_C&J(|#C~7CbJ0`Bjk#9_5kJ?&socch(Znlk;^liw+^C7?nZ$NA zQ$}`O>O^)xeuJ+RXmB`=0UFv~7BYkbG$q!$g@S#HO`g-`Stie!@|-2l3VF_! zXO%qX%F{2;Q{`DJPx2#Eyg;4{<=G(5Me;mTo@dMRTzQ@+&-3NkB+sBcTjbd)&kN+) zCeMgGJLDOYXF{IK<+)Ox7s>Ntd45NpYvg&UJlDzdGI?&0=jHPJzC3>*&nx8lV|iXF z&!5WkYI*)#p4ZCr7xLUF&;OO@_42$yo;S+#W_jKs&)ejAhdlov&pYLLw>)p3lkid3pXro-fJsWqIzB=d1F3 zU7l~sGcC`z<@t_0-;?M2^88SqAIo!(JU^4?7xMf{o?pw;fmp~C?<3EF^4wRRgXB3_ zo(IVDKzR<8=fUzkRGx>)bC^7jl;_d%JVu^gd5)ClD0z;S=U91;m*)g|mdbOIJg3NW zsywI3bGkgs5P>|3tgHVFd4TP>EbSqDQzX)w0G!z=T=R1UE z5=sziB6I;Enm;|~6S|VnB0{$jswMO|q1lAqBQ%}RU}*N9QbMB%jUqIg(2<0i2@NH* zlF+_{en{vmT#MFvBcTroZ6lN>)I;cHLPM|y*Yhl)(S#l&R843zq4NmcO(;p|7D7KI z^uL5|A#^pNM+p6Z&`v_@2z^HAB0`7l2dIP4iG*4RH4-|PP=wGzLY;*Cgsvwvi_lg= zQwhCFXgr|<1_AOCI+4&}gccAwfKZswK7=kM^x0Q{{)fLfZ-L zgNby{BZS5hx{uIFg#JM2bV4^0Y9aIsLaPZ~N$5v}E+=#wp*4gaC$yZ z&>+mzd(I>@jL|pAsr2^nF5Qgf1m?I-!+>&Lw3E;=guWznD4|0zW9=DCXbK^RP%WW7p96{zdWX>W3B5|_ zRzlAcdXUhQgtilUn9!SqHWB)g&>e&hgYUcN213UZx|UECp&t`Eo6rVA9fZC^=tqPS zfRgdR(omVVIPQ(M1zW;xA#WtKLVh~}iRM;9gPoYu672{@#umrNIdh`1Sh6GGmFU4v zODq%!N<>R@TQnY0FdhmmivpbBEpBTIj&q9R&g`?NENQxEA+YCz)C6zSMN>ktn77

    xK1V&C6Jz-J%@+Brb7K$g^5FM64^Ogw2muZRyKsJShYO)34 zj*ub{vIseG;RrJAA1fObj7C7EdBQ2-coje?frJGTiCDNPnFz%z<5l72L^v7=#8#O) zxbGt;ESxaMX^e+rC6!A_=)3By0Cmw>13y}xjEF4 za2PYOxit`pgxV&C6QOn|6d`w$v5?b|YyyiyPP`)!Th>d+? zI&0*FGbSu@agu0SX;~$iPkzpXMZM$6ca(}fy)qUHtQt81NE#T7u86cn1HrlAVI|1v1q&7c@lx8arXr*N}y}DY2R^!mxs`rU|cfR z<}7jMq9LX8fc?$O;$BPJV0qnPF~N&YD1DT!X4wB zL^#nFa@xX?Wsci+HDJ28BpeAR&Il)3v!k`lTZ10v1>?NoxHl4&OqK`Q!Wb~CIzpw+ zyr|b5d0uomc4Mi1mJeg%IVj2#&~v#Lj0ft&OCuON7`v8P?I=onvb}y)90gls`0GXn zR_;AA-WrW1ObXNEY`PdaCEhyJ6YL+9xi5u-4fh*F9-YndzCK+Gww@Xjo*fPqjki;5(SVIE5a zFwT>zF`%)4f?-JmV-*!xI1*0;@SXQcnkcShfmrAtZ-i4kc~phBcnTg+4Ujych}X(Q z3}cF?T=I}PBfJf*2*Uq?z9l-zs{(3OH0c%LlPwZNf{;U34)una>1Cb<`86*^%QMhjH3Hy8s`OTBebC`ZW)oew=E zMh$4~$+))#Hhd^H0pv|TM86a*3rj2(QjP4|Po+-DIrWXR193YptC&X&Wq<_|2`-`< zR9-B0CN{#%iBH53jf83^)~k`3{q0Mo6gEbvt)(=l-<^eV6KK=XEJ~i{Ax3ftTHc6G z>Ufx>4hA%=Pd^1fBvLDd|@j@HrB&Ga;EGl&xP;ia_8q?NrU=9!}Nilrc zC?T)pOjU=5H@s&vpu8b3x(dw=)H~d=%9JIJYC!a?2&^joKNSU~a83H&+@Ro#MDr_B z3MuCr=2BM}WwFo&;Abd^iCL&Qz{)p86Rnbvg0gRowCrYxdzFoQ?NY`pg^)nk3ddW^ zup4AAlLy;=94+i2+Jp9P{x5~q=ZLH*^TJ$H>n(}7SaYj%XLgU`iV=J1>{-PBrfi{= ziC6&g%@ob#vG=m|KfsJ0qbb@DjkZ-rf(y-fEi?82GT?x#iC}`$5@-&AT{%rg4b`ry z76L>&Ua3QYuDs$L6Vr5Ka5qOgR=ENJ!+UIT#W-ry>`>|mprIK&f}?J4?P6sLD^Cf8 zj*?7B3*~BK+noZ-F|Gnl;!aozGze14E6PDhU79Um3xti(u{p4ip_Lud9a&OApoZmu z9_LJ)69r!)iTK32K=b^12Qp%^Gik5oHr%#t_D$W%^dyx)wl6LKhx%C0d6AK51lrSD zWqa4d{ot`7s=`Li6Cg;37h$J>0qY`x-zz^L~Ozm zcb*n^nnWa(#9ITCoj?n^oPt?u(f~PFqMKYqZ+j>az_cO236c;m_2%WfNQ4|4AP$Yy z94ajZf>SRr46;z1T2nNF+v=Rkqf5rUBj6v3kLyKn@Er7M(xY7-S8{{F9*p?NQohm~ z62d%2e@Y-mA|+<*=5fIpoGlxC1Q^)rYmfqB0%QaJ-%3e;(TKs~@mW=p%Y0{IG9H_V zkcmy0yrI|*l-`-{pVN|vFJTKh#gnG2bf__9Ix9i#?ST$w3HdX>Wp=Wq1@_4|Draf; zDt6B~(e`%uQrev+Nm?6PE1f1p5 zD^8x|WL-)kTSOB!Q_Er`_KE{jMe{;4#zGe+p|jgDa!d16qj!FNeS*Fv%=LqGMdnhW zKg2t)es(evge;*fH!?1p(b7=Di-`g3Bq6}`6qdOPT4iMa5(_2=)eL0jf2qn{aUY7% zA&1luOe8@$Xvk=WGAEE|)fDWqu&%_>&}`hOOsG5pElR~aYsC~USHju>g9#NT8cYtO z&l*r_#~4ppZuy8qJ>IvBYO#b?La#xaNO9pVa-tM63Tyv=}KU&Vm4vyJ!j5bZQ1(1ZjGj7xDD2yLBKc_Csc8T zI40{G8$!*k5t_y#uxmitI11tQ@dx6yG7k%3PJ)OK!sxf+G`YSJd97HO<11m%vT#R7 zC}=Z50L;W-5{}b3G#5n=!>|BmEqqcE#`yr=t3^-6^V}BojSG@ZFv<~lT4)uJa$n~{ zWFg3%eqlnps!?XV3~g(Ru86yF8XjjhBH7hnv>+CR+yhtLa5sUJjQ9dnCNQpIiDU-? z>O+yBCJd2R2w_c3NPV)YJsc;0tLXhff#I3!NYDhCADJ7D#S_X-#LNw^3!~~~>LLF7c$U_pbsm)vuu~ng#037&mptr+sivVM2OVgRaVEa<1I%{4*|H5(& zc&qA8aV9R3Ia1tN6^cWgCK3Ti%#!wKGJ;uU7(VrqNVF*i#)Sw4UL7qi*i*eFM_qy zi=hy(nVOo?+yHM_cVREu9kzHdOsz=|HAFouAf^+c&$*X4om3l4pxMMKm{vdw7zKeK zOufk;2}5Pr2zKJ`jZ+@SLy1y5%^{H{)reXeEuZOy;_Skl&x+0(S4124me}Yz$Lqj! zlx1(`1TYYsxB`wpXtbylU_~^x3?;*0inXmO%~9=Q4^q=%orPYz>|}g|w^1g*-;U32Qk^V~{Groc3~4&F(i=yRlJnap8>7Ct57Cyv6m;V7>zA;|0%; zhVvl~%@qj-VnOO4t3FsBuBY`M*|BV?)6R!G^VMz|p-qNP91C-RnURc{3I~y$!eJnH zppIZ;snZ@*(MJXAst_A!M%=+Y%u~^Vv5QU{e$ATCF@Rmj>qn2V< zKzxL^GQrujI%uNak;#swu|P01Qe~;AVrY$0Z)FptR#t_TI;ACJ$2qW(9r1&poxH`# zQqd*Z0F3Jj2mKO@gqT}bc!No&|o>Z zaTAIeA${68vv1*{YXBimy#^ZGPdO#MD9b+O><8QAXYnn6joYW$dd-BW(xae&+fN)4 z6>vqM7yLKa^s+*w;QuIGC6Gcg%@f-(mkqjuf)hXEugl4quJBTt%Q8K7fw?iNK^YM2 zfGE!phhE8OWOfoG$!GjMwiLxoMaFB%33(9h!P}UHv$=a-3lzG@s(>oY$MN~p(JebPM)*G#i4O5H;S?KSr zOLF7t8|yHgZWD{MO|+?_I-AC?QKzQ?#MBNYw)$0GqH(Kd=hu5J*t(*$8C!<1Gr-}L zu+3QzT@i{c!2X`dGA#CC@S4~;3mUx*MAH=0rZ$BWOPT{6bk8x2t2)>&)K?HU+6-;wPz5q;_)3(Pv$t87obEM??f^9C^%3wl~2y3qu@f`CqfvJtdx#8M-=T`iCRL|De=#@R4s9k!QUn1p@0ibbD`mpcDN!jSq7 zZp9dTivOZ7+KUTsgCy(`Mssvc91t#idge zJ_T?Ec?T>2S<53=)v9$u`P9lmu|imFqYr=+J8Y2QMj$vH%>2ttZm85Taf^r0Q^E-@r3B*9NPKjA5GvuMQ_)3q zZ<*O0fT^=}!gEF?q@e;Lx>_qUNVSzI*mDY5-_ETKwV^;Pg0TlzAX;)S8y(zUIf6Y2 z|Dzj2{CM5)k`gYph)12)PT&0mw)b)0g6vX2(~zxMp6!LN%he5MreoTFkkE`-6Rd5~ z2h~_2^T_u4jxhE%?p*<4`)7aXD?&|+!l4y&WeqVDtc7!!#tY{Kdx^@W!ldl*XDAg> zbA94-1K9cD>j=ec%6avK`XtQ9gDGP-8_o@fU{gxJr}mUrN!81$;=G=;)~o*x^B zw{kCtIZ;q}q1ax~a^q~X>*~K{t%J!E)@egQGwh9|&>o@|LQ;B53~pUy#4W+J%8kAj zkEspA{>I)Y3nwgcGk_l8@^$_mCJKjaxGm!X*VKe10XyG;FP9!8*%1NDQ+FBBrE1ps zIdZj}@sqvWfPi&(Y(l^iJ0!pC1jxbgwg)0fN$k2_gfNyYk{qoy5f}>LpdA|S`0ZUP z%+H`ZMJ&ne!CgJV90l88WHYW7s&`7ueJ%|zlugfNBb;!Y9&7Y-iUo1rvcE6s8ypvA zs+Vle>HF@W_=Yi(#e-fK9`rLJ z^P=p_UIsv~Xqc{)%ng*>S<3FKjKMxQwo}I3odZT5!J3(a4h=!)x*grVVvuup*X$J! z5$F(R4^IDBXJDraIttzVxd_HJW=1Q@!vRL8bS@GtU$+kZlsPZn`e5ca!65@zCCpb! zJx&Q=gitrSz7+_AXl#Ttw;!cBLG}PdXt`mkNVlk}MKeTI8N=z1Z8tE{u?r>ym$7a( z;-HE)!xaya%-lsOvl%gq#TbUu7J+b5eq*k(Qkl&fQpPn)nfCvOGI7%|rCZ~?IhBp4 z_#3>{XU?f!Ko5$yW}dfkK~-f#wReucdd_LyhMKzSh2ktK=O2~30I;qhAw}TI(hi){ zA)U6wU9T`UbD0MBCL^)XQmnIKYkFK;EEHP|*$0!48+^>Z4dr@_yZyNWZ(;&GnaY*Fd5R%i`oS^N?}P6#|{r} zej+m1L)(}j8ic)-W#B6~fUZCtxW~uwt`qbeT#LhM2M;zgd90Sv6BGQ`P z1JJ=<%!+dSj>a$lqs(z-7o3d!8j|!PtLxS(Wx90XY<2R~jWkLeoljdJ4#{g2r^JXl zgz~_wSjnKi*vYGKb~cUKa5H!rZKv0>lE+0f4qNFW!FYY1i#0EMJ2{EF*_)Fz#x1NZ zT@$hMZz_g`a5Z6xNcJ^qK?D>_J|_mF58ej!B+RaYwhhIikvfQXSN08(hV6lBO9(01 zxCl2U^Wr=OW7TS8nz)h^!gJ;sLZ`mh>?2#Od}QczOu%5Kphh^Nqw_Iz@0m_D5whp;g|`B7fph)uXR`q>=m?7_fG_KgWICfWsM!VAs~fD zPDGodIIOXxq58}Q{M6RWJFU8^24F*?xViYEWO3>Excz}Mp}sK^jMfDrn8(MEdgUr- z2{ejZs*1AX)J@qIZkmXHtV?NSX>b)_M=HiaE~Ut+RDKw^fqc}!m{(tyOiN>i z^V6`nY)Hn&Er;LCzSGfb^1$IG2)w+P*=X%$Ziq}e%^L@=DXJUKDvfcA0Wd+AOc`qoP7V^Xt7u--mso zzsZqXGS}1$kV5eWY5607bJNax9Q`hM5HAOt2xkXgaB^5<{(+b70uxo>-0?@;eQ?d~ zYn%aN7`E6%2yh-=cqL}Rp8-T{Oo4N8ei}E1z!Ll$!8A_*Se{Memo%o#H=+#kM<4*` zSQM{d{{cB=J_;|mFI;1e$ICd@jeiBsSASrc$7zXwW$Qv<3h14K`a3*X|AC<6k-6qI z)bAX={>Fw8@Zet>{|YwYQICJ}Hw1KWUe{?L;Une_2wlgG;b@w-7I|Yj{xZ%ih35z z1CYQ!`FjXY@=Ic#25_(h!W)Q~&k@aoirNF~jh3h>bZOFQaYD>3F%? z#`NHY+!1P@;HApO%s`nKa|wQ(YCK%NEx-%;CNV+0l-M){&ZOV7eLlLx8Sr)iuJe@I z;rqEx!AQKgb(o45(w3MC0EgqB{GEX(IU+Iay(A)ktMD9xe-d*U0GApogR{jN^IHHT z@K64>;ptL)5-%>bxAEdq`xGxOwf#|Amm0aq!pdJQUdZ1#ex1d5kfrih;7q>*chA9u zlF71)ZkT46&p?GFo76i~2BRu5U(Ov1$jzE%Sh~caVi-I2Sc#e;L^acKcss&4#7jla z&<5b=P~u@?d9ATWi_4I}o-zhL=*hCS#Fv?K&vFDgCo-p07GD>f>^k}!ScY((=~9-p z@5>PDmTL}=<3+5E!*+j zJuY#YYiO@(v!^W@!>X5ibX}Tc_9`0*rjlnI0=8w{W@Bq(F@X!(5pbl><%yE zC|fZf{%z@Uc|_UiWF%;ZcS+cA8BnM!8LNZPmQ}ndIMgt|g}l%O!g!hZQaG|@1En$1 z&A`vuWN6SL93>bnX9{T>2p^3$4JKRIQVY3&jV9bbD6f@Zaxkoudq!d{-vw z;mzf+YC^^5fo@HNPmIBEy!t|TNgJZD7=eJop?|PG^LWNN&}J9@Y&5O}fWsf#YeJP6 z(4iHe8k*CJStU*z#p+?v+h%Bph1(%_m%5Shnh4^v&6%ANlyTV}E+ceGbB!cM%c?!}Uwx}^Zie-*&7sO1gR#_qw zVwv>HR1Tt4S4`k^(w+qOWoYI67W-;P6lyaY4l1;q4S`H;YoqJhj#*?P@)mj*)r=!^ z7Zp=`%z51HDwVtpA}-Tj^j=g6J|7&J%HjvZpxPY5X|SARz(YraLo9;pPx5fphwzQ4 zy7T}~%^VaJx;7kWtB0z^96Fzz$-19n-7ck{P_6mj`m@=o*DBI*^(d(V*b@o7`JQg4s1c z4BcM$iL``pQUgkc?V|Mww$Yn9Y(X;HTEh zDAk1_+uAZAv!wKZWKF_hPrUbsnh2NJ1wn!QQ5Em&lLiqbhy)G*@C zkYr$lrgzwRFxjCa-sop`W7H*{fcO>-Bmvr$D09GCEC-osK-N#Mxyz1_GQ0Rp^f|53 zF!hCOs5YK*6w$RI%*d5uvlKbzq$z~VA`D!M_M!fcV(wC-WrS^&U1Z{ha%CeIHPMpp zW&wEzH^k_*Yv;l!Ei?K;&g3Xd5wlU=r-77y2=@5=NL7d%{&=1MIUA^EX(UQ>O}2rd zM$*wL85weTwjLG@%ro(+LPT+9mQ!ZP_}sf4^5VDxnKRFWylTcyT$y>JW72zCpA14j zS{#}jC@Pa_gXCS~07KvGDlord7Z^TT{L_=+L>X*FSO}=2iIk3j6?!_@kq7&tbP%@i ze|ySW(_mT%_d6E0+yR6RmDN&VHxH8Tg(=OI#YIK!47)5~4Q&KAh<6>x`PWT2xL!+- zoyk&+6g_9g3S*N_`7&rv2oP9_uI&iZ5egb@3fdS)atN%3hh*J+ess)x`;L^S1Vd|J2Cj z1@?;fbMc6<$ru)}0;qZI@-_|oy4}_6~9`9~u zD}zLkc~Q_Bc*q3%TMU2eSK(?I49;jW-iG~MR8GVzxq+rkK5V)#scC z+L*eZlU&*j(U?m><{UE1%tl(x*EfVm6+j_mlx|tV9>M`%a?i*ZovA&FdG+Qs3tX?q zg5s(e!t#rWBE={bD`&>E@beF8x{^YyP3W$8Yj*nuEiG-w+zk(+hfL>ohmK5e;YzS~ zozz5(yyxsqd5dzO?dSD5;h$f;92yY+eeO_U5DN4EvG*=;R!`mk_~$d18iXW-aMU1# z=_NPpyxknm6%Zr&h` zBDKR&D&l96>b6<_V3#zb6l&37YUwbk9g-skXu%F=4NRgD*5H}6bAbGbLDY%L(BI6( zXdw~o8Kl$nQ)q;Bp^=V=qK1x!fV9Vez6ND7E6-xth&fnN5#2h!G0CCSF&$PVc^+bp zvN6j$+~=D9pGrpeY7DE(=BW-1ap>8vnf2&sXIPyn2_zIL&{oI9%ZWEb&|q2QFv%?I z$t#iaQqw?vD+Z-N+eaq{M^4faX1LyxV;jY$n5fzfH7Ta;G|3XV8jff6CazFZf%~YOL@J^oXbIjhrXHSVnI>5#sZ_(Hfk8V->nXCr8fp~= z(u}8~lDk!Ycpt8F+?_FK8SJS3qUPi_|FV8Y;5zY*rkaGpDazMs6;z;=Opr;drw+)!_y@ zXq6TsY(C6p2EVhi!slj?pU8fyVN>Y^ywD~zDg`P7?Z3t2DrwCvVj)qO!I`v0&a4$u zOH8FSnOiQZQ9MqjGU2w2&M=)Aq~SnS1MLGx?WQ-s*(iCmW%!&X7BJehZFsp88wUBnG9;9`Z7%*@sfuXdQR9`{L6Z=X`eqwYhk6`k}z z55lO-3TP3XW*w%*z}%agAhl<0Nd>J|PQn~iZNq~YDICr!<)2E6Qp7jXOiGIo(KhMS zjfQLTPy{Jqb6MI#KA^3jXS{r#y_yJa^Nu=RR=rNxp}rc62y9{0Kt3A0NUDN^g(jE5C#uHA18OONNU0Q5}D!eDYhhw3<{|LkDNjkg2w! zH1zNdRPFo2r8H-~k}7<#K6< zU(6op&~tW9XSiQt^%REAt+ocFFm6#Ox4hKL9fIZE z&bTax3~^{at0#vjuadT5=F&%oI#_2hD-gNC={!Ir{bpk_`C)Y(9hPq9KRiP*?^^R~ z-GtyyLyScZOAGrZwq>ZellA$%&IzESgI=^;@4v_J@>dXtY^p(n+HWScNHBAE|W5$c#1{3ou|hWc+g;SORGVYa7iH- zl$gMNMSUPC#|!Z$iIL{Q8ZEE8QzmKuk&GtI6jBQ)->m9M;&_jegxB0@Ns0s5aZ^jC zanme=-;|exhYTyqOuDq3$tQGJOqC4JM9r(-)F@Te$wL(LwiA_;NjRO{!`YX9r4DtO z7Cpn`H(LFPyd6W&6nQO%JvWk{Q%y%sMN|?Rs_^0*w@Fy6q=d^72cB}sM9$pk`eTkf z;WE=#!OD^x27e(jcO}%~bIOO)?2aDA8;{0-9)>BYBrjnf!9AUFtM5rtt2D`U)AUq? zL$V?=n0c5~N6WpmEv%#x$)sdUrQwmEyi83tH)Rv%@br*gPtZ9!0Z5BH;G)fc)HayG zqMmw*F{G^hI^_-2O}v72;h82^ay?IrMs{W)drQ>d?mZo;_^v{Gu?-2#Zz|E96TZu*ocu|`inSEZ|fEMoQ^*cHbl3t0Y z77NpdP?KTCk0sg%52O-7qe5j#OLSB+=CBniE_%31(<7Q~#C`{zO+YOmy-C4)6=@Ub zWb#QKen}fDPD1<03aYt)sG-p3aa2Gw|KhV^LNQZ7dI&x|h-b+Jjdd!dJRhgpNi{5+ ze|jmDw&+J9)PlhikaU_%@fILiRUqkzlIayxBgnPUHKX~UQ6BI5Vl+>=a`}ZqvT-;X zW9XUn!)b8G4LWZ<94xD26i9X~s;G?{a_O{TMwKJ4#DpG>%bWC63_MZAPx)ZCCo#$U z*`T4WFZ_Z$*R#+aZy=_|A09>`W8hFI?TDmvK~H7;kD#Wl)j=(lpzJV}28{yHQ!C!4 zppWe_A*Qhk4FS2sGwu>?H%!#FxV>$>x+bC|RvD^StMp%rx z=js~Mhx2HeLNPk7@yv>?@l+`n=>tadrg6~_;f+px_2kKw!Qs>baJ!{zB9cDJqG{Rb zjxEao9#(Lb4|R!c&8*Ond)gx}^Rt_f}STu{{UG7|I6a%u@^a6*sm=xIuQ#10hm&IGLp zQNfS5D0vJtm-i-q9J+L3QYz zXJdeHc#3^84WDWLKaoyLu9p&wR4O^B6|bP7g*j4*T77-Qta*%hZJHl@(rN%r`%QO1 zk(pI)TH%Soh5q3s5_LFbW@sUPL&L(*OVxsxEYq-Cnl$o6vzX6Ad5rz&$+ylps7COn zu82iyT}7ZaH}sCqB$G@tqSoaa^xQlMlrajar=b!0Hv`4og$BCQD`>|F)fUn-72~%$ zHY64x>u3;Xwj+sa(!@s24Tvz2#I4)FsYrO?B$S4*hqDW-H<8~?tfPaU>-p7G%A|Ub z+=Z-3eQy~pQAV#-nGsVi9TYi>Y=t2o*XcHI(YJAK+REq9+=+h3kyl>K^Xj_O>5%Ej z9k#JfSHJ;$b`=N}pKRc;#1Y*9_W)51j_uy2NkYvr-??LpJ`;dOx7b{zBQn`Gfk$Mq zj}|bshRhr3RA@e;xKuxRjA<%731lq6sg^BZ{KQZuy9N;|9%?AVZ{-8QD>%lf&G^8) zU(XH_8dQmHTA2~InPJA9Jb7@6X#1N^iD}@^uYU20&_G_NGpiJ#m-=~|x#{BQtrQ+) z@E&;bUt7)rBf3>ObdLk_iW((bg39umN5oZx8*Ea zg4MHh)=OMTvE%OT?3EFQ^O&CA%ZxazevENrS)1wPxPi7ZX}*XbdMX||S)(o3C<-Mb z#&1z^5WN3FjSSD)=?zlCg&)j^qanU-2_pZbxs?1W0i8Zizo})8NRGnNewhdij{->n z<`ML?lul9XMISl}UmkIVCB&k)Jj)`K1^PG{f~};Y2_pj;j%m#3pvO9A_;6Dq^xK!b zfG+!^Sbc3Zo&7pl3>z|D=;sG)K9&q9<YM4w`(Q-1~+9t?ohEvh6zs;LKIA=N`1nV%KzB<#D#!{oQ-WiOo=+)mT zjb_oUQ|eSWq2EY0-?-X$GvC-NyM>~qpO=lO>fI0!GKlxz_)Oz6%_6_tEFHF-4o$>+^a-Fo+Rrbj8zJ1+&)QR>@Yq=bfE@){Q_ zDh-=mzqZj5imi>r&KjpI(rnWxugdTd*uXy(4iD@R~b?HBAZCINywosfpLl6+Ne~pgW!%;$4Cb$6O<_}Y7$C& zXGl6?fsHZDBrqy%u%eZ)Fqh39a*)y(jg>lTul~lc$Q>1K5&gagcfzK4*`p&X4?E9< z^G4Q`(D<5g)c%eRPCEH~%`#;s(_}_}?TLybGWZ0FHKItlM5niHdri~ZPg^7QMKWlg z{+WIIIs+pdE9@Brp=4?ia5d=Dn;P(p=(JDZ#8;4>P%BqK465H@M(8feqr*284;3Bo zp;n|<|1uLLF;qrr7}%#bnNAz?GV&n$a8Rerl&P%ih~rY-GtU*N%fj*9YSHj{TxOu9 zz7tCH1kQV;YleGr!Wt>tgQDdW#5^e2a3ktT$j`WWKo>}rpJ05_T4>myy}7AQp)=T` zhJz}?umsh$u82h6T&Aap=??ISi#e(E;?~`;+KHr@1(PFHGfI_fRLv zEpd}w*Kyswc1v-IKWfR=B&UTArddRQ0{ZOzFNVtfzv(2Jg(oFBiw>bvYKXoRaGWkD zCppK_SwXo(&wqjBM1TF-an=yMvxn>SJSEBb+vBb?ljt?iyH44uNe-R$L#M;+>z1X6 z?nhD`_a{2WWqx}nxs?+9(k@Q&iMu-OKH0-*m)g;3H*_z@E$!r_JV9r;ywurAT~7xA zUA?d4-o3BmJeBUaZ>2lVM@KsDrlXvc(~ovi$M$sGDRe&1AICfHhXb9Imrit?mrtg{ zc}{VXj-eBr7G*hZzicO^A)E3s%t=1wbSLTS(;cVBaK{}u+(}+Wv}L%H)OQ3Oax~IO z8935$nhTwzgU+JUW+pi9fppN)e&;&L&F4DKz^N41R5}}`%1NG9?Kr>IIButDjm5uBQWdZgx_e zZg!IQpaXA?yVY?YzST)ezs+&$Z=+MJ?sAgm-sPlhC0c#A)9%Fw9QV{^PST2Hj+^qJ zliKni<#D-_vOAs6v-%OI-9=A0DIK45k{X|MQr>;ian63mNxGlTg<8AHN$Rqi4*Yq} zN&e(HI)Uj0Cw1csPEtQQ)99i#PVzTv9B1lFPST?E=6 zh+OnjqKC9|otyV_-Ou-P+r3Gr^*k1EQ+^A$&H>%rq-(ml?jzmYln&ip=kX)me-eyO*cv}+&N`LmDf&gkc+oZ8<_{jR_3oI1)) zZOC_>d1Kw=_Gh}zDdSvs%sAJn81E+UKEZXKDRPsGid|>VQrA7N)J<7d>N>v%sme@p zQy-q>x=&7Wo$-_1)CPu%Jzcf8GYk`}qC>9@PiVRyMn=iKEwWA1j79=_X6 zo!sm?|7dpG)!*m3i|=!jejyrI;wCjLaZ}5dx^B}_H|eXTuJh;vl+R_Z^X785{isJ> z=jg}Wq`Jr4)L|>!An};lp$-}FR!^NeP4G|Uw_?A>aoss7p!xgf;U~a`c1OM-(C01 zw_WG0ciq%e-*c0{f8TY^{m6B@e(a`R_pzJu+Q+WjD=DVP4kbr0X@CSS0T%K01Do&SxS@)*&Vh;AjCw8>4S_G}b2Gv*vCrta*~jytoX z+p$CYv?gkHsCh7lMKxXe$6tI=8zk4DJvv^Rl)Zbqyi3|&)$Z!lYf`S|=E|Wa#>u76 zURMcz3N!gqyxbXFJ$=syj!*J3R}37tv3-G~=1;B|II5CPC*Tf@gQIHXqyl$Z99(D0 ze>!jn#lf9Kxc!0Slg!LzrLQyCUiLi{;co^mWUtd>+jl}Gz6Oql26DyF*MSBXZ~DOXCEOFh#Y^8f!ZrIy-(12i@}X}T z;jZwZZv){j_MvYF;c9&7OQ#m39JtVteKG8pOSpXC;@P>La3=znZ9N{9u5aA#9dncT$!_q&ke{4(NxQ2;t)#T8a|oYyv*2l{A(!fpQSX-# z;zr>4j7M`R9=Dv14fMGfxITQiA76@#k?s^q>%3-3$3{Vi@iEfTm+&XtBX}>r0^Aq5?e7U|Ie82dMSGlntHq&QU;BL^sTN9atW8?Ltj1NPW7R05#f&Up>GZ0dic<{nQ;61(ASy# za4#SFP9of2E5yzLvZcASTyV?fQAW7mfb(jf7rvRq3;vIy$)Qw@=c+7 z^0E(oJqfqMhrR;BJ?ul@9Kzl1LtiuD7W&Y)j&PR(7l8d^wS(ITcYzOmT~i#V(ntDo z2shb>zDmN4@u6=4;qrXwTSd52eCXRqxD$ZeY}>_WJE(rSC)FWysh`K_H@O{LgZlF` z;GuG`@aZJycJR_Cq#m7P<1v3=Tr+*10*=qjHkYO&0=JF?TYTWQ5$>=jCEh&I79MA0 zUy^bS`3bkbT`AAQf$MGO-x`lFp4-8ZD@89Yr^%)1jFo@Fk9%71@%s5@P6u#a{RP`; z9pO#@E?#@Hjc`W*7eF#Y<%E0I*Ol^ch!1@^gxlSRzDmNS0+(sW>(d`K`~kLoW0eQR zvE>=DZ>x>B%7e>~{qfFc1>Zn6GMAR0rJwDyj6NHm6a3kN4*OArUvj^^Z;RjxY}{$$ zZ>*2|<*WoaPAB)vRlv~_pE9rTTGe@=v&d zz}4C~%+ndSfpBwyi|4;P2v-AKy{#|8PU%#ZtAL9;KO@|Iz{Q=P5$;+a`W6vxwhw)4 z2shD(zRiRi?n7T^YLEH>7q4EQM7Zw21#J7_p39?*a0mL(cNO7w@u6=8;auQ)+41_U z*FQfm{`MT%#9ZocmVdH8=hEk*HG=okE_1!UW0cdMIQo~7c;L%|Urc#3R~-B& z1i1fI!MEx6Vze6_$j>WZ6Fi@yZ!Xmz(f{-%+-l&yO|fv6T}-(We)?OYH{QJbD#Dcl zH^qm&R}ud9zl&aa+!UQ&D;-=un+ZRDgW!A8cXMg}EPF7X`yMu69 zz_nSAvFyR=(&wd3XivofVfKi}7;_f5K0q zHZewH(RydE8?#?@rBC|5 z#m{v4D5QsV(#5zO`m_hG3p4rB_~g#ahbrm&Z@-JaCE$l}G5mZHVXC3G+Qvt;Pisi_ z1aN!!s6X2XzhH-?qs@E}<3z5PJb!x)IC_jLm*&f|Bja-k)8$Xmdx+gW#K6xXe0%3l z^E|0dIa~H%{mTfS3w)dQBnJKy!ao4~Y$QKq?=zy;@e}#MCg{1q))P?<><6c~lAlBE z{Kse?>j{5cvf$&jW9$b#fYatbln!u^(%INr`=zpcQLS^&6r*x&aAE?)g%e;?-~eeCafKH}|3xB)(J1%x{U zIIsG{e$VrX4!|v^dvmEDThE6Q)wf3Id6@DXrN?S-wZ8q;N&JPjKE=hee{p>~ytClj z>@Pt*V!h4u84O&T{8;@`jQa3ZR*d>^5A>}`A?0+XJ$!A#`p}c|)N6l9Z=(rCf7GrR zH*vlS2)7V8{!K)4DK4UZ&mmkZaARzo&vDo<2>%|Hc~m?e<#StCN&mxke3l)xd=5BB z@Od^K`Oxyo0`6eD++*n7K)NyxPONta;R=B}+twQ+e_TEnA0m3+vC|tP9peapSU~V? z_7g>nJ9xcu0dQk|*qPgrr@M*XN9}Zsh#nWQoi`Hxr0#+@o6I(^KeoM1c#~@#CJ;nM=6$edwzv z+)Kc9kE3r9;aY%;x6aLN>;u4cjH7Qe;cfu#KV7FyC%xSEHzE99apK7#*(~7hvT+gX zCY2=n8MsIT?X8KfKeP05{oyubb{`4%yAOZl{wk-R;N$J{Y$n`L;0`mXp+B0xi2iRK z;qrXowh?YPaEIFZaBs?=Y^nMo>eGm z(6@+ijXrQ|2satHcoVzL&`V*CYH3KK*~<5Q%RuirZZ3|5pFO^?eR~vWE&jUi-oRUkF?uqm=%r z-iZ3Xj@UImaN7ts-v_QM`OD%2xJ35T@I!3-S@zKOgw)Zmn3_eTn@#+b;A47qQ*Di4Tk&yt$>E!lfKj7M|&&FsM3kVZF9#0$x+^s3Z;LF3FjNd`{TgHn$XC?4=#`h%5mqmiVjdk;-`Yk&!ejMS4 z7Ym+VWs*zrG5m+ykBudQPxj#tJimIfLh$kYVI$#I0vFF8I*^YqPJru*Y(%U#&ZDt< zoA+8KL(dlA)BbTm^msIey{@A851u0Vc`QNsC91cVSBaiB?<2&pdoHE1yhiZ!>YrR% zPF6a-;$=T&+hk7@JvmSl@{fr1ES41kmnc5gTTh?SwW625n@iIdv97;}1a|-zcRohA z%YpNnk0r|ISqR@|UnJJ8*#9}7R{=LFfn6ETd3&%<@|o!Q4&$5Yb4P>Vk5AA(C(6&& zGeyr8q|;n#--!7j=VuFWZPqhl_!Z~pky*%(o&Ol?6P%yBXAAyUlL-2w>9G7TokSbx zQ+}S{B#u2_hrVXQ-3?s#IQrHR?sgygwh``1ANqJ5?NT55atK%NLtiD~s(t8NK)CV11>)p) z72(DJ7jK-tk#IwR)A}CrFX-p;=s-T*+lRisgzN4@-#EhU3EVV09|_j+IX&EOWFq{T z9^tuO=Fms&`hbm#(VlSo^Bwd)kl_6`wU@n5gX87&XW!;pY(G=^F*_XTR_=!VkVl@K@UUt$NSt|AaovZxQ@u^xa&V{uuZU)ULF@Rq*|( z4n^UueGRPtByO)33BIG99?L#l-j#&^;SRxHEZW2Ee8f880>Yhkr{LP`JF)a~I(Qy^ z*kZwdMBmM&`HX?zMwqwm68uOzpO#%X-RXq+@o$3P59;mu#p%c;+^4{GPLK}P%kAUy z&7!y2)*I3Pa{GAlJ%W44hu#f@f9BrAdUp`+`1=I6oW7gO!)~13o>az9E){&deuVcw z-UD1fw1&$W_a^^@yWNLAe$H^E4}I$hcL{JbHkV8Dlb}7~^5gnmkMQhM=F;$1|8L5h z0BH}1J=%<)V)zl)_ldyMRy4U(KW)199XHVDIpB5r6v87s>)k=0 zJAu0w{1DDcFXMSUw9hihUz_n$jCPmDL(_fYIo($g{(a!v?5B-bA6Y@T{U4Nc1nhL< zp7nh~xV?aj=btI$>wh8Mc>OAmhqn5_@p$M9;Iuyp*)<}4T;JaS?i4#8KK=7`gr}2J z6Esv32^McxrEydxZ||Ksl8&<=Q)Jm^>N9MpZC$15&pF&1W!lR$ff#Yln47~@=C!! zM!sM!4?NqW17R+GTJZ7KIr*GbFXLAc ze*Ck7Uk-Sv9>i!bHWU6+;5XZN%imZ(kJoQ`PV_%$+uJHnwqGvc_kCXQ@#=X!;o1Wi z&yN=o?w>7*^{pY?M&RP<+f2Ciz{P8?I;S|!v%m#xJK>)5dlKQE@S(4aaLqpST}8M> zKJ@W^{40FuTXeE?#-eAzW`C`kD#X z-G{z)gxk}HzHNkaeCX>+ZP;e`f4uzW5bjgp;^nuJaIgB%w}5a@`_Q+FaQFJqw~=r+ z`_R{c_Sjzn+|%&$PQK$m`m*&W4yrQvEU2R-<;wDzl`v8FAAQ&n@jb_@XJpKum$)!TYrps zMhC+5eo6Fu%`@0P`Vy`aaB;^Ygc}H)uki?{@nwm>CB@_}Jg>C+e=eU@gl~FH@ON@p zzSJI;y*b_NUw^$W_;`NJ{`DPj@%)un$U$_TgGhdv&U-2+@a|6f748-NRNp83*z z%bj_@=o7+S=|f)%jZ zzey50>_-vnbvYy(0z2q)&yc^xXm{!fpSn)!*>o!TIUOcM$#~;Qg#`^rZIT#Py=z4}Kis7Xj~5S(qzMKCdGD)D5D)Kj5K!Mm+!F z^^o&```yM__U3ZjNch3;de|>QFV8n;0JoCDm`l@Z^#|O(a{Knzd!o0Ee_82ZU*ap` z`T1aacGTwi`O)vgzNDM4v@J!^&(E!Pp7Xbcuya3@aPj8JJl~uT++jvL{n7kItT%Ng zpKS7hJBe^td*Ps;(^uwG-&KTL=%p{BoK_I-M&R1iH>;dX`4hh2qr~>%=R<|S#j_7T zA1Y3OWB(XOxbeWf3VVd?ZTSb|dA|88@F}+cS@?9qbNlw%$C9r$&*LN7g^h&!1Gp-( zg}Joct@eh~(V6CBCw?w^=}6;fyp@i=B;|f|LaX2}0Y0t!glNBwF&^ak=F%@D+((Ee zWFISCoL_$bJO4|;54G_T{=x5m*8%sQjkD6hdQ)gVw*Nmw?+hCcJ2I{(;mUy<>w#nY z6%g(w;CRevt~mCdOZeK2694CbhwNb4oAs|C{Gne7J{j#q2yfYq@jTz$_O;-jN{}AT zXJ?vsp1(=(UioC)NrZakF3o2|d6W_EZQ#~YTB2}Pd&cQqK=>(JB>p!2m}L)6 z#~Q--+$#7hMSHkii`XZ#nQ+$vH_pakpN`2t4ennAF5AXo++gxgxX*yQ*v3WpO&Q?^ z{3Pk~nh&tPs|Z&NT)gqm3c`&7F5Yq)roK5zwu zJJ3hGa|pMK4}HyqbA9MrN4PC0k9hgmM!0W)n`q}Z!MKq9llyW__bNMl4FAj}%#BEY z9~&Q0Pk3Co7&xB8m`m%ERj;|+n(33iP5f%Epkw;|I+8U47qoE^?*(il*=peE=MCi2 z_#^hQb)`0B18_InxETF!F5yr7MbbIm#v}inA6{3f0WO}u^18|d-~zTj+_OGjR~ZXj zy!q^A!VLm0-h7tly+n_jv(8ud8 zOMT#Y-Q@-!IG&fB?*qs4lF7i$u*);TKRVEO{)u){E^YiS!Y+LYm)u@(@y1VlF4Z>Z zi)Uv(m+CX%;?*~vm+XOf{p@%Cgz(3uNjmB0T;$Snj^RHY$Z2NoBKUae?Mt|c!0l@L zMTDKk5iZAvKAx8x>jSrpa9w~q+KxA(95)c|Kp*;c5H8h+zH}PTrzOzG?LaQ!eull< zjK8gROOwBo`m;dVAL78BK)Zq-4w?Zv5HtsL1ZW}XM9@mm>7b3ESAZ@6y#sU!=%b*k zKwk!35Bd@4M$jKYw}U4ADf#FCx-Vz|^eE82pr?Qi1sx4K4s;S|4d`spxuDm8E(E-Ufo=f(40IFd&!9U%+x;c^=?HoNXgcVzpaVd&KyyLIf);~L0j&qU0CYa+ z^`MJD?*&~B`ZVYo&^JLp0R0klGw83N@=J5HFUgS(qBH2hpgll)gPsIB1T+uyY|t{$ zD$tpr7lU2}dK2hk(ECAGfIbVl7W8e;ElJ|<1lkq! zaL^3UfuK2{BR~s5CxTXjP6urSy#jOr=pCR-KpzEN1^P1RdeDzRH-i2Mx*aqL3uzrd z_XQ1r9tGML^c2vcprb*@fldOg0i6x1t!gSZ0_K8NfPRdL??%w?LK9&L*#inX;zfV} z=p%ZdgpMbGQ+yt9#Xj+7b0g{KxJ(q;`dix3V3n>`P^Z1z2S77Hi$NPf7lXEdwt_lo z2oIVGS`69r$6L5o2p7jzyNzAVPV&2msXe>T1qxUD|%O{+!2Vo)#r zLlM#XSL93PTA@o1l6n;yuKV~FTsGKbw~a7y?n_44dKOXigGgXEe{K? zji8FZZFY17n!e@0ZME=sSa`L6%?^pE5mfa%9{#%=xRwNXwa-@IoIfNUFa5)i-^Ixi zaVx0eU$N4!bzJ@hlBCZ>*{ivQdL-vZovpZG@lja0sxKyCejgQE+& zRqqc$y#dVxEe34_HOlFa=BF4BNSi=4K6G;mcY5JlD{vk00KyBe`tzQa{4|1k;n&jG zp096tQ#)Oud5^iH-zkNB8{`LpuSDgYQYAc1J)$m^?+^K2QPQyfqahEi#{s9|`$3N6 zgtVyqWXSgjN#u*lb0POiUq0l+J;L7wIZe5vF4cc8aY^c-wMbVhehU_%EzQh{%GkS>QZ?H?6X^xG#vjq2=7(?#gGs32!A)^UjDHP z@v~g51kLCqwS#e_!t= z>GSfRKOpxipItgg_+vcMe>~*ce=1DvQw;efDzNgm5%NhM^5=G!_`USMzK6(Hc!d8E z2QD1tA>Y5Fg!l5_LlVdjgFN(H%F165^3fjguY~*x4|z5YzPZ*z{s-izdB_KMlKgqq zuhSv#<`MoD$i4LU+*|YqJi-r$+^hd9gxsrr8V7l3yoh+zzixzlvPb-XBnaQ1A70Sq z)qW0vTu|XiH2z_bd$pfuB#;k>d`MWe`KJ08K{OW7Sz0&_1$4qe5*Uj0``$i32c1ms@rPd~`L>d#4#dyU_QLhe;RMkfeA z0dg<3<1wul{2LU_2#QziIUgM*GLGCqvZr@$(Cx63<(ERV3K)!ndc}K{-%0C@)uljj9)8py7bOTk1#&O@)+PvleuDTfhTNuXOz?$!Tqg4`?re?son ze|9}QzJ2;Y?v=h0$dB~OUxM&YK|b0ee1{_>eO~n^9dfVn=i!ih`R8$vd$sQ;L+(}n z!xF?_+(XjuHGZsv+^c@gg50Zqo)5WK`#nE_{%auj8von|xmW$TCqewrB#8fc$i3Q! zR};wpoX5=QAMpvVS4uUgcYwK>wr! z@`?oVO31zZvleo%^qmj6SN*v@f&PV%d->n}kbCuS4@2%%e$OV5zmY)y+mL(J@2?>D z^6wuY_nII43AvYjcR5Nt%WHgi4CG$n2SDz%ew7coSNWd>xmWoHA@{P+Ovt_J$9a%v zgsYDEruAnTB+=FHaz!4*7f!|NIMb zFaPg!O#Ju*kRR%yKMV5HJmm9^6a8M}-$jsn`Tvm_65eb6lLh${kN6*i+-rXS9ORQc z!av(v;_vAp{~q!qJmh=#k?@Ck$WMSg-9tVBad&T8gj4x=TykO;y(>?ul38NkbC*hGmszSk^gTY z_v)X1fxOHk{Mk5gS*#ESY5y}GafgRUUQ+Hge+mu| zx!3r$0&=x~`F(R=YcK;-3pqyOyuRD zD?!s96n-P<6433SLmv|PLeNd110ELse9#X-HNBcnO-J5x!LL0+=uEu_?ed85%RyIy zW8rB^eg~>t%biI{I4wiuYv!*g>MCaBGP{_(&@ksmjiz|_*7Kgd}tj}ewbJ{a;-E%{2wheJNhlD9y9j)$Dv zQO?IMDV!qO=MUNg^f=IyL9;*$K}$g|1ic)z8FVS=TrvjdN9PrzP*1eJ6sLoA*5A>^EE= zN4Asv7l57xS_Z27Ya4KXDX8A7JvCjL4lQ>rXDwGPM=dv{EwF=@gX&Q`>%H1h?WXq{ ze{!SbM=940zO+A;JF0K=g~yyfq5QRdS9$VK(K8k8i}H^J|5b}W0sLL9dUJ&b|8elu zeyaaN5B#s-H(UAxsAn53{vhz}bXJ0Ir}K6X{wnZo`@H3W&xc(u0DT{{3(}`_0`6ym zJ`Vab=$`P0{uWjJmxF&G;#K@R;P0^Pvl;xOE&X)hhPie*L*iBa`+|R`g+BrOS}Q#x!9NIk zG(FYeUp6FK|2*&m6g$s_)?=KY`44EjK{D>QKY(2G+tZS_LazC15>47vt%1L!u;-$D0mFZm9D4gx(L^#8WKx5qV2s83q2IvykSN$XYX zv2uR{aPyCod$0O=lT|;-1aU8}pFDNhXSn2B`ZaG8neW73dZ}m{&FS7jm9q>=E@V|ne0>0LV4#Pyx5DR}C_}An{`}bh* z&$003;GbaOF95&X!ruk{F&6$w@M|pm`{1v&^7{k$uR@R7XZO=3U-ww}?%>a~^bY~Q z!Aj3K@UOP;7lJ>|!rut~-4=c&_>WuoH^G0@!v6^V^;Y^*;1Bm%`8@*s(=GicgWnx` z)IP=FuSC4+57WU9konA7@;y?I)c>li_9G2)^|zUpyd&i5Uv~S|1#9P_t$E6k@~9dBVLO8TR@kBz6$yw=&zv3yGr-~Xg|=iL90O*fGz@k1oS!3PeFeM z-ETM1n+`e{bU5fl&??Z2L9YW{0=gPh`-d9JJ73Lc&$V4&o*{lKQd$q_6Ma9lU;O^z z-v2@Wz~ykq2+608=jY{03hepQg5kn{9(b*PmyQtr8y5cy@ISWrr;Zf-x8Q62z8(C3 zS^OWsPaY}hRQw^MM33G7{E`p;Y0>y`;M?P|2Jm}Y@m{WYtG&4s{2MI%bKw7A;ok*6 zK*{0~EJpp&@zZry`%n(Krsr`>UIV$t|C}Y~@e#*!#_p2;v7kC$nvVPXK$n5Cf96rR za{BPK8vdkywZ4C}KV}Y)`{#gLf_t48>|8GqJMLUB5kLIjyk5dN{A{%3Q`AHZCDmWyOes7=+$)WjeF(V&rKBPHUD_Q>R;CK zVefG+&L2Oza7Rgu`dp!3fdsPcHFB)*|FH1KohAJJU`N%{e75lI=Nx~6-`~QIK1cAk zqaV?7x)*%gZYARc-woxX^QTSYg+D$|@^u32`aAefS^6s{2!5^Q2aVv{{nx8Sg1;Gf zjdvUH6TsK!5bc3qZQ=I={~-&16!_=D&Z>VP_}h_w)ju5k)2#k?JotxM`K<&0Q|Q{(Z6Z_?dK?skZXQz`FzMVf3~~{a?Q_aC_nb*H2N%rT+?4- z$#wl<6Z*}+Ko8hM{NXUrzM#3F<)Brd*Mr^%`rlfA2v8pQ(*9fPZN|w`U$x#ApBi0% z(=z3LXaB7&q}Xw1|1I|T-`s!ieBL3x&VTLod6n4f^UAl^=asL|BQE%V{JbO9xQIR2 z9&czm|6h*JI34Mjmuml~=@OICD!~T9gU%FuGs>D6{NZ;4UsybHdzUxzFc zK3CHo_y|Y-_D4FJa--vm#6*7YLN^@qtyVm5BL2^;cB%RS3EfB}4IkmiUyZ-xaR2c$ zawy_iiFUUy^0^)9dIkJ*ACh=_0E@#K8iuhm1Z>Q~C~bfwQn6C~eizZ=&I!hY^_?(4$uHA3*(uN|;X_|;>g z`BT6@$->WnL-0>q`$azh|1m4yz26f2cSxtko4Q{3*I4=&fnNwc+P?h!w&0J$I+^mD z-w}RCj2l(|FW~>nig(bvf}adOP`lj+{sF*i{W|77!GDYND83f_Ss2&pxU1}a!6#XI z{`P_J+ZTzQ+g&Vl-iN|}V!Yg|{^vdt{(InSdUD}M_Bbv1Gr^yEc62#T`&9U6Aivtq zTn7G4;H%y41OE~WzZ(4cNRQgT75whVm#%mI6Z`;0&o$=*)ISYxuP3%buIcX#`)K{# z1i7X+*0_b&A6f&*Kj@#Jx}S8HLq)FlU99^ft$RIxPVvWD@{@6&1v(mZ3g{J}i$R|S zRei7H{zK4jLAQhM*G3<2l+VxL?~eYWH~3{6Id$}VozR~N{^#J20bl*`*RKWt8uXtD{Mnm? ze-V)$_y|Y-UW;~f{+Q@|Mq(nrH_{Ea_xy>xR8J%?-gj;1ldb#(ew0vN>Af52T|4&w zF1@NJUK%51oL-JGr9{fR3ii$Tr=aZdQMccOZ;y}a{t&)b{vJpEW}fLUf1EC!H`(Kz zyMC2;nvh=glT(nc$H3R|)SgJ!vlhPx_^(?0LEvw&_-BLPNYTgg6U|@8LjU>OjdVR! zDt3PucE1zn$waXv@7v_Dv!BK&p0&w`$>+Y3J(`saiH;_kxV2K?>d ze~xqSZv$V)`?C%d{Dsh?{GSgJ{x3+6rt|89g}*=M!y0cvK=^jOXo6iYqP)eb$8W-K zw)(VdBk74%KB|YrzAmryxaUc^_)8s0lCE#T{{ejU_hYj~Pe<@|e0&1@&!cbNkC}>={Rh-a^m@(2GEqfIbHLCg>-iKZ5=Rx^EBBmkw(0 zZyo@C4yf1u%O*-2U$tm&wB5;=Amt`f$7v~+`v&0FmdL%f?}eD}sy{7(A6!HVVzu8h zwEdnK9goImQ;vsoeEwv~x5o1q;+bl#3*3L2)VoFs6RVxp_&b*RkAH8{wR4{-8G){y z`&7ga|2OYb;T+n}bxq;ZAN#qk^0htqZ|^gGqC)I#?=#i--h;dW?XRY%5chLIMGMVC zaBhd5*P-}%)NI6RujX6hvBJsm+YL_FzVxx@2Zdv#U9#snFPtTOd%tM6@xr(B|0($P zd&)CQ1b-0haX0e)7x?yj%Kgd&|7E#YM*IE2lZ9{Z19$~|yL{g*7rgB+4^I*P5Tr-- z|5+(~`+5I9Q-yCo*FUmK`1bti4e;&f_vh6Jewmf8L#7Ge9v_}qFZ{m)ul>tgb;4g| z>G=x$eJp$`^rTw&1HliFPq3v2VBDbbJ&1B*uj2kH6LQu6q9x~X1+NFy9xdf|3Ft$h zPlNuqo*%P6^R)u?KVejW4=SSTMPQ2Db9jEf_pG)4SqZz?>uS|A#O@EAE&1Dk z{GW;+EdLk$Ny}*|_+It*38Z^H(!+U)cX4`oJ<6UpWlWcJ+3RpmgTMC_Nw2Q&wt!!a zb)nCZj~U3{6y#6mUkA+;{TEyOhrqY}_ORK4p8&kt<5k!r*W!N;zP=Bn`0e1^?58nZQ$GM_M=iNzc zXu6Jo9_9bchNH_~PdMi?;hzG$J}24Z3gO%92}gr(zn6C&`1X5w)2KD?% z*L_fm9{|3+Z)^nkI$u?M75Mgie=hhJpd1z74E`kW)vulg|8b;W%l9Mj7Xh#9Ge3ZT z2K-j_{{j9Fu(Rsl_XgO(vd>ZACsjrJZ8rD;@Kyhr;P7NV!5DR}h_=T4K zN5C(&@UMYiYvDfw{{jpD8~6dL8y)B~AMKyo*Iuu!vD(L!xnd7)t+;)g3Ay^$A(p%x za`h*B-&--{>OXe-+z7e)i@l!F1i6-XKP&!)ke>|uXIk>bkZXCKZpoKGuH|R1w=9QT z%gdIpgj~zVmh-rY%R&2(D~=KSJ_`CGsJ*YxUO)K}xTIqxd@sl)&R|C`q}c>l}J^Tx#I|G)nJjlP$nHP~zX{=PMS56p^gA2qyEZWq~4p01Mm zpw9(g!g$agzaM)e#x;1(spHVVO~SX=CvFAb9&hflQ1G4czORmVj=x#>*C0JQp2`DX z`*X#Yfp3ooXM_Jb^yv8RR`B;8Df!j$-GktNY~fdfzY%Z&te0>eSR{w5sM$4A-jiUzA8rvp z^QuSRLr?LX`1Qvmj{a~x;{CUKS4%wVZ^Pi{r-HBZuou9$>(|k@NxJO$<@?~@g?!9F zK2E@ z*RJ;ne**NYeGUNsNa#`gG2p9TYx++H->&cZ;BU6_TL=EG)5JcS-^;<*^%>Q_RP~=8 zjei0BwMeJp-vhs=rGE?f&sg|m*ln!F z=05T33xKoRoixa=^N?>!(C%!9T+72gZ*VK*YX5mwyVeo$tG(^{Qy0k9zV`ep0J+-J zo*(sqT*awhmUf$IG0Mcn@ix?6A2+Xplg^c>JBpqGQ* z3aay=CQ2V)DRV@RwpVMd_NwMWDd+aUEo=<8iyU&}bP2Ei-0?oCr_IxZuj7H~;P0GA ziCv8G>Ceu2l-T2c^E`@cL|^nPx?Zj2ulG`G=zRnH9)il}k$}fAI*w8PE~t+)FOvGW zcCJvB+m!3warAlHs+Ykf60`k#1=Al8zCFHJ5B^`!qwC-=EE9Z}S}9NE=RYX?42!=J zeA_NxJtFu$8bpuww+B8d{CRc4*Y;+g$ArHd_!@6D_}jo&Jx4q)_!0Hd`u_(0dP`5g zrvyJ4?*r+$WCD#6F5|1V01mSNwb69}B$N;memr z&t~Y?@_POi;p;iX%3t%U@CRD)p8vY=t6>L?_Z{&6h4iSNZtDc!9(diS_}$yWUxoDO zzQ#}95x)I?;N%U$ABFVj^OzUGUu@Z--MfM>1zyuLAAEcK`^tNQ*YS(uKLFl-Uh)(8 z!!3KJLQf(1YX1Ylx6iFU5&RP^J?DU*W$Bp)zCDh<4t#qYeINJ%YHN7@Iuzq1&F5Rz zI4Kiy&6jcqp!T@(zcruE zAY1XJzYn7QP>*@h{m{b8<-RZasmv?n-m5=59yrmS_%HWoe6H|AGsM2y&K~)`)T_6^ z*ZS}k`1W}zT|N-JeQwFRkA!dUqsjYN`1U&03UPehO1E)4oq_;Znd zZ5K8Hf3uaZKf(VRd~F{OhMpI|*LJ)Y_yMvVTdo-O<0s(kd0ZjnnjU-q4c8ymlRQAm zVPDW}&|FZSckpvLE;qjNQQlha+pmlszYMrK`o0nO7g5+)3x!^yl?#;p=*<@)f6ij)#%+@Em^!;!*qt#BZOAsW|0xn;PrVe8-Z-;*CRoG++Ar zR{Fb7`a4xO1E;@drQ_MBz}Mfc(%+-f-`_S)k;9h^X;-9!r87%sa1RVgH z2O0#e0i6YUA?Veh3qkdFL>|Yz{{Ga^Y-4Kaae>Y(m?#~9D2CBcuaUJgO1APs2 z3#k6CiH>iyAJN}w(*B?Z^-1g1ow$Dl^li{DLG_&W0cS{h$AA`t>hD45dolX^4f;C; z`ukVSmq35dK!3+U&zaZXA<%R2KZL%Gpj$!p z_ad~t)%`j;&ed^bD%PP720aW^$8UPxgq|ZY9P%R2AgG=Lq5C`ZcQy3)1N8Zgp0lp! zrRsSQdJgIEkz$`x&1J!-VdcN#C;C~LP=eFwem#%rDPtWPP4)>3PZUFrP^jA#@0sl_WCqebR)Sq#$=lJTmy*iH3{lybTi+(+aLeG2E_bc`NNgWsI zcuLRL(D{b`{!nec=+pNe^;|kV*F)bMyc+$m{(gdhDGr;a<--(eu9ae5~ssZwB22s^^aB zIb3?afu4J$=OyVmIl7IcJYB~)?@ZDA zDCirYUxEGxs_$d#Ic24V5>C(iYQp{fpsPSb`_gg$JLs-BS5D8J8;<+YpjU$41iB3L zCD3)Ct)RPM-|nHHr-16dT0Q?m_u=Y3V%;~a=Va;r>5mZpJ5W8ZYM*l?-+I1MZ`>ab zIs&vBRL^I+9rt=J(JQ#ubBF$o`+diW{$oKiLG_%KvAEZBX7oIjo4~&Z^aap&LH_~z zZ_o~U-U{e(p!!~#z8|LNs@w&+o+q;g_j-=Zm$?5KRL`l=b8q_M+?q2$Cxb2qT@9Lv zb2^Ga^}LYFaIfct=y@K=#bU41Ky{r`&jG0hU(Yezh69pdt%>gX}Jr`8ZW6<*v^t=T`(3wdIsn?&~l*Vp~C`hI}!@7H~~XI4u3NB0eU~E?pI!i`}LsjgMJM9IjHVa(tSWn zt0X?%|DgLpbbo{H11YN(oIanv6!-c(TK84x^KE?&{wZ+ZfbLQwdb)$^^BCP{q34U$ zK(5bqpO_}$^m&p#ztHpJwn47XiS)UUJ_j0v=Mm+g`g}sqS6dDKW>DRKqtAKtIY(ct zSL^z(?t{{GY+YB@^>KaPq0f_4$B42h!&k`W#80-yB&l`Pb(my8lg|D_sD& z?jO_V1&@Hg7W6YveU72ey$)*-{aK*rfL;Q62dF*=(&rtAOqX!Sf}RGd&rdGK{mr1a zgX(jpb-35(TDtD1>yEnKs_Tln&Z_H=zt52P_naxT7ibCSMW8o;-VXWzsQy0ltGL(o zrk`=2I!p9+2JHuWBB(x3*WWkR-#_;Hefd~xPO*69SO<+I`%idjOZ=@Hs?Nd$_*SHA zrc=*F;xnH4veT_N zn;$UfaQ-uJuXv?)IOS_P^AN5Wv>dbsbS7vc=zLJsqx$XpF2JcC)vNIqL$3NY9gW~? zJWaS?2)Y<_38==e@o75Lt^wdQUQI_a_!=*McF(B+U(?lydreOd+-rOqzs4JY+~zkW zX#a*D5naEbrVZ(m?hm)Nr{Gp5h&O=WXUs^@PG(xalh-C;V3b2&BlKxKw(+g_UA+*0 zdF*`6N4)EyPurbPIDA>0867@=cH72nI!SOU*LKLp4b6?#*J8E5ieEk?8W-@ut%bg! zNSC&Usz>S2;nDh(Z_`%b7JB4U@jXUF>+?$A65uu^NMGSd(O0bfq()@Xg+9+sZh^k# z3G`+9JWtfI&ReyT6}laO^FBXF5O1S(F6dg1{&^E{Js|fQA7ohPaC();THt0vpO?QZ zvCe1o%n!~j45i;AA49G44Yi(x42LgGz;(g6!K+?&#QAmwutGC``d{YR0 zt40+uSA%xX%YK1+OP`1RW+L7ek9Jh!?_%wr;PFJxZ5rydLRS zT;Vm*`jl_et%$b=^yPWzT?~DSv-Rlx!fT`By$thCm2bDkL2HkU#&5#Cj@vShik44< zzV#Mg^>6avtG>*h(fU5p^kLl41yuFrS@$76zSLOqEzma~{Kb}B!`oET*J9zj&6fFm z4~#=Ht?`JhNAFeNOyD zZG9~kz8?A%muC63@@=Z=%e3&fa z(u$AH8k;?OaB=@Z`Qd+AI+v}Xf&84avh#Dbg(M%Jif0F4eqj;RjE9b2EP~^lECVRm}uAL6O&noWnKPvHfg(Kd0 zltv+$K66l{k;AgENyd8Wj51Q#L)g*sbBeEy$Xr%&y7>JO90S!&Q|HLRxe%$$BcsT! z=~4W8$`C5b9yMJGPop|XwX&wim_fyRWvorD=|Z(CKn0skkz|peW8`1llU%+ria+MB zh1GCE!}=I&^TJa5+vx1Zc4?!tC|TrX=I>zoHkeXRX^!N{J^#f6+`Tf3Mo^F%XVkQg zP553}QCd=8QC*c&QI-`ft)3bjR9as#JvgGezG4zYj*UIDqO!6eSUa_%s-!*!a`5zE zReeEiN$I&2Rg*_IROMDz*9@;N3p$NyMiYH6smv>>3RXr52N>a*)wSo=)s&P5M+Zx1 zl~x8v)&y%!0-Z)q^T@2zvx~BG2j%A%rE_K~gSGWebl%D-^AZGl6o zt4K#)TfwlYC6g)D3*&^%tF4|~8?37vR#nERe+X-OpoDa#4gmDX0&u;MdV1?9EmtAvS>53*fO^^B^@Y6i5%$xf7!V<;M1QrTc!+H$MH;S@n>!&I_2 zRi-!*5O8p1P;e`+Kz7`w{W6Qr%@3C5R7|Gw%^y0bm(w`^`iQ);keb=5x=GcwQ-@X6 zG}I5OCu2=)phmf5s!354WMo5qTg?7e3v_01;@FDd3@Veal9~>HaPZKAv+@QPRgj_9 z--3*Au@)6oPn=R(L`^hRLaMa&vx=r?NHZ^z;M5x8m6nv2bM^WmspW(K2Q#5WHr+Tp zHL^cy&KNUDASDgdECeg5jtBFqt1I&w>dFauQA7%irm1z4^Mh4o+FR7?< znhvC>N90r6T3Q>d59ZfX50zC}T}nQ*J<^AYit1QYR9b#+(d34bTFNzdT+A*D*4Ear z-lDP!>ZR&S%ZsLx>Y{1HE1OkWMv#VyMH8tFH?=3M^&oCR(FH{HdYso0`Q&1wD5jFC z`iiO`RUfiweMPX2o3vOR)1cbg5|XU_M+|S|_Scgi2w4I8j#7Qvxff^QV%e zrns?&a%nmA;F+aC(;SnQ82XJ1QgscMQ0K8VPU|wPYC5&?9Fx=76bFY!4!QM#j7)!P z9K|CVDl4f`h>?ep6Q@vLL{66W?25(9lb?O+S^B%U#eKFVX<-aFijwecdf|vhsA4L6 zLsN|KRPGcuPD&$34%AA8RG>!k7$~w-ZjGoKrtqT20-C$+KO{9h*0j25WlPe~6;Cy- ze70#N-LGs(9{McZt!P?JfAv2*e)bTmG*l_7>ZLW#t}Lmm8y%b!tPNI`l20wXS>tV? zc`rH6x!FVVYE@o0sA|^GYVM+17a^;hk7!JGLoF$*=lnWN2a_~6pGP6FY6aK7bH^0$ zK!OId;W3_xSorACn`F&m+L9zQ^rg}=14c9Ubef!L%ahDND7Sht->sCp{9s9KX?b2r zeff~;S{<8EWgJ$OQ_YpVjzH%oA>x-y)D`#etGAn4I12GpW zlbR}%sKv^tq1LO2!ZT`#GV2;9mQ|OAqhD?bs!V@HMPT!huojCS8OhpY>L>>_)R$M+ zR?If7N;Wk?)YMS|*0+%jo*68q4)V;3`trQmis@t&>RlQ7K^y3h+MpBzOQ^5Sra4S@ zb z9AYsr;Urd9RZ%qv-5X6y+MtZ0(`u_5YC=f1&hpqmt{fp8N6!rOE);5|9SQ}@8e1S6 z8?3FEG%KVeY{|7LU8qE}M+EC<&_s$9mzI}Itl;sBU^qG%LXiu3VowX!52-AfEZ&ns zW2OJY+;M@q6EM-tW!H$tIi6@AdoR892MS=G@mgXU^1}ot;V3 z&ElBU^z@-2SsMLSyDZ_zzUAYwXZN=Qdny=`lOIkCXZedud5)|{gZ&L}8a_qIViGlX zRBCRfesWO1s8*yc>Q70{9g+CNgW4)C;)wb3&CBfqd5b;*pa zGGC7jC17K;fZ?J1g4}EzrOOPB#Ec6~kYhJF5=ryr?U4+b5jthEjt>L>@GaxmR zGsn)c7o}n+BeEndv@@`QNRO1aIFg&0otdBMf9UozlT$NgCoG%qNPvDw(#e&sls%y7 zj}j|4JaJ@Bq};WU3>=vIi`gk!VyT-Y2h4ITu2~x+S-CP>@?>9Ap)FgiY;A*V@cGd| z?d?@(JF~y6>PXq1S6EW^IHBglg4DJ*k|9g9Jtq#9XK3?ea}}1)u3{9`;attr3@$oz zFj^KiU2h^?SX^ zb04gu$M}8cw@pL0TjOLypp!3~PT4JLW?AJ-{j`OHqCI}@$n2@|A#2R=P@b$>D(&@0 zYbo;4X-sauU(!J{a@_P#Zdikg>S|NQ$cH#N>mWSGa9(zfoMXrzub=pIbTLL(9J>%> zBcBb&%PA-gU+ic2AOE=Mju~H&Er&bdT-_Ut$@I@7O5_TSOik01BPy2om}jcd5o>is zq_w3=axP3hqH5+wA9={PMJe(jG&Qd<+Yj1aVYJM~F%z=F<5IK6$VnnSNg=&kA%fl> ze{5Fy5v5@s-5oTTS2#(FD5@uQODF2zbMW^xg<^&AkwO;w7z+CbL5mHr>sR>5@=JWO zI>Ki;VDOj0Qjp*NjXvasLKFR2y2Z!*JaaJIX>ii8{sT_!sg2pr9IeF8C}W0}Z)fcB zGp6Rsfvy&?S5dk!ls!f9pkkI*tW;EAXi{Y6%<(ZaDJ{p}xflC5Q4ZAn{nkPsC#CwZ z*oT5_;0nb^KPcoxI&iIzk;S#tN5*bcVi#>8WMyXi?b~ifObSm4O-q&2LfYms9Vgoj zOwb-5^-$IvcK9f}C%a1ya^(0tdvs9)Eh#@Y%}n1MqU<-dqGE6sx?>?3pA~#8%uCD9 z8du0e{}np2Ae-$kF<9Q(wK`&Is@c?(`oI~ru|Yf8MxAfYbPowl31!JAH~)07?Cl%K zsh55O{c{NC%N90VAZO#GiQ6lV_m2+x%E4B8$X}AnO!j$l)+v;lEn?*GVUNkNKHlo# zwtNtcMC`2;kz)A=E9c6(n;|<2|1`NQSq=Rb4>#w%w5@YE#+=5I{xu`y?18jwV2XSa z*RX{cJ92RU@G@QNU(rxLXAhLG0kYEvhO_jHm5eMgBekpKL{e7R|CFK` zYfZ-ByuMkPsd;)vTgR4~vHEFwXzD~c9q+efW2LcrL_N$ucjRyRwwM43S4(XvOm0Fr zM(*p{V4SxkkSZVS3(u3?jeL3zWyu+>4S}?6+2N~LGy7-~vrM7aEe^{)Y08fCh) z9&KAnp&UU>8Xn4#FK6Vmf;r|o5YQFU|46Pe{*w1kAR{#|W7v4_#yI&PCu_?H{nYnR zT*^pqRh)l}>XpU&r&7Fq4ZJvW($8BLC~uk^-RNgAIVjp3i1$j5mPf39@>HC>&U{@i ztB#wLlbRdS>hioF0y*+&M2dejF2S2Cxe4BK|MmTK`uD4EXuRLEcgOj0izM#dH#Kj? z+xog;v%bFkp2Q{glLa$Z&s=PXAL4C}9})7FCk#r>8E`;^Ec_-sjuo!t^+4+m85DIsUk_c7nI*6CEYT zdj9bvPedgYWOI}^J0ZcF_o`f4ABWug5|YERTbAW=iDW$>Sqa`UKOik5TfS|}@+-7H zMQg*qNN`WOm}YHmmEbM@xq)`2yn1n=P`a!>YW$s$>HSbQ!7I`6wKKv~vF6ElCgu$6 zzqKZ2=H!IZ<>O=?zKfbwTl=^``mCRRmL9CFoRaGI+^x0cQ-B;3j+Y+QwrLfg)|G`| zVphm+iaCqqy<5*ei6Gx$nFf9;4P5Itu+)Fu=r_|ZeuSJr)M8$!jdD{8#!br1*YmkL z`b%m27C(AgjvPtl^_MTaS+?eXRonj%V|4tLh|pWq$kiXi4$%sq*tWa)dH9PY=lTWJa1Nv_bL-~h zr0Ei{uca&wey;2>3r&O;cXQngSv&DPGrrREc1us}_3Jq3x7Mu7X3}M;Q}6YYgk#lO@SHu{1&4F0*EY{}9x zUzRPD6z6?gUjlTyZhE>xbcw`BeM96Eois+welmk9L@aHPF8i{~ zX!2tXWcEvw61+YB>t6r$pf)m2PfOY5XzzT}z#a3Wlu)$apGorS#ql(`cSl3}T($RP zLoY6AL<)9|;etH>%f6KjWxM=-BdPv9c`#U%fK3{(rJ>CB_a&fyUvF8X^Sn(>^wgcM z6EemANuf;HsLV<1@6Ai}PfQ<5#CA+Z7afu8-F8HZH?!GD?{M=<-=6;{OEP+UU89PN zy!TsUS%u$k9MGQdK5DGhKic>_Z(-Ex?~v+WHP!!aRXaFl!x5%p( zmzu}*8e!|3lRbGw*0<4r-Rr+D+^S{!(T6vqKye(3m z^t1oE_!IqmqyM_se_gm;$CS#e7tg&^g(e+tD#uf6oB2mb*rDWltD8$NR_#31Oq}l= zXPG#~pXxlyPM5Dqv47OdLFB7UInCkyw^@FHeZkAUBCM@WnAg0buvmmL5oB53p|2(W z>vsRO=rf&5gU^#Mhq0+bmmh3izCdnjVK%_qTF7|;JyDUV=j|(W$BvdVhpH-TeT(w4 zwxF!pEvqc6Ov>6KWy##}Ul)I_ZNybdEz!Q`S|;noQ*sCu&X)d{ov*j9Wv=(0xErnb z62`w=Iew$WeMN&-kxv{nwY})stiGH4Uz+ zSG(=`?FTIgjNTnTWl6o2ac{)63??SF4C=pTi79gvZjE~-(BkPMcLiGRjlZvU%Z_cD zx9ljH9mmZLT-*HaRs!aq8vM(D|1mH(ZeQTCE3Zs`D(;m8(IleJy$NNt{)oGD#E6#y zH^n#2ZJysOQU7UP_t$DY758mmah-jE!td&}_&#B8t<`aV*E;0K< zUtmN0jfp2FHu)v+biKI=kHqzVBu+Z#vJc{xBs^dHmcYKilDPeWFKYnKFm z3_KpMRrtLv%Y^>Te=i0y_XVau5YSwik1ad)DO?rzsucBGTwT#i>pc|D*-NEO^Vxy% zzXa~Aed#{G{uy;oJruZfZTvNN*77^?*k1zj{&rwy++{!4-Wqpf{Eon&ZGowyZj1Xe zaAU#?@uP-qY_uOt%|2+LQZ@T&F z+kZXY;qJoY;{#r=cekc!fZpZ5i@cO3DtX@9k~&$e`JE)K(TA?cpqwNxHmg6mrJwD6 zC~xYMHD3LzOm@V#S^dx8?|@IH&-)fBYyCE>zYG3%@X7RRJN4VF{`c_zgiog5*70pt zzg8;~P*?ue=_k`a-|=l$e+c|m@X7SsJHE~8XTm=oKAHX?$0wgE0msSj)yMAFCCBpy zf~SGiPuCX=qvUUU`MSa3dxWDcUu)35)1?~iAF}-EFCPm~zH*Yh*sRkx2sf6}+uy2B z)_7gMcpoce^=(#vG5nk1lj-l)KV;B1^=(#v){%a;_XvEl#%ujkOm@V#S^dA@m%=C0 zUy@)7P}cfwR{#DECjU41WcnxSA2R5h`ZlZoW>9lIPj4fk{YTb#ZGS)gLk4|Q-)8me z9^+?wdV3c2$=3 zZ?pPI@c)EQuBm?|{5A=uKgjg$=}nT6Hf#O)@O!`~)3>KreVf&v2md1YWcqe}(dvH; z{$%)M`gVQM>fZ!^K72C$SoN2|e+E98eysYvj-Ee!0-sD@pO2%1vbNu5?Z0O5e}hk^ zZ!a(E+pK;^_(#ZoQP&4DeSha_)lcpz@yE%|XW?0K+B|O{co%pyxb@j4|0?02A8B6h zcKBt7|Lbs~)Mfi;Ih^M3jSlPdr0WZY<&vLHkoUJ7{!lpD_J0ccD@#uDYJZWn=uVQF zn8}UIFPpW$XB}%QT>+m=zk&WCgTCqfvRVD&TT-$NfdCWErJ-)8ma_w=*95%9_McbV*nZ?pP^y-dJ0@X7RJ zt*>+8KLejkf3N-_gT86|ZPxm)Kh4kf-h)rpc0 zmjg$ge`NYtJR|M5S?k{l|77^&^Mq%brunZduMNg2Yk%0R<^72AvQQqGesjmSS$*$J z6EGV-nSQMPXbJxj_+)V~T0fb-y?*HYvRVC;;Qt3cnf~3Bp-7I`~=e$@F8@zXbjr@X7RJ)&D&F}FH@d(y@DO}5{aE#Pgx^+9=IZ<>(~s5v1L609Po^KM{>$Nyhfk&- ztN!cZ7sDshk5&JC_|L&7(~njETKIY*U;B?tKUV$k!4Jr}AN3&XXM&RY#R!{JLDp5gEshd*`rZ-+Y^QL(-Y9G>p*V-A1p z@P3Co$OB>R={eJ3?T>VQ!QdYMTqg1M@lU>RwBw&yLrei}qgtG~}=N9LE!>d#Ix0oTDN)4$B|ZC3v)_)FoF>0jyiHmiT`Fca`D zd~!|w2jKq>pG-g5so!R;|0noI$$_2rKbih1`iBhqmLxAWtKZ=wKifMGK3U_n|8cq{ z;@hnL|amGGVr_><$DqB53-i8%j1#G`7oQcKZcDm zei!&;`elx9v-({xG5(eC$@B~K4;l1L`_pFimtN{;dw0VpYrM7}*%9An^$%mjX82_K z=$?pgv--oaf!hn8TvLA;{8sY4koG^B{!3=^BK6y>^`~BL0+Qg9>EEP($e?dY@?x|4 zd#>=ay}RI(HD3Eqc0>L^-)8j>!QTjRp>vPb^7z*m%=C0 z4?4ch>fa52H+(XEyFQ(Mo7G z3y0gbs~A7f;Ub5ZIjrreZhx~y;_dy-H^R~OH-|92x3o9?MdtLr=Ik$Q*8X~7oKCIh zy$qjB-#*^b{6JTjxy~h(_b8K3Q*SiZB{=w!{na= zpG<$BQ@_pXr)Qdg5PUNILdUmR{hjdV!za`KF2NL_tnIg1{kO7B{+sa0^yRR{AL!ex z{%7$2f={N8$EHU5-)8j(Og7~o+rjidnf_j9`LS93Uf2N)g-@n`vi>21z9q?v&FZHX z_}N|_e6q&t{_=09|7=$Ois{CG2|k(rbp1mHebf4FR{xW${cNvY&`dvB;Jb5#MI@PrA+oycje-nZEsf zsn&0^`n|3<{+IB{^sh46k@{^`{~`EIjyCm^>EGq}Hml#g$ON1TpG<$2{vm_DCCQ7; z>OVKb&-Ow`oBGL;<@aA*lO6GGR{vG_3*eLK+s8**zs>4@IKx!1>1b0wS+e~4*U5Pt z9hB9#S^ar;`q^HKV~kIxFQff|zRl`C2mcKCWct79A2QIlS^brFoBXlx$@KfgnSA;- ztN-16lfMW)nf_dp9jV`D^{3rq0$zqsrr%!wkU`&)anI_AB zRbSU9`*=gkvsueqh4Ri7Uyq;3^n-qB=%1 z;b_Ol7cVmT8FHPDE>C3k$A9XWd}W=VHdj~wbSclSzgRe0{WBMv@_U|O>L+V`GK;(h zCOa}eY}Vy@?qU;g0emw3){bwp`pe;uhEJxy!trfZf7lWeFd06Xe%SGCR{vG_^Wl@} zH`YI7(6=Ocv043hANI4o74XR#ul;wW$&UCotAElXCg2(PWct_XA2R5h)^D@=E0+4% z-s|wm8n5+th%@>0ZB~E7GLydi_bXsi4tGrhan7cj`adV)YYOnGqMlC)1C0J|+l16+W4M6RSR*ew(%auJEVBC(}RL z@oiQ=8UBm#$@F8je=PhD;gjjx?Tyy{F#Mn3lj+;byZSb3`**=_+}X@OGJQEM;t$H| z+pNB~+T{0zPo^Jh`V-+_0-sDj*7SFPpAVl*zlCXDWc?%0lX(3Oz8JsPSPd=(zXje4 zE)x!-EPbngaz)nqs#~ACNxZ#24-$^HKkJF<`C0OHeI|2yPIJ~rn{|Fne8M#H#Qzwd zOn;Wy{YU!4X7%^3G5#3%WcnjacEqPLx1&2Ry_)CZPJKUga#qv&Y_$-Gx2MB{9KO`yNe<6;_zIy!TRx}uP*8EPAhGBjwC&`P=>i-LW2YfPp=~jQB zZ?pPcpEmi2;gji)s8`XqS^XPdHu+t9nD&$D%V}zVP}cU_to~y7x$w#K6CK}X^-JK- zflsF2#PMxb|26na;FIYe?f5pUUk3jh_+fKS$V_0Koi5#MI@H^YA&KAAq}hqBghv-;Pr zGZp*{pG<#!g2|_Ev-*8EnEY0!nf@cwpKG!s?YCL|E%1lKC)3Yye4Ewpv(W@(z$eom z>G!%RO}<8^(o>r>xm^|!~(xy$zqN@!J3V{6pVn^_Ro{3O2CnjJRd@}uW^$!{JElFN% zR{xRhezrFiK3U_n|GqZa5#MI@XMJh{7QrXe@2!8xpl@2g&Fa6l!_W3!gHP6Yt^anD z9r0~ef5>Mh;1l>{`uKV`;@hnLJMe#kPo}?2|Byl7wEZ@#KY6F0?KL>l%ztt_;h84O ze^pB4hb^G_5B|hD%Z-H>M{d*rwPmiW}!|&-T{9Cu_XUKRFHQ5A!nzI@GDp?;gy{}_I6_+UV?x z1bi}myT8;Yzb)~4yuKdC>z^sh@p>_i*M9?-f*bXzxW0FGc!02ezq`GL-|vo)_;jy) zxLi2e`h7X3Z=dAr@jIE*myIHnb^2`9{@DcoFnluoAMt{?P zWG!E}kCWp~zOuI8W}W^e`%V6H@X7RNnCwXZ*{uFC2TZ^R@X7SsIlj&6p9B9Od@}t; z&i>J6^)LL}RM2gJnSL^TdwZNDBW+ec2mW;UWcrCt`)yXg2!1hqGJRP@{6Sgkw^{wU z@K?eo(?8nrZC1Yo{vYtk^zHU){Why#3ct}n(|=_8c6-&gS^f9np8%gs|L7R)-wQt< zKAFDV-e~Rj{xKEY2A@pdZf~^qH-Wz#KACiPp03(nSOF#iP!C4GPZY@fQ!I+;1cld!aK;z~3psa?+ z2ki${+&*>_j<$U)#`Jw4`Px5ZPTx9b`)ISy-{Ap`l>4U)Ha?mD5oU8A**@B=ewy5q zQ-{0Zlj)!B=awJ;+N}O!`2WHu)9>T>HmhF-zr_Wn{p6bZ!32$zbNBGcHTB2B*ZVkV z|C8zW@JlbBesZeB>+)5G<);vwc*u14-NHe*`u3c|T7J5|U~rGmK9=}&X3G1o!n*vN z>fAqdG1`CMg{J*vwtt|r{MfAh|4kj!h%NBR^mo=WjZjXK7n{|8qmkyw@7ji#`pG)B zlcc6~HMhL~Y*zo{7RJwqPp045=#k~uX7#<6#{VyTGW}TF=S28_!Y9*@wSDdYzv)mj z{bc&rIqkPu+y4Okv*DBJcXWK4)h~tr1bj06Sku1+{#)?L^kYr`m+-%WPo{rwf|&s2 zBzdt}+h5pLbL6-?$@Cvt$LjJ^=xo1iR(~HZxG#cFrhlInE`zexZ?pQh;|qti@X7Qy z=pQoZoBB4ZKO$%XzJpKJvD*H4XZg2T{fkd9e&1nc`pNW9lrnTs*7|K$zX<*+_+gYEA;a1Qth@M5r*U)}ciZHZ4u+x6`$;b{BszB&;y+;ov?Kbh^f?r>B_4s{H4UgZaNxa?Pw+lx*{wly1UfnJ>{Y_?jZ$X2Ub$V^q>HQb} z2>4|B`yAh9^?yB6BW3x9Po{sg$&Sn~o7Hc6wh34SpG<$hQ@_pX*FDGhFTp3%m(8X> zC@0B_&FYVa{}p^P{W~4sX7#^=f8uD<|77|D5-Qejv-(~7X{6^(fKR61!03_wvswK! z;NJtEOkWNw{XscNUTju>7W`M?lj+N8lM24g>TiO-3qG0t?~ZS?`mgraNZBu4V)~EV zLwF`!ePekoF-}>h$7U_>Ba}BD<&kUZe-Hl-_+rc-*kXR zdfqnpWcv2;xB50~{k`D-1)oemR{a;kZ*{4eA7uJ=ebMUAhJPA-GW}Tf&xC&od@}u5 z^)H8iJ$y3#SoOaG|6cfH`ays0l<$9R*8blK{{{GD`fVKFX7%^O{~SJO`lrFa5I&jyWT*Y)u*3(Er*DfLe$U}Q z9qw>>MgKyFa~yua;kOGg7~yEgM=Q`jZ%Dq*AF>v$$0xEI z@&{$@Uz@dm|Aqe}d@}u2j&HO2kDafPvfaGW)K8B1jZ6W`TK_8W0ErKpEdMpb;hTi@ z_-1bnk8j?Tc>DNfr*O36o6#e+C34;R7}H*|j@ACUDnWD0*GHRmde>cI{3qd)>5q-C z=-aIRF;^J>Q}|^1FB#q6KWTs2to}~;jmMhylj+~*)Nix;(^553uDgX#rhk*4TR#0Z ztN$XIPo|&fwBKg+2TagNxo;tSGW{F;-17F@to{c0EmKYZ zk?A+qKV;CiBzdt}{f{$Dz}czBC+k>Ues-Abh;Os{PhMpLa#M{@*0JgjbNbI_^$%wm ze=&SA{Z>+j4$4XLVzc@!CTWg*E=o1^lXa}t-`r$Je4EujG1~+L#u-1t@R!QF4jQHP z+pPX(_{YO1YrNL~g#ICezNv3>7vZaOOu#7kWF4!%U7z|ktKVU=@vnwYre6{#g~*_+ zzRl{tpQkxeE_||%)%s%{5A25j9(*$Wpp>D5veq9|kU?4Nua&QV$#EfkvW~4u{cYhN zohI=jk?9Aua2b@N)qf`Z3*eLKclYgbpFCOOgUHjjM;-pi;e!rq`PJ<&gXtBw|6PTn z?Ju*?{&yu`r=QIBuh&0h&^Miao3;PDO)&v~!zb(5PLk};!|L0t{)_NihfMus`f>`; zAC%R%S^ZM@UEq`HKk4{3s~?`Kk#e2`KAApF??$HIX7#7S&x22G(FQ{{;MZ;gf6XpId0^{~bP={#8!>Hf#MW;kO%a<{z1U(D7|n|84jK;giP+ z&xEUQEHBpfM>4}@EHOuenWW%ESA2QoxKkrHV!)EpO&C*D@P69reex}Ke z%uk!uzw9OxFdaUb{?pF!kIm{gzQysYx=@X7#Uz zzY{*0{(h%^o7JCut47Lt4xdcFQ@klaS?jl1{rPujj%-IKn)yf8vARB$Xr>Ix>f5aT zfVrCEd4u7Tb*%b7YNiaz>f5Y-_hQZQyoceFb*%c2o9u{hv-)4$X#)1ZC&y()U!Lv# zg|^3LE$;xz>n6S~&t$Dd+hcDJ)VEpv26t(sOe=gceY?JB^>>1w1D{Oat}j~sr^CMo zKAC>3{cjTdr{I(62mPrlpPx4C^k>8W5I&iHtomod-vgga->y%m-)60UDg3xeX8w`s z$EyED_{YO1)3@u3R{sw8$?(ba?e8zuw^`f&6Z~oL$@CLFGbpQXv-hA}?RkoRbWcsn{zZm{N_+d%3n0iR4iR{b;K z-vOUYKUVz@z<(S*nSQML*TCNbpG-ei{hQ$b2%k(pR{dYVZx}Z7k4!&S{RiNm2%k(p zR{ag;X{6^}0G~|%ML)NE`$f)__#pE1?PiCcba<=7|2o_yr($_y9lp)s*B$=J;g*vt zmUouJX%1iSuugxv=^B43-ShJgNqoAWV_r&xqaFXhiT)jyYvwPR{VRu&{-CVeC!2Nq z)MdWr$nVtPlXa}_U-xOI49e=;tbXtw&5`SH;gfZ&`qMR224(eaR{vi3ufQkMf55lP zeVf%kZGlG0eY4?{{}7%DSKnA(tmQo!<#oz4{Yj=DYk5zHe;#}?{aE|E>F_UsPo^Kl zG%0I;+U)ly{CxQLg6TJNe4EvO9P#(SC(}=Ke4EvO1^$ch$@J~|wEZ@#zXkrs@X7RJ z_1`z}_rWLA@94DOX05;8LXDJm<(v6Wrr*cUEngnVJtRJeJbk;^;j10K-{H3${=wm< z1r^Kh>ae!2y6s7_#M|4GiNevgCxbEl&8L{@Cv*A>F^$SP|7_O&TL*t2d@}vc`iBhq zroPSU|Fp;i+ytMjV|9Ci%U2@4&FXi)&-k0*lj*OPGIUVZ`fXPK6Zre!lj-N_A2R5h z`ZlY7!2>3s?Nrl$WF4#RuPaFhW%X@Ve>nW%@X7R(eY@PZS^bCM=fNk_-|zS~tH1C; zjg;S!!6(x%O)v#0Yx`|hfAk}oBj3ZoC+k?9{)bF9^F*l|fm3 zo3;HZ@VCP!(+{dF1O1>+hSkr5{||gJeY?JB_1_HtG}$od=XElDyFT@8*7{e%FMv;` z-^OaM`ZlY-4*tFH$@H5$zRl`ygZ~D6GJU(gX!ZXB|9ALg`gVQl+pP7+FVjf*9#jsL zwExIDR@a|c^|ymR96p)8U0<~NyTQL6KAC>3`Uk^*3_h8DtopBj|0#Sj{aE!+fnWP- z(|=_8vFg7C{%P>Z^smvGBZIQ`A30UxgPMWiHiutw_+N)lmx6+n<$bcls~!H*;pW#? z^e=Qc*I{jcb;k=2NPN20o|VGUju#S_Ye}Bh?>f`pWF4!^t9*^(56aqKHtX^}1^$)r z$@G75e4Et|tTf~(D)?mj`yAh9_1CS| zNckQZKAHZVj&HO2DL4W9J$!Oa{ax^zTyN$dnSLO_G(b5?UToI-cdyYLx$hHvvX0gH zf2wB6psc>l>bHGLb7WbAPu8*OAJR-2l-0Lc{T5Gaj@^e33?h;Os{xi6c5CN~(LO#d=1Tn1&W-)8kU!#@>1nSQpj|FBv8GfOp6 zo?8K*Oh3hBN9wm({X1Sa0oTDN)4$R2ZC3w?H%!1{_+6Z0DmWZGW|i0 zZ?pP6)@!8a{RN*)f1BgmtbV;WjepXOX8w`s%f~=}P)?E;o7FFZKN3Ef{wT+{S^aJB zXTm4bZ>WFBpl@2g&FX*smI-(gK3T`=^82ME9hB9#S^d{HXpZM?giqG7>c_`vZn z`s?2|{!aL0`q(^0>bF__Yu_>cA^2qac7JL6ZB~CP{G(=?`A4Qd%rrkzzs>3&^R7n9 zc^&v<`Wv0=9c)(r`wxvj7CxE2eY~aZw^{wqw;F#Id@}u8o%Y+T{)CT=zYIQ^{^gEu zv-)qqe+fRBem}>zS^e4{YouHk44+J2R!e_SPLda!)t>|ZAbc|YWXHEz{q67*XPNm= zK2BJQj0`L<*5|ihQC>32Bh!!d`K{JAjg;$-;FIaMM2nQQKWx_NX$$`b_+3`j^B12R@m;U0<~N zH^6T;+bmCH`r|w^D63EIBJukB_G$QidtY$+xpBTQLO5tt|MdokS2_Hl!@oP+=BA3} z^%mCO(KhL31D*uV0nc&#r4E1K@NW(`n^Up=?hX%jI3%psA9~Nk`_r%em#!}u z-0vR?BtD&)@_x5)w9o%1eqsta_hvJ{$U3%@q?b{Kvd%A?b$QzjKNmikehbX7%^L-wU5i zKi2l*F#Ka=$J$9GGX0=azs*|zQ9CtKzIT96rXTBkeRudbz$epB^h+=Af19=bzVM%b zPo`g0{hvvE5M}FItJ^B_V2AS@*7B=cf0synx>f#j!qL{>5orG$9ShiP9?&nHr}NcFXUn}4Z)$?v`;UzZQEj@9+6 zo@UCRtnIT|{r2$hg-@=je;oWZ@X0mxyTX4PKAHXyvpJ5m-)3$9)n99*oacZ~rhmN2 zj`%jK|L}iJz)^Ee|B>lWcYK@GZ@1e7+yI|UKhN=PR)6j{Cg3CZWcoS&)RoUao7Mjp zev4w$elq=$j&HO2Bfiy0IqwLcTvLA~{LA2zYw90{KNCK=rhdvE)BY9k$@E7%({Hm* z|0?+J!Y9)&a`ulltKaztjgZwCJ$d@}u}j&HO2$HMP-x9LAJ{c($(MevW9XX+={ z)L#YvX87cq`mezM5Gp&NuBR)1T@rzc%ai5ByytWx0e;rf;vW+J82y{}TLV z@X7RJoe%g3{ucOT`u6^@zZ3ie@X7S; z`l8i;D*R*QgNJVa$u;!{!M_MTnSN)d{Wfd+^We{hPo^KM{j=bg!Y9+W>(lACS?e!> z?=3XbPo^KM{&n#C!Y9*DcBY@4FY!U->Dx`h$F-FEl-ywsI3EY^0e=KuIM?Lwcl_py z#BV2`cS}ru4`n%@kcjgM7lMP}yTK*ko#3_L_Z|*#Y5)1)L~tRv5BPELAn-fjWbk3|;^$0xIzQ~sJ3a0<_jZ^peXhfq z;LpGpfOml}1%D6D1lMY1{Au7J;5pz-@B;7}@ay0~t&P72ycit!fN9^XBTaq>@L%BJ z;QKq6{Mq0)gN9!R*FDDYPViCSf57K}+dOFMO9Gz(z7m`Q&IeBh&ja5HehmC9coX;| za2fajm^Yki_K>N+Sx3{}?%5_|*r4Ddqm zFz{30F!)XIEb!;x72pHl`e&K?T0U&rw+MVXxaHX<{|fL);9~GAgG~N1@K$gsct7|H zaKphS-h0H<*A;vmcmOyVoB_@TUk5G*F9ELvKM#Hj{0aC=@K4~s!Hq63?P0%(*MrxB=YzinuLZ|HYRZ2Pd;<7q@VVfG3r&5Of{zCmg3kuu4;~9% z2c81{5xfZ8V410Z)(}(vAn?4QhO@!5@qua{_$%Sxi@_z!K0`72; ziN73txqr6E^R5RMfR}-92EPe@2)qaU8o1F4Q{TtnQ^9|LuLSoRVd}pbJZzNV7r7|BGSZT^X489ON{4$fD3tk3Z2~NG-J_%e5?hSqeJQREgd}#+mk>@VF`ehcv@Oz#pa?E&%6d7+wKR&osOpyc1ma2~*x%*(U!S@Mqu*@PNrC zzZl#r-|%zb)B?kY!By!Zk;z{Her|^09pG2Njno6Mp9(X4B7g-N=SO-p&^+t#7;2`){ za942mXHEUd;KAUr;B;^pJPW)FycWzKylep{%6g^458w{q2G5!LdV&XnC(3fI!!_W& zGT(K$72IFulMba|K5za9FrOdao$Uijl+KL7h2@cLIw`+f!U`PXN>faxnW`KjR9 zuN$5Y-V9z2zIL6--vZ|Ipc}ks%H#8$j|TI3&Aq{V-th=9pI>|xn9n1=9?a(pF9h>> z!B2zv{NHt8KF{|fFrUx+6PVB2{Ts~Z=LTOg?dS7w&ja)MwwHkUyxPfNK7V!rn9q}a z3C!oiehE(h#PnYsSq>Tp%Ae-E5Qd2&k zZ}%*i&#UVw>xK4D@;+1F8Q>!Da4??_cNLh=dz%IB_M7ov1oL@lAA|XPv%kT7URh6B z54C~S!k_w^^Z1o20_Vant4xK0N1`C8M!d|p;Dn9sjj1?Kat z-U0LZR6l_Eyr~B3O?`ZRRA(@s2Q>i9=O;Y?=JSy1ylH$s-zX2v=M~)y=JSUh1_u+Q z(`0xNJQn;heQ^D^O!<6%&P8B859bLmpKsHCgNf(!YI=bA{FxzOK2K&U_<@$DJ$t}> z-ix=^Zv_S!MwlmWnkW~covxVAAS+c`w9OB=KX0sV}bp@FBQ{4>a{ZaRWdB4;4ADjAk|Inde-VZbr%=>#@59a+k9|rUOo9n?- zr<&#S4>0eK*?ya;?}=$9e*l>Gubc$t{U{fJd4I{L!Ms1@dtl!0@mnzO-sfq8$r*TB5rTp5`6kNXQe`Bqb2yH8F1yuaHJFz?s)D46$O`vJ`RsnyzH zeBKYOBbfI$8vyQfm#J?enD-yM3C#P6EeG@dV6T9Azpqcgynol<;1^N;v7edt@cvpu z!MtBqA(;2Sx)03zS-lSC{i%Kg^L|rpKR4y`{!wRxc|WK$Fz@el1DN+~dKAq2FTD=t z{gl1}^ZrPO!Mxv5hn=Q=-oNM^@SF2Y|E7X@|D5Z=ydTbLFz;`(3C#P|>;m(CGjU&- z`gs4CHelWlrYD&9cNqod{aU7jdHRN5A#-={tf=I>4a1@rf#t-m$p@%NxT!Tf#a6=42eb0L_&zgz?6 z?E749wpbUJd5&1s?$O_kTOU{5{`6Fn^zS{CB24 z{@!jln7^N!0p{=FR)hKbwl~52z1j{ie}8rW%-@r>{od5a--n$E=I_0(0Q2`-H-Pzj ztVh5TJ~H!jEttQT`UK41Km7sb@0l9?VCv`ZlRAR=`=YbK{Jqdfa9jKyWit3o@Lgd3 zK4%%2zqff6%-_#!0rU4T-+&{(Z~4)*kH4Sj3Fhx1t^)J-4NJlNy~5{U{{G;IpG9KbY6c=YVpAZP^ZLwpz`Wk_Fqqd*4*t!Q$Lk@V z1@rpGR==BkUavS8%ULQCUJP_BQ2Tb|Ae(Yi}uLrvg%#xoS^Lnc3 z%C+VGS7*if`@7q~yTA{ETc2(6OTa_G>*#|&0E7uKNV|cJ~J-N^HOv9Ei@}4zrQkI1Uhvi6Af69CAI#^`KMv;e=r@4*Jo>M|e7^Xf zU_M{G*MH`D37!L<1TF?I0xtx=2VM+51YQB| zSjUuK0v-%r3(f(Tg6DxZf}aI%0e=bJ4o;|R$}a73E5*!470X_lTqP{7w8@N08bnunnKHwtoAn;;vGWb>SXz(HMSn$aW zq`r2ZcLJ_=zCgIKFt2~kR6a`X|AptdtOIWce*i86w{K|T`8?&ZU_O8FK`@^W^CFnP z*WLu?_10g5dA;>XjZFEx-Z~%5>#gqv^Lp#&!MxsjJDAs7{{!ar*6rnFtxhkmw>}%p z>#fIudA;>RU|w(i1(?@cCpIzV@p|k2U|w%M4$SMV=Yx5@^(NsaGCwjfzrF{Tf#VWQ ze%%#jc{~a{8r%=O0-Omx2)-4Zv(or$z@^}i!KXiF@_z*YoEX3GA&h@%_Qc z;1GB*coujscqzEgYU6JNXMleOuLZYmis^sc#Ge5!0*?l-0AB+>2wngl^n~%B1}_9} z0q+4H0H6M(iEq*j(+@rayd8WgxES;6I`CTXz2I(`A1{K7!2bnr0XJ%H>I-82^Z*Y6 zUjbeSo&_F@`SU1v5ArvIOOXE!csn?ug{kiZ%%2m%)4)T)8^Jl?)|fvF!NuTp;4<)D za5v147VC(zz=~-!TLS8mY0b6@dJ1)xK1mRUjpt0_OLy? zR9QZ6OvC4csmkr8yr<0kzX@Cyd_VXE@U!r9;J>ddr*W%K>X>5{~Y;ik$)JR3~t)S zw0AMMi?U4bCQNTHWvRa#${P+o8Jq!b2rg8X{$GLe7JxIrPk_gQUx(il{)gb^;9n3w z2=NV%H03V@9|Jxee1@{LHwgbiC ztmP)ZHTd0!4R->sSZcT%nD;Xn0OtJ(E(h~|1Nq?PsPA_0hGnL_Mc`pe48Hl|hsQfS#c(6W-{kN^4nO7aW`}n0;r@mjvb~oWZcLuwaG}F<9A4n?8iz{_%Pcd)28VxjxJ`$O)7RB- z#J|w6S(&8BNe(Y|c(uc89p3El9*64({q{uaJHl|JJtsMQrV~Hb;VBN^w11$(X-@n!hi`Xyh2y{KWUyf4yV;_C>gZ;mGu! z>F_9r^9)C(XMvOdf|LK5!-t*tW*sZe-;)eS+SAv`ALVea;mGvNbNtm#{5uYR?eGDI z8+WQWKRY>my5UHFjBq&Y#NTE((%z??__v+>?;TD!wqkz;9X`{roY6JIMTR5&nPs>> z^RIF87Z{GT?`6Ys#@GyBIqV(hw`480IsB~QNc|ff{@jV*_xbz!xuU{-r=hq zE_V1)hhH-s>5sP@-sbSH4tpn6?9X}*AK`Fohub^c(c#VxcX#*%|@ z!;>Ap(c$?HKj84Ah9mRyX@}o199ds>IQ)m<$njFs&VGNFZ+{%_=Wxhy#4mJsj^W7s zpX=}fhaYlyxxsIM-iUvq!+jl2aX8K4YaPDL;fEYvi1V<`kFc1 z&f#Mn{*S|FI^56Up$?}we5v7DJe~3T^;l4eMnC25YNnM=~hYeCEX)wfux0!7D>8S(tVQdm-K+72PHiu zX|bdwk{*`yh@_>G9+k9A(sD^FB(0S6n51VVJtygTNoys&An8R(pG(>)=?h6;O8Q#T zeu;>LRJTq*EmIlvH0*14#`f{U+&mNqPV_9sh*?^Ntu$ak~C3LmZV9NvL%HjS|w?&BRY|W&DwXuQq;-3vBbO4=&vBS{}i+9v4}N!ulTDrtwL&m@&e`byGnNsS~mmefR2fut#trb;T5 zbhV^wBwZ`%dPzl+W=NVPX^y0uCEX(FR!Q?E-6Ls%q=k|eNxE0keUk2%^nj!XB|Ri* zv7{xE9+vcoq@|J`m9$LKa!D&Bt(5ebq-P~PC+T@fYbCuP=|xGOOWG;v3rSx}`dZR| zCGC>*jihfS?UD4Ir0*sDAn8X*KS}yo(l3(sO8QmOK1ppQB}zI%Qd3FIBsG`RLQ+df ztt7RU)JD>glG;gXFX<>r9V7)M9j)(P*O7Ul+`O(i;oR)dkgh2?sksxgLS09NveU!4 zUB~66XO17=)f<-cb1x=LsC=sLA$R$5;6xHC@6osf1);grIx z{H*R%@=wd{Cc}iBt|M4tm!AET2XsHJ>v;v4S?OH|XXl4f-hZ;gxsy_}x=uU&)G?>_l=hi+g}pKO(;E{WKR!P*+Z%IUO8>zF zlX`X=6V3_Qn3fgJ3t8E@q11HXz>3j|cC@k+J-#42Ezc^Hq&aVZS4)m@t!hMfK}m#pR?@cX!E%+O>J1d@~QKs5&>4SCCaj zuZla|&#uDN863UK#neT&3eQY#a%N7bO53zqL#imlpL^97F<9qsbtUBW4`)~10?n+V z?k;K5rj1Dt<>luVq)FGE->=`8(6qErPX3sDUC4V@8q=%Nm{Ywm!_K>)-c@`nx>(YNZD z=o?h-th|(weRFcsQuFfv=eC{YE%UdTDWiuD8ITp46w1y&A(AySGsF>|xoQ^+y*n!1d)IWrFlfRoiebnvq`hH`fsgY7HpD zDY-xn$NEl?1tdk5gzO2G8m5P9R=#6%&R5bnJx+XPerQr&rQpFj)`@gBf)zGrk?HEf z`q^z2HxgDHCcdhCrx&UUV|7*K`;&)EdkYh32=ch)DIXvCOZ(z~ceCQRPB$$T+8fNw zlcg&^b!1Muzl>JS?w6aHpP81LRb_-6dg;1az749lIB2~=Jw9`S#>+ZhkQ*8|~`{ib4j}KR64K{gE>dKTk zDm#j_+{_%^QADj%i??E;lrkxGTIQsJNhyW0f0=}Sj9S#tD1p(+lVz-C&NRlUTwa$5>^`*WhJXF-d@|Pi^Ez~T?kg8YC|fn3)O{2 zTPdoIkFqRR7w;_8)rI;?Zgl|_7E}aQ+B@oOMqbpts-G{L=7Rk2BsuI%Gkcl7S+e~8 zFYZdCH52>PC|Qx+9uC2EVtZ$V*S2V~9Ev)d*l1Ci*?IYLh9fCFwYstp zHAL38$nkWv($d4SEgNi#tggJ&oSZBNxozZKk%mlB{inOzC-{wD6=*UpY@PC34ggwdtu9$NIa1-s5FImzNPr z*Uu3BGQyc@)t4c&qaZ6C+cE2;c^1!)RICF%jg6$%F(Mq!>Z_*~vQp)=eTJNq@DKN8 z7U+j+|2v8CsWBR1P5;Gms)BQ_`j%ULtL><8x*}?$b7Z}i(;d<>Os>CCu5P}_CMh|p z6n$gI#ZZid z>k)dwG}bTPU-hbO>HldTVCGAg=<`3umL9Hdwal!lS$q}qtY)%58)_D+?Q%N~rgeZB zZ2?4-bEp|LGG*j>sd+r$M2GyZeV-Psjb=AgsqMkEj8NLdf#F=!ae007^&`K3uxS?S z%7*NM^yEdq@Fe*vH&wm@t12)vPmf-bLQ^9LkChA4no3+>jW0mo;<<(RCk^SosIl(O($XM~c^^{a7eMDH}-K}rs z3DNV^nc3-9gR1I3iIl@?4K@w0G7e{wYZmo?J7r(F{X9Z2wehU4PJeQ0enxLOWY0}a zlXL%I`!jRzoPu$3{4b*}3>8+{tvux#nGZ1|t2*~zx$!K!x7pSAm!pgHP)fKUH!UP* z{8ERFA39hz0)_aJFv@xq#Pn6)*IXj{%IBTJN+(JyH>>J{yI8TZ=vCQ0W*VzLoT*%P zHHR`)Eqv7|)gS#-u3bK4ns4i++p4NAP0p@mkIdm>S5+8V70Q(@oBx5#%#qk@r*$Az zRoPZZ?D7h%PkXUWN>}O;oSLpQUccNi3!wG!uyPa^_NpdCN?|`%xeT!kUAJpcj=u@0 zDlR*mZLJI1^r|AIWl5ESt8Akbl+!=6%H5C@Ho`HAJsa@Wy1M=4A{Uuk4Mf048HZZb&k6LzBW% zo&R@QIH%D3h4AwV#*Yu>R_ynYk<&K++kJ1fGb|UdRagtk^MYxz^W_xTTfy@A70J#G zx=Z90(y?QD_V8ETnh9gZ$u)Qr$H-}^@I;+0vIyi9j>!mR$rn|~)3I_QI6pTWCFB2l zWv6tDUfn4@s;uyop8mJw)+%WAg>0AfY=Shl$0=2JfQhQXRG)Hs)y+7gn)#>K?D(xP z9m_N5;oLF#lXA4kXyZ@mRaH(8=_UWFGiP%hZSGdy^#8y1zV*3{9M{)>ia+d!-8!{S zWINAqj$>zBVlT%2-Vh1W6DC zK@dnn4L=={N{&lyEMlDSrjzNTH1?*bl$Dbx+2&)0xu`#B`S5qJ(FNj=q;RIE7JT69LHAGMRPtpU(IGb^C={B%%;uET)wmhs3LYqOra@vCLx-@ z6b$u&HsSfQeS`w9qYazP@Y5B1r03+M!qzMrUbueK2RS#G68JcOZEd-fwOV*IC*M=qKXK(hna;orUYV`PRQvVf zvWpq^@Zl%&y%TisoSW2&kovA)hpX%RDLde38NS~ymSjP{m>*A@b}5shrN`56)%d5Y zv(xutY#&a4GadiAs_aP-RoP5)A}XR*eqT*Wcq_wk_a25N{iv>W%oI{UbYuCDb?CBe z+KP+l<9RJ(Wq&2zv?K{{_IS5Uksw-9uJLJmG#@n& z3)na@VWF=+H<;3*XpB4eXXs=&2IuS;MNVEB1f z<^5Y1kk+}dx7$ZX9Yg=2^&K)Om@3VP%0&8r#OIcxtwy{%vZ~mbZ=8Wi^J>>SoQug4 z`v|o{CQI(e=ugWc?^g4%^|j;@b6&D;6#Vs?;fOIs;PXcue${jl6sV1g_t2n-3=s|r zFb`d{IbX(}!=h6#wcb?HgI4v9i#Z&nVc42Ie6D9J5Bs!zSB~y(ni|wQM*|0`dt2jt zZrSx#l{M#k%?~JXKq0lRbL$4%=)#b}f`YLQ#$qC!&!}ht9$0nd#pYWm<~?xN(q0b) zFueoN8a$S!fDXkkU+E0Ty_7M6unpb3Wek{M*1zl^V7&tnte`Z(ldcNu%m?~q#!j?Y zcN$i0)edn?8<)-49UH$sN|I16rha=jcOlnUC~+8AR#UQQ>}l%?(g`D~o|HmdF#Ked z+(#&bI@)CGv%j}je1mk%52ER9snZX#{y@Wi#@dT6Ww*pbtQ!j*8`Nr?Y+;(6$)rN#1D*!vMRuy=iXF){D{dh`8CgW?` z;RvY^&o3QC2Gjd!QXTNr3x_`Oa;Vt+VtgXeAa=)B1AhR1H?lvpasO$Ayk_HJtgpX* zL!D16%g-Z4H)|Bk=@)MX$;D|oJzCFBN$avKG>Oyt<`FJpqKXYmhp+}U_(cbD`rq)A zt}WZ8M@W4{qDZ3f^EPbnkQw)hwKaj2gCs@Zte#rdV6@k7XqEjb=%aP_?`o^a9EGzB ziwfeENOtwiO5DRL%IWXv?|ZniNLYBofsdA71c1rH^ZD_kw(5iwDi8Z~!+&DNw}r3= z6Dz|kc2$$t&&7nsPe@7_~UlOS3I~s9(g1fUjJKK`cb=K{<3?IRn`=@=XS~cv=-{~ zVY~>uIf?j|FY@N)>@nVX`aSC?O>y#HZSmi>t&7Y#tWw8yqdQ~Fp>CzlvE~rhQf^Ik zd%kMmW`k{R4I0`#s6qDPso|YF#(ko5ul05*-o}2ExNOT<9Tm3f>U?QchvaD2jh$M_%(T9Ct;|i^+2#j*M%@ znf#?TnMpHuYtV@U7TtS_xg*OUzZ2iv4eOb1L2ulMqg{p$SeXnX%)XYHY28>tzym31 z?XJ4tjeG+>9*Brd&i-Kkd20I4&WV1JinepACSQE$*6?bDwWm2$a} zDA~@vM#;bi?@^NaWIRgocA9{JXNYl*5o6Dz9pN;cGRDcW>?miUgK?(wU>dgPF+#dR zYaj2)p(O(qJjj%ZwpWA6N;@6uXu^{f6w3DJ(@guaPypN;Tt@|W8TNfC_afQL;}j~jWl1> z*!l9Ry3sH)5arkMuA+VOe0rS$`HIJe_1CK|`cOEC?9^?%NbRL_1a)2AOy~4!UjhO$ z!ncT0gKgyoj`-vNyQixVW+Sc&n@md^9cGDnQ)#= ze;$J{zCh)e$jmu-GmpqjAAoXr`mf(Zp4bWJS_N~rvj?JwVsmvXb}e+rBWppK5!OOE zQ@$3KrgbflJA-S1P3JNG3hV84o>)+TK${7MleQ(-edbYaN!nl^%k~H)x`basG5c5+w`;)jEz>#mtR9y$H+)YDo9t%Y38Dw3QGGh# zo>_Ldy%(jh!8$7YHGo9FcEWyz`(Ub$Lvti+6Y$C1Fa-zEYMJ>Fp3ofPWFzc8YsZd<6+NzY#t`{224eUQm10Z^}vCc*Go98Bk}@=j=Y$_ zI4coae2LMu8deytMkAcrBI-goeQXqw*x)dTXuZwJ{X!zsvnCLCWo1e5A>)=c6dn!B z`r}eJ6naqVKB#jgO;^-A;}RGZ;EZ7g)2wkz`1YE`XaRSeE=0?(gOXK8^z{H4O5=5D z5v7--Q+(46N-+4O{B*nXV_c#Rb*k)iU+fZsi#t8vnbS<`^xP`dSp#4pp z7|8mdeBm{PRcr#yCCVvH5c$Sagsr%Ci}#{ex6`(>u7&jB1_kDsv&s#}>XN9h1KhW$ zSRIaUfBWoLdNcF#@9(N*xwivN?HTP?crMsJdtZI2W)uMW87_>M=251#Mfzjl20Of>Rmr_*bStnlo(!8I11wcWMPj_HvBulk*d`TFc9=wC4A zK065M7u)ve#7a9Ai&PyC2A9^lygN~W zT@u@gwi@ijCPMrWE`XSYWObM86)u5IXG`??YD`Q61tf{^7vZn~G=bBlka#kQ%_WZ+ zH->WYkf4F9SJiBU(1T7;=&YvWX*EL-gHS5)E^XsOGf)DLo^o7+UNH6Qo8}qwJP?TO zp6V2;Fk2ULwQ71Qv!Kt`UZZMst7L~bG}0fO@|ETOJ}9%I`(VQL*az!!hw^tHc$(4s zYPby$*KG>xF<)P$kPG`@Jx=QbBt1apybsD@9R=$wlMZ`onQxSI%Z&!~cuiW&n@XOm z-pMDc-$|#8nOuG;h%-&DoX}D@9rOl3^-wwHhy_TrNWsG8D$QzPYP~9e z8JkNAmWhZS^&FQ(2#@k;4`vae?jjBgDIz{XuphK{2iHg%h^`^*jNTW>{6#gOD|3!0 z=6&xHp?g@UCJA1i5dvKDVEpKC*N>vpFd`Hg2@}EPjvx^rr+s9tN(MxZogZzsj@(#4 zXLna;gjf3dzDu0Z3%#swZf4aP0w2+_)mym{W?2Qoi~W$(7N;y6w{8sLUK&U+g%$eo zn-Q~NhSuQ+Ip8@bE>S=JQ2a(i0g@v@90R$RQ8c_7dWvtp)>7P8xu1HY#jR`Nz1j=c zVY4bWooXXpJnl9f=i)m3t=uaIhDV1KcEeP>czQc&u*M2_AKrvI9)V+(k=Ww9&P`~> zs`23aM~|5U;gIxx7J+*rH)P}uaTJkE*tBA_*f*@`NNmfv8&)-Z zLo@rGRr>V$XkbGw(zZgyA*`ohDHS3DHOjijnc?!zT^&~~ey*yoVx4xrx>l3{BgM4TL)fG?i(YQh8) zC-ZkVxOpGlme&X&Q@bZO6*nO$tBs(twpGAVRbuVW) zTSqSvk5@XKyukw#xn?|QFRl?c2&O0>&uYF7qLzB>h6z!Dm_B^*T2D065SVt3_$W}a z$uJ)D25zn9)Sg()D6zlJx7=bJ_~9B0P5h;NzfdGq@%~jI`g7Sv*BTHvw*R)u5SG zC-~UnfxvQpJ6_~BGa-QDylCdiBZ>5c&f@GX>0_i5gX~HEccW=-YA|X%TTw$so1~hq zBEw1AX1akI%z187DW?qap4>SMIyvUVdwv&)1pXYrhKD33HaZnG;eC1Zh-)v3JF^SH zY4sMn!|A;T>`aH)+>ITg`R8jC`yh2p07GT32AZAGszrL$fG2W@SkyCHLicy*9J7s;MkjzCEIgYF^MVr~JZiH*|UCtFS8~*NJzZ ze64jx@@!2te1;3vh>Lu^E?Xq+_(vKgoj3eVDyl2SC)ykr&!Q>O(enGh4t3< zidPBdit5U%q;+%}iS1Qd+s?E-?)^hX_!V?5)-{%g+_db(y^dr+zOE7%%Y|GO zg$yJ`7JB$e7EU)MkI`8Habl4q;7 zc{ZC~6Ako#ZLhd5M|Jycr~IoSp#Ixdf#{thByV94gt2Jz`jJiry`L{@z6!#&`_I$C zi=sIAczB8~7X`U;f8o!2Z_4qwz|*pus<^G|JLIpqxj}{!@=U^gRdt91H=-*}o6DaE z1JHMi6ei^RG?Uu9MPZ1?>o((-4t3y{X37@jCVmO-eaKEmS(>43%_;O@%+aE6Kc zwCINcNzmw*^{AeKZl-GRW>GFNgR}CthhibT(FXH+`AT4x($m2UI{%;H?1;n8hC-+Nk30bFbn8Iew?rMl}cfbkjJ+Iqb^ z&kA*|g9}^Hxk>e=tK@VhH9=i(x+-Bi{t&8E3D+w&ra%tK{xWzKEbI?yxV`;gHIora zeW)(6>t3$fTix#*W)#^UK-P;(g>+a+IG;v?ed_Qc>T}sl=>?YGJxE8bz3Wqib;Gs4 zluc0MjffT$44=zP@A~@!Rplr-o=}v53_y*Z;5WhS6YU|QI=rJKWhrn+S~G!WFg+sD znBB3D!K2Mr2q6n&zKuPH`NLWJSS?r0oDH9ej_il?9W}S6zCVv z;Jy$L)Yee!`Z`ab;75c02dYEsSue?>2EVrs^l~U7jv#^LFPIah|AVmqiESq);`=Jq zlL>-)Z58i^?@x};_n#N^a>n_|W-sSAO@aPA_Mz#g3r)Wn`tSeu{A&0xAKgNP)T{QY zZ11+0_~&A^#J%Rh7bMi8orz5%X-HVKu1vz}3>YblWPgbfICl(jVY8a!6^Q0D<(xJL z%}x7uItOKF>Aw>Ai1Z&@2i|wmT#9@tOm~gc(Z0I4CqwZ4Y+dJ4J02P8X0|5HVP+zP zUW%`qtt~VYNCpQFe=mv?nxH-mNHaIjQ$U58wgbZ(reyf**{Qz9`K!%McSK?L$R)J> z+jeO~?;W(AW=-9<;MJ_@TdGzv!)eNOSRm2l0>rsNv6&+%;TWKRE@`&3hE`e=s0A7Ly8bH{1`!hWfrU0lz1z%%WwV8}eU z!IM2P%tY0K>zc4N4M7l9GgJofWarlBw}t@H-|1@r8L_Bk1A<1T65LcSOEHsst!wci zY+aO!GYg?^z8x?71PGcKXdc{p)BDxExDx2wz9cGy---ZJ_^?fHhA#n_z~??Y%8l$tEN=4# zFg;fMlr-6`D~h0%Xjk7}^{|u?cO>ha zV_Vo;3y1xJ6e3DRsxm}!z)&eDeSURrJ?KfrO%TE_xcS|k=}!u7T*ErgR*V@XVdgzG z1y^?W9^HfCWXr+J;UtXHQ}S8uY1dq}_kf6`;*b!1J?Q*6k|Y6(!T6r-{%^nQDHUYoauzabP;|#zL2jbMTry^bZ=Z zN7D7ez(N}A08=2h^zaLtlp`w_eUfz~o#jZbJ7(tARLVOdq`SI+OARzkP^R5weYvlj zSVfn~O6iqg*bscg`l``Gl6?klVmJZp#YYOW@a4u#4dgVCiCVoam59cg7GI`o@RlT) zUM#^1U%QTUB*LZF+eSj%AP$__y_8yZZ|Iz94(J)A>|ZkJaSh$7!!W-wARcZ)Af8uW zZKQ@6hD5Zc8f9qhPz*Q)D&w?5@6wUWNi~9vs=zutRadGkJXRRJ^R#kQ-SXDK_j=*P z9T{`{GS`nUH_(8@PTe{3W#RN(B+Ri6ilb;%%9IeJxNO;L!wT>>=e zZ%>1Fld@)q)f`IgJgkMx9jjyF4eqxh(%)AUQbv42aAZO>yt5P7%;8&*ZBzT#Kh|_^ zqY;5lIHTZI=FpX!oBSpocfp56Ls?SSZCf#JRWwsuR*v+ZD*d}$+&Xqa#0bL46~mTm z4lhkgqyRN+mjhF(Dtb`EI-bl(Xm^Qeh?J3DkoEXhfdUz$gJc(GaBzac?k;Q-$Y`KDM zd`&NLh_zr@T)_@n6t_qKbTJ{*0xlHf$Gg>JQZ@X}>m9ha(e-Y_lWk{$+@*m@%X@H& zGN3*GfN1}BH@3@(ALHjjyPVVx2f+Bn((XQ=Kb;PDq1;T)LJ+&R zn;!u7VE=y`^m;d+i3@J|^iD5L2D!?~W4%M#ET%W49Ygm(JckO874#dz_2Z?v_|s}K z<4WCr33aOKtiDlfWOah1BA~apx~WK}7uaZ5)kSkYJYUUbOkWBKDNwY{n6UQ986ZTG z_bj!H$WeDEmHydQ=H;w3JA5jjosLGHh%sr#N<8%$+C1OKrW z2fKtl=Hdb83{G&$i0*?!djvU6#KU` zQo=CK2OnqwnDo1W_#&}{>a!he@w?E}TkB?Hs*gqx-`BM(`(Jh`B zHQRdjx%y){(3yX|6wFUKx9=$)!k;Hk@+W;HgpKFJO-D-xC_GDRy!_9y_4>)E-AYfH zqZ`!&vfJxZ=ICS&aMwoE!(UICqgl(X8h6$4n;6Zrj@xWE!+L*O>J4<(|Cr3tWN3g# z(>3`L@L5Ffb#vE@8Q8={V=|d-Ht$vzdSlGa)eD)5_|jjGkZI(&-}=f>>O+u$3VaAi z{F^iFXE{@Mr?EtORyOVBEByb>VN0_Q+PqwT*5t%TQ8}tdFp=>of{4StMj-M=pI!Pg z&EQ;ZEz{Pj6ybSFxJuEG;PHvY+2yM=ydO^Q!Uf8VJJ4-}E6k{wL&r39etXdjqCNRW zFge26O)%HOQ})y@h6izjnZC`lr?OykW9uSpRU#jxPJj>iV=`TmG)kmN%kCK&*u;*J zf^=jHTtyNNfvHMjYFy(5n5t+l&&k*1DOY1}!bsmkg{_n-5>f-J#?&qf<9b+94?>qp zVe3=_v0F(Bsz>`+1DI(mo$A88;?8OFo-SUO+rB_bhb%eI`$9gxh$wgWN$AD&Q0ix`m@QDYJo#7)Yjv%4`Z7K2{LK3hZcfy2ZKnG1(ZsDBD^O+g}fXw3#K)p%QJf zMi+Bi`p?Q=)lJ%EkfiA;y%FbHLZl7E*5C{+*xWhy4uvv&N^b=BSNLjqD8-?dZj;kjdv~jl>Eg_ ztm^G*;mFdqrwQ=f?JNXq$!sa?9iUs6+T|(v3v9UCrFkNbAbk(!v71R0;}1Nv@u%c3 ztQ9od<_X82l>DVTFZ@qT>B7CsMc;qQVBu#c*^W=#*`dSb9odI_-_FyEgA+U)iqfDw zWw02j4I)f%VD0a0j1d0}Cx^mQ7JyL~4)in%L>xtbO-HkT$^!6|1pra>q4mMrl>*y# zQTd;;05nbc5JrI4Nb^o0ZW{z&@(Ms-llON|SpY_e5-+Jyg3#bkSpb|IHBVUpH0#4t z766kppg#!ze_9rRFqh-!w)VFZTF}VXA~) ztfamVUgb*OaFXFvom`FF_cz(Bm$@2y982YU+TQ2KP^lU(vn9FK_rIIod=Cfv9L*v{ zSg!fOnk=EkV27nY+egm*Biu?w^HeCD$ zuwz7i_rYxN>>cAYOL03yGH~7y9Uuoz-OX}%5Qo5x8=eC*&E?7|h9G22k_Pfr+rj0~ zB8(y22Tw5udds`eZ@umMp*SSOLmys*FQLdm9RH*bj&8aT&#@1Ljxp;%Ff{MGK*fF7 zQsJ$8;c+PxhOh2}55iOTf%0pEJ^=O9%8a%#Hp|5ld+_WSkI4vY3YZ*4HUgA;FXF#7 z;Bt4clMd0kS>5i*)MoIRu&SF?F3Ig_Gf<+-8R=vy<|rE6PJZNK*qm(0Ly`}3NPP?) z2f|xl2UAT!?$!gkvFt)2)F~;nT*bo1eRbj$s#|3ObC*Ed$*Hk zx9|ngPWTcjY9MftCt2OSm0Ale9`@u1u@*EbI3jwlSIcERzoKyVYcZxoL4>dzEfL=5 z9iv@~(R3cKgF@JZ=l+iLzI!sTNgY{SEchaD>qNeT+^-ZXA+=UIr*U1V#Ew0va?;h2 z3q2X%MMCE#f{SI7mO?+?h;Y7MlUChbX}Flq=ZFUxXc=zv>iLYozOI98Uk$eb@;uuV zmS!B`o~mYDC39E;2eO|~UjzDJC(WsDKU;)pUJo^c4%PI5>9!|Rn;BSzNi8&?NC7w- zahe!Y?|)q5o|&)QM{OqD)viztdxYfe<`eGD)-$v ztvhuRW`G!h47L zEj5F~C=}f!%hsE4(26jGeo6}9Y74nF>B5BTGFj%V&7j<0dhXG-7tk9#A2PR21E`+0 z>O$j znsVH=ax|w0f0oX}+iG-Y$jp^p%wRYeev)EWZO2Be4IO=3;Mrj7Ugc6bR-<{O~f#l&a*^idPN*p@V!Jw@-v_(^UITWF;S_xfaxb0r+;6_xXD zk&GkeD@-P6#HK_wpUnkbhuceAX21{$^=>BICIQ%qajvS-?VK_Sb7jYzqqVL~lu}$H zfQ#zp!M0-L2gbkq<_HC2c0`mVWH1>qM^KY8{EZX1!-ddxeV{ymyx($@oVl=0bM~Q^ zCR;=Ehv2z9G)m9|P34vWqqKf_Vn#t^dz=}ls%eZflPka?V?0>@hzkQ zp-8nAaTw0f6masYsbE!b^8m@;@*RQwM@3Vy(RC~?ja%fYH7e*0Pw(f;nvIiN1)4_q zc9=zB#JNK51D)V4;Jrs&OKGTGHke>~QAD(fg!x!4;5A@u09##9S^|;lcM6kPH`CvE z)+MX?CV^Q4m}4G;cmLciu79JH5OCYEe;>~376a6MxL8#4t>W;o82)rHC@^>Btoups z{oOC&F8n@btL29ZwvyGH0PKg)loaOx!STn{H~LP=7LXAPpj<+qE}IGonJQR+kPBz= z0FFu(4bwGDc27uD!lmn4{-o)nzhLe~d&k3%)r5b3I(ct~5{34cxmZ5@AiLjb^`)Y0 z6}*&=hs4Edl`4*h)K{cLK}sMoyB-fuH1PrEZVLc(!*W*MRotlelbGOwb5esvnJR*l z8=3PVy1!NM|4bl8EIBt=n!iFkNLoi%CMjD8r@JSl>1kar5atSGo)3?{fd8(L0q_p& z8I%zl{sem&US~S82X8n_QQ6NiCI*7o>Z(4Pk0sj{+014YU68p|sX=Cco-O&ClJ}YK z^tZEq&WEQpL@I#CjynTShf}2cEC@i(b(WwO0$Kwcm+NskyDaC`Ea)D7@{xke2yzHj zL-LSe)(suVPkk~ML67MoAo2F4?Z|M<`S1!(J(#EL;K%ZxaDg%Zu|i<&`4V?N*gqHI z%cAuEQa5*yYa_7G=mB~3urLvW8$+rZn>p8k1)Pg}=W7?sGp<2y-_ch|LlS*HgfSDh zomGQ17!?vbq&{L&y+iZ)&@sh^MY{0?6^_1*DqbfMDq^Cua*n(YM%nGUeT+M_r~)U{ zioebmE5yNUkaj3h_65wB9PYCfhm>${YP#mNuy@Q9re{DD0u1u8`qv6uV?>|3t`4z= z6C=TS$iksMU)^6PV9nkaOabL_h?)kcLRMp0*!!lg`zYgEeh7ThRqA+tbQMNehsdE~ zmU*I@S!)4-wD2NSSGSl_a}(In=HAhCU%Sgd?;D*fC=*wNyk|~G`89`>xSmrO-RyTw z>)sc1Gd_=n07h6u?f!~mM?FINr^K>A*^yjB1l4}2uAO_jqo1z+&*c%hNDjj_sYO#W zPVS-eeCTnNUljLfcz9kdk%;aNqI`5)UQcJ!<%4Y0v}K;Nr*aaAcK2C%1Nl6xMr4v9 zJp#PM8hwTEpZ{7xE0Ym$ARx-25V#*ufsaAOLB2SZW3V;64Hw{deNKcGc} z$^yv+F{HllK5f> z%9Uu21c8>Ye-_P>T7#xrHT2%As3@x={lRKI_E4w^82;r$@r8ZN+xY_cmXl(13rSKG zZSa$*qOxLw^ELz6FE`k{!T6}NM6#;}id#V)qoYVcX}gMl(U*tW7)ODdX$u)$kehq~ zE-K3LxZnpe0Ab2-LIh1Cus-$I`SgW%o2{Z8k<`Wil|meQq>s>%F#I^~AlgPth~-tA z^FehBOpb-Yr)52=(IfeEQ%MFZsNrOuNPPZWHdC^!xJ6%JoGBmRtL%KlxvXj!srlGc zh^;rOe6n!#LE`#xdsQ2iiolsE>>!ry!yFy6zd>YiGpn!5S%F<~1yXF0Le30|8MG-d z!g$s`U~|Xp@IN?%OcY{L)mZ)DA7+nU6=~`?shA@Q z(8@QXLC$Ezwy+3VqOnv9co4V1lyOvr*1u(I^A+KUvx7WyH(+VhS&9UBI2)?B{`*X1yWUr zUUZur$V^XWb$$0~;i9;2Z^$gB)$|uH*elzkbY}TJK!1IxtDUu&#hD`xE z-$C-KnXBHDu8J)@4Wruy*TU)v#uZLH4Yrl0p5r7aF!aUFEA3C-eCdZ1EKsgMzkybN zvp`v>_<)RK!Lbm*v5?an1UQ*6%!)dN(1(FYMJ=@@GSKL`e3%nSL;udEb1 Date: Mon, 28 Mar 2016 07:51:44 -0400 Subject: [PATCH 051/156] Added support for non-h264 compressors. First addition: Apple ProRes. Some rearrangement internally of configuration interfaces, compressor classes and how libavformat muxers are created. Quicktime MOV muxing may still have some quirks... --- .../xcschemes/CSAVFCapturePlugin.xcscheme | 2 +- .../xcschemes/CSDesktopCapturePlugin.xcscheme | 2 +- .../xcschemes/CSImageCapturePlugin.xcscheme | 2 +- .../xcschemes/CSMovieCapturePlugin.xcscheme | 2 +- .../xcschemes/CSQTCapturePlugin.xcscheme | 2 +- .../xcschemes/CSSyphonCapturePlugin.xcscheme | 2 +- .../xcschemes/CSTextCapturePlugin.xcscheme | 2 +- .../xcschemes/CSWindowCapturePlugin.xcscheme | 2 +- CocoaSplit.xcodeproj/project.pbxproj | 50 +- CocoaSplit/CaptureController.h | 3 +- CocoaSplit/CaptureController.m | 22 +- CocoaSplit/Compressor/AppleProResCompressor.h | 33 + CocoaSplit/Compressor/AppleProResCompressor.m | 315 ++++++++++ CocoaSplit/Compressor/AppleVTCompressor.h | 2 +- CocoaSplit/Compressor/AppleVTCompressor.m | 6 + CocoaSplit/Compressor/CompressorBase.h | 7 +- CocoaSplit/Compressor/CompressorBase.m | 8 + .../{h264Compressor.h => VideoCompressor.h} | 8 +- CocoaSplit/Compressor/x264Compressor.h | 2 +- CocoaSplit/Compressor/x264Compressor.m | 5 + CocoaSplit/ControllerProtocol.h | 4 +- CocoaSplit/FFMpegTask.h | 4 + CocoaSplit/FFMpegTask.m | 52 +- .../CSAppleH264CompressorViewController.h | 19 + .../CSAppleH264CompressorViewController.m | 23 + .../CSAppleH264CompressorViewController.xib | 138 +++++ .../CSAppleProResCompressorViewController.h | 19 + .../CSAppleProResCompressorViewController.m | 32 + .../CSAppleProResCompressorViewController.xib | 56 ++ .../CSCompressorViewControllerProtocol.h | 17 + .../Interface/CSNewOutputWindowController.h | 2 +- .../Interface/CSNewOutputWindowController.m | 17 +- .../Interface/CSNewOutputWindowController.xib | 19 +- .../CSx264CompressorViewController.h | 19 + .../CSx264CompressorViewController.m | 24 + .../CSx264CompressorViewController.xib | 253 ++++++++ .../Interface/CompressionSettingsPanel.xib | 583 +----------------- .../CompressionSettingsPanelController.h | 9 +- .../CompressionSettingsPanelController.m | 34 +- CocoaSplit/OutputDestination.h | 4 +- CocoaSplit/OutputDestination.m | 8 +- CocoaSplit/SourceLayout.m | 9 +- CocoaSplit/en.lproj/MainMenu.xib | 104 +--- .../xcschemes/CSChromaKey.xcscheme | 2 +- .../xcschemes/TextureWrapPlugin.xcscheme | 2 +- .../CSFileStreamServicePlugin.xcscheme | 2 +- .../FileStreamService.h | 2 +- .../FileStreamServiceViewController.xib | 9 +- .../CSTwitchStreamServicePlugin.xcscheme | 2 +- 49 files changed, 1205 insertions(+), 740 deletions(-) create mode 100644 CocoaSplit/Compressor/AppleProResCompressor.h create mode 100644 CocoaSplit/Compressor/AppleProResCompressor.m rename CocoaSplit/Compressor/{h264Compressor.h => VideoCompressor.h} (80%) create mode 100644 CocoaSplit/Interface/CSAppleH264CompressorViewController.h create mode 100644 CocoaSplit/Interface/CSAppleH264CompressorViewController.m create mode 100644 CocoaSplit/Interface/CSAppleH264CompressorViewController.xib create mode 100644 CocoaSplit/Interface/CSAppleProResCompressorViewController.h create mode 100644 CocoaSplit/Interface/CSAppleProResCompressorViewController.m create mode 100644 CocoaSplit/Interface/CSAppleProResCompressorViewController.xib create mode 100644 CocoaSplit/Interface/CSCompressorViewControllerProtocol.h create mode 100644 CocoaSplit/Interface/CSx264CompressorViewController.h create mode 100644 CocoaSplit/Interface/CSx264CompressorViewController.m create mode 100644 CocoaSplit/Interface/CSx264CompressorViewController.xib diff --git a/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme b/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme index 09ca5b04..4dba6543 100644 --- a/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme +++ b/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme @@ -1,6 +1,6 @@ defaultCompressor = self.compressors[@"default"]; + id defaultCompressor = self.compressors[@"default"]; if (defaultCompressor) { [self.compressors removeObjectForKey:@"default"]; @@ -1174,6 +1174,16 @@ self.compressors[@"AppleVT"] = newCompressor; [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorAdded object:newCompressor]; } + + if (!self.compressors[@"AppleProRes"]) + { + AppleProResCompressor *newCompressor = [[AppleProResCompressor alloc] init]; + newCompressor.name = @"AppleProRes".mutableCopy; + self.compressors[@"AppleProRes"] = newCompressor; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorAdded object:newCompressor]; + + + } } @@ -1599,7 +1609,7 @@ for (id cKey in self.compressors) { - id tmpcomp = self.compressors[cKey]; + id tmpcomp = self.compressors[cKey]; tmpcomp.settingsController = self; } @@ -1698,7 +1708,7 @@ for (id cKey in self.compressors) { - id ctmp = self.compressors[cKey]; + id ctmp = self.compressors[cKey]; if (ctmp) { [ctmp reset]; @@ -1796,7 +1806,7 @@ for(id cKey in self.compressors) { - id compressor; + id compressor; compressor = self.compressors[cKey]; [compressor addAudioData:sampleBuffer]; @@ -2191,7 +2201,7 @@ newFrameData.frameTime = _frame_time; newFrameData.videoFrame = videoFrame; - id compressor; + id compressor; compressor = self.compressors[cKey]; [compressor compressFrame:newFrameData]; diff --git a/CocoaSplit/Compressor/AppleProResCompressor.h b/CocoaSplit/Compressor/AppleProResCompressor.h new file mode 100644 index 00000000..fc39314f --- /dev/null +++ b/CocoaSplit/Compressor/AppleProResCompressor.h @@ -0,0 +1,33 @@ +// +// AppleProResCompressor.h +// CocoaSplit +// +// Created by Zakk on 3/27/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CaptureController.h" +#import "CompressorBase.h" + +#import +#import + +@interface AppleProResCompressor : CompressorBase +{ + + VTCompressionSessionRef _compression_session; + VTPixelTransferSessionRef _vtpt_ref; + +} + + +//@property (strong) id settingsController; +//@property (strong) id outputDelegate; + +@property (strong) NSNumber *proResType; + + +-(bool)compressFrame:(CapturedFrameData *)frameData; + +@end diff --git a/CocoaSplit/Compressor/AppleProResCompressor.m b/CocoaSplit/Compressor/AppleProResCompressor.m new file mode 100644 index 00000000..7d3d05fa --- /dev/null +++ b/CocoaSplit/Compressor/AppleProResCompressor.m @@ -0,0 +1,315 @@ +// +// AppleProResCompressor.m +// CocoaSplit +// +// Created by Zakk on 3/27/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "AppleProResCompressor.h" +#import "OutputDestination.h" +#import "CSAppleProResCompressorViewController.h" + +@implementation AppleProResCompressor + +- (id)copyWithZone:(NSZone *)zone +{ + AppleProResCompressor *copy = [[[self class] allocWithZone:zone] init]; + + copy.settingsController = self.settingsController; + + copy.isNew = self.isNew; + + copy.name = self.name; + + copy.compressorType = self.compressorType; + + copy.width = self.width; + copy.height = self.height; + copy.working_width = self.width; + copy.working_height = self.height; + + copy.resolutionOption = self.resolutionOption; + + copy.proResType = self.proResType; + + return copy; +} + + +-(void) encodeWithCoder:(NSCoder *)aCoder +{ + + + [aCoder encodeObject:self.name forKey:@"name"]; + [aCoder encodeInteger:self.width forKey:@"videoWidth"]; + [aCoder encodeInteger:self.height forKey:@"videoHeight"]; + + [aCoder encodeObject:self.resolutionOption forKey:@"resolutionOption"]; + [aCoder encodeObject:self.proResType forKey:@"proResType"]; + +} + +-(id) initWithCoder:(NSCoder *)aDecoder +{ + if (self = [self init]) + { + self.name = [aDecoder decodeObjectForKey:@"name"]; + self.width = (int)[aDecoder decodeIntegerForKey:@"videoWidth"]; + self.height = (int)[aDecoder decodeIntegerForKey:@"videoHeight"]; + if ([aDecoder containsValueForKey:@"resolutionOption"]) + { + self.resolutionOption = [aDecoder decodeObjectForKey:@"resolutionOption"]; + } + + self.proResType = [aDecoder decodeObjectForKey:@"proResType"]; + + if (!self.proResType) + { + self.proResType = @(kCMVideoCodecType_AppleProRes422); + + } + + } + + return self; +} + + +-(id)init +{ + if (self = [super init]) + { + + + + self.compressorType = @"AppleProResCompressor"; + self.codec_id = AV_CODEC_ID_PRORES; + self.proResType = @(kCMVideoCodecType_AppleProRes422); + } + + return self; +} + + +-(void) reset +{ + + + self.errored = NO; + VTCompressionSessionInvalidate(_compression_session); + if (_compression_session) + { + CFRelease(_compression_session); + } + + _compression_session = nil; + +} + + + +- (void) dealloc +{ + [self reset]; +} + + + +-(NSString *)description +{ + + return @"Apple ProRes Compressor"; + +} + + +void __ProResPixelBufferRelease( void *releaseRefCon, const void *baseAddress ) +{ + free((int *)baseAddress); +} + + + +-(bool)compressFrame:(CapturedFrameData *)frameData +{ + + + if (![self hasOutputs]) + { + return NO; + } + + if (!_compression_session) + { + + if (![self setupCompressor:frameData.videoFrame]) + { + return NO; + } + return NO; + } + + + + CFMutableDictionaryRef frameProperties; + + /* + if (isKeyFrame) + { + + frameProperties = CFDictionaryCreateMutable(NULL, 0, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionaryAddValue(frameProperties, kVTEncodeFrameOptionKey_ForceKeyFrame, kCFBooleanTrue); + } else { + */ + frameProperties = NULL; + //} + + if (!_vtpt_ref) + { + VTPixelTransferSessionCreate(kCFAllocatorDefault, &_vtpt_ref); + VTSessionSetProperty(_vtpt_ref, kVTPixelTransferPropertyKey_ScalingMode, kVTScalingMode_Letterbox); + } + CVPixelBufferRef converted_frame; + + CVImageBufferRef imageBuffer = frameData.videoFrame; + CVPixelBufferRetain(imageBuffer); + + CVPixelBufferCreate(kCFAllocatorDefault, self.working_width, self.working_height, kCVPixelFormatType_420YpCbCr8Planar, 0, &converted_frame); + + VTPixelTransferSessionTransferImage(_vtpt_ref, imageBuffer, converted_frame); + + //set it to nil since this is our private copy and this will force the frameData instance to release the video data + + frameData.videoFrame = nil; + frameData.encoderData = converted_frame; + + + CVPixelBufferRelease(imageBuffer); + + [self setAudioData:frameData syncObj:self]; + + VTCompressionSessionEncodeFrame(_compression_session, converted_frame, frameData.videoPTS, frameData.videoDuration, frameProperties, (__bridge_retained void *)(frameData), NULL); + + if (frameProperties) + { + CFRelease(frameProperties); + } + + + return YES; +} + + + + +- (bool)setupCompressor:(CVPixelBufferRef)videoFrame +{ + OSStatus status; + + if (!self.settingsController) + { + return NO; + } + + [self setupResolution:videoFrame]; + + if (!self.working_height || !self.working_width) + { + self.errored = YES; + return NO; + } + + NSDictionary *encoderSpec = @{ + }; + + _compression_session = NULL; + NSLog(@"PRORES TYPE %@", self.proResType); + + status = VTCompressionSessionCreate(NULL, self.working_width, self.working_height, self.proResType.intValue, (__bridge CFDictionaryRef)encoderSpec, NULL, NULL, __ProResVideoCompressorReceiveFrame, (__bridge void *)self, &_compression_session); + + //CFDictionaryRef props; + //VTCompressionSessionCopySupportedPropertyDictionary(_compression_session, &props); + + if (status != noErr || !_compression_session) + { + NSLog(@"COMPRESSOR SETUP ERROR"); + self.errored = YES; + return NO; + } + + _audioBuffer = [[NSMutableArray alloc] init]; + return YES; + +} + + +void __ProResVideoCompressorReceiveFrame(void *VTref, void *VTFrameRef, OSStatus status, VTEncodeInfoFlags infoFlags, CMSampleBufferRef sampleBuffer) +{ + + /* + if (VTFrameRef) + { + CVPixelBufferRelease(VTFrameRef); + } + */ + + + //@autoreleasepool { + + + + if(!sampleBuffer) + return; + + + + CFRetain(sampleBuffer); + + CapturedFrameData *frameData; + + + frameData = (__bridge_transfer CapturedFrameData *)(VTFrameRef); + + + if (!frameData) + { + //What? + return; + } + + + CVPixelBufferRelease(frameData.encoderData); + + + //frameData.videoFrame = nil; + frameData.encodedSampleBuffer = sampleBuffer; + + + AppleVTCompressor *selfobj = (__bridge AppleVTCompressor *)VTref; + + + + + for (id dKey in selfobj.outputs) + { + + OutputDestination *dest = selfobj.outputs[dKey]; + + [dest writeEncodedData:frameData]; + + + } + + + CFRelease(sampleBuffer); + //} +} + +-(id )getConfigurationView +{ + return [[CSAppleProResCompressorViewController alloc] init]; +} + + +@end diff --git a/CocoaSplit/Compressor/AppleVTCompressor.h b/CocoaSplit/Compressor/AppleVTCompressor.h index 0a213882..28c7319d 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.h +++ b/CocoaSplit/Compressor/AppleVTCompressor.h @@ -13,7 +13,7 @@ #import #import -@interface AppleVTCompressor : CompressorBase +@interface AppleVTCompressor : CompressorBase { VTCompressionSessionRef _compression_session; diff --git a/CocoaSplit/Compressor/AppleVTCompressor.m b/CocoaSplit/Compressor/AppleVTCompressor.m index f4c5b400..3f5fe38a 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.m +++ b/CocoaSplit/Compressor/AppleVTCompressor.m @@ -8,6 +8,7 @@ #import "AppleVTCompressor.h" #import "OutputDestination.h" +#import "CSAppleH264CompressorViewController.h" OSStatus VTCompressionSessionCopySupportedPropertyDictionary(VTCompressionSessionRef, CFDictionaryRef *); @@ -443,5 +444,10 @@ void VideoCompressorReceiveFrame(void *VTref, void *VTFrameRef, OSStatus status, //} } +-(id )getConfigurationView +{ + return [[CSAppleH264CompressorViewController alloc] init]; +} + @end diff --git a/CocoaSplit/Compressor/CompressorBase.h b/CocoaSplit/Compressor/CompressorBase.h index 4a185bac..002199ab 100644 --- a/CocoaSplit/Compressor/CompressorBase.h +++ b/CocoaSplit/Compressor/CompressorBase.h @@ -7,12 +7,13 @@ // #import -#import "h264Compressor.h" +#import "VideoCompressor.h" +#import "CSCompressorViewControllerProtocol.h" @class captureController; -@interface CompressorBase : NSObject +@interface CompressorBase : NSObject { NSMutableArray *_audioBuffer; } @@ -38,6 +39,7 @@ @property (strong) NSMutableString *name; @property (assign) bool errored; @property (assign) bool active; +@property (assign) enum AVCodecID codec_id; @@ -46,6 +48,7 @@ -(BOOL) setupResolution:(CVImageBufferRef)withFrame; -(void) addAudioData:(CMSampleBufferRef)audioData; -(void) setAudioData:(CapturedFrameData *)forFrame syncObj:(id)syncObj; +-(id )getConfigurationView; diff --git a/CocoaSplit/Compressor/CompressorBase.m b/CocoaSplit/Compressor/CompressorBase.m index f349a669..71980fd0 100644 --- a/CocoaSplit/Compressor/CompressorBase.m +++ b/CocoaSplit/Compressor/CompressorBase.m @@ -26,6 +26,8 @@ self.resolutionOption = @"Use Source"; + self.codec_id = AV_CODEC_ID_H264; + self.outputs = [[NSMutableDictionary alloc] init]; _audioBuffer = [[NSMutableArray alloc] init]; @@ -132,11 +134,13 @@ -(id) initWithCoder:(NSCoder *)aDecoder { + self.codec_id = AV_CODEC_ID_H264; return self; } + -(bool) compressFrame:(CapturedFrameData *)imageBuffer { return YES; @@ -217,6 +221,10 @@ return YES; } +-(id )getConfigurationView +{ + return nil; +} @end diff --git a/CocoaSplit/Compressor/h264Compressor.h b/CocoaSplit/Compressor/VideoCompressor.h similarity index 80% rename from CocoaSplit/Compressor/h264Compressor.h rename to CocoaSplit/Compressor/VideoCompressor.h index 88b44825..ab357e44 100644 --- a/CocoaSplit/Compressor/h264Compressor.h +++ b/CocoaSplit/Compressor/VideoCompressor.h @@ -1,5 +1,5 @@ // -// h264Compressor.h +// VideoCompressor.h // streamOutput // // Created by Zakk on 3/17/13. @@ -9,6 +9,8 @@ #import #import #import "CapturedFrameData.h" +#import "libavformat/avformat.h" +#import "CSCompressorViewControllerProtocol.h" //#import "OutputDestination.h" @@ -18,7 +20,7 @@ @protocol ControllerProtocol; -@protocol h264Compressor +@protocol VideoCompressor //compressFrame is expected to be non-blocking. Create a serial dispatch queue if the underlying compressor //is blocking @@ -40,6 +42,7 @@ @property (strong) NSString *resolutionOption; @property (assign) bool errored; @property (assign) bool active; +@property (assign) enum AVCodecID codec_id; -(void) addOutput:(id)destination; -(void) removeOutput:(id)destination; @@ -47,6 +50,7 @@ -(void) reset; -(bool) validate:(NSError **)therror; -(void) addAudioData:(CMSampleBufferRef)audioData; +-(id )getConfigurationView; diff --git a/CocoaSplit/Compressor/x264Compressor.h b/CocoaSplit/Compressor/x264Compressor.h index e9e04fc4..b2789de4 100644 --- a/CocoaSplit/Compressor/x264Compressor.h +++ b/CocoaSplit/Compressor/x264Compressor.h @@ -11,7 +11,7 @@ #import "libavcodec/avcodec.h" #import "libswscale/swscale.h" #import -#import "h264Compressor.h" +#import "VideoCompressor.h" #import "CaptureController.h" #import #import "CapturedFrameData.h" diff --git a/CocoaSplit/Compressor/x264Compressor.m b/CocoaSplit/Compressor/x264Compressor.m index 7c7d2a36..d41c1588 100644 --- a/CocoaSplit/Compressor/x264Compressor.m +++ b/CocoaSplit/Compressor/x264Compressor.m @@ -9,6 +9,7 @@ #import "x264Compressor.h" #import "OutputDestination.h" #import +#import "CSx264CompressorViewController.h" @@ -562,6 +563,10 @@ [super setNilValueForKey:key]; } +-(id )getConfigurationView +{ + return [[CSx264CompressorViewController alloc] init]; +} @end diff --git a/CocoaSplit/ControllerProtocol.h b/CocoaSplit/ControllerProtocol.h index cbdc7786..cf7244fb 100644 --- a/CocoaSplit/ControllerProtocol.h +++ b/CocoaSplit/ControllerProtocol.h @@ -10,7 +10,7 @@ #import "libavformat/avformat.h" #import "CapturedFrameData.h" #import -#import "h264Compressor.h" +#import "VideoCompressor.h" #import "InputSource.h" @@ -26,7 +26,7 @@ @property (assign) int maxOutputPending; @property (assign) int maxOutputDropped; -@property (strong) id selectedCompressor; +@property (strong) id selectedCompressor; @property (strong) NSMutableDictionary *compressors; diff --git a/CocoaSplit/FFMpegTask.h b/CocoaSplit/FFMpegTask.h index 4ebdc660..50b08656 100644 --- a/CocoaSplit/FFMpegTask.h +++ b/CocoaSplit/FFMpegTask.h @@ -11,6 +11,8 @@ #import "libavformat/avformat.h" #import "CapturedFrameData.h" #import "CaptureController.h" +#import "libavutil/opt.h" + @@ -75,6 +77,8 @@ @property (assign) double output_bitrate; @property (assign) int dropped_frame_count; @property (assign) BOOL errored; +@property (assign) enum AVCodecID video_codec_id; + @property (strong) CaptureController *settingsController; diff --git a/CocoaSplit/FFMpegTask.m b/CocoaSplit/FFMpegTask.m index 782e0b04..69a4ed17 100644 --- a/CocoaSplit/FFMpegTask.m +++ b/CocoaSplit/FFMpegTask.m @@ -278,6 +278,24 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) } } +-(void) setVideoFormatOptions:(AVFormatContext *)ctx +{ + + AVOutputFormat *ofmt = ctx->oformat; + + if (!ofmt) + { + return; + } + + const char *fmt_name = ofmt->name; + + if (!strcasecmp(fmt_name, "mov")) + { + av_opt_set_int(ctx->priv_data, "frag_duration", 10000000, 0); + } +} + -(bool) createAVFormatOut:(CMSampleBufferRef)theBuffer codec_ctx:(AVCodecContext *)codec_ctx { @@ -299,7 +317,10 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) } + [self setVideoFormatOptions:_av_fmt_ctx]; + av_out_fmt = _av_fmt_ctx->oformat; + _av_video_stream = avformat_new_stream(_av_fmt_ctx, 0); if (!_av_video_stream) @@ -312,7 +333,7 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) AVCodecContext *c_ctx = _av_video_stream->codec; c_ctx->codec_type = AVMEDIA_TYPE_VIDEO; - c_ctx->codec_id = AV_CODEC_ID_H264; + c_ctx->codec_id = self.video_codec_id; _av_video_stream->time_base.num = 1000000; _av_video_stream->time_base.den = self.framerate*1000000; @@ -332,8 +353,8 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) a_ctx->codec_type = AVMEDIA_TYPE_AUDIO; a_ctx->codec_id = AV_CODEC_ID_AAC; - _av_audio_stream->time_base.num = 1000000; - _av_audio_stream->time_base.den = self.framerate*1000000; + _av_audio_stream->time_base.num = 100000; + _av_audio_stream->time_base.den = self.framerate*100000; a_ctx->sample_rate = _samplerate; a_ctx->bit_rate = _audio_bitrate; a_ctx->channels = 2; @@ -360,14 +381,16 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) atoms = CMFormatDescriptionGetExtension(fmt, kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms); avccKey = CFSTR("avcC"); - NSLog(@"ATOMS %@", atoms); - avcc_data = CFDictionaryGetValue(atoms, avccKey); - avcc_size = CFDataGetLength(avcc_data); - c_ctx->extradata = malloc(avcc_size); + if (atoms) + { + avcc_data = CFDictionaryGetValue(atoms, avccKey); + avcc_size = CFDataGetLength(avcc_data); + c_ctx->extradata = malloc(avcc_size); - CFDataGetBytes(avcc_data, CFRangeMake(0,avcc_size), c_ctx->extradata); + CFDataGetBytes(avcc_data, CFRangeMake(0,avcc_size), c_ctx->extradata); - c_ctx->extradata_size = (int)avcc_size; + c_ctx->extradata_size = (int)avcc_size; + } } else if (codec_ctx) { self.width = codec_ctx->width; self.height = codec_ctx->height; @@ -536,7 +559,6 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) NSLog(@"INTERLEAVED WRITE FRAME FAILED FOR %@ frame number %lld", self.stream_output, frameData.frameNumber); } - //av_free_packet(p); //av_free(p); _output_framecnt++; @@ -652,6 +674,7 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) pkt.size = (int)buffer_length; + pkt.dts = av_rescale_q(CMSampleBufferGetDecodeTimeStamp(theBuffer).value, (AVRational) {1.0, CMSampleBufferGetDecodeTimeStamp(theBuffer).timescale}, _av_video_stream->time_base); pkt.pts = av_rescale_q(CMSampleBufferGetPresentationTimeStamp(theBuffer).value, (AVRational) {1.0, CMSampleBufferGetPresentationTimeStamp(theBuffer).timescale}, _av_video_stream->time_base); @@ -672,22 +695,23 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) } - + if (av_interleaved_write_frame(_av_fmt_ctx, &pkt) < 0) { NSLog(@"VIDEO WRITE FRAME failed for %@", self.stream_output); //[self stopProcess]; } - + _output_framecnt++; - _output_bytes += pkt.size; + _output_bytes += buffer_length; //CMSampleBufferInvalidate(theBuffer); CFRelease(theBuffer); @synchronized(self) { _pending_frame_count--; - _pending_frame_size -= pkt.size; + _pending_frame_size -= buffer_length; + } }); diff --git a/CocoaSplit/Interface/CSAppleH264CompressorViewController.h b/CocoaSplit/Interface/CSAppleH264CompressorViewController.h new file mode 100644 index 00000000..05f632bb --- /dev/null +++ b/CocoaSplit/Interface/CSAppleH264CompressorViewController.h @@ -0,0 +1,19 @@ +// +// CSAppleH264CompressorViewController.h +// CocoaSplit +// +// Created by Zakk on 3/28/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "AppleVTCompressor.h" +#import "CSCompressorViewControllerProtocol.h" + +@interface CSAppleH264CompressorViewController : NSViewController + +@property (strong) AppleVTCompressor *compressor; +@property (strong) NSObjectController *compressorController; +@property (strong) NSArray *profiles; + +@end diff --git a/CocoaSplit/Interface/CSAppleH264CompressorViewController.m b/CocoaSplit/Interface/CSAppleH264CompressorViewController.m new file mode 100644 index 00000000..34068df7 --- /dev/null +++ b/CocoaSplit/Interface/CSAppleH264CompressorViewController.m @@ -0,0 +1,23 @@ +// +// CSAppleH264CompressorViewController.m +// CocoaSplit +// +// Created by Zakk on 3/28/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSAppleH264CompressorViewController.h" + +@interface CSAppleH264CompressorViewController () + +@end + +@implementation CSAppleH264CompressorViewController + +- (void)viewDidLoad { + self.profiles = @[[NSNull null], @"Baseline", @"Main", @"High"]; + [super viewDidLoad]; + // Do view setup here. +} + +@end diff --git a/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib b/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib new file mode 100644 index 00000000..2a2ed7d9 --- /dev/null +++ b/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CSAppleProResCompressorViewController.h b/CocoaSplit/Interface/CSAppleProResCompressorViewController.h new file mode 100644 index 00000000..460dbff9 --- /dev/null +++ b/CocoaSplit/Interface/CSAppleProResCompressorViewController.h @@ -0,0 +1,19 @@ +// +// CSAppleProResCompressorViewController.h +// CocoaSplit +// +// Created by Zakk on 3/28/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "AppleProResCompressor.h" +#import "CSCompressorViewControllerProtocol.h" + +@interface CSAppleProResCompressorViewController : NSViewController + +@property (strong) NSObjectController *compressorController; + +@property (strong) NSDictionary *compressorTypes; + +@end diff --git a/CocoaSplit/Interface/CSAppleProResCompressorViewController.m b/CocoaSplit/Interface/CSAppleProResCompressorViewController.m new file mode 100644 index 00000000..9c41793d --- /dev/null +++ b/CocoaSplit/Interface/CSAppleProResCompressorViewController.m @@ -0,0 +1,32 @@ +// +// CSAppleProResCompressorViewController.m +// CocoaSplit +// +// Created by Zakk on 3/28/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSAppleProResCompressorViewController.h" + +@interface CSAppleProResCompressorViewController () + +@end + +@implementation CSAppleProResCompressorViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do view setup here. + + self.compressorTypes = @{@"ProRes 4444": @(kCMVideoCodecType_AppleProRes4444), + @"ProRes 422": @(kCMVideoCodecType_AppleProRes422), + @"ProRes 422HQ": @(kCMVideoCodecType_AppleProRes422HQ), + @"ProRes 422LT": @(kCMVideoCodecType_AppleProRes422LT), + @"ProRes 422Proxy": @(kCMVideoCodecType_AppleProRes422Proxy), + }; +} + + + + +@end diff --git a/CocoaSplit/Interface/CSAppleProResCompressorViewController.xib b/CocoaSplit/Interface/CSAppleProResCompressorViewController.xib new file mode 100644 index 00000000..c3c56bd9 --- /dev/null +++ b/CocoaSplit/Interface/CSAppleProResCompressorViewController.xib @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CSCompressorViewControllerProtocol.h b/CocoaSplit/Interface/CSCompressorViewControllerProtocol.h new file mode 100644 index 00000000..232dff17 --- /dev/null +++ b/CocoaSplit/Interface/CSCompressorViewControllerProtocol.h @@ -0,0 +1,17 @@ +// +// CSCompressorViewControllerProtocol.h +// CocoaSplit +// +// Created by Zakk on 3/28/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import + +@protocol CSCompressorViewControllerProtocol + +@property (strong) NSObjectController *compressorController; + + +@end diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.h b/CocoaSplit/Interface/CSNewOutputWindowController.h index 00aaa02b..a603a1a5 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.h +++ b/CocoaSplit/Interface/CSNewOutputWindowController.h @@ -25,7 +25,7 @@ @property (strong) NSString *selectedOutputType; @property (strong) NSObject*streamServiceObject; @property (strong) NSArray *outputTypes; -@property (weak) IBOutlet NSView *serviceConfigView; +@property (strong) IBOutlet NSView *serviceConfigView; @property (strong) NSViewController *pluginViewController; @property (strong) NSMutableDictionary *compressors; @property (strong) CompressionSettingsPanelController *compressionPanelController; diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.m b/CocoaSplit/Interface/CSNewOutputWindowController.m index 47cf2b26..34e803ad 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.m +++ b/CocoaSplit/Interface/CSNewOutputWindowController.m @@ -45,7 +45,7 @@ if (self.outputDestination.compressor_name) { - id oCompressor = self.compressors[self.outputDestination.compressor_name]; + id oCompressor = self.compressors[self.outputDestination.compressor_name]; if (!oCompressor) { self.outputDestination.compressor_name = nil; @@ -62,6 +62,13 @@ -(void)setupServiceView { + + if (!self.serviceConfigView) + { + return; + } + + if (!self.streamServiceObject) { if (self.pluginViewController) @@ -124,7 +131,11 @@ - (void)windowDidLoad { [super windowDidLoad]; - [self setupServiceView]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self setupServiceView]; + + + }); // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. } @@ -147,7 +158,7 @@ - (IBAction)openCompressorEdit:(id)sender { - NSObject *editCompressor; + NSObject *editCompressor; if (!self.outputDestination.compressor_name) { diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.xib b/CocoaSplit/Interface/CSNewOutputWindowController.xib index 5c1ab685..4c40da06 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.xib +++ b/CocoaSplit/Interface/CSNewOutputWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -25,7 +25,6 @@ - @@ -34,7 +33,6 @@ - @@ -54,7 +52,6 @@ - @@ -89,7 +84,6 @@ Gw - @@ -101,11 +95,9 @@ Gw - - @@ -114,7 +106,6 @@ Gw - @@ -123,7 +114,6 @@ Gw - @@ -143,7 +133,6 @@ Gw - @@ -155,7 +144,6 @@ Gw - @@ -175,7 +162,6 @@ Gw - @@ -186,7 +172,6 @@ Gw - diff --git a/CocoaSplit/Interface/CSx264CompressorViewController.h b/CocoaSplit/Interface/CSx264CompressorViewController.h new file mode 100644 index 00000000..7d29a1bb --- /dev/null +++ b/CocoaSplit/Interface/CSx264CompressorViewController.h @@ -0,0 +1,19 @@ +// +// CSx264CompressorViewController.h +// CocoaSplit +// +// Created by Zakk on 3/28/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "x264Compressor.h" +#import "CSCompressorViewControllerProtocol.h" + +@interface CSx264CompressorViewController : NSViewController + + +@property (strong) x264Compressor *compressor; +@property (strong) NSObjectController *compressorController; + +@end diff --git a/CocoaSplit/Interface/CSx264CompressorViewController.m b/CocoaSplit/Interface/CSx264CompressorViewController.m new file mode 100644 index 00000000..d0b5e9f4 --- /dev/null +++ b/CocoaSplit/Interface/CSx264CompressorViewController.m @@ -0,0 +1,24 @@ +// +// CSx264CompressorViewController.m +// CocoaSplit +// +// Created by Zakk on 3/28/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSx264CompressorViewController.h" + +@interface CSx264CompressorViewController () + +@end + +@implementation CSx264CompressorViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do view setup here. +} + + + +@end diff --git a/CocoaSplit/Interface/CSx264CompressorViewController.xib b/CocoaSplit/Interface/CSx264CompressorViewController.xib new file mode 100644 index 00000000..3599ef8c --- /dev/null +++ b/CocoaSplit/Interface/CSx264CompressorViewController.xib @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CompressionSettingsPanel.xib b/CocoaSplit/Interface/CompressionSettingsPanel.xib index a52ee236..3c921cbf 100644 --- a/CocoaSplit/Interface/CompressionSettingsPanel.xib +++ b/CocoaSplit/Interface/CompressionSettingsPanel.xib @@ -1,14 +1,15 @@ - + - + + @@ -25,7 +26,6 @@ - @@ -34,7 +34,6 @@ - @@ -96,7 +92,6 @@ Gw - @@ -108,7 +103,6 @@ Gw - @@ -120,7 +114,6 @@ Gw - @@ -129,7 +122,6 @@ Gw - @@ -153,7 +145,6 @@ Gw - @@ -165,7 +156,6 @@ Gw - @@ -186,550 +175,34 @@ Gw - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - No Value - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - No Value - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - + + + + + + + + + + - + + + NSNegateBoolean + + + - + + + + + + + + + - diff --git a/CocoaSplit/Interface/CompressionSettingsPanelController.h b/CocoaSplit/Interface/CompressionSettingsPanelController.h index 7dbbb633..5148e041 100644 --- a/CocoaSplit/Interface/CompressionSettingsPanelController.h +++ b/CocoaSplit/Interface/CompressionSettingsPanelController.h @@ -7,13 +7,18 @@ // #import -#import "h264Compressor.h" +#import "VideoCompressor.h" +#import "CSCompressorViewControllerProtocol.h" + @interface CompressionSettingsPanelController : NSWindowController +@property (weak) IBOutlet NSView *compressorSettingsView; +@property (strong) NSViewController *compressorViewController; + @property (strong) IBOutlet NSObjectController *compressorObjectController; -@property (strong) id compressor; +@property (strong) id compressor; @property (strong) NSArray *compressorTypes; @property (strong) NSString *selectedCompressorType; @property (strong) NSString *saveProfileName; diff --git a/CocoaSplit/Interface/CompressionSettingsPanelController.m b/CocoaSplit/Interface/CompressionSettingsPanelController.m index 30d76bcd..aa3036a0 100644 --- a/CocoaSplit/Interface/CompressionSettingsPanelController.m +++ b/CocoaSplit/Interface/CompressionSettingsPanelController.m @@ -18,7 +18,7 @@ { if (self = [self initWithWindowNibName:@"CompressionSettingsPanel"]) { - self.compressorTypes = @[@"x264", @"AppleVTCompressor", @"None"]; + self.compressorTypes = @[@"x264", @"AppleVTCompressor", @"AppleProResCompressor", @"None"]; } return self; @@ -26,11 +26,43 @@ - (void)windowDidLoad { [super windowDidLoad]; + [self setupCompressorView]; // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. } +-(void)setupCompressorView +{ + + if (!self.compressorSettingsView) + { + return; + } + + + if (!self.compressor) + { + if (self.compressorViewController) + { + [self.compressorViewController.view removeFromSuperview]; + self.compressorViewController = nil; + } + } else { + id compressorConfigView = [self.compressor getConfigurationView]; + if (compressorConfigView) + { + compressorConfigView.compressorController = self.compressorObjectController; + + [self.compressorSettingsView addSubview:((NSViewController *)compressorConfigView).view]; + + [((NSViewController *)compressorConfigView).view setFrameOrigin:NSMakePoint(0, self.compressorSettingsView.frame.size.height - ((NSViewController *)compressorConfigView).view.frame.size.height)]; + self.compressorViewController = (NSViewController *)compressorConfigView; + } + } +} + + -(void)saveCompressPanel { [self.compressorObjectController commitEditing]; diff --git a/CocoaSplit/OutputDestination.h b/CocoaSplit/OutputDestination.h index 89238d14..cb028cf2 100644 --- a/CocoaSplit/OutputDestination.h +++ b/CocoaSplit/OutputDestination.h @@ -8,7 +8,7 @@ #import #import -#import "h264Compressor.h" +#import "VideoCompressor.h" #import "CaptureController.h" @@ -53,7 +53,7 @@ @property (assign) int dropped_frame_count; @property (assign) double output_framerate; @property (assign) double output_bitrate; -@property (strong) NSObject *compressor; +@property (strong) NSObject *compressor; @property (strong) NSString *compressor_name; diff --git a/CocoaSplit/OutputDestination.m b/CocoaSplit/OutputDestination.m index 678d1df3..11e4dde2 100644 --- a/CocoaSplit/OutputDestination.m +++ b/CocoaSplit/OutputDestination.m @@ -232,7 +232,7 @@ -(void)compressorDeleted:(NSNotification *)notification { - id compressor = notification.object; + id compressor = notification.object; if (self.compressor_name && [self.compressor_name isEqualToString:compressor.name]) { @@ -248,7 +248,7 @@ NSDictionary *infoDict = notification.object; NSString *oldName = infoDict[@"oldName"]; - id compressor = infoDict[@"compressor"]; + id compressor = infoDict[@"compressor"]; if (self.compressor_name && [self.compressor_name isEqualToString:oldName]) { @@ -281,7 +281,7 @@ } */ - + newout.video_codec_id = self.compressor.codec_id; newout.framerate = self.settingsController.captureFPS; newout.stream_output = [self.destination stringByStandardizingPath]; newout.stream_format = self.output_format; @@ -308,7 +308,7 @@ return; } - NSObject *old_compressor = self.compressor; + NSObject *old_compressor = self.compressor; if (self.compressor_name) { diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index e841ce4b..3c0d6ac6 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -32,7 +32,7 @@ _uuidMap = [NSMutableDictionary dictionary]; _animationQueue = dispatch_queue_create("CSAnimationQueue", NULL); - _containedLayouts = [NSMutableArray array]; + _containedLayouts = [[NSMutableArray alloc] init]; _noSceneTransactions = NO; self.rootLayer = [self newRootLayer]; @@ -359,7 +359,7 @@ if ([aDecoder containsValueForKey:@"containedLayouts"]) { - self.containedLayouts = [aDecoder decodeObjectForKey:@"containedLayouts"]; + self.containedLayouts = [[aDecoder decodeObjectForKey:@"containedLayouts"] mutableCopy]; //set live/staging status for each layout } @@ -546,20 +546,21 @@ } //Only run animations that aren't already in the layout - NSMutableArray *runAnimations = [NSMutableArray array]; + NSMutableArray *runAnimations = [[NSMutableArray alloc] init]; for (CSAnimationItem *anim in layout.animationList) { if (![self animationForUUID:anim.uuid] && anim.onLive) { [runAnimations addObject:anim.uuid]; + } } [self.animationList removeAllObjects]; //If an input exists in both lists, only remove it if the new one is different/changed - NSMutableArray *rList = [NSMutableArray array]; + NSMutableArray *rList = [[NSMutableArray alloc] init]; for (InputSource *src in self.sourceList) { InputSource *nSrc = [layout inputForUUID:src.uuid]; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index de8f79b2..4780a945 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -323,15 +323,12 @@ - - - @@ -344,7 +341,6 @@ - @@ -353,7 +349,6 @@ - @@ -364,7 +359,6 @@ - @@ -379,7 +373,6 @@ - @@ -390,7 +383,6 @@ - @@ -406,7 +398,6 @@ - @@ -421,7 +412,6 @@ - @@ -433,7 +423,6 @@ - @@ -449,7 +438,6 @@ - @@ -482,7 +470,6 @@ - @@ -506,7 +493,6 @@ - @@ -518,7 +504,6 @@ - @@ -530,14 +515,12 @@ - - @@ -553,7 +536,6 @@ - @@ -792,7 +756,6 @@ - @@ -811,7 +774,6 @@ - @@ -838,7 +800,6 @@ - @@ -847,7 +808,6 @@ - @@ -856,7 +816,6 @@ - @@ -868,7 +827,6 @@ - @@ -880,7 +838,6 @@ - @@ -889,7 +846,6 @@ - @@ -898,7 +854,6 @@ - @@ -933,7 +888,6 @@ - @@ -941,18 +895,14 @@ - - @@ -1005,7 +955,6 @@ - @@ -1015,7 +964,6 @@ - @@ -1307,7 +1244,6 @@ - diff --git a/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme b/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme index 8ef5c004..7687f7fc 100644 --- a/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme +++ b/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme @@ -1,6 +1,6 @@ - + - + + @@ -11,14 +12,13 @@ - + - @@ -27,7 +27,6 @@ - diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSTwitchStreamServicePlugin.xcscheme b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSTwitchStreamServicePlugin.xcscheme index 8f5e530b..0dcf1f93 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSTwitchStreamServicePlugin.xcscheme +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSTwitchStreamServicePlugin.xcscheme @@ -1,6 +1,6 @@ Date: Wed, 30 Mar 2016 04:01:02 -0400 Subject: [PATCH 052/156] Fix movie source warning about a very small timebase. May have fixed some instances of blank/black movie inputs. Change all the video and audio timescales to be more friendly to various containers. Still requires extensive AV sync/drift testing. --- .../CSMovieCapturePlugin/MovieCapture.m | 2 +- CocoaSplit/CaptureController.m | 11 +++++++---- CocoaSplit/Compressor/AppleProResCompressor.m | 1 - CocoaSplit/Compressor/x264Compressor.m | 8 ++++++-- CocoaSplit/FFMpegTask.m | 12 +++++++++++- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m b/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m index 6c29234c..e1ebec2f 100644 --- a/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m +++ b/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m @@ -352,7 +352,7 @@ void tapProcess(MTAudioProcessingTapRef tap, CMItemCount numberFrames, MTAudioPr -(void) setCurrentMovieTime:(double)time { - [_avPlayer seekToTime:CMTimeMakeWithSeconds(time, 1)]; + [_avPlayer seekToTime:CMTimeMakeWithSeconds(time, 1000)]; } diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 84169b7b..61999740 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2180,16 +2180,19 @@ CFAbsoluteTime ptsTime = _frame_time - _firstFrameTime; + + pts = CMTimeMake(_frameCount, self.captureFPS); + duration = CMTimeMake(1, self.captureFPS); + /* + pts = CMTimeMake(ptsTime*1000000, 1000000); - + duration = CMTimeMake(1000, self.captureFPS*1000); +*/ _frameCount++; _lastFrameTime = _frame_time; - pts = CMTimeMake(ptsTime*1000000, 1000000); - - duration = CMTimeMake(1000, self.captureFPS*1000); for(id cKey in self.compressors) { diff --git a/CocoaSplit/Compressor/AppleProResCompressor.m b/CocoaSplit/Compressor/AppleProResCompressor.m index 7d3d05fa..5f654d8d 100644 --- a/CocoaSplit/Compressor/AppleProResCompressor.m +++ b/CocoaSplit/Compressor/AppleProResCompressor.m @@ -224,7 +224,6 @@ void __ProResPixelBufferRelease( void *releaseRefCon, const void *baseAddress ) }; _compression_session = NULL; - NSLog(@"PRORES TYPE %@", self.proResType); status = VTCompressionSessionCreate(NULL, self.working_width, self.working_height, self.proResType.intValue, (__bridge CFDictionaryRef)encoderSpec, NULL, NULL, __ProResVideoCompressorReceiveFrame, (__bridge void *)self, &_compression_session); diff --git a/CocoaSplit/Compressor/x264Compressor.m b/CocoaSplit/Compressor/x264Compressor.m index d41c1588..ad6d4341 100644 --- a/CocoaSplit/Compressor/x264Compressor.m +++ b/CocoaSplit/Compressor/x264Compressor.m @@ -254,7 +254,7 @@ VTSessionSetProperty(_vtpt_ref, kVTPixelTransferPropertyKey_ScalingMode, kVTScalingMode_Letterbox); } - int64_t usePts = av_rescale_q(pts.value, (AVRational){1,1000000}, _av_codec_ctx->time_base); + int64_t usePts = pts.value; //av_rescale_q(pts.value, (AVRational){1,1000000}, _av_codec_ctx->time_base); if (_last_pts > 0 && usePts <= _last_pts) { @@ -445,9 +445,13 @@ //_av_codec_ctx->max_b_frames = 0; _av_codec_ctx->width = self.working_width; _av_codec_ctx->height = self.working_height; + /* _av_codec_ctx->time_base.num = 1000000; - _av_codec_ctx->time_base.den = self.settingsController.captureFPS*1000000; + */ + _av_codec_ctx->time_base.num = 1; + _av_codec_ctx->time_base.den = self.settingsController.captureFPS; + _av_codec_ctx->pix_fmt = PIX_FMT_YUV420P; diff --git a/CocoaSplit/FFMpegTask.m b/CocoaSplit/FFMpegTask.m index 69a4ed17..ecc22ffe 100644 --- a/CocoaSplit/FFMpegTask.m +++ b/CocoaSplit/FFMpegTask.m @@ -334,9 +334,14 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) c_ctx->codec_type = AVMEDIA_TYPE_VIDEO; c_ctx->codec_id = self.video_codec_id; + /* _av_video_stream->time_base.num = 1000000; _av_video_stream->time_base.den = self.framerate*1000000; + */ + _av_video_stream->time_base.num = 1000; + _av_video_stream->time_base.den = self.framerate*1000; + _av_audio_stream = avformat_new_stream(_av_fmt_ctx, 0); @@ -353,8 +358,13 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) a_ctx->codec_type = AVMEDIA_TYPE_AUDIO; a_ctx->codec_id = AV_CODEC_ID_AAC; - _av_audio_stream->time_base.num = 100000; + /*_av_audio_stream->time_base.num = 100000; _av_audio_stream->time_base.den = self.framerate*100000; + */ + + _av_audio_stream->time_base.num = 1; + _av_audio_stream->time_base.den = _samplerate; + a_ctx->sample_rate = _samplerate; a_ctx->bit_rate = _audio_bitrate; a_ctx->channels = 2; From 80c0f9bdbeef72ac321eaa1c8a45ca6b0f79ad1b Mon Sep 17 00:00:00 2001 From: Zakk Date: Thu, 31 Mar 2016 09:05:22 -0400 Subject: [PATCH 053/156] File output module now has noClobber and timestamped file options --- .../FileStreamService.h | 3 ++ .../FileStreamService.m | 30 ++++++++++++++++++- .../FileStreamServiceViewController.xib | 20 +++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.h b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.h index 61170c45..026d3f61 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.h +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.h @@ -15,6 +15,9 @@ @property bool isReady; @property (strong) NSString *fileName; +@property (assign) BOOL useTimestamp; +@property (assign) BOOL noClobber; + -(NSViewController *)getConfigurationView; diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m index aef5c45e..181cbde2 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m @@ -27,6 +27,8 @@ -(void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.fileName forKey:@"fileName"]; + [aCoder encodeBool:self.useTimestamp forKey:@"useTimestamp"]; + [aCoder encodeBool:self.noClobber forKey:@"noClobber"]; } @@ -35,6 +37,8 @@ if (self = [self init]) { self.fileName = [aDecoder decodeObjectForKey:@"fileName"]; + self.noClobber = [aDecoder decodeBoolForKey:@"noClobber"]; + self.useTimestamp = [aDecoder decodeBoolForKey:@"useTimestamp"]; } return self; @@ -62,8 +66,32 @@ -(NSString *)getServiceDestination { + NSString *useFilename = self.fileName; + NSString *pathExt = [self.fileName pathExtension]; + NSString *noExt = [useFilename stringByDeletingPathExtension]; + + if (self.useTimestamp) + { + NSDateFormatter *dFormat = [[NSDateFormatter alloc] init]; + dFormat.dateFormat = @"yyyyMMddHHmmss"; + NSString *dateStr = [dFormat stringFromDate:[NSDate date]]; + useFilename = [NSString stringWithFormat:@"%@-%@.%@", noExt, dateStr, pathExt]; + } - return self.fileName; + if (self.noClobber) + { + noExt = [useFilename stringByDeletingPathExtension]; + + NSFileManager *fManager = [[NSFileManager alloc] init]; + NSString *noExt = [useFilename stringByDeletingPathExtension]; + int fidx = 1; + while ([fManager fileExistsAtPath:useFilename]) + { + useFilename = [NSString stringWithFormat:@"%@-%d.%@", noExt, fidx, pathExt]; + fidx++; + } + } + return useFilename; } diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib index 3f8def4e..3914f222 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib @@ -36,6 +36,26 @@ + + From 3b125ab7bfe74d2f10558950b2b4d6b412839a5b Mon Sep 17 00:00:00 2001 From: Zakk Date: Tue, 5 Apr 2016 06:25:46 -0400 Subject: [PATCH 054/156] Added basic start of instant replay/constant recording feature. Fairly extensive changes to how output is handled. --- CocoaSplit.xcodeproj/project.pbxproj | 6 + CocoaSplit/CSAacEncoder.h | 2 + CocoaSplit/CSAacEncoder.m | 10 +- CocoaSplit/CSTimedOutputBuffer.h | 28 ++ CocoaSplit/CSTimedOutputBuffer.m | 114 ++++++ CocoaSplit/CaptureController.h | 13 +- CocoaSplit/CaptureController.m | 124 ++++-- CocoaSplit/CapturedFrameData.h | 4 + CocoaSplit/CapturedFrameData.m | 14 + CocoaSplit/Compressor/AppleProResCompressor.m | 5 +- CocoaSplit/Compressor/AppleVTCompressor.m | 13 +- CocoaSplit/Compressor/CompressorBase.m | 4 +- CocoaSplit/Compressor/x264Compressor.m | 10 +- CocoaSplit/FFMpegTask.h | 20 +- CocoaSplit/FFMpegTask.m | 353 +++--------------- CocoaSplit/OutputDestination.h | 14 + CocoaSplit/OutputDestination.m | 233 +++++++++--- CocoaSplit/en.lproj/MainMenu.xib | 10 + 18 files changed, 559 insertions(+), 418 deletions(-) create mode 100644 CocoaSplit/CSTimedOutputBuffer.h create mode 100644 CocoaSplit/CSTimedOutputBuffer.m diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index c244a5c0..6a99b023 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -55,6 +55,7 @@ 3434CB331CA91D99001B3DF9 /* CSAppleH264CompressorViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3434CB311CA91D99001B3DF9 /* CSAppleH264CompressorViewController.xib */; }; 3434CB381CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3434CB361CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.m */; }; 3434CB391CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3434CB371CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.xib */; }; + 3434CB3C1CB09BC4001B3DF9 /* CSTimedOutputBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3434CB3B1CB09BC4001B3DF9 /* CSTimedOutputBuffer.m */; }; 3435E396188B902C0015CC01 /* 420v.fgsh in Resources */ = {isa = PBXBuildFile; fileRef = 3435E395188B902C0015CC01 /* 420v.fgsh */; }; 3435E39B188B93150015CC01 /* passthrough.vtsh in Resources */ = {isa = PBXBuildFile; fileRef = 3435E39A188B93150015CC01 /* passthrough.vtsh */; }; 3435E39D188BD8250015CC01 /* passthrough.fgsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3435E399188B90900015CC01 /* passthrough.fgsh */; }; @@ -639,6 +640,8 @@ 3434CB351CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAppleProResCompressorViewController.h; path = Interface/CSAppleProResCompressorViewController.h; sourceTree = ""; }; 3434CB361CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSAppleProResCompressorViewController.m; path = Interface/CSAppleProResCompressorViewController.m; sourceTree = ""; }; 3434CB371CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSAppleProResCompressorViewController.xib; path = Interface/CSAppleProResCompressorViewController.xib; sourceTree = ""; }; + 3434CB3A1CB09BC4001B3DF9 /* CSTimedOutputBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSTimedOutputBuffer.h; sourceTree = ""; }; + 3434CB3B1CB09BC4001B3DF9 /* CSTimedOutputBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSTimedOutputBuffer.m; sourceTree = ""; }; 3435E395188B902C0015CC01 /* 420v.fgsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = 420v.fgsh; path = Shaders/420v.fgsh; sourceTree = ""; }; 3435E399188B90900015CC01 /* passthrough.fgsh */ = {isa = PBXFileReference; lastKnownFileType = text; name = passthrough.fgsh; path = Shaders/passthrough.fgsh; sourceTree = ""; }; 3435E39A188B93150015CC01 /* passthrough.vtsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = passthrough.vtsh; path = Shaders/passthrough.vtsh; sourceTree = ""; }; @@ -1161,6 +1164,8 @@ 34AB1C301B944F48003F2C03 /* CSPreviewOverlayView.m */, 3400A0601BD44DF0003E1828 /* CSInputLibraryItem.h */, 3400A0611BD44DF0003E1828 /* CSInputLibraryItem.m */, + 3434CB3A1CB09BC4001B3DF9 /* CSTimedOutputBuffer.h */, + 3434CB3B1CB09BC4001B3DF9 /* CSTimedOutputBuffer.m */, ); path = CocoaSplit; sourceTree = ""; @@ -2231,6 +2236,7 @@ 34ED8C5F1B07371C002C0674 /* MIKMIDIEndpointSynthesizer.m in Sources */, 34ED8CA11B07371C002C0674 /* MIKMIDISequencer.m in Sources */, 34ED8C751B07371C002C0674 /* MIKMIDIMetaCopyrightEvent.m in Sources */, + 3434CB3C1CB09BC4001B3DF9 /* CSTimedOutputBuffer.m in Sources */, 34ED8CB71B073C1B002C0674 /* CSMidiManagerWindowController.m in Sources */, 3408235519BC677A00CD1F5F /* CSNotifications.m in Sources */, 347B14DC198492D900DC7DF0 /* InputPopupControllerViewController.m in Sources */, diff --git a/CocoaSplit/CSAacEncoder.h b/CocoaSplit/CSAacEncoder.h index 7860aff9..ac128402 100644 --- a/CocoaSplit/CSAacEncoder.h +++ b/CocoaSplit/CSAacEncoder.h @@ -24,6 +24,8 @@ long outputSampleCount; CMAudioFormatDescriptionRef cmFormat; void *_pcmData; + u_int64_t _last_sample_time; + int _last_write_sample_cnt; } @property (assign) bool encoderStarted; diff --git a/CocoaSplit/CSAacEncoder.m b/CocoaSplit/CSAacEncoder.m index 72a058f4..d2f51413 100644 --- a/CocoaSplit/CSAacEncoder.m +++ b/CocoaSplit/CSAacEncoder.m @@ -47,7 +47,6 @@ { - [self preallocateBufferList:pcmBuffer]; @@ -70,6 +69,7 @@ Float32 *writebuf = _pcmData; int channel_size = buffer0.mDataByteSize/sizeof(Float32); + int i, u; for(i=u=0; i < channel_size; i++,u+=2) { @@ -150,8 +150,14 @@ if (self.encodedReceiver && buffer_size) { - CMTime ptsTime = CMTimeMake(outputSampleCount, self.sampleRate); + + CMTime duration = CMTimeMake(1024, self.sampleRate); + uint64_t mach_now = mach_absolute_time(); + double abs_pts = (double)mach_now/NSEC_PER_SEC; + abs_pts -= CMTimeGetSeconds(duration); + + CMTime ptsTime = CMTimeMake(abs_pts*1000, 1000); CMSampleTimingInfo timeInfo; diff --git a/CocoaSplit/CSTimedOutputBuffer.h b/CocoaSplit/CSTimedOutputBuffer.h new file mode 100644 index 00000000..9d0bd988 --- /dev/null +++ b/CocoaSplit/CSTimedOutputBuffer.h @@ -0,0 +1,28 @@ +// +// CSTimedOutputBuffer.h +// CocoaSplit +// +// Created by Zakk on 4/2/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "VideoCompressor.h" +#import "FFMpegTask.h" + + +@interface CSTimedOutputBuffer : NSObject +{ + NSMutableArray *_frameBuffer; + FFMpegTask *_outFFMpeg; + float _currentBufferDuration; +} + + +-(void) writeCurrentBuffer:(NSString *)toFile; + +@property (strong) NSObject *compressor; +@property (assign) float bufferDuration; +@property (strong) NSString *name; + +@end diff --git a/CocoaSplit/CSTimedOutputBuffer.m b/CocoaSplit/CSTimedOutputBuffer.m new file mode 100644 index 00000000..3b23c7d0 --- /dev/null +++ b/CocoaSplit/CSTimedOutputBuffer.m @@ -0,0 +1,114 @@ +// +// CSTimedOutputBuffer.m +// CocoaSplit +// +// Created by Zakk on 4/2/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSTimedOutputBuffer.h" +#import "AppDelegate.h" + +@implementation CSTimedOutputBuffer + + + +-(instancetype) init +{ + if (self = [super init]) + { + _frameBuffer = [[NSMutableArray alloc] init]; + _name = @"Instant Recording"; + } + return self; +} + + +-(void) writeCurrentBuffer:(NSString *)toFile +{ + AppDelegate *appD = NSApp.delegate; + CaptureController *controller = appD.captureController; + + + FFMpegTask *newout = [[FFMpegTask alloc] init]; + + newout.video_codec_id = self.compressor.codec_id; + newout.framerate = controller.captureFPS; + newout.stream_output = [toFile stringByStandardizingPath]; + newout.settingsController = controller; + newout.samplerate = controller.audioSamplerate; + newout.audio_bitrate = controller.audioBitrate; + + NSMutableArray *fCopy; + @synchronized(self) { + fCopy = _frameBuffer.copy; + } + + for (CapturedFrameData *cData in fCopy) + { + [newout writeEncodedData:cData]; + } + [newout stopProcess]; +} + + +-(void) writeEncodedData:(CapturedFrameData *)frameData +{ + + //NSLog(@"FRAME AUDIO COUNT %lu FRAME NUM %lld", (unsigned long)frameData.audioSamples.count, frameData.frameNumber); + + float frameDuration = CMTimeGetSeconds(frameData.videoDuration); + + @synchronized(self) { + [_frameBuffer addObject:frameData]; + } + _currentBufferDuration += frameDuration; + + //NSLog(@"CURRENT BUFFER DURATION %f BUFFER SIZE %lu", _currentBufferDuration, (unsigned long)_frameBuffer.count); + + //Drain the buffer if we need to + //Try to always have a keyframe at the head of the buffer, even if it means we have to fudge the duration a bit + + while (_currentBufferDuration > self.bufferDuration) + { + + float deleteDuration = 0.0f; + + //gobble until first keyFrame + + int delcnt = 0; + NSMutableArray *fCopy; + @synchronized(self) { + fCopy = _frameBuffer.copy; + } + + for (CapturedFrameData *cFrame in fCopy) + { + deleteDuration += CMTimeGetSeconds(cFrame.videoDuration); + delcnt++; + + if (cFrame.isKeyFrame) + { + break; + } + } + + if ((_currentBufferDuration - deleteDuration) < self.bufferDuration) + { + //We'd have to delete too much, just leave it for now, we'll get it next time. + break; + } + + if (delcnt > 0) + { + @synchronized(self) { + [_frameBuffer removeObjectsInRange:NSMakeRange(0, delcnt)]; + } + _currentBufferDuration -= deleteDuration; + } + } + + +} + +@end diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 20e78232..6c00583d 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -34,7 +34,6 @@ #import "CompressionSettingsPanelController.h" #import "AppleProResCompressor.h" - @class FFMpegTask; @protocol VideoCompressor; @class OutputDestination; @@ -42,7 +41,7 @@ @class SourceLayout; @class LayoutPreviewWindowController; @class CSLayoutEditWindowController; - +@class CSTimedOutputBuffer; void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , CMSampleBufferRef ); @@ -68,9 +67,13 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , id _activity_token; long long _frameCount; - CFAbsoluteTime _firstFrameTime; + long long _streamFrameStart; + CFAbsoluteTime _lastFrameTime; + CFAbsoluteTime _firstFrameTime; + CMTime _firstAudioTime; + dispatch_queue_t _main_capture_queue; dispatch_queue_t _preview_queue; dispatch_source_t _dispatch_timer; @@ -107,6 +110,9 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , } +@property (strong) CSTimedOutputBuffer *instantRecorder; + + @property (weak) IBOutlet NSCollectionView *layoutCollectionView; @property (assign) bool stagingHidden; @@ -187,6 +193,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) NSWindow *transitionFilterWindow; +- (IBAction)doInstantRecord:(id)sender; -(IBAction)openTransitionFilterPanel:(NSButton *)sender; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 61999740..b4e03ead 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -27,6 +27,7 @@ #import "CSMidiWrapper.h" #import "CSCaptureBase+TimerDelegate.h" #import "CSLayoutEditWindowController.h" +#import "CSTimedOutputBuffer.h" #import @@ -706,6 +707,8 @@ self.useStatusColors = YES; + + dispatch_source_t sigsrc = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, SIGPIPE, 0, dispatch_get_global_queue(0, 0)); dispatch_source_set_event_handler(sigsrc, ^{ return;}); dispatch_resume(sigsrc); @@ -1387,6 +1390,14 @@ self.sourceLayouts = [saveRoot valueForKey:@"sourceLayouts"]; + self.instantRecorder = [[CSTimedOutputBuffer alloc] init]; + self.instantRecorder.bufferDuration = 10; + + NSObject *origCompressor = self.compressors[@"AppleProRes"]; + self.instantRecorder.compressor = origCompressor.copy; + [self.instantRecorder.compressor addOutput:self.instantRecorder]; + self.instantRecorder.compressor.settingsController = self; + dispatch_async(_main_capture_queue, ^{[self newFrameTimed];}); dispatch_async(_preview_queue, ^{ @@ -1430,6 +1441,17 @@ self.inputLibrary = [NSMutableArray array]; } + _firstAudioTime = kCMTimeZero; + + + CSAacEncoder *audioEnc = [[CSAacEncoder alloc] init]; + audioEnc.encodedReceiver = self; + audioEnc.sampleRate = self.audioSamplerate; + audioEnc.bitRate = self.audioBitrate*1000; + + self.multiAudioEngine.encoder = audioEnc; + + } @@ -1623,9 +1645,9 @@ - _frameCount = 0; - _firstAudioTime = kCMTimeZero; - _firstFrameTime = 0; + //_frameCount = 0; + //_firstAudioTime = kCMTimeZero; + // _firstFrameTime = 0; @@ -1639,9 +1661,8 @@ { - _frameCount = 0; - _firstAudioTime = kCMTimeZero; - _firstFrameTime = 0; + //_frameCount = 0; + //_firstAudioTime = kCMTimeZero; if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_8) @@ -1659,12 +1680,6 @@ } - CSAacEncoder *audioEnc = [[CSAacEncoder alloc] init]; - audioEnc.encodedReceiver = self; - audioEnc.sampleRate = self.audioSamplerate; - audioEnc.bitRate = self.audioBitrate*1000; - - self.multiAudioEngine.encoder = audioEnc; self.captureRunning = YES; @@ -1735,7 +1750,7 @@ [[NSProcessInfo processInfo] endActivity:_activity_token]; } - self.multiAudioEngine.encoder = nil; + //self.multiAudioEngine.encoder = nil; [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationStreamStopped object:self userInfo:nil]; @@ -1778,10 +1793,6 @@ { - if (!self.captureRunning) - { - return; - } CMTime orig_pts = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); @@ -1790,26 +1801,34 @@ if (CMTIME_COMPARE_INLINE(_firstAudioTime, ==, kCMTimeZero)) { + + NSLog(@"FIRST AUDIO AT %f", CFAbsoluteTimeGetCurrent()); _firstAudioTime = orig_pts; return; } - CMTime real_pts = CMTimeSubtract(orig_pts, _firstAudioTime); CMTime adjust_pts = CMTimeMakeWithSeconds(self.audio_adjust, orig_pts.timescale); CMTime pts = CMTimeAdd(real_pts, adjust_pts); - CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, pts); - for(id cKey in self.compressors) + + if (self.instantRecorder) { - - id compressor; - compressor = self.compressors[cKey]; - [compressor addAudioData:sampleBuffer]; - + [self.instantRecorder.compressor addAudioData:sampleBuffer]; + } + + + if (self.captureRunning) + { + for(id cKey in self.compressors) + { + id compressor; + compressor = self.compressors[cKey]; + [compressor addAudioData:sampleBuffer]; + } } } @@ -1819,7 +1838,6 @@ -(double)mach_time_seconds { double retval; - uint64_t mach_now = mach_absolute_time(); retval = (double)((mach_now * _mach_timebase.numer / _mach_timebase.denom))/NSEC_PER_SEC; return retval; @@ -2023,6 +2041,7 @@ double lastLoopTime = startTime; _frame_time = startTime; + _firstFrameTime = startTime; [self newFrame]; //[self setFrameThreadPriority]; @@ -2050,6 +2069,7 @@ if (![self sleepUntil:(startTime += _frame_interval)]) { + NSLog(@"MISSED FRAME!"); continue; } @@ -2123,7 +2143,9 @@ if (newFrame) { + _frameCount++; CVPixelBufferRetain(newFrame); + [self sendFrameToReplay:newFrame]; if (self.captureRunning) { if (self.captureRunning != _last_running_value) @@ -2154,6 +2176,31 @@ } +-(void)sendFrameToReplay:(CVPixelBufferRef)videoFrame +{ + CMTime pts; + CMTime duration; + + pts = CMTimeMake((_frame_time - _firstFrameTime)*1000, 1000); + duration = CMTimeMake(1, self.captureFPS); + + + + if (self.instantRecorder && self.instantRecorder.compressor) + { + + //NSLog(@"SENDING FRAME %lld TO COMPRESSOR", _frameCount); + CapturedFrameData *newFrameData = [[CapturedFrameData alloc] init]; + + newFrameData.videoPTS = pts; + newFrameData.videoDuration = duration; + newFrameData.frameNumber = _frameCount; + newFrameData.frameTime = _frame_time; + newFrameData.videoFrame = videoFrame; + [self.instantRecorder.compressor compressFrame:newFrameData]; + } +} + -(void)processVideoFrame:(CVPixelBufferRef)videoFrame { @@ -2172,16 +2219,7 @@ - if (_firstFrameTime == 0) - { - _firstFrameTime = _frame_time; - - } - - CFAbsoluteTime ptsTime = _frame_time - _firstFrameTime; - - - pts = CMTimeMake(_frameCount, self.captureFPS); + pts = CMTimeMake((_frame_time - _firstFrameTime)*1000, 1000); duration = CMTimeMake(1, self.captureFPS); /* @@ -2189,8 +2227,8 @@ duration = CMTimeMake(1000, self.captureFPS*1000); */ - _frameCount++; - _lastFrameTime = _frame_time; + //_frameCount++; + //_lastFrameTime = _frame_time; @@ -2946,6 +2984,16 @@ +- (IBAction)doInstantRecord:(id)sender +{ + if (self.instantRecorder) + { + [self.instantRecorder writeCurrentBuffer:@"/tmp/instant_record.mov"]; + } +} + + + -(IBAction)openTransitionFilterPanel:(NSButton *)sender { diff --git a/CocoaSplit/CapturedFrameData.h b/CocoaSplit/CapturedFrameData.h index cb14c7e9..a3ec5693 100644 --- a/CocoaSplit/CapturedFrameData.h +++ b/CocoaSplit/CapturedFrameData.h @@ -21,6 +21,7 @@ @property CVImageBufferRef videoFrame; @property (assign) void *encoderData; +@property (assign) BOOL isKeyFrame; //Array of CMSampleBuffers from audio capture. @@ -34,4 +35,7 @@ @property (assign) AVPacket *avcodec_pkt; @property AVCodecContext *avcodec_ctx; + +-(NSInteger) encodedDataLength; + @end \ No newline at end of file diff --git a/CocoaSplit/CapturedFrameData.m b/CocoaSplit/CapturedFrameData.m index d2336a0d..4dae966b 100644 --- a/CocoaSplit/CapturedFrameData.m +++ b/CocoaSplit/CapturedFrameData.m @@ -56,6 +56,20 @@ self.audioSamples = nil; } +-(NSInteger) encodedDataLength +{ + NSInteger ret = 0; + + if (self.avcodec_pkt) + { + ret = self.avcodec_pkt->size; + } else if (self.encodedSampleBuffer) { + ret = CMSampleBufferGetTotalSampleSize(self.encodedSampleBuffer); + } + + return ret; +} + -(CMSampleBufferRef)encodedSampleBuffer { diff --git a/CocoaSplit/Compressor/AppleProResCompressor.m b/CocoaSplit/Compressor/AppleProResCompressor.m index 5f654d8d..69a7f794 100644 --- a/CocoaSplit/Compressor/AppleProResCompressor.m +++ b/CocoaSplit/Compressor/AppleProResCompressor.m @@ -237,6 +237,9 @@ void __ProResPixelBufferRelease( void *releaseRefCon, const void *baseAddress ) return NO; } + int real_keyframe_interval = 2; + VTSessionSetProperty(_compression_session, kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration, (__bridge CFTypeRef)@(real_keyframe_interval)); + _audioBuffer = [[NSMutableArray alloc] init]; return YES; @@ -283,7 +286,7 @@ void __ProResVideoCompressorReceiveFrame(void *VTref, void *VTFrameRef, OSStatus //frameData.videoFrame = nil; frameData.encodedSampleBuffer = sampleBuffer; - + frameData.isKeyFrame = YES; AppleVTCompressor *selfobj = (__bridge AppleVTCompressor *)VTref; diff --git a/CocoaSplit/Compressor/AppleVTCompressor.m b/CocoaSplit/Compressor/AppleVTCompressor.m index 3f5fe38a..161c68d5 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.m +++ b/CocoaSplit/Compressor/AppleVTCompressor.m @@ -422,8 +422,19 @@ void VideoCompressorReceiveFrame(void *VTref, void *VTFrameRef, OSStatus status, //frameData.videoFrame = nil; frameData.encodedSampleBuffer = sampleBuffer; + CFArrayRef sample_attachments; + sample_attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, NO); + if (sample_attachments) + { + CFDictionaryRef attach; + CFBooleanRef depends_on_others; + + attach = CFArrayGetValueAtIndex(sample_attachments, 0); + depends_on_others = CFDictionaryGetValue(attach, kCMSampleAttachmentKey_DependsOnOthers); + frameData.isKeyFrame = depends_on_others; + } - + AppleVTCompressor *selfobj = (__bridge AppleVTCompressor *)VTref; diff --git a/CocoaSplit/Compressor/CompressorBase.m b/CocoaSplit/Compressor/CompressorBase.m index 71980fd0..0c78ed8f 100644 --- a/CocoaSplit/Compressor/CompressorBase.m +++ b/CocoaSplit/Compressor/CompressorBase.m @@ -74,10 +74,12 @@ -(void) addAudioData:(CMSampleBufferRef)audioData { + if ([self hasOutputs] && audioData && _audioBuffer) { @synchronized(self) { + [_audioBuffer addObject:(__bridge id)audioData]; } } @@ -86,7 +88,7 @@ -(void) setAudioData:(CapturedFrameData *)forFrame syncObj:(id)syncObj { - + NSUInteger audioConsumed = 0; @synchronized(syncObj) { diff --git a/CocoaSplit/Compressor/x264Compressor.m b/CocoaSplit/Compressor/x264Compressor.m index ad6d4341..9c1a685b 100644 --- a/CocoaSplit/Compressor/x264Compressor.m +++ b/CocoaSplit/Compressor/x264Compressor.m @@ -228,6 +228,7 @@ BOOL isKeyFrame = NO; + if (frameData.frameTime >= _next_keyframe_time) { isKeyFrame = YES; @@ -349,7 +350,7 @@ frameData.avcodec_ctx = _av_codec_ctx; frameData.avcodec_pkt = pkt; - + frameData.isKeyFrame = pkt->flags & AV_PKT_FLAG_KEY; for (id dKey in self.outputs) { @@ -445,12 +446,8 @@ //_av_codec_ctx->max_b_frames = 0; _av_codec_ctx->width = self.working_width; _av_codec_ctx->height = self.working_height; - /* - _av_codec_ctx->time_base.num = 1000000; - _av_codec_ctx->time_base.den = self.settingsController.captureFPS*1000000; - */ _av_codec_ctx->time_base.num = 1; - _av_codec_ctx->time_base.den = self.settingsController.captureFPS; + _av_codec_ctx->time_base.den = 1000; _av_codec_ctx->pix_fmt = PIX_FMT_YUV420P; @@ -494,7 +491,6 @@ } else { useAdvancedSettings = [useAdvancedSettings stringByAppendingString:@":filler=1"]; } - //av_dict_set(&opts, "nal-hrd", "cbr", 0); } _av_codec_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER; diff --git a/CocoaSplit/FFMpegTask.h b/CocoaSplit/FFMpegTask.h index 50b08656..cefded1c 100644 --- a/CocoaSplit/FFMpegTask.h +++ b/CocoaSplit/FFMpegTask.h @@ -17,14 +17,11 @@ #define AUDIO_BUFFER_SIZE 1000 + + + @interface FFMpegTask : NSObject { - - - - - dispatch_queue_t _stream_dispatch; - AVFormatContext *_av_fmt_ctx; AVStream *_av_video_stream; AVStream *_av_audio_stream; @@ -32,8 +29,6 @@ char *_audio_extradata; size_t _audio_extradata_size; - CFAbsoluteTime _input_frame_timestamp; - CFAbsoluteTime _output_frame_timestamp; int _input_framecnt; int _output_framecnt; int _output_bytes; @@ -45,10 +40,10 @@ } --(void) writeVideoSampleBuffer:(CapturedFrameData *)frameData; --(void) writeAudioSampleBuffer:(CMSampleBufferRef)theBuffer presentationTimeStamp:(CMTime)pts; --(void) writeAVPacket:(CapturedFrameData *)frameData; --(void) writeEncodedData:(CapturedFrameData *)frameData; +-(BOOL) writeVideoSampleBuffer:(CapturedFrameData *)frameData; +-(BOOL) writeAudioSampleBuffer:(CMSampleBufferRef)theBuffer presentationTimeStamp:(CMTime)pts; +-(BOOL) writeAVPacket:(CapturedFrameData *)frameData; +-(BOOL) writeEncodedData:(CapturedFrameData *)frameData; -(void) updateOutputStats; -(void) updateInputStats; @@ -62,7 +57,6 @@ @property (assign) BOOL init_done; -@property (assign) BOOL active; @property (strong) NSString *stream_output; @property (strong) NSString *stream_format; @property (assign) int framerate; diff --git a/CocoaSplit/FFMpegTask.m b/CocoaSplit/FFMpegTask.m index ecc22ffe..c86e1afb 100644 --- a/CocoaSplit/FFMpegTask.m +++ b/CocoaSplit/FFMpegTask.m @@ -121,6 +121,8 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) { CMAudioFormatDescriptionRef audio_fmt; + NSLog(@"AUDIO EXTRACT %@", theBuffer); + audio_fmt = CMSampleBufferGetFormatDescription(theBuffer); if (!audio_fmt) { @@ -137,18 +139,12 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) } --(void) writeEncodedData:(CapturedFrameData *)frameDataIn +-(BOOL) writeEncodedData:(CapturedFrameData *)frameDataIn { + CapturedFrameData *frameData = frameDataIn; - - if (!self.active) - { - return; - } - - if (!_audio_extradata && [frameData.audioSamples count] > 0) { @@ -157,12 +153,6 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) [self extractAudioCookie:audioSample]; } - if (!_stream_dispatch) - { - _stream_dispatch = dispatch_queue_create("FFMpeg Stream Dispatch", NULL); - _pending_frame_count = 0; - } - if (!_av_video_stream && _audio_extradata) { @@ -170,20 +160,19 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) { [self initStatsValues]; } else { - return; + return NO; } } if (!_av_video_stream || !_av_audio_stream) { - //!? - return; + //This is a lie. We probably have only received video frames and are waiting for audio. Just pretend we did something. + return YES; } //If we made it here, we have all the metadata and av* stuff created, so start sending data. - for (id object in frameData.audioSamples) { CMSampleBufferRef audioSample = (__bridge CMSampleBufferRef)object; @@ -193,35 +182,29 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) //CFRelease(audioSample); } + BOOL ret_status = YES; + if (frameData.encodedSampleBuffer) { - [self writeVideoSampleBuffer:frameData]; + ret_status = [self writeVideoSampleBuffer:frameData]; } else if (frameData.avcodec_pkt) { - [self writeAVPacket:frameData]; + ret_status = [self writeAVPacket:frameData]; } + return ret_status; } --(void) writeAudioSampleBuffer:(CMSampleBufferRef)theBuffer presentationTimeStamp:(CMTime)pts +-(BOOL) writeAudioSampleBuffer:(CMSampleBufferRef)theBuffer presentationTimeStamp:(CMTime)pts { - if ([self shouldDropFrame]) - { - return; - } - CFRetain(theBuffer); + BOOL ret_val = YES; if (_av_audio_stream && (self.init_done == YES)) { - dispatch_async(_stream_dispatch, ^{ - if (!self.active) - { - return; - } CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(theBuffer); size_t buffer_length; @@ -249,38 +232,24 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) - if (av_interleaved_write_frame(_av_fmt_ctx, &pkt) < 0) { - NSLog(@"AV WRITE AUDIO failed for %@", self.stream_output); + ret_val = NO; [self stopProcess]; } - //CMSampleBufferInvalidate(theBuffer); CFRelease(theBuffer); - }); - /*} else if (!_audio_extradata) { - - CMAudioFormatDescriptionRef audio_fmt; - audio_fmt = CMSampleBufferGetFormatDescription(theBuffer); - void *audio_tmp; - if (!audio_fmt) - return; - - - - audio_tmp = (char *)CMAudioFormatDescriptionGetMagicCookie(audio_fmt, &_audio_extradata_size); - - if (audio_tmp) - { - getAudioExtradata(audio_tmp, &_audio_extradata, &_audio_extradata_size); - } - */ } + + return ret_val; } -(void) setVideoFormatOptions:(AVFormatContext *)ctx { + + ctx->avoid_negative_ts = AVFMT_AVOID_NEG_TS_MAKE_ZERO; + + AVOutputFormat *ofmt = ctx->oformat; if (!ofmt) @@ -290,9 +259,11 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) const char *fmt_name = ofmt->name; - if (!strcasecmp(fmt_name, "mov")) + if (!strcasecmp(fmt_name, "mmmmmov")) { av_opt_set_int(ctx->priv_data, "frag_duration", 10000000, 0); + } else if (!strcasecmp(fmt_name, "segment")) { + av_opt_set(ctx->priv_data, "reset_timestamps", "1", AV_OPT_SEARCH_CHILDREN); } } @@ -312,7 +283,6 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) if (!_av_fmt_ctx) { - NSLog(@"No av_fmt_ctx"); return NO; } @@ -325,7 +295,6 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) if (!_av_video_stream) { - NSLog(@"No av_video_stream"); return NO; } @@ -339,8 +308,8 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) _av_video_stream->time_base.den = self.framerate*1000000; */ - _av_video_stream->time_base.num = 1000; - _av_video_stream->time_base.den = self.framerate*1000; + _av_video_stream->time_base.num = 1; + _av_video_stream->time_base.den = 1000; @@ -348,7 +317,6 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) if (!_av_audio_stream) { - NSLog(@"No av_audio_stream"); return NO; } @@ -452,216 +420,81 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) -(void) updateInputStats { - CFAbsoluteTime time_now = CFAbsoluteTimeGetCurrent(); - double calculated_input_framerate = _input_framecnt / (time_now - _input_frame_timestamp); - _input_framecnt = 0; - _input_frame_timestamp = time_now; - self.input_framerate = calculated_input_framerate; - self.buffered_frame_count = _pending_frame_count; - self.buffered_frame_size = _pending_frame_size; self.dropped_frame_count = _dropped_frames; - } -(void) updateOutputStats { - CFAbsoluteTime time_now = CFAbsoluteTimeGetCurrent(); - double calculated_output_framerate = _output_framecnt / (time_now - _output_frame_timestamp); - double calculated_output_bitrate = (_output_bytes / (time_now - _output_frame_timestamp))*8; _output_framecnt = 0; _output_bytes = 0; - _output_frame_timestamp = time_now; - - - self.output_framerate = calculated_output_framerate; - self.output_bitrate = calculated_output_bitrate; - } -(void) initStatsValues { - CFAbsoluteTime time_now = CFAbsoluteTimeGetCurrent(); _input_framecnt = 0; - _input_frame_timestamp = time_now; _output_framecnt = 0; _output_bytes = 0; - _output_frame_timestamp = time_now; } -//(AVPacket *)pkt codec_ctx:(AVCodecContext *)codec_ctx --(void) writeAVPacket:(CapturedFrameData *)frameData +-(BOOL) writeAVPacket:(CapturedFrameData *)frameData { AVPacket *pkt = frameData.avcodec_pkt; - if (!_stream_dispatch) - { - _stream_dispatch = dispatch_queue_create("FFMpeg Stream Dispatch", NULL); - _pending_frame_count = 0; - } - - - _input_framecnt++; - - - @synchronized(self) - { - _pending_frame_count++; - _pending_frame_size += pkt->size; - } - - if ([self shouldDropFrame]) - { - _dropped_frames++; - _consecutive_dropped_frames++; - return; - } else { - _consecutive_dropped_frames = 0; - } - - if ([self resetOutputIfNeeded]) - { - return; - } - - - - - - AVPacket *p = av_malloc(sizeof (AVPacket)); av_init_packet(p); av_packet_ref(p, pkt); - dispatch_async(_stream_dispatch, ^{ - - if (!self.active) - { - return; - } - - if (p->pts != AV_NOPTS_VALUE) - { - p->pts = av_rescale_q(p->pts, frameData.avcodec_ctx->time_base, _av_video_stream->time_base); - } - - if (p->dts != AV_NOPTS_VALUE) - { - p->dts = av_rescale_q(p->dts, frameData.avcodec_ctx->time_base, _av_video_stream->time_base); - } - - - - - p->stream_index = _av_video_stream->index; - - int packet_size = p->size; - /* Write the compressed frame to the media file. */ - if (av_interleaved_write_frame(_av_fmt_ctx, p) < 0) - { - NSLog(@"INTERLEAVED WRITE FRAME FAILED FOR %@ frame number %lld", self.stream_output, frameData.frameNumber); - } - - //av_free_packet(p); - //av_free(p); - _output_framecnt++; - _output_bytes += packet_size; - @synchronized(self) - { - _pending_frame_count--; - _pending_frame_size -= packet_size; - } - }); + + if (p->pts != AV_NOPTS_VALUE) + { + p->pts = av_rescale_q(p->pts, frameData.avcodec_ctx->time_base, _av_video_stream->time_base); + } + + if (p->dts != AV_NOPTS_VALUE) + { + p->dts = av_rescale_q(p->dts, frameData.avcodec_ctx->time_base, _av_video_stream->time_base); + } + + + p->stream_index = _av_video_stream->index; + + /* Write the compressed frame to the media file. */ + BOOL write_status = YES; + if (av_interleaved_write_frame(_av_fmt_ctx, p) < 0) + { + NSLog(@"INTERLEAVED WRITE FRAME FAILED FOR %@ frame number %lld", self.stream_output, frameData.frameNumber); + write_status = NO; + } + + return write_status; } --(void) writeVideoSampleBuffer:(CapturedFrameData *)frameData + +-(BOOL) writeVideoSampleBuffer:(CapturedFrameData *)frameData { - if (!frameData || !frameData.encodedSampleBuffer) { - return; + return NO; } - /* - if (!_stream_dispatch) - { - _stream_dispatch = dispatch_queue_create("FFMpeg Stream Dispatch", NULL); - _pending_frame_count = 0; - } - - */ - - - - _input_framecnt++; - - if ([self shouldDropFrame]) - { - _dropped_frames++; - _consecutive_dropped_frames++; - return; - } else { - _consecutive_dropped_frames = 0; - } - - if ([self resetOutputIfNeeded]) - { - return; - } - - CFRetain(frameData.encodedSampleBuffer); - CMBlockBufferRef tmp_sample_data = CMSampleBufferGetDataBuffer(frameData.encodedSampleBuffer); - size_t data_length = CMBlockBufferGetDataLength(tmp_sample_data); - - - @synchronized(self) - { - _pending_frame_count++; - _pending_frame_size += data_length; - } - - dispatch_async(_stream_dispatch, ^{ - CMSampleBufferRef theBuffer = frameData.encodedSampleBuffer; - if (!self.active) - { - return; - } - - - /* - if (!_av_video_stream) - { - if (_audio_extradata) - { - if (![self createAVFormatOut:theBuffer codec_ctx:nil]) - { - return; - } - [self initStatsValues]; - - } else { - @synchronized(self) { _pending_frame_count--; _pending_frame_size -= data_length;} - return; - } - } - */ CMBlockBufferRef my_buffer; char *sampledata; size_t offset_length; @@ -685,71 +518,34 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) - pkt.dts = av_rescale_q(CMSampleBufferGetDecodeTimeStamp(theBuffer).value, (AVRational) {1.0, CMSampleBufferGetDecodeTimeStamp(theBuffer).timescale}, _av_video_stream->time_base); + pkt.dts = av_rescale_q(CMSampleBufferGetDecodeTimeStamp(theBuffer).value, (AVRational) {1.0, CMSampleBufferGetDecodeTimeStamp(theBuffer). + timescale}, _av_video_stream->time_base); pkt.pts = av_rescale_q(CMSampleBufferGetPresentationTimeStamp(theBuffer).value, (AVRational) {1.0, CMSampleBufferGetPresentationTimeStamp(theBuffer).timescale}, _av_video_stream->time_base); - - - - - - //kt.pts = CMSampleBufferGetPresentationTimeStamp(theBuffer).value; - - - - - if ([self isBufferKeyframe:theBuffer]) + if (frameData.isKeyFrame) { pkt.flags |= AV_PKT_FLAG_KEY; } + BOOL send_status = YES; + if (av_interleaved_write_frame(_av_fmt_ctx, &pkt) < 0) { NSLog(@"VIDEO WRITE FRAME failed for %@", self.stream_output); + send_status = NO; //[self stopProcess]; } - _output_framecnt++; - _output_bytes += buffer_length; - //CMSampleBufferInvalidate(theBuffer); CFRelease(theBuffer); - @synchronized(self) - { - _pending_frame_count--; - _pending_frame_size -= buffer_length; - - } - }); - - return; + return send_status; } --(BOOL) isBufferKeyframe:(CMSampleBufferRef)theBuffer -{ - - CFArrayRef sample_attachments; - BOOL result = NO; - - sample_attachments = CMSampleBufferGetSampleAttachmentsArray(theBuffer, NO); - if (sample_attachments) - { - CFDictionaryRef attach; - CFBooleanRef depends_on_others; - - attach = CFArrayGetValueAtIndex(sample_attachments, 0); - depends_on_others = CFDictionaryGetValue(attach, kCMSampleAttachmentKey_DependsOnOthers); - result = depends_on_others == kCFBooleanFalse; - } - - return result; - -} @@ -758,16 +554,10 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) self = [super init]; self.init_done = NO; - self.active = NO; self.errored = NO; av_register_all(); avformat_network_init(); - - - _stream_dispatch = dispatch_queue_create("FFMpeg Stream Dispatch", NULL); - - return self; } @@ -776,18 +566,7 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) -(bool)stopProcess { - if (!self.active) - { - return NO; - } - - - self.active = NO; - - dispatch_async(_stream_dispatch, ^{ - [self _internal_stopProcess]; - }); - + [self _internal_stopProcess]; return YES; } @@ -808,12 +587,6 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) } - /* - if (_av_video_stream) - av_free(_av_video_stream); - if (_av_audio_stream) - av_free(_av_audio_stream); -*/ _av_fmt_ctx = NULL; _av_video_stream = NULL; _av_audio_stream = NULL; @@ -823,10 +596,6 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) //free(_audio_extradata); _audio_extradata = NULL; } - - - _stream_dispatch = nil; - NSLog(@"Stopped FFMPEG"); return YES; diff --git a/CocoaSplit/OutputDestination.h b/CocoaSplit/OutputDestination.h index cb028cf2..b4c65e7e 100644 --- a/CocoaSplit/OutputDestination.h +++ b/CocoaSplit/OutputDestination.h @@ -24,11 +24,25 @@ NSMutableArray *_delayBuffer; BOOL _stopped; NSString *_destination; + dispatch_queue_t _output_queue; + int _p_buffered_frame_count; + int _p_buffered_frame_size; + int _p_dropped_frame_count; + int _p_input_framecnt; + int _p_output_framecnt; + int _p_output_bytes; + int _pending_frame_count; + int _consecutive_dropped_frames; + BOOL _errored; + CFAbsoluteTime _input_frame_timestamp; + CFAbsoluteTime _output_frame_timestamp; } + + @property (strong) NSString *server_name; @property (strong) NSString *type_name; @property (strong) NSString *type_class_name; diff --git a/CocoaSplit/OutputDestination.m b/CocoaSplit/OutputDestination.m index 11e4dde2..ed63d6fb 100644 --- a/CocoaSplit/OutputDestination.m +++ b/CocoaSplit/OutputDestination.m @@ -118,6 +118,13 @@ -(void) setActive:(BOOL)is_active { + if (!_output_queue) + { + NSString *queue_name = [NSString stringWithFormat:@"Output Queue %@", self.name]; + _output_queue = dispatch_queue_create(queue_name.UTF8String, NULL); + } + + if (is_active != _active) { _active = is_active; @@ -126,6 +133,7 @@ [self stopCompressor]; [self reset]; } else { + [self initStatsValues]; [self setupCompressor]; } @@ -145,15 +153,28 @@ { self.buffer_draining = NO; [_delayBuffer removeAllObjects]; - + [self initStatsValues]; if (self.ffmpeg_out) { - [self.ffmpeg_out stopProcess]; - [self.ffmpeg_out removeObserver:self forKeyPath:@"errored"]; - [self.ffmpeg_out removeObserver:self forKeyPath:@"active"]; + if (_errored) + { + //errors jump the queue and just kill the ffmpeg output + [self.ffmpeg_out stopProcess]; + self.ffmpeg_out = nil; + dispatch_async(dispatch_get_main_queue(), ^{ + self.textColor = [NSColor redColor]; + }); + } else { + dispatch_async(_output_queue, ^{ + [self.ffmpeg_out stopProcess]; + self.ffmpeg_out = nil; + dispatch_async(dispatch_get_main_queue(), ^{ + self.textColor = [NSColor blackColor]; + }); + + }); + } - - self.ffmpeg_out = nil; } _output_start_time = 0.0f; @@ -293,12 +314,36 @@ self.ffmpeg_out = newout; - [self.ffmpeg_out addObserver:self forKeyPath:@"errored" options:NSKeyValueObservingOptionNew context:NULL]; - [self.ffmpeg_out addObserver:self forKeyPath:@"active" options:NSKeyValueObservingOptionNew context:NULL]; - self.ffmpeg_out.active = self.active; +} + + +- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + + NSColor *newColor = nil; + + if ([keyPath isEqualToString:@"errored"]) { + + BOOL errVal = [[change objectForKey:NSKeyValueChangeNewKey] boolValue]; + + if (errVal == YES) + { + newColor = [NSColor redColor]; + } + + } + + + if (newColor) + { + dispatch_async(dispatch_get_main_queue(), ^{ + self.textColor = newColor; + }); + } + } -(void) setupCompressor @@ -337,42 +382,35 @@ } } -- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context + + +-(bool) resetOutputIfNeeded { - - NSColor *newColor = nil; - - if ([keyPath isEqualToString:@"active"]) + if (self.settingsController.maxOutputDropped) { - BOOL activeVal = [[change objectForKey:NSKeyValueChangeNewKey] boolValue]; - if (activeVal == YES) + if (_consecutive_dropped_frames >= self.settingsController.maxOutputDropped) { - newColor = [NSColor greenColor]; - } else { - newColor = [NSColor blackColor]; + return YES; } - - } else if ([keyPath isEqualToString:@"errored"]) { - - BOOL errVal = [[change objectForKey:NSKeyValueChangeNewKey] boolValue]; - - if (errVal == YES) - { - newColor = [NSColor redColor]; - } - } - - - if (newColor) - { - dispatch_async(dispatch_get_main_queue(), ^{ - self.textColor = newColor; - }); - } - + return NO; } + +-(bool) shouldDropFrame +{ + if (self.settingsController.maxOutputPending) + { + if (_pending_frame_count >= self.settingsController.maxOutputPending) + { + return YES; + } + } + + return NO; +} + + -(void) writeEncodedData:(CapturedFrameData *)frameData { @@ -389,32 +427,88 @@ } - if (frameData) + if (frameData && self.stream_delay > 0) { [_delayBuffer addObject:frameData]; } + BOOL start_stream = NO; - - if ((current_time >= _output_start_time) && ([_delayBuffer count] > 0)) + if (self.settingsController.captureRunning && !self.ffmpeg_out) { - - if (self.settingsController.captureRunning && !self.ffmpeg_out) + if (self.stream_delay == 0) { - [self attachOutput]; + start_stream = YES; } + if ((current_time >= _output_start_time) && ([_delayBuffer count] > 0)) + { + + start_stream = YES; + } + } + + if (start_stream) + { - sendData = [_delayBuffer objectAtIndex:0]; - [_delayBuffer removeObjectAtIndex:0]; + [self attachOutput]; + dispatch_async(dispatch_get_main_queue(), ^{ + self.textColor = [NSColor greenColor]; + }); + } + + if (frameData) + { + _p_input_framecnt++; } + if (self.ffmpeg_out) + { + if (_delayBuffer.count > 0) + { + sendData = [_delayBuffer objectAtIndex:0]; + [_delayBuffer removeObjectAtIndex:0]; + } else { + sendData = frameData; + } + } + if (sendData && self.ffmpeg_out) { - [self.ffmpeg_out writeEncodedData:sendData]; + NSInteger f_size = [sendData encodedDataLength]; + + if ([self resetOutputIfNeeded]) + { + _errored = YES; + self.active = NO; + return; + } + if ([self shouldDropFrame]) + { + _dropped_frame_count++; + _consecutive_dropped_frames++; + } else { + _consecutive_dropped_frames = 0; + + dispatch_async(_output_queue, ^{ + _p_buffered_frame_size += f_size; + _p_buffered_frame_count++; + + BOOL write_ret = [self.ffmpeg_out writeEncodedData:sendData]; + + if (write_ret) + { + _p_output_framecnt++; + _p_buffered_frame_count--; + _p_buffered_frame_size -= f_size; + _p_output_bytes += f_size; + } + + }); + } } if (self.buffer_draining) @@ -428,22 +522,43 @@ } +-(void) initStatsValues +{ + CFAbsoluteTime time_now = CFAbsoluteTimeGetCurrent(); + _input_frame_timestamp = time_now; + _output_frame_timestamp = time_now; + _p_input_framecnt = 0; + _p_buffered_frame_count = 0; + _p_buffered_frame_size = 0; + _p_dropped_frame_count = 0; + _p_output_framecnt = 0; + _p_output_bytes = 0; +} + -(void) updateStatistics { - if (self.ffmpeg_out) - { - [self.ffmpeg_out updateInputStats]; - [self.ffmpeg_out updateOutputStats]; - self.output_framerate = self.ffmpeg_out.output_framerate; - self.output_bitrate = self.ffmpeg_out.output_bitrate; - self.input_framerate = self.ffmpeg_out.input_framerate; - self.dropped_frame_count = self.ffmpeg_out.dropped_frame_count; - self.buffered_frame_count = self.ffmpeg_out.buffered_frame_count; - self.buffered_frame_size = self.ffmpeg_out.buffered_frame_size; - } + CFAbsoluteTime time_now = CFAbsoluteTimeGetCurrent(); + double calculated_input_framerate = _p_input_framecnt / (time_now - _input_frame_timestamp); + double calculated_output_framerate = _p_output_framecnt / (time_now - _output_frame_timestamp); + double calculated_output_bitrate = (_p_output_bytes / (time_now - _output_frame_timestamp)) * 8; + + _p_input_framecnt = 0; + _p_output_framecnt = 0; + _output_frame_timestamp = time_now; + _input_frame_timestamp = time_now; + _p_output_bytes = 0; + + + self.output_framerate = calculated_output_framerate; + self.input_framerate = calculated_input_framerate; + self.output_bitrate = calculated_output_bitrate; + self.buffered_frame_count = _p_buffered_frame_count; + self.buffered_frame_size = _p_buffered_frame_size; + //TODO + self.dropped_frame_count = 0; self.delay_buffer_frames = [_delayBuffer count]; } @@ -464,8 +579,6 @@ if (self.ffmpeg_out) { - [self.ffmpeg_out removeObserver:self forKeyPath:@"errored" context:NULL]; - [self.ffmpeg_out removeObserver:self forKeyPath:@"active" context:NULL]; [self.compressor removeObserver:self forKeyPath:@"errored" context:NULL]; } [[NSNotificationCenter defaultCenter] removeObserver:self]; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 4780a945..6fbda1df 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1595,6 +1595,16 @@ + From 4077cfd44a64284c2fb62ff32f471d6ed2d880ee Mon Sep 17 00:00:00 2001 From: Zakk Date: Thu, 7 Apr 2016 05:21:11 -0400 Subject: [PATCH 055/156] Write out instant record video in a background thread --- CocoaSplit/CSTimedOutputBuffer.m | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CocoaSplit/CSTimedOutputBuffer.m b/CocoaSplit/CSTimedOutputBuffer.m index 3b23c7d0..f778b147 100644 --- a/CocoaSplit/CSTimedOutputBuffer.m +++ b/CocoaSplit/CSTimedOutputBuffer.m @@ -44,18 +44,20 @@ fCopy = _frameBuffer.copy; } - for (CapturedFrameData *cData in fCopy) - { - [newout writeEncodedData:cData]; - } - [newout stopProcess]; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + for (CapturedFrameData *cData in fCopy) + { + [newout writeEncodedData:cData]; + } + [newout stopProcess]; + }); + } -(void) writeEncodedData:(CapturedFrameData *)frameData { - //NSLog(@"FRAME AUDIO COUNT %lu FRAME NUM %lld", (unsigned long)frameData.audioSamples.count, frameData.frameNumber); float frameDuration = CMTimeGetSeconds(frameData.videoDuration); @@ -64,8 +66,6 @@ } _currentBufferDuration += frameDuration; - //NSLog(@"CURRENT BUFFER DURATION %f BUFFER SIZE %lu", _currentBufferDuration, (unsigned long)_frameBuffer.count); - //Drain the buffer if we need to //Try to always have a keyframe at the head of the buffer, even if it means we have to fudge the duration a bit From fd09479940cba91b1970d40ee0bd39f223d14401 Mon Sep 17 00:00:00 2001 From: Zakk Date: Thu, 7 Apr 2016 06:26:06 -0400 Subject: [PATCH 056/156] Add options to apple h264 compressor to control if hardware encoder is used or not --- CocoaSplit/Compressor/AppleVTCompressor.h | 3 ++ CocoaSplit/Compressor/AppleVTCompressor.m | 18 ++++++++--- .../CSAppleH264CompressorViewController.xib | 30 +++++++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/CocoaSplit/Compressor/AppleVTCompressor.h b/CocoaSplit/Compressor/AppleVTCompressor.h index 28c7319d..805a2040 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.h +++ b/CocoaSplit/Compressor/AppleVTCompressor.h @@ -32,6 +32,9 @@ @property (assign) BOOL use_cbr; @property (strong) NSArray *profiles; +@property (assign) bool noHardware; +@property (assign) bool forceHardware; + -(bool)compressFrame:(CapturedFrameData *)frameData; diff --git a/CocoaSplit/Compressor/AppleVTCompressor.m b/CocoaSplit/Compressor/AppleVTCompressor.m index 161c68d5..032a4c8b 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.m +++ b/CocoaSplit/Compressor/AppleVTCompressor.m @@ -230,10 +230,20 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) return NO; } - NSDictionary *encoderSpec = @{ - @"RequireHardwareAcceleratedVideoEncoder": @YES, - }; - + + NSMutableDictionary *encoderSpec = [[NSMutableDictionary alloc] init]; + + bool enableVal = !self.noHardware; + + encoderSpec[(__bridge NSString *)kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder] = @(enableVal); + + + if (self.forceHardware) + { + encoderSpec[(__bridge NSString *)kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder] = @YES; + } + + _compression_session = NULL; status = VTCompressionSessionCreate(NULL, self.working_width, self.working_height, kCMVideoCodecType_H264, (__bridge CFDictionaryRef)encoderSpec, NULL, NULL, VideoCompressorReceiveFrame, (__bridge void *)self, &_compression_session); diff --git a/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib b/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib index 2a2ed7d9..11fc6a30 100644 --- a/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib +++ b/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib @@ -125,6 +125,36 @@ + + From 4ffdcd8f2556e4e4f2318d53179aa44367f409bb Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 11 Apr 2016 09:28:48 -0400 Subject: [PATCH 057/156] Instant recorder compressor is selectable for use in normal outputs, useful for local recordings. IR compressor is a wrapper around apple h264, first it tries hardware encoding and if that fails it tries software. --- CocoaSplit.xcodeproj/project.pbxproj | 6 + CocoaSplit/CSPluginServices.m | 27 ++- CocoaSplit/CSTimedOutputBuffer.h | 9 +- CocoaSplit/CSTimedOutputBuffer.m | 10 ++ CocoaSplit/CaptureController.h | 4 + CocoaSplit/CaptureController.m | 57 +++--- CocoaSplit/Compressor/AppleProResCompressor.h | 1 - CocoaSplit/Compressor/AppleProResCompressor.m | 5 - CocoaSplit/Compressor/AppleVTCompressor.h | 1 - CocoaSplit/Compressor/AppleVTCompressor.m | 11 +- CocoaSplit/Compressor/CSIRCompressor.h | 22 +++ CocoaSplit/Compressor/CSIRCompressor.m | 169 ++++++++++++++++++ CocoaSplit/Compressor/CompressorBase.h | 1 - CocoaSplit/Compressor/VideoCompressor.h | 1 - CocoaSplit/Compressor/x264Compressor.h | 2 +- CocoaSplit/Compressor/x264Compressor.m | 20 +-- CocoaSplit/Interface/advancedPrefPanel.xib | 76 ++++---- CocoaSplit/PluginHeaders/CSPluginServices.h | 4 +- 18 files changed, 326 insertions(+), 100 deletions(-) create mode 100644 CocoaSplit/Compressor/CSIRCompressor.h create mode 100644 CocoaSplit/Compressor/CSIRCompressor.m diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 6a99b023..747a610f 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ 340FE4DA15F346D900E4CE4E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340FE4D815F346CC00E4CE4E /* AVFoundation.framework */; }; 340FE4E115F3581200E4CE4E /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340FE4E015F3581200E4CE4E /* QTKit.framework */; }; 340FE50815F444AA00E4CE4E /* CaptureController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FE50715F444AA00E4CE4E /* CaptureController.m */; }; + 3414C6AE1CBB9EBF00107C69 /* CSIRCompressor.m in Sources */ = {isa = PBXBuildFile; fileRef = 3414C6AD1CBB9EBF00107C69 /* CSIRCompressor.m */; }; 3415CED31AE257DA002F11F5 /* CSTextCaptureBaseView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3415CED21AE257DA002F11F5 /* CSTextCaptureBaseView.xib */; }; 341A2D5C1C7AB04700FF7566 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 341A2D5B1C7AB04700FF7566 /* Sparkle.framework */; }; 341A2D5D1C7AB0D100FF7566 /* Sparkle.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = 341A2D5B1C7AB04700FF7566 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -604,6 +605,8 @@ 340FE4E015F3581200E4CE4E /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; 340FE50615F444AA00E4CE4E /* CaptureController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CaptureController.h; sourceTree = ""; }; 340FE50715F444AA00E4CE4E /* CaptureController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CaptureController.m; sourceTree = ""; }; + 3414C6AC1CBB9EBF00107C69 /* CSIRCompressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSIRCompressor.h; path = Compressor/CSIRCompressor.h; sourceTree = ""; }; + 3414C6AD1CBB9EBF00107C69 /* CSIRCompressor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSIRCompressor.m; path = Compressor/CSIRCompressor.m; sourceTree = ""; }; 3415CED21AE257DA002F11F5 /* CSTextCaptureBaseView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSTextCaptureBaseView.xib; path = Interface/CSTextCaptureBaseView.xib; sourceTree = ""; }; 341A2D5B1C7AB04700FF7566 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; 34210B3C1606001100362FC8 /* OutputDestination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OutputDestination.h; sourceTree = ""; }; @@ -1252,6 +1255,8 @@ 34F5141116FD6E4F00BA894D /* AppleVTCompressor.m */, 3434CB261CA8615A001B3DF9 /* AppleProResCompressor.h */, 3434CB271CA8615A001B3DF9 /* AppleProResCompressor.m */, + 3414C6AC1CBB9EBF00107C69 /* CSIRCompressor.h */, + 3414C6AD1CBB9EBF00107C69 /* CSIRCompressor.m */, ); name = Compressor; sourceTree = ""; @@ -2257,6 +2262,7 @@ 3400A0791BD4533A003E1828 /* CSInputLibraryWindowController.m in Sources */, 345F8B691A16C348009A81E3 /* CAMultiAudioGraph.m in Sources */, 3431FFE119786502000965FE /* InputSource.m in Sources */, + 3414C6AE1CBB9EBF00107C69 /* CSIRCompressor.m in Sources */, 34ED8C911B07371C002C0674 /* MIKMIDINoteOnCommand.m in Sources */, 3498D94F1A9472BD00906532 /* CSAudioSwitchControl.m in Sources */, 3400A0621BD44DF0003E1828 /* CSInputLibraryItem.m in Sources */, diff --git a/CocoaSplit/CSPluginServices.m b/CocoaSplit/CSPluginServices.m index 3b2d7189..d83cae86 100644 --- a/CocoaSplit/CSPluginServices.m +++ b/CocoaSplit/CSPluginServices.m @@ -14,7 +14,7 @@ @implementation CSPluginServices -+(id) sharedPluginServices ++(CSPluginServices *) sharedPluginServices { static CSPluginServices *sharedCSPluginServices = nil; static dispatch_once_t onceToken; @@ -26,6 +26,31 @@ return sharedCSPluginServices; } + + +-(double) currentFPS +{ + AppDelegate *myAppDelegate = [[NSApplication sharedApplication] delegate]; + if (myAppDelegate.captureController) + { + return myAppDelegate.captureController.captureFPS; + } + return 0.0; +} + + +-(int) audioSampleRate +{ + AppDelegate *myAppDelegate = [[NSApplication sharedApplication] delegate]; + if (myAppDelegate.captureController) + { + return myAppDelegate.captureController.audioSamplerate; + } + return 0; +} + + + -(void)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile withBlock:(void (^)(__unsafe_unretained Class))withBlock { [CaptureController loadPythonClass:pyClass fromFile:fromFile withBlock:withBlock]; diff --git a/CocoaSplit/CSTimedOutputBuffer.h b/CocoaSplit/CSTimedOutputBuffer.h index 9d0bd988..083d947b 100644 --- a/CocoaSplit/CSTimedOutputBuffer.h +++ b/CocoaSplit/CSTimedOutputBuffer.h @@ -9,6 +9,7 @@ #import #import "VideoCompressor.h" #import "FFMpegTask.h" +#import "CSIRCompressor.h" @interface CSTimedOutputBuffer : NSObject @@ -16,13 +17,17 @@ NSMutableArray *_frameBuffer; FFMpegTask *_outFFMpeg; float _currentBufferDuration; + } --(void) writeCurrentBuffer:(NSString *)toFile; -@property (strong) NSObject *compressor; @property (assign) float bufferDuration; @property (strong) NSString *name; +@property (strong) CSIRCompressor *compressor; + +-(void) writeCurrentBuffer:(NSString *)toFile; +-(instancetype) initWithCompressor:(id)compressor; + @end diff --git a/CocoaSplit/CSTimedOutputBuffer.m b/CocoaSplit/CSTimedOutputBuffer.m index f778b147..f3302887 100644 --- a/CocoaSplit/CSTimedOutputBuffer.m +++ b/CocoaSplit/CSTimedOutputBuffer.m @@ -23,6 +23,16 @@ return self; } +-(instancetype) initWithCompressor:(id)compressor +{ + if (self = [self init]) + { + _compressor = compressor; + [_compressor addOutput:self]; + } + + return self; +} -(void) writeCurrentBuffer:(NSString *)toFile { diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 6c00583d..0a920c43 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -110,6 +110,10 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , } +@property (assign) bool useInstantRecord; +@property (assign) int instantRecordBufferDuration; +@property (strong) NSString *instantRecordCompressor; + @property (strong) CSTimedOutputBuffer *instantRecorder; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index b4e03ead..8afc960e 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1133,12 +1133,6 @@ -(void) migrateDefaultCompressor:(NSMutableDictionary *)saveRoot { - if (self.compressors[@"x264"] && self.compressors[@"AppleVT"] && self.compressors[@"AppleProRes"]) - { - //We already migrated, or the user did it for us? - return; - } - id defaultCompressor = self.compressors[@"default"]; if (defaultCompressor) @@ -1184,9 +1178,16 @@ newCompressor.name = @"AppleProRes".mutableCopy; self.compressors[@"AppleProRes"] = newCompressor; [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorAdded object:newCompressor]; - - } + + if (!self.compressors[@"InstantRecorder"]) + { + CSIRCompressor *newCompressor = [[CSIRCompressor alloc] init]; + newCompressor.name = @"InstantRecorder".mutableCopy; + self.compressors[@"InstantRecorder"] = newCompressor; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorAdded object:newCompressor]; + } + } @@ -1390,14 +1391,16 @@ self.sourceLayouts = [saveRoot valueForKey:@"sourceLayouts"]; - self.instantRecorder = [[CSTimedOutputBuffer alloc] init]; - self.instantRecorder.bufferDuration = 10; + id irCompressor = self.compressors[@"InstantRecorder"]; + + if (irCompressor) + { + self.instantRecorder = [[CSTimedOutputBuffer alloc] initWithCompressor:irCompressor]; + self.instantRecorder.bufferDuration = 60; + } + + - NSObject *origCompressor = self.compressors[@"AppleProRes"]; - self.instantRecorder.compressor = origCompressor.copy; - [self.instantRecorder.compressor addOutput:self.instantRecorder]; - self.instantRecorder.compressor.settingsController = self; - dispatch_async(_main_capture_queue, ^{[self newFrameTimed];}); dispatch_async(_preview_queue, ^{ @@ -1629,28 +1632,11 @@ - for (id cKey in self.compressors) - { - id tmpcomp = self.compressors[cKey]; - tmpcomp.settingsController = self; - } - - for (OutputDestination *outdest in _captureDestinations) { //make the outputs pick up the default selected compressor [outdest setupCompressor]; } - - - - - //_frameCount = 0; - //_firstAudioTime = kCMTimeZero; - // _firstFrameTime = 0; - - - return YES; @@ -1815,7 +1801,7 @@ CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, pts); - if (self.instantRecorder) + if (self.instantRecorder && self.instantRecorder.compressor) { [self.instantRecorder.compressor addAudioData:sampleBuffer]; } @@ -2234,6 +2220,11 @@ for(id cKey in self.compressors) { + if (self.instantRecorder && [self.instantRecorder.compressor isEqualTo:cKey]) + { + continue; + } + CapturedFrameData *newFrameData = [[CapturedFrameData alloc] init]; newFrameData.videoPTS = pts; diff --git a/CocoaSplit/Compressor/AppleProResCompressor.h b/CocoaSplit/Compressor/AppleProResCompressor.h index fc39314f..5f82dbad 100644 --- a/CocoaSplit/Compressor/AppleProResCompressor.h +++ b/CocoaSplit/Compressor/AppleProResCompressor.h @@ -22,7 +22,6 @@ } -//@property (strong) id settingsController; //@property (strong) id outputDelegate; @property (strong) NSNumber *proResType; diff --git a/CocoaSplit/Compressor/AppleProResCompressor.m b/CocoaSplit/Compressor/AppleProResCompressor.m index 69a7f794..47444cd0 100644 --- a/CocoaSplit/Compressor/AppleProResCompressor.m +++ b/CocoaSplit/Compressor/AppleProResCompressor.m @@ -16,7 +16,6 @@ { AppleProResCompressor *copy = [[[self class] allocWithZone:zone] init]; - copy.settingsController = self.settingsController; copy.isNew = self.isNew; @@ -207,10 +206,6 @@ void __ProResPixelBufferRelease( void *releaseRefCon, const void *baseAddress ) { OSStatus status; - if (!self.settingsController) - { - return NO; - } [self setupResolution:videoFrame]; diff --git a/CocoaSplit/Compressor/AppleVTCompressor.h b/CocoaSplit/Compressor/AppleVTCompressor.h index 805a2040..53b9e413 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.h +++ b/CocoaSplit/Compressor/AppleVTCompressor.h @@ -22,7 +22,6 @@ } -//@property (strong) id settingsController; //@property (strong) id outputDelegate; @property (assign) int average_bitrate; diff --git a/CocoaSplit/Compressor/AppleVTCompressor.m b/CocoaSplit/Compressor/AppleVTCompressor.m index 032a4c8b..2e442de0 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.m +++ b/CocoaSplit/Compressor/AppleVTCompressor.m @@ -21,7 +21,6 @@ OSStatus VTCompressionSessionCopySupportedPropertyDictionary(VTCompressionSessio { AppleVTCompressor *copy = [[[self class] allocWithZone:zone] init]; - copy.settingsController = self.settingsController; copy.isNew = self.isNew; @@ -62,6 +61,9 @@ OSStatus VTCompressionSessionCopySupportedPropertyDictionary(VTCompressionSessio [aCoder encodeObject:self.resolutionOption forKey:@"resolutionOption"]; + [aCoder encodeBool:self.noHardware forKey:@"noHardware"]; + [aCoder encodeBool:self.forceHardware forKey:@"forceHardware"]; + } -(id) initWithCoder:(NSCoder *)aDecoder @@ -76,6 +78,9 @@ OSStatus VTCompressionSessionCopySupportedPropertyDictionary(VTCompressionSessio self.use_cbr = [aDecoder decodeBoolForKey:@"use_cbr"]; self.width = (int)[aDecoder decodeIntegerForKey:@"videoWidth"]; self.height = (int)[aDecoder decodeIntegerForKey:@"videoHeight"]; + self.noHardware = [aDecoder decodeBoolForKey:@"noHardware"]; + self.forceHardware = [aDecoder decodeBoolForKey:@"forceHardware"]; + if ([aDecoder containsValueForKey:@"resolutionOption"]) { self.resolutionOption = [aDecoder decodeObjectForKey:@"resolutionOption"]; @@ -217,10 +222,6 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) { OSStatus status; - if (!self.settingsController) - { - return NO; - } [self setupResolution:videoFrame]; diff --git a/CocoaSplit/Compressor/CSIRCompressor.h b/CocoaSplit/Compressor/CSIRCompressor.h new file mode 100644 index 00000000..e0676f1f --- /dev/null +++ b/CocoaSplit/Compressor/CSIRCompressor.h @@ -0,0 +1,22 @@ +// +// CSIRCompressor.h +// CocoaSplit +// +// Created by Zakk on 4/11/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CompressorBase.h" +#import "AppleVTCompressor.h" +@interface CSIRCompressor : CompressorBase +{ + + AppleVTCompressor *_appleh264; + +} + + +-(bool)compressFrame:(CapturedFrameData *)frameData; +-(void) addAudioData:(CMSampleBufferRef)sampleBuffer; + +@end diff --git a/CocoaSplit/Compressor/CSIRCompressor.m b/CocoaSplit/Compressor/CSIRCompressor.m new file mode 100644 index 00000000..2d49e906 --- /dev/null +++ b/CocoaSplit/Compressor/CSIRCompressor.m @@ -0,0 +1,169 @@ +// +// CSIRCompressor.m +// CocoaSplit +// +// Created by Zakk on 4/11/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSIRCompressor.h" +#import "OutputDestination.h" + +@implementation CSIRCompressor + +- (id)copyWithZone:(NSZone *)zone +{ + CSIRCompressor *copy = [[[self class] allocWithZone:zone] init]; + + + copy.isNew = self.isNew; + + copy.name = self.name; + + copy.compressorType = self.compressorType; + + copy.width = self.width; + copy.height = self.height; + copy.working_width = self.width; + copy.working_height = self.height; + + copy.resolutionOption = self.resolutionOption; + + return copy; +} + + +-(void) encodeWithCoder:(NSCoder *)aCoder +{ + + + [aCoder encodeObject:self.name forKey:@"name"]; + [aCoder encodeInteger:self.width forKey:@"videoWidth"]; + [aCoder encodeInteger:self.height forKey:@"videoHeight"]; + + [aCoder encodeObject:self.resolutionOption forKey:@"resolutionOption"]; + +} + +-(id) initWithCoder:(NSCoder *)aDecoder +{ + if (self = [self init]) + { + self.name = [aDecoder decodeObjectForKey:@"name"]; + self.width = (int)[aDecoder decodeIntegerForKey:@"videoWidth"]; + self.height = (int)[aDecoder decodeIntegerForKey:@"videoHeight"]; + + if ([aDecoder containsValueForKey:@"resolutionOption"]) + { + self.resolutionOption = [aDecoder decodeObjectForKey:@"resolutionOption"]; + } + + } + + return self; +} + + +-(id)init +{ + if (self = [super init]) + { + + + + self.compressorType = @"Instant Replay Compressor"; + + } + + return self; +} + + +-(void) reset +{ + self.errored = NO; +} + + +- (void) dealloc +{ + [self reset]; +} + + + +-(bool)compressFrame:(CapturedFrameData *)frameData +{ + + + if (![self hasOutputs]) + { + return NO; + } + + [self setAudioData:frameData syncObj:self]; + + if (!_appleh264) + { + _appleh264 = [[AppleVTCompressor alloc] init]; + _appleh264.average_bitrate = 9000; + _appleh264.max_bitrate = 150000; + _appleh264.keyframe_interval = 2; + _appleh264.forceHardware = YES; + [_appleh264 addOutput:self]; + } + + bool ret = [_appleh264 compressFrame:frameData]; + if (!ret && _appleh264.errored) + { + _appleh264.forceHardware = NO; + _appleh264.noHardware = YES; + ret = [_appleh264 compressFrame:frameData]; + } + + + return ret; +} + + +-(void) writeEncodedData:(CapturedFrameData *)frameData +{ + for (id dKey in self.outputs) + { + + OutputDestination *dest = self.outputs[dKey]; + + [dest writeEncodedData:frameData]; + + + } + +} + + +- (bool)setupCompressor:(CVPixelBufferRef)videoFrame +{ + OSStatus status; + + + [self setupResolution:videoFrame]; + + if (!self.working_height || !self.working_width) + { + self.errored = YES; + return NO; + } + + + return YES; + +} + + + +-(id )getConfigurationView +{ + return nil; +} + +@end diff --git a/CocoaSplit/Compressor/CompressorBase.h b/CocoaSplit/Compressor/CompressorBase.h index 002199ab..113bb7c3 100644 --- a/CocoaSplit/Compressor/CompressorBase.h +++ b/CocoaSplit/Compressor/CompressorBase.h @@ -20,7 +20,6 @@ -@property (strong) CaptureController *settingsController; @property (strong) NSMutableDictionary *outputs; diff --git a/CocoaSplit/Compressor/VideoCompressor.h b/CocoaSplit/Compressor/VideoCompressor.h index ab357e44..d9a40e9f 100644 --- a/CocoaSplit/Compressor/VideoCompressor.h +++ b/CocoaSplit/Compressor/VideoCompressor.h @@ -33,7 +33,6 @@ -@property (strong) CaptureController *settingsController; @property (assign) bool isNew; @property (strong) NSMutableString *name; @property (strong) NSString *compressorType; diff --git a/CocoaSplit/Compressor/x264Compressor.h b/CocoaSplit/Compressor/x264Compressor.h index b2789de4..8d4efaae 100644 --- a/CocoaSplit/Compressor/x264Compressor.h +++ b/CocoaSplit/Compressor/x264Compressor.h @@ -16,6 +16,7 @@ #import #import "CapturedFrameData.h" #import "CompressorBase.h" +#import "CSPluginServices.h" #import "x264.h" @@ -44,7 +45,6 @@ @property (strong) NSMutableArray *x264profiles; -@property (strong) CaptureController *settingsController; @property (strong) NSString *preset; diff --git a/CocoaSplit/Compressor/x264Compressor.m b/CocoaSplit/Compressor/x264Compressor.m index 9c1a685b..fef7eadd 100644 --- a/CocoaSplit/Compressor/x264Compressor.m +++ b/CocoaSplit/Compressor/x264Compressor.m @@ -26,7 +26,6 @@ copy.x264presets = self.x264presets; copy.x264profiles = self.x264profiles; - copy.settingsController = self.settingsController; copy.isNew = self.isNew; copy.name = self.name; @@ -186,11 +185,6 @@ return NO; } - if (!self.settingsController) - { - return NO; - } - if (!_av_codec && !self.errored) { @@ -416,12 +410,6 @@ NSLog(@"IN COMPRESSOR SETUP"); - if (!self.settingsController) - { - return NO; - } - - NSString *useAdvancedSettings = self.advancedSettings.copy; @@ -453,11 +441,15 @@ int real_keyframe_interval = 0; + + double captureFPS = [CSPluginServices sharedPluginServices].currentFPS; + + if (!self.keyframe_interval) { - real_keyframe_interval = self.settingsController.captureFPS*2; + real_keyframe_interval = captureFPS*2; } else { - real_keyframe_interval = self.settingsController.captureFPS*self.keyframe_interval; + real_keyframe_interval = captureFPS*self.keyframe_interval; } diff --git a/CocoaSplit/Interface/advancedPrefPanel.xib b/CocoaSplit/Interface/advancedPrefPanel.xib index a230de58..d7752633 100644 --- a/CocoaSplit/Interface/advancedPrefPanel.xib +++ b/CocoaSplit/Interface/advancedPrefPanel.xib @@ -1,8 +1,8 @@ - + - + @@ -15,15 +15,14 @@ - + - + - + - @@ -55,8 +53,7 @@ DQ - - + @@ -64,8 +61,7 @@ DQ - - + @@ -73,16 +69,14 @@ DQ - - + @@ -101,8 +94,7 @@ DQ - - + @@ -110,8 +102,7 @@ DQ - - + @@ -122,8 +113,7 @@ DQ - - + @@ -134,8 +124,7 @@ DQ - - + @@ -143,8 +132,7 @@ DQ - - + @@ -155,8 +143,7 @@ DQ - - + @@ -175,8 +161,7 @@ DQ - - + @@ -186,6 +171,29 @@ DQ + + + + + + + + + + + + + + + + + @@ -195,8 +203,8 @@ DQ - + diff --git a/CocoaSplit/PluginHeaders/CSPluginServices.h b/CocoaSplit/PluginHeaders/CSPluginServices.h index 994dac1c..847d38bb 100644 --- a/CocoaSplit/PluginHeaders/CSPluginServices.h +++ b/CocoaSplit/PluginHeaders/CSPluginServices.h @@ -13,12 +13,14 @@ -+(id)sharedPluginServices; ++(CSPluginServices *)sharedPluginServices; -(CSPcmPlayer *)createPCMInput:(NSString *)forUID withFormat:(const AudioStreamBasicDescription *)withFormat; -(void)removePCMInput:(CSPcmPlayer *)toRemove; -(void)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile withBlock:(void(^)(Class))withBlock; -(Class)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile; +@property (readonly) double currentFPS; +@property (readonly) int audioSampleRate; @end From b516a87435a15032ebcdc733495f4b327a50baf3 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 16 Apr 2016 00:26:56 -0400 Subject: [PATCH 058/156] Added preference settings for using instant record, and the buffer length --- CocoaSplit/CaptureController.m | 32 +++++++++++++++++----- CocoaSplit/Interface/advancedPrefPanel.xib | 6 ++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 8afc960e..edd4d7ee 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -662,6 +662,8 @@ _layoutWindows = [NSMutableArray array]; self.transitionDirections = @[kCATransitionFromTop, kCATransitionFromRight, kCATransitionFromBottom, kCATransitionFromLeft]; + self.useInstantRecord = YES; + self.instantRecordBufferDuration = 60; NSArray *caTransitionNames = @[kCATransitionFade, kCATransitionPush, kCATransitionMoveIn, kCATransitionReveal, @"cube", @"alignedCube", @"flip", @"alignedFlip"]; @@ -1217,8 +1219,10 @@ [saveRoot setValue: [NSNumber numberWithBool:self.useStatusColors] forKey:@"useStatusColors"]; [saveRoot setValue:self.compressors forKey:@"compressors"]; [saveRoot setValue:self.extraSaveData forKey:@"extraSaveData"]; - + [saveRoot setValue: [NSNumber numberWithBool:self.useInstantRecord] forKey:@"useInstantRecord"]; + [saveRoot setValue:[NSNumber numberWithInt:self.instantRecordBufferDuration] forKey:@"instantRecordBufferDuration"]; + @@ -1286,6 +1290,17 @@ [saveRoot addEntriesFromDictionary:savedValues]; + if (saveRoot[@"useInstantRecord"]) + { + self.useInstantRecord = [[saveRoot valueForKey:@"useInstantRecord"] boolValue]; + } + + if (saveRoot[@"instantRecordBufferDuration"]) + { + self.instantRecordBufferDuration = [[saveRoot valueForKey:@"instantRecordBufferDuration"] intValue]; + } + + self.transitionName = [saveRoot valueForKey:@"transitionName"]; self.transitionDirection = [saveRoot valueForKey:@"transitionDirection"]; @@ -1390,13 +1405,16 @@ self.extraPluginsSaveData = nil; self.sourceLayouts = [saveRoot valueForKey:@"sourceLayouts"]; - - id irCompressor = self.compressors[@"InstantRecorder"]; - - if (irCompressor) + if (self.useInstantRecord) { - self.instantRecorder = [[CSTimedOutputBuffer alloc] initWithCompressor:irCompressor]; - self.instantRecorder.bufferDuration = 60; + + id irCompressor = self.compressors[@"InstantRecorder"]; + + if (irCompressor) + { + self.instantRecorder = [[CSTimedOutputBuffer alloc] initWithCompressor:irCompressor]; + self.instantRecorder.bufferDuration = self.instantRecordBufferDuration; + } } diff --git a/CocoaSplit/Interface/advancedPrefPanel.xib b/CocoaSplit/Interface/advancedPrefPanel.xib index d7752633..fd50ef72 100644 --- a/CocoaSplit/Interface/advancedPrefPanel.xib +++ b/CocoaSplit/Interface/advancedPrefPanel.xib @@ -177,6 +177,9 @@ DQ + + + @@ -193,6 +196,9 @@ DQ + + + From b50be308a54587f43c65cd31887fa86394010317 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 16 Apr 2016 12:26:38 -0400 Subject: [PATCH 059/156] instant recorder enable/disable is settable via preferences, along with buffer length. Default directory is now user's movies directory, filenames now contain a time/date element --- CocoaSplit/CaptureController.h | 2 + CocoaSplit/CaptureController.m | 82 ++++++++++++++++++++++++++++++---- 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 0a920c43..a82e0abb 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -113,6 +113,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (assign) bool useInstantRecord; @property (assign) int instantRecordBufferDuration; @property (strong) NSString *instantRecordCompressor; +@property (strong) NSString *instantRecordDirectory; + @property (strong) CSTimedOutputBuffer *instantRecorder; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index edd4d7ee..b6bb276b 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -42,6 +42,9 @@ @synthesize stagingLayout = _stagingLayout; @synthesize audioSamplerate = _audioSamplerate; @synthesize transitionName = _transitionName; +@synthesize useInstantRecord = _useInstantRecord; +@synthesize instantRecordBufferDuration = _instantRecordBufferDuration; + @@ -1132,6 +1135,19 @@ dispatch_resume(_log_source); } + +-(void) setupInstantRecorder +{ + id irCompressor = self.compressors[@"InstantRecorder"]; + + if (irCompressor) + { + self.instantRecorder = [[CSTimedOutputBuffer alloc] initWithCompressor:irCompressor]; + self.instantRecorder.bufferDuration = self.instantRecordBufferDuration; + } +} + + -(void) migrateDefaultCompressor:(NSMutableDictionary *)saveRoot { @@ -1405,16 +1421,11 @@ self.extraPluginsSaveData = nil; self.sourceLayouts = [saveRoot valueForKey:@"sourceLayouts"]; + + if (self.useInstantRecord) { - - id irCompressor = self.compressors[@"InstantRecorder"]; - - if (irCompressor) - { - self.instantRecorder = [[CSTimedOutputBuffer alloc] initWithCompressor:irCompressor]; - self.instantRecorder.bufferDuration = self.instantRecordBufferDuration; - } + [self setupInstantRecorder]; } @@ -1475,9 +1486,43 @@ } +-(void)setInstantRecordBufferDuration:(int)instantRecordBufferDuration +{ + _instantRecordBufferDuration = instantRecordBufferDuration; + + if (_instantRecordBufferDuration <= 0) + { + self.instantRecorder = nil; + } else { + if (self.instantRecorder) + { + self.instantRecorder.bufferDuration = _instantRecordBufferDuration; + } + } +} + +-(int)instantRecordBufferDuration +{ + return _instantRecordBufferDuration; +} +-(void) setUseInstantRecord:(bool)useInstantRecord +{ + _useInstantRecord = useInstantRecord; + + if (useInstantRecord) + { + [self setupInstantRecorder]; + } else { + self.instantRecorder = nil; + } +} +-(bool)useInstantRecord +{ + return _useInstantRecord; +} -(void)controlTextDidEndEditing:(NSNotification *)obj @@ -2997,7 +3042,26 @@ { if (self.instantRecorder) { - [self.instantRecorder writeCurrentBuffer:@"/tmp/instant_record.mov"]; + + NSString *directory = self.instantRecordDirectory; + + if (!directory) + { + NSArray *mPaths = NSSearchPathForDirectoriesInDomains(NSMoviesDirectory, NSUserDomainMask, YES); + directory = mPaths.firstObject; + } + + if (directory) + { + NSDateFormatter *dFormat = [[NSDateFormatter alloc] init]; + dFormat.dateFormat = @"yyyyMMddHHmmss"; + NSString *dateStr = [dFormat stringFromDate:[NSDate date]]; + NSString *useFilename = [NSString stringWithFormat:@"CS_instant_record-%@.mov", dateStr]; + + NSString *savePath = [NSString pathWithComponents:@[directory, useFilename]]; + + [self.instantRecorder writeCurrentBuffer:savePath]; + } } } From 2c9858ae106d8f547db5c0f3ebcad963485df885 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 16 Apr 2016 13:02:30 -0400 Subject: [PATCH 060/156] Added preference for instant record destination directory --- CocoaSplit/CaptureController.h | 1 + CocoaSplit/CaptureController.m | 25 ++++++++++++++++++- CocoaSplit/Interface/advancedPrefPanel.xib | 29 ++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index a82e0abb..d6c3fdef 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -232,6 +232,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , - (IBAction)openCreateSheet:(id)sender; +- (IBAction)chooseInstantRecordDirectory:(id)sender; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index b6bb276b..f16ad684 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -427,6 +427,25 @@ [self openOutputSheet:nil]; } +- (IBAction)chooseInstantRecordDirectory:(id)sender +{ + + NSOpenPanel *panel = [NSOpenPanel openPanel]; + panel.canChooseDirectories = YES; + panel.canCreateDirectories = YES; + panel.canChooseFiles = NO; + panel.allowsMultipleSelection = NO; + + [panel beginWithCompletionHandler:^(NSInteger result) { + if (result == NSFileHandlingPanelOKButton) + { + self.instantRecordDirectory = panel.URL.path; + } + + }]; + +} + -(void)buildScreensInfo:(NSNotification *)notification { @@ -624,6 +643,7 @@ } + -(void)exportLayout:(SourceLayout *)layout { NSSavePanel *panel = [NSSavePanel savePanel]; @@ -1238,7 +1258,8 @@ [saveRoot setValue: [NSNumber numberWithBool:self.useInstantRecord] forKey:@"useInstantRecord"]; [saveRoot setValue:[NSNumber numberWithInt:self.instantRecordBufferDuration] forKey:@"instantRecordBufferDuration"]; - + [saveRoot setValue:self.instantRecordDirectory forKey:@"instantRecordDirectory"]; + @@ -1316,6 +1337,8 @@ self.instantRecordBufferDuration = [[saveRoot valueForKey:@"instantRecordBufferDuration"] intValue]; } + self.instantRecordDirectory = [saveRoot valueForKey:@"instantRecordDirectory"]; + self.transitionName = [saveRoot valueForKey:@"transitionName"]; diff --git a/CocoaSplit/Interface/advancedPrefPanel.xib b/CocoaSplit/Interface/advancedPrefPanel.xib index fd50ef72..1f7d04e8 100644 --- a/CocoaSplit/Interface/advancedPrefPanel.xib +++ b/CocoaSplit/Interface/advancedPrefPanel.xib @@ -200,6 +200,35 @@ DQ + + + + + + + + + + + + + + + + + + + + From 2e0e0d8c3beab77ac3fa05694ea29d80d55f96a2 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 16 Apr 2016 23:28:26 -0400 Subject: [PATCH 061/156] Reset instant recorder compressor when layout changes resolution; defer if we are currently live. --- CocoaSplit/CaptureController.h | 1 + CocoaSplit/CaptureController.m | 76 ++++++++++++++++++----- CocoaSplit/Compressor/AppleVTCompressor.m | 3 +- CocoaSplit/Compressor/CSIRCompressor.m | 4 ++ CocoaSplit/Compressor/CompressorBase.m | 15 ++++- CocoaSplit/Compressor/VideoCompressor.h | 1 + CocoaSplit/Compressor/x264Compressor.m | 1 - CocoaSplit/LayoutRenderer.m | 1 + 8 files changed, 81 insertions(+), 21 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index d6c3fdef..99f48292 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -107,6 +107,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , NSMutableArray *_screensCache; NSMutableArray *_layoutWindows; + bool _needsIRReset; } diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index f16ad684..840c4b6c 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1156,6 +1156,26 @@ } + +-(void) resetInstantRecorder +{ + + + if (self.instantRecorder && self.instantRecorder.compressor) + { + id irCompressor = self.instantRecorder.compressor; + if ([irCompressor outputCount] > 1 && !_needsIRReset) + { + _needsIRReset = YES; + } else { + [irCompressor reset]; + [self setupInstantRecorder]; + } + + } +} + + -(void) setupInstantRecorder { id irCompressor = self.compressors[@"InstantRecorder"]; @@ -1445,19 +1465,6 @@ self.sourceLayouts = [saveRoot valueForKey:@"sourceLayouts"]; - - if (self.useInstantRecord) - { - [self setupInstantRecorder]; - } - - - - dispatch_async(_main_capture_queue, ^{[self newFrameTimed];}); - - dispatch_async(_preview_queue, ^{ - [self newStagingFrameTimed]; - }); if (!self.sourceLayouts) { self.sourceLayouts = [[NSMutableArray alloc] init]; @@ -1486,7 +1493,7 @@ } else { self.stagingLayout = tmpLayout; } - + //[self.stagingLayout mergeSourceLayout:tmpLayout withLayer:nil]; } @@ -1499,12 +1506,27 @@ _firstAudioTime = kCMTimeZero; + + + dispatch_async(_main_capture_queue, ^{[self newFrameTimed];}); + + dispatch_async(_preview_queue, ^{ + [self newStagingFrameTimed]; + }); + + CSAacEncoder *audioEnc = [[CSAacEncoder alloc] init]; audioEnc.encodedReceiver = self; audioEnc.sampleRate = self.audioSamplerate; audioEnc.bitRate = self.audioBitrate*1000; self.multiAudioEngine.encoder = audioEnc; + + if (self.useInstantRecord) + { + [self setupInstantRecorder]; + } + } @@ -1796,6 +1818,11 @@ for (id cKey in self.compressors) { id ctmp = self.compressors[cKey]; + if (ctmp && self.instantRecorder && [self.instantRecorder.compressor isEqual:ctmp]) + { + continue; + } + if (ctmp) { [ctmp reset]; @@ -1822,6 +1849,13 @@ [[NSProcessInfo processInfo] endActivity:_activity_token]; } + if (_needsIRReset) + { + [self resetInstantRecorder]; + _needsIRReset = NO; + } + + //self.multiAudioEngine.encoder = nil; [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationStreamStopped object:self userInfo:nil]; @@ -1899,6 +1933,11 @@ { id compressor; compressor = self.compressors[cKey]; + if (self.instantRecorder && [self.instantRecorder.compressor isEqual:compressor]) + { + continue; + } + [compressor addAudioData:sampleBuffer]; } } @@ -2100,6 +2139,7 @@ { _staging_frame_interval = 1.0/self.stagingPreviewView.sourceLayout.frameRate; _frame_interval = 1.0/self.livePreviewView.sourceLayout.frameRate; + [self resetInstantRecorder]; } @@ -2306,7 +2346,11 @@ for(id cKey in self.compressors) { - if (self.instantRecorder && [self.instantRecorder.compressor isEqualTo:cKey]) + + id compressor; + compressor = self.compressors[cKey]; + + if (self.instantRecorder && [self.instantRecorder.compressor isEqual:compressor]) { continue; } @@ -2319,8 +2363,6 @@ newFrameData.frameTime = _frame_time; newFrameData.videoFrame = videoFrame; - id compressor; - compressor = self.compressors[cKey]; [compressor compressFrame:newFrameData]; } diff --git a/CocoaSplit/Compressor/AppleVTCompressor.m b/CocoaSplit/Compressor/AppleVTCompressor.m index 2e442de0..3da8b958 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.m +++ b/CocoaSplit/Compressor/AppleVTCompressor.m @@ -165,7 +165,7 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) return NO; } - + CFMutableDictionaryRef frameProperties; @@ -232,6 +232,7 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) } + NSMutableDictionary *encoderSpec = [[NSMutableDictionary alloc] init]; bool enableVal = !self.noHardware; diff --git a/CocoaSplit/Compressor/CSIRCompressor.m b/CocoaSplit/Compressor/CSIRCompressor.m index 2d49e906..562ed8e7 100644 --- a/CocoaSplit/Compressor/CSIRCompressor.m +++ b/CocoaSplit/Compressor/CSIRCompressor.m @@ -82,6 +82,8 @@ -(void) reset { self.errored = NO; + [_appleh264 reset]; + } @@ -113,11 +115,13 @@ [_appleh264 addOutput:self]; } + bool ret = [_appleh264 compressFrame:frameData]; if (!ret && _appleh264.errored) { _appleh264.forceHardware = NO; _appleh264.noHardware = YES; + ret = [_appleh264 compressFrame:frameData]; } diff --git a/CocoaSplit/Compressor/CompressorBase.m b/CocoaSplit/Compressor/CompressorBase.m index 0c78ed8f..a5b7b3ee 100644 --- a/CocoaSplit/Compressor/CompressorBase.m +++ b/CocoaSplit/Compressor/CompressorBase.m @@ -158,14 +158,22 @@ -(void) addOutput:(OutputDestination *)destination { - [self.outputs setObject:destination forKey:destination.name]; + + + [self.outputs setObject:destination forKey:[NSValue valueWithPointer:(__bridge const void * _Nullable)(destination)]]; self.active = YES; } +-(NSInteger)outputCount +{ + return self.outputs.count; +} + + -(void) removeOutput:(OutputDestination *)destination { - [self.outputs removeObjectForKey:destination.name]; + [self.outputs removeObjectForKey:[NSValue valueWithPointer:(__bridge const void * _Nullable)(destination)]]; if (self.outputs.count == 0) { [self reset]; @@ -185,6 +193,7 @@ self.working_height = self.height; self.working_width = self.width; + if (!self.resolutionOption || [self.resolutionOption isEqualToString:@"None"]) { if (!(self.working_height > 0) || !(self.working_width > 0)) @@ -200,6 +209,8 @@ { self.working_height = (int)CVPixelBufferGetHeight(withFrame); self.working_width = (int)CVPixelBufferGetWidth(withFrame); + NSLog(@"WORKING WIDTH %d", self.working_width); + } else if ([self.resolutionOption isEqualToString:@"Preserve AR"]) { float inputAR = (float)CVPixelBufferGetWidth(withFrame) / (float)CVPixelBufferGetHeight(withFrame); int newWidth; diff --git a/CocoaSplit/Compressor/VideoCompressor.h b/CocoaSplit/Compressor/VideoCompressor.h index d9a40e9f..85015424 100644 --- a/CocoaSplit/Compressor/VideoCompressor.h +++ b/CocoaSplit/Compressor/VideoCompressor.h @@ -46,6 +46,7 @@ -(void) addOutput:(id)destination; -(void) removeOutput:(id)destination; -(bool) hasOutputs; +-(NSInteger) outputCount; -(void) reset; -(bool) validate:(NSError **)therror; -(void) addAudioData:(CMSampleBufferRef)audioData; diff --git a/CocoaSplit/Compressor/x264Compressor.m b/CocoaSplit/Compressor/x264Compressor.m index fef7eadd..d45490af 100644 --- a/CocoaSplit/Compressor/x264Compressor.m +++ b/CocoaSplit/Compressor/x264Compressor.m @@ -409,7 +409,6 @@ - NSLog(@"IN COMPRESSOR SETUP"); NSString *useAdvancedSettings = self.advancedSettings.copy; diff --git a/CocoaSplit/LayoutRenderer.m b/CocoaSplit/LayoutRenderer.m index 60acf793..b9516c41 100644 --- a/CocoaSplit/LayoutRenderer.m +++ b/CocoaSplit/LayoutRenderer.m @@ -188,6 +188,7 @@ glDepthMask(GL_FALSE); + CGLTexImageIOSurface2D(self.cglCtx, GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, (int)IOSurfaceGetWidth(ioSurface), (int)IOSurfaceGetHeight(ioSurface), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, ioSurface, 0); GLenum fboStatus; From e3d15072c1dca78166ad41c9c5abd6a28f575818 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 17 Apr 2016 00:17:47 -0400 Subject: [PATCH 062/156] Added notifications for layout dimension and framerate changes. Only reset IR compressor if the live layout changes --- CSNotifications.m | 3 +- CocoaSplit/CaptureController.m | 16 +++++++-- CocoaSplit/CreateLayoutViewController.h | 4 +++ CocoaSplit/CreateLayoutViewController.m | 23 +++++++++++++ CocoaSplit/CreateLayoutViewController.xib | 19 +++-------- .../Interface/EditBuiltinLayoutView.xib | 16 +++------ CocoaSplit/PluginHeaders/CSNotifications.h | 2 ++ CocoaSplit/PreviewView.m | 6 ++-- CocoaSplit/SourceLayout.h | 1 + CocoaSplit/SourceLayout.m | 33 +++++++++++++++++++ 10 files changed, 89 insertions(+), 34 deletions(-) diff --git a/CSNotifications.m b/CSNotifications.m index de0bf98e..b0f29e0f 100644 --- a/CSNotifications.m +++ b/CSNotifications.m @@ -9,7 +9,8 @@ NSString *const CSNotificationLayoutAdded = @"CSNotificationLayoutAdded"; NSString *const CSNotificationLayoutDeleted = @"CSNotificationLayoutDeleted"; - +NSString *const CSNotificationLayoutCanvasChanged = @"CSNotificationLayoutCanvasChanged"; +NSString *const CSNotificationLayoutFramerateChanged = @"CSNotificationLayoutFramerateChanged"; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 840c4b6c..9cbc6b36 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -830,6 +830,10 @@ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buildScreensInfo:) name:NSApplicationDidChangeScreenParametersNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(layoutCanvasChanged:) name:CSNotificationLayoutCanvasChanged object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(layoutCanvasChanged:) name:CSNotificationLayoutFramerateChanged object:nil]; + } @@ -839,6 +843,16 @@ } +-(void)layoutCanvasChanged:(NSNotification *)notification +{ + SourceLayout *layout = [notification object]; + + if ([layout isEqual:self.livePreviewView.sourceLayout]) + { + [self resetInstantRecorder]; + } +} + -(NSData *)archiveLayout:(SourceLayout *)layout { @@ -2139,14 +2153,12 @@ { _staging_frame_interval = 1.0/self.stagingPreviewView.sourceLayout.frameRate; _frame_interval = 1.0/self.livePreviewView.sourceLayout.frameRate; - [self resetInstantRecorder]; } -(void) newFrameTimed { - double startTime; startTime = [self mach_time_seconds]; diff --git a/CocoaSplit/CreateLayoutViewController.h b/CocoaSplit/CreateLayoutViewController.h index 10031fbc..726b3891 100644 --- a/CocoaSplit/CreateLayoutViewController.h +++ b/CocoaSplit/CreateLayoutViewController.h @@ -18,6 +18,10 @@ @property (strong) SourceLayout *sourceLayout; @property (assign) bool createDialog; + +@property (assign) int canvas_width; +@property (assign) int canvas_height; + - (IBAction)createButtonClicked:(id)sender; -(instancetype) initForBuiltin; diff --git a/CocoaSplit/CreateLayoutViewController.m b/CocoaSplit/CreateLayoutViewController.m index cccfa2fb..95cf6b5c 100644 --- a/CocoaSplit/CreateLayoutViewController.m +++ b/CocoaSplit/CreateLayoutViewController.m @@ -13,6 +13,7 @@ @end @implementation CreateLayoutViewController +@synthesize sourceLayout = _sourceLayout; -(instancetype) init @@ -44,6 +45,12 @@ [self commitEditing]; + if (self.sourceLayout) + { + [self.sourceLayout updateCanvasWidth:self.canvas_width height:self.canvas_height]; + } + + if (self.sourceLayout && self.createDialog) { [self.controller addLayoutFromBase:self.sourceLayout]; @@ -61,5 +68,21 @@ } +-(SourceLayout *)sourceLayout +{ + return _sourceLayout; +} + + +-(void) setSourceLayout:(SourceLayout *)sourceLayout +{ + _sourceLayout = sourceLayout; + if (_sourceLayout) + { + self.canvas_width = sourceLayout.canvas_width; + self.canvas_height = sourceLayout.canvas_height; + } +} + @end diff --git a/CocoaSplit/CreateLayoutViewController.xib b/CocoaSplit/CreateLayoutViewController.xib index 59d1afa6..c78ea6c9 100644 --- a/CocoaSplit/CreateLayoutViewController.xib +++ b/CocoaSplit/CreateLayoutViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -18,7 +18,6 @@ - @@ -30,7 +29,6 @@ - @@ -39,7 +37,6 @@ - @@ -48,7 +45,6 @@ - @@ -60,7 +56,6 @@ - @@ -69,7 +64,6 @@ - @@ -78,7 +72,6 @@ - @@ -87,31 +80,28 @@ - - + - - + - diff --git a/CocoaSplit/Interface/EditBuiltinLayoutView.xib b/CocoaSplit/Interface/EditBuiltinLayoutView.xib index 79c53dfc..5e92bc79 100644 --- a/CocoaSplit/Interface/EditBuiltinLayoutView.xib +++ b/CocoaSplit/Interface/EditBuiltinLayoutView.xib @@ -1,8 +1,8 @@ - + - + @@ -18,7 +18,6 @@ - @@ -27,7 +26,6 @@ - @@ -36,31 +34,28 @@ - - + - - + - @@ -72,7 +67,6 @@ - @@ -94,7 +87,6 @@ DQ - diff --git a/CocoaSplit/PluginHeaders/CSNotifications.h b/CocoaSplit/PluginHeaders/CSNotifications.h index 2192c5fa..89f50359 100644 --- a/CocoaSplit/PluginHeaders/CSNotifications.h +++ b/CocoaSplit/PluginHeaders/CSNotifications.h @@ -11,6 +11,8 @@ extern NSString *const CSNotificationLayoutAdded; extern NSString *const CSNotificationLayoutDeleted; +extern NSString *const CSNotificationLayoutCanvasChanged; +extern NSString *const CSNotificationLayoutFramerateChanged; diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 3ba7559c..bff2dd9e 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -319,11 +319,9 @@ if (tag < 2) { - self.sourceLayout.canvas_width = 1280; - self.sourceLayout.canvas_height = 720; + [self.sourceLayout updateCanvasWidth:1280 height:720]; } else if (tag < 4) { - self.sourceLayout.canvas_width = 1920; - self.sourceLayout.canvas_height = 1080; + [self.sourceLayout updateCanvasWidth:1920 height:1080]; } if ((tag % 2) == 0) diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index cf9264e6..280482bc 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -115,6 +115,7 @@ -(void)replaceWithSourceLayout:(SourceLayout *)layout; -(void)clearSourceList; -(void)setupMIDI; +-(void)updateCanvasWidth:(int)width height:(int)height; diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 3c0d6ac6..14c48198 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -16,6 +16,7 @@ @synthesize isActive = _isActive; @synthesize animationIndexes = _animationIndexes; +@synthesize frameRate = _frameRate; -(instancetype) init { @@ -369,6 +370,24 @@ } + +-(float)frameRate +{ + return _frameRate; +} + + +-(void)setFrameRate:(float)frameRate +{ + float oldframerate = _frameRate; + + _frameRate = frameRate; + + if (_frameRate != oldframerate) + { + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationLayoutFramerateChanged object:self userInfo:nil]; + } +} -(void)applyAddBlock { if (self.addLayoutBlock) @@ -1481,6 +1500,20 @@ } +-(void)updateCanvasWidth:(int)width height:(int)height +{ + int old_height = self.canvas_height; + int old_width = self.canvas_width; + + self.canvas_height = height; + self.canvas_width = width; + + if ((old_height != height) || (old_width != width)) + { + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationLayoutCanvasChanged object:self userInfo:nil]; + } +} + -(void)frameTick { From e4eea315d6f533818d2e26fc83c029349373745e Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 17 Apr 2016 00:29:38 -0400 Subject: [PATCH 063/156] Change instant record file name to use more legible date/time --- CocoaSplit/CaptureController.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 9cbc6b36..d7796152 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -3131,7 +3131,8 @@ if (directory) { NSDateFormatter *dFormat = [[NSDateFormatter alloc] init]; - dFormat.dateFormat = @"yyyyMMddHHmmss"; + dFormat.dateStyle = NSDateFormatterMediumStyle; + dFormat.timeStyle = NSDateFormatterMediumStyle; NSString *dateStr = [dFormat stringFromDate:[NSDate date]]; NSString *useFilename = [NSString stringWithFormat:@"CS_instant_record-%@.mov", dateStr]; From 3a20d36465d5a5c9676f2254f9ec1075b65dd941 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 17 Apr 2016 10:58:35 -0400 Subject: [PATCH 064/156] Added basic configuration options to instant recorder compressor --- CocoaSplit.xcodeproj/project.pbxproj | 10 ++ CocoaSplit/Compressor/AppleVTCompressor.h | 1 + CocoaSplit/Compressor/AppleVTCompressor.m | 26 ++++ CocoaSplit/Compressor/CSIRCompressor.h | 9 ++ CocoaSplit/Compressor/CSIRCompressor.m | 123 ++++++++++++++---- ...SInstantRecorderCompressorViewController.h | 24 ++++ ...SInstantRecorderCompressorViewController.m | 24 ++++ ...nstantRecorderCompressorViewController.xib | 84 ++++++++++++ .../CSAppleH264CompressorViewController.xib | 2 +- .../CSx264CompressorViewController.xib | 6 +- 10 files changed, 279 insertions(+), 30 deletions(-) create mode 100644 CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.h create mode 100644 CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.m create mode 100644 CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.xib diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 747a610f..d4ff6fd5 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -130,6 +130,8 @@ 345F8B7A1A183D1D009A81E3 /* CAMultiAudioEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 345F8B781A183D1D009A81E3 /* CAMultiAudioEngine.m */; }; 3460E58A1AC766260080358E /* rotate.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3460E5871AC764500080358E /* rotate.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 3463F99F1AD1594300F3B5C8 /* movement.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3463F99D1AD0DC7100F3B5C8 /* movement.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 346865471CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 346865451CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m */; }; + 346865481CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 346865461CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.xib */; }; 346CF44C1A5C10C2008E5BFF /* CSInputLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */; }; 346CF44D1A5C10C2008E5BFF /* CSInputLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */; }; 347277FD1A5A2758008801A9 /* CSIOSurfaceLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 347277FC1A5A2758008801A9 /* CSIOSurfaceLayer.m */; }; @@ -702,6 +704,9 @@ 345F8B7B1A184FBC009A81E3 /* CAMultiAudioMixingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CAMultiAudioMixingProtocol.h; sourceTree = ""; }; 3460E5871AC764500080358E /* rotate.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = rotate.py; sourceTree = ""; }; 3463F99D1AD0DC7100F3B5C8 /* movement.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = movement.py; sourceTree = ""; }; + 346865441CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSInstantRecorderCompressorViewController.h; path = Compressor/CSInstantRecorderCompressorViewController.h; sourceTree = ""; }; + 346865451CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSInstantRecorderCompressorViewController.m; path = Compressor/CSInstantRecorderCompressorViewController.m; sourceTree = ""; }; + 346865461CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSInstantRecorderCompressorViewController.xib; path = Compressor/CSInstantRecorderCompressorViewController.xib; sourceTree = ""; }; 346CF44A1A5C10C2008E5BFF /* CSInputLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSInputLayer.h; sourceTree = ""; }; 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSInputLayer.m; sourceTree = ""; }; 346EAAF6197A7B28000892CF /* Capture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Capture.h; sourceTree = ""; }; @@ -1219,6 +1224,9 @@ 3434CB351CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.h */, 3434CB361CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.m */, 3434CB371CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.xib */, + 346865441CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.h */, + 346865451CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m */, + 346865461CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.xib */, ); name = Compressor; sourceTree = ""; @@ -2131,6 +2139,7 @@ 34D696FC1871B8F700B50EB6 /* Defaults.plist in Resources */, 34348C2B19BDBDC000A122C2 /* PluginManagerWindowController.xib in Resources */, 34ABEF3C17C0C2CB00AA5E62 /* advancedPrefPanel.xib in Resources */, + 346865481CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.xib in Resources */, 3434CB391CA93BCD001B3DF9 /* CSAppleProResCompressorViewController.xib in Resources */, 3435E396188B902C0015CC01 /* 420v.fgsh in Resources */, 343ED9421BCAC1C80061FC4B /* EditBuiltinLayoutView.xib in Resources */, @@ -2264,6 +2273,7 @@ 3431FFE119786502000965FE /* InputSource.m in Sources */, 3414C6AE1CBB9EBF00107C69 /* CSIRCompressor.m in Sources */, 34ED8C911B07371C002C0674 /* MIKMIDINoteOnCommand.m in Sources */, + 346865471CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m in Sources */, 3498D94F1A9472BD00906532 /* CSAudioSwitchControl.m in Sources */, 3400A0621BD44DF0003E1828 /* CSInputLibraryItem.m in Sources */, 34ED8C831B07371C002C0674 /* MIKMIDIMetaSequenceEvent.m in Sources */, diff --git a/CocoaSplit/Compressor/AppleVTCompressor.h b/CocoaSplit/Compressor/AppleVTCompressor.h index 53b9e413..7059102f 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.h +++ b/CocoaSplit/Compressor/AppleVTCompressor.h @@ -36,6 +36,7 @@ -(bool)compressFrame:(CapturedFrameData *)frameData; ++(bool)intelQSVAvailable; @end diff --git a/CocoaSplit/Compressor/AppleVTCompressor.m b/CocoaSplit/Compressor/AppleVTCompressor.m index 3da8b958..46a013cf 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.m +++ b/CocoaSplit/Compressor/AppleVTCompressor.m @@ -216,6 +216,32 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) } ++(bool)intelQSVAvailable +{ + NSMutableDictionary *encoderSpec = [[NSMutableDictionary alloc] init]; + encoderSpec[(__bridge NSString *)kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder] = @YES; + + + VTCompressionSessionRef testSession = NULL; + OSStatus status; + + status = VTCompressionSessionCreate(NULL, 1920, 1080, kCMVideoCodecType_H264, (__bridge CFDictionaryRef)encoderSpec, NULL, NULL, NULL, (__bridge void *)self, &testSession); + + bool ret; + if (status != noErr || !testSession) + { + ret = NO; + } else { + VTCompressionSessionInvalidate(testSession); + if (testSession) + { + CFRelease(testSession); + } + ret = YES; + } + + return ret; +} - (bool)setupCompressor:(CVPixelBufferRef)videoFrame diff --git a/CocoaSplit/Compressor/CSIRCompressor.h b/CocoaSplit/Compressor/CSIRCompressor.h index e0676f1f..615ab72e 100644 --- a/CocoaSplit/Compressor/CSIRCompressor.h +++ b/CocoaSplit/Compressor/CSIRCompressor.h @@ -11,11 +11,20 @@ @interface CSIRCompressor : CompressorBase { + id _compressor; AppleVTCompressor *_appleh264; } +@property (assign) bool tryAppleHardware; +@property (assign) bool useAppleH264; +@property (assign) bool useAppleProRes; +@property (assign) bool usex264; +@property (assign) bool useNone; + + + -(bool)compressFrame:(CapturedFrameData *)frameData; -(void) addAudioData:(CMSampleBufferRef)sampleBuffer; diff --git a/CocoaSplit/Compressor/CSIRCompressor.m b/CocoaSplit/Compressor/CSIRCompressor.m index 562ed8e7..3c2da9dc 100644 --- a/CocoaSplit/Compressor/CSIRCompressor.m +++ b/CocoaSplit/Compressor/CSIRCompressor.m @@ -8,6 +8,10 @@ #import "CSIRCompressor.h" #import "OutputDestination.h" +#import "CSInstantRecorderCompressorViewController.h" +#import "x264Compressor.h" + + @implementation CSIRCompressor @@ -28,6 +32,12 @@ copy.working_height = self.height; copy.resolutionOption = self.resolutionOption; + copy.tryAppleHardware = self.tryAppleHardware; + copy.useAppleH264 = self.useAppleH264; + copy.useAppleProRes = self.useAppleProRes; + copy.usex264 = self.usex264; + copy.useNone = self.useNone; + return copy; } @@ -42,6 +52,11 @@ [aCoder encodeInteger:self.height forKey:@"videoHeight"]; [aCoder encodeObject:self.resolutionOption forKey:@"resolutionOption"]; + [aCoder encodeBool:self.tryAppleHardware forKey:@"tryAppleHardware"]; + [aCoder encodeBool:self.useAppleH264 forKey:@"useAppleH264"]; + [aCoder encodeBool:self.useAppleProRes forKey:@"useAppleProRes"]; + [aCoder encodeBool:self.usex264 forKey:@"usex264"]; + [aCoder encodeBool:self.useNone forKey:@"useNone"]; } @@ -58,6 +73,30 @@ self.resolutionOption = [aDecoder decodeObjectForKey:@"resolutionOption"]; } + if ([aDecoder containsValueForKey:@"tryAppleHardware"]) + { + self.tryAppleHardware = [aDecoder decodeBoolForKey:@"tryAppleHardware"]; + } + + if ([aDecoder containsValueForKey:@"useAppleH264"]) + { + self.useAppleH264 = [aDecoder decodeBoolForKey:@"useAppleH264"]; + } + + if ([aDecoder containsValueForKey:@"useAppleProRes"]) + { + self.useAppleProRes = [aDecoder decodeBoolForKey:@"useAppleProRes"]; + } + + if ([aDecoder containsValueForKey:@"usex264"]) + { + self.usex264 = [aDecoder decodeBoolForKey:@"usex264"]; + } + + if ([aDecoder containsValueForKey:@"useNone"]) + { + self.useNone = [aDecoder decodeBoolForKey:@"useNone"]; + } } return self; @@ -72,6 +111,9 @@ self.compressorType = @"Instant Replay Compressor"; + self.tryAppleHardware = YES; + self.useAppleH264 = YES; + } @@ -105,27 +147,23 @@ [self setAudioData:frameData syncObj:self]; - if (!_appleh264) + + if (!_compressor) { - _appleh264 = [[AppleVTCompressor alloc] init]; - _appleh264.average_bitrate = 9000; - _appleh264.max_bitrate = 150000; - _appleh264.keyframe_interval = 2; - _appleh264.forceHardware = YES; - [_appleh264 addOutput:self]; - } - - - bool ret = [_appleh264 compressFrame:frameData]; - if (!ret && _appleh264.errored) - { - _appleh264.forceHardware = NO; - _appleh264.noHardware = YES; + bool compressor_status; - ret = [_appleh264 compressFrame:frameData]; + compressor_status = [self setupCompressor:frameData.videoFrame]; + if (!compressor_status) + { + self.errored = YES; + return NO; + } else { + [_compressor addOutput:self]; + } } - + bool ret; + ret = [_compressor compressFrame:frameData]; return ret; } @@ -147,27 +185,60 @@ - (bool)setupCompressor:(CVPixelBufferRef)videoFrame { - OSStatus status; - - - [self setupResolution:videoFrame]; - - if (!self.working_height || !self.working_width) + + if (self.tryAppleHardware && [AppleVTCompressor intelQSVAvailable]) + { + + AppleVTCompressor *acomp = [[AppleVTCompressor alloc] init]; + acomp.average_bitrate = 9000; + acomp.max_bitrate = 15000; + acomp.keyframe_interval = 2; + acomp.forceHardware = YES; + _compressor = acomp; + return YES; + } + + if (self.useNone) { - self.errored = YES; return NO; } + if (self.useAppleH264) + { + AppleVTCompressor *acomp = [[AppleVTCompressor alloc] init]; + acomp.average_bitrate = 9000; + acomp.max_bitrate = 15000; + acomp.keyframe_interval = 2; + acomp.forceHardware = NO; + acomp.noHardware = YES; + _compressor = acomp; + return YES; + } - return YES; + if (self.useAppleProRes) + { + AppleProResCompressor *acomp = [[AppleProResCompressor alloc] init]; + _compressor = acomp; + return YES; + } + if (self.usex264) + { + x264Compressor *xcomp = [[x264Compressor alloc] init]; + xcomp.use_cbr = NO; + xcomp.crf = 10; + _compressor = xcomp; + return YES; + } + + return NO; //??? } -(id )getConfigurationView { - return nil; + return [[CSInstantRecorderCompressorViewController alloc] init]; } @end diff --git a/CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.h b/CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.h new file mode 100644 index 00000000..0ed8cf7f --- /dev/null +++ b/CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.h @@ -0,0 +1,24 @@ +// +// CSInstantRecorderCompressorViewController.h +// CocoaSplit +// +// Created by Zakk on 4/17/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CSCompressorViewControllerProtocol.h" +#import "CSIRCompressor.h" + + +@interface CSInstantRecorderCompressorViewController : NSViewController +@property (strong) CSIRCompressor *compressor; +@property (strong) NSObjectController *compressorController; +@property (strong) NSString *encoderName; + + +- (IBAction)selectCompressorType:(id)sender; + +@end + + diff --git a/CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.m b/CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.m new file mode 100644 index 00000000..9fa78731 --- /dev/null +++ b/CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.m @@ -0,0 +1,24 @@ +// +// CSInstantRecorderCompressorViewController.m +// CocoaSplit +// +// Created by Zakk on 4/17/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSInstantRecorderCompressorViewController.h" + +@interface CSInstantRecorderCompressorViewController () + +@end + +@implementation CSInstantRecorderCompressorViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do view setup here. +} + +- (IBAction)selectCompressorType:(id)sender { +} +@end diff --git a/CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.xib b/CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.xib new file mode 100644 index 00000000..aa44705a --- /dev/null +++ b/CocoaSplit/Compressor/CSInstantRecorderCompressorViewController.xib @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib b/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib index 11fc6a30..4212e464 100644 --- a/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib +++ b/CocoaSplit/Interface/CSAppleH264CompressorViewController.xib @@ -132,12 +132,12 @@ + NSNegateBoolean - - - - @@ -69,12 +58,24 @@ + diff --git a/CocoaSplit/Interface/CSAppleProResCompressorViewController.h b/CocoaSplit/Interface/CSAppleProResCompressorViewController.h index 460dbff9..53166cce 100644 --- a/CocoaSplit/Interface/CSAppleProResCompressorViewController.h +++ b/CocoaSplit/Interface/CSAppleProResCompressorViewController.h @@ -12,6 +12,8 @@ @interface CSAppleProResCompressorViewController : NSViewController +@property (strong) AppleProResCompressor *compressor; + @property (strong) NSObjectController *compressorController; @property (strong) NSDictionary *compressorTypes; diff --git a/CocoaSplit/Interface/CSCompressorViewControllerProtocol.h b/CocoaSplit/Interface/CSCompressorViewControllerProtocol.h index 232dff17..7caf7683 100644 --- a/CocoaSplit/Interface/CSCompressorViewControllerProtocol.h +++ b/CocoaSplit/Interface/CSCompressorViewControllerProtocol.h @@ -12,6 +12,7 @@ @protocol CSCompressorViewControllerProtocol @property (strong) NSObjectController *compressorController; +@property (strong) id compressor; @end diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.m b/CocoaSplit/Interface/CSNewOutputWindowController.m index 34e803ad..5fae7e76 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.m +++ b/CocoaSplit/Interface/CSNewOutputWindowController.m @@ -182,7 +182,7 @@ self.compressionPanelController.compressor = editCompressor.copy; } - + [self.window beginSheet:self.compressionPanelController.window completionHandler:^(NSModalResponse returnCode) { switch (returnCode) { case NSModalResponseStop: @@ -198,19 +198,21 @@ break; case NSModalResponseOK: { - if (self.compressionPanelController.compressor.active) - { - //if it was an active compressor the edit was in-place - return; - } - if (![editCompressor.name isEqualToString:self.compressionPanelController.compressor.name]) + + if (!self.compressionPanelController.compressor.active) { - [self.compressors removeObjectForKey:editCompressor.name]; + if (![editCompressor.name isEqualToString:self.compressionPanelController.compressor.name]) + { + [self.compressors removeObjectForKey:editCompressor.name]; + NSDictionary *notifyMsg = [NSDictionary dictionaryWithObjectsAndKeys:editCompressor.name, @"oldName", self.compressionPanelController.compressor, @"compressor", nil]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorRenamed object:notifyMsg]; + + } + self.compressors[self.compressionPanelController.compressor.name] = self.compressionPanelController.compressor; } - self.compressors[self.compressionPanelController.compressor.name] = self.compressionPanelController.compressor; - NSDictionary *notifyMsg = [NSDictionary dictionaryWithObjectsAndKeys:editCompressor.name, @"oldName", self.compressionPanelController.compressor, @"compressor", nil]; - [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorRenamed object:notifyMsg]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorReconfigured object:self.compressionPanelController.compressor]; + break; } case 4242: diff --git a/CocoaSplit/Interface/CompressionSettingsPanelController.m b/CocoaSplit/Interface/CompressionSettingsPanelController.m index aa3036a0..3f07aa68 100644 --- a/CocoaSplit/Interface/CompressionSettingsPanelController.m +++ b/CocoaSplit/Interface/CompressionSettingsPanelController.m @@ -53,6 +53,9 @@ if (compressorConfigView) { compressorConfigView.compressorController = self.compressorObjectController; + compressorConfigView.compressor = self.compressor; + + [self.compressorSettingsView addSubview:((NSViewController *)compressorConfigView).view]; diff --git a/CocoaSplit/PluginHeaders/CSNotifications.h b/CocoaSplit/PluginHeaders/CSNotifications.h index 89f50359..7448e938 100644 --- a/CocoaSplit/PluginHeaders/CSNotifications.h +++ b/CocoaSplit/PluginHeaders/CSNotifications.h @@ -27,6 +27,7 @@ extern NSString *const CSNotificationOutputDeleted; extern NSString *const CSNotificationCompressorAdded; extern NSString *const CSNotificationCompressorDeleted; extern NSString *const CSNotificationCompressorRenamed; +extern NSString *const CSNotificationCompressorReconfigured; From defaa190a3d828d2740783a2e9ae8a9b77914456 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 17 Apr 2016 18:48:08 -0400 Subject: [PATCH 066/156] Add Instant Recorder compressor configuration to advanced preferences --- CocoaSplit/CaptureController.h | 1 + CocoaSplit/CaptureController.m | 59 ++++++++++++++++++++++ CocoaSplit/Compressor/CSIRCompressor.m | 3 +- CocoaSplit/Interface/advancedPrefPanel.xib | 10 ++++ 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 99f48292..ee32f604 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -377,6 +377,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , - (IBAction)openLibraryWindow:(id) sender; -(void)updateFrameIntervals; +- (IBAction)configureIRCompressor:(id)sender; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 5268b7bc..f8d7e3ea 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2169,6 +2169,65 @@ _frame_interval = 1.0/self.livePreviewView.sourceLayout.frameRate; } +- (IBAction)configureIRCompressor:(id)sender { + + + CompressionSettingsPanelController *cPanel = [[CompressionSettingsPanelController alloc] init]; + CSIRCompressor *compressor = self.compressors[@"InstantRecorder"]; + + cPanel.compressor = compressor; + + + [self.advancedPrefPanel beginSheet:cPanel.window completionHandler:^(NSModalResponse returnCode) { + switch (returnCode) { + case NSModalResponseStop: + if (cPanel.compressor.active) + { + return; + } + [self willChangeValueForKey:@"compressors"]; + [self.compressors removeObjectForKey:cPanel.compressor.name]; + [self didChangeValueForKey:@"compressors"]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorDeleted object:cPanel.compressor userInfo:nil]; + + break; + case NSModalResponseOK: + { + + + if (!cPanel.compressor.active) + { + if (![compressor.name isEqualToString:cPanel.compressor.name]) + { + [self.compressors removeObjectForKey:compressor.name]; + NSDictionary *notifyMsg = [NSDictionary dictionaryWithObjectsAndKeys:compressor.name, @"oldName", cPanel.compressor, @"compressor", nil]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorRenamed object:notifyMsg]; + + } + self.compressors[cPanel.compressor.name] = cPanel.compressor; + } + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorReconfigured object:cPanel.compressor]; + + break; + } + case 4242: + if (cPanel.saveProfileName) + { + cPanel.compressor.name = cPanel.saveProfileName.mutableCopy; + [self willChangeValueForKey:@"compressors"]; + self.compressors[cPanel.compressor.name] = cPanel.compressor; + [self didChangeValueForKey:@"compressors"]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationCompressorAdded object:cPanel.compressor userInfo:nil]; + + } + default: + break; + } + + + }]; +} + -(void) newFrameTimed { diff --git a/CocoaSplit/Compressor/CSIRCompressor.m b/CocoaSplit/Compressor/CSIRCompressor.m index 329b19a0..e2ac7f4c 100644 --- a/CocoaSplit/Compressor/CSIRCompressor.m +++ b/CocoaSplit/Compressor/CSIRCompressor.m @@ -161,12 +161,13 @@ compressor_status = [self setupCompressor:frameData.videoFrame]; - NSLog(@"NEW COMPRESSOR %@", _compressor); if (!compressor_status) { self.errored = YES; return NO; } else { + self.codec_id = _compressor.codec_id; + [_compressor addOutput:self]; } } diff --git a/CocoaSplit/Interface/advancedPrefPanel.xib b/CocoaSplit/Interface/advancedPrefPanel.xib index 1f7d04e8..1f544196 100644 --- a/CocoaSplit/Interface/advancedPrefPanel.xib +++ b/CocoaSplit/Interface/advancedPrefPanel.xib @@ -229,6 +229,16 @@ DQ + From e034e23bd62a26fe2fd1a2e51f1788556ddf283c Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 17 Apr 2016 23:54:18 -0400 Subject: [PATCH 067/156] Stop apple VT compressors from submitting frames while the compressor is being reset. Properly set ExepectedFramerate of VT compression sessions --- CocoaSplit/CaptureController.m | 24 +++++++++++++++-- CocoaSplit/Compressor/AppleVTCompressor.h | 2 ++ CocoaSplit/Compressor/AppleVTCompressor.m | 32 ++++++++++++----------- CocoaSplit/Compressor/CSIRCompressor.m | 2 +- CocoaSplit/Compressor/CompressorBase.m | 1 - CocoaSplit/FFMpegTask.m | 1 - CocoaSplit/PreviewView.m | 3 --- CocoaSplit/SourceLayout.m | 4 ++- 8 files changed, 45 insertions(+), 24 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index f8d7e3ea..f81d5be5 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -832,7 +832,7 @@ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(layoutCanvasChanged:) name:CSNotificationLayoutCanvasChanged object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(layoutCanvasChanged:) name:CSNotificationLayoutFramerateChanged object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(layoutFramerateChanged:) name:CSNotificationLayoutFramerateChanged object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(compressorReconfigured:) name:CSNotificationCompressorReconfigured object:nil]; @@ -858,12 +858,29 @@ } +-(void)layoutFramerateChanged:(NSNotification *)notification +{ + SourceLayout *layout = [notification object]; + if (layout == self.livePreviewView.sourceLayout || layout == self.stagingPreviewView.sourceLayout) + { + [self updateFrameIntervals]; + } + + if (layout == self.livePreviewView.sourceLayout) + { + [self resetInstantRecorder]; + } +} + + -(void)layoutCanvasChanged:(NSNotification *)notification { SourceLayout *layout = [notification object]; if ([layout isEqual:self.livePreviewView.sourceLayout]) { + NSLog(@"LAYOUT CHANNGED"); + [self resetInstantRecorder]; } } @@ -1197,7 +1214,9 @@ { _needsIRReset = YES; } else { + NSLog(@"RESETTING IR COMPRESSOR"); [irCompressor reset]; + NSLog(@"RESET IR COMPRESSOR DONE"); } } @@ -1814,6 +1833,7 @@ + -(void) setupFrameTimer:(double)framerate { if (self.captureRunning) @@ -2166,7 +2186,7 @@ -(void)updateFrameIntervals { _staging_frame_interval = 1.0/self.stagingPreviewView.sourceLayout.frameRate; - _frame_interval = 1.0/self.livePreviewView.sourceLayout.frameRate; + [self setupFrameTimer:self.livePreviewView.sourceLayout.frameRate]; } - (IBAction)configureIRCompressor:(id)sender { diff --git a/CocoaSplit/Compressor/AppleVTCompressor.h b/CocoaSplit/Compressor/AppleVTCompressor.h index 7059102f..cac63ffc 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.h +++ b/CocoaSplit/Compressor/AppleVTCompressor.h @@ -18,6 +18,8 @@ VTCompressionSessionRef _compression_session; VTPixelTransferSessionRef _vtpt_ref; + bool _resetPending; + } diff --git a/CocoaSplit/Compressor/AppleVTCompressor.m b/CocoaSplit/Compressor/AppleVTCompressor.m index 46a013cf..f00077f5 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.m +++ b/CocoaSplit/Compressor/AppleVTCompressor.m @@ -9,6 +9,8 @@ #import "AppleVTCompressor.h" #import "OutputDestination.h" #import "CSAppleH264CompressorViewController.h" +#import "CSPluginServices.h" + OSStatus VTCompressionSessionCopySupportedPropertyDictionary(VTCompressionSessionRef, CFDictionaryRef *); @@ -112,16 +114,17 @@ OSStatus VTCompressionSessionCopySupportedPropertyDictionary(VTCompressionSessio -(void) reset { - + _resetPending = YES; self.errored = NO; + VTCompressionSessionCompleteFrames(_compression_session, CMTimeMake(0, 0)); VTCompressionSessionInvalidate(_compression_session); if (_compression_session) { CFRelease(_compression_session); } - _compression_session = nil; - + _compression_session = NULL; + _resetPending = NO; } @@ -149,6 +152,11 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) -(bool)compressFrame:(CapturedFrameData *)frameData { + if (_resetPending) + { + return NO; + } + if (![self hasOutputs]) { @@ -304,7 +312,13 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) + double captureFPS = [CSPluginServices sharedPluginServices].currentFPS; + if (captureFPS > 0) + { + VTSessionSetProperty(_compression_session, kVTCompressionPropertyKey_ExpectedFrameRate, (__bridge CFTypeRef)(@(captureFPS))); + } + int real_keyframe_interval = 2; if (self.keyframe_interval && self.keyframe_interval > 0) @@ -347,18 +361,6 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) - /* - - if (self.settingsController.captureFPS && self.settingsController.captureFPS > 0) - { - - - - VTSessionSetProperty(_compression_session, kVTCompressionPropertyKey_ExpectedFrameRate, (__bridge CFTypeRef)(@(self.settingsController.captureFPS))); - - } - - */ //This doesn't appear to work at all (2012 rMBP, 10.8.4). Even if you set DataRateLimits, you don't get anything back if you diff --git a/CocoaSplit/Compressor/CSIRCompressor.m b/CocoaSplit/Compressor/CSIRCompressor.m index e2ac7f4c..379b7a6b 100644 --- a/CocoaSplit/Compressor/CSIRCompressor.m +++ b/CocoaSplit/Compressor/CSIRCompressor.m @@ -161,6 +161,7 @@ compressor_status = [self setupCompressor:frameData.videoFrame]; + if (!compressor_status) { self.errored = YES; @@ -196,7 +197,6 @@ - (bool)setupCompressor:(CVPixelBufferRef)videoFrame { - NSLog(@"%@ TRY HARDWARE %d USE NONE %d USE AH264 %d USE APRO %d USE x264 %d SELECTED COMPRESSOR %d", self, self.tryAppleHardware, self.useNone, self.useAppleH264, self.useAppleProRes, self.usex264, self.selectedCompressor); if (self.tryAppleHardware && [AppleVTCompressor intelQSVAvailable]) { diff --git a/CocoaSplit/Compressor/CompressorBase.m b/CocoaSplit/Compressor/CompressorBase.m index a5b7b3ee..130d6201 100644 --- a/CocoaSplit/Compressor/CompressorBase.m +++ b/CocoaSplit/Compressor/CompressorBase.m @@ -209,7 +209,6 @@ { self.working_height = (int)CVPixelBufferGetHeight(withFrame); self.working_width = (int)CVPixelBufferGetWidth(withFrame); - NSLog(@"WORKING WIDTH %d", self.working_width); } else if ([self.resolutionOption isEqualToString:@"Preserve AR"]) { float inputAR = (float)CVPixelBufferGetWidth(withFrame) / (float)CVPixelBufferGetHeight(withFrame); diff --git a/CocoaSplit/FFMpegTask.m b/CocoaSplit/FFMpegTask.m index c86e1afb..c7fed755 100644 --- a/CocoaSplit/FFMpegTask.m +++ b/CocoaSplit/FFMpegTask.m @@ -121,7 +121,6 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) { CMAudioFormatDescriptionRef audio_fmt; - NSLog(@"AUDIO EXTRACT %@", theBuffer); audio_fmt = CMSampleBufferGetFormatDescription(theBuffer); if (!audio_fmt) diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index bff2dd9e..224546d7 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -330,9 +330,6 @@ } else { self.sourceLayout.frameRate = 30.0f; } - - [self.controller updateFrameIntervals]; - } diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 14c48198..603102ac 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -388,6 +388,8 @@ [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationLayoutFramerateChanged object:self userInfo:nil]; } } + + -(void)applyAddBlock { if (self.addLayoutBlock) @@ -1500,7 +1502,7 @@ } --(void)updateCanvasWidth:(int)width height:(int)height +-(void)updateCanvasWidth:(int)width height:(int)height { int old_height = self.canvas_height; int old_width = self.canvas_width; From 5580ffaf16655080345642ee620096cb67526d50 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 23 Apr 2016 05:25:37 -0400 Subject: [PATCH 068/156] Added MIDI command for instant record File output type now has NSSavePanel dialog for choosing the output file/directory --- CocoaSplit/CaptureController.m | 10 +++++- .../FileStreamServiceViewController.h | 2 ++ .../FileStreamServiceViewController.m | 20 ++++++++++++ .../FileStreamServiceViewController.xib | 32 ++++++++++++------- 4 files changed, 52 insertions(+), 12 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index f81d5be5..6652e4ba 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2828,7 +2828,7 @@ - (NSArray *)commandIdentifiers { - NSArray *baseIdentifiers = @[@"GoLive", @"InputNext", @"InputPrevious", @"ActivateLive", @"ActivateStaging", @"ActivateToggle"]; + NSArray *baseIdentifiers = @[@"GoLive", @"InputNext", @"InputPrevious", @"ActivateLive", @"ActivateStaging", @"ActivateToggle", @"InstantRecord"]; NSMutableArray *layoutIdentifiers = [NSMutableArray array]; @@ -3149,9 +3149,17 @@ [weakSelf stagingGoLive:nil]; }); } + + if ([identifier isEqualToString:@"InstantRecord"]) + { + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf doInstantRecord:nil]; + }); + } } + -(void)saveMIDI { MIKMIDIMappingManager *manager = [MIKMIDIMappingManager sharedManager]; diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.h b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.h index bf42a0c7..467553e4 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.h +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.h @@ -14,4 +14,6 @@ @property (weak) FileStreamService *serviceObj; @property (strong) IBOutlet NSObjectController *fileStreamServiceController; +- (IBAction)chooseDestination:(id)sender; + @end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.m b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.m index 26169866..5ceac3b2 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.m +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.m @@ -23,4 +23,24 @@ return self; } + +- (IBAction)chooseDestination:(id)sender +{ + + NSOpenPanel *panel = [NSOpenPanel openPanel]; + panel.canChooseDirectories = YES; + panel.canCreateDirectories = YES; + panel.canChooseFiles = NO; + panel.allowsMultipleSelection = NO; + + [panel beginWithCompletionHandler:^(NSInteger result) { + if (result == NSFileHandlingPanelOKButton) + { + self.serviceObj.fileName = panel.URL.path; + } + + }]; + +} + @end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib index 3914f222..964835da 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib @@ -25,17 +25,6 @@ - - - - - - - - - - - + + + + + + + + + + + + From 2064bd72dc2011b44b457291ec3ad21d986a6456 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 25 Apr 2016 05:00:14 -0400 Subject: [PATCH 069/156] Rewrite of AAC encoder to not do dispatch_async out of the AudioUnit render callback Sprinkle some @autoreleasepool blocks in some loops to prevent memory ballooning. Rework of how CaptureFrameData objects are created so everything is a bit cleaner. Audio buffering and attaching of audio data to frames is now handled inside of CaptureController, instead of inside each Compressor. --- CocoaSplit.xcodeproj/project.pbxproj | 12 + CocoaSplit/AVFAudioCapture.m | 2 - CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m | 2 + .../CAMultiAudio/CAMultiAudioPCMPlayer.m | 4 +- CocoaSplit/CSAacEncoder.h | 12 + CocoaSplit/CSAacEncoder.m | 289 +++++++--------- CocoaSplit/CaptureController.h | 3 + CocoaSplit/CaptureController.m | 280 +++++++-------- CocoaSplit/CapturedFrameData.h | 4 +- CocoaSplit/CapturedFrameData.m | 25 +- CocoaSplit/Compressor/AppleProResCompressor.m | 1 - CocoaSplit/Compressor/AppleVTCompressor.h | 2 + CocoaSplit/Compressor/AppleVTCompressor.m | 8 +- CocoaSplit/Compressor/CSIRCompressor.h | 1 - CocoaSplit/Compressor/CSIRCompressor.m | 1 - CocoaSplit/Compressor/CompressorBase.h | 2 - CocoaSplit/Compressor/CompressorBase.m | 49 --- CocoaSplit/Compressor/x264Compressor.m | 6 +- CocoaSplit/FFMpegTask.m | 5 +- CocoaSplit/LayoutRenderer.m | 2 +- CocoaSplit/OutputDestination.m | 27 +- CocoaSplit/TPCircularBuffer+AudioBufferList.c | 319 ++++++++++++++++++ CocoaSplit/TPCircularBuffer+AudioBufferList.h | 232 +++++++++++++ CocoaSplit/TPCircularBuffer.c | 149 ++++++++ CocoaSplit/TPCircularBuffer.h | 231 +++++++++++++ 25 files changed, 1288 insertions(+), 380 deletions(-) create mode 100644 CocoaSplit/TPCircularBuffer+AudioBufferList.c create mode 100644 CocoaSplit/TPCircularBuffer+AudioBufferList.h create mode 100644 CocoaSplit/TPCircularBuffer.c create mode 100644 CocoaSplit/TPCircularBuffer.h diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index d4ff6fd5..d4323fbc 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -158,6 +158,8 @@ 349461751AC49BB300F28883 /* CSAnimationChooserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 349461731AC49BB300F28883 /* CSAnimationChooserViewController.m */; }; 349461761AC49BB300F28883 /* CSAnimationChooserViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349461741AC49BB300F28883 /* CSAnimationChooserViewController.xib */; }; 349461771AC4CCD000F28883 /* CSAnimationChooserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 349461731AC49BB300F28883 /* CSAnimationChooserViewController.m */; }; + 3494DF381CCD2DB000E921BF /* TPCircularBuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 3494DF341CCD2DB000E921BF /* TPCircularBuffer.c */; }; + 3494DF391CCD2DB000E921BF /* TPCircularBuffer+AudioBufferList.c in Sources */ = {isa = PBXBuildFile; fileRef = 3494DF361CCD2DB000E921BF /* TPCircularBuffer+AudioBufferList.c */; }; 3498D94A1A94685000906532 /* CSAudioSwitchCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3498D9491A94685000906532 /* CSAudioSwitchCell.m */; }; 3498D94F1A9472BD00906532 /* CSAudioSwitchControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3498D94E1A9472BD00906532 /* CSAudioSwitchControl.m */; }; 34A64A2F165EFE4C00A68428 /* PreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34A64A2E165EFE4B00A68428 /* PreviewView.m */; }; @@ -740,6 +742,10 @@ 349461721AC49BB300F28883 /* CSAnimationChooserViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSAnimationChooserViewController.h; sourceTree = ""; }; 349461731AC49BB300F28883 /* CSAnimationChooserViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSAnimationChooserViewController.m; sourceTree = ""; }; 349461741AC49BB300F28883 /* CSAnimationChooserViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CSAnimationChooserViewController.xib; sourceTree = ""; }; + 3494DF341CCD2DB000E921BF /* TPCircularBuffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = TPCircularBuffer.c; sourceTree = ""; }; + 3494DF351CCD2DB000E921BF /* TPCircularBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TPCircularBuffer.h; sourceTree = ""; }; + 3494DF361CCD2DB000E921BF /* TPCircularBuffer+AudioBufferList.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "TPCircularBuffer+AudioBufferList.c"; sourceTree = ""; }; + 3494DF371CCD2DB000E921BF /* TPCircularBuffer+AudioBufferList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "TPCircularBuffer+AudioBufferList.h"; sourceTree = ""; }; 3498D9481A94685000906532 /* CSAudioSwitchCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSAudioSwitchCell.h; sourceTree = ""; }; 3498D9491A94685000906532 /* CSAudioSwitchCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSAudioSwitchCell.m; sourceTree = ""; }; 3498D94D1A9472BD00906532 /* CSAudioSwitchControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAudioSwitchControl.h; path = Interface/CSAudioSwitchControl.h; sourceTree = ""; }; @@ -1104,6 +1110,10 @@ 340FE4A715F3417E00E4CE4E /* CocoaSplit */ = { isa = PBXGroup; children = ( + 3494DF341CCD2DB000E921BF /* TPCircularBuffer.c */, + 3494DF351CCD2DB000E921BF /* TPCircularBuffer.h */, + 3494DF361CCD2DB000E921BF /* TPCircularBuffer+AudioBufferList.c */, + 3494DF371CCD2DB000E921BF /* TPCircularBuffer+AudioBufferList.h */, 3460E5861AC764360080358E /* AnimationSamples */, 340FE4B315F3417E00E4CE4E /* AppDelegate.h */, 340FE4B415F3417E00E4CE4E /* AppDelegate.m */, @@ -2265,6 +2275,7 @@ 3400A0841BD522A5003E1828 /* CSLibraryInputItemViewController.m in Sources */, 34ED8C631B07371C002C0674 /* MIKMIDIErrors.m in Sources */, 34ED8C551B07371C002C0674 /* MIKMIDIControlChangeCommand.m in Sources */, + 3494DF381CCD2DB000E921BF /* TPCircularBuffer.c in Sources */, 349461681ABC57C100F28883 /* CSAnimationItem.m in Sources */, 34ED8C971B07371C002C0674 /* MIKMIDIPlayer.m in Sources */, 34ED8C591B07371C002C0674 /* MIKMIDIDevice.m in Sources */, @@ -2274,6 +2285,7 @@ 3414C6AE1CBB9EBF00107C69 /* CSIRCompressor.m in Sources */, 34ED8C911B07371C002C0674 /* MIKMIDINoteOnCommand.m in Sources */, 346865471CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m in Sources */, + 3494DF391CCD2DB000E921BF /* TPCircularBuffer+AudioBufferList.c in Sources */, 3498D94F1A9472BD00906532 /* CSAudioSwitchControl.m in Sources */, 3400A0621BD44DF0003E1828 /* CSInputLibraryItem.m in Sources */, 34ED8C831B07371C002C0674 /* MIKMIDIMetaSequenceEvent.m in Sources */, diff --git a/CocoaSplit/AVFAudioCapture.m b/CocoaSplit/AVFAudioCapture.m index e2ff5703..6299a438 100644 --- a/CocoaSplit/AVFAudioCapture.m +++ b/CocoaSplit/AVFAudioCapture.m @@ -292,8 +292,6 @@ [self.multiInput scheduleBuffer:sampleBuffer]; } - - } } diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m index 1742b4ea..5a5b111e 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m @@ -571,6 +571,8 @@ OSStatus encoderRenderCallback( void *inRefCon, AudioUnitRenderActionFlags *ioAc if (selfPtr.encoder) { + + [selfPtr.encoder enqueuePCM:ioData atTime:inTimeStamp]; } diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m b/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m index fc4bc506..d57d9661 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m @@ -162,9 +162,9 @@ void BufferCompletedPlaying(void *userData, ScheduledAudioSlice *bufferList); -(void)releasePCM:(CAMultiAudioPCM *)buffer { - dispatch_async(_pendingQueue, ^{ + //dispatch_async(_pendingQueue, ^{ [_pendingBuffers removeObject:buffer]; - }); + //}); } diff --git a/CocoaSplit/CSAacEncoder.h b/CocoaSplit/CSAacEncoder.h index ac128402..bd72a257 100644 --- a/CocoaSplit/CSAacEncoder.h +++ b/CocoaSplit/CSAacEncoder.h @@ -9,6 +9,9 @@ #import #import #import +#import "TPCircularBuffer.h" +#import "TPCircularBuffer+AudioBufferList.h" + @class CaptureController; @@ -26,6 +29,12 @@ void *_pcmData; u_int64_t _last_sample_time; int _last_write_sample_cnt; + TPCircularBuffer _inputBuffer; + TPCircularBuffer _scratchBuffer; + dispatch_source_t _dispatch_timer; + dispatch_semaphore_t _aSemaphore; + + } @property (assign) bool encoderStarted; @@ -33,8 +42,11 @@ @property (assign) int sampleRate; @property (assign) int bitRate; @property (assign) int preallocatedBuffersize; +@property (assign) AudioStreamBasicDescription *inputASBD; -(void) enqueuePCM:(AudioBufferList *)pcmBuffer atTime:(const AudioTimeStamp *)atTime; +-(void) setupEncoderBuffer; + -(void) stopEncoder; diff --git a/CocoaSplit/CSAacEncoder.m b/CocoaSplit/CSAacEncoder.m index d2f51413..9a36c13d 100644 --- a/CocoaSplit/CSAacEncoder.m +++ b/CocoaSplit/CSAacEncoder.m @@ -19,37 +19,33 @@ if (self = [super init]) { encoderQueue = dispatch_queue_create("CSAACEncoderQueue", NULL); - _pcmData = NULL; + _aSemaphore = dispatch_semaphore_create(0); + + } return self; } --(void)preallocateBufferList:(AudioBufferList *)bufferList +-(void)setupEncoderBuffer { - //To avoid doing mallocs every cycle, the AU callback asks us to preallocate memory based on the size of the buffers it receives - //If the size changes, we only re-allocate if it is bigger than our preallocated size. If it's smaller we - //just "waste" the memory and leave it be. - - int bufferSize = bufferList->mBuffers[0].mDataByteSize; - - if (bufferSize > self.preallocatedBuffersize) - { - _pcmData = malloc(bufferSize*2); //Assuming deinterleaved 2-ch, so allocate enough space for both channels - self.preallocatedBuffersize = bufferSize; - } - -} + TPCircularBufferInit(&_inputBuffer, self.inputASBD->mBytesPerFrame * 4096); + TPCircularBufferInit(&_scratchBuffer, self.inputASBD->mBytesPerFrame * 4096); + dispatch_async(encoderQueue, ^{[self encodeAudio];}); +} -(void) enqueuePCM:(AudioBufferList *)pcmBuffer atTime:(const AudioTimeStamp *)atTime { - - - [self preallocateBufferList:pcmBuffer]; - + TPCircularBufferCopyAudioBufferList(&_inputBuffer, pcmBuffer, atTime, kTPCircularBufferCopyAll, NULL); + dispatch_semaphore_signal(_aSemaphore); +} + +-(void)encodeAudio +{ + if (!self.encoderStarted) { @@ -57,161 +53,136 @@ self.encoderStarted = YES; } - - - - //for now assume Float32, 2 channel, non-interleaved. We have to interleave it outselves here. - - AudioBuffer buffer0 = pcmBuffer->mBuffers[0]; - AudioBuffer buffer1 = pcmBuffer->mBuffers[1]; - Float32 *data0 = buffer0.mData; - Float32 *data1 = buffer1.mData; - - Float32 *writebuf = _pcmData; - int channel_size = buffer0.mDataByteSize/sizeof(Float32); - - int i, u; - for(i=u=0; i < channel_size; i++,u+=2) + while (1) { - writebuf[u] = data0[i]; - writebuf[u+1] = data1[i]; - } - - - - //Do the actual compression on another thread so as not to block AudioUnit callbacks - - - - - - - - - dispatch_async(encoderQueue, ^{ - - - - - UInt32 wrote_bytes = 0; - UInt32 num_packets = 1; - UInt32 outstatus = 0; - Float32 *readbuf = _pcmData; - - + dispatch_semaphore_wait(_aSemaphore, DISPATCH_TIME_FOREVER); - - - UInt32 bufsize = self.preallocatedBuffersize*2; //This should be equal to 2x pcmBuffer->mBuffers[0].mDataByteSize - - UInt32 orig_size = bufsize; - - - - UInt32 buffer_size = maxOutputSize; - - while (true) + while (TPCircularBufferPeek(&_inputBuffer, NULL, self.inputASBD) >= 1024) { + AudioBufferList *inBuffer = TPCircularBufferPrepareEmptyAudioBufferListWithAudioFormat(&_scratchBuffer, self.inputASBD, 1024, NULL); + UInt32 inFrameCnt = 1024; + AudioTimeStamp atTime; - void *aacBuffer = malloc(maxOutputSize); - - OSStatus err; + TPCircularBufferDequeueBufferListFrames(&_inputBuffer, &inFrameCnt, inBuffer, &atTime, self.inputASBD); - err = AudioCodecAppendInputData(aacCodec, readbuf, &bufsize, NULL, NULL); - - - wrote_bytes += bufsize; - - readbuf += bufsize/sizeof(Float32); - //reset bufsize for next loop - bufsize = orig_size - wrote_bytes; - - AudioStreamPacketDescription packetDesc; - - - - err = AudioCodecProduceOutputPackets(aacCodec, aacBuffer, &buffer_size, &num_packets, &packetDesc, &outstatus); - - if (err != 0) + Float32 *writebuf = malloc(inBuffer->mBuffers[0].mDataByteSize*2); + AudioBuffer buffer0 = inBuffer->mBuffers[0]; + AudioBuffer buffer1 = inBuffer->mBuffers[1]; + Float32 *data0 = buffer0.mData; + Float32 *data1 = buffer1.mData; + int channel_size = buffer0.mDataByteSize/sizeof(Float32); + int i, u; + for(i=u=0; i < channel_size; i++,u+=2) { - NSLog(@"CODEC PRODUCE OUTPUT ERROR IS %@", [[NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil] description]); - + writebuf[u] = data0[i]; + writebuf[u+1] = data1[i]; } - - if (outstatus == kAudioCodecProduceOutputPacketNeedsMoreInputData) - { - free(aacBuffer); - break; + @autoreleasepool { + + UInt32 num_packets = 1; + UInt32 outstatus = 0; + + + + + + + UInt32 bufsize = inBuffer->mBuffers[0].mDataByteSize*2;//This should be equal to 2x pcmBuffer->mBuffers[0].mDataByteSize + + + + + + UInt32 buffer_size = maxOutputSize; + + void *aacBuffer = malloc(maxOutputSize); + + + OSStatus err; + + err = AudioCodecAppendInputData(aacCodec, writebuf, &bufsize, NULL, NULL); + + free(writebuf); + AudioStreamPacketDescription packetDesc; + + + + err = AudioCodecProduceOutputPackets(aacCodec, aacBuffer, &buffer_size, &num_packets, &packetDesc, &outstatus); + + if (err != 0) + { + NSLog(@"CODEC PRODUCE OUTPUT ERROR IS %@", [[NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil] description]); + + } + + + if (outstatus == kAudioCodecProduceOutputPacketNeedsMoreInputData) + { + NSLog(@"NEED MORE INPUT DATA"); + free(aacBuffer); + break; + } + + + if (self.encodedReceiver && buffer_size) + { + + + CMTime duration = CMTimeMake(1024, self.sampleRate); + uint64_t mach_now = atTime.mHostTime; + + double abs_pts = (double)mach_now/NSEC_PER_SEC; + + CMTime ptsTime = CMTimeMake(abs_pts*1000, 1000); + + CMSampleTimingInfo timeInfo; + + timeInfo.duration = duration; + timeInfo.presentationTimeStamp = ptsTime; + timeInfo.decodeTimeStamp = kCMTimeInvalid; + + CMSampleBufferRef newSampleBuf; + CMSampleBufferRef timingSampleBuf; + CMBlockBufferRef bufferRef; + + + CMBlockBufferCreateWithMemoryBlock(NULL, aacBuffer, buffer_size, kCFAllocatorMalloc, NULL, 0, buffer_size, 0, &bufferRef); + + + CMAudioSampleBufferCreateWithPacketDescriptions(kCFAllocatorDefault, bufferRef, YES, NULL, NULL, cmFormat, 1, ptsTime, &packetDesc, &newSampleBuf); + + + CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, newSampleBuf, 1, &timeInfo, &timingSampleBuf); + + CFRelease(newSampleBuf); + //The sample buffer retains the block buffer when it is handed over to it, we can release ours. + CFRelease(bufferRef); + + + [self.encodedReceiver captureOutputAudio:nil didOutputSampleBuffer:timingSampleBuf]; + + //Individual video compressors retain the buffer until they push it to their output, we can release it now. + CFRelease(timingSampleBuf); + + } else { + free(aacBuffer); + } + + + + buffer_size = maxOutputSize; + num_packets = 1; + + outputSampleCount += 1024; } - - - if (self.encodedReceiver && buffer_size) - { - - - CMTime duration = CMTimeMake(1024, self.sampleRate); - uint64_t mach_now = mach_absolute_time(); - double abs_pts = (double)mach_now/NSEC_PER_SEC; - abs_pts -= CMTimeGetSeconds(duration); - - CMTime ptsTime = CMTimeMake(abs_pts*1000, 1000); - - CMSampleTimingInfo timeInfo; - - timeInfo.duration = duration; - timeInfo.presentationTimeStamp = ptsTime; - timeInfo.decodeTimeStamp = kCMTimeInvalid; - - CMSampleBufferRef newSampleBuf; - CMSampleBufferRef timingSampleBuf; - CMBlockBufferRef bufferRef; - - - CMBlockBufferCreateWithMemoryBlock(NULL, aacBuffer, buffer_size, kCFAllocatorMalloc, NULL, 0, buffer_size, 0, &bufferRef); - - - CMAudioSampleBufferCreateWithPacketDescriptions(kCFAllocatorDefault, bufferRef, YES, NULL, NULL, cmFormat, 1, ptsTime, &packetDesc, &newSampleBuf); - - - //CMAudioSampleBufferCreateReadyWithPacketDescriptions(kCFAllocatorDefault, bufferRef, cmFormat, 1, ptsTime, &packetDesc, &newSampleBuf); - - CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, newSampleBuf, 1, &timeInfo, &timingSampleBuf); - CFRelease(newSampleBuf); - //The sample buffer retains the block buffer when it is handed over to it, we can release ours. - CFRelease(bufferRef); - - - [self.encodedReceiver captureOutputAudio:nil didOutputSampleBuffer:timingSampleBuf]; - //Individual video compressors retain the buffer until they push it to their output, we can release it now. - CFRelease(timingSampleBuf); - - } else { - free(aacBuffer); - } - - - - buffer_size = maxOutputSize; - num_packets = 1; - - outputSampleCount += 1024; - if (wrote_bytes >= orig_size) - { - break; - } - } - - - }); - + } } - -(void) setupEncoder { //create the input format. diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index ee32f604..23553e19 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -108,6 +108,9 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , NSMutableArray *_screensCache; NSMutableArray *_layoutWindows; bool _needsIRReset; + + NSMutableArray *_audioBuffer; + } diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 6652e4ba..e852028f 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -721,6 +721,8 @@ videoBuffer = [[NSMutableArray alloc] init]; + _audioBuffer = [[NSMutableArray alloc] init]; + @@ -738,8 +740,14 @@ dispatch_source_set_event_handler(sigsrc, ^{ return;}); dispatch_resume(sigsrc); - _main_capture_queue = dispatch_queue_create("CocoaSplit.main.queue", NULL); + /* + dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_DEFAULT, 0); + _main_capture_queue = dispatch_queue_create("CocoaSplit.main.queue", attr); _preview_queue = dispatch_queue_create("CocoaSplit.preview.queue", NULL); + */ + + _main_capture_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); + _preview_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); @@ -771,7 +779,10 @@ dispatch_source_set_timer(_audio_statistics_timer, DISPATCH_TIME_NOW, 0.10*NSEC_PER_SEC, 0); dispatch_source_set_event_handler(_audio_statistics_timer, ^{ - [self.multiAudioEngine updateStatistics]; + if (self.multiAudioEngine) + { + [self.multiAudioEngine updateStatistics]; + } }); dispatch_resume(_audio_statistics_timer); @@ -789,7 +800,7 @@ - self.renderStatsString = [NSString stringWithFormat:@"Render min/max/avg: %f/%f/%f", _min_render_time, _max_render_time, _render_time_total / _renderedFrames]; + //self.renderStatsString = [NSString stringWithFormat:@"Render min/max/avg: %f/%f/%f", _min_render_time, _max_render_time, _render_time_total / _renderedFrames]; _renderedFrames = 0; _render_time_total = 0.0f; @@ -1461,7 +1472,6 @@ - NSString *audioID = [saveRoot valueForKey:@"audioCaptureID"]; self.captureFPS = [[saveRoot valueForKey:@"captureFPS"] doubleValue]; self.maxOutputDropped = [[saveRoot valueForKey:@"maxOutputDropped"] intValue]; @@ -1506,6 +1516,7 @@ { self.multiAudioEngine = [[CAMultiAudioEngine alloc] init]; } + self.extraPluginsSaveData = nil; @@ -1560,13 +1571,14 @@ dispatch_async(_preview_queue, ^{ [self newStagingFrameTimed]; }); - CSAacEncoder *audioEnc = [[CSAacEncoder alloc] init]; audioEnc.encodedReceiver = self; audioEnc.sampleRate = self.audioSamplerate; audioEnc.bitRate = self.audioBitrate*1000; + audioEnc.inputASBD = self.multiAudioEngine.graph.graphAsbd; + [audioEnc setupEncoderBuffer]; self.multiAudioEngine.encoder = audioEnc; if (self.useInstantRecord) @@ -1804,7 +1816,7 @@ //_frameCount = 0; //_firstAudioTime = kCMTimeZero; - + //_firstFrameTime = [self mach_time_seconds]; if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_8) { @@ -1943,9 +1955,54 @@ } -- (void)captureOutputAudio:(id)fromDevice didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer +-(void) addAudioData:(CMSampleBufferRef)audioData { + @synchronized(self) + { + + [_audioBuffer addObject:(__bridge id)audioData]; + } +} + + +-(void) setAudioData:(NSMutableArray *)audioDestination videoPTS:(CMTime)videoPTS +{ + + NSUInteger audioConsumed = 0; + @synchronized(self) + { + NSUInteger audioBufferSize = [_audioBuffer count]; + + for (int i = 0; i < audioBufferSize; i++) + { + CMSampleBufferRef audioData = (__bridge CMSampleBufferRef)[_audioBuffer objectAtIndex:i]; + + CMTime audioTime = CMSampleBufferGetOutputPresentationTimeStamp(audioData); + + + + + if (CMTIME_COMPARE_INLINE(audioTime, <=, videoPTS)) + { + + audioConsumed++; + [audioDestination addObject:(__bridge id)audioData]; + } else { + break; + } + } + + if (audioConsumed > 0) + { + [_audioBuffer removeObjectsInRange:NSMakeRange(0, audioConsumed)]; + } + + } +} + +- (void)captureOutputAudio:(id)fromDevice didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer +{ CMTime orig_pts = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); @@ -1961,6 +2018,8 @@ _firstAudioTime = orig_pts; return; } + + CMTime real_pts = CMTimeSubtract(orig_pts, _firstAudioTime); CMTime adjust_pts = CMTimeMakeWithSeconds(self.audio_adjust, orig_pts.timescale); CMTime pts = CMTimeAdd(real_pts, adjust_pts); @@ -1968,27 +2027,7 @@ CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, pts); - - if (self.instantRecorder && self.instantRecorder.compressor) - { - [self.instantRecorder.compressor addAudioData:sampleBuffer]; - } - - - if (self.captureRunning) - { - for(id cKey in self.compressors) - { - id compressor; - compressor = self.compressors[cKey]; - if (self.instantRecorder && [self.instantRecorder.compressor isEqual:compressor]) - { - continue; - } - - [compressor addAudioData:sampleBuffer]; - } - } + [self addAudioData:sampleBuffer]; } @@ -2022,21 +2061,6 @@ } } - /* - double mach_duration = target_time - mach_now; - double mach_wait_time = mach_now + mach_duration/2.0; - - mach_wait_until(mach_wait_time*NSEC_PER_SEC); - - - while ([self mach_time_seconds] < target_time) - { - usleep(500); - - //wheeeeeeeeeeeee - } - - */ return YES; } @@ -2136,10 +2160,6 @@ } [self.stagingCtx.layoutRenderer currentImg]; - /* - dispatch_async(dispatch_get_main_queue(), ^{ - [self.stagingCtx setNeedsDisplay:YES]; - });*/ } @@ -2255,7 +2275,6 @@ double startTime; startTime = [self mach_time_seconds]; - double lastLoopTime = startTime; _frame_time = startTime; _firstFrameTime = startTime; @@ -2280,9 +2299,7 @@ //_frame_time = nowTime;//startTime; - double nowTime = [self mach_time_seconds]; - lastLoopTime = nowTime; if (![self sleepUntil:(startTime += _frame_interval)]) { @@ -2327,127 +2344,116 @@ -(void) newFrame { - - CVPixelBufferRef newFrame; - //if (self.videoCaptureSession) + CVPixelBufferRef newFrame; + + + double nfstart = [self mach_time_seconds]; + + newFrame = [self.previewCtx.layoutRenderer currentImg]; + + + double nfdone = [self mach_time_seconds]; + double nftime = nfdone - nfstart; + _renderedFrames++; + + _render_time_total += nftime; + if (nftime < _min_render_time || _min_render_time == 0.0f) + { + _min_render_time = nftime; + } + + if (nftime > _max_render_time) + { + _max_render_time = nftime; + } + + + + if (newFrame) + { + _frameCount++; + CVPixelBufferRetain(newFrame); + NSMutableArray *frameAudio = [[NSMutableArray alloc] init]; + [self setAudioData:frameAudio videoPTS:CMTimeMake((_frame_time - _firstFrameTime)*1000, 1000)]; + CapturedFrameData *newData = [self createFrameData]; + newData.audioSamples = frameAudio; + newData.videoFrame = newFrame; + + [self sendFrameToReplay:newData]; + if (self.captureRunning) { - - double nfstart = [self mach_time_seconds]; - - //[CATransaction begin]; - newFrame = [self.previewCtx.layoutRenderer currentImg]; - //[CATransaction commit]; - //newFrame = [self currentFrame]; - - - double nfdone = [self mach_time_seconds]; - double nftime = nfdone - nfstart; - _renderedFrames++; - - _render_time_total += nftime; - if (nftime < _min_render_time || _min_render_time == 0.0f) + if (self.captureRunning != _last_running_value) { - _min_render_time = nftime; + [self setupCompressors]; } - if (nftime > _max_render_time) - { - _max_render_time = nftime; - } - + + [self processVideoFrame:newData]; - if (newFrame) + } else { + + for (OutputDestination *outdest in _captureDestinations) { - _frameCount++; - CVPixelBufferRetain(newFrame); - [self sendFrameToReplay:newFrame]; - if (self.captureRunning) - { - if (self.captureRunning != _last_running_value) - { - [self setupCompressors]; - } - - - [self processVideoFrame:newFrame]; - - - } else { - - for (OutputDestination *outdest in _captureDestinations) - { - [outdest writeEncodedData:nil]; - } - - } - - _last_running_value = self.captureRunning; - - CVPixelBufferRelease(newFrame); - - + [outdest writeEncodedData:nil]; } + } + + _last_running_value = self.captureRunning; + + CVPixelBufferRelease(newFrame); + + + } } --(void)sendFrameToReplay:(CVPixelBufferRef)videoFrame +-(CapturedFrameData *)createFrameData +{ + + CMTime pts = CMTimeMake((_frame_time - _firstFrameTime)*1000, 1000); + CMTime duration = CMTimeMake(1, self.captureFPS); + + CapturedFrameData *newFrameData = [[CapturedFrameData alloc] init]; + newFrameData.videoPTS = pts; + newFrameData.videoDuration = duration; + newFrameData.frameNumber = _frameCount; + newFrameData.frameTime = _frame_time; + return newFrameData; +} + + +-(void)sendFrameToReplay:(CapturedFrameData *)frameData { CMTime pts; CMTime duration; pts = CMTimeMake((_frame_time - _firstFrameTime)*1000, 1000); + duration = CMTimeMake(1, self.captureFPS); if (self.instantRecorder && self.instantRecorder.compressor) { - - //NSLog(@"SENDING FRAME %lld TO COMPRESSOR", _frameCount); - CapturedFrameData *newFrameData = [[CapturedFrameData alloc] init]; - - newFrameData.videoPTS = pts; - newFrameData.videoDuration = duration; - newFrameData.frameNumber = _frameCount; - newFrameData.frameTime = _frame_time; - newFrameData.videoFrame = videoFrame; + CapturedFrameData *newFrameData = frameData.copy; [self.instantRecorder.compressor compressFrame:newFrameData]; } } --(void)processVideoFrame:(CVPixelBufferRef)videoFrame +-(void)processVideoFrame:(CapturedFrameData *)frameData { - //CVImageBufferRef imageBuffer = frameData.videoFrame; if (!self.captureRunning) { - //CVPixelBufferRelease(imageBuffer); return; } - CMTime pts; - CMTime duration; - - - - pts = CMTimeMake((_frame_time - _firstFrameTime)*1000, 1000); - duration = CMTimeMake(1, self.captureFPS); - - /* - pts = CMTimeMake(ptsTime*1000000, 1000000); - - duration = CMTimeMake(1000, self.captureFPS*1000); -*/ - //_frameCount++; - //_lastFrameTime = _frame_time; - - for(id cKey in self.compressors) { @@ -2460,13 +2466,7 @@ continue; } - CapturedFrameData *newFrameData = [[CapturedFrameData alloc] init]; - - newFrameData.videoPTS = pts; - newFrameData.videoDuration = duration; - newFrameData.frameNumber = _frameCount; - newFrameData.frameTime = _frame_time; - newFrameData.videoFrame = videoFrame; + CapturedFrameData *newFrameData = frameData.copy; [compressor compressFrame:newFrameData]; diff --git a/CocoaSplit/CapturedFrameData.h b/CocoaSplit/CapturedFrameData.h index a3ec5693..0a345dd4 100644 --- a/CocoaSplit/CapturedFrameData.h +++ b/CocoaSplit/CapturedFrameData.h @@ -12,7 +12,7 @@ #import "libavcodec/avcodec.h" -@interface CapturedFrameData : NSObject +@interface CapturedFrameData : NSObject @@ -30,7 +30,7 @@ @property CMTime videoPTS; @property CMTime videoDuration; -@property CMSampleBufferRef encodedSampleBuffer; +@property (assign) CMSampleBufferRef encodedSampleBuffer; @property (assign) AVPacket *avcodec_pkt; @property AVCodecContext *avcodec_ctx; diff --git a/CocoaSplit/CapturedFrameData.m b/CocoaSplit/CapturedFrameData.m index 4dae966b..0fa05825 100644 --- a/CocoaSplit/CapturedFrameData.m +++ b/CocoaSplit/CapturedFrameData.m @@ -18,13 +18,33 @@ @synthesize avcodec_pkt = _avcodec_pkt; + +-(instancetype) copyWithZone:(NSZone *)zone +{ + + CapturedFrameData *copy = [[[self class] allocWithZone:zone] init]; + copy.frameNumber = self.frameNumber; + copy.frameTime = self.frameTime; + copy.videoFrame = self.videoFrame; + copy.encoderData = self.encoderData; + copy.isKeyFrame = self.isKeyFrame; + copy.audioSamples = self.audioSamples; + copy.videoPTS = self.videoPTS; + copy.videoDuration = self.videoDuration; + copy.encodedSampleBuffer = self.encodedSampleBuffer; + copy.avcodec_pkt = self.avcodec_pkt; + copy.avcodec_ctx = self.avcodec_ctx; + return copy; +} + + -(id)init { if (self = [super init]) { _videoFrame = nil; self.frameNumber = 0; - self.audioSamples = [[NSMutableArray alloc] init]; + //self.audioSamples = [[NSMutableArray alloc] init]; } return self; @@ -52,7 +72,8 @@ av_free(_avcodec_pkt); } - + + self.audioSamples = nil; } diff --git a/CocoaSplit/Compressor/AppleProResCompressor.m b/CocoaSplit/Compressor/AppleProResCompressor.m index 47444cd0..d26900db 100644 --- a/CocoaSplit/Compressor/AppleProResCompressor.m +++ b/CocoaSplit/Compressor/AppleProResCompressor.m @@ -186,7 +186,6 @@ void __ProResPixelBufferRelease( void *releaseRefCon, const void *baseAddress ) CVPixelBufferRelease(imageBuffer); - [self setAudioData:frameData syncObj:self]; VTCompressionSessionEncodeFrame(_compression_session, converted_frame, frameData.videoPTS, frameData.videoDuration, frameProperties, (__bridge_retained void *)(frameData), NULL); diff --git a/CocoaSplit/Compressor/AppleVTCompressor.h b/CocoaSplit/Compressor/AppleVTCompressor.h index cac63ffc..6e6c7232 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.h +++ b/CocoaSplit/Compressor/AppleVTCompressor.h @@ -19,6 +19,8 @@ VTCompressionSessionRef _compression_session; VTPixelTransferSessionRef _vtpt_ref; bool _resetPending; + dispatch_queue_t _compressor_queue; + } diff --git a/CocoaSplit/Compressor/AppleVTCompressor.m b/CocoaSplit/Compressor/AppleVTCompressor.m index f00077f5..5b01ab4d 100644 --- a/CocoaSplit/Compressor/AppleVTCompressor.m +++ b/CocoaSplit/Compressor/AppleVTCompressor.m @@ -105,6 +105,7 @@ OSStatus VTCompressionSessionCopySupportedPropertyDictionary(VTCompressionSessio self.compressorType = @"AppleVTCompressor"; self.profiles = @[[NSNull null], @"Baseline", @"Main", @"High"]; + _compressor_queue = dispatch_queue_create("Apple VT Compressor Queue", 0); } return self; @@ -163,6 +164,9 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) return NO; } + + + if (!_compression_session) { @@ -209,8 +213,6 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) CVPixelBufferRelease(imageBuffer); - - [self setAudioData:frameData syncObj:self]; VTCompressionSessionEncodeFrame(_compression_session, converted_frame, frameData.videoPTS, frameData.videoDuration, frameProperties, (__bridge_retained void *)(frameData), NULL); @@ -218,7 +220,7 @@ void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) { CFRelease(frameProperties); } - + return YES; } diff --git a/CocoaSplit/Compressor/CSIRCompressor.h b/CocoaSplit/Compressor/CSIRCompressor.h index c1d47cd8..7e0fddda 100644 --- a/CocoaSplit/Compressor/CSIRCompressor.h +++ b/CocoaSplit/Compressor/CSIRCompressor.h @@ -26,6 +26,5 @@ -(bool)compressFrame:(CapturedFrameData *)frameData; --(void) addAudioData:(CMSampleBufferRef)sampleBuffer; @end diff --git a/CocoaSplit/Compressor/CSIRCompressor.m b/CocoaSplit/Compressor/CSIRCompressor.m index 379b7a6b..2cd45d08 100644 --- a/CocoaSplit/Compressor/CSIRCompressor.m +++ b/CocoaSplit/Compressor/CSIRCompressor.m @@ -152,7 +152,6 @@ return NO; } - [self setAudioData:frameData syncObj:self]; if (!_compressor) diff --git a/CocoaSplit/Compressor/CompressorBase.h b/CocoaSplit/Compressor/CompressorBase.h index 113bb7c3..0440e240 100644 --- a/CocoaSplit/Compressor/CompressorBase.h +++ b/CocoaSplit/Compressor/CompressorBase.h @@ -45,8 +45,6 @@ -(void) reset; -(BOOL) setupResolution:(CVImageBufferRef)withFrame; --(void) addAudioData:(CMSampleBufferRef)audioData; --(void) setAudioData:(CapturedFrameData *)forFrame syncObj:(id)syncObj; -(id )getConfigurationView; diff --git a/CocoaSplit/Compressor/CompressorBase.m b/CocoaSplit/Compressor/CompressorBase.m index 130d6201..cecbea79 100644 --- a/CocoaSplit/Compressor/CompressorBase.m +++ b/CocoaSplit/Compressor/CompressorBase.m @@ -72,55 +72,6 @@ --(void) addAudioData:(CMSampleBufferRef)audioData -{ - - if ([self hasOutputs] && audioData && _audioBuffer) - { - @synchronized(self) - { - - [_audioBuffer addObject:(__bridge id)audioData]; - } - } -} - - --(void) setAudioData:(CapturedFrameData *)forFrame syncObj:(id)syncObj -{ - - NSUInteger audioConsumed = 0; - @synchronized(syncObj) - { - NSUInteger audioBufferSize = [_audioBuffer count]; - - for (int i = 0; i < audioBufferSize; i++) - { - CMSampleBufferRef audioData = (__bridge CMSampleBufferRef)[_audioBuffer objectAtIndex:i]; - - CMTime audioTime = CMSampleBufferGetOutputPresentationTimeStamp(audioData); - - - - - if (CMTIME_COMPARE_INLINE(audioTime, <=, forFrame.videoPTS)) - { - - audioConsumed++; - [forFrame.audioSamples addObject:(__bridge id)audioData]; - } else { - break; - } - } - - if (audioConsumed > 0) - { - [_audioBuffer removeObjectsInRange:NSMakeRange(0, audioConsumed)]; - } - - } - -} -(void) reset diff --git a/CocoaSplit/Compressor/x264Compressor.m b/CocoaSplit/Compressor/x264Compressor.m index d45490af..cbf0d7e8 100644 --- a/CocoaSplit/Compressor/x264Compressor.m +++ b/CocoaSplit/Compressor/x264Compressor.m @@ -210,11 +210,11 @@ CVPixelBufferRetain(frameData.videoFrame); } - [self setAudioData:frameData syncObj:self]; dispatch_async(_compressor_queue, ^{ - + @autoreleasepool { + if (frameData.frameNumber == 1) { _next_keyframe_time = frameData.frameTime; @@ -363,7 +363,7 @@ //av_free_packet(pkt); //av_free(pkt); - + } }); return YES; diff --git a/CocoaSplit/FFMpegTask.m b/CocoaSplit/FFMpegTask.m index c7fed755..95b100a3 100644 --- a/CocoaSplit/FFMpegTask.m +++ b/CocoaSplit/FFMpegTask.m @@ -176,6 +176,7 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) { CMSampleBufferRef audioSample = (__bridge CMSampleBufferRef)object; + [self writeAudioSampleBuffer:audioSample presentationTimeStamp:CMSampleBufferGetOutputPresentationTimeStamp(audioSample)]; //CFRelease(audioSample); @@ -236,7 +237,9 @@ void getAudioExtradata(char *cookie, char **buffer, size_t *size) ret_val = NO; [self stopProcess]; } - CFRelease(theBuffer); + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + CFRelease(theBuffer); + }); } return ret_val; diff --git a/CocoaSplit/LayoutRenderer.m b/CocoaSplit/LayoutRenderer.m index b9516c41..7729065d 100644 --- a/CocoaSplit/LayoutRenderer.m +++ b/CocoaSplit/LayoutRenderer.m @@ -259,7 +259,7 @@ } - CVPixelBufferPoolCreatePixelBuffer(kCVReturnSuccess, _cvpool, &destFrame); + CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, _cvpool, &destFrame); [self renderToSurface:CVPixelBufferGetIOSurface(destFrame)]; diff --git a/CocoaSplit/OutputDestination.m b/CocoaSplit/OutputDestination.m index ed63d6fb..e0918277 100644 --- a/CocoaSplit/OutputDestination.m +++ b/CocoaSplit/OutputDestination.m @@ -166,8 +166,11 @@ }); } else { dispatch_async(_output_queue, ^{ + @autoreleasepool { + [self.ffmpeg_out stopProcess]; self.ffmpeg_out = nil; + } dispatch_async(dispatch_get_main_queue(), ^{ self.textColor = [NSColor blackColor]; }); @@ -494,17 +497,19 @@ _consecutive_dropped_frames = 0; dispatch_async(_output_queue, ^{ - _p_buffered_frame_size += f_size; - _p_buffered_frame_count++; - - BOOL write_ret = [self.ffmpeg_out writeEncodedData:sendData]; - - if (write_ret) - { - _p_output_framecnt++; - _p_buffered_frame_count--; - _p_buffered_frame_size -= f_size; - _p_output_bytes += f_size; + @autoreleasepool { + _p_buffered_frame_size += f_size; + _p_buffered_frame_count++; + + BOOL write_ret = [self.ffmpeg_out writeEncodedData:sendData]; + + if (write_ret) + { + _p_output_framecnt++; + _p_buffered_frame_count--; + _p_buffered_frame_size -= f_size; + _p_output_bytes += f_size; + } } }); diff --git a/CocoaSplit/TPCircularBuffer+AudioBufferList.c b/CocoaSplit/TPCircularBuffer+AudioBufferList.c new file mode 100644 index 00000000..7b913dc7 --- /dev/null +++ b/CocoaSplit/TPCircularBuffer+AudioBufferList.c @@ -0,0 +1,319 @@ +// +// TPCircularBuffer+AudioBufferList.c +// Circular/Ring buffer implementation +// +// https://github.com/michaeltyson/TPCircularBuffer +// +// Created by Michael Tyson on 20/03/2012. +// +// Copyright (C) 2012-2013 A Tasty Pixel +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +#include "TPCircularBuffer+AudioBufferList.h" +#import + +static double __secondsToHostTicks = 0.0; + +static inline long align16byte(long val) { + if ( val & (16-1) ) { + return val + (16 - (val & (16-1))); + } + return val; +} + +static inline long min(long a, long b) { + return a > b ? b : a; +} + +AudioBufferList *TPCircularBufferPrepareEmptyAudioBufferList(TPCircularBuffer *buffer, int numberOfBuffers, int bytesPerBuffer, const AudioTimeStamp *inTimestamp) { + int32_t availableBytes; + TPCircularBufferABLBlockHeader *block = (TPCircularBufferABLBlockHeader*)TPCircularBufferHead(buffer, &availableBytes); + if ( !block || availableBytes < sizeof(TPCircularBufferABLBlockHeader)+((numberOfBuffers-1)*sizeof(AudioBuffer))+(numberOfBuffers*bytesPerBuffer) ) return NULL; + + #ifdef DEBUG + assert(!((unsigned long)block & 0xF) /* Beware unaligned accesses */); + #endif + + if ( inTimestamp ) { + memcpy(&block->timestamp, inTimestamp, sizeof(AudioTimeStamp)); + } else { + memset(&block->timestamp, 0, sizeof(AudioTimeStamp)); + } + + memset(&block->bufferList, 0, sizeof(AudioBufferList)+((numberOfBuffers-1)*sizeof(AudioBuffer))); + block->bufferList.mNumberBuffers = numberOfBuffers; + + char *dataPtr = (char*)&block->bufferList + sizeof(AudioBufferList)+((numberOfBuffers-1)*sizeof(AudioBuffer)); + for ( int i=0; i availableBytes ) { + return NULL; + } + + block->bufferList.mBuffers[i].mData = dataPtr; + block->bufferList.mBuffers[i].mDataByteSize = bytesPerBuffer; + block->bufferList.mBuffers[i].mNumberChannels = 1; + + dataPtr += bytesPerBuffer; + } + + // Make sure whole buffer (including timestamp and length value) is 16-byte aligned in length + block->totalLength = (UInt32)align16byte(dataPtr - (char*)block); + if ( block->totalLength > availableBytes ) { + return NULL; + } + + return &block->bufferList; +} + +AudioBufferList *TPCircularBufferPrepareEmptyAudioBufferListWithAudioFormat(TPCircularBuffer *buffer, const AudioStreamBasicDescription *audioFormat, UInt32 frameCount, const AudioTimeStamp *timestamp) { + return TPCircularBufferPrepareEmptyAudioBufferList(buffer, + (audioFormat->mFormatFlags & kAudioFormatFlagIsNonInterleaved) ? audioFormat->mChannelsPerFrame : 1, + audioFormat->mBytesPerFrame * frameCount, + timestamp); +} + +void TPCircularBufferProduceAudioBufferList(TPCircularBuffer *buffer, const AudioTimeStamp *inTimestamp) { + int32_t availableBytes; + TPCircularBufferABLBlockHeader *block = (TPCircularBufferABLBlockHeader*)TPCircularBufferHead(buffer, &availableBytes); + + assert(block); + + #ifdef DEBUG + assert(!((unsigned long)block & 0xF) /* Beware unaligned accesses */); + #endif + + assert(block->bufferList.mBuffers[0].mDataByteSize > 0); + + if ( inTimestamp ) { + memcpy(&block->timestamp, inTimestamp, sizeof(AudioTimeStamp)); + } + + UInt32 calculatedLength = (UInt32)(((char*)block->bufferList.mBuffers[block->bufferList.mNumberBuffers-1].mData + block->bufferList.mBuffers[block->bufferList.mNumberBuffers-1].mDataByteSize) - (char*)block); + + // Make sure whole buffer (including timestamp and length value) is 16-byte aligned in length + calculatedLength = (UInt32)align16byte(calculatedLength); + + assert(calculatedLength <= block->totalLength && calculatedLength <= availableBytes); + + block->totalLength = calculatedLength; + + TPCircularBufferProduce(buffer, block->totalLength); +} + +bool TPCircularBufferCopyAudioBufferList(TPCircularBuffer *buffer, const AudioBufferList *inBufferList, const AudioTimeStamp *inTimestamp, UInt32 frames, const AudioStreamBasicDescription *audioDescription) { + if ( frames == 0 ) return true; + + int byteCount = inBufferList->mBuffers[0].mDataByteSize; + if ( frames != kTPCircularBufferCopyAll ) { + byteCount = frames * audioDescription->mBytesPerFrame; + assert(byteCount <= inBufferList->mBuffers[0].mDataByteSize); + } + + if ( byteCount == 0 ) return true; + + AudioBufferList *bufferList = TPCircularBufferPrepareEmptyAudioBufferList(buffer, inBufferList->mNumberBuffers, byteCount, inTimestamp); + if ( !bufferList ) return false; + + for ( int i=0; imNumberBuffers; i++ ) { + memcpy(bufferList->mBuffers[i].mData, inBufferList->mBuffers[i].mData, byteCount); + } + + TPCircularBufferProduceAudioBufferList(buffer, NULL); + + return true; +} + +AudioBufferList *TPCircularBufferNextBufferListAfter(TPCircularBuffer *buffer, const AudioBufferList *bufferList, AudioTimeStamp *outTimestamp) { + int32_t availableBytes; + void *tail = TPCircularBufferTail(buffer, &availableBytes); + void *end = (char*)tail + availableBytes; + assert((void*)bufferList > (void*)tail && (void*)bufferList < end); + + TPCircularBufferABLBlockHeader *originalBlock = (TPCircularBufferABLBlockHeader*)((char*)bufferList - offsetof(TPCircularBufferABLBlockHeader, bufferList)); + + #ifdef DEBUG + assert(!((unsigned long)originalBlock & 0xF) /* Beware unaligned accesses */); + #endif + + TPCircularBufferABLBlockHeader *nextBlock = (TPCircularBufferABLBlockHeader*)((char*)originalBlock + originalBlock->totalLength); + if ( (void*)nextBlock >= end ) return NULL; + + #ifdef DEBUG + assert(!((unsigned long)nextBlock & 0xF) /* Beware unaligned accesses */); + #endif + + if ( outTimestamp ) { + memcpy(outTimestamp, &nextBlock->timestamp, sizeof(AudioTimeStamp)); + } + + return &nextBlock->bufferList; +} + +void TPCircularBufferConsumeNextBufferListPartial(TPCircularBuffer *buffer, int framesToConsume, const AudioStreamBasicDescription *audioFormat) { + assert(framesToConsume >= 0); + + int32_t dontcare; + TPCircularBufferABLBlockHeader *block = (TPCircularBufferABLBlockHeader*)TPCircularBufferTail(buffer, &dontcare); + if ( !block ) return; + + #ifdef DEBUG + assert(!((unsigned long)block & 0xF)); // Beware unaligned accesses + #endif + + int bytesToConsume = (int)min(framesToConsume * audioFormat->mBytesPerFrame, block->bufferList.mBuffers[0].mDataByteSize); + + if ( bytesToConsume == block->bufferList.mBuffers[0].mDataByteSize ) { + TPCircularBufferConsumeNextBufferList(buffer); + return; + } + + for ( int i=0; ibufferList.mNumberBuffers; i++ ) { + assert(bytesToConsume <= block->bufferList.mBuffers[i].mDataByteSize); + + block->bufferList.mBuffers[i].mData = (char*)block->bufferList.mBuffers[i].mData + bytesToConsume; + block->bufferList.mBuffers[i].mDataByteSize -= bytesToConsume; + } + + if ( block->timestamp.mFlags & kAudioTimeStampSampleTimeValid ) { + block->timestamp.mSampleTime += framesToConsume; + } + if ( block->timestamp.mFlags & kAudioTimeStampHostTimeValid ) { + if ( !__secondsToHostTicks ) { + mach_timebase_info_data_t tinfo; + mach_timebase_info(&tinfo); + __secondsToHostTicks = 1.0 / (((double)tinfo.numer / tinfo.denom) * 1.0e-9); + } + + block->timestamp.mHostTime += ((double)framesToConsume / audioFormat->mSampleRate) * __secondsToHostTicks; + } + + // Reposition block forward, just before the audio data, ensuring 16-byte alignment + TPCircularBufferABLBlockHeader *newBlock = (TPCircularBufferABLBlockHeader*)(((unsigned long)block + bytesToConsume) & ~0xFul); + memmove(newBlock, block, sizeof(TPCircularBufferABLBlockHeader) + (block->bufferList.mNumberBuffers-1)*sizeof(AudioBuffer)); + intptr_t bytesFreed = (intptr_t)newBlock - (intptr_t)block; + newBlock->totalLength -= bytesFreed; + TPCircularBufferConsume(buffer, (int32_t)bytesFreed); +} + +void TPCircularBufferDequeueBufferListFrames(TPCircularBuffer *buffer, UInt32 *ioLengthInFrames, const AudioBufferList *outputBufferList, AudioTimeStamp *outTimestamp, const AudioStreamBasicDescription *audioFormat) { + bool hasTimestamp = false; + UInt32 bytesToGo = *ioLengthInFrames * audioFormat->mBytesPerFrame; + UInt32 bytesCopied = 0; + while ( bytesToGo > 0 ) { + AudioBufferList *bufferList = TPCircularBufferNextBufferList(buffer, !hasTimestamp ? outTimestamp : NULL); + if ( !bufferList ) break; + + hasTimestamp = true; + long bytesToCopy = min(bytesToGo, bufferList->mBuffers[0].mDataByteSize); + + if ( outputBufferList ) { + for ( int i=0; imNumberBuffers; i++ ) { + assert(bytesCopied + bytesToCopy <= outputBufferList->mBuffers[i].mDataByteSize); + memcpy((char*)outputBufferList->mBuffers[i].mData + bytesCopied, bufferList->mBuffers[i].mData, bytesToCopy); + } + } + + TPCircularBufferConsumeNextBufferListPartial(buffer, (int)bytesToCopy/audioFormat->mBytesPerFrame, audioFormat); + + bytesToGo -= bytesToCopy; + bytesCopied += bytesToCopy; + } + + *ioLengthInFrames -= bytesToGo / audioFormat->mBytesPerFrame; +} + +UInt32 TPCircularBufferPeekContiguousWrapped(TPCircularBuffer *buffer, AudioTimeStamp *outTimestamp, const AudioStreamBasicDescription *audioFormat, UInt32 contiguousToleranceSampleTime, UInt32 wrapPoint) { + int32_t availableBytes; + TPCircularBufferABLBlockHeader *block = (TPCircularBufferABLBlockHeader*)TPCircularBufferTail(buffer, &availableBytes); + if ( !block ) return 0; + + #ifdef DEBUG + assert(!((unsigned long)block & 0xF) /* Beware unaligned accesses */); + #endif + + if ( outTimestamp ) { + memcpy(outTimestamp, &block->timestamp, sizeof(AudioTimeStamp)); + } + + void *end = (char*)block + availableBytes; + + UInt32 byteCount = 0; + + while ( 1 ) { + byteCount += block->bufferList.mBuffers[0].mDataByteSize; + TPCircularBufferABLBlockHeader *nextBlock = (TPCircularBufferABLBlockHeader*)((char*)block + block->totalLength); + if ( (void*)nextBlock >= end ) { + break; + } + + if ( contiguousToleranceSampleTime != UINT32_MAX ) { + UInt32 frames = block->bufferList.mBuffers[0].mDataByteSize / audioFormat->mBytesPerFrame; + Float64 nextTime = block->timestamp.mSampleTime + frames; + if ( wrapPoint && nextTime > wrapPoint ) nextTime = fmod(nextTime, wrapPoint); + Float64 diff = fabs(nextBlock->timestamp.mSampleTime - nextTime); + if ( diff > contiguousToleranceSampleTime && (!wrapPoint || fabs(diff-wrapPoint) > contiguousToleranceSampleTime) ) { + break; + } + } + + #ifdef DEBUG + assert(!((unsigned long)nextBlock & 0xF) /* Beware unaligned accesses */); + #endif + + block = nextBlock; + } + + return byteCount / audioFormat->mBytesPerFrame; +} + +UInt32 TPCircularBufferPeek(TPCircularBuffer *buffer, AudioTimeStamp *outTimestamp, const AudioStreamBasicDescription *audioFormat) { + return TPCircularBufferPeekContiguousWrapped(buffer, outTimestamp, audioFormat, UINT32_MAX, 0); +} + +UInt32 TPCircularBufferPeekContiguous(TPCircularBuffer *buffer, AudioTimeStamp *outTimestamp, const AudioStreamBasicDescription *audioFormat, UInt32 contiguousToleranceSampleTime) { + return TPCircularBufferPeekContiguousWrapped(buffer, outTimestamp, audioFormat, contiguousToleranceSampleTime, 0); +} + +UInt32 TPCircularBufferGetAvailableSpace(TPCircularBuffer *buffer, const AudioStreamBasicDescription *audioFormat) { + // Look at buffer head; make sure there's space for the block metadata + int32_t availableBytes; + TPCircularBufferABLBlockHeader *block = (TPCircularBufferABLBlockHeader*)TPCircularBufferHead(buffer, &availableBytes); + if ( !block ) return 0; + + #ifdef DEBUG + assert(!((unsigned long)block & 0xF) /* Beware unaligned accesses */); + #endif + + // Now find out how much 16-byte aligned audio we can store in the space available + int numberOfBuffers = audioFormat->mFormatFlags & kAudioFormatFlagIsNonInterleaved ? audioFormat->mChannelsPerFrame : 1; + char * endOfBuffer = (char*)block + availableBytes; + char * dataPtr = (char*)align16byte((long)(&block->bufferList + sizeof(AudioBufferList)+((numberOfBuffers-1)*sizeof(AudioBuffer)))); + if ( dataPtr >= endOfBuffer ) return 0; + int32_t availableAudioBytes = (int)(endOfBuffer - dataPtr); + + int32_t availableAudioBytesPerBuffer = availableAudioBytes / numberOfBuffers; + availableAudioBytesPerBuffer -= (availableAudioBytesPerBuffer % (16-1)); + + return availableAudioBytesPerBuffer > 0 ? availableAudioBytesPerBuffer / audioFormat->mBytesPerFrame : 0; +} diff --git a/CocoaSplit/TPCircularBuffer+AudioBufferList.h b/CocoaSplit/TPCircularBuffer+AudioBufferList.h new file mode 100644 index 00000000..6384c46a --- /dev/null +++ b/CocoaSplit/TPCircularBuffer+AudioBufferList.h @@ -0,0 +1,232 @@ +// +// TPCircularBuffer+AudioBufferList.h +// Circular/Ring buffer implementation +// +// https://github.com/michaeltyson/TPCircularBuffer +// +// Created by Michael Tyson on 20/03/2012. +// +// Copyright (C) 2012-2013 A Tasty Pixel +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef TPCircularBuffer_AudioBufferList_h +#define TPCircularBuffer_AudioBufferList_h + +#ifdef __cplusplus +extern "C" { +#endif + +#include "TPCircularBuffer.h" +#include + +#define kTPCircularBufferCopyAll UINT32_MAX + +typedef struct { + AudioTimeStamp timestamp; + UInt32 totalLength; + AudioBufferList bufferList; +} TPCircularBufferABLBlockHeader; + + +/*! + * Prepare an empty buffer list, stored on the circular buffer + * + * @param buffer Circular buffer + * @param numberOfBuffers The number of buffers to be contained within the buffer list + * @param bytesPerBuffer The number of bytes to store for each buffer + * @param timestamp The timestamp associated with the buffer, or NULL. Note that you can also pass a timestamp into TPCircularBufferProduceAudioBufferList, to set it there instead. + * @return The empty buffer list, or NULL if circular buffer has insufficient space + */ +AudioBufferList *TPCircularBufferPrepareEmptyAudioBufferList(TPCircularBuffer *buffer, int numberOfBuffers, int bytesPerBuffer, const AudioTimeStamp *timestamp); + +/*! + * Prepare an empty buffer list, stored on the circular buffer, using an audio description to automatically configure buffer + * + * @param buffer Circular buffer + * @param audioFormat The kind of audio that will be stored + * @param frameCount The number of frames that will be stored + * @param timestamp The timestamp associated with the buffer, or NULL. Note that you can also pass a timestamp into TPCircularBufferProduceAudioBufferList, to set it there instead. + * @return The empty buffer list, or NULL if circular buffer has insufficient space + */ +AudioBufferList *TPCircularBufferPrepareEmptyAudioBufferListWithAudioFormat(TPCircularBuffer *buffer, const AudioStreamBasicDescription *audioFormat, UInt32 frameCount, const AudioTimeStamp *timestamp); + +/*! + * Mark next audio buffer list as ready for reading + * + * This marks the audio buffer list prepared using TPCircularBufferPrepareEmptyAudioBufferList + * as ready for reading. You must not call this function without first calling + * TPCircularBufferPrepareEmptyAudioBufferList. + * + * @param buffer Circular buffer + * @param timestamp The timestamp associated with the buffer, or NULL to leave as-is. Note that you can also pass a timestamp into TPCircularBufferPrepareEmptyAudioBufferList, to set it there instead. + */ +void TPCircularBufferProduceAudioBufferList(TPCircularBuffer *buffer, const AudioTimeStamp *inTimestamp); + +/*! + * Copy the audio buffer list onto the buffer + * + * @param buffer Circular buffer + * @param bufferList Buffer list containing audio to copy to buffer + * @param timestamp The timestamp associated with the buffer, or NULL + * @param frames Length of audio in frames. Specify kTPCircularBufferCopyAll to copy the whole buffer (audioFormat can be NULL, in this case) + * @param audioFormat The AudioStreamBasicDescription describing the audio, or NULL if you specify kTPCircularBufferCopyAll to the `frames` argument + * @return YES if buffer list was successfully copied; NO if there was insufficient space + */ +bool TPCircularBufferCopyAudioBufferList(TPCircularBuffer *buffer, const AudioBufferList *bufferList, const AudioTimeStamp *timestamp, UInt32 frames, const AudioStreamBasicDescription *audioFormat); + +/*! + * Get a pointer to the next stored buffer list + * + * @param buffer Circular buffer + * @param outTimestamp On output, if not NULL, the timestamp corresponding to the buffer + * @return Pointer to the next buffer list in the buffer + */ +static __inline__ __attribute__((always_inline)) AudioBufferList *TPCircularBufferNextBufferList(TPCircularBuffer *buffer, AudioTimeStamp *outTimestamp) { + int32_t dontcare; // Length of segment is contained within buffer list, so we can ignore this + TPCircularBufferABLBlockHeader *block = (TPCircularBufferABLBlockHeader*)TPCircularBufferTail(buffer, &dontcare); + if ( !block ) { + if ( outTimestamp ) { + memset(outTimestamp, 0, sizeof(AudioTimeStamp)); + } + return NULL; + } + if ( outTimestamp ) { + memcpy(outTimestamp, &block->timestamp, sizeof(AudioTimeStamp)); + } + return &block->bufferList; +} + +/*! + * Get a pointer to the next stored buffer list after the given one + * + * @param buffer Circular buffer + * @param bufferList Preceding buffer list + * @param outTimestamp On output, if not NULL, the timestamp corresponding to the buffer + * @return Pointer to the next buffer list in the buffer, or NULL + */ +AudioBufferList *TPCircularBufferNextBufferListAfter(TPCircularBuffer *buffer, const AudioBufferList *bufferList, AudioTimeStamp *outTimestamp); + +/*! + * Consume the next buffer list + * + * @param buffer Circular buffer + */ +static __inline__ __attribute__((always_inline)) void TPCircularBufferConsumeNextBufferList(TPCircularBuffer *buffer) { + int32_t dontcare; + TPCircularBufferABLBlockHeader *block = (TPCircularBufferABLBlockHeader*)TPCircularBufferTail(buffer, &dontcare); + if ( !block ) return; + TPCircularBufferConsume(buffer, block->totalLength); +} + +/*! + * Consume a portion of the next buffer list + * + * This will also increment the sample time and host time portions of the timestamp of + * the buffer list, if present. + * + * @param buffer Circular buffer + * @param framesToConsume The number of frames to consume from the buffer list + * @param audioFormat The AudioStreamBasicDescription describing the audio + */ +void TPCircularBufferConsumeNextBufferListPartial(TPCircularBuffer *buffer, int framesToConsume, const AudioStreamBasicDescription *audioFormat); + +/*! + * Consume a certain number of frames from the buffer, possibly from multiple queued buffer lists + * + * Copies the given number of frames from the buffer into outputBufferList, of the + * given audio description, then consumes the audio buffers. If an audio buffer has + * not been entirely consumed, then updates the queued buffer list structure to point + * to the unconsumed data only. + * + * @param buffer Circular buffer + * @param ioLengthInFrames On input, the number of frames in the given audio format to consume; on output, the number of frames provided + * @param outputBufferList The buffer list to copy audio to, or NULL to discard audio. If not NULL, the structure must be initialised properly, and the mData pointers must not be NULL. + * @param outTimestamp On output, if not NULL, the timestamp corresponding to the first audio frame returned + * @param audioFormat The format of the audio stored in the buffer + */ +void TPCircularBufferDequeueBufferListFrames(TPCircularBuffer *buffer, UInt32 *ioLengthInFrames, const AudioBufferList *outputBufferList, AudioTimeStamp *outTimestamp, const AudioStreamBasicDescription *audioFormat); + +/*! + * Determine how many frames of audio are buffered + * + * Given the provided audio format, determines the frame count of all queued buffers + * + * Note: This function should only be used on the consumer thread, not the producer thread. + * + * @param buffer Circular buffer + * @param outTimestamp On output, if not NULL, the timestamp corresponding to the first audio frame + * @param audioFormat The format of the audio stored in the buffer + * @return The number of frames in the given audio format that are in the buffer + */ +UInt32 TPCircularBufferPeek(TPCircularBuffer *buffer, AudioTimeStamp *outTimestamp, const AudioStreamBasicDescription *audioFormat); + +/*! + * Determine how many contiguous frames of audio are buffered + * + * Given the provided audio format, determines the frame count of all queued buffers that are contiguous, + * given their corresponding timestamps (sample time). + * + * Note: This function should only be used on the consumer thread, not the producer thread. + * + * @param buffer Circular buffer + * @param outTimestamp On output, if not NULL, the timestamp corresponding to the first audio frame + * @param audioFormat The format of the audio stored in the buffer + * @param contiguousToleranceSampleTime The number of samples of discrepancy to tolerate + * @return The number of frames in the given audio format that are in the buffer + */ +UInt32 TPCircularBufferPeekContiguous(TPCircularBuffer *buffer, AudioTimeStamp *outTimestamp, const AudioStreamBasicDescription *audioFormat, UInt32 contiguousToleranceSampleTime); + +/*! + * Determine how many contiguous frames of audio are buffered, with wrap around + * + * Like TPCircularBufferPeekContiguous, determines how many contiguous frames are buffered, + * but considers audio that wraps around a region of a given length as also contiguous. This + * is good for audio that loops. + * + * Note: This function should only be used on the consumer thread, not the producer thread. + * + * @param buffer Circular buffer + * @param outTimestamp On output, if not NULL, the timestamp corresponding to the first audio frame + * @param audioFormat The format of the audio stored in the buffer + * @param contiguousToleranceSampleTime The number of samples of discrepancy to tolerate + * @param wrapPoint The point around which the audio may wrap and still be considered contiguous, or 0 to disable + * @return The number of frames in the given audio format that are in the buffer + */ +UInt32 TPCircularBufferPeekContiguousWrapped(TPCircularBuffer *buffer, AudioTimeStamp *outTimestamp, const AudioStreamBasicDescription *audioFormat, UInt32 contiguousToleranceSampleTime, UInt32 wrapPoint); + +/*! + * Determine how many much space there is in the buffer + * + * Given the provided audio format, determines the number of frames of audio that can be buffered. + * + * Note: This function should only be used on the producer thread, not the consumer thread. + * + * @param buffer Circular buffer + * @param audioFormat The format of the audio stored in the buffer + * @return The number of frames in the given audio format that can be stored in the buffer + */ +UInt32 TPCircularBufferGetAvailableSpace(TPCircularBuffer *buffer, const AudioStreamBasicDescription *audioFormat); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/CocoaSplit/TPCircularBuffer.c b/CocoaSplit/TPCircularBuffer.c new file mode 100644 index 00000000..1d85d6c9 --- /dev/null +++ b/CocoaSplit/TPCircularBuffer.c @@ -0,0 +1,149 @@ +// +// TPCircularBuffer.c +// Circular/Ring buffer implementation +// +// https://github.com/michaeltyson/TPCircularBuffer +// +// Created by Michael Tyson on 10/12/2011. +// +// Copyright (C) 2012-2013 A Tasty Pixel +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +#include "TPCircularBuffer.h" +#include +#include +#include + +#define reportResult(result,operation) (_reportResult((result),(operation),strrchr(__FILE__, '/')+1,__LINE__)) +static inline bool _reportResult(kern_return_t result, const char *operation, const char* file, int line) { + if ( result != ERR_SUCCESS ) { + printf("%s:%d: %s: %s\n", file, line, operation, mach_error_string(result)); + return false; + } + return true; +} + +bool _TPCircularBufferInit(TPCircularBuffer *buffer, int32_t length, size_t structSize) { + + assert(length > 0); + + if ( structSize != sizeof(TPCircularBuffer) ) { + fprintf(stderr, "TPCircularBuffer: Header version mismatch. Check for old versions of TPCircularBuffer in your project\n"); + abort(); + } + + // Keep trying until we get our buffer, needed to handle race conditions + int retries = 3; + while ( true ) { + + buffer->length = (int32_t)round_page(length); // We need whole page sizes + + // Temporarily allocate twice the length, so we have the contiguous address space to + // support a second instance of the buffer directly after + vm_address_t bufferAddress; + kern_return_t result = vm_allocate(mach_task_self(), + &bufferAddress, + buffer->length * 2, + VM_FLAGS_ANYWHERE); // allocate anywhere it'll fit + if ( result != ERR_SUCCESS ) { + if ( retries-- == 0 ) { + reportResult(result, "Buffer allocation"); + return false; + } + // Try again if we fail + continue; + } + + // Now replace the second half of the allocation with a virtual copy of the first half. Deallocate the second half... + result = vm_deallocate(mach_task_self(), + bufferAddress + buffer->length, + buffer->length); + if ( result != ERR_SUCCESS ) { + if ( retries-- == 0 ) { + reportResult(result, "Buffer deallocation"); + return false; + } + // If this fails somehow, deallocate the whole region and try again + vm_deallocate(mach_task_self(), bufferAddress, buffer->length); + continue; + } + + // Re-map the buffer to the address space immediately after the buffer + vm_address_t virtualAddress = bufferAddress + buffer->length; + vm_prot_t cur_prot, max_prot; + result = vm_remap(mach_task_self(), + &virtualAddress, // mirror target + buffer->length, // size of mirror + 0, // auto alignment + 0, // force remapping to virtualAddress + mach_task_self(), // same task + bufferAddress, // mirror source + 0, // MAP READ-WRITE, NOT COPY + &cur_prot, // unused protection struct + &max_prot, // unused protection struct + VM_INHERIT_DEFAULT); + if ( result != ERR_SUCCESS ) { + if ( retries-- == 0 ) { + reportResult(result, "Remap buffer memory"); + return false; + } + // If this remap failed, we hit a race condition, so deallocate and try again + vm_deallocate(mach_task_self(), bufferAddress, buffer->length); + continue; + } + + if ( virtualAddress != bufferAddress+buffer->length ) { + // If the memory is not contiguous, clean up both allocated buffers and try again + if ( retries-- == 0 ) { + printf("Couldn't map buffer memory to end of buffer\n"); + return false; + } + + vm_deallocate(mach_task_self(), virtualAddress, buffer->length); + vm_deallocate(mach_task_self(), bufferAddress, buffer->length); + continue; + } + + buffer->buffer = (void*)bufferAddress; + buffer->fillCount = 0; + buffer->head = buffer->tail = 0; + buffer->atomic = true; + + return true; + } + return false; +} + +void TPCircularBufferCleanup(TPCircularBuffer *buffer) { + vm_deallocate(mach_task_self(), (vm_address_t)buffer->buffer, buffer->length * 2); + memset(buffer, 0, sizeof(TPCircularBuffer)); +} + +void TPCircularBufferClear(TPCircularBuffer *buffer) { + int32_t fillCount; + if ( TPCircularBufferTail(buffer, &fillCount) ) { + TPCircularBufferConsume(buffer, fillCount); + } +} + +void TPCircularBufferSetAtomic(TPCircularBuffer *buffer, bool atomic) { + buffer->atomic = atomic; +} diff --git a/CocoaSplit/TPCircularBuffer.h b/CocoaSplit/TPCircularBuffer.h new file mode 100644 index 00000000..88eb7220 --- /dev/null +++ b/CocoaSplit/TPCircularBuffer.h @@ -0,0 +1,231 @@ +// +// TPCircularBuffer.h +// Circular/Ring buffer implementation +// +// https://github.com/michaeltyson/TPCircularBuffer +// +// Created by Michael Tyson on 10/12/2011. +// +// +// This implementation makes use of a virtual memory mapping technique that inserts a virtual copy +// of the buffer memory directly after the buffer's end, negating the need for any buffer wrap-around +// logic. Clients can simply use the returned memory address as if it were contiguous space. +// +// The implementation is thread-safe in the case of a single producer and single consumer. +// +// Virtual memory technique originally proposed by Philip Howard (http://vrb.slashusr.org/), and +// adapted to Darwin by Kurt Revis (http://www.snoize.com, +// http://www.snoize.com/Code/PlayBufferedSoundFile.tar.gz) +// +// +// Copyright (C) 2012-2013 A Tasty Pixel +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef TPCircularBuffer_h +#define TPCircularBuffer_h + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + void *buffer; + int32_t length; + int32_t tail; + int32_t head; + volatile int32_t fillCount; + bool atomic; +} TPCircularBuffer; + +/*! + * Initialise buffer + * + * Note that the length is advisory only: Because of the way the + * memory mirroring technique works, the true buffer length will + * be multiples of the device page size (e.g. 4096 bytes) + * + * If you intend to use the AudioBufferList utilities, you should + * always allocate a bit more space than you need for pure audio + * data, so there's room for the metadata. How much extra is required + * depends on how many AudioBufferList structures are used, which is + * a function of how many audio frames each buffer holds. A good rule + * of thumb is to add 15%, or at least another 2048 bytes or so. + * + * @param buffer Circular buffer + * @param length Length of buffer + */ +#define TPCircularBufferInit(buffer, length) \ + _TPCircularBufferInit(buffer, length, sizeof(*buffer)) +bool _TPCircularBufferInit(TPCircularBuffer *buffer, int32_t length, size_t structSize); + +/*! + * Cleanup buffer + * + * Releases buffer resources. + */ +void TPCircularBufferCleanup(TPCircularBuffer *buffer); + +/*! + * Clear buffer + * + * Resets buffer to original, empty state. + * + * This is safe for use by consumer while producer is accessing + * buffer. + */ +void TPCircularBufferClear(TPCircularBuffer *buffer); + +/*! + * Set the atomicity + * + * If you set the atomiticy to false using this method, the buffer will + * not use atomic operations. This can be used to give the compiler a little + * more optimisation opportunities when the buffer is only used on one thread. + * + * Important note: Only set this to false if you know what you're doing! + * + * The default value is true (the buffer will use atomic operations) + * + * @param buffer Circular buffer + * @param atomic Whether the buffer is atomic (default true) + */ +void TPCircularBufferSetAtomic(TPCircularBuffer *buffer, bool atomic); + +// Reading (consuming) + +/*! + * Access end of buffer + * + * This gives you a pointer to the end of the buffer, ready + * for reading, and the number of available bytes to read. + * + * @param buffer Circular buffer + * @param availableBytes On output, the number of bytes ready for reading + * @return Pointer to the first bytes ready for reading, or NULL if buffer is empty + */ +static __inline__ __attribute__((always_inline)) void* TPCircularBufferTail(TPCircularBuffer *buffer, int32_t* availableBytes) { + *availableBytes = buffer->fillCount; + if ( *availableBytes == 0 ) return NULL; + return (void*)((char*)buffer->buffer + buffer->tail); +} + +/*! + * Consume bytes in buffer + * + * This frees up the just-read bytes, ready for writing again. + * + * @param buffer Circular buffer + * @param amount Number of bytes to consume + */ +static __inline__ __attribute__((always_inline)) void TPCircularBufferConsume(TPCircularBuffer *buffer, int32_t amount) { + buffer->tail = (buffer->tail + amount) % buffer->length; + if ( buffer->atomic ) { + OSAtomicAdd32Barrier(-amount, &buffer->fillCount); + } else { + buffer->fillCount -= amount; + } + assert(buffer->fillCount >= 0); +} + +/*! + * Access front of buffer + * + * This gives you a pointer to the front of the buffer, ready + * for writing, and the number of available bytes to write. + * + * @param buffer Circular buffer + * @param availableBytes On output, the number of bytes ready for writing + * @return Pointer to the first bytes ready for writing, or NULL if buffer is full + */ +static __inline__ __attribute__((always_inline)) void* TPCircularBufferHead(TPCircularBuffer *buffer, int32_t* availableBytes) { + *availableBytes = (buffer->length - buffer->fillCount); + if ( *availableBytes == 0 ) return NULL; + return (void*)((char*)buffer->buffer + buffer->head); +} + +// Writing (producing) + +/*! + * Produce bytes in buffer + * + * This marks the given section of the buffer ready for reading. + * + * @param buffer Circular buffer + * @param amount Number of bytes to produce + */ +static __inline__ __attribute__((always_inline)) void TPCircularBufferProduce(TPCircularBuffer *buffer, int32_t amount) { + buffer->head = (buffer->head + amount) % buffer->length; + if ( buffer->atomic ) { + OSAtomicAdd32Barrier(amount, &buffer->fillCount); + } else { + buffer->fillCount += amount; + } + assert(buffer->fillCount <= buffer->length); +} + +/*! + * Helper routine to copy bytes to buffer + * + * This copies the given bytes to the buffer, and marks them ready for reading. + * + * @param buffer Circular buffer + * @param src Source buffer + * @param len Number of bytes in source buffer + * @return true if bytes copied, false if there was insufficient space + */ +static __inline__ __attribute__((always_inline)) bool TPCircularBufferProduceBytes(TPCircularBuffer *buffer, const void* src, int32_t len) { + int32_t space; + void *ptr = TPCircularBufferHead(buffer, &space); + if ( space < len ) return false; + memcpy(ptr, src, len); + TPCircularBufferProduce(buffer, len); + return true; +} + +/*! + * Deprecated method + */ +static __inline__ __attribute__((always_inline)) __deprecated_msg("use TPCircularBufferSetAtomic(false) and TPCircularBufferConsume instead") +void TPCircularBufferConsumeNoBarrier(TPCircularBuffer *buffer, int32_t amount) { + buffer->tail = (buffer->tail + amount) % buffer->length; + buffer->fillCount -= amount; + assert(buffer->fillCount >= 0); +} + +/*! + * Deprecated method + */ +static __inline__ __attribute__((always_inline)) __deprecated_msg("use TPCircularBufferSetAtomic(false) and TPCircularBufferProduce instead") +void TPCircularBufferProduceNoBarrier(TPCircularBuffer *buffer, int32_t amount) { + buffer->head = (buffer->head + amount) % buffer->length; + buffer->fillCount += amount; + assert(buffer->fillCount <= buffer->length); +} + +#ifdef __cplusplus +} +#endif + +#endif From 1ba640f00659671a1ab6e2d85a0a8b1743ac9e15 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 30 Apr 2016 07:22:56 -0400 Subject: [PATCH 070/156] Don't send to instant recorder if the compressor is in an error state --- CocoaSplit/CaptureController.m | 2 +- CocoaSplit/Compressor/CSIRCompressor.m | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index e852028f..bd713871 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2436,7 +2436,7 @@ - if (self.instantRecorder && self.instantRecorder.compressor) + if (self.instantRecorder && self.instantRecorder.compressor && !self.instantRecorder.compressor.errored) { CapturedFrameData *newFrameData = frameData.copy; [self.instantRecorder.compressor compressFrame:newFrameData]; diff --git a/CocoaSplit/Compressor/CSIRCompressor.m b/CocoaSplit/Compressor/CSIRCompressor.m index 2cd45d08..305c0415 100644 --- a/CocoaSplit/Compressor/CSIRCompressor.m +++ b/CocoaSplit/Compressor/CSIRCompressor.m @@ -123,13 +123,14 @@ -(void) reset { - self.errored = NO; if (_compressor) { [_compressor reset]; } _compressor = nil; + self.errored = NO; + From 19af8bb2a44ac7ec0763b50d6e05089efdaed2ee Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 30 Apr 2016 19:54:36 -0400 Subject: [PATCH 071/156] Disable instant record button if instant record is disabled or otherwise unavailable --- CocoaSplit/CaptureController.h | 2 ++ CocoaSplit/CaptureController.m | 14 ++++++++++---- CocoaSplit/en.lproj/MainMenu.xib | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 23553e19..ce9ba0d5 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -120,6 +120,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) NSString *instantRecordDirectory; +@property (assign) bool instantRecordActive; + @property (strong) CSTimedOutputBuffer *instantRecorder; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index bd713871..1a305b9f 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -686,6 +686,7 @@ self.transitionDirections = @[kCATransitionFromTop, kCATransitionFromRight, kCATransitionFromBottom, kCATransitionFromLeft]; self.useInstantRecord = YES; + self.instantRecordActive = YES; self.instantRecordBufferDuration = 60; @@ -890,7 +891,6 @@ if ([layout isEqual:self.livePreviewView.sourceLayout]) { - NSLog(@"LAYOUT CHANNGED"); [self resetInstantRecorder]; } @@ -1225,9 +1225,7 @@ { _needsIRReset = YES; } else { - NSLog(@"RESETTING IR COMPRESSOR"); [irCompressor reset]; - NSLog(@"RESET IR COMPRESSOR DONE"); } } @@ -1410,6 +1408,8 @@ self.useInstantRecord = [[saveRoot valueForKey:@"useInstantRecord"] boolValue]; } + self.instantRecordActive = YES; + if (saveRoot[@"instantRecordBufferDuration"]) { self.instantRecordBufferDuration = [[saveRoot valueForKey:@"instantRecordBufferDuration"] intValue]; @@ -1618,8 +1618,10 @@ if (useInstantRecord) { [self setupInstantRecorder]; + self.instantRecordActive = YES; } else { self.instantRecorder = nil; + self.instantRecordActive = NO; } } @@ -2440,6 +2442,10 @@ { CapturedFrameData *newFrameData = frameData.copy; [self.instantRecorder.compressor compressFrame:newFrameData]; + if (self.instantRecorder.compressor.errored) + { + self.instantRecordActive = NO; + } } } @@ -3218,7 +3224,7 @@ - (IBAction)doInstantRecord:(id)sender { - if (self.instantRecorder) + if (self.instantRecordActive && self.instantRecorder) { NSString *directory = self.instantRecordDirectory; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 6fbda1df..de26bd33 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1603,6 +1603,7 @@ + From 7a20378a7ca8f0907e20336078377d647bf04351 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 30 Apr 2016 23:11:27 -0400 Subject: [PATCH 072/156] Send canvas update notification on golive/replace bump version to 2.0.5 --- CocoaSplit/CocoaSplit-Info.plist | 4 ++-- CocoaSplit/SourceLayout.m | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index c4fcdb3d..d0abd37f 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.4 + 2.0.5 CFBundleSignature ???? CFBundleVersion - 2.0.4 + 2.0.5 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 603102ac..d82b1127 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -639,8 +639,7 @@ } _noSceneTransactions = NO; - self.canvas_height = layout.canvas_height; - self.canvas_width = layout.canvas_width; + [self updateCanvasWidth:layout.canvas_width height:layout.canvas_height]; self.frameRate = layout.frameRate; } From 248df1e5bfa3197e0311fc553debb3bddf33aefb Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 30 Apr 2016 23:19:11 -0400 Subject: [PATCH 073/156] Default IR compressor now tries apple hardware encoder, fails if it doesn't exit --- CocoaSplit/Compressor/CSIRCompressor.m | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CocoaSplit/Compressor/CSIRCompressor.m b/CocoaSplit/Compressor/CSIRCompressor.m index 305c0415..80ac4356 100644 --- a/CocoaSplit/Compressor/CSIRCompressor.m +++ b/CocoaSplit/Compressor/CSIRCompressor.m @@ -112,9 +112,7 @@ self.compressorType = @"Instant Replay Compressor"; self.tryAppleHardware = YES; - self.useAppleH264 = YES; - - + self.useNone = YES; } return self; From 834cfccd561912947fb411f53b291ff09dc8ad6f Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 1 May 2016 17:29:50 -0400 Subject: [PATCH 074/156] Restore rendering statistics --- CocoaSplit.xcodeproj/project.pbxproj | 8 +++----- CocoaSplit/CaptureController.m | 2 +- CocoaSplit/en.lproj/MainMenu.xib | 3 ++- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index d4323fbc..85b4dfb3 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -128,8 +128,8 @@ 345F8B761A17A785009A81E3 /* CAMultiAudioMixer.m in Sources */ = {isa = PBXBuildFile; fileRef = 345F8B741A17A785009A81E3 /* CAMultiAudioMixer.m */; }; 345F8B791A183D1D009A81E3 /* CAMultiAudioEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 345F8B781A183D1D009A81E3 /* CAMultiAudioEngine.m */; }; 345F8B7A1A183D1D009A81E3 /* CAMultiAudioEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 345F8B781A183D1D009A81E3 /* CAMultiAudioEngine.m */; }; - 3460E58A1AC766260080358E /* rotate.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3460E5871AC764500080358E /* rotate.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - 3463F99F1AD1594300F3B5C8 /* movement.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3463F99D1AD0DC7100F3B5C8 /* movement.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 3460E58A1AC766260080358E /* rotate.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3460E5871AC764500080358E /* rotate.py */; }; + 3463F99F1AD1594300F3B5C8 /* movement.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3463F99D1AD0DC7100F3B5C8 /* movement.py */; }; 346865471CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 346865451CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m */; }; 346865481CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 346865461CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.xib */; }; 346CF44C1A5C10C2008E5BFF /* CSInputLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */; }; @@ -2183,7 +2183,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "LOCATION=\"${BUILT_PRODUCTS_DIR}\"/\"${CONTENTS_FOLDER_PATH}\"\nIDENTITY=\"Developer ID Application: Zachary Girouard (L3JLUY4S5E)\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/Frameworks/Sparkle.framework\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/MacOS/CocoaSplitCmd\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSAVFCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSLayoutSwitcherExtraPlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSFileStreamServicePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTwitchStreamServicePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSChromaKey.plugin\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/TextureWrapPlugin.plugin\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDesktopCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSMovieCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSWindowCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSImageCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTextCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle/Contents/Frameworks/Syphon.framework\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/XPCServices/zakk.lol.QTCaptureHelper.xpc\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonInjectExtraPlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/CSAnimationRunner.plugin\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDeckLinkCapturePlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSNowPlayingPlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSShapeCapturePlugin.bundle\"\n\n"; + shellScript = "LOCATION=\"${BUILT_PRODUCTS_DIR}\"/\"${CONTENTS_FOLDER_PATH}\"\nIDENTITY=\"Developer ID Application: Zachary Girouard (L3JLUY4S5E)\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/Frameworks/Sparkle.framework\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/MacOS/CocoaSplitCmd\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSAVFCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSLayoutSwitcherExtraPlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSFileStreamServicePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTwitchStreamServicePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSChromaKey.plugin\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/TextureWrapPlugin.plugin\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDesktopCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSMovieCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSWindowCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSImageCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTextCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle/Contents/Frameworks/Syphon.framework\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/XPCServices/zakk.lol.QTCaptureHelper.xpc\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonInjectExtraPlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/CSAnimationRunner.plugin\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDeckLinkCapturePlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSNowPlayingPlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSShapeCapturePlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/Animations/movement.py\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/Animations/rotate.py\"\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -2547,7 +2547,6 @@ ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; - CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -2587,7 +2586,6 @@ ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; - CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 1a305b9f..1c1dd0c7 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -801,7 +801,7 @@ - //self.renderStatsString = [NSString stringWithFormat:@"Render min/max/avg: %f/%f/%f", _min_render_time, _max_render_time, _render_time_total / _renderedFrames]; + self.renderStatsString = [NSString stringWithFormat:@"Render min/max/avg: %f/%f/%f", _min_render_time, _max_render_time, _render_time_total / _renderedFrames]; _renderedFrames = 0; _render_time_total = 0.0f; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index de26bd33..62a6f63a 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -653,7 +653,7 @@ - + From 1245694dbfc9e44ed1017c886eff60dd1c149b8f Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 2 May 2016 07:12:09 -0400 Subject: [PATCH 075/156] When merging input sources into a layout, don't add the source layer as a sublayer of the layout's if the source already has a parent layer. Fixes save/restore of sources contained in other sources --- CocoaSplit/CaptureController.m | 10 ----- CocoaSplit/InputSource.h | 1 + CocoaSplit/InputSource.m | 39 ++++++++++++------- .../CSInputLibraryWindowController.xib | 16 ++------ CocoaSplit/SourceLayout.m | 24 ++++++++---- 5 files changed, 47 insertions(+), 43 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 1c1dd0c7..4aaa7640 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -765,16 +765,6 @@ dispatch_strict_flag = 0; } - /* - _dispatch_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, dispatch_strict_flag, _main_capture_queue); - - dispatch_source_set_timer(_dispatch_timer, DISPATCH_TIME_NOW, _frame_interval, 0); - - dispatch_source_set_event_handler(_dispatch_timer, ^{[self newFrameDispatched];}); - - dispatch_resume(_dispatch_timer); - */ - _audio_statistics_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); dispatch_source_set_timer(_audio_statistics_timer, DISPATCH_TIME_NOW, 0.10*NSEC_PER_SEC, 0); diff --git a/CocoaSplit/InputSource.h b/CocoaSplit/InputSource.h index 7377309e..92f80102 100644 --- a/CocoaSplit/InputSource.h +++ b/CocoaSplit/InputSource.h @@ -232,6 +232,7 @@ typedef enum resize_style_t { -(void)updateRotationTransform; -(void) directSize:(CGFloat)width height:(CGFloat)height; -(bool)isDifferentInput:(InputSource *)from; +-(void)addedToLayout; diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 8dd587ca..2f62ea28 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -401,16 +401,6 @@ static NSArray *_sourceTypes = nil; self.cornerRadius = [aDecoder decodeFloatForKey:@"cornerRadius"]; self.layoutPosition = self.layer.frame; - InputSource *parentInput = [aDecoder decodeObjectForKey:@"parentInput"]; - if (parentInput) - { - - [parentInput.layer addSublayer:self.layer]; - [parentInput.attachedInputs addObject:self]; - self.parentInput = parentInput; - - - } self.startColor = [aDecoder decodeObjectForKey:@"gradientStartColor"]; @@ -447,8 +437,19 @@ static NSArray *_sourceTypes = nil; self.transitionEnabled = [aDecoder decodeBoolForKey:@"transitionEnabled"]; } - [CATransaction commit]; + + InputSource *parentInput = [aDecoder decodeObjectForKey:@"parentInput"]; + self.parentInput = parentInput; + + if (self.parentInput) + { + + [self.parentInput.layer addSublayer:self.layer]; + [self.parentInput.attachedInputs addObject:self]; + } + + } return self; @@ -456,6 +457,16 @@ static NSArray *_sourceTypes = nil; +-(void)addedToLayout +{ + if (self.parentInput) + { + + [self.parentInput.layer addSublayer:self.layer]; + [self.parentInput.attachedInputs addObject:self]; + } + +} -(CGRect)globalLayoutPosition { return [self.sourceLayout.rootLayer convertRect:self.layoutPosition fromLayer:self.layer.superlayer]; @@ -1917,6 +1928,7 @@ static NSArray *_sourceTypes = nil; -(void)attachInput:(InputSource *)toAttach { + if (toAttach.parentInput) { if (toAttach.parentInput == self) @@ -1952,10 +1964,13 @@ static NSArray *_sourceTypes = nil; return ret; } + + -(void)makeSublayerOfLayer:(CALayer *)parentLayer { [CATransaction begin]; + [parentLayer addSublayer:self.layer]; //translate the position to the new sublayers coordinates @@ -1965,13 +1980,11 @@ static NSArray *_sourceTypes = nil; for (CALayer *curr in [layers reverseObjectEnumerator]) { //We start at the layer just before the canvas layer and the point we are converting is in canvas coordinate space - newPosition = [curr convertPoint:newPosition fromLayer:curr.superlayer]; } NSRect oldFrame = self.layer.frame; oldFrame.origin = newPosition; - self.layer.frame = oldFrame; [CATransaction commit]; diff --git a/CocoaSplit/Interface/CSInputLibraryWindowController.xib b/CocoaSplit/Interface/CSInputLibraryWindowController.xib index 6ff590bc..5119bd6c 100644 --- a/CocoaSplit/Interface/CSInputLibraryWindowController.xib +++ b/CocoaSplit/Interface/CSInputLibraryWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -14,7 +14,7 @@ - + @@ -32,7 +32,6 @@ - @@ -60,7 +59,6 @@ - @@ -72,7 +70,6 @@ - @@ -88,24 +85,19 @@ - - - @@ -140,7 +131,6 @@ - diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index d82b1127..a573e579 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -759,12 +759,18 @@ } if (eSrc && !onlyAdd) { - [eSrc.layer.superlayer addSublayer:src.layer]; + if (!src.layer.superlayer) + { + [eSrc.layer.superlayer addSublayer:src.layer]; + } eSrc.layer.hidden = YES; [undoSources addObject:eSrc]; eSrc.refCount = 0; } else { - [self.rootLayer addSublayer:src.layer]; + if (!src.layer.superlayer) + { + [self.rootLayer addSublayer:src.layer]; + } } [NSApp registerMIDIResponder:src]; [self incrementInputRef:src]; @@ -843,8 +849,10 @@ } src.layer.hidden = YES; - [eSrc.layer.superlayer addSublayer:src.layer]; - + if (!src.layer.superlayer) + { + [eSrc.layer.superlayer addSublayer:src.layer]; + } [CATransaction flush]; [CATransaction begin]; @@ -878,9 +886,11 @@ } src.layer.hidden = YES; - - [self.rootLayer addSublayer:src.layer]; - + if (!src.layer.superlayer) + { + [self.rootLayer addSublayer:src.layer]; + } + [CATransaction flush]; [CATransaction begin]; if (rTrans) From 80f35176bad01c477571e75d5e3e7ae2ea5f7b83 Mon Sep 17 00:00:00 2001 From: Zakk Date: Thu, 5 May 2016 07:43:22 -0400 Subject: [PATCH 076/156] Move sample animations to Resources directory, fixes a code signing issue. Bump version to 2.0.6 --- .../xcschemes/CSAVFCapturePlugin.xcscheme | 2 +- .../xcschemes/CSDesktopCapturePlugin.xcscheme | 2 +- .../xcschemes/CSImageCapturePlugin.xcscheme | 2 +- .../xcschemes/CSMovieCapturePlugin.xcscheme | 2 +- .../zakk.xcuserdatad/xcschemes/CSQTCapturePlugin.xcscheme | 2 +- .../xcschemes/CSSyphonCapturePlugin.xcscheme | 2 +- .../xcschemes/CSTextCapturePlugin.xcscheme | 2 +- .../xcschemes/CSWindowCapturePlugin.xcscheme | 2 +- CocoaSplit.xcodeproj/project.pbxproj | 8 ++++---- CocoaSplit/CSAnimationRunner/CSAnimationRunner.py | 2 +- CocoaSplit/CocoaSplit-Info.plist | 4 ++-- .../zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme | 2 +- .../zakk.xcuserdatad/xcschemes/TextureWrapPlugin.xcscheme | 2 +- .../xcschemes/CSFileStreamServicePlugin.xcscheme | 2 +- .../xcschemes/CSTwitchStreamServicePlugin.xcscheme | 2 +- 15 files changed, 19 insertions(+), 19 deletions(-) diff --git a/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme b/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme index 4dba6543..e770f7d2 100644 --- a/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme +++ b/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSAVFCapturePlugin.xcscheme @@ -1,6 +1,6 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.5 + 2.0.6 CFBundleSignature ???? CFBundleVersion - 2.0.5 + 2.0.6 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion diff --git a/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme b/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme index 7687f7fc..d2bd08f2 100644 --- a/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme +++ b/ImageUnitPlugins/CSChromaKey/CSChromaKey.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSChromaKey.xcscheme @@ -1,6 +1,6 @@ Date: Sun, 8 May 2016 06:20:20 -0400 Subject: [PATCH 077/156] Use UUID reference for add input undo, preventing infinite InputSource retain. Start of better UI for inputs Some UI changes to fall in line with apple HIG --- .../project.pbxproj | 2 +- .../CSShapePathPlugin/CSShapePathLoader.py | 2 +- .../project.pbxproj | 2 +- CocoaSplit.xcodeproj/project.pbxproj | 62 +++--- CocoaSplit/CAMultiAudioMatrixView.xib | 6 +- .../CSAnimationChooserViewController.xib | 12 +- ...nstantRecorderCompressorViewController.xib | 12 +- CocoaSplit/CreateLayoutViewController.xib | 6 +- CocoaSplit/InputSource.h | 2 + CocoaSplit/InputSource.m | 39 +++- ...AMultiAudioMatrixMixerWindowController.xib | 14 +- .../CSAppleH264CompressorViewController.xib | 38 ++-- .../CSAppleProResCompressorViewController.xib | 8 +- .../CSFilterChooserWindowController.xib | 17 +- .../Interface/CSInputLibraryItemView.xib | 7 +- .../CSInputLibraryWindowController.xib | 4 +- .../Interface/CSLayoutCollectionItem.xib | 6 +- .../CSLayoutEditWindowController.xib | 56 +----- .../CSMidiManagerWindowController.xib | 13 +- .../Interface/CSNewOutputWindowController.xib | 42 ++-- .../Interface/CSTextCaptureBaseView.xib | 4 +- .../CSx264CompressorViewController.xib | 22 +- .../Interface/CompressionSettingsPanel.xib | 42 ++-- .../Interface/EditBuiltinLayoutView.xib | 22 +- .../InputPopupControllerViewController.xib | 188 +----------------- CocoaSplit/Interface/LogWindow.xib | 15 +- .../PluginManagerWindowController.xib | 13 +- CocoaSplit/Interface/advancedPrefPanel.xib | 65 +++--- CocoaSplit/PreviewView.m | 11 +- CocoaSplit/TestView.xib | 6 +- CocoaSplit/en.lproj/MainMenu.xib | 105 ++++++++-- 31 files changed, 330 insertions(+), 513 deletions(-) diff --git a/CapturePlugins/CSShapeCapturePlugin/CSShapeCapturePlugin.xcodeproj/project.pbxproj b/CapturePlugins/CSShapeCapturePlugin/CSShapeCapturePlugin.xcodeproj/project.pbxproj index 14d34de8..acf33ec5 100644 --- a/CapturePlugins/CSShapeCapturePlugin/CSShapeCapturePlugin.xcodeproj/project.pbxproj +++ b/CapturePlugins/CSShapeCapturePlugin/CSShapeCapturePlugin.xcodeproj/project.pbxproj @@ -37,7 +37,7 @@ isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = Paths; - dstSubfolderSpec = 13; + dstSubfolderSpec = 7; files = ( 34F2FF2B1B8AAAC1000B5964 /* arc.py in CopyFiles */, 34E301141B6515C9000C16DB /* circle.py in CopyFiles */, diff --git a/CapturePlugins/CSShapeCapturePlugin/CSShapeCapturePlugin/CSShapePathPlugin/CSShapePathLoader.py b/CapturePlugins/CSShapeCapturePlugin/CSShapeCapturePlugin/CSShapePathPlugin/CSShapePathLoader.py index 92e95f56..2528cf8b 100644 --- a/CapturePlugins/CSShapeCapturePlugin/CSShapeCapturePlugin/CSShapePathPlugin/CSShapePathLoader.py +++ b/CapturePlugins/CSShapeCapturePlugin/CSShapeCapturePlugin/CSShapePathPlugin/CSShapePathLoader.py @@ -16,7 +16,7 @@ plugin_base = PluginBase(package='shapeplugins') library_dirs = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSAllDomainsMask - NSSystemDomainMask, YES) plugin_dirs = map(lambda x: x + "/Application Support/CocoaSplit/Plugins/Paths", library_dirs) -plugin_dirs.append(NSBundle.bundleForClass_(objc.lookUpClass("CSShapeCapture").class__()).builtInPlugInsPath() + "/Paths") +plugin_dirs.append(NSBundle.bundleForClass_(objc.lookUpClass("CSShapeCapture").class__()).resourcePath() + "/Paths") plugin_source = plugin_base.make_plugin_source(searchpath=plugin_dirs) diff --git a/CapturePlugins/CSSyphonCapturePlugin/CSSyphonCapturePlugin.xcodeproj/project.pbxproj b/CapturePlugins/CSSyphonCapturePlugin/CSSyphonCapturePlugin.xcodeproj/project.pbxproj index bc2ea323..a187dbb4 100644 --- a/CapturePlugins/CSSyphonCapturePlugin/CSSyphonCapturePlugin.xcodeproj/project.pbxproj +++ b/CapturePlugins/CSSyphonCapturePlugin/CSSyphonCapturePlugin.xcodeproj/project.pbxproj @@ -15,7 +15,7 @@ 34AFC1F419B04F0B0007C07B /* SyphonCaptureViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34AFC1F019B04F0B0007C07B /* SyphonCaptureViewController.xib */; }; 34AFC1F519B04F0B0007C07B /* SyphonCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC1F219B04F0B0007C07B /* SyphonCapture.m */; }; 34C67B4E1A2A4ECB0012DC1B /* Syphon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34C67B4A1A2A4D870012DC1B /* Syphon.framework */; }; - 34C67B4F1A2A56A20012DC1B /* Syphon.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 34C67B4A1A2A4D870012DC1B /* Syphon.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 34C67B4F1A2A56A20012DC1B /* Syphon.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 34C67B4A1A2A4D870012DC1B /* Syphon.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 34C7B8C91A344DB20033AC71 /* CSSyphonInjectCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C7B8C81A344DB20033AC71 /* CSSyphonInjectCapture.m */; }; 34C7B8CC1A34621C0033AC71 /* CSSyphonCaptureFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C7B8CB1A34621C0033AC71 /* CSSyphonCaptureFactory.m */; }; 34C7B8DB1A3465010033AC71 /* CSSyphonInjectCaptureViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C7B8D91A3465010033AC71 /* CSSyphonInjectCaptureViewController.m */; }; diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 9d17c047..3c368d6c 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -41,9 +41,9 @@ 342346BE15F6103D00C8C77E /* FFMpegTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 342346BD15F6103D00C8C77E /* FFMpegTask.m */; }; 342346CF15F9F07E00C8C77E /* CSAbstractCaptureDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 342346CE15F9F07E00C8C77E /* CSAbstractCaptureDevice.m */; }; 342B33B3198073EC00492CB7 /* line.fgsh in Resources */ = {isa = PBXBuildFile; fileRef = 342B33B2198073EC00492CB7 /* line.fgsh */; }; - 342B33B4198075F200492CB7 /* line.fgsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 342B33B2198073EC00492CB7 /* line.fgsh */; }; + 342B33B4198075F200492CB7 /* line.fgsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 342B33B2198073EC00492CB7 /* line.fgsh */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 342B33B61980771200492CB7 /* line.vtsh in Resources */ = {isa = PBXBuildFile; fileRef = 342B33B51980771200492CB7 /* line.vtsh */; }; - 342B33B71980774000492CB7 /* line.vtsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 342B33B51980771200492CB7 /* line.vtsh */; }; + 342B33B71980774000492CB7 /* line.vtsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 342B33B51980771200492CB7 /* line.vtsh */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 3431FFE119786502000965FE /* InputSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 3431FFE019786502000965FE /* InputSource.m */; }; 3431FFE219786502000965FE /* InputSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 3431FFE019786502000965FE /* InputSource.m */; }; 34348C2A19BDBDC000A122C2 /* PluginManagerWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34348C2819BDBDC000A122C2 /* PluginManagerWindowController.m */; }; @@ -59,14 +59,14 @@ 3434CB3C1CB09BC4001B3DF9 /* CSTimedOutputBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3434CB3B1CB09BC4001B3DF9 /* CSTimedOutputBuffer.m */; }; 3435E396188B902C0015CC01 /* 420v.fgsh in Resources */ = {isa = PBXBuildFile; fileRef = 3435E395188B902C0015CC01 /* 420v.fgsh */; }; 3435E39B188B93150015CC01 /* passthrough.vtsh in Resources */ = {isa = PBXBuildFile; fileRef = 3435E39A188B93150015CC01 /* passthrough.vtsh */; }; - 3435E39D188BD8250015CC01 /* passthrough.fgsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3435E399188B90900015CC01 /* passthrough.fgsh */; }; - 3435E39E188BD82F0015CC01 /* passthrough.vtsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3435E39A188B93150015CC01 /* passthrough.vtsh */; }; - 3435E39F188CD8EE0015CC01 /* 420v.fgsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3435E395188B902C0015CC01 /* 420v.fgsh */; }; - 343644061B78F01D0069B8F2 /* CSAnimationRunner.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 349461591AB4213B00F28883 /* CSAnimationRunner.py */; }; - 343644071B78F01D0069B8F2 /* CSAnimationBlock.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3494616A1ABD1B5900F28883 /* CSAnimationBlock.py */; }; - 343644081B78F01D0069B8F2 /* CSAnimation.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3494616C1ABD399B00F28883 /* CSAnimation.py */; }; - 343644091B78F01D0069B8F2 /* pluginbase.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 34E983841B78B19D00F26F1E /* pluginbase.py */; }; - 343692501B6243D4007EC2D9 /* CSShapeCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 3436922B1B62364E007EC2D9 /* CSShapeCapturePlugin.bundle */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 3435E39D188BD8250015CC01 /* passthrough.fgsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3435E399188B90900015CC01 /* passthrough.fgsh */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 3435E39E188BD82F0015CC01 /* passthrough.vtsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3435E39A188B93150015CC01 /* passthrough.vtsh */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 3435E39F188CD8EE0015CC01 /* 420v.fgsh in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3435E395188B902C0015CC01 /* 420v.fgsh */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 343644061B78F01D0069B8F2 /* CSAnimationRunner.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 349461591AB4213B00F28883 /* CSAnimationRunner.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 343644071B78F01D0069B8F2 /* CSAnimationBlock.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3494616A1ABD1B5900F28883 /* CSAnimationBlock.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 343644081B78F01D0069B8F2 /* CSAnimation.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3494616C1ABD399B00F28883 /* CSAnimation.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 343644091B78F01D0069B8F2 /* pluginbase.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 34E983841B78B19D00F26F1E /* pluginbase.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 343692501B6243D4007EC2D9 /* CSShapeCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 3436922B1B62364E007EC2D9 /* CSShapeCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 343ED9421BCAC1C80061FC4B /* EditBuiltinLayoutView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 343ED9411BCAC1C80061FC4B /* EditBuiltinLayoutView.xib */; }; 3444D8E819A0CDE8000DC46B /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3444D8E719A0CDE8000DC46B /* Quartz.framework */; }; 344825D21B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344825D11B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib */; }; @@ -128,8 +128,8 @@ 345F8B761A17A785009A81E3 /* CAMultiAudioMixer.m in Sources */ = {isa = PBXBuildFile; fileRef = 345F8B741A17A785009A81E3 /* CAMultiAudioMixer.m */; }; 345F8B791A183D1D009A81E3 /* CAMultiAudioEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 345F8B781A183D1D009A81E3 /* CAMultiAudioEngine.m */; }; 345F8B7A1A183D1D009A81E3 /* CAMultiAudioEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 345F8B781A183D1D009A81E3 /* CAMultiAudioEngine.m */; }; - 3460E58A1AC766260080358E /* rotate.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3460E5871AC764500080358E /* rotate.py */; }; - 3463F99F1AD1594300F3B5C8 /* movement.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3463F99D1AD0DC7100F3B5C8 /* movement.py */; }; + 3460E58A1AC766260080358E /* rotate.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3460E5871AC764500080358E /* rotate.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 3463F99F1AD1594300F3B5C8 /* movement.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3463F99D1AD0DC7100F3B5C8 /* movement.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 346865471CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 346865451CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.m */; }; 346865481CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 346865461CC353E2002BAB86 /* CSInstantRecorderCompressorViewController.xib */; }; 346CF44C1A5C10C2008E5BFF /* CSInputLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */; }; @@ -165,7 +165,7 @@ 34A64A2F165EFE4C00A68428 /* PreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34A64A2E165EFE4B00A68428 /* PreviewView.m */; }; 34A64A37165F208800A68428 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34A64A36165F208800A68428 /* QuartzCore.framework */; }; 34A7ADB81C01EF1400685044 /* CompressionSettingsPanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34A7ADB71C01EF1400685044 /* CompressionSettingsPanelController.m */; }; - 34A7C1AD19B9A57600BC6882 /* CSLayoutSwitcherExtraPlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34A7C1A119B9A41A00BC6882 /* CSLayoutSwitcherExtraPlugin.bundle */; }; + 34A7C1AD19B9A57600BC6882 /* CSLayoutSwitcherExtraPlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34A7C1A119B9A41A00BC6882 /* CSLayoutSwitcherExtraPlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 34AB1C311B944F48003F2C03 /* CSPreviewOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AB1C301B944F48003F2C03 /* CSPreviewOverlayView.m */; }; 34ABEF3C17C0C2CB00AA5E62 /* advancedPrefPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34ABEF3B17C0C2CB00AA5E62 /* advancedPrefPanel.xib */; }; 34AE3C30164E3E020052C95E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34AE3C2F164E3E020052C95E /* Foundation.framework */; }; @@ -175,15 +175,15 @@ 34AE3C4B164E68820052C95E /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340FE4E015F3581200E4CE4E /* QTKit.framework */; }; 34AE3C6B164F04B30052C95E /* IOSurface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34AE3C6A164F04B30052C95E /* IOSurface.framework */; }; 34AE3C6D164F04C90052C95E /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34AE3C6C164F04C90052C95E /* CoreVideo.framework */; }; - 34AFC27819B05C4E0007C07B /* CSChromaKey.plugin in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC27219B05BE90007C07B /* CSChromaKey.plugin */; }; - 34AFC27919B05C4E0007C07B /* TextureWrapPlugin.plugin in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC27719B05BF50007C07B /* TextureWrapPlugin.plugin */; }; - 34AFC27A19B05C4E0007C07B /* CSDesktopCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC24A19B05ADA0007C07B /* CSDesktopCapturePlugin.bundle */; }; - 34AFC27B19B05C4E0007C07B /* CSMovieCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC25419B05B380007C07B /* CSMovieCapturePlugin.bundle */; }; - 34AFC27C19B05C4E0007C07B /* CSWindowCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC25919B05B470007C07B /* CSWindowCapturePlugin.bundle */; }; - 34AFC27D19B05C4E0007C07B /* CSImageCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC24F19B05B0A0007C07B /* CSImageCapturePlugin.bundle */; }; - 34AFC27E19B05C4E0007C07B /* CSTextCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC26319B05B6B0007C07B /* CSTextCapturePlugin.bundle */; }; - 34AFC27F19B05C4E0007C07B /* CSSyphonCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC26819B05B7C0007C07B /* CSSyphonCapturePlugin.bundle */; }; - 34AFC28019B05C4E0007C07B /* CSAVFCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC26D19B05B930007C07B /* CSAVFCapturePlugin.bundle */; }; + 34AFC27819B05C4E0007C07B /* CSChromaKey.plugin in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC27219B05BE90007C07B /* CSChromaKey.plugin */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 34AFC27919B05C4E0007C07B /* TextureWrapPlugin.plugin in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC27719B05BF50007C07B /* TextureWrapPlugin.plugin */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 34AFC27A19B05C4E0007C07B /* CSDesktopCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC24A19B05ADA0007C07B /* CSDesktopCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 34AFC27B19B05C4E0007C07B /* CSMovieCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC25419B05B380007C07B /* CSMovieCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 34AFC27C19B05C4E0007C07B /* CSWindowCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC25919B05B470007C07B /* CSWindowCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 34AFC27D19B05C4E0007C07B /* CSImageCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC24F19B05B0A0007C07B /* CSImageCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 34AFC27E19B05C4E0007C07B /* CSTextCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC26319B05B6B0007C07B /* CSTextCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 34AFC27F19B05C4E0007C07B /* CSSyphonCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC26819B05B7C0007C07B /* CSSyphonCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 34AFC28019B05C4E0007C07B /* CSAVFCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC26D19B05B930007C07B /* CSAVFCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 34AFC33319B19CD00007C07B /* SourceCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC33219B19CD00007C07B /* SourceCache.m */; }; 34AFC33419B19CD00007C07B /* SourceCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC33219B19CD00007C07B /* SourceCache.m */; }; 34B0265A1712D8BA0063BB2D /* CmdLineDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B026591712D8BA0063BB2D /* CmdLineDelegate.m */; }; @@ -199,7 +199,7 @@ 34C19053189EE60400AB2430 /* CapturedFrameData.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C19052189EE60400AB2430 /* CapturedFrameData.m */; }; 34C19054189EE60400AB2430 /* CapturedFrameData.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C19052189EE60400AB2430 /* CapturedFrameData.m */; }; 34C67B8E1A2E69F60012DC1B /* CSHitboxStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34C67B781A2D7B6A0012DC1B /* CSHitboxStreamServicePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 34C680A119DD06E800413468 /* CSSyphonInjectExtraPlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34C6808C19DD01C400413468 /* CSSyphonInjectExtraPlugin.bundle */; }; + 34C680A119DD06E800413468 /* CSSyphonInjectExtraPlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34C6808C19DD01C400413468 /* CSSyphonInjectExtraPlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 34C6C3BF15FB5B440018A18B /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34C6C3BE15FB5B440018A18B /* OpenGL.framework */; }; 34CFE4A018F154DD00092C6A /* AVFChannelManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CFE49F18F154DD00092C6A /* AVFChannelManager.m */; }; 34CFE4A118F154DD00092C6A /* AVFChannelManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CFE49F18F154DD00092C6A /* AVFChannelManager.m */; }; @@ -209,9 +209,9 @@ 34D2D5741A547628001004E5 /* CSTextCaptureBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D2D5721A547628001004E5 /* CSTextCaptureBase.m */; }; 34D2D5771A547C35001004E5 /* CSTextCaptureViewControllerBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D2D5761A547C35001004E5 /* CSTextCaptureViewControllerBase.m */; }; 34D2D5781A547C35001004E5 /* CSTextCaptureViewControllerBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D2D5761A547C35001004E5 /* CSTextCaptureViewControllerBase.m */; }; - 34D2D5B41A548B68001004E5 /* CSNowPlayingPlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34D2D59E1A54857D001004E5 /* CSNowPlayingPlugin.bundle */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 34D6580219B342E00012E32B /* CSTwitchStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC32B19B0AD360007C07B /* CSTwitchStreamServicePlugin.bundle */; }; - 34D6580319B342E70012E32B /* CSFileStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC33019B0AD500007C07B /* CSFileStreamServicePlugin.bundle */; }; + 34D2D5B41A548B68001004E5 /* CSNowPlayingPlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34D2D59E1A54857D001004E5 /* CSNowPlayingPlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 34D6580219B342E00012E32B /* CSTwitchStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC32B19B0AD360007C07B /* CSTwitchStreamServicePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 34D6580319B342E70012E32B /* CSFileStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC33019B0AD500007C07B /* CSFileStreamServicePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 34D6581819B387DE0012E32B /* AppDelegate+AppDelegate_ScriptingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D6581719B387DE0012E32B /* AppDelegate+AppDelegate_ScriptingAdditions.m */; }; 34D696FC1871B8F700B50EB6 /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 34D696FB1871B8F700B50EB6 /* Defaults.plist */; }; 34DA1D3E1BF823E700132486 /* CSNewOutputWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DA1D3C1BF823E700132486 /* CSNewOutputWindowController.m */; }; @@ -342,7 +342,7 @@ 34F52A271BC1CE2700662911 /* CSLayoutCollectionItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F52A251BC1CE2700662911 /* CSLayoutCollectionItem.m */; }; 34F52A281BC1CE2700662911 /* CSLayoutCollectionItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F52A261BC1CE2700662911 /* CSLayoutCollectionItem.xib */; }; 34F52A2B1BC1E0F900662911 /* CSLayoutButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F52A2A1BC1E0F800662911 /* CSLayoutButton.m */; }; - 34F7C5871B2C9A5300345230 /* CSDeckLinkCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34F7C5611B2C908700345230 /* CSDeckLinkCapturePlugin.bundle */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 34F7C5871B2C9A5300345230 /* CSDeckLinkCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34F7C5611B2C908700345230 /* CSDeckLinkCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 34FDA83E1A84C46500E7F65E /* CSTimeCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34FDA8191A84BF9400E7F65E /* CSTimeCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 34FDD6F21A215268009A7413 /* CSPluginServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 34FDD6F11A215268009A7413 /* CSPluginServices.m */; }; 34FDD6F31A215268009A7413 /* CSPluginServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 34FDD6F11A215268009A7413 /* CSPluginServices.m */; }; @@ -2183,7 +2183,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "LOCATION=\"${BUILT_PRODUCTS_DIR}\"/\"${CONTENTS_FOLDER_PATH}\"\nIDENTITY=\"Developer ID Application: Zachary Girouard (L3JLUY4S5E)\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/Frameworks/Sparkle.framework\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/MacOS/CocoaSplitCmd\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSAVFCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSLayoutSwitcherExtraPlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSFileStreamServicePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTwitchStreamServicePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSChromaKey.plugin\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/TextureWrapPlugin.plugin\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDesktopCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSMovieCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSWindowCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSImageCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTextCapturePlugin.bundle\"\ncodesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle/Contents/Frameworks/Syphon.framework\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/XPCServices/zakk.lol.QTCaptureHelper.xpc\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonInjectExtraPlugin.bundle\"\n#codesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/CSAnimationRunner.plugin\"\n#codesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDeckLinkCapturePlugin.bundle\"\n#codesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSNowPlayingPlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSShapeCapturePlugin.bundle\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/Animations/movement.py\"\ncodesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/Animations/rotate.py\"\n"; + shellScript = "#LOCATION=\"${BUILT_PRODUCTS_DIR}\"/\"${CONTENTS_FOLDER_PATH}\"\n#IDENTITY=\"Developer ID Application: Zachary Girouard (L3JLUY4S5E)\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/Frameworks/Sparkle.framework\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/MacOS/CocoaSplitCmd\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSAVFCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSLayoutSwitcherExtraPlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSFileStreamServicePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTwitchStreamServicePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSChromaKey.plugin\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/TextureWrapPlugin.plugin\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDesktopCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSMovieCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSWindowCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSImageCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSTextCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle/Contents/Frameworks/Syphon.framework\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonCapturePlugin.bundle\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/XPCServices/zakk.lol.QTCaptureHelper.xpc\"\n#codesign --verbose --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSSyphonInjectExtraPlugin.bundle\"\n#codesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/CSAnimationRunner.plugin\"\n#codesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSDeckLinkCapturePlugin.bundle\"\n#codesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSNowPlayingPlugin.bundle\"\n#codesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/PlugIns/CSShapeCapturePlugin.bundle\"\n#codesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/Animations/movement.py\"\n#codesign --verbose --deep --force --sign \"$IDENTITY\" \"$LOCATION/Resources/Animations/rotate.py\"\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -2547,7 +2547,8 @@ ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = ""; + CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -2586,7 +2587,8 @@ ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = ""; + CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/CocoaSplit/CAMultiAudioMatrixView.xib b/CocoaSplit/CAMultiAudioMatrixView.xib index 91e83f2f..ff43a4a5 100644 --- a/CocoaSplit/CAMultiAudioMatrixView.xib +++ b/CocoaSplit/CAMultiAudioMatrixView.xib @@ -1,8 +1,8 @@ - + - + @@ -14,7 +14,6 @@ - @@ -25,7 +24,6 @@ - diff --git a/CocoaSplit/CSAnimationChooserViewController.xib b/CocoaSplit/CSAnimationChooserViewController.xib index 115447b9..ac0ec168 100644 --- a/CocoaSplit/CSAnimationChooserViewController.xib +++ b/CocoaSplit/CSAnimationChooserViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -18,7 +18,6 @@ - - + + diff --git a/CocoaSplit/CreateLayoutViewController.xib b/CocoaSplit/CreateLayoutViewController.xib index c78ea6c9..3504526f 100644 --- a/CocoaSplit/CreateLayoutViewController.xib +++ b/CocoaSplit/CreateLayoutViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -101,7 +101,7 @@ - + diff --git a/CocoaSplit/Interface/CSAppleProResCompressorViewController.xib b/CocoaSplit/Interface/CSAppleProResCompressorViewController.xib index c3c56bd9..5fffbebf 100644 --- a/CocoaSplit/Interface/CSAppleProResCompressorViewController.xib +++ b/CocoaSplit/Interface/CSAppleProResCompressorViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -31,14 +31,14 @@ - + - + diff --git a/CocoaSplit/Interface/CSFilterChooserWindowController.xib b/CocoaSplit/Interface/CSFilterChooserWindowController.xib index f67fcdb2..652b673d 100644 --- a/CocoaSplit/Interface/CSFilterChooserWindowController.xib +++ b/CocoaSplit/Interface/CSFilterChooserWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -31,7 +31,6 @@ - @@ -56,24 +55,19 @@ - - - - diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.xib b/CocoaSplit/Interface/CSLayoutEditWindowController.xib index f53dfb7d..93acddd0 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.xib +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -25,11 +25,9 @@ - - @@ -70,7 +66,6 @@ Gw - @@ -87,7 +82,6 @@ Gw - @@ -99,7 +93,6 @@ Gw - @@ -111,7 +104,6 @@ Gw - @@ -126,7 +118,6 @@ Gw - @@ -135,7 +126,6 @@ Gw - @@ -147,7 +137,6 @@ Gw - @@ -159,7 +148,6 @@ Gw - @@ -171,7 +159,6 @@ Gw - @@ -202,7 +189,6 @@ Gw - @@ -212,7 +198,6 @@ Gw - @@ -225,7 +210,6 @@ Gw - @@ -239,22 +223,20 @@ Gw - - + - + - @@ -278,7 +260,6 @@ Gw - @@ -294,7 +275,6 @@ Gw - @@ -311,24 +291,19 @@ Gw - - - - + @@ -98,7 +85,7 @@ Gw - + @@ -106,7 +93,7 @@ Gw - + @@ -154,7 +141,7 @@ Gw - + @@ -171,6 +158,19 @@ Gw + diff --git a/CocoaSplit/Interface/CSTextCaptureBaseView.xib b/CocoaSplit/Interface/CSTextCaptureBaseView.xib index d2fbbbce..a7f29a60 100644 --- a/CocoaSplit/Interface/CSTextCaptureBaseView.xib +++ b/CocoaSplit/Interface/CSTextCaptureBaseView.xib @@ -1,8 +1,8 @@ - + - + diff --git a/CocoaSplit/Interface/CSx264CompressorViewController.xib b/CocoaSplit/Interface/CSx264CompressorViewController.xib index 14336001..b2350c7b 100644 --- a/CocoaSplit/Interface/CSx264CompressorViewController.xib +++ b/CocoaSplit/Interface/CSx264CompressorViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -18,7 +18,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -34,7 +34,7 @@ - + @@ -42,7 +42,7 @@ - + @@ -50,7 +50,7 @@ - + @@ -58,7 +58,7 @@ - + @@ -66,7 +66,7 @@ - + @@ -203,8 +203,8 @@ - + @@ -155,7 +155,7 @@ Gw - - - - - - - - - - - @@ -195,13 +184,24 @@ Gw - - + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/EditBuiltinLayoutView.xib b/CocoaSplit/Interface/EditBuiltinLayoutView.xib index 5e92bc79..91bfb814 100644 --- a/CocoaSplit/Interface/EditBuiltinLayoutView.xib +++ b/CocoaSplit/Interface/EditBuiltinLayoutView.xib @@ -1,8 +1,8 @@ - + - + @@ -65,8 +65,16 @@ + + + + + + + + - - - - - - - - diff --git a/CocoaSplit/Interface/InputPopupControllerViewController.xib b/CocoaSplit/Interface/InputPopupControllerViewController.xib index 59beed2b..9a7a0adc 100644 --- a/CocoaSplit/Interface/InputPopupControllerViewController.xib +++ b/CocoaSplit/Interface/InputPopupControllerViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -21,7 +21,6 @@ - @@ -30,7 +29,6 @@ - @@ -39,7 +37,6 @@ - @@ -48,7 +45,6 @@ - @@ -64,7 +60,6 @@ - @@ -77,7 +72,6 @@ - @@ -85,7 +79,6 @@ - @@ -109,7 +101,6 @@ - @@ -122,7 +113,6 @@ - @@ -130,7 +120,6 @@ - @@ -139,7 +128,6 @@ - @@ -152,7 +140,6 @@ - @@ -160,7 +147,6 @@ - @@ -169,7 +155,6 @@ - @@ -182,7 +167,6 @@ - @@ -190,7 +174,6 @@ - @@ -199,7 +182,6 @@ - @@ -207,7 +189,6 @@ - @@ -216,7 +197,6 @@ - @@ -228,7 +208,6 @@ - @@ -237,7 +216,6 @@ - @@ -249,7 +227,6 @@ - @@ -258,7 +235,6 @@ - @@ -266,7 +242,6 @@ - @@ -290,7 +264,6 @@ - @@ -302,7 +275,6 @@ - @@ -314,7 +286,6 @@ - @@ -326,7 +297,6 @@ - @@ -338,7 +308,6 @@ - @@ -346,7 +315,6 @@ - @@ -354,7 +322,6 @@ - @@ -362,7 +329,6 @@ - @@ -370,7 +336,6 @@ - @@ -379,7 +344,6 @@ - @@ -388,7 +352,6 @@ - @@ -397,7 +360,6 @@ - @@ -406,7 +368,6 @@ - @@ -415,7 +376,6 @@ - @@ -449,7 +408,6 @@ - @@ -478,7 +436,6 @@ - @@ -498,7 +455,6 @@ - @@ -517,7 +473,6 @@ - @@ -526,19 +481,15 @@ - - - - @@ -548,7 +499,6 @@ - @@ -567,7 +516,6 @@ - @@ -576,7 +524,6 @@ - @@ -585,7 +532,6 @@ - @@ -594,7 +540,6 @@ - @@ -602,7 +547,6 @@ - @@ -610,7 +554,6 @@ - @@ -619,7 +562,6 @@ - @@ -628,7 +570,6 @@ - @@ -640,7 +581,6 @@ - @@ -652,7 +592,6 @@ - @@ -660,7 +599,6 @@ - @@ -668,7 +606,6 @@ - @@ -688,7 +624,6 @@ - @@ -697,7 +632,6 @@ - @@ -705,7 +639,6 @@ - @@ -713,7 +646,6 @@ - @@ -722,7 +654,6 @@ - @@ -731,7 +662,6 @@ - @@ -740,7 +670,6 @@ - @@ -749,7 +678,6 @@ - @@ -761,7 +689,6 @@ - @@ -773,7 +700,6 @@ - @@ -785,7 +711,6 @@ - @@ -807,7 +731,6 @@ - @@ -817,7 +740,6 @@ - @@ -826,7 +748,6 @@ - @@ -838,7 +759,6 @@ - @@ -847,7 +767,6 @@ - @@ -865,7 +784,6 @@ - @@ -874,7 +792,6 @@ - @@ -890,7 +807,6 @@ - @@ -914,7 +830,6 @@ - @@ -926,7 +841,6 @@ - @@ -946,7 +859,6 @@ - @@ -983,7 +894,6 @@ - @@ -1831,7 +1677,6 @@ - @@ -1858,24 +1703,19 @@ - - - @@ -1914,7 +1752,6 @@ - @@ -1942,24 +1779,19 @@ - - - @@ -1987,7 +1818,6 @@ - @@ -2014,24 +1844,19 @@ - - - @@ -2052,7 +1876,6 @@ - @@ -2119,7 +1937,6 @@ - @@ -2141,7 +1958,6 @@ - diff --git a/CocoaSplit/Interface/LogWindow.xib b/CocoaSplit/Interface/LogWindow.xib index 7f9b073a..99b03d0a 100644 --- a/CocoaSplit/Interface/LogWindow.xib +++ b/CocoaSplit/Interface/LogWindow.xib @@ -1,8 +1,8 @@ - + - - + + @@ -12,19 +12,18 @@ - + - + - @@ -34,10 +33,10 @@ - + - + diff --git a/CocoaSplit/Interface/PluginManagerWindowController.xib b/CocoaSplit/Interface/PluginManagerWindowController.xib index b481bee9..ad63c240 100644 --- a/CocoaSplit/Interface/PluginManagerWindowController.xib +++ b/CocoaSplit/Interface/PluginManagerWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -30,12 +30,11 @@ - - + @@ -57,28 +56,22 @@ - - - - diff --git a/CocoaSplit/Interface/advancedPrefPanel.xib b/CocoaSplit/Interface/advancedPrefPanel.xib index 1f544196..e9764b69 100644 --- a/CocoaSplit/Interface/advancedPrefPanel.xib +++ b/CocoaSplit/Interface/advancedPrefPanel.xib @@ -1,8 +1,8 @@ - + - + @@ -12,7 +12,7 @@ - + @@ -21,19 +21,6 @@ - @@ -54,7 +41,7 @@ DQ - + @@ -62,7 +49,7 @@ DQ - + @@ -77,7 +64,7 @@ DQ - + @@ -124,8 +111,8 @@ DQ - - + + @@ -143,8 +130,8 @@ DQ - - + + @@ -172,8 +159,8 @@ DQ - - + + @@ -201,8 +188,8 @@ DQ - - + + @@ -239,10 +226,22 @@ DQ + - diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 224546d7..794dbd24 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -1197,6 +1197,15 @@ } +-(void)undoAddInput:(NSString *)uuid +{ + InputSource *toDelete = [self.sourceLayout inputForUUID:uuid]; + if (toDelete) + { + [self deleteInput:toDelete]; + } +} + - (IBAction)addInputSource:(id)sender { @@ -1206,7 +1215,7 @@ InputSource *newSource = [[InputSource alloc] init]; [self.sourceLayout addSource:newSource]; - [[self.undoManager prepareWithInvocationTarget:self] deleteInput:newSource]; + [[self.undoManager prepareWithInvocationTarget:self] undoAddInput:newSource.uuid]; [self spawnInputSettings:newSource atRect:NSZeroRect]; } } diff --git a/CocoaSplit/TestView.xib b/CocoaSplit/TestView.xib index 5651be1d..b2786a5c 100644 --- a/CocoaSplit/TestView.xib +++ b/CocoaSplit/TestView.xib @@ -1,8 +1,8 @@ - + - + @@ -18,7 +18,6 @@ - @@ -29,7 +28,6 @@ - diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 62a6f63a..7bcb818d 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -390,7 +390,7 @@ - + @@ -436,7 +436,7 @@ - + @@ -468,7 +468,7 @@ - + @@ -510,7 +510,7 @@ - + @@ -534,7 +534,7 @@ - - - - - - + + + + - - + + @@ -653,7 +653,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -678,9 +740,7 @@ - - @@ -1661,6 +1721,11 @@ + + + + + From f25d4c6359257e722ab65c57ed136a1788c06837 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 15 May 2016 10:25:54 -0400 Subject: [PATCH 078/156] Added an input display area in the main video tab --- CocoaSplit.xcodeproj/project.pbxproj | 32 +++ CocoaSplit/CSCaptureBase.m | 5 + CocoaSplit/CSPluginServices.m | 5 + CocoaSplit/CaptureController.h | 9 + CocoaSplit/CaptureController.m | 53 ++++- CocoaSplit/InputSource.m | 6 +- .../Interface/CSAddInputTypeViewController.h | 17 ++ .../Interface/CSAddInputTypeViewController.m | 23 ++ .../CSAddInputTypeViewController.xib | 30 +++ .../Interface/CSAddInputViewController.h | 38 ++++ .../Interface/CSAddInputViewController.m | 196 ++++++++++++++++++ .../Interface/CSAddInputViewController.xib | 196 ++++++++++++++++++ CocoaSplit/Interface/CSScrollView.h | 13 ++ CocoaSplit/Interface/CSScrollView.m | 23 ++ CocoaSplit/NSView+NSLayoutConstraintFilter.h | 37 ++++ CocoaSplit/NSView+NSLayoutConstraintFilter.m | 53 +++++ CocoaSplit/PluginHeaders/CSCaptureBase.h | 2 + .../PluginHeaders/CSCaptureSourceProtocol.h | 2 + CocoaSplit/PluginHeaders/CSPluginServices.h | 2 + CocoaSplit/PreviewView.h | 1 + CocoaSplit/PreviewView.m | 11 + CocoaSplit/SourceLayout.m | 1 + CocoaSplit/en.lproj/MainMenu.xib | 75 ++++--- 23 files changed, 789 insertions(+), 41 deletions(-) create mode 100644 CocoaSplit/Interface/CSAddInputTypeViewController.h create mode 100644 CocoaSplit/Interface/CSAddInputTypeViewController.m create mode 100644 CocoaSplit/Interface/CSAddInputTypeViewController.xib create mode 100644 CocoaSplit/Interface/CSAddInputViewController.h create mode 100644 CocoaSplit/Interface/CSAddInputViewController.m create mode 100644 CocoaSplit/Interface/CSAddInputViewController.xib create mode 100644 CocoaSplit/Interface/CSScrollView.h create mode 100644 CocoaSplit/Interface/CSScrollView.m create mode 100755 CocoaSplit/NSView+NSLayoutConstraintFilter.h create mode 100755 CocoaSplit/NSView+NSLayoutConstraintFilter.m diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 3c368d6c..ff07684c 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -335,6 +335,12 @@ 34ED8CB91B073C1B002C0674 /* CSMidiManagerWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34ED8CB61B073C1B002C0674 /* CSMidiManagerWindowController.xib */; }; 34ED8CBC1B07763F002C0674 /* CSMidiWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */; }; 34ED8CBD1B07763F002C0674 /* CSMidiWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */; }; + 34F04D9F1CE0381D0054663A /* CSAddInputViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F04D9D1CE0381D0054663A /* CSAddInputViewController.m */; }; + 34F04DA01CE0381D0054663A /* CSAddInputViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F04D9E1CE0381D0054663A /* CSAddInputViewController.xib */; }; + 34F04DA41CE04B670054663A /* CSAddInputTypeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F04DA21CE04B670054663A /* CSAddInputTypeViewController.m */; }; + 34F04DA51CE04B670054663A /* CSAddInputTypeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F04DA31CE04B670054663A /* CSAddInputTypeViewController.xib */; }; + 34F04DA81CE0BA470054663A /* CSScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F04DA71CE0BA470054663A /* CSScrollView.m */; }; + 34F04DAB1CE0BB770054663A /* NSView+NSLayoutConstraintFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F04DAA1CE0BB770054663A /* NSView+NSLayoutConstraintFilter.m */; }; 34F1EB921BCCA41F00B38E6C /* CSLayoutEditWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F1EB901BCCA41F00B38E6C /* CSLayoutEditWindowController.m */; }; 34F1EB931BCCA41F00B38E6C /* CSLayoutEditWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F1EB911BCCA41F00B38E6C /* CSLayoutEditWindowController.xib */; }; 34F5141216FD6E4F00BA894D /* x264Compressor.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F5140F16FD6E4F00BA894D /* x264Compressor.m */; }; @@ -943,6 +949,16 @@ 34ED8CB61B073C1B002C0674 /* CSMidiManagerWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSMidiManagerWindowController.xib; path = Interface/CSMidiManagerWindowController.xib; sourceTree = ""; }; 34ED8CBA1B07763F002C0674 /* CSMidiWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSMidiWrapper.h; sourceTree = ""; }; 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSMidiWrapper.m; sourceTree = ""; }; + 34F04D9C1CE0381D0054663A /* CSAddInputViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAddInputViewController.h; path = Interface/CSAddInputViewController.h; sourceTree = ""; }; + 34F04D9D1CE0381D0054663A /* CSAddInputViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSAddInputViewController.m; path = Interface/CSAddInputViewController.m; sourceTree = ""; }; + 34F04D9E1CE0381D0054663A /* CSAddInputViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSAddInputViewController.xib; path = Interface/CSAddInputViewController.xib; sourceTree = ""; }; + 34F04DA11CE04B670054663A /* CSAddInputTypeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAddInputTypeViewController.h; path = Interface/CSAddInputTypeViewController.h; sourceTree = ""; }; + 34F04DA21CE04B670054663A /* CSAddInputTypeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSAddInputTypeViewController.m; path = Interface/CSAddInputTypeViewController.m; sourceTree = ""; }; + 34F04DA31CE04B670054663A /* CSAddInputTypeViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSAddInputTypeViewController.xib; path = Interface/CSAddInputTypeViewController.xib; sourceTree = ""; }; + 34F04DA61CE0BA470054663A /* CSScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSScrollView.h; path = Interface/CSScrollView.h; sourceTree = ""; }; + 34F04DA71CE0BA470054663A /* CSScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSScrollView.m; path = Interface/CSScrollView.m; sourceTree = ""; }; + 34F04DA91CE0BB770054663A /* NSView+NSLayoutConstraintFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSView+NSLayoutConstraintFilter.h"; sourceTree = ""; }; + 34F04DAA1CE0BB770054663A /* NSView+NSLayoutConstraintFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSView+NSLayoutConstraintFilter.m"; sourceTree = ""; }; 34F1EB8F1BCCA41F00B38E6C /* CSLayoutEditWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSLayoutEditWindowController.h; path = Interface/CSLayoutEditWindowController.h; sourceTree = ""; }; 34F1EB901BCCA41F00B38E6C /* CSLayoutEditWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSLayoutEditWindowController.m; path = Interface/CSLayoutEditWindowController.m; sourceTree = ""; }; 34F1EB911BCCA41F00B38E6C /* CSLayoutEditWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSLayoutEditWindowController.xib; path = Interface/CSLayoutEditWindowController.xib; sourceTree = ""; }; @@ -1291,6 +1307,8 @@ 3441338E18667FE40059B686 /* Interface */ = { isa = PBXGroup; children = ( + 34F04DA91CE0BB770054663A /* NSView+NSLayoutConstraintFilter.h */, + 34F04DAA1CE0BB770054663A /* NSView+NSLayoutConstraintFilter.m */, 3434CB291CA90C3D001B3DF9 /* Compressor */, 34ABEF3B17C0C2CB00AA5E62 /* advancedPrefPanel.xib */, 344825E41B253D6900AF9EAC /* CAMultiAudioMatrixCell.h */, @@ -1343,6 +1361,14 @@ 34DA1D3D1BF823E700132486 /* CSNewOutputWindowController.xib */, 34A7ADB61C01EF1400685044 /* CompressionSettingsPanelController.h */, 34A7ADB71C01EF1400685044 /* CompressionSettingsPanelController.m */, + 34F04D9C1CE0381D0054663A /* CSAddInputViewController.h */, + 34F04D9D1CE0381D0054663A /* CSAddInputViewController.m */, + 34F04D9E1CE0381D0054663A /* CSAddInputViewController.xib */, + 34F04DA11CE04B670054663A /* CSAddInputTypeViewController.h */, + 34F04DA21CE04B670054663A /* CSAddInputTypeViewController.m */, + 34F04DA31CE04B670054663A /* CSAddInputTypeViewController.xib */, + 34F04DA61CE0BA470054663A /* CSScrollView.h */, + 34F04DA71CE0BA470054663A /* CSScrollView.m */, ); name = Interface; sourceTree = ""; @@ -2136,6 +2162,7 @@ 340FE4B215F3417E00E4CE4E /* Credits.rtf in Resources */, 340FE4B815F3417E00E4CE4E /* MainMenu.xib in Resources */, 34DA1D3F1BF823E700132486 /* CSNewOutputWindowController.xib in Resources */, + 34F04DA51CE04B670054663A /* CSAddInputTypeViewController.xib in Resources */, 34F1EB931BCCA41F00B38E6C /* CSLayoutEditWindowController.xib in Resources */, 342B33B61980771200492CB7 /* line.vtsh in Resources */, 34938EEF1AE4D24200F3B1CF /* CSFilterChooserWindowController.xib in Resources */, @@ -2158,6 +2185,7 @@ 344825D21B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib in Resources */, 349461761AC49BB300F28883 /* CSAnimationChooserViewController.xib in Resources */, 349461451AAD73BC00F28883 /* TestView.xib in Resources */, + 34F04DA01CE0381D0054663A /* CSAddInputViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2203,12 +2231,14 @@ 34C19053189EE60400AB2430 /* CapturedFrameData.m in Sources */, 34ED8C4B1B07371C002C0674 /* MIKMIDIClientDestinationEndpoint.m in Sources */, 34ED8C871B07371C002C0674 /* MIKMIDIMetaTimeSignatureEvent.m in Sources */, + 34F04DAB1CE0BB770054663A /* NSView+NSLayoutConstraintFilter.m in Sources */, 34ED8C7B1B07371C002C0674 /* MIKMIDIMetaInstrumentNameEvent.m in Sources */, 34ED8C8B1B07371C002C0674 /* MIKMIDIMetronome.m in Sources */, 345F8B6D1A176A5D009A81E3 /* CAMultiAudioUnit.m in Sources */, 34ED8C771B07371C002C0674 /* MIKMIDIMetaCuePointEvent.m in Sources */, 34D2D5731A547628001004E5 /* CSTextCaptureBase.m in Sources */, 340FE4B515F3417E00E4CE4E /* AppDelegate.m in Sources */, + 34F04D9F1CE0381D0054663A /* CSAddInputViewController.m in Sources */, 345F8B4F1A15F7DA009A81E3 /* CAMultiAudioPCMPlayer.m in Sources */, 34ED8C5B1B07371C002C0674 /* MIKMIDIDeviceManager.m in Sources */, 34AFC33319B19CD00007C07B /* SourceCache.m in Sources */, @@ -2228,6 +2258,7 @@ 34BD1E4D1B1F1A2D0015CBEC /* CAMultiAudioDownmixer.m in Sources */, 345F8B251A14E6A0009A81E3 /* CAMultiAudioNode.m in Sources */, 342346AA15F59A8500C8C77E /* AVFAudioCapture.m in Sources */, + 34F04DA41CE04B670054663A /* CSAddInputTypeViewController.m in Sources */, 3498D94A1A94685000906532 /* CSAudioSwitchCell.m in Sources */, 34AB1C311B944F48003F2C03 /* CSPreviewOverlayView.m in Sources */, 345F8B051A1060D6009A81E3 /* CSAacEncoder.m in Sources */, @@ -2242,6 +2273,7 @@ 34ED8C531B07371C002C0674 /* MIKMIDICommandThrottler.m in Sources */, 345F8B611A161552009A81E3 /* CAMultiAudioAVCapturePlayer.m in Sources */, 34ED8CAD1B07371C002C0674 /* MIKMIDIUtilities.m in Sources */, + 34F04DA81CE0BA470054663A /* CSScrollView.m in Sources */, 34ED8C7F1B07371C002C0674 /* MIKMIDIMetaLyricEvent.m in Sources */, 34ED8C711B07371C002C0674 /* MIKMIDIMappingManager.m in Sources */, 3481F30619B48C7C00CC76D8 /* SourceLayout+ScriptingAdditions.m in Sources */, diff --git a/CocoaSplit/CSCaptureBase.m b/CocoaSplit/CSCaptureBase.m index f5ae8843..d5a6ae4f 100644 --- a/CocoaSplit/CSCaptureBase.m +++ b/CocoaSplit/CSCaptureBase.m @@ -38,6 +38,11 @@ return NSStringFromClass(self); } +-(NSString *)label +{ + return [self.class label]; +} + -(instancetype) init { diff --git a/CocoaSplit/CSPluginServices.m b/CocoaSplit/CSPluginServices.m index d83cae86..fdbd5692 100644 --- a/CocoaSplit/CSPluginServices.m +++ b/CocoaSplit/CSPluginServices.m @@ -10,6 +10,7 @@ #import "CAMultiAudioPCMPlayer.h" #import "CSPcmPlayer.h" #import "AppDelegate.h" +#import "PreviewView.h" @implementation CSPluginServices @@ -28,6 +29,10 @@ + + + + -(double) currentFPS { AppDelegate *myAppDelegate = [[NSApplication sharedApplication] delegate]; diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index ce9ba0d5..220d675c 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -22,6 +22,7 @@ #import "CSNotifications.h" #import "PluginManagerWindowController.h" #import "CreateLayoutViewController.h" +#import "CSAddInputViewController.h" #import "CAMultiAudioEngine.h" #import "CSAnimationRunnerObj.h" #import "CSAnimationChooserViewController.h" @@ -101,6 +102,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , float _render_time_total; int _renderedFrames; + NSPopover *_addInputpopOver; NSPopover *_layoutpopOver; NSPopover *_animatepopOver; @@ -323,6 +325,10 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) CSInputLibraryWindowController *inputLibraryController; +@property (strong) NSIndexSet *inputTableSelectionIndexes; + + +@property (weak) IBOutlet NSArrayController *activeInputsArrayController; - (IBAction)openAnimatePopover:(NSButton *)sender; @@ -346,6 +352,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(SourceLayout *)addLayoutFromBase:(SourceLayout *)baseLayout; -(SourceLayout *)getLayoutForName:(NSString *)name; +-(void)openAddInputPopover:(NSButton *)sender; + - (IBAction)openLayoutPopover:(NSButton *)sender; -(void)openLayoutPopover:(NSButton *)sender forLayout:(SourceLayout *)layout; -(void)openBuiltinLayoutPopover:(NSView *)sender spawnRect:(NSRect)spawnRect forLayout:(SourceLayout *)layout; @@ -385,6 +393,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , - (IBAction)configureIRCompressor:(id)sender; +- (IBAction)inputTableControlClick:(NSSegmentedControl *)sender; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 4aaa7640..c495949b 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -100,6 +100,29 @@ } +-(void)openAddInputPopover:(id)sender sourceRect:(NSRect)sourceRect +{ + CSAddInputViewController *vc; + if (!_addInputpopOver) + { + _addInputpopOver = [[NSPopover alloc] init]; + _addInputpopOver.animates = YES; + _addInputpopOver.behavior = NSPopoverBehaviorTransient; + } + + //if (!_addInputpopOver.contentViewController) + { + vc = [[CSAddInputViewController alloc] init]; + _addInputpopOver.contentViewController = vc; + vc.popover = _addInputpopOver; + + //_addInputpopOver.delegate = vc; + } + + [_addInputpopOver showRelativeToRect:sourceRect ofView:sender preferredEdge:NSMaxXEdge]; +} + + -(void)openLayoutPopover:(NSButton *)sender forLayout:(SourceLayout *)layout { CreateLayoutViewController *vc; @@ -130,7 +153,6 @@ useLayout = [[SourceLayout alloc] init]; } vc.sourceLayout = useLayout; - [_layoutpopOver showRelativeToRect:sender.bounds ofView:sender preferredEdge:NSMinYEdge]; } @@ -2260,6 +2282,35 @@ }]; } +- (IBAction)inputTableControlClick:(NSSegmentedControl *)sender +{ + NSInteger clicked = sender.selectedSegment; + + NSArray *deleteInputs; + + switch (clicked) { + case 0: + //[self.activePreviewView addInputSource:sender]; + [self openAddInputPopover:sender sourceRect:sender.bounds]; + break; + case 1: + deleteInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; + for (InputSource *input in deleteInputs) + { + if (input) + { + NSString *uuid = input.uuid; + InputSource *realInput = [self.activePreviewView.sourceLayout inputForUUID:uuid]; + [self.activePreviewView.sourceLayout deleteSource:realInput]; + } + } + break; + default: + break; + } +} + + -(void) newFrameTimed { diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 9b1678a1..613cd902 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -477,7 +477,7 @@ static NSArray *_sourceTypes = nil; { forInput.inputSource = self; forInput.isLive = self.is_live; - //[forInput addObserver:self forKeyPath:@"captureName" options:NSKeyValueChangeNewKey context:NULL]; + [forInput addObserver:self forKeyPath:@"captureName" options:NSKeyValueChangeNewKey context:NULL]; [forInput createNewLayerForInput:self]; } @@ -491,7 +491,7 @@ static NSArray *_sourceTypes = nil; forInput.isLive = NO; [forInput removeLayerForInput:self]; - //[forInput removeObserver:self forKeyPath:@"captureName"]; + [forInput removeObserver:self forKeyPath:@"captureName"]; } @@ -523,6 +523,8 @@ static NSArray *_sourceTypes = nil; { [CATransaction begin]; + self.name = nil; + _nextImageTime = 0.0f; _currentSourceIdx = 0; _needsAdjustment = NO; diff --git a/CocoaSplit/Interface/CSAddInputTypeViewController.h b/CocoaSplit/Interface/CSAddInputTypeViewController.h new file mode 100644 index 00000000..1fd91f66 --- /dev/null +++ b/CocoaSplit/Interface/CSAddInputTypeViewController.h @@ -0,0 +1,17 @@ +// +// CSAddInputTypeViewController.h +// CocoaSplit +// +// Created by Zakk on 5/9/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import + +@interface CSAddInputTypeViewController : NSViewController + + + +@property (weak) NSPopover *popover; + +@end diff --git a/CocoaSplit/Interface/CSAddInputTypeViewController.m b/CocoaSplit/Interface/CSAddInputTypeViewController.m new file mode 100644 index 00000000..b1d69ede --- /dev/null +++ b/CocoaSplit/Interface/CSAddInputTypeViewController.m @@ -0,0 +1,23 @@ +// +// CSAddInputTypeViewController.m +// CocoaSplit +// +// Created by Zakk on 5/9/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSAddInputTypeViewController.h" + +@interface CSAddInputTypeViewController () + +@end + +@implementation CSAddInputTypeViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do view setup here. +} + + +@end diff --git a/CocoaSplit/Interface/CSAddInputTypeViewController.xib b/CocoaSplit/Interface/CSAddInputTypeViewController.xib new file mode 100644 index 00000000..f80dfd93 --- /dev/null +++ b/CocoaSplit/Interface/CSAddInputTypeViewController.xib @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CSAddInputViewController.h b/CocoaSplit/Interface/CSAddInputViewController.h new file mode 100644 index 00000000..7a131d51 --- /dev/null +++ b/CocoaSplit/Interface/CSAddInputViewController.h @@ -0,0 +1,38 @@ +// +// CSAddInputViewController.h +// CocoaSplit +// +// Created by Zakk on 5/8/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CSPluginLoader.h" +#import "InputSource.h" + + +@interface CSAddInputViewController : NSViewController +{ + NSView *_typeListView; + NSArray *_sourceTypeList; +} +@property (strong) IBOutlet NSView *initialView; + +@property (weak) NSPopover *popover; + +@property (strong) IBOutlet NSView *inputListView; + +@property (weak) IBOutlet NSTableView *initialTable; + +@property (strong) NSObject *selectedInput; + +@property (weak) IBOutlet NSTableView *deviceTable; + +@property (readonly) NSArray *sourceTypes; + +- (IBAction)nextViewButton:(id)sender; +- (IBAction)previousViewButton:(id)sender; +- (IBAction)initalTableButtonClicked:(id)sender; +- (IBAction)inputTableButtonClicked:(id)sender; + +@end diff --git a/CocoaSplit/Interface/CSAddInputViewController.m b/CocoaSplit/Interface/CSAddInputViewController.m new file mode 100644 index 00000000..2c72d2a3 --- /dev/null +++ b/CocoaSplit/Interface/CSAddInputViewController.m @@ -0,0 +1,196 @@ +// +// CSAddInputViewController.m +// CocoaSplit +// +// Created by Zakk on 5/8/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSAddInputViewController.h" +#import "CSAddInputTypeViewController.h" +#import "NSView+NSLayoutConstraintFilter.h" +#import "CSCaptureSourceProtocol.h" +#import "CSPluginServices.h" +#import "AppDelegate.h" +#import "PreviewView.h" + +@interface CSAddInputViewController () + +@end + +@implementation CSAddInputViewController + + +- (void)viewDidLoad { + [super viewDidLoad]; + [self switchToInitialView]; + // Do view setup here. +} + + +-(void)switchToInputListView +{ + if (self.initialView && self.initialView.superview) + { + [self.initialView removeFromSuperview]; + } + NSInteger height = [self adjustTableHeight:self.deviceTable]; + + + NSRect vFrame = self.inputListView.frame; + //vFrame.size.height = height; + + + [self.view addSubview:self.inputListView + ]; + + + //[self.initialView setFrame:self.view.frame]; + + self.popover.contentSize = self.inputListView.frame.size; +} + + +-(void)switchToInitialView +{ + if (self.inputListView && self.inputListView.superview) + { + [self.inputListView removeFromSuperview]; + } + NSInteger height = [self adjustTableHeight:self.initialTable]; + + NSLog(@"INITIAL FRAME %@ %@", NSStringFromRect(self.initialView.frame), NSStringFromRect(self.initialTable.frame)); + + NSRect vFrame = self.initialView.frame; + //vFrame.size.height = height; + + NSLog(@"VIEW %@", self.view); + + [self.view addSubview:self.initialView]; + + + //[self.initialView setFrame:self.view.frame]; + + self.popover.contentSize = self.initialView.frame.size; + +} + + + +-(NSInteger)adjustTableHeight:(NSTableView *)table +{ + NSInteger height = 0; + for (int i = 0; i < table.numberOfRows; i++) + { + NSView *view = [table viewAtColumn:0 row:i makeIfNecessary:YES]; + height += view.frame.size.height; + } + + height+=4; + + NSScrollView *tSview = (NSScrollView *)table.superview.superview; + + NSLayoutConstraint *constraint = [tSview constraintForAttribute:NSLayoutAttributeHeight]; + [constraint setConstant:height]; + +// NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:tSview attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:height]; +// [tSview addConstraint:constraint]; + return height; +} + + +- (IBAction)nextViewButton:(id)sender +{ + [self.initialView removeFromSuperview]; + self.popover.contentSize = self.inputListView.frame.size; + [self.view addSubview:self.inputListView]; +} + +- (IBAction)previousViewButton:(id)sender +{ + [self switchToInitialView]; + self.selectedInput = nil; +} + +- (IBAction)initalTableButtonClicked:(id)sender +{ + + NSObject *clickedCapture; + + clickedCapture = [ self.sourceTypes objectAtIndex:[self.initialTable rowForView:sender]]; + + if (!clickedCapture.availableVideoDevices || clickedCapture.availableVideoDevices.count == 0) + { + InputSource *newSrc = [[InputSource alloc] init]; + newSrc.selectedVideoType = clickedCapture.label; + [self addInput:newSrc]; + } else { + self.selectedInput = clickedCapture; + [self switchToInputListView]; + } +} + +- (IBAction)inputTableButtonClicked:(id)sender +{ + CSAbstractCaptureDevice *clickedDevice; + clickedDevice = [self.selectedInput.availableVideoDevices objectAtIndex:[self.deviceTable rowForView:sender]]; + if (clickedDevice) + { + InputSource *newSrc = [[InputSource alloc] init]; + newSrc.selectedVideoType = self.selectedInput.label; + newSrc.videoInput.activeVideoDevice = clickedDevice; + [self addInput:newSrc]; + } + +} + +-(void)addInput:(id)toAdd +{ + + AppDelegate *myAppDelegate = [[NSApplication sharedApplication] delegate]; + + if (myAppDelegate.captureController) + { + [myAppDelegate.captureController.activePreviewView addInputSourceWithInput:toAdd]; + } + + } + + +-(BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row +{ + return NO; +} + + +-(NSArray *)sourceTypes +{ + + if (_sourceTypeList) + { + return _sourceTypeList; + } + + + NSMutableDictionary *pluginMap = [[CSPluginLoader sharedPluginLoader] sourcePlugins]; + + NSArray *sortedKeys = [pluginMap.allKeys sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; + + + NSMutableArray *ret = [[NSMutableArray alloc] init]; + for (NSString *key in sortedKeys) + { + Class captureClass = pluginMap[key]; + NSObject *newCaptureSession; + + newCaptureSession = [[captureClass alloc] init]; + + [ret addObject:newCaptureSession]; + } + + _sourceTypeList = ret; + return ret; +} + + +@end diff --git a/CocoaSplit/Interface/CSAddInputViewController.xib b/CocoaSplit/Interface/CSAddInputViewController.xib new file mode 100644 index 00000000..30ba3dfc --- /dev/null +++ b/CocoaSplit/Interface/CSAddInputViewController.xib @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CSScrollView.h b/CocoaSplit/Interface/CSScrollView.h new file mode 100644 index 00000000..eb2c9d68 --- /dev/null +++ b/CocoaSplit/Interface/CSScrollView.h @@ -0,0 +1,13 @@ +// +// CSScrollView.h +// CocoaSplit +// +// Created by Zakk on 5/9/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import + +@interface CSScrollView : NSScrollView + +@end diff --git a/CocoaSplit/Interface/CSScrollView.m b/CocoaSplit/Interface/CSScrollView.m new file mode 100644 index 00000000..389cd0f3 --- /dev/null +++ b/CocoaSplit/Interface/CSScrollView.m @@ -0,0 +1,23 @@ +// +// CSScrollView.m +// CocoaSplit +// +// Created by Zakk on 5/9/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSScrollView.h" + +@implementation CSScrollView + +-(instancetype) initWithCoder:(NSCoder *)coder +{ + if (self = [super initWithCoder:coder]) + { + NSLog(@"WHEEEEEEE"); + self.translatesAutoresizingMaskIntoConstraints = NO; + } + + return self; +} +@end diff --git a/CocoaSplit/NSView+NSLayoutConstraintFilter.h b/CocoaSplit/NSView+NSLayoutConstraintFilter.h new file mode 100755 index 00000000..ed078168 --- /dev/null +++ b/CocoaSplit/NSView+NSLayoutConstraintFilter.h @@ -0,0 +1,37 @@ +// +// NSView+NSLayoutConstraintFilter.h +// Expanding Search +// +// Created by Ilija Tovilo on 12/13/12. +// Copyright (c) 2012 Ilija Tovilo. All rights reserved. +// + +// Copyright (c) 2012, Ilija Tovilo +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +@interface NSView (NSLayoutConstraintFilter) +- (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute)attribute; +- (NSArray *)constaintsForAttribute:(NSLayoutAttribute)attribute; +@end \ No newline at end of file diff --git a/CocoaSplit/NSView+NSLayoutConstraintFilter.m b/CocoaSplit/NSView+NSLayoutConstraintFilter.m new file mode 100755 index 00000000..2c082bc3 --- /dev/null +++ b/CocoaSplit/NSView+NSLayoutConstraintFilter.m @@ -0,0 +1,53 @@ +// +// NSView+NSLayoutConstraintFilter.m +// Expanding Search +// +// Created by Ilija Tovilo on 12/13/12. +// Copyright (c) 2012 Ilija Tovilo. All rights reserved. +// + +// Copyright (c) 2012, Ilija Tovilo +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "NSView+NSLayoutConstraintFilter.h" + +@implementation NSView (NSLayoutConstraintFilter) + +- (NSArray *)constaintsForAttribute:(NSLayoutAttribute)attribute { + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", attribute]; + NSArray *filteredArray = [[self constraints] filteredArrayUsingPredicate:predicate]; + + return filteredArray; +} + +- (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute)attribute { + NSArray *constraints = [self constaintsForAttribute:attribute]; + + if (constraints.count) { + return constraints[0]; + } + + return nil; +} + +@end diff --git a/CocoaSplit/PluginHeaders/CSCaptureBase.h b/CocoaSplit/PluginHeaders/CSCaptureBase.h index ebc6bd01..f72ee2b2 100644 --- a/CocoaSplit/PluginHeaders/CSCaptureBase.h +++ b/CocoaSplit/PluginHeaders/CSCaptureBase.h @@ -104,6 +104,8 @@ typedef enum frame_render_behavior_t { -(void)setDeviceForUniqueID:(NSString *)uniqueID; -(NSView *)configurationView; +(NSString *) label; +-(NSString *)label; + //Class method to run code that messes with the CALayer(s). It has to be on the main thread even if it isn't in a view :( //All this method does is dispatch_sync to the main thread OR run the block immediately if we're already on the main thread +(void) layoutModification:(void (^)())modBlock; diff --git a/CocoaSplit/PluginHeaders/CSCaptureSourceProtocol.h b/CocoaSplit/PluginHeaders/CSCaptureSourceProtocol.h index 1196b7b8..66940bad 100644 --- a/CocoaSplit/PluginHeaders/CSCaptureSourceProtocol.h +++ b/CocoaSplit/PluginHeaders/CSCaptureSourceProtocol.h @@ -118,6 +118,8 @@ If your source is 'shared' between inputSources each new one will call this func -(NSViewController *)configurationView; +(NSString *) label; +-(NSString *)label; + -(void)frameArrived; diff --git a/CocoaSplit/PluginHeaders/CSPluginServices.h b/CocoaSplit/PluginHeaders/CSPluginServices.h index 847d38bb..b9005166 100644 --- a/CocoaSplit/PluginHeaders/CSPluginServices.h +++ b/CocoaSplit/PluginHeaders/CSPluginServices.h @@ -9,6 +9,7 @@ #import #import "CSPcmPlayer.h" + @interface CSPluginServices : NSObject @@ -19,6 +20,7 @@ -(void)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile withBlock:(void(^)(Class))withBlock; -(Class)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile; + @property (readonly) double currentFPS; @property (readonly) int audioSampleRate; diff --git a/CocoaSplit/PreviewView.h b/CocoaSplit/PreviewView.h index 97f2bf0b..d665709f 100644 --- a/CocoaSplit/PreviewView.h +++ b/CocoaSplit/PreviewView.h @@ -108,6 +108,7 @@ -(void)needsUpdate; -(NSRect)windowRectforWorldRect:(NSRect)worldRect; -(NSArray *)resizeRectsForSource:(InputSource *)inputSource withExtra:(float)withExtra; +-(void)addInputSourceWithInput:(InputSource *)source; diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index 794dbd24..f3884a94 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -1207,6 +1207,17 @@ } +-(void)addInputSourceWithInput:(InputSource *)source +{ + if (self.sourceLayout) + { + + [self.sourceLayout addSource:source]; + [[self.undoManager prepareWithInvocationTarget:self] undoAddInput:source.uuid]; + } +} + + - (IBAction)addInputSource:(id)sender { diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index a573e579..95974ebb 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -1312,6 +1312,7 @@ } + -(void)deleteSource:(InputSource *)delSource { diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 7bcb818d..ac64d2f0 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -22,6 +22,7 @@ + @@ -577,33 +578,6 @@ - - - + - + - + @@ -715,13 +689,14 @@ + + + + + + + + + + + + + + + + + + + + + - - - - - - - @@ -1901,5 +1898,7 @@ MgA3AEEARwBQAFcAXABkAHkAewB9AH8AgQCLAJAAlQCgAKMApQCnAKkArgC5AMIAygDNANYA2wDoAOwA + + From 0f4935bd617d394a1a0a8881cb539f368caf78d6 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 15 May 2016 16:38:06 -0400 Subject: [PATCH 079/156] Highlight inputs when they are selected in the input list --- CocoaSplit.xcodeproj/project.pbxproj | 10 --- CocoaSplit/CSPreviewOverlayView.h | 2 + CocoaSplit/CSPreviewOverlayView.m | 16 ++++- CocoaSplit/CaptureController.h | 4 +- CocoaSplit/CaptureController.m | 38 +++++++++++ .../Interface/CSAddInputTypeViewController.h | 17 ----- .../Interface/CSAddInputTypeViewController.m | 23 ------- .../CSAddInputTypeViewController.xib | 30 -------- .../Interface/CSAddInputViewController.m | 1 - CocoaSplit/PreviewView.h | 8 +++ CocoaSplit/PreviewView.m | 68 ++++++++++++++++++- CocoaSplit/en.lproj/MainMenu.xib | 4 +- 12 files changed, 134 insertions(+), 87 deletions(-) delete mode 100644 CocoaSplit/Interface/CSAddInputTypeViewController.h delete mode 100644 CocoaSplit/Interface/CSAddInputTypeViewController.m delete mode 100644 CocoaSplit/Interface/CSAddInputTypeViewController.xib diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index ff07684c..b13370e4 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -337,8 +337,6 @@ 34ED8CBD1B07763F002C0674 /* CSMidiWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 34ED8CBB1B07763F002C0674 /* CSMidiWrapper.m */; }; 34F04D9F1CE0381D0054663A /* CSAddInputViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F04D9D1CE0381D0054663A /* CSAddInputViewController.m */; }; 34F04DA01CE0381D0054663A /* CSAddInputViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F04D9E1CE0381D0054663A /* CSAddInputViewController.xib */; }; - 34F04DA41CE04B670054663A /* CSAddInputTypeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F04DA21CE04B670054663A /* CSAddInputTypeViewController.m */; }; - 34F04DA51CE04B670054663A /* CSAddInputTypeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F04DA31CE04B670054663A /* CSAddInputTypeViewController.xib */; }; 34F04DA81CE0BA470054663A /* CSScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F04DA71CE0BA470054663A /* CSScrollView.m */; }; 34F04DAB1CE0BB770054663A /* NSView+NSLayoutConstraintFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F04DAA1CE0BB770054663A /* NSView+NSLayoutConstraintFilter.m */; }; 34F1EB921BCCA41F00B38E6C /* CSLayoutEditWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F1EB901BCCA41F00B38E6C /* CSLayoutEditWindowController.m */; }; @@ -952,9 +950,6 @@ 34F04D9C1CE0381D0054663A /* CSAddInputViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAddInputViewController.h; path = Interface/CSAddInputViewController.h; sourceTree = ""; }; 34F04D9D1CE0381D0054663A /* CSAddInputViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSAddInputViewController.m; path = Interface/CSAddInputViewController.m; sourceTree = ""; }; 34F04D9E1CE0381D0054663A /* CSAddInputViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSAddInputViewController.xib; path = Interface/CSAddInputViewController.xib; sourceTree = ""; }; - 34F04DA11CE04B670054663A /* CSAddInputTypeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAddInputTypeViewController.h; path = Interface/CSAddInputTypeViewController.h; sourceTree = ""; }; - 34F04DA21CE04B670054663A /* CSAddInputTypeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSAddInputTypeViewController.m; path = Interface/CSAddInputTypeViewController.m; sourceTree = ""; }; - 34F04DA31CE04B670054663A /* CSAddInputTypeViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSAddInputTypeViewController.xib; path = Interface/CSAddInputTypeViewController.xib; sourceTree = ""; }; 34F04DA61CE0BA470054663A /* CSScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSScrollView.h; path = Interface/CSScrollView.h; sourceTree = ""; }; 34F04DA71CE0BA470054663A /* CSScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSScrollView.m; path = Interface/CSScrollView.m; sourceTree = ""; }; 34F04DA91CE0BB770054663A /* NSView+NSLayoutConstraintFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSView+NSLayoutConstraintFilter.h"; sourceTree = ""; }; @@ -1364,9 +1359,6 @@ 34F04D9C1CE0381D0054663A /* CSAddInputViewController.h */, 34F04D9D1CE0381D0054663A /* CSAddInputViewController.m */, 34F04D9E1CE0381D0054663A /* CSAddInputViewController.xib */, - 34F04DA11CE04B670054663A /* CSAddInputTypeViewController.h */, - 34F04DA21CE04B670054663A /* CSAddInputTypeViewController.m */, - 34F04DA31CE04B670054663A /* CSAddInputTypeViewController.xib */, 34F04DA61CE0BA470054663A /* CSScrollView.h */, 34F04DA71CE0BA470054663A /* CSScrollView.m */, ); @@ -2162,7 +2154,6 @@ 340FE4B215F3417E00E4CE4E /* Credits.rtf in Resources */, 340FE4B815F3417E00E4CE4E /* MainMenu.xib in Resources */, 34DA1D3F1BF823E700132486 /* CSNewOutputWindowController.xib in Resources */, - 34F04DA51CE04B670054663A /* CSAddInputTypeViewController.xib in Resources */, 34F1EB931BCCA41F00B38E6C /* CSLayoutEditWindowController.xib in Resources */, 342B33B61980771200492CB7 /* line.vtsh in Resources */, 34938EEF1AE4D24200F3B1CF /* CSFilterChooserWindowController.xib in Resources */, @@ -2258,7 +2249,6 @@ 34BD1E4D1B1F1A2D0015CBEC /* CAMultiAudioDownmixer.m in Sources */, 345F8B251A14E6A0009A81E3 /* CAMultiAudioNode.m in Sources */, 342346AA15F59A8500C8C77E /* AVFAudioCapture.m in Sources */, - 34F04DA41CE04B670054663A /* CSAddInputTypeViewController.m in Sources */, 3498D94A1A94685000906532 /* CSAudioSwitchCell.m in Sources */, 34AB1C311B944F48003F2C03 /* CSPreviewOverlayView.m in Sources */, 345F8B051A1060D6009A81E3 /* CSAacEncoder.m in Sources */, diff --git a/CocoaSplit/CSPreviewOverlayView.h b/CocoaSplit/CSPreviewOverlayView.h index 6c2287d5..8e528192 100644 --- a/CocoaSplit/CSPreviewOverlayView.h +++ b/CocoaSplit/CSPreviewOverlayView.h @@ -19,6 +19,8 @@ @property (weak) InputSource *parentSource; @property (weak) PreviewView *previewView; +@property (assign) bool renderControls; + -(void)updatePosition; @end diff --git a/CocoaSplit/CSPreviewOverlayView.m b/CocoaSplit/CSPreviewOverlayView.m index 5f99f8aa..e710e329 100644 --- a/CocoaSplit/CSPreviewOverlayView.m +++ b/CocoaSplit/CSPreviewOverlayView.m @@ -27,6 +27,18 @@ #define RESIZE_HANDLE_SIZE 6.0f + +-(instancetype) init +{ + if (self = [super init]) + { + self.renderControls = YES; + } + + return self; +} + + -(BOOL)wantsDefaultClipping { return NO; @@ -96,7 +108,7 @@ CGContextSetStrokeColorWithColor(currentContext, [[NSColor blueColor] CGColor]); CGContextStrokeRect(currentContext, [self insetSelectionRect]); - if (self.parentSource && self.previewView) + if (self.renderControls && self.parentSource && self.previewView) { CGContextSetFillColorWithColor(currentContext, [NSColor knobColor].CGColor); CGContextFillRect(currentContext, [self bottomLeftResizeRect]); @@ -191,6 +203,7 @@ } + -(InputSource *)parentSource { return _parentSource; @@ -216,6 +229,7 @@ NSLog(@"MOUSE ENTERED!!!"); } + @end diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 220d675c..fe201d87 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -51,7 +51,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @class PreviewView; -@interface CaptureController : NSObject { +@interface CaptureController : NSObject { NSArray *_inputIdentifiers; @@ -359,6 +359,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(void)openBuiltinLayoutPopover:(NSView *)sender spawnRect:(NSRect)spawnRect forLayout:(SourceLayout *)layout; +@property (weak) IBOutlet NSTableView *inputTableView; @property (weak) IBOutlet NSTableView *outputTableView; - (IBAction)outputEditClicked:(id)sender; @@ -395,6 +396,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , - (IBAction)inputTableControlClick:(NSSegmentedControl *)sender; +-(void) resetInputTableHighlights; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index c495949b..0e04b43f 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -327,6 +327,12 @@ SourceLayout *layout; + if (tableView == self.inputTableView) + { + return [tableView makeViewWithIdentifier:@"inputTableCellView" owner:tableView]; + } + + if (tableView.tag == 0) { layout = self.stagingPreviewView.sourceLayout; @@ -2282,6 +2288,38 @@ }]; } +-(void) resetInputTableHighlights +{ + [self.activePreviewView stopHighlightingAllSources]; + + if (self.inputTableSelectionIndexes) + { + NSArray *selectedInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; + + for (InputSource *input in selectedInputs) + { + [self.activePreviewView highlightSource:input]; + } + } +} + + +-(void) tableViewSelectionDidChange:(NSNotification *)notification +{ + NSTableView *table = notification.object; + + if (table == self.inputTableView) + { + NSArray *selectedInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; + [self.activePreviewView stopHighlightingAllSources]; + for (InputSource *input in selectedInputs) + { + [self.activePreviewView highlightSource:input]; + } + } +} + + - (IBAction)inputTableControlClick:(NSSegmentedControl *)sender { NSInteger clicked = sender.selectedSegment; diff --git a/CocoaSplit/Interface/CSAddInputTypeViewController.h b/CocoaSplit/Interface/CSAddInputTypeViewController.h deleted file mode 100644 index 1fd91f66..00000000 --- a/CocoaSplit/Interface/CSAddInputTypeViewController.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// CSAddInputTypeViewController.h -// CocoaSplit -// -// Created by Zakk on 5/9/16. -// Copyright © 2016 Zakk. All rights reserved. -// - -#import - -@interface CSAddInputTypeViewController : NSViewController - - - -@property (weak) NSPopover *popover; - -@end diff --git a/CocoaSplit/Interface/CSAddInputTypeViewController.m b/CocoaSplit/Interface/CSAddInputTypeViewController.m deleted file mode 100644 index b1d69ede..00000000 --- a/CocoaSplit/Interface/CSAddInputTypeViewController.m +++ /dev/null @@ -1,23 +0,0 @@ -// -// CSAddInputTypeViewController.m -// CocoaSplit -// -// Created by Zakk on 5/9/16. -// Copyright © 2016 Zakk. All rights reserved. -// - -#import "CSAddInputTypeViewController.h" - -@interface CSAddInputTypeViewController () - -@end - -@implementation CSAddInputTypeViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - // Do view setup here. -} - - -@end diff --git a/CocoaSplit/Interface/CSAddInputTypeViewController.xib b/CocoaSplit/Interface/CSAddInputTypeViewController.xib deleted file mode 100644 index f80dfd93..00000000 --- a/CocoaSplit/Interface/CSAddInputTypeViewController.xib +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CocoaSplit/Interface/CSAddInputViewController.m b/CocoaSplit/Interface/CSAddInputViewController.m index 2c72d2a3..4adce8fe 100644 --- a/CocoaSplit/Interface/CSAddInputViewController.m +++ b/CocoaSplit/Interface/CSAddInputViewController.m @@ -7,7 +7,6 @@ // #import "CSAddInputViewController.h" -#import "CSAddInputTypeViewController.h" #import "NSView+NSLayoutConstraintFilter.h" #import "CSCaptureSourceProtocol.h" #import "CSPluginServices.h" diff --git a/CocoaSplit/PreviewView.h b/CocoaSplit/PreviewView.h index d665709f..ef5e85c3 100644 --- a/CocoaSplit/PreviewView.h +++ b/CocoaSplit/PreviewView.h @@ -53,6 +53,8 @@ NSPopover *_layoutpopOver; CSPreviewOverlayView *_overlayView; bool _inDrag; + NSMutableDictionary *_highlightedSourceMap; + @@ -109,6 +111,12 @@ -(NSRect)windowRectforWorldRect:(NSRect)worldRect; -(NSArray *)resizeRectsForSource:(InputSource *)inputSource withExtra:(float)withExtra; -(void)addInputSourceWithInput:(InputSource *)source; +-(void) highlightSource:(InputSource *)source; +-(void)stopHighlightingSource:(InputSource *)source; +-(void)stopHighlightingAllSources; + + + diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index f3884a94..23bd5a74 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -980,15 +980,75 @@ } _overlayView.parentSource = self.mousedSource; + + if (self.mousedSource) + { + [self stopHighlightingSource:self.mousedSource]; + } else { + [self.controller resetInputTableHighlights]; + } } - - - } +-(void) highlightSource:(InputSource *)source +{ + if (!_highlightedSourceMap) + { + _highlightedSourceMap = [[NSMutableDictionary alloc] init]; + } + + + NSString *srcUUID = source.uuid; + + InputSource *realSrc = [self.sourceLayout inputForUUID:srcUUID]; + if (!_highlightedSourceMap[srcUUID] && realSrc) + { + CSPreviewOverlayView *oview = [[CSPreviewOverlayView alloc] init]; + oview.renderControls = NO; + oview.previewView = self; + oview.parentSource = realSrc; + _highlightedSourceMap[srcUUID] = oview; + } +} + + +-(void)stopHighlightingSource:(InputSource *)source +{ + if (!_highlightedSourceMap) + { + _highlightedSourceMap = [[NSMutableDictionary alloc] init]; + } + + NSString *srcUUID = source.uuid; + + if (_highlightedSourceMap[srcUUID]) + { + CSPreviewOverlayView *oview = _highlightedSourceMap[srcUUID]; + [oview removeFromSuperview]; + [_highlightedSourceMap removeObjectForKey:srcUUID]; + } +} + +-(void)stopHighlightingAllSources +{ + if (!_highlightedSourceMap) + { + _highlightedSourceMap = [[NSMutableDictionary alloc] init]; + } + for (NSString *key in _highlightedSourceMap) + { + CSPreviewOverlayView *oview = _highlightedSourceMap[key]; + if (oview) + { + [oview removeFromSuperview]; + } + } + [_highlightedSourceMap removeAllObjects]; +} + - (IBAction)moveInputUp:(id)sender { @@ -1589,6 +1649,8 @@ { NSString *uuid = src.uuid; + [self stopHighlightingSource:src]; + NSWindow *cWindow = [self.activeConfigWindows objectForKey:uuid]; InputPopupControllerViewController *cController = [self.activeConfigControllers objectForKey:uuid]; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index ac64d2f0..40610a6d 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -27,6 +27,7 @@ + @@ -664,7 +665,7 @@ - + @@ -690,6 +691,7 @@ + From a7e3e04f7742a1eec3e611ec83de210183ab34ce Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 15 May 2016 21:47:27 -0400 Subject: [PATCH 080/156] Convert input list controls to NSButtons because NSSegmentedControl is poo Implement input settings button --- CocoaSplit/CaptureController.h | 2 +- CocoaSplit/CaptureController.m | 40 ++++++++++++++------- CocoaSplit/en.lproj/MainMenu.xib | 60 ++++++++++++++++++++++---------- 3 files changed, 70 insertions(+), 32 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index fe201d87..144f1de5 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -394,7 +394,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , - (IBAction)configureIRCompressor:(id)sender; -- (IBAction)inputTableControlClick:(NSSegmentedControl *)sender; +- (IBAction)inputTableControlClick:(NSButton *)sender; -(void) resetInputTableHighlights; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 0e04b43f..967c5c91 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -35,7 +35,6 @@ - @implementation CaptureController @synthesize selectedLayout = _selectedLayout; @@ -2320,26 +2319,43 @@ } -- (IBAction)inputTableControlClick:(NSSegmentedControl *)sender +- (IBAction)inputTableControlClick:(NSButton *)sender { - NSInteger clicked = sender.selectedSegment; + NSInteger clicked = sender.tag; - NSArray *deleteInputs; - + NSArray *selectedInputs; + NSRect sbounds; switch (clicked) { case 0: + sbounds = sender.bounds; //[self.activePreviewView addInputSource:sender]; - [self openAddInputPopover:sender sourceRect:sender.bounds]; + //sbounds.origin.x = NSMaxX(sender.frame) - [sender widthForSegment:0]; + NSLog(@"FRAME %@", NSStringFromRect(sbounds)); + //sbounds.origin.x -= 333; + [self openAddInputPopover:sender sourceRect:sbounds]; break; case 1: - deleteInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; - for (InputSource *input in deleteInputs) + if (self.inputTableSelectionIndexes) { - if (input) + selectedInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; + for (InputSource *input in selectedInputs) { - NSString *uuid = input.uuid; - InputSource *realInput = [self.activePreviewView.sourceLayout inputForUUID:uuid]; - [self.activePreviewView.sourceLayout deleteSource:realInput]; + if (input) + { + NSString *uuid = input.uuid; + InputSource *realInput = [self.activePreviewView.sourceLayout inputForUUID:uuid]; + [self.activePreviewView.sourceLayout deleteSource:realInput]; + } + } + } + break; + case 2: + if (self.inputTableSelectionIndexes) + { + selectedInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; + for (InputSource *input in selectedInputs) + { + [self.activePreviewView spawnInputSettings:input atRect:NSZeroRect]; } } break; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 40610a6d..0c1ecc2d 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -706,25 +706,6 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + From 861b3ceba65d95151655fd480fe5e3ea4e28b42c Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 21 May 2016 14:40:24 -0400 Subject: [PATCH 081/156] Input configuration dialogs spawned from the config list open in their own windows and properly cascade when multiples are opened. --- CocoaSplit/CaptureController.h | 1 + CocoaSplit/CaptureController.m | 7 +- .../Interface/CSAddInputViewController.xib | 8 +- .../InputPopupControllerViewController.xib | 2 +- CocoaSplit/PreviewView.h | 5 +- CocoaSplit/PreviewView.m | 73 +++++ CocoaSplit/en.lproj/MainMenu.xib | 271 ++++++++++-------- 7 files changed, 236 insertions(+), 131 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 144f1de5..c3a0e10a 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -113,6 +113,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , NSMutableArray *_audioBuffer; + } diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 967c5c91..260a06ab 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -709,6 +709,7 @@ if (self = [super init]) { + _layoutWindows = [NSMutableArray array]; self.transitionDirections = @[kCATransitionFromTop, kCATransitionFromRight, kCATransitionFromBottom, kCATransitionFromLeft]; @@ -2330,7 +2331,6 @@ sbounds = sender.bounds; //[self.activePreviewView addInputSource:sender]; //sbounds.origin.x = NSMaxX(sender.frame) - [sender widthForSegment:0]; - NSLog(@"FRAME %@", NSStringFromRect(sbounds)); //sbounds.origin.x -= 333; [self openAddInputPopover:sender sourceRect:sbounds]; break; @@ -2344,7 +2344,7 @@ { NSString *uuid = input.uuid; InputSource *realInput = [self.activePreviewView.sourceLayout inputForUUID:uuid]; - [self.activePreviewView.sourceLayout deleteSource:realInput]; + [self.activePreviewView deleteInput:realInput]; } } } @@ -2355,7 +2355,8 @@ selectedInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; for (InputSource *input in selectedInputs) { - [self.activePreviewView spawnInputSettings:input atRect:NSZeroRect]; + [self.activePreviewView openInputConfigWindow:input.uuid ]; + } } break; diff --git a/CocoaSplit/Interface/CSAddInputViewController.xib b/CocoaSplit/Interface/CSAddInputViewController.xib index 30ba3dfc..34069cbd 100644 --- a/CocoaSplit/Interface/CSAddInputViewController.xib +++ b/CocoaSplit/Interface/CSAddInputViewController.xib @@ -1,5 +1,5 @@ - + @@ -66,7 +66,7 @@ - + @@ -470,7 +467,7 @@ - + @@ -504,7 +501,7 @@ - + @@ -512,11 +509,8 @@ - + - - - @@ -536,7 +530,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + - + @@ -628,7 +619,7 @@ - - + - + @@ -669,7 +660,7 @@ - + @@ -681,6 +672,11 @@ + + + + + @@ -706,7 +702,7 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1044,8 +1071,11 @@ - - - + - + @@ -1272,9 +1302,14 @@ - - - + + + + + + + + @@ -1283,10 +1318,10 @@ - + - - - + @@ -1324,7 +1359,7 @@ - - + - + @@ -1501,9 +1536,9 @@ - + - + @@ -1551,30 +1586,24 @@ - - - - - - - + - + - + @@ -1619,7 +1648,7 @@ - + @@ -1661,14 +1690,12 @@ - - - - - + + + @@ -1677,7 +1704,7 @@ - - - - - - - - - - - + + + + + + + + + + @@ -1710,10 +1737,10 @@ - - - - + + + + From 000b8ec3d09deaa63431bac82c4072df767bdd4b Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 21 May 2016 16:16:16 -0400 Subject: [PATCH 082/156] All input configurations now open as windows, not popovers --- CocoaSplit/PreviewView.m | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index e40fe194..e6024d1c 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -1482,18 +1482,7 @@ } - NSPoint tmp = [self convertPoint:[self.window mouseLocationOutsideOfEventStream] fromView:nil]; - - NSRect spawnRect = NSMakeRect(tmp.x, tmp.y, 1.0f, 1.0f); - - if (!NSPointInRect(NSMakePoint(tmp.x, 0), self.bounds)) - { - spawnRect = NSMakeRect(self.bounds.size.width-5, tmp.y, 1.0f, 1.0f); - } else if (!NSPointInRect(NSMakePoint(0, tmp.y), self.bounds)) { - spawnRect = NSMakeRect(tmp.x, 5.0f, 1.0f, 1.0f); - } - - [self spawnInputSettings:configSource atRect:spawnRect]; + [self openInputConfigWindow:configSource.uuid]; } From fa4ec270fa5b168608b0788f32567bbfc5af5e3e Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 22 May 2016 04:36:33 -0400 Subject: [PATCH 083/156] Input list is now an outline view so input hierarchy is now visible --- CSNotifications.m | 2 + CocoaSplit/CaptureController.h | 5 +- CocoaSplit/CaptureController.m | 73 ++-- CocoaSplit/InputSource.m | 8 +- CocoaSplit/PluginHeaders/CSNotifications.h | 3 + CocoaSplit/SourceLayout.h | 2 + CocoaSplit/SourceLayout.m | 47 ++- CocoaSplit/en.lproj/MainMenu.xib | 457 +++++++++++---------- 8 files changed, 351 insertions(+), 246 deletions(-) diff --git a/CSNotifications.m b/CSNotifications.m index d2f46e44..f7e645a7 100644 --- a/CSNotifications.m +++ b/CSNotifications.m @@ -33,5 +33,7 @@ NSString *const CSNotificationInputDeleted = @"CSNotificationInputDeleted"; NSString *const CSNotificationInputSelected = @"CSNotificationInputSelected"; +NSString *const CSNotificationInputAttached = @"CSNotificationInputAttached"; +NSString *const CSNotificationInputDetached = @"CSNotificationInputDetached"; diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index c3a0e10a..758c7313 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -51,7 +51,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @class PreviewView; -@interface CaptureController : NSObject { +@interface CaptureController : NSObject { NSArray *_inputIdentifiers; @@ -304,6 +304,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , +@property (weak) IBOutlet NSOutlineView *inputOutlineView; @property (strong) NSDictionary *extraSaveData; @@ -326,7 +327,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) CSInputLibraryWindowController *inputLibraryController; -@property (strong) NSIndexSet *inputTableSelectionIndexes; +@property (strong) NSIndexSet *inputOutlineSelectionIndexes; @property (weak) IBOutlet NSArrayController *activeInputsArrayController; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 260a06ab..778a4fd3 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2291,32 +2291,32 @@ -(void) resetInputTableHighlights { [self.activePreviewView stopHighlightingAllSources]; - - if (self.inputTableSelectionIndexes) + if (self.inputOutlineView && self.inputOutlineView.selectedRowIndexes) { - NSArray *selectedInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; - - for (InputSource *input in selectedInputs) - { - [self.activePreviewView highlightSource:input]; - } + [self.inputOutlineView.selectedRowIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) { + NSTreeNode *node = [self.inputOutlineView itemAtRow:idx]; + InputSource *src = node.representedObject; + + if (src) + { + [self.activePreviewView highlightSource:src]; + } + }]; } } --(void) tableViewSelectionDidChange:(NSNotification *)notification +-(void) outlineViewSelectionDidChange:(NSNotification *)notification { - NSTableView *table = notification.object; - - if (table == self.inputTableView) + NSOutlineView *outline = notification.object; + + if (outline == self.inputOutlineView) { - NSArray *selectedInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; - [self.activePreviewView stopHighlightingAllSources]; - for (InputSource *input in selectedInputs) - { - [self.activePreviewView highlightSource:input]; - } + [self resetInputTableHighlights]; + } + + } @@ -2335,29 +2335,38 @@ [self openAddInputPopover:sender sourceRect:sbounds]; break; case 1: - if (self.inputTableSelectionIndexes) + if (self.inputOutlineView && self.inputOutlineView.selectedRowIndexes) { - selectedInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; - for (InputSource *input in selectedInputs) - { - if (input) + [self.inputOutlineView.selectedRowIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) { + NSTreeNode *node = [self.inputOutlineView itemAtRow:idx]; + InputSource *src = node.representedObject; + + if (src) { - NSString *uuid = input.uuid; + NSString *uuid = src.uuid; InputSource *realInput = [self.activePreviewView.sourceLayout inputForUUID:uuid]; [self.activePreviewView deleteInput:realInput]; } - } + + }]; + + } break; case 2: - if (self.inputTableSelectionIndexes) + if (self.inputOutlineView && self.inputOutlineView.selectedRowIndexes) { - selectedInputs = [self.activeInputsArrayController.arrangedObjects objectsAtIndexes:self.inputTableSelectionIndexes]; - for (InputSource *input in selectedInputs) - { - [self.activePreviewView openInputConfigWindow:input.uuid ]; - - } + + [self.inputOutlineView.selectedRowIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) { + NSTreeNode *node = [self.inputOutlineView itemAtRow:idx]; + InputSource *src = node.representedObject; + + if (src) + { + [self.activePreviewView openInputConfigWindow:src.uuid]; + } + + }]; } break; default: diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 613cd902..b18f1158 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -1938,7 +1938,9 @@ static NSArray *_sourceTypes = nil; toDetach.layer.position = newPosition; [CATransaction commit]; - [self.attachedInputs removeObject:toDetach]; + [[self mutableArrayValueForKey:@"attachedInputs"] removeObject:toDetach]; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationInputDetached object:toDetach userInfo:nil]; + } @@ -1958,8 +1960,10 @@ static NSArray *_sourceTypes = nil; } [toAttach makeSublayerOfLayer:self.layer]; - [self.attachedInputs addObject:toAttach]; + [[self mutableArrayValueForKey:@"attachedInputs"] addObject:toAttach]; toAttach.parentInput = self; + [[NSNotificationCenter defaultCenter] postNotificationName:CSNotificationInputAttached object:toAttach userInfo:nil]; + } diff --git a/CocoaSplit/PluginHeaders/CSNotifications.h b/CocoaSplit/PluginHeaders/CSNotifications.h index 7448e938..2851c1a0 100644 --- a/CocoaSplit/PluginHeaders/CSNotifications.h +++ b/CocoaSplit/PluginHeaders/CSNotifications.h @@ -36,6 +36,9 @@ extern NSString *const CSNotificationInputDeleted; extern NSString *const CSNotificationInputSelected; +extern NSString *const CSNotificationInputAttached; +extern NSString *const CSNotificationInputDetached; + diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index 280482bc..e5b7d6e3 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -46,6 +46,8 @@ @property (strong) NSMutableArray *sourceList; +@property (readonly) NSArray *topLevelSourceList; + @property (strong) NSData *savedSourceListData; @property (assign) bool isActive; diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 95974ebb..fa9021db 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -42,6 +42,10 @@ //self.rootLayer.geometryFlipped = YES; _rootSize = NSMakeSize(_canvas_width, _canvas_height); self.sourceList = [NSMutableArray array]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputAttachEvent:) name:CSNotificationInputAttached object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputAttachEvent:) name:CSNotificationInputDetached object:nil]; + + } @@ -49,6 +53,17 @@ } +-(void)inputAttachEvent:(NSNotification *)notification +{ + InputSource *src = notification.object; + if (src.sourceLayout == self) + { + [self willChangeValueForKey:@"topLevelSourceList"]; + [self didChangeValueForKey:@"topLevelSourceList"]; + } +} + + -(CALayer *)newRootLayer { CALayer *newRoot = [CALayer layer]; @@ -401,6 +416,18 @@ } } + +-(NSArray *)topLevelSourceList +{ + NSPredicate *topLevelPredicate = [NSPredicate predicateWithBlock:^BOOL(InputSource *evaluatedObject, NSDictionary * _Nullable bindings) { + + return !evaluatedObject.parentInput; + }]; + + return [self.sourceList filteredArrayUsingPredicate:topLevelPredicate]; +} + + -(NSArray *)sourceListOrdered { NSArray *mylist; @@ -776,8 +803,9 @@ [self incrementInputRef:src]; - + [self willChangeValueForKey:@"topLevelSourceList"]; [[self mutableArrayValueForKey:@"sourceList" ] addObject:src]; + [self didChangeValueForKey:@"topLevelSourceList"]; [_uuidMap setObject:src forKey:src.uuid]; } @@ -907,7 +935,9 @@ src.refCount = origRefCnt+1; + [self willChangeValueForKey:@"topLevelSourceList"]; [[self mutableArrayValueForKey:@"sourceList" ] addObject:src]; + [self didChangeValueForKey:@"topLevelSourceList"]; [_uuidMap setObject:src forKey:src.uuid]; } @@ -1318,7 +1348,10 @@ [delSource willDelete]; + [self willChangeValueForKey:@"topLevelSourceList"]; [[self mutableArrayValueForKey:@"sourceList" ] removeObject:delSource]; + [self didChangeValueForKey:@"topLevelSourceList"]; + InputSource *uSrc; uSrc = _uuidMap[delSource.uuid]; @@ -1374,8 +1407,10 @@ newSource.sourceLayout = self; newSource.is_live = self.isActive; - + [self willChangeValueForKey:@"topLevelSourceList"]; [[self mutableArrayValueForKey:@"sourceList" ] addObject:newSource]; + [self didChangeValueForKey:@"topLevelSourceList"]; + [self.rootLayer addSublayer:newSource.layer]; @@ -1397,7 +1432,10 @@ self.rootLayer.sublayers = [NSArray array]; @synchronized(self) { + [self willChangeValueForKey:@"topLevelSourceList"]; [self.sourceList removeAllObjects]; + [self didChangeValueForKey:@"topLevelSourceList"]; + } [self.animationList removeAllObjects]; @@ -1606,5 +1644,10 @@ } +-(void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + +} @end diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 54fa328f..ddf07094 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -27,7 +27,7 @@ - + @@ -338,18 +338,18 @@ - - - - + + + + - - - - + + + + @@ -359,7 +359,7 @@ - + @@ -373,7 +373,7 @@ - + @@ -467,7 +467,7 @@ - + @@ -501,7 +501,7 @@ - + @@ -509,7 +509,7 @@ - + @@ -530,7 +530,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - + - + @@ -619,7 +619,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1318,10 +1346,10 @@ - + - - - + @@ -1359,7 +1387,7 @@ - - + - + @@ -1536,9 +1564,9 @@ - + - + @@ -1588,22 +1616,28 @@ + + + + + + - + - + - + @@ -1648,7 +1682,7 @@ - + @@ -1691,7 +1725,9 @@ + + @@ -1717,16 +1753,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -1737,10 +1773,10 @@ - - - - + + + + @@ -1788,6 +1824,11 @@ + + + + + From 5bf7aaefb63bab4e541a293e5a4066b8a7983e48 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 22 May 2016 07:59:23 -0400 Subject: [PATCH 084/156] Input outline view auto-expands items --- CocoaSplit/CaptureController.m | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 778a4fd3..d4406c4a 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2305,6 +2305,22 @@ } } +-(void)outlineView:(NSOutlineView *)outlineView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row +{ + if (outlineView == self.inputOutlineView) + { + + NSTreeNode *node = [outlineView itemAtRow:row]; + InputSource *src = node.representedObject; + if (!src.parentInput) + { + dispatch_async(dispatch_get_main_queue(), ^{ + [outlineView expandItem:nil expandChildren:YES]; + }); + } + } +} + -(void) outlineViewSelectionDidChange:(NSNotification *)notification { From 3253029880f5c2cd5fd07ee037147dec760ae850 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 23 May 2016 04:38:46 -0400 Subject: [PATCH 085/156] Add input lists now have completely unnecessary resizing/transition animations --- CocoaSplit/CAMultiAudioMatrixView.xib | 2 +- ...AMultiAudioMatrixMixerWindowController.xib | 2 +- .../Interface/CSAddInputViewController.h | 2 + .../Interface/CSAddInputViewController.m | 115 ++++++++++++------ .../Interface/CSAddInputViewController.xib | 113 +++++++++++------ CocoaSplit/en.lproj/MainMenu.xib | 54 ++++---- 6 files changed, 188 insertions(+), 100 deletions(-) diff --git a/CocoaSplit/CAMultiAudioMatrixView.xib b/CocoaSplit/CAMultiAudioMatrixView.xib index ff43a4a5..d91fe4ba 100644 --- a/CocoaSplit/CAMultiAudioMatrixView.xib +++ b/CocoaSplit/CAMultiAudioMatrixView.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/Interface/CAMultiAudioMatrixMixerWindowController.xib b/CocoaSplit/Interface/CAMultiAudioMatrixMixerWindowController.xib index a2d3416d..fc41bc62 100644 --- a/CocoaSplit/Interface/CAMultiAudioMatrixMixerWindowController.xib +++ b/CocoaSplit/Interface/CAMultiAudioMatrixMixerWindowController.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/Interface/CSAddInputViewController.h b/CocoaSplit/Interface/CSAddInputViewController.h index 7a131d51..af4d51fc 100644 --- a/CocoaSplit/Interface/CSAddInputViewController.h +++ b/CocoaSplit/Interface/CSAddInputViewController.h @@ -29,6 +29,8 @@ @property (weak) IBOutlet NSTableView *deviceTable; @property (readonly) NSArray *sourceTypes; +@property (weak) IBOutlet NSView *headerView; +@property (strong) IBOutlet NSArrayController *sourceTypesController; - (IBAction)nextViewButton:(id)sender; - (IBAction)previousViewButton:(id)sender; diff --git a/CocoaSplit/Interface/CSAddInputViewController.m b/CocoaSplit/Interface/CSAddInputViewController.m index 4adce8fe..e057d1a4 100644 --- a/CocoaSplit/Interface/CSAddInputViewController.m +++ b/CocoaSplit/Interface/CSAddInputViewController.m @@ -22,56 +22,80 @@ - (void)viewDidLoad { [super viewDidLoad]; + [self switchToInitialView]; + // Do view setup here. } -(void)switchToInputListView { - if (self.initialView && self.initialView.superview) - { - [self.initialView removeFromSuperview]; - } - NSInteger height = [self adjustTableHeight:self.deviceTable]; + NSSize __block newSize; - NSRect vFrame = self.inputListView.frame; - //vFrame.size.height = height; + CATransition *transition = [CATransition animation]; + transition.type = kCATransitionPush; + transition.subtype = kCATransitionFromRight; + self.view.animations = @{@"subviews": transition}; - - [self.view addSubview:self.inputListView - ]; - - - //[self.initialView setFrame:self.view.frame]; - - self.popover.contentSize = self.inputListView.frame.size; + [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull context) { + if (self.initialView && self.initialView.superview) + { + [self.initialView.animator removeFromSuperview]; + } + NSRect lRect = [self.deviceTable rectOfRow:self.deviceTable.numberOfRows - 1]; + + + NSRect vRect = self.inputListView.frame; + newSize = NSMakeSize(vRect.size.width, lRect.origin.y+lRect.size.height+2+self.headerView.frame.size.height); + + vRect.size = newSize; + vRect.origin.y = self.view.frame.size.height/2 - newSize.height/2; + + [self.inputListView setFrame:vRect]; + + [self.view.animator addSubview:self.inputListView]; + + + } completionHandler:^{ + + self.popover.contentSize = newSize; + [self.inputListView setFrameOrigin:NSMakePoint(0,0)]; + }]; } -(void)switchToInitialView { - if (self.inputListView && self.inputListView.superview) - { - [self.inputListView removeFromSuperview]; - } - NSInteger height = [self adjustTableHeight:self.initialTable]; + NSSize __block newSize; - NSLog(@"INITIAL FRAME %@ %@", NSStringFromRect(self.initialView.frame), NSStringFromRect(self.initialTable.frame)); + CATransition *transition = [CATransition animation]; + transition.type = kCATransitionPush; + transition.subtype = kCATransitionFromLeft; + self.view.animations = @{@"subviews": transition}; - NSRect vFrame = self.initialView.frame; - //vFrame.size.height = height; - - NSLog(@"VIEW %@", self.view); - - [self.view addSubview:self.initialView]; - - - //[self.initialView setFrame:self.view.frame]; - - self.popover.contentSize = self.initialView.frame.size; - + [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull context) { + if (self.inputListView && self.inputListView.superview) + { + [self.inputListView.animator removeFromSuperview]; + } + NSRect lRect = [self.initialTable rectOfRow:self.initialTable.numberOfRows - 1]; + + + NSRect vRect = self.initialView.frame; + newSize = NSMakeSize(vRect.size.width, lRect.origin.y+lRect.size.height+2); + + vRect.size = newSize; + vRect.origin.y = self.view.frame.size.height/2 - newSize.height/2; + [self.initialView setFrame:vRect]; + [self.view.animator addSubview:self.initialView]; + + + } completionHandler:^{ + self.popover.contentSize = newSize; + [self.initialView setFrameOrigin:NSMakePoint(0,0)]; + }]; } @@ -85,15 +109,14 @@ height += view.frame.size.height; } - height+=4; + height += 4; + NSScrollView *tSview = (NSScrollView *)table.superview.superview; NSLayoutConstraint *constraint = [tSview constraintForAttribute:NSLayoutAttributeHeight]; [constraint setConstant:height]; -// NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:tSview attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:height]; -// [tSview addConstraint:constraint]; return height; } @@ -162,6 +185,26 @@ } +-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row +{ + if (tableView == self.deviceTable) + { + return [tableView makeViewWithIdentifier:@"deviceTableView" owner:self]; + } else if (tableView == self.initialTable) { + + NSObject *item = [self.sourceTypesController.arrangedObjects objectAtIndex:row]; + if (item.availableVideoDevices && item.availableVideoDevices.count > 0) + { + return [tableView makeViewWithIdentifier:@"initialInputView" owner:self]; + } else { + return [tableView makeViewWithIdentifier:@"initialInputViewNoArrow" owner:self]; + } + } + + return nil; +} + + -(NSArray *)sourceTypes { diff --git a/CocoaSplit/Interface/CSAddInputViewController.xib b/CocoaSplit/Interface/CSAddInputViewController.xib index 34069cbd..9a7d4a64 100644 --- a/CocoaSplit/Interface/CSAddInputViewController.xib +++ b/CocoaSplit/Interface/CSAddInputViewController.xib @@ -8,35 +8,27 @@ + + - + - - + + - - - + + @@ -44,7 +36,7 @@ - + @@ -61,11 +53,11 @@ - - + + - + + + + + @@ -90,7 +87,7 @@ + + + + + + - + + - + - + - - - - + + + + - + - + @@ -134,14 +147,14 @@ - - + + - + + + + + + + + + + + + + + + + + @@ -173,9 +213,12 @@ - + + + + - + diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index ddf07094..e80346bb 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -630,6 +630,19 @@ + + + @@ -756,33 +783,6 @@ - - - From 7c690e9a82c753fe59dda0ae0fba82d0f63ab287 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 29 May 2016 03:34:42 -0400 Subject: [PATCH 086/156] Fix animation dialogs to reference proper layout(s). Preview GL layer: bounce resize dirty flag through main thread so hiding the staging preview results in a not-broken live view --- CocoaSplit/AnimationSamples/rotate.py | 3 ++ .../CSAnimationChooserViewController.xib | 2 +- CocoaSplit/CSAnimationItem.m | 2 +- CocoaSplit/CSPreviewGLLayer.h | 2 ++ CocoaSplit/CSPreviewGLLayer.m | 6 +++- CocoaSplit/CaptureController.m | 5 +-- CocoaSplit/CreateLayoutViewController.xib | 2 +- .../Interface/CSNewOutputWindowController.xib | 4 +-- .../Interface/CompressionSettingsPanel.xib | 4 +-- CocoaSplit/Interface/advancedPrefPanel.xib | 4 +-- CocoaSplit/SourceLayout.m | 32 ++++++++++++++----- CocoaSplit/en.lproj/MainMenu.xib | 8 ++--- 12 files changed, 50 insertions(+), 24 deletions(-) diff --git a/CocoaSplit/AnimationSamples/rotate.py b/CocoaSplit/AnimationSamples/rotate.py index c9e072b1..f1ba123d 100644 --- a/CocoaSplit/AnimationSamples/rotate.py +++ b/CocoaSplit/AnimationSamples/rotate.py @@ -1,3 +1,5 @@ +from Foundation import NSLog + animation_name = "RotateDemo" animation_description = "Rotate demo" @@ -7,6 +9,7 @@ animation_params = ["degrees"] def do_animation(inputs, duration): + NSLog("RUNNING ANIMATION") source1 = inputs['source1'] source2 = inputs['source2'] diff --git a/CocoaSplit/CSAnimationChooserViewController.xib b/CocoaSplit/CSAnimationChooserViewController.xib index ac0ec168..e0a15845 100644 --- a/CocoaSplit/CSAnimationChooserViewController.xib +++ b/CocoaSplit/CSAnimationChooserViewController.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/CSAnimationItem.m b/CocoaSplit/CSAnimationItem.m index a0b887d6..57ea826e 100644 --- a/CocoaSplit/CSAnimationItem.m +++ b/CocoaSplit/CSAnimationItem.m @@ -47,7 +47,7 @@ { InputSource *inp = item[@"value"]; item[@"savedUUID"] = inp.uuid; - item[@"value"] = [NSNull null]; + //item[@"value"] = [NSNull null]; } } } diff --git a/CocoaSplit/CSPreviewGLLayer.h b/CocoaSplit/CSPreviewGLLayer.h index 981e6531..9b86711c 100644 --- a/CocoaSplit/CSPreviewGLLayer.h +++ b/CocoaSplit/CSPreviewGLLayer.h @@ -39,6 +39,7 @@ @property (assign) float snap_x; @property (assign) bool doRender; @property (assign) bool midiActive; +@property (assign) bool resizeDirty; -(NSPoint)realPointforWindowPoint:(NSPoint)winPoint; @@ -46,4 +47,5 @@ + @end diff --git a/CocoaSplit/CSPreviewGLLayer.m b/CocoaSplit/CSPreviewGLLayer.m index 2f560eb4..8be0b262 100644 --- a/CocoaSplit/CSPreviewGLLayer.m +++ b/CocoaSplit/CSPreviewGLLayer.m @@ -342,11 +342,15 @@ -(void)setBounds:(CGRect)bounds { - _resizeDirty = YES; + dispatch_async(dispatch_get_main_queue(), ^{ + self.resizeDirty = YES; + + }); [super setBounds:bounds]; } + -(BOOL)isAsynchronous { return YES; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index d4406c4a..7456d548 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -334,7 +334,7 @@ if (tableView.tag == 0) { - layout = self.stagingPreviewView.sourceLayout; + layout = self.activePreviewView.sourceLayout; } else { layout = self.livePreviewView.sourceLayout; } @@ -354,6 +354,8 @@ retView = [tableView makeViewWithIdentifier:@"LabelCellView" owner:self]; } else if ([tableColumn.identifier isEqualToString:@"value"]) { + NSLog(@"MY INPUT MAP %@", inputmap); + if ([inputmap[@"type"] isEqualToString:@"param"]) { retView = [tableView makeViewWithIdentifier:@"InputParamView" owner:self]; @@ -3526,7 +3528,6 @@ self.livePreviewView.midiActive = NO; self.activePreviewView = self.livePreviewView; self.stagingHidden = YES; - } -(void) showStagingView diff --git a/CocoaSplit/CreateLayoutViewController.xib b/CocoaSplit/CreateLayoutViewController.xib index 3504526f..7c216821 100644 --- a/CocoaSplit/CreateLayoutViewController.xib +++ b/CocoaSplit/CreateLayoutViewController.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.xib b/CocoaSplit/Interface/CSNewOutputWindowController.xib index 81902110..d51ef4b8 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.xib +++ b/CocoaSplit/Interface/CSNewOutputWindowController.xib @@ -1,5 +1,5 @@ - + @@ -15,7 +15,7 @@ - + diff --git a/CocoaSplit/Interface/CompressionSettingsPanel.xib b/CocoaSplit/Interface/CompressionSettingsPanel.xib index 5f74bbef..4b8a3af8 100644 --- a/CocoaSplit/Interface/CompressionSettingsPanel.xib +++ b/CocoaSplit/Interface/CompressionSettingsPanel.xib @@ -1,5 +1,5 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/CocoaSplit/Interface/advancedPrefPanel.xib b/CocoaSplit/Interface/advancedPrefPanel.xib index e9764b69..3c112795 100644 --- a/CocoaSplit/Interface/advancedPrefPanel.xib +++ b/CocoaSplit/Interface/advancedPrefPanel.xib @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ - + diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index fa9021db..2bcd2d59 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -150,10 +150,14 @@ -(void)setAnimationIndexes:(NSIndexSet *)animationIndexes { + NSLog(@"SET ANIMATION INDEXES %@", self); _animationIndexes = animationIndexes; NSUInteger firstIndex = animationIndexes.firstIndex; + NSLog(@"FIRST INDEX %lu COUNT %lu", (unsigned long)firstIndex, self.animationList.count); + if (firstIndex < self.animationList.count) { + NSLog(@"SET SELECTED ANIMATION"); self.selectedAnimation = [self.animationList objectAtIndex:firstIndex]; } } @@ -191,6 +195,7 @@ } NSMutableDictionary *inputMap = [NSMutableDictionary dictionary]; + for (NSDictionary *item in animation.inputs) { @@ -198,14 +203,22 @@ { if ([item[@"type"] isEqualToString:@"input"]) { - NSString *suuid = item[@"savedUUID"]; - if (suuid && ![suuid isEqualTo:[NSNull null]]) + InputSource *nSrc = item[@"value"]; + + if ([nSrc isEqualTo:[NSNull null]]) { - InputSource *nSrc = [self inputForUUID:suuid]; - if (nSrc) - { - inputMap[item[@"label"]] = nSrc; - } + nSrc = nil; + } + + NSString *suuid = item[@"savedUUID"]; + if (!nSrc && suuid && ![suuid isEqualTo:[NSNull null]]) + { + nSrc = [self inputForUUID:suuid]; + } + + if (nSrc) + { + inputMap[item[@"label"]] = nSrc; } } else { inputMap[item[@"label"]] = item[@"value"]; @@ -218,7 +231,7 @@ NSDictionary *animMap = @{@"moduleName": animation.module_name, @"inputs": inputMap, @"rootLayer": self.rootLayer}; //[self doAnimation:animMap]; - + NSThread *runThread = [[NSThread alloc] initWithTarget:self selector:@selector(doAnimation:) object:animMap]; [runThread start]; @@ -292,6 +305,9 @@ { CSAnimationItem *newItem = [[CSAnimationItem alloc] initWithDictionary:animation moduleName:animation[@"module"]]; [[self mutableArrayValueForKey:@"animationList"] addObject:newItem]; + + + } diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index e80346bb..446bf117 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1485,9 +1485,9 @@

    ; zdx5=^y~y6v-rHVkpJ=bQ`|XYPW_!qfr+u+~iG8Vknf)I7R{OK|ZT21Zo%UV!FYKr7 zXYD`Rf3^Q^zv#dYyCchy?eI9fjzUMVV}zs1G15`vxWO^e(dwA%xXD2rw>TbjJnVSH zvD&fLvD2~3@w(%E$G;qV9X~jJa-4RYb^PM^Eh{n0l$DiLnAJV2BC9g1I%{gyw5+DA z=~>~dIa!Od?#jA5YkAg+to2!&vvy~Fko8H{4_QBDoyqz+>(}gwmCa9+nOz8 zmuFASZppqmTg;x9eQWlD?1kBPX5W+jSoY)DPi8-xy(jxX_L=Oza~wJOIfHYC=LB+^ zb8gSMFXx4v*K^*?c`N6gocD4*$k~(gVb0l{^SQd*%v@WpBR3~EFV~sdFLz{aO>SK- z$-O0ae(r6#x98rGyC`=G|ROmi#68tMhl{@66wo|3>~>`S0expMO06TPN#`acZ1# z&P1oqndEdkdpQR=KXC4Ke&qbvdBAzddBpjN^Hb*u=jYBZohO~&IKOkAa{lN%?L6!J z#rd1_ob!V7Pv_sxi!SVJzc$BrLKOi0j@!=GS~I4A+DjW;jU`e1XrzVnrnvZPuJhB zix9)oZq^;+*0|%`32v=h=T34P+^KGpJKde(wzzF>hdbMy>&|z(+`LpFhYS=8y89@+bIjJ)GIW+_Ta1lxM4F zo9B7YOP(E`*F0}{-txTb`M|T+v(IzDbJ+8V=eXx{&sUyrJl}hM^qleh;`!Zk!Sk2r zqCg3(pcdkUL_sGc3#meykRezFhma%W3vNLW3WZ{!i_l%@C6o&Ng+an~!VqDYP$`TO z#tP$wT4AE#7bXi+g+^hz5D{hyHwtqFBFqzR6BY`Kgu8^hh2_Eu;XdJh;X&bHVU@5( zSSM@{9uuArHVT`CEy7meS>ZY1dErIjWnqV~Q`jZEA?z037Ty)!7yc#e6+RL^77hr9 zgd@Ty!l%Ls;d9|j;iT}5@SSi<_)$15oE3f%eiP0K7lc2BzlDol?4`Y|H^!^+#(5LG zTCdKV4vPcZxUcUFv;AIlG~xn_2Kr MWmo>T{r0Z@e?!^`nE(I) diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib index fdd831fe3fc0f0ceaab1e32f7f712a851648e258..b85d061738e41486d5a68683be26a46d1d47855d 100644 GIT binary patch delta 6359 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 IPydYn0yg6=MgRZ+ delta 6569 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 diff --git a/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib index ab314151b74633959efbe36298bbaf253280c61f..5ce8b5ffc721f9270e6bd9797f54f48dda64e18b 100644 GIT binary patch literal 16748 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 L>i_P)MOFU;L#i=b literal 15572 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 KcgxR$#{UQB+A8h< diff --git a/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib index 03d5c26b96e12ddb5864fe6854f644f86a707718..fc3a83ce1a9371b0f908e101b2d3e2296838e156 100644 GIT binary patch delta 6249 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 delta 6392 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 NEb^pxQTUB({2x}FK$8Ff diff --git a/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings index 38bb70dd077a32ecd7c70e465d06efb06b38ef84..949fb16ef581590fe705483512d69812b8d44c4a 100644 GIT binary patch delta 463 zcmZoMZnN0%i8WZCL5o3w!G$4}p_n0=p@<=qp@5+TNai!-0mVyz;uSzrfguejQUs)f z8A5@ufFXq;5iIM-kONdx1XfedkO5@pO+L>nshSBiPXVYZpP?LRQVx(#1nWrxtJed{ zX))+;e$Q&iNGm5yj^Py3O$1t}0CYko(1961RvyqHn9hPaXYza2Vt-CrAPsx0F(#m0m*`Nlmp2m2K&kVtg@5;v05=3GpI~9XVdnj Qs`;Bm*$)d&wvhAz03AtPn*aa+ delta 33 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 SNQSoN@P}Cz{cim4Uig2IIbApa delta 3949 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 I@a=r^e{Dopp8x;= diff --git a/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib index 8efac43791c9bffa6c9d57791f610c4b84c40b27..b3ff81800f2f56af6883631fde023abb3f6bfa12 100644 GIT binary patch literal 16660 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 literal 15484 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 diff --git a/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib index bf9eccdeabfa8fbe1e61f84c9d84ffa73b6bb74c..02738220fcc84ffc9dacdc832d884e424e89221e 100644 GIT binary patch delta 6364 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 delta 6486 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 diff --git a/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings index 889a6583e1f7ad676dfdebbb2ba680c97ddd2a70..c1ce5a04ef8b34a40093dfe3f0e194d24eb4f6c0 100644 GIT binary patch delta 460 zcmZ2yI>CB_1Y5p7gBF7Vg9}3{Loq`#LlHwJLjgkxkj!Vu1B#ab#VdfM0z(>5qzFg{ zGlT+R0YeHyB3RauAqS|Y2&|@@Ap^*U=mW777)p^;DgaF_o*c+7%%8}R1lFYoRH4P7 zKiQvEe6tRl0%J4{9W%L{Q(ZU_XsrT6InW^`K&L7Ioth7F5Id4XChM@p_=3EY2=o-l zE4g5ggFFLrc0SNcpx^-M2YLs{LiHjn*dX372bz;K@vP!xH8u-oV+NJUv25DZHGH!p Hd#*45v*1|b delta 20 ccmbPWz0P!l1l#0E90ikQ*pF=1<4O_+08cpv^Z)<= diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib index d3e0f38e7b5416b750df8f96f44b1c4b27038f57..84a4996a75c051c484b59c1ae383feb84e77b100 100644 GIT binary patch delta 4154 zcma)8d3+RA60Yh@_jLDk_w)^fh>=S}5ONrz$d$uDK*Es-#4L$JGLV7E3``~@qJl(>$O5~%UaO+(dLN5``(_5B^4mX5|B_6L@k9I!|BavHxA+}?j~DPF{!Hmq7pg0jNDZXMLN!#uf2moN zAHJe$r~nnDW>a&h5LHWsDZ3QAI`5?BQwymjPloYL#EJH(gu&fZD1ebL3JPH~jDcHW zEEK^w7!RtwA>kT#1x$lV64eXSVG2~+2NKF7T2XO9$W!CZsS5{dJ#)Q9v9-dYGl z9n7_zboS(8t3*NQfK*~@fFTdVJZOX_XoePOg@`3v$yS<`WevCTtwL+!8JG`u!2+^3 z01IIeiMAM)z*1NS%V7nSk!KaGhH@yk@1g7Db#VQ5xCicq`(QoX4-eRh%-O5A66bBO z9Ug`quoHH{Zg>P9CC_s5`#Ai`?&+M|dDu^!3Tr$wym?-~zl|&$fRstZgS^GJya)#` zZ<*xt)^CFs;jeHAUb4He*Yx^zhI8O$lHn`xDuH)2mR~!mdbwT3j_P;AP1*gE)3aMz zPQg|}pbBro33w}((@DbNDL4&h;O|fhZ`;S%@$P@ZyYL>_^*($6AHu)v{#;6qIUr~D zY`?d7UTxT0b6a5n5kYRyUlj-W37jRMqib8>6G(ZB_C=xn5w{JrsPA8mfjeYT2SdJ;! zFIs-Qo)mwxE44V208Gz_0!$x7WRRKB(sFxKMpjz?Rf0r%G^S6t?2fqi8$Rf%kDtbX}IC z%M-+S!N%hRQkC4ga5!F-tvEhjtGKxsOQu{lZ^Pm%YV(_9Ba?9QZ?m;>tP!l0Z4LXS zI+J+0rj8mi0ivK(pa86Kq!Ev`ZY9_0}<_7PUpU&meChV)GDdm;|bcS$!nTEb<-=nM|f# zG*0v|Uu^mXV8ENu*{$(DtGjiTRYcTQT<;54R;PC01EAsteDHF+jka-XyfvY7OI)Ix zaI^ihyKCO2OHCZNU|TsEk#*tdxXcNKJoDPf+Ez#*oh|lyd()t3mD95_T4EvK5I)=% z>*2S{h4w0{Tgjv*@@-6uTk$b`JT^7rv$(`tGu!V8d$-_YWHQvp=5rj#6Zm9oW*7OU zjjId$ydLv8p3K4pI?ckkT{IzEGY$yB7Qa;u`u7nes-uzqkn$aDC-Jy1zZ zcn#Z|{|$x_x?Y3fFanQZI}yck zT#IjD2f3G=sF0KFya*|M6Ha0dTwPf)u%+wctj z15#|iTAuJ8zHc8>6VudF(Fq9+oFpWsMn zXaj#`n|H}}4u2xHBifKu3MlPyS)~wiN#~qLE(wifkT#*4^t`^%f|H;XXOawC@eMm& z@22MvN(zXy$B@M8JBZd)%CO7z#6erBZn4V8?kH6ESX9u-6OUU);+BycOBuPdl#yFY z8M(KVLBxJczxw8U(zFT*(Ig(Z-%x2$-|nFQE=;VE%5`G0hZu=WQOw=G!^m(@)s)X( zYxqas1w%Gl6XW3*QQGF{QREUrEv1$brVDe&O`A#7lkW+8wopqUB{o;bc;|Vmazd5W zzPa8|2X!~K5~`_H_9$~-aFgdZJ@Lv~!{xYjY$QR0~6XmxCGJmom-IPQ4I@u}k? z4KzhNXohBKo)&14cGC*2(FWax?nd{Zlj)vxZ+bXAf-a;>Xdm4~FQV7d8|aPnCi)?| zjowZ_PVc8*pbyfA=)?3Y^bz_sx}E-kzQ{1lwGk$h8O{_kCCnsd3RB9IF;kfe#=}%G zUS>KIWSW^)#$x6(3z$XB5@s2*ojJ&yVSaF?I&XDWIu|%sJJ&lmJ9j&ubnbT^bslrR z?tH`9;XL6y?fl63HH&NlOS4Ya&GusZv%}eZb}U=U-oegbXS2=hVs;H1S)zh{4B&#~v(pE=+XxtqB{u9%y_)p8A7BiGEeauzqATfi;l9^fA0c5!>Secbch z0q#Za4EF)|Dfb2M;AQ?QK9$epv-oWOCjMrAD4)+y;LG{xe3+lhH}H4zOZk<28^4Wz znBU3o=J!YVqkKDmoIlNf#((QV7ws~b;2&;IpKBT zJ>g5?YvCv1g7CBG5E+pbc~KB0F`|f?I6xdO=8E}ZfjC(#70bk_Vue^O)`_j+VsW*& zL3}|xC>|1D5?>Zy6_1L?#CGvxDM{)fB}+Y}-cn!bI;o$OC*2~=l>Aaa3QBXNTB%N| zml~us(qZWp>4@~2)Gi&DI;0cQN7Bb`*3G*Gx9E1em55t&>+b8_)7@eBJa?13#XaA> zz`e-5#J$YD!oAYHT2|y9aGE~V|#wu0HETvIduH3DxQr0N8vPs#Yyr8_SoK!wm&MKcNk<`7o3Cxq9@UO$uW9Ytajio;p`FyuYTxLxuIjpO>Rt6jJxR~f zN9yDCdVO9*Z_-=zh<>Mjm%dP6tS{A<>v!v`^fkJz-=p8B->+}bH|pE<9r`Z)8U025 zu>QLKz5b(qPCu_-G{B$?hrt-E!5e}h8M2`ox?vh!jYK2K=wp-{cNo)*Dr34)ZOklnPz5~H<*LW8_mJy w5ObJ0(i~-uHjB*?bCOwM2FzM>p}ErBZSIZVkSTJ>i2hKkUnaRwKv>-;RJx~ht0hD)Xq0rJcwUk0F2&8Q&Dd~eWZQ+*Q zj7LC0uoPZ|Ww0Dpz)P?aUV}}r z8MeT7*adsxARK~E;7j-l{u91~@8Jjd8GeP|;RXV-$fFGx_H zl)^-~!g!fVxX4Und`uNn&D1cp%yh=j=mpp*>M3UK)&QPD9HVDN4T!eE2p9=jkPV|C z2XY|~?BIfYcuZdr^>9=XlcH= zEYm+(@5gmkrh*qLsgG$;1XWNCHBhU2xzuq*+E^LkBy^`^ei-yB)Ik91p#d6U2F%nX z&8a17eY7+!Q_IoDd=9gq8UCHxPK6+7)Z3HrM|cWm!yK3k#q^m6^PvPv^k2DpX(9Aj z2mb+!U@<%oI{ZnWWw`LrDmwXPSPid03$(%-SPSdmRr<`K?a#15pUsamJE=_@ybc@T z4gCtAI$K=4tR6Ct1!FDUEvw#@%dV5 z$4=-rmd>F6A||`xt#*^KUQgp%*bQ&PJFrKeV|+OF?x?20J{r}#@E(Pfmk0kwXJz{I>mCo$+XdHw;vZa&OTYGep6#GA=XSAoH-skq;f{&dk@u7V{cL6?xPMCvTP>2ml2IHt; zelmA2?AM>_B{>8+DfBZXxw*NdDY;K#f-|*GV)I$-4y!N$dtgskgT1JtTB*y!n21T3 z49749#$q4ri>c6n{c!*e#6dV%pKjS3Y>#6orbpt4zZD0ohT^yrXeN%h$3T)o;|118 zQgbkuW-g;X5U8n+A`~wSlx;4b$VqhvUQh`W|EzIF%x+j39$r zDABUC5k_sKK3(iEI+-H+f261`jA8~h+=XHkMUkmx>&M0D`>M;6I18I8hA=l_1bJGn zZn4D%?-K*gxlayrsT}HX9?plExB#D{t0`0vi=J>5x@!DYZeO_m*|P=}0HtA+9T)(u zfR^oi&7}?2QY5;8hvmA<%iT_QJ*}hefVXa1z*+4nch;0mb$WxI%2t>2*%=yQ>1;a!+;7Q*gUL;}Wf-_MjG0Mq#5jP&V}>z6f?)hRfTF zt;=2I(MD^9cPv5`8&~40Ns`j8r!exI!bn-imAA?|uEtj;x(f5^1MX6vC*ALN&upcA zEzpftxbWYSroR1?sfzj}H%H3mJGizrT-CQq*+~(NZ@|~WhsQW?b$LzW7*AELkA~HP z8|VSi819SMZNxY9JUKdQBW}{Ya!0-aRNRK!^=IW6=T6);Ng|YIZ|Sf|y`*2&^t`R{ zx8hFR9iGrgC+wjU&dW|=2K~Jsw`-ZYWRH2^0HncCJcx&A;tt~?Jc38@7#`Qt?Y-3; zty1%76`EJ0+?}M`zXVU~^X#3X&fq8ddi#UUPw_M8Hc9H>DlDq=_=kI@xa)m^x?3=4 zw)8{xiBae9OTD`ill>La!=fE(291tp?>1D*Wh8(I@=st0P1PN2^&xB&_qTYSVrx(a z--SDHYwQR72OT@4^tx-T?$+2p@fsbI)Ir_xUyS^QWXGG3L91aMy&weWfm)A7TE`xO zMjQ<@u!3?i3yW0pOfNCT^cqu4FEYh26I6|%k3b8MM4OYgMB4h$mX=0e znY86l1G+xF3o$)IZaY#o{x>nWNcSFh$6(Z+&?al8TDdk&tJbEs`^*jdWbzo7-a?Y~ zPl>O`lQ3wtHYT#BVz!bEuzzG1vMuZyb{)H(-N3f78`(G5&FofoJNqX4 zHoJ%2$G*p&WzVta*()5+MRSjEiClkfAUBvx#w_da)mJIkHtu5dqdzXZ8oxog~Y?gn?$z!;(otifuCF?2F?HaHDk438M%3|$Sw z4U-Ks3`-0L4HtRjyYM~vzWfkAn=jxe@LqlzU&Yt(wY;BiW6Ltw73de*K!YScn z;S=FA;Va=g;Wrawl1z4!YI@N0s43o*W=b~=Gi91ano3L+rb?5~RBw9Pw8*qFXj*65 zVtU8)wdrrBZ%yY-7fhE--E&G`q|N=0bCkxyiiRyv@AB zywkkP{FeD0^Ir42=KbdP&F9P)ES)VWmUPQFi`O#Cve2^9^0H;UWrL;7ve~lLvfc8g zWtZhG%O1-<%NLf*maCS3T7I(xf45q#4r>Q%jJ1=sv-JxE&3fH>!+KLhF-Ghpri;VGOmT#mC5{qvMVFW_ zP8I9K_2LGxP24DM61Rxk#2w-R@t}B7yexh%{viG+{v=)%e+k-bwk+FN+j!d(wn?^f z+Z5YWTcyostG3nJ{I;F8_iZ2A4%$Alowl8|U9erUeP{c{c2go!j1(&+OZ}yEDOW0z zCP?*?Cbdd!(q3u5^pSL0x+GnZQMSvf?2tRiF>;*TOCBk^3acneqLQriR{ARalmW^hrAVnzW-D`*XO#KM0%f7HNNH7GR}LwMm7~gW<)m_2 zIivibqH0o;)D*Rkni^F5s{_@+YMPp^4pTGLk!rS@qvomkYJpm)7OCUZ$!e)uuKLv` zRa57wo764pHg$)(Q{An;t?p6xsqd-#)eqDI>LK;8dQ?5Go>Wh(XVfoA2NFX%k za`F;cMOKp*vWBc9>&XVvMmCa7WDD6wc95N9H+h@vA^XUCWIy?U93Y3tVRDolCnw2i yaz=l=W0wIAbTAIqVReWO$r0`7>geG}b7VO@j=IQglc6_^(1%$V`EGwZ>i-J|4ua1B diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib index e42a612c72e255873dc16357c27773f22038f96b..a89378cb0febecd1d4779af45e22d6e86f299c8c 100644 GIT binary patch literal 16723 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 literal 15478 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 F{{cw%CKLbw diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib index c5e0a9b72b77859579641d25184f347059080ece..d2abca1ec4dbfac1967d8842b680428b71a94aaf 100644 GIT binary patch delta 6409 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 Fe*jKHDO>;m delta 6718 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 QMU{S-<+10JJOAGQ01AGJasU7T diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings index fbebf966f32327211203eeb62720a930f9fb1088..e65ac55916230e88d83954d796de62b90c9803a1 100644 GIT binary patch delta 731 zcmcIiyGjE=6g}g*iAKbr5Mv>1G)5AMK~kuQFHo>BRqz9L^B}?O8nOw|MiGBN8L+bT z17xw&+DgPfun@mMtVBGs5g*tp!_M5jkHfk5p4aU2{P9bF1&^@Ngvrm9ePU1Bf$bfN z>n_psmb+&}K7$kttf2%K1vF4aow-%)z@fiM|1NI>WqKNX^Vs64qv&Inu!sXQGfglW2XL zn!&iLQBhUV=53wa#^k;}r)3eBm-^J-g3F`8Z17{W-c4Y!C+kofYNHdFK^!ZzTx^qd z&EJpuQ@T-`HT_L0<%|!U3;8h8tU|KpumbWzcrj6u@WBx!^b5bSu s;iTM*MCED32!8iHMG_+I^$#b7OzB~7EqW%RIo2qCN*hXj38SNdcNRmN(f|Me delta 322 zcmexj`Nw#|H_;r1M1~X~Ok^lwC}vP#$YV%lNSVycSh=~0aTgO~-ey}CL&nK9EFzPC zvByjp5pykN6nDmHKBwB?vA$HO6>&yWkW zssw0d5s*}1P-QS=P+@S`tSYpWkv*8<8$&ij>g0>U7lnP`ZYzSjOi)~NGLJ~oW((1O z%=%71#ULrD2|!jN&`~7}AR9m)$^_bz4Ys2gWb9;LN$trKBo$a;Jl)BUBvlv{HnU4< wGIHlJR01`D9F{uSUPyd%h;#>|j1Mq4K<>-~n(YfTw+P5rQ&3{CX5eA~0IFzBHUIzs diff --git a/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib index f8be0badadba4122699686e2962fd2e802d43327..f16caf04fa0789a405a5a9d21eb320daf2f44705 100644 GIT binary patch delta 3837 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 diff --git a/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib index 51b92de67c18a8a4df789b55748b24f32c494e78..31295fc38caec4f8c9a162ab9efb7cbfd9affdde 100644 GIT binary patch literal 16665 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 YkNQt(TR99pi~v8vrP}|Fzy9C<2gnjDVgLXD literal 15489 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 diff --git a/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib index a02033da2ee8e9dd51e96abbc555143baa5ac4c6..6f575498dfa5d2571b51f6d5f6cf6c2cc13326e2 100644 GIT binary patch delta 6244 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 SQ0TZwKg{aL^W{CZ^S=QCB^Y4< diff --git a/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings index 323bb70feb0c74f4bf25201586984df03b1491e8..fc728fd554695c0f04861bce32d3fc4961fed783 100644 GIT binary patch delta 436 zcmb_Y!3qIU6g|>IQWiAIYKYA!7B*yoVqq~WSz5edGzz1c5x=4LBg)ps2lxSB;4_>z zNj^Zg?z^4)?mg$+XZO~>WW=Ne3noTz5n_P=YwQs*``8hWh@Y5EtcV1BrS!i8_7$^Qur#2a*AW3B6NZAoQRy+7wLi$6k zga~adQ&On5wT;cVth7iUhuET?rFf!;AA{!i6dpHd78lO>QBj8IB-^MdTQuf>U5-Ag R=poCfqK<*Ka&=NC;|=8ZR^9*r delta 25 hcmdmEf6H~P4dn?_bk8jyXW3{ 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 delta 3971 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 P?cj%+7yi9^cOCpE4cAkD diff --git a/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib index 6d4963c25c665f9b099d749a8868c79687af120b..cc72ff88c89e012d9e101614eba12ecf768bd658 100644 GIT binary patch literal 16670 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 literal 15492 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 diff --git a/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib b/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib index 79dabd938ec676300268249d5c1274574d05ad4a..aa2c54debab83ed53f972ed043a21abc09393441 100644 GIT binary patch delta 6735 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 GSNu0j(O0$r delta 6748 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 Da(kpo diff --git a/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings index ccc268fd90adcf85a343d2edcafc7c38064a3cf1..c41e3dba0ea2936072ebf80b28bebc3ec8448a9a 100644 GIT binary patch delta 626 zcmcJNPfo%>6vn@nq)l{zhCnoE9E?W601G!JE}#hu6XQY~4p5*J8i(G8b^+ zUXyOU1V?b^6*QXo4Q1g0G?TV(=6nBsZ~AFHoxHs3#UWfc=%9=MefYS8z=XDsF?!Sl zEf3dl<(r=06;y^ibLgw=0Ya*6?tSh%)I3b$5B)S{S5e|ogDFOIP(tFY$_R$JxaC{m za*@(TlWV{v&Rn&a(q)|TiO{9pm*1=FDG#IRG?RAFnmbe|mr#u@<6Qf%nlfC@WfH`Q z93i_AqzKrDxu`EKV|1n(cG$84?9H*%{8Xm_r>Q_xC;@1Vf1#>LCPPt}3fDzT&WwV* zFpkVa?4XXybhc;zX#v!*jpO*iJXlF5my;m62<1&KitB5Qlzh!@#E`S nw^h^3GD!lI<+I4{H~G(8k;f-#kB{K)i#%;o_$a6%SmOEtjK6{! delta 143 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 A!Toh^E(w9eFhF8BLI@)ygd~JX0){v( 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 diff --git a/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib index e122413b8ff0fa69816c0c919209789787881c84..1a77ccfc5d9b8a1ae3f243679f923e37416152dd 100644 GIT binary patch literal 16817 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 SLeY~Zy_jY3?}yK%)c*l&A3y^D delta 6628 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 diff --git a/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib index 43c911310377b1a37d1bf1ce5b1bf8dacba6bdbd..d4e07287a0da1cda9d9f48a258c07ab6c960a02f 100644 GIT binary patch delta 4451 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 XF|DJ25Ey#A3cr~7(a+oOF%SI@^K}Jc delta 4449 zcmb7G3wTV|7GCQ-X6DS}oHKLIP7x%fMF>qoM3o|5iARulqzNLDiG)cejmd*xw&$hP z>$F<5N`xw^>ebS!SG8ABS5UN7rTTO|TiR;5ch5{vzWd$p-kEQbnSK7f_xk^T?X}nC zwo4P{hw*c{c?;?`^DhN6SReu#!(-4KT0tCigzk_7x!{I87zNKlB|Hy{;3aq&7Q+%) z3a`McunsoD+pr0?!gkmN2jCMp31{JJ_y#V)Ww-*rz_0Kp+(tkF&8VP?k6?XlfXy%p zo8!~i3A`tgjO15 z+&(3Xj-%J!xM$_;Z*5 z6JZj==7S$7TWvB-fvGSJro#+KXYX0?9ArR-@vB&>&V`n%VIItf1+Wkdc)^%p`Y~b| zoBSFqhZRr-E1?=z!D@J&y{EI!8?e@xW*%aTWSI5vCTxJWjO*rvp_^e#ma3+tbuAt1 z^A@JM$9hXka@y204Aq?9DI^SdydKJQ*Dsn=oBO1%y>%bubhI@@Hs<$0bjxy_{vx!MfHwsmE`u6xqSsW z*(vT)cQ^OgG08B;xZclDN*=jb-2b5-M*d@nT;4Sjs z6C6b}F~RTQSD_dZ9HLG?kVQeg(Sp*0deb->YoSlDY?h@gHLS8SHYPqgvR&-N=*Y@8 z@o~|Stz-X#4}LhpviB%zca31#+lscPO=t^hI}WvuU>&TB_28?w|g23x=~jK-GO3aar5mQgF&l7}z`V=)enU~3qR@z@pdbV_RapgJUU~S5Rc}yJOn+!<37>u*y90!ss^49aD+_ljeVGNiKRZDwnfvc6lE)Mo6|lZmGTJ@h zyOK6A$z9+pNbB0NPr;~s-+=J{<{^vg8aAdoqxw z|G(!IL0T19`4?J!7_FYPcYs!IN=wJA$pKdVPd#*!CgWtB!a}?sUq6~+{3tihd??fK zxrcIXHp{gNoQv~d94^3xY-f!L`r@#Zv=nbiVYVk&TU|*V1_0Bzj|(^en#Qh#0kpp{ zN{R5_E7`b&hSLT#l_g7Bd4Vq{zXo3g7cRrs?v~$_>_RskNC(|V1Zp@|;mRykyPIOc z{nA2p9;<5WJg&mk!&B1wmin?sdfZ(~O0vhTWMi*GR01n{!QUB`?8amI$Hz?!Rnncf zc4eT>LsXW^++ojRg6FYK8}_xG(NT?y4IPHJaAWY28B$P`>n$JXE-dzB``lId7Q0Bw zgJU7wX53=zR_pScajWsA8va-r=(rtsuuGDoBWQMJLD5)Ww#Sp=EpH#1uoFKp!kzW_ zowzG7A-9}O*vBSxViR&`_ORLseb{a#?T^FL&Q^~7)SJ2tw^Ri_=Z zA*EnsS8q`fYdpLq564p)h=&oli2uYBtOk1+i6ZKyqm3J`*v9wc_SNEk!5a)08N@wH zOBgO$Yy217*jn6eyu)y65a*+%3^z}U_48cVTdIo_Adywyv8*5QvHQCeEv#-vKslyD z1$vl7ld*=DQ;F3emDXjOHDZCqG2hxTD-xN`y;wf?V``170hZ2O9cV-=sKAaum*Qd% zyRZWnTu7zYx%yRsvEfrL#sVowZWw%*}KdXN=M#p6bc= z@5|(1yRfE2p6|dv z&3EP#`EGmWgICFb*qPeemka>i; z(CjroYaVO%naj+T=9%V~%!|!S&99nQnYWwwnopQNH-BTkV!mm>XUr1-93(_^|j@4w;T z)>hW8*6!Ax)?{mM>u~EBYmv3sI?g)V`hso%ILnPu7dpOV%saYu4*F zn=RVb$`)gbv$e6cwY9S)+fr?VY(s3%*!;F?+q^?S*z~Uua)pUuj=&-(cTp-)euyzTN(weW!hweXspP`!V|k`z8BT`*r&- zeuwCg9je3S&>dlp2uHLd-jV3&?HK6Da!hl~aLjbfa?Ex-@0jOU;8^Hb=h)`B=(yy# z;<)Dc*>S`1tK)ZBkcr$-j+7h8ZRECcraVl}l1IoR^ORNJZ@)j{eAb*ef?eNC-a*Qs07 zgKCX>PQ9-FqTW=0Q*SvUTD~?~^Jqm{u{KqEUR$fJ*EVPywN2UA81f`3AwE(@D#&;;flMNlOd-?A3^J2E zN9K^ZWIkC)ULcFe%VY_8g)Ae>NfoIktH~O&maHcm$VRe>Y$4moyJQD>pL{@elfC3a z@)7wv`Gg!IpOSx&E;Zyh`HY+*=g4_-fm|Y&$yM@um?g{+77^Agtb15msA=a|FBN!k MM(F?DzhQ&^4HKXBe*gdg diff --git a/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib b/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib index f0216d0a0e811f25d1dd5c4b008c137f472883f4..0bf6286372de176731a07b280f0260f0f638c33d 100644 GIT binary patch literal 16513 zcmd5@cYG8@`=8mC+@d$FJ>AlOg=1!*cGqAyY`*zxzwZW02B{(kRYzw9T;-R{ghGf(|K&&*D3 zZtw+LT&{fxBL=aELp&0Mc|zN`v{~Lj(C2R&m*$^(jkmTXI6lo2sGaVE+ZAao{^n?e z7q5Owhl3~tg`yN>MQJD-Igo^k(HP`KO~{X0&?2-1-HKMAC(x7V1@v$9655JhM{l4V z=q>a%dJpYJ@1uR_AUcFTMaR*3^b`6WGg!bOI21?YBy7UT*orf74$j3+EaC3B2kwoB z;$e6sF2@zP5>LS%JPluiXW#}r6VJyB@IrheUV?AJEAZ|34tytGh1cRo@U!?iycxfW zU&FibTlhV^8z09f@frL*6T-wZMkawtWRe&Ylgy+rX2!y#GFB#yNoO)p2$RWVF%Bk= z$!B^q{g?qv5i^Jx%#32jFyolXOdWF#GlQAQv@osAJf@9Vz+BJVz}(0zVOB6JnfsVE z%)`v%%+t)jnCF=1nU|QCnXSw_%)88c%x>mmW$+t_>92if)PM)pbeIrc^NRdzf3 z7Q36>%N}5lvR|-YvuD^J*k9NS9LH%m9T&?bauzO=%i?TYHkZRWI49SQ>(2G!dUO4` zLEK<&I5&c;N8xXD}%H-)R?8o4IU&oy(ixY^tsZXPFd3%TpLo4IA&E!-X4ecb)r z1Kc|9ac&d$1otfW68AFq3b&2h&h6kuUe6o&8vZqW6rIHu#>3QOBOZ-pAw@8ASg;7G zf|bQWnvgDJ2$@2bU=y;193fY*3l704xCFN#33);{p}WvS$QKHPo<@WMwlXagsDQUP$zhWX+pg)UGNFl2s4BRp;2fO{6e!ZQ)m%pSEe%wgNEC%cq(jk2j|?aV#iBSAkBle*ev^<1C0CV{m-+oIlS;}5`kR`-gut4D z6HCfR`|5&Ko`zO$utto6uc~>ecc5|m_YvN?@Z4BZKA^VN8w~oU`Wk#KbG!BxOUkQ! z@Swpv*4I?$pAF69{-XI`57a&-e;`kS2CLPH(bj|^Au^7Zu_)sR8P6m<{E>09 zi~};(?LlT(vjwG2fQ8YXC7wnvVF@>>yt1;n&eP%@(BKWU>_O=$17)JDYIXc3Xf;m# z=nYPWuC2iqf1|qCwb0Hsu4CzYP!15tMRu5yquu$eCW1Pk6S;teqgq=$uWBKHLNovsp@C=+8jOaZp(K=8 zNj@1wMw6A~9r7j^|!VR@�Vsu9gV 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 v91 z20tyoSHZu#r$?6uH$@(-xKXB%c0NEX$usaq+2$uqb&U1zgJ=75`_=aI{9lopm3WB!efEpkgfvm~C zZ0drEKm{O~OrVMkAS-XOJc}s19+0KQpg(ydbFnYb0H9$-V12n@Yf^!-i3~|Vb}86g zkj_k?0~LULgw+agM}lkx*^$bSG})0waq=N%3ud6VC;w#D4xp;(4E7A0=dg${No;Sv z7VI9pyzZfYe!{oZUx6EnC8xgc=J`K)9jDu5KK3dmDDwh)hREa2?%?D7+*P`MXzC_$ z)WOt6a9T+`?wpVgN(NZW{GkL(843)@*17qEVpK63lukBZ;o@LqJh1sLcOoMT$j-?R pxJ4%a;ggzNz+1$oA2KCQqjd8N-d9YUuL)Q%GObA1EFk2<2mo6|#DD+* delta 369 zcmeyPbwzE10wa?>!)7JM8pg>r%v?6Set#QQcYI0PkjnEvIKDahLcdQ(pC5ytmfx%3 z-`(m7)1%9Sn<5WZ+$d8>J0HMkkl%l!%(I%yFKPO>)Xle;>KLs)#h$NwA3WQi+po4? zL?OX{L$OA9OPNQJPP%@Y0)r}pF@p+&0|S%6iiE~akQ_)|bF_Gf{Qu22*hH8lmL{8} zx(6?>d+48^@GbRM;D%z!sqed)3?}<=yG{1utYU&PdAKq}E+k(IKHkq=rR#^L?i^Pg zL|uc7MmSs0gmjRP9CP1xU(LZVQ-^1h9>`&aV23F%d`rC;EMM9N_B6<9p8szC8sRGv zxcwBfLBXNGu!)z0k;Nk8Y5L@Sd}WiH_+GH=P5Ko$Igft<+lEyAkQG6jMFd_kvD^kK S-uzF*-I5(0Ql7R#!8Av7s$T5v_ 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 U4!|5cJVZX++}Qsc-|_eV8xb;=TmS$7 delta 4111 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 literal 15341 zcmc(Fd3;mF+W*X1(j-lqlQe15v`w>gOLB6$P$*?Dd$p9MWh>BH+E5~)tw{=EDb7(; z5Rt_VabZ^!6ca60zS?kTY+J?SEd(a_t82x~bqqFFDbO9rbF@+OwB2K|}?7*4Wh21y@ zcgH<&A3OjL#DnlqJPZ%VBk*WE1qboHcs9Nd-;W=_bMRdJAfAUG!t?RNcmZCB7oixu z7(ara#LwcD_&NLnei3iL@8Eawdw4V6f)Em?$>TT*>>OJaH>TlH7)J|$2b(lIr{Y0IhexXiN|Dw)P7pRNWU$lab zp^dbOPNFTel}@7_w3F^fm(WA$k#r?}8||ZSr|+Pr(=%z2et@1&FQ%8!&(JIBwe-vM zM*1E4LwYOy4ZV}zM<1q-(ZA3q>3`Cv=wInG^l$We`T~8KzQWLql2I{njE+fSQW*#1 zWYU=o#?5qM3YgAJ7p4c(lj+6uVFodSnG$9=GlD5+#xj-6IHs1VV|>gMCcsQ(nwe?L zbf%S=#oW!@&pg1)VHPk8nMKS_W)HKMO=ZK#hfkm_bQ84$ZAMqnT=q-$EBY<=@9fv? zH~190js2G0&VI-4V0W^+*xl?Nb}ze+-OnCi53+~Y!|W0EDEmG81N$R;jQxrI2Ya0T znLWY&!k%RR$(~|=WlyvJV$ZO@v1i%e*+1BG?0NPAdy)N5&1&BO@}Q1eA!(C<$5Me+o)P)=_2UBN`jS6Uxf_H8wPWfq<=q#+Q{3_1A?))dZS- zp=wSCe@2Wa@&r0Z|Gw2X1KN|y%8P4jeW8$lqCemd&*=CrS5`jC4-Em|Xn#Xp<8

- - - + + + @@ -1812,8 +1812,8 @@
+ - From 1c7501af3f7d958fba029ae6200adb9da31c7a12 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 29 May 2016 05:11:51 -0400 Subject: [PATCH 087/156] Only trigger undo/redo on changes done via kvc --- CocoaSplit/InputSource.h | 2 + CocoaSplit/InputSource.m | 96 ++++++++++++++++++++++++---------------- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/CocoaSplit/InputSource.h b/CocoaSplit/InputSource.h index 650123fd..18a160e9 100644 --- a/CocoaSplit/InputSource.h +++ b/CocoaSplit/InputSource.h @@ -77,6 +77,8 @@ typedef enum resize_style_t { NSArray *_constraintObserveKeys; NSMutableDictionary *_restoredConstraintMap; NSString *_editedName; + NSDictionary *_undoActionMap; + } diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index b18f1158..777be2e6 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -636,6 +636,42 @@ static NSArray *_sourceTypes = nil; [self observeConstraintKeys]; [CATransaction commit]; + _undoActionMap = @{@"name": @"Set Name", + @"crop_top": @"Crop Top", + @"changeInterval": @"Change Interval", + @"gradientStartX": @"Gradient Start Color X", + @"gradientStartY": @"Gradient Start Color Y", + @"gradientStopX": @"Gradient Stop Color X", + @"gradientStopY": @"Gradient Stop Color Y", + @"startColor": @"Gradient Start Color", + @"stopColor": @"Gradient Stop Color", + @"backgroundColor": @"Background Color", + @"borderColor": @"Border Color", + @"cornerRadius": @"Border Corner Radius", + @"borderWidth": @"Border Width", + @"compositingFilterName": @"Composition Filter", + @"rotationAngle": @"Rotation", + @"rotationAngleX": @"X Rotation", + @"rotationAngleY": @"Y Rotation", + @"transitionDuration": @"Effect Duration", + @"transitionDirection": @"Transition Direction", + @"transitionEnabled": @"Enable Transitions", + @"alwaysDisplay": @"Always Show", + @"transitionFilterName": @"Transition Effect", + @"width": @"Width", + @"height": @"Height", + @"opacity": @"Opacity", + @"scrollXSpeed": @"Horizontal Scroll Speed", + @"scrollYSpeed": @"Vertical Scroll Speed", + @"crop_left": @"Crop Left", + @"crop_right": @"Crop Right", + @"crop_bottom": @"Crop Bottom", + @"chromaKeyColor": @"Chroma Key Color", + @"chromaKeySmoothing": @"CK Smoothing", + @"chromaKeyThreshold": @"CK Threshold", + @"rotateStyle": @"Order", + }; + } @@ -650,7 +686,6 @@ static NSArray *_sourceTypes = nil; -(void)setRotateStyle:(input_rotate_style)rotateStyle { - [self registerUndoForProperty:@"rotateStyle" withAction:@"Order"]; _rotateStyle = rotateStyle; } @@ -663,7 +698,6 @@ static NSArray *_sourceTypes = nil; -(void)setChangeInterval:(float)changeInterval { - [self registerUndoForProperty:@"changeInterval" withAction:@"Change Interval"]; _changeInterval = changeInterval; } @@ -712,7 +746,6 @@ static NSArray *_sourceTypes = nil; -(void)setGradientStartX:(CGFloat)gradientStartX { - [self registerUndoForProperty:@"gradientStartX" withAction:@"Gradient Start Color X"]; self.layer.gradientStartX = gradientStartX; } @@ -723,7 +756,6 @@ static NSArray *_sourceTypes = nil; -(void)setGradientStartY:(CGFloat)gradientStartY { - [self registerUndoForProperty:@"gradientStartY" withAction:@"Gradient Start Color Y"]; self.layer.gradientStartY = gradientStartY; } @@ -734,7 +766,6 @@ static NSArray *_sourceTypes = nil; -(void)setGradientStopX:(CGFloat)gradientStopX { - [self registerUndoForProperty:@"gradientStopX" withAction:@"Gradient Stop Color X"]; self.layer.gradientStopX = gradientStopX; } @@ -745,7 +776,6 @@ static NSArray *_sourceTypes = nil; -(void)setGradientStopY:(CGFloat)gradientStopY { - [self registerUndoForProperty:@"gradientStopY" withAction:@"Gradient Stop Color Y"]; self.layer.gradientStopY = gradientStopY; } @@ -762,7 +792,6 @@ static NSArray *_sourceTypes = nil; -(void)setStartColor:(NSColor *)startColor { - [self registerUndoForProperty:@"startColor" withAction:@"Gradient Start Color"]; self.layer.startColor = startColor; } @@ -775,7 +804,6 @@ static NSArray *_sourceTypes = nil; -(void)setStopColor:(NSColor *)stopColor { - [self registerUndoForProperty:@"stopColor" withAction:@"Gradient Stop Color"]; self.layer.stopColor = stopColor; } @@ -791,7 +819,6 @@ static NSArray *_sourceTypes = nil; -(void)setBackgroundColor:(NSColor *)backgroundColor { - [self registerUndoForProperty:@"backgroundColor" withAction:@"Background Color"]; [CATransaction begin]; _userBackground = YES; @@ -818,7 +845,6 @@ static NSArray *_sourceTypes = nil; -(void)setBorderColor:(NSColor *)borderColor { - [self registerUndoForProperty:@"borderColor" withAction:@"Border Color"]; [CATransaction begin]; self.layer.borderColor = [borderColor CGColor]; @@ -837,7 +863,6 @@ static NSArray *_sourceTypes = nil; -(void)setCornerRadius:(CGFloat)cornerRadius { - [self registerUndoForProperty:@"cornerRadius" withAction:@"Border Corner Radius"]; [CATransaction begin]; self.layer.cornerRadius = cornerRadius; @@ -853,7 +878,6 @@ static NSArray *_sourceTypes = nil; -(void)setBorderWidth:(CGFloat)borderWidth { - [self registerUndoForProperty:@"borderWidth" withAction:@"Border Width"]; [CATransaction begin]; @@ -876,7 +900,6 @@ static NSArray *_sourceTypes = nil; -(void)setCompositingFilterName:(NSString *)compositingFilterName { - [self registerUndoForProperty:@"compositingFilterName" withAction:@"Composition Filter"]; CIFilter *newFilter = nil; if (compositingFilterName) { @@ -892,7 +915,6 @@ static NSArray *_sourceTypes = nil; -(void)setIsMaskLayer:(bool)isMaskLayer { - [self registerUndoForProperty:@"isMaskLayer" withAction:isMaskLayer ? @"Set As Mask" : @"Unset As Mask"]; [self.sourceLayout.undoManager disableUndoRegistration]; if (isMaskLayer) @@ -1306,7 +1328,6 @@ static NSArray *_sourceTypes = nil; -(void)setName:(NSString *)name { - [self registerUndoForProperty:@"name" withAction:@"Set Name"]; _name = name; @@ -1379,7 +1400,6 @@ static NSArray *_sourceTypes = nil; -(void)setRotationAngle:(float)rotationAngle { - [self registerUndoForProperty:@"rotationAngle" withAction:@"Rotation"]; _rotationAngle = rotationAngle; @@ -1395,7 +1415,6 @@ static NSArray *_sourceTypes = nil; -(void)setRotationAngleX:(float)rotationAngleX { - [self registerUndoForProperty:@"rotationAngleX" withAction:@"X Rotation"]; _rotationAngleX = rotationAngleX; @@ -1410,7 +1429,6 @@ static NSArray *_sourceTypes = nil; -(void)setRotationAngleY:(float)rotationAngleY { - [self registerUndoForProperty:@"rotationAngleY" withAction:@"Y Rotation"]; _rotationAngleY = rotationAngleY; @@ -1443,7 +1461,6 @@ static NSArray *_sourceTypes = nil; -(void)setTransitionDuration:(float)transitionDuration { - [self registerUndoForProperty:@"transitionDuration" withAction:@"Effect Duration"]; _transitionDuration = transitionDuration; } @@ -1454,7 +1471,6 @@ static NSArray *_sourceTypes = nil; } -(void)setTransitionDirection:(NSString *)transitionDirection { - [self registerUndoForProperty:@"transitionDirection" withAction:@"Transition Direction"]; _transitionDirection = transitionDirection; } @@ -1465,7 +1481,6 @@ static NSArray *_sourceTypes = nil; -(void)setTransitionEnabled:(bool)transitionEnabled { - [self registerUndoForProperty:@"transitionEnabled" withAction:@"Enable Transitions"]; [CATransaction begin]; _transitionEnabled = transitionEnabled; @@ -1497,7 +1512,6 @@ static NSArray *_sourceTypes = nil; { - [self registerUndoForProperty:@"alwaysDisplay" withAction:@"Always Show"]; if (alwaysDisplay) { [CATransaction begin]; @@ -1537,7 +1551,6 @@ static NSArray *_sourceTypes = nil; -(void) setTransitionFilterName:(NSString *)transitionFilterName { - [self registerUndoForProperty:@"transitionFilterName" withAction:@"Transition Effect"]; _transitionFilterName = transitionFilterName; if ([transitionFilterName hasPrefix:@"CI"]) { @@ -1649,7 +1662,6 @@ static NSArray *_sourceTypes = nil; -(void)setWidth:(float)width { - [self registerUndoForProperty:@"width" withAction:@"Width"]; _width = width; [self directSize:_width height:_height]; } @@ -1661,7 +1673,6 @@ static NSArray *_sourceTypes = nil; -(void)setHeight:(float)height { - [self registerUndoForProperty:@"height" withAction:@"Height"]; _height = height; [self directSize:_width height:_height]; } @@ -2084,7 +2095,6 @@ static NSArray *_sourceTypes = nil; -(void)setOpacity:(float)opacity { - [self registerUndoForProperty:@"opacity" withAction:@"Opacity"]; _opacity = opacity; [CATransaction begin]; @@ -2182,7 +2192,6 @@ static NSArray *_sourceTypes = nil; -(void)setScrollXSpeed:(float)scrollXSpeed { - [self registerUndoForProperty:@"scrollXSpeed" withAction:@"Horizontal Scroll Speed"]; [CATransaction begin]; self.layer.scrollXSpeed = scrollXSpeed; @@ -2198,7 +2207,6 @@ static NSArray *_sourceTypes = nil; -(void)setScrollYSpeed:(float)scrollYSpeed { - [self registerUndoForProperty:@"scrollYSpeed" withAction:@"Vertical Scroll Speed"]; [CATransaction begin]; self.layer.scrollYSpeed = scrollYSpeed; @@ -2570,7 +2578,6 @@ static NSArray *_sourceTypes = nil; -(void) setActive:(bool)active { - [self registerUndoForProperty:@"active" withAction:active ? @"Set Active" : @"Unset Active"]; _active = active; if (self.videoInput) { @@ -2635,7 +2642,6 @@ static NSArray *_sourceTypes = nil; -(void) setCrop_left:(float)crop_left { - [self registerUndoForProperty:@"crop_left" withAction:@"Crop Left"]; if (crop_left < 0) { _crop_left = 0; @@ -2656,7 +2662,6 @@ static NSArray *_sourceTypes = nil; -(void) setCrop_right:(float)crop_right { - [self registerUndoForProperty:@"crop_right" withAction:@"Crop Right"]; if (crop_right < 0) { _crop_right = 0; @@ -2675,7 +2680,6 @@ static NSArray *_sourceTypes = nil; -(void) setCrop_top:(float)crop_top { - [self registerUndoForProperty:@"crop_top" withAction:@"Crop Top"]; if (crop_top < 0) { _crop_top = 0; @@ -2692,9 +2696,31 @@ static NSArray *_sourceTypes = nil; } +-(void)setValue:(id)value forKeyPath:(NSString *)keyPath +{ + + NSString *actionName = _undoActionMap[keyPath]; + if (!actionName) + { + if ([keyPath isEqualToString:@"isMaskLayer"]) + { + actionName = value ? @"Set As Mask" : @"Unset As Mask"; + } else if ([keyPath isEqualToString: @"active"]) { + actionName = value ? @"Set Active" : @"Unset Active"; + } else if ([keyPath isEqualToString:@"doChromaKey"]) { + actionName = value ? @"Set Chroma Key" : @"Unset Chroma Key"; + } else { + actionName = [NSString stringWithFormat:@"Change %@", keyPath]; + } + } + + [self registerUndoForProperty:keyPath withAction:actionName]; + [super setValue:value forKey:keyPath]; +} + + -(void) setCrop_bottom:(float)crop_bottom { - [self registerUndoForProperty:@"crop_bottom" withAction:@"Crop Bottom"]; if (crop_bottom < 0) { _crop_bottom = 0; @@ -2722,7 +2748,6 @@ static NSArray *_sourceTypes = nil; -(void)setChromaKeyColor:(NSColor *)chromaKeyColor { - [self registerUndoForProperty:@"chromaKeyColor" withAction:@"Chroma Key Color"]; _chromaKeyColor = chromaKeyColor; [CATransaction begin]; @@ -2737,7 +2762,6 @@ static NSArray *_sourceTypes = nil; -(void)setChromaKeySmoothing:(float)chromaKeySmoothing { - [self registerUndoForProperty:@"chromaKeySmoothing" withAction:@"CK Smoothing"]; _chromaKeySmoothing = chromaKeySmoothing; [CATransaction begin]; @@ -2752,7 +2776,6 @@ static NSArray *_sourceTypes = nil; -(void)setChromaKeyThreshold:(float)chromaKeyThreshold { - [self registerUndoForProperty:@"chromaKeyThreshold" withAction:@"CK Threshold"]; _chromaKeyThreshold = chromaKeyThreshold; [CATransaction begin]; [self.layer.sourceLayer setValue:@(chromaKeyThreshold) forKeyPath:@"filters.Chromakey.inputThreshold"]; @@ -2769,7 +2792,6 @@ static NSArray *_sourceTypes = nil; -(void)setDoChromaKey:(bool)doChromaKey { - [self registerUndoForProperty:@"doChromaKey" withAction:doChromaKey ? @"Set Chroma Key" : @"Unset Chroma Key"]; _doChromaKey = doChromaKey; [CATransaction begin]; From 9add1f7ff3be81057c95331a92226d5738ee6554 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 30 May 2016 08:29:31 -0400 Subject: [PATCH 088/156] Black magic Decklink source now properly honors crop settings --- .../CSDeckLinkCapturePlugin/CSDeckLinkLayer.h | 3 +- .../CSDeckLinkLayer.mm | 34 +++++++++++++------ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkLayer.h b/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkLayer.h index 03ad5076..bae4420a 100644 --- a/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkLayer.h +++ b/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkLayer.h @@ -9,6 +9,7 @@ #import #import #import + #import "DeckLinkBridge.h" @@ -16,7 +17,7 @@ { CGLContextObj _myCGLContext; CGRect _lastBounds; - CGSize _lastImageSize; + NSRect _lastImageSize; CGRect _privateCropRect; CGRect _lastCrop; CGRect _calculatedCrop; diff --git a/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkLayer.mm b/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkLayer.mm index be2a625f..523c2ef0 100644 --- a/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkLayer.mm +++ b/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkLayer.mm @@ -25,20 +25,15 @@ } -/* -(void)setContentsRect:(CGRect)contentsRect { _privateCropRect = contentsRect; - [self calculateCrop:_lastImageSize]; - _needsRedraw = YES; - [self setNeedsDisplay]; } -(CGRect)contentsRect { return _privateCropRect; } -*/ -(CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pf @@ -86,16 +81,23 @@ NSSize useSize = self.bounds.size; + CGRect newCrop; + + newCrop.origin.x = _deckLinkFrameSize.width * _privateCropRect.origin.x; + newCrop.origin.y = _deckLinkFrameSize.height * _privateCropRect.origin.y; + newCrop.size.width = _deckLinkFrameSize.width * _privateCropRect.size.width; + newCrop.size.height = _deckLinkFrameSize.height * _privateCropRect.size.height; if ([self.contentsGravity isEqualToString:kCAGravityResizeAspect]) { - float wr = _deckLinkFrameSize.width / self.bounds.size.width; - float hr = _deckLinkFrameSize.height / self.bounds.size.height; + float wr = newCrop.size.width / self.bounds.size.width; + float hr = newCrop.size.height / self.bounds.size.height; float ratio = (hr < wr ? wr : hr); - useSize = NSMakeSize(_deckLinkFrameSize.width / ratio, _deckLinkFrameSize.height / ratio); + useSize = NSMakeSize(newCrop.size.width / ratio, newCrop.size.height / ratio); } + GLint vpx = (self.bounds.size.width - useSize.width)/2; GLint vpy = (self.bounds.size.height - useSize.height)/2; @@ -103,20 +105,30 @@ glMatrixMode(GL_PROJECTION); glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); + NSRect cropRect; + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + + GLfloat yt = 1.0 - (_privateCropRect.origin.y + _privateCropRect.size.height); + + + glScalef(_privateCropRect.size.width, _privateCropRect.size.height, 1); + glTranslatef(_privateCropRect.origin.x * _deckLinkFrameSize.width, yt * _deckLinkFrameSize.height, 0); + + if (_deckLinkOGL) { _deckLinkOGL->PaintGL(); } - /* - glTranslated(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5, 0.0); - */ [super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts]; From ac7fd008bff9e1d62b4ab647addd095cb78fe268 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 30 May 2016 12:00:36 -0400 Subject: [PATCH 089/156] Restore use of gcd queue for operating on PCM player buffers. Fix typo in InputSource that prevented some key paths from being set --- .../CSDeckLinkCapturePlugin/CSDeckLinkCapture.mm | 3 ++- .../CSDeckLinkCaptureViewController.xib | 13 ++----------- CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m | 8 ++++---- CocoaSplit/InputSource.m | 4 ++-- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkCapture.mm b/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkCapture.mm index d9411edf..ec9c0eac 100644 --- a/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkCapture.mm +++ b/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkCapture.mm @@ -134,9 +134,10 @@ { super.activeVideoDevice = activeVideoDevice; - + if (activeVideoDevice) { + CSDeckLinkWrapper *devWrapper = activeVideoDevice.captureDevice; IDeckLink *deckLink = devWrapper.deckLink; diff --git a/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkCaptureViewController.xib b/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkCaptureViewController.xib index 3b4a24fd..a728cebd 100644 --- a/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkCaptureViewController.xib +++ b/CapturePlugins/CSDeckLinkCapturePlugin/CSDeckLinkCapturePlugin/CSDeckLinkCaptureViewController.xib @@ -1,7 +1,7 @@ - + - + @@ -17,7 +17,6 @@ - @@ -26,7 +25,6 @@ - @@ -46,7 +44,6 @@ - @@ -55,7 +52,6 @@ - @@ -74,7 +70,6 @@ - @@ -83,7 +78,6 @@ - @@ -102,7 +96,6 @@ - @@ -111,7 +104,6 @@ - @@ -131,7 +123,6 @@ - diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m b/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m index d57d9661..09125226 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m @@ -162,9 +162,9 @@ void BufferCompletedPlaying(void *userData, ScheduledAudioSlice *bufferList); -(void)releasePCM:(CAMultiAudioPCM *)buffer { - //dispatch_async(_pendingQueue, ^{ + dispatch_async(_pendingQueue, ^{ [_pendingBuffers removeObject:buffer]; - //}); + }); } @@ -248,11 +248,11 @@ void BufferCompletedPlaying(void *userData, ScheduledAudioSlice *bufferList) CAMultiAudioPCM *pcmObj = (__bridge CAMultiAudioPCM *)(userData); //maybe put this on a dedicated queue? //why a queue? don't want to do any sort of memory/managed object operations in an audio callback. - dispatch_async(dispatch_get_main_queue(), ^{ + //dispatch_async(dispatch_get_main_queue(), ^{ CAMultiAudioPCMPlayer *pplayer = pcmObj.player; //pplayer.latestScheduledTime = pcmObj.audioSlice->mTimeStamp.mSampleTime + pcmObj.audioSlice->mNumberFrames; [pplayer releasePCM:pcmObj]; - }); + //}); } \ No newline at end of file diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 777be2e6..9901c8a8 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -2715,10 +2715,10 @@ static NSArray *_sourceTypes = nil; } [self registerUndoForProperty:keyPath withAction:actionName]; - [super setValue:value forKey:keyPath]; + + [super setValue:value forKeyPath:keyPath]; } - -(void) setCrop_bottom:(float)crop_bottom { if (crop_bottom < 0) From 34f3471c83e1f6a66020fa6df2e894f073260c9f Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 30 May 2016 22:49:55 -0400 Subject: [PATCH 090/156] Added input outline view to layout edit windows --- CocoaSplit/CaptureController.m | 15 +- .../Interface/CSAddInputViewController.h | 3 + .../Interface/CSAddInputViewController.m | 7 +- .../Interface/CSLayoutEditWindowController.h | 8 +- .../Interface/CSLayoutEditWindowController.m | 117 ++++++++ .../CSLayoutEditWindowController.xib | 271 +++++++++++++----- .../Interface/EditBuiltinLayoutView.xib | 2 +- 7 files changed, 338 insertions(+), 85 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 7456d548..c5203db2 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -114,7 +114,7 @@ vc = [[CSAddInputViewController alloc] init]; _addInputpopOver.contentViewController = vc; vc.popover = _addInputpopOver; - + vc.previewView = self.activePreviewView; //_addInputpopOver.delegate = vc; } @@ -409,19 +409,6 @@ self.advancedPrefPanel = nil; } - - - - - - - - - - - - - -(void)openOutputSheet:(OutputDestination *)toEdit { self.addOutputWindowController = [[CSNewOutputWindowController alloc] init]; diff --git a/CocoaSplit/Interface/CSAddInputViewController.h b/CocoaSplit/Interface/CSAddInputViewController.h index af4d51fc..337918f7 100644 --- a/CocoaSplit/Interface/CSAddInputViewController.h +++ b/CocoaSplit/Interface/CSAddInputViewController.h @@ -10,6 +10,7 @@ #import "CSPluginLoader.h" #import "InputSource.h" +@class PreviewView; @interface CSAddInputViewController : NSViewController { @@ -32,6 +33,8 @@ @property (weak) IBOutlet NSView *headerView; @property (strong) IBOutlet NSArrayController *sourceTypesController; +@property (weak) PreviewView *previewView; + - (IBAction)nextViewButton:(id)sender; - (IBAction)previousViewButton:(id)sender; - (IBAction)initalTableButtonClicked:(id)sender; diff --git a/CocoaSplit/Interface/CSAddInputViewController.m b/CocoaSplit/Interface/CSAddInputViewController.m index e057d1a4..d2e9dc0f 100644 --- a/CocoaSplit/Interface/CSAddInputViewController.m +++ b/CocoaSplit/Interface/CSAddInputViewController.m @@ -169,11 +169,10 @@ -(void)addInput:(id)toAdd { - AppDelegate *myAppDelegate = [[NSApplication sharedApplication] delegate]; - - if (myAppDelegate.captureController) + + if (self.previewView) { - [myAppDelegate.captureController.activePreviewView addInputSourceWithInput:toAdd]; + [self.previewView addInputSourceWithInput:toAdd]; } } diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.h b/CocoaSplit/Interface/CSLayoutEditWindowController.h index 8e805313..323c2651 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.h +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.h @@ -11,10 +11,13 @@ #import "PreviewView.h" -@interface CSLayoutEditWindowController : NSWindowController +@interface CSLayoutEditWindowController : NSWindowController { float _frame_interval; NSPopover *_animatepopOver; + NSPopover *_addInputpopOver; + + } @@ -28,5 +31,8 @@ - (IBAction)editOK:(id)sender; - (IBAction)newSource:(id)sender; - (IBAction)openAnimatePopover:(NSButton *)sender; +- (IBAction)inputTableControlClick:(NSButton *)sender; + +@property (weak) IBOutlet NSOutlineView *inputOutlineView; @end diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.m b/CocoaSplit/Interface/CSLayoutEditWindowController.m index efa4e2ee..86a91677 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.m +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.m @@ -140,4 +140,121 @@ } +-(void) resetInputTableHighlights +{ + [self.previewView stopHighlightingAllSources]; + if (self.inputOutlineView && self.inputOutlineView.selectedRowIndexes) + { + [self.inputOutlineView.selectedRowIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) { + NSTreeNode *node = [self.inputOutlineView itemAtRow:idx]; + InputSource *src = node.representedObject; + + if (src) + { + [self.previewView highlightSource:src]; + } + }]; + } +} + + +-(void)outlineView:(NSOutlineView *)outlineView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row +{ + NSTreeNode *node = [outlineView itemAtRow:row]; + InputSource *src = node.representedObject; + if (!src.parentInput) + { + dispatch_async(dispatch_get_main_queue(), ^{ + [outlineView expandItem:nil expandChildren:YES]; + }); + } +} + + +-(void) outlineViewSelectionDidChange:(NSNotification *)notification +{ + + [self resetInputTableHighlights]; +} + + +-(void)openAddInputPopover:(id)sender sourceRect:(NSRect)sourceRect +{ + CSAddInputViewController *vc; + if (!_addInputpopOver) + { + _addInputpopOver = [[NSPopover alloc] init]; + _addInputpopOver.animates = YES; + _addInputpopOver.behavior = NSPopoverBehaviorTransient; + } + + //if (!_addInputpopOver.contentViewController) + { + vc = [[CSAddInputViewController alloc] init]; + _addInputpopOver.contentViewController = vc; + vc.popover = _addInputpopOver; + vc.previewView = self.previewView; + + //_addInputpopOver.delegate = vc; + } + + [_addInputpopOver showRelativeToRect:sourceRect ofView:sender preferredEdge:NSMaxXEdge]; +} + + +- (IBAction)inputTableControlClick:(NSButton *)sender +{ + NSInteger clicked = sender.tag; + + NSArray *selectedInputs; + NSRect sbounds; + switch (clicked) { + case 0: + sbounds = sender.bounds; + //[self.activePreviewView addInputSource:sender]; + //sbounds.origin.x = NSMaxX(sender.frame) - [sender widthForSegment:0]; + //sbounds.origin.x -= 333; + [self openAddInputPopover:sender sourceRect:sbounds]; + break; + case 1: + if (self.inputOutlineView && self.inputOutlineView.selectedRowIndexes) + { + [self.inputOutlineView.selectedRowIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) { + NSTreeNode *node = [self.inputOutlineView itemAtRow:idx]; + InputSource *src = node.representedObject; + + if (src) + { + NSString *uuid = src.uuid; + InputSource *realInput = [self.previewView.sourceLayout inputForUUID:uuid]; + [self.previewView deleteInput:realInput]; + } + + }]; + + } + break; + case 2: + if (self.inputOutlineView && self.inputOutlineView.selectedRowIndexes) + { + + [self.inputOutlineView.selectedRowIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) { + NSTreeNode *node = [self.inputOutlineView itemAtRow:idx]; + InputSource *src = node.representedObject; + + if (src) + { + [self.previewView openInputConfigWindow:src.uuid]; + } + + }]; + } + break; + default: + break; + } +} + + + @end diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.xib b/CocoaSplit/Interface/CSLayoutEditWindowController.xib index 93acddd0..93576c5b 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.xib +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.xib @@ -1,5 +1,5 @@ - + @@ -7,6 +7,7 @@ + @@ -52,7 +53,7 @@ Gw - + @@ -61,26 +62,13 @@ Gw - - + - + @@ -102,7 +90,7 @@ Gw - + @@ -116,7 +104,7 @@ Gw - + @@ -157,7 +145,7 @@ Gw - + @@ -167,36 +155,172 @@ Gw - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + @@ -258,7 +382,7 @@ Gw - + @@ -274,6 +398,7 @@ Gw + @@ -302,7 +427,7 @@ Gw
- - @@ -1790,17 +1769,6 @@ - @@ -1855,17 +1823,6 @@ - @@ -1874,59 +1831,6 @@ - - - - - @@ -1957,6 +1861,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2018,6 +1979,7 @@ + diff --git a/InputPopupControllerViewController.h b/InputPopupControllerViewController.h index 690c1abf..d3152abc 100644 --- a/InputPopupControllerViewController.h +++ b/InputPopupControllerViewController.h @@ -37,20 +37,21 @@ @property (strong) NSArray *compositionFilterNames; -- (IBAction)configureFilter:(NSButton *)sender; +- (IBAction)configureFilter:(NSSegmentedControl *)sender; - (IBAction)resetConstraints:(id)sender; -- (IBAction)removeFilter:(NSButton *)sender; +- (IBAction)removeFilter:(NSSegmentedControl *)sender; +- (IBAction)filterControlAction:(id)sender; - (IBAction)deleteMultiSource:(id)sender; -(void)openTransitionFilterPanel:(CIFilter *)forFilter; -(IBAction) configureInputTransition:(NSButton *)sender; -- (IBAction)addFilterAction:(NSButton *)sender; +- (IBAction)addFilterAction:(NSSegmentedControl *)sender; -(IBAction) clearGradient:(NSButton *)sender; diff --git a/InputPopupControllerViewController.m b/InputPopupControllerViewController.m index 0ea34bb3..caf24388 100644 --- a/InputPopupControllerViewController.m +++ b/InputPopupControllerViewController.m @@ -98,7 +98,7 @@ } -- (IBAction)configureFilter:(NSButton *)sender +- (IBAction)configureFilter:(NSSegmentedControl *)sender { CIFilter *selectedFilter; CALayer *useLayer = nil; @@ -129,7 +129,7 @@ } -- (IBAction)removeFilter:(NSButton *)sender +- (IBAction)removeFilter:(NSSegmentedControl *)sender { CIFilter *selectedFilter; @@ -150,6 +150,26 @@ } } +- (IBAction)filterControlAction:(NSSegmentedControl *)sender +{ + NSInteger segment = sender.selectedSegment; + + switch (segment) + { + case 0: + [self addFilterAction:sender]; + break; + case 1: + [self removeFilter:sender]; + break; + case 2: + [self configureFilter:sender]; + break; + default: + break; + } +} + -(void)setSelectedVideoType:(NSString *)selectedVideoType { @@ -352,7 +372,7 @@ } -- (IBAction)addFilterAction:(NSButton *)sender +- (IBAction)addFilterAction:(NSSegmentedControl *)sender { NSString *filterName = [CSFilterChooserWindowController run]; From 5b984806f3b45b8532a8f86812edb329cf7dbf13 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 4 Jun 2016 23:47:24 -0400 Subject: [PATCH 092/156] Added snap/magnetism to other sources in the layout --- CocoaSplit/PreviewView.m | 45 ++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/CocoaSplit/PreviewView.m b/CocoaSplit/PreviewView.m index e6024d1c..0bab86ff 100644 --- a/CocoaSplit/PreviewView.m +++ b/CocoaSplit/PreviewView.m @@ -830,6 +830,14 @@ NSPoint c_rt_snap; NSPoint c_center_snap; + NSPoint *c_snaps; + int c_snap_size = 0; + + if (!self.selectedSource) + { + return; + } + if (superInput) { NSRect super_rect = superInput.globalLayoutPosition; @@ -837,11 +845,36 @@ c_lb_snap = super_rect.origin; c_rt_snap = NSMakePoint(NSMaxX(super_rect), NSMaxY(super_rect)); c_center_snap = NSMakePoint(NSMidX(super_rect), NSMidY(super_rect)); + c_snaps = malloc(sizeof(NSPoint) * 3); + c_snaps[0] = c_lb_snap; + c_snaps[1] = c_rt_snap; + c_snaps[2] = c_center_snap; + c_snap_size = 3; } else { //define snap points. basically edges and the center of the canvas c_lb_snap = NSMakePoint(0, 0); c_rt_snap = NSMakePoint(self.sourceLayout.canvas_width, self.sourceLayout.canvas_height); c_center_snap = NSMakePoint(self.sourceLayout.canvas_width/2, self.sourceLayout.canvas_height/2); + c_snap_size = 3; + + NSArray *srcs = self.sourceLayout.topLevelSourceList; + + c_snap_size += srcs.count*3; + + c_snaps = malloc(sizeof(NSPoint) * c_snap_size); + c_snaps[0] = c_lb_snap; + c_snaps[1] = c_rt_snap; + c_snaps[2] = c_center_snap; + + int snap_idx = 3; + for (InputSource *src in srcs) + { + NSRect srect = src.globalLayoutPosition; + c_snaps[snap_idx++] = srect.origin; + c_snaps[snap_idx++] = NSMakePoint(NSMaxX(srect), NSMaxY(srect)); + c_snaps[snap_idx++] = NSMakePoint(NSMidX(srect), NSMidY(srect)); + + } } @@ -849,10 +882,6 @@ //selected source snap points. edges, and center - if (!self.selectedSource) - { - return; - } NSRect src_rect = self.selectedSource.globalLayoutPosition; @@ -864,7 +893,6 @@ NSPoint dist; NSPoint s_snaps[3] = {s_lb_snap, s_rt_snap, s_center_snap}; - NSPoint c_snaps[3] = {c_lb_snap, c_rt_snap, c_center_snap}; bool did_snap_x = NO; bool did_snap_y = NO; @@ -904,7 +932,7 @@ for(int i=0; i < sizeof(s_snaps)/sizeof(NSPoint); i++) { NSPoint s_snap = s_snaps[i]; - for(int j=0; j < sizeof(c_snaps)/sizeof(NSPoint); j++) + for(int j=0; j < c_snap_size; j++) { NSPoint c_snap = c_snaps[j]; @@ -940,6 +968,11 @@ _glLayer.snap_x = _snap_x; _glLayer.snap_y = _snap_y; } + + if (c_snaps) + { + free(c_snaps); + } } From 83511db20340cd3a526d7db570c7737019ef069c Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 5 Jun 2016 00:36:58 -0400 Subject: [PATCH 093/156] Only enqueue audio buffer if the PTS is increasing --- CocoaSplit/CaptureController.h | 2 ++ CocoaSplit/CaptureController.m | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 758c7313..f88b1e8a 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -74,6 +74,8 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , CFAbsoluteTime _firstFrameTime; CMTime _firstAudioTime; + CMTime _previousAudioTime; + dispatch_queue_t _main_capture_queue; dispatch_queue_t _preview_queue; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index c5203db2..2888e346 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1569,7 +1569,8 @@ } _firstAudioTime = kCMTimeZero; - + _previousAudioTime = kCMTimeZero; + @@ -2034,9 +2035,14 @@ CMTime pts = CMTimeAdd(real_pts, adjust_pts); + CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, pts); - [self addAudioData:sampleBuffer]; + if (CMTIME_COMPARE_INLINE(pts, >, _previousAudioTime)) + { + [self addAudioData:sampleBuffer]; + _previousAudioTime = pts; + } } From 00a9c124c8a79665a713371d1137f741559c5525 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 5 Jun 2016 01:42:40 -0400 Subject: [PATCH 094/156] Output list converted to +/- segmented control footer style --- CocoaSplit/CaptureController.h | 1 + CocoaSplit/CaptureController.m | 18 +++++ CocoaSplit/en.lproj/MainMenu.xib | 117 ++++++++++++++----------------- 3 files changed, 72 insertions(+), 64 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index f88b1e8a..5372c30a 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -403,6 +403,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(void) resetInputTableHighlights; +- (IBAction)outputSegmentedAction:(NSSegmentedControl *)sender; @end diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 2888e346..9a70e6ac 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2300,6 +2300,24 @@ } } +- (IBAction)outputSegmentedAction:(NSSegmentedControl *)sender +{ + NSUInteger clicked = sender.selectedSegment; + + switch (clicked) + { + case 0: + [self openCreateSheet:sender]; + break; + case 1: + [self removeDestination:sender]; + break; + default: + break; + } +} + + -(void)outlineView:(NSOutlineView *)outlineView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row { if (outlineView == self.inputOutlineView) diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 446bf117..2a08960d 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -303,23 +303,23 @@ - + - + - + - + - + - + @@ -352,11 +352,11 @@ - + - + @@ -370,7 +370,7 @@ - - + @@ -392,7 +392,7 @@ - + @@ -435,7 +435,7 @@ - + @@ -467,7 +467,7 @@ - + @@ -509,7 +509,7 @@ - + @@ -530,7 +530,7 @@ - - + @@ -619,7 +619,7 @@ - - - - - - - - + - + - + @@ -1324,20 +1299,34 @@ - + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + @@ -1779,7 +1768,7 @@ - + From c1c36b70deb19d7b11a90b2e63785521aa6ed2e0 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 5 Jun 2016 10:52:10 -0400 Subject: [PATCH 095/156] Exporting a layout no longer re-saves the layout thus clearing out all the source data --- CocoaSplit/CaptureController.m | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 9a70e6ac..46601194 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -673,16 +673,19 @@ if (layout == self.selectedLayout) { useLayout = self.livePreviewView.sourceLayout; + [useLayout saveSourceList]; + [useLayout saveAnimationSource]; } else if (layout == self.stagingLayout) { useLayout = self.stagingPreviewView.sourceLayout; + [useLayout saveSourceList]; + [useLayout saveAnimationSource]; + } [panel beginWithCompletionHandler:^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { NSURL *saveFile = [panel URL]; - [useLayout saveSourceList]; - [useLayout saveAnimationSource]; [NSKeyedArchiver archiveRootObject:useLayout toFile:saveFile.path]; From e180ca6578a92a02d83ced9172c7cf9355cce4dc Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 5 Jun 2016 11:53:46 -0400 Subject: [PATCH 096/156] Slight adjustment to some layout constraints, removal of debug NSLogs --- CocoaSplit/CaptureController.m | 1 - CocoaSplit/SourceLayout.m | 3 --- CocoaSplit/en.lproj/MainMenu.xib | 34 +++++++++++++------------------- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 46601194..e0d89877 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -354,7 +354,6 @@ retView = [tableView makeViewWithIdentifier:@"LabelCellView" owner:self]; } else if ([tableColumn.identifier isEqualToString:@"value"]) { - NSLog(@"MY INPUT MAP %@", inputmap); if ([inputmap[@"type"] isEqualToString:@"param"]) { diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 2bcd2d59..c85b9139 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -150,14 +150,11 @@ -(void)setAnimationIndexes:(NSIndexSet *)animationIndexes { - NSLog(@"SET ANIMATION INDEXES %@", self); _animationIndexes = animationIndexes; NSUInteger firstIndex = animationIndexes.firstIndex; - NSLog(@"FIRST INDEX %lu COUNT %lu", (unsigned long)firstIndex, self.animationList.count); if (firstIndex < self.animationList.count) { - NSLog(@"SET SELECTED ANIMATION"); self.selectedAnimation = [self.animationList objectAtIndex:firstIndex]; } } diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 2a08960d..02dd4cf9 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1335,10 +1335,10 @@ - + - - - + @@ -1493,7 +1493,7 @@ - + @@ -1506,16 +1506,16 @@ - - - + + + - - - - - - - @@ -1553,7 +1547,7 @@ - + @@ -1621,10 +1615,10 @@ - + - + @@ -1671,7 +1665,7 @@ - + From 1d0f49efc0f33606d220ab427e1c7daa81f3b4c9 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 5 Jun 2016 14:06:32 -0400 Subject: [PATCH 097/156] Update version to 2.0.7 --- CocoaSplit/CocoaSplit-Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index 1d0e2984..035933da 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.6 + 2.0.7 CFBundleSignature ???? CFBundleVersion - 2.0.6 + 2.0.7 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion From 4c7bdb9cce2530c278b2af07e8de2b704b2c6ea0 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 20 Jun 2016 05:38:56 -0400 Subject: [PATCH 098/156] Added start of ffmpeg based movie source. A/V sync is slightly off after seeking, nothing saves and it doesn't quite have the repeat/pause controls of the previous Movie source. WIP. --- .../project.pbxproj | 334 ++++++++++ .../CSFFMpegCapturePlugin/CSFFMpegCapture.h | 59 ++ .../CSFFMpegCapturePlugin/CSFFMpegCapture.m | 209 ++++++ .../CSFFMpegCaptureViewController.h | 20 + .../CSFFMpegCaptureViewController.m | 69 ++ .../CSFFMpegCaptureViewController.xib | 168 +++++ .../CSFFMpegCapturePlugin/CSFFMpegInput.h | 106 +++ .../CSFFMpegCapturePlugin/CSFFMpegInput.m | 611 ++++++++++++++++++ .../CSFFMpegCapturePlugin/CSFFMpegPlayer.h | 64 ++ .../CSFFMpegCapturePlugin/CSFFMpegPlayer.m | 424 ++++++++++++ .../CSFFMpegCapturePlugin/Info.plist | 28 + .../CSAVFCapturePlugin/AVFCapture.m | 1 + .../CSMovieCapturePlugin/MovieCapture.m | 9 +- .../MovieCaptureViewController.xib | 16 +- CocoaSplit.xcodeproj/project.pbxproj | 36 ++ CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m | 1 + CocoaSplit/CAMultiAudio/CAMultiAudioPCM.m | 13 +- .../CAMultiAudio/CAMultiAudioPCMPlayer.h | 4 + .../CAMultiAudio/CAMultiAudioPCMPlayer.m | 40 ++ CocoaSplit/CaptureController.m | 10 +- CocoaSplit/PluginHeaders/CAMultiAudioPCM.h | 1 + CocoaSplit/PluginHeaders/CSPcmPlayer.h | 5 + CocoaSplit/en.lproj/MainMenu.xib | 38 +- 23 files changed, 2229 insertions(+), 37 deletions(-) create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.h create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m create mode 100644 CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/Info.plist diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj new file mode 100644 index 00000000..6f03fea1 --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj @@ -0,0 +1,334 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 343C79EC1D0C76C700B36EEC /* CSFFMpegCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 343C79EB1D0C76C700B36EEC /* CSFFMpegCapture.m */; }; + 343C79F01D0CF3C100B36EEC /* CSFFMpegInput.m in Sources */ = {isa = PBXBuildFile; fileRef = 343C79EF1D0CF3C100B36EEC /* CSFFMpegInput.m */; }; + 34BDCD651D10F4E100F51996 /* CSFFMpegCaptureViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34BDCD631D10F4E100F51996 /* CSFFMpegCaptureViewController.m */; }; + 34BDCD661D10F4E100F51996 /* CSFFMpegCaptureViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34BDCD641D10F4E100F51996 /* CSFFMpegCaptureViewController.xib */; }; + 34BDCD7D1D14178800F51996 /* CSFFMpegPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34BDCD7C1D14178800F51996 /* CSFFMpegPlayer.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 343C79BA1D0C763A00B36EEC /* CSFFMpegCapturePlugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CSFFMpegCapturePlugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 343C79BD1D0C763A00B36EEC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 343C79DC1D0C769100B36EEC /* CSPluginServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginServices.h; path = PluginHeaders/CSPluginServices.h; sourceTree = ""; }; + 343C79DD1D0C769100B36EEC /* CSIOSurfaceLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSIOSurfaceLayer.h; path = PluginHeaders/CSIOSurfaceLayer.h; sourceTree = ""; }; + 343C79DE1D0C769100B36EEC /* CSPcmPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPcmPlayer.h; path = PluginHeaders/CSPcmPlayer.h; sourceTree = ""; }; + 343C79DF1D0C769100B36EEC /* CAMultiAudioPCM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CAMultiAudioPCM.h; path = PluginHeaders/CAMultiAudioPCM.h; sourceTree = ""; }; + 343C79E01D0C769100B36EEC /* CSAbstractCaptureDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAbstractCaptureDevice.h; path = PluginHeaders/CSAbstractCaptureDevice.h; sourceTree = ""; }; + 343C79E11D0C769100B36EEC /* CSTextCaptureBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSTextCaptureBase.h; path = PluginHeaders/CSTextCaptureBase.h; sourceTree = ""; }; + 343C79E21D0C769100B36EEC /* CSTextCaptureViewControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSTextCaptureViewControllerBase.h; path = PluginHeaders/CSTextCaptureViewControllerBase.h; sourceTree = ""; }; + 343C79E31D0C769100B36EEC /* CSCaptureBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureBase.h; path = PluginHeaders/CSCaptureBase.h; sourceTree = ""; }; + 343C79E41D0C769100B36EEC /* CSCaptureSourceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureSourceProtocol.h; path = PluginHeaders/CSCaptureSourceProtocol.h; sourceTree = ""; }; + 343C79E51D0C769100B36EEC /* CSStreamServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSStreamServiceProtocol.h; path = PluginHeaders/CSStreamServiceProtocol.h; sourceTree = ""; }; + 343C79E61D0C769100B36EEC /* CSPluginFactoryProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginFactoryProtocol.h; path = PluginHeaders/CSPluginFactoryProtocol.h; sourceTree = ""; }; + 343C79E71D0C769100B36EEC /* CSExtraPluginProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSExtraPluginProtocol.h; path = PluginHeaders/CSExtraPluginProtocol.h; sourceTree = ""; }; + 343C79E81D0C769100B36EEC /* CSNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSNotifications.h; path = PluginHeaders/CSNotifications.h; sourceTree = ""; }; + 343C79EA1D0C76C700B36EEC /* CSFFMpegCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSFFMpegCapture.h; sourceTree = ""; }; + 343C79EB1D0C76C700B36EEC /* CSFFMpegCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSFFMpegCapture.m; sourceTree = ""; }; + 343C79EE1D0CF3C100B36EEC /* CSFFMpegInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSFFMpegInput.h; sourceTree = ""; }; + 343C79EF1D0CF3C100B36EEC /* CSFFMpegInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSFFMpegInput.m; sourceTree = ""; }; + 34BDCD621D10F4E100F51996 /* CSFFMpegCaptureViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSFFMpegCaptureViewController.h; sourceTree = ""; }; + 34BDCD631D10F4E100F51996 /* CSFFMpegCaptureViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSFFMpegCaptureViewController.m; sourceTree = ""; }; + 34BDCD641D10F4E100F51996 /* CSFFMpegCaptureViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CSFFMpegCaptureViewController.xib; sourceTree = ""; }; + 34BDCD7B1D14178800F51996 /* CSFFMpegPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSFFMpegPlayer.h; sourceTree = ""; }; + 34BDCD7C1D14178800F51996 /* CSFFMpegPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSFFMpegPlayer.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 343C79B71D0C763A00B36EEC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 343C79B11D0C763A00B36EEC = { + isa = PBXGroup; + children = ( + 343C79E91D0C769100B36EEC /* PluginHeaders */, + 343C79BC1D0C763A00B36EEC /* CSFFMpegCapturePlugin */, + 343C79BB1D0C763A00B36EEC /* Products */, + ); + sourceTree = ""; + }; + 343C79BB1D0C763A00B36EEC /* Products */ = { + isa = PBXGroup; + children = ( + 343C79BA1D0C763A00B36EEC /* CSFFMpegCapturePlugin.bundle */, + ); + name = Products; + sourceTree = ""; + }; + 343C79BC1D0C763A00B36EEC /* CSFFMpegCapturePlugin */ = { + isa = PBXGroup; + children = ( + 343C79BD1D0C763A00B36EEC /* Info.plist */, + 343C79EA1D0C76C700B36EEC /* CSFFMpegCapture.h */, + 343C79EB1D0C76C700B36EEC /* CSFFMpegCapture.m */, + 343C79EE1D0CF3C100B36EEC /* CSFFMpegInput.h */, + 343C79EF1D0CF3C100B36EEC /* CSFFMpegInput.m */, + 34BDCD621D10F4E100F51996 /* CSFFMpegCaptureViewController.h */, + 34BDCD631D10F4E100F51996 /* CSFFMpegCaptureViewController.m */, + 34BDCD641D10F4E100F51996 /* CSFFMpegCaptureViewController.xib */, + 34BDCD7B1D14178800F51996 /* CSFFMpegPlayer.h */, + 34BDCD7C1D14178800F51996 /* CSFFMpegPlayer.m */, + ); + path = CSFFMpegCapturePlugin; + sourceTree = ""; + }; + 343C79E91D0C769100B36EEC /* PluginHeaders */ = { + isa = PBXGroup; + children = ( + 343C79DC1D0C769100B36EEC /* CSPluginServices.h */, + 343C79DD1D0C769100B36EEC /* CSIOSurfaceLayer.h */, + 343C79DE1D0C769100B36EEC /* CSPcmPlayer.h */, + 343C79DF1D0C769100B36EEC /* CAMultiAudioPCM.h */, + 343C79E01D0C769100B36EEC /* CSAbstractCaptureDevice.h */, + 343C79E11D0C769100B36EEC /* CSTextCaptureBase.h */, + 343C79E21D0C769100B36EEC /* CSTextCaptureViewControllerBase.h */, + 343C79E31D0C769100B36EEC /* CSCaptureBase.h */, + 343C79E41D0C769100B36EEC /* CSCaptureSourceProtocol.h */, + 343C79E51D0C769100B36EEC /* CSStreamServiceProtocol.h */, + 343C79E61D0C769100B36EEC /* CSPluginFactoryProtocol.h */, + 343C79E71D0C769100B36EEC /* CSExtraPluginProtocol.h */, + 343C79E81D0C769100B36EEC /* CSNotifications.h */, + ); + name = PluginHeaders; + path = ../CocoaSplit; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 343C79B91D0C763A00B36EEC /* CSFFMpegCapturePlugin */ = { + isa = PBXNativeTarget; + buildConfigurationList = 343C79C01D0C763A00B36EEC /* Build configuration list for PBXNativeTarget "CSFFMpegCapturePlugin" */; + buildPhases = ( + 343C79B61D0C763A00B36EEC /* Sources */, + 343C79B71D0C763A00B36EEC /* Frameworks */, + 343C79B81D0C763A00B36EEC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CSFFMpegCapturePlugin; + productName = CSFFMpegCapturePlugin; + productReference = 343C79BA1D0C763A00B36EEC /* CSFFMpegCapturePlugin.bundle */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 343C79B21D0C763A00B36EEC /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0730; + ORGANIZATIONNAME = Zakk; + TargetAttributes = { + 343C79B91D0C763A00B36EEC = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 343C79B51D0C763A00B36EEC /* Build configuration list for PBXProject "CSFFMpegCapturePlugin" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 343C79B11D0C763A00B36EEC; + productRefGroup = 343C79BB1D0C763A00B36EEC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 343C79B91D0C763A00B36EEC /* CSFFMpegCapturePlugin */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 343C79B81D0C763A00B36EEC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 34BDCD661D10F4E100F51996 /* CSFFMpegCaptureViewController.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 343C79B61D0C763A00B36EEC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 34BDCD651D10F4E100F51996 /* CSFFMpegCaptureViewController.m in Sources */, + 343C79EC1D0C76C700B36EEC /* CSFFMpegCapture.m in Sources */, + 343C79F01D0CF3C100B36EEC /* CSFFMpegInput.m in Sources */, + 34BDCD7D1D14178800F51996 /* CSFFMpegPlayer.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 343C79BE1D0C763A00B36EEC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 343C79BF1D0C763A00B36EEC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 343C79C11D0C763A00B36EEC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + COMBINE_HIDPI_IMAGES = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + INFOPLIST_FILE = CSFFMpegCapturePlugin/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + OTHER_LDFLAGS = ( + "-undefined", + suppress, + "-flat_namespace", + ); + PRODUCT_BUNDLE_IDENTIFIER = zakk.lol.CSFFMpegCapturePlugin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 343C79C21D0C763A00B36EEC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + COMBINE_HIDPI_IMAGES = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + INFOPLIST_FILE = CSFFMpegCapturePlugin/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + OTHER_LDFLAGS = ( + "-undefined", + suppress, + "-flat_namespace", + ); + PRODUCT_BUNDLE_IDENTIFIER = zakk.lol.CSFFMpegCapturePlugin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 343C79B51D0C763A00B36EEC /* Build configuration list for PBXProject "CSFFMpegCapturePlugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 343C79BE1D0C763A00B36EEC /* Debug */, + 343C79BF1D0C763A00B36EEC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 343C79C01D0C763A00B36EEC /* Build configuration list for PBXNativeTarget "CSFFMpegCapturePlugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 343C79C11D0C763A00B36EEC /* Debug */, + 343C79C21D0C763A00B36EEC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 343C79B21D0C763A00B36EEC /* Project object */; +} diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.h new file mode 100644 index 00000000..6a39672c --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.h @@ -0,0 +1,59 @@ +// +// CSFFMpegCapture.h +// CSFFMpegCapturePlugin +// +// Created by Zakk on 6/11/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CSCaptureBase.h" +#import "CSCaptureSourceProtocol.h" +#import "CSFFMpegInput.h" +#import "CSIOSurfaceLayer.h" +#import "CAMultiAudioPCM.h" +#import "CSPcmPlayer.h" +#import "CSPluginServices.h" +#import "CSFFMpegPlayer.h" + + + + + +#import "libavformat/avformat.h" +#import "libavcodec/avcodec.h" +#import "libavutil/threadmessage.h" +#import "libavutil/pixfmt.h" +#import "libavutil/pixdesc.h" + + +@interface CSFFMpegCapture : CSCaptureBase +{ + AVFormatContext *_avFmtCtx; + AVThreadMessageQueue *_video_msg_queue; + AVThreadMessageQueue *_audio_msg_queue; + + + dispatch_queue_t _video_decoder_queue; + dispatch_queue_t _media_reader_queue; + CAMultiAudioPCM *_bufferPCM; + AudioStreamBasicDescription _asbd; + CFTimeInterval _lastTimeUpdate; + + + +} + +@property (strong) NSString *inputPath; + +@property (strong) CSPcmPlayer *pcmPlayer; +@property (strong) CSFFMpegPlayer *player; + +@property (strong) NSString *currentTimeString; +@property (strong) NSString *durationString; +@property (assign) double currentMovieTime; +@property (assign) double currentMovieDuration; + + + +@end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m new file mode 100644 index 00000000..fc3cab5d --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m @@ -0,0 +1,209 @@ +// +// CSFFMpegCapture.m +// CSFFMpegCapturePlugin +// +// Created by Zakk on 6/11/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSFFMpegCapture.h" + +@implementation CSFFMpegCapture + +@synthesize inputPath = _inputPath; +@synthesize currentMovieTime = _currentMovieTime; + +-(instancetype) init +{ + if (self = [super init]) + { + av_register_all(); + avformat_network_init(); + + + //Inputs resample to floating point non-interleaved 48k for now. + + _asbd.mSampleRate = 48000; + _asbd.mFormatID = kAudioFormatLinearPCM; + _asbd.mFormatFlags = kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsFloat | kAudioFormatFlagIsNonInterleaved; + _asbd.mChannelsPerFrame = 2; + _asbd.mBitsPerChannel = 32; + _asbd.mBytesPerFrame = 4; + _asbd.mBytesPerPacket = 4; + _asbd.mFramesPerPacket = 1; + + _player = [[CSFFMpegPlayer alloc] init]; + + _player.asbd = &_asbd; + _player.itemStarted = ^(CSFFMpegInput *item) { [self itemStarted:item]; }; + + + + + } + return self; +} + ++(NSString *)label +{ + return @"FFMPegPlayer"; +} + + +-(double)currentMovieTime +{ + return _currentMovieTime; +} + +-(void)setCurrentMovieTime:(double)currentMovieTime +{ + if (self.player) + { + [self.player seek:currentMovieTime]; + } +} + + +-(void)itemStarted:(CSFFMpegInput *)item +{ + + NSString *timeString = [self timeToString:item.duration]; + dispatch_async(dispatch_get_main_queue(), ^{ + self.durationString = [self timeToString:item.duration]; + self.currentMovieDuration = item.duration; + }); + +} + + +-(NSString *)inputPath +{ + return _inputPath; +} + + +-(void)setInputPath:(NSString *)inputPath +{ + _inputPath = inputPath; + + if (!self.player.pcmPlayer && self.pcmPlayer) + { + self.player.pcmPlayer = self.pcmPlayer; + } + + CSFFMpegInput *newItem = [[CSFFMpegInput alloc] initWithMediaPath:_inputPath]; + + [self.player enqueueItem:newItem ]; + [self.player play]; +} + + +-(CALayer *)createNewLayer +{ + + CSIOSurfaceLayer *newLayer = [CSIOSurfaceLayer layer]; + + + return newLayer; +} + + +-(NSString *) timeToString:(double)convertTime +{ + + UInt64 minutes = convertTime/60; + UInt64 seconds = (int)convertTime % 60; + return [NSString stringWithFormat:@"%02lld:%02lld", minutes, seconds]; +} + + + +-(void)frameTick +{ + CFTimeInterval cTime = CACurrentMediaTime(); + CVPixelBufferRef use_buf = [self.player frameForMediaTime:cTime]; + + if (use_buf) + { + + if (cTime - _lastTimeUpdate > 0.5) + { + dispatch_async(dispatch_get_main_queue(), ^{ + self.currentTimeString = [self timeToString:self.player.lastVideoTime]; + [self willChangeValueForKey:@"currentMovieTime"]; + _currentMovieTime = self.player.lastVideoTime;; + + [self didChangeValueForKey:@"currentMovieTime"]; + }); + } + [self updateLayersWithBlock:^(CALayer *layer) { + + ((CSIOSurfaceLayer *)layer).imageBuffer = use_buf; + }]; + + CVPixelBufferRelease(use_buf); + + } + //NSLog(@"FFMPEG FRAMETICK!"); +} + +-(void)setIsLive:(bool)isLive +{ + + bool oldLive = super.isLive; + super.isLive = isLive; + + if (isLive == oldLive) + { + return; + } + + if (isLive) + { + + [self registerPCMOutput:1024 audioFormat:&_asbd]; + } else { + [self deregisterPCMOutput]; + } +} + + +-(void)registerPCMOutput:(CMItemCount)frameCount audioFormat:(const AudioStreamBasicDescription *)audioFormat +{ + + if (self.pcmPlayer) + { + //looks like we already have one? + return; + } + + + self.pcmPlayer = [[CSPluginServices sharedPluginServices] createPCMInput:@"BLAHBLAH" withFormat:audioFormat]; + if (self.player) + { + self.player.asbd = &_asbd; + self.player.pcmPlayer = self.pcmPlayer; + } + +} + +-(void)deregisterPCMOutput +{ + + + if (self.pcmPlayer) + { + + [[CSPluginServices sharedPluginServices] removePCMInput:self.pcmPlayer]; + } + + self.pcmPlayer = nil; + self.player.pcmPlayer = nil; + +} + + + + + +@end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h new file mode 100644 index 00000000..99eaf1d0 --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h @@ -0,0 +1,20 @@ +// +// CSFFMpegCaptureViewController.h +// CSFFMpegCapturePlugin +// +// Created by Zakk on 6/14/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CSFFMpegCapture.h" + +@interface CSFFMpegCaptureViewController : NSViewController + +@property (weak) CSFFMpegCapture *captureObj; + +- (IBAction)chooseFile:(id)sender; +- (IBAction)nextAction:(id)sender; +- (IBAction)sliderValueChanged:(id)sender; + +@end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m new file mode 100644 index 00000000..a9d213d3 --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m @@ -0,0 +1,69 @@ +// +// CSFFMpegCaptureViewController.m +// CSFFMpegCapturePlugin +// +// Created by Zakk on 6/14/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSFFMpegCaptureViewController.h" + +@interface CSFFMpegCaptureViewController () + +@end + +@implementation CSFFMpegCaptureViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do view setup here. +} + + +- (IBAction)chooseFile:(id)sender +{ + + NSOpenPanel *panel = [NSOpenPanel openPanel]; + panel.canChooseDirectories = NO; + panel.canCreateDirectories = YES; + panel.canChooseFiles = YES; + panel.allowsMultipleSelection = NO; + + [panel beginWithCompletionHandler:^(NSInteger result) { + if (result == NSFileHandlingPanelOKButton) + { + self.captureObj.inputPath = panel.URL.path; + } + + }]; + +} + +- (IBAction)nextAction:(id)sender +{ + [self.captureObj.player next]; +} + +- (IBAction)sliderValueChanged:(id)sender +{ + NSEvent *event = [[NSApplication sharedApplication] currentEvent]; + BOOL startingDrag = event.type == NSLeftMouseDown; + BOOL endingDrag = event.type == NSLeftMouseUp; + BOOL dragging = event.type == NSLeftMouseDragged; + + + if (startingDrag) { + self.captureObj.player.muted = YES; + self.captureObj.player.seeking = YES; + } + + + if (endingDrag) { + self.captureObj.player.muted = NO; + self.captureObj.player.seeking = NO; + self.captureObj.player.audio_needs_restart = YES; + } +} + + +@end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib new file mode 100644 index 00000000..062dbadd --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h new file mode 100644 index 00000000..92215c14 --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h @@ -0,0 +1,106 @@ +// +// CSFFMpegInput.h +// CSFFMpegCapturePlugin +// +// Created by Zakk on 6/11/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import + +#import "libavformat/avformat.h" +#import "libavcodec/avcodec.h" +#import "libavutil/threadmessage.h" +#include "libswscale/swscale.h" +#include "libswresample/swresample.h" +#include "libavutil/samplefmt.h" + +#import "CAMultiAudioPCM.h" +#import "CSPcmPlayer.h" + + + + + +struct frame_message { + + AVFrame *frame; + int notused; +}; + + +@interface CSFFMpegInput : NSObject +{ + int _video_stream_idx; + int _audio_stream_idx; + struct SwsContext *_sws_ctx; + struct SwrContext *_swr_ctx; + bool _video_done; + bool _audio_done; + uint64_t _seek_time; + bool _seek_request; + bool _stop_request; + + dispatch_queue_t _seek_queue; + + + +} + + +-(instancetype) initWithMediaPath:(NSString *)mediaPath; +-(bool)openMedia:(int)bufferVideoFrames; +-(AVFrame *)consumeFrame; +-(AVFrame *)consumeFrameWithRefill; +-(void)readAndDecodeVideoFrames:(int)frameCnt; +-(void)stop; + + + + + + +@property (strong) NSString *mediaPath; +@property (assign) bool is_ready; +@property (assign) bool is_draining; +@property (assign) AVRational videoTimeBase; +@property (assign) AVRational audioTimeBase; +@property (strong) CSPcmPlayer *pcmPlayer; +@property (assign) bool stopped; +@property (assign) bool paused; +@property (assign) AVThreadMessageQueue *video_message_queue; +@property (assign) AVThreadMessageQueue *audio_message_queue; +@property (assign) AVFormatContext *format_ctx; + +@property (assign) AVCodecContext *video_codec_ctx; +@property (assign) AVCodec *video_codec; + +@property (assign) AVCodecContext *audio_codec_ctx; +@property (assign) AVCodec *audio_codec; + + +@property (nonatomic, copy) void (^completionCallback)(void); +@property (assign) int64_t first_video_pts; +@property (assign) int64_t first_audio_pts; + + +@property (assign) NSSize dimensions; +@property (assign) double duration; + + + +-(AVFrame *)consumeFrame:(int *)error_out; +-(CAMultiAudioPCM *)consumeAudioFrame:(AudioStreamBasicDescription *)asbd error_out:(int *)error_out; +-(void) closeMedia; +-(void) seek:(double)time; + + + + + + + + + +@end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m new file mode 100644 index 00000000..2b5ffb88 --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m @@ -0,0 +1,611 @@ +// +// CSFFMpegInput.m +// CSFFMpegCapturePlugin +// +// Created by Zakk on 6/11/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSFFMpegInput.h" + +@implementation CSFFMpegInput + + +-(instancetype) init +{ + if (self = [super init]) + { + _video_codec = NULL; + _video_codec_ctx = NULL; + _video_stream_idx = -1; + _audio_stream_idx = -1; + _is_ready = NO; + _is_draining = NO; + + _first_video_pts = 0; + _first_audio_pts = 0; + _duration = 0.0f; + _seek_request = NO; + _seek_time = 0; + + _seek_queue = dispatch_queue_create("SEEK QUEUE", DISPATCH_QUEUE_SERIAL); + + av_thread_message_queue_alloc(&_video_message_queue, 300, sizeof(struct frame_message)); + av_thread_message_queue_alloc(&_audio_message_queue, 4096 , sizeof(struct frame_message)); + } + return self; +} + +-(instancetype) initWithMediaPath:(NSString *)mediaPath +{ + if (self = [self init]) + { + self.mediaPath = mediaPath; + } + + return self; +} + +-(bool)openMedia:(int)bufferVideoFrames +{ + + + if (!self.mediaPath) + { + return NO; + } + + + + + AVCodecContext *v_codec_ctx_orig = NULL; + AVCodecContext *a_codec_ctx_orig = NULL; + avformat_open_input(&_format_ctx, self.mediaPath.UTF8String, NULL, NULL); + + avformat_find_stream_info(_format_ctx, NULL); + //av_dump_format(_format_ctx, 0, self.mediaPath.UTF8String, 0); + for (int i=0; i < _format_ctx->nb_streams; i++) + { + if (_format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO && _video_stream_idx == -1) + { + _video_stream_idx = i; + } + + if (_format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO && _audio_stream_idx == -1) + { + _audio_stream_idx = i; + } + + if (_audio_stream_idx > -1 && _video_stream_idx > -1) + { + break; + } + } + if (_video_stream_idx > -1) + { + self.videoTimeBase = _format_ctx->streams[_video_stream_idx]->time_base; + v_codec_ctx_orig = _format_ctx->streams[_video_stream_idx]->codec; + _video_codec = avcodec_find_decoder(v_codec_ctx_orig->codec_id); + _video_codec_ctx = avcodec_alloc_context3(_video_codec); + avcodec_copy_context(_video_codec_ctx, v_codec_ctx_orig); + avcodec_open2(_video_codec_ctx, _video_codec, NULL); + self.dimensions = NSMakeSize(_video_codec_ctx->width, _video_codec_ctx->height); + _sws_ctx = sws_alloc_context(); + av_set_int(_sws_ctx, "srcw", _video_codec_ctx->width); + av_set_int(_sws_ctx, "srch", _video_codec_ctx->height); + av_set_int(_sws_ctx, "src_format", _video_codec_ctx->pix_fmt); + av_set_int(_sws_ctx, "dstw", _video_codec_ctx->width); + av_set_int(_sws_ctx, "dsth", _video_codec_ctx->height); + av_set_int(_sws_ctx, "dst_format", AV_PIX_FMT_YUV420P); + sws_init_context(_sws_ctx, NULL, NULL); + } + if (_audio_stream_idx > -1) + { + self.audioTimeBase = _format_ctx->streams[_audio_stream_idx]->time_base; + + a_codec_ctx_orig = _format_ctx->streams[_audio_stream_idx]->codec; + _audio_codec = avcodec_find_decoder(a_codec_ctx_orig->codec_id); + _audio_codec_ctx = avcodec_alloc_context3(_audio_codec); + avcodec_copy_context(_audio_codec_ctx, a_codec_ctx_orig); + avcodec_open2(_audio_codec_ctx, _audio_codec, NULL); + } + + + self.duration = _format_ctx->duration / (double)AV_TIME_BASE; + + + + [self readAndDecodeVideoFrames:bufferVideoFrames]; + + return YES; +} + + + + + + + + +-(CAMultiAudioPCM *)consumeAudioFrame:(AudioStreamBasicDescription *)asbd error_out:(int *)error_out +{ + struct frame_message msg; + + AudioBufferList *sampleABL = NULL; + int av_ret = 0; + + if (_audio_message_queue && (*error_out = av_thread_message_queue_recv(_audio_message_queue, &msg, 0) >= 0)) + { + + AVFrame *recv_frame; + + recv_frame = msg.frame; + if (!recv_frame) + { + return NULL; + } + + + if (recv_frame->width == 999) + { + //flush PCM player + av_frame_free(&recv_frame); + CAMultiAudioPCM *flushPCM = [[CAMultiAudioPCM alloc] init]; + flushPCM.frameCount = -1; + flushPCM.bufferCount = -1; + return flushPCM; + } + + uint8_t **dst_data = NULL; + int dst_linesize; + + if (!_swr_ctx) + { + uint64_t channel_layout = _audio_codec_ctx->channel_layout; + if (!channel_layout) + { + channel_layout = av_get_default_channel_layout(_audio_codec_ctx->channels); + } + _swr_ctx = swr_alloc_set_opts(NULL, AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_FLTP, asbd->mSampleRate, channel_layout, _audio_codec_ctx->sample_fmt, _audio_codec_ctx->sample_rate, 0, NULL); + swr_init(_swr_ctx); + } + + + int dst_nb_samples = av_rescale_rnd(recv_frame->nb_samples, asbd->mSampleRate, _audio_codec_ctx->sample_rate, AV_ROUND_UP); + av_samples_alloc_array_and_samples(&dst_data, &dst_linesize, 2, dst_nb_samples, AV_SAMPLE_FMT_FLTP, 1); + int conv_samples = swr_convert(_swr_ctx, dst_data, dst_nb_samples, recv_frame->extended_data, recv_frame->nb_samples); + + + + + + int bufferCnt = asbd->mFormatFlags & kAudioFormatFlagIsNonInterleaved ? asbd->mChannelsPerFrame : 1; + + int channelCnt = _audio_codec_ctx->channels; + + long byteCnt = asbd->mBytesPerFrame * dst_nb_samples; + + sampleABL = malloc(sizeof(AudioBufferList) + (bufferCnt-1)*sizeof(AudioBuffer)); + + + sampleABL->mNumberBuffers = bufferCnt; + + for (int i=0; imBuffers[i].mData = dst_data[i]; + + sampleABL->mBuffers[i].mDataByteSize = (UInt32)dst_linesize; + sampleABL->mBuffers[i].mNumberChannels = 1; + } + + av_frame_free(&recv_frame); + + CAMultiAudioPCM *retPCM = [[CAMultiAudioPCM alloc] initWithAudioBufferList:sampleABL streamFormat:asbd]; + return retPCM; + + } else { + return NULL; + } +} + + + +-(void)videoFlush:(bool)withEOF +{ + + struct frame_message msg; + avcodec_flush_buffers(_video_codec_ctx); + int flush_cnt = 0; + if (_video_message_queue) + { + while (av_thread_message_queue_recv(_video_message_queue, &msg, AV_THREAD_MESSAGE_NONBLOCK) >= 0) + { + if (msg.frame) + { + av_frame_free(&msg.frame); + } + } + if (withEOF) + { + av_thread_message_queue_set_err_recv(_video_message_queue, AVERROR_EOF); + } + } + +} + + +-(void)audioFlush +{ + + struct frame_message msg; + int flush_cnt = 0; + + avcodec_flush_buffers(_audio_codec_ctx); + if (_audio_message_queue) + { + while (av_thread_message_queue_recv(_audio_message_queue, &msg, AV_THREAD_MESSAGE_NONBLOCK) >= 0) + { + + if (msg.frame) + { + av_frame_free(&msg.frame); + } + } + + AVFrame *flushFrame = av_frame_alloc(); + flushFrame->width = 999; + msg.frame = flushFrame; + + av_thread_message_queue_send(_audio_message_queue, &msg, AV_THREAD_MESSAGE_NONBLOCK); + + } +} + + +-(void)internal_seek:(int64_t)time +{ + if (_format_ctx) + { + + int seek_ret = av_seek_frame(_format_ctx, _video_stream_idx, time, AVSEEK_FLAG_BACKWARD); + + //int seek_ret = avformat_seek_file(_format_ctx, _video_stream_idx, time-10, time, time+10, AVSEEK_FLAG_BACKWARD); + [self videoFlush:NO]; + [self audioFlush]; + _first_video_pts = 0; + _seek_request = NO; + } +} + +-(void)seek:(double)time +{ + if (_seek_request) return; + + if (_format_ctx) + { + int64_t seek_pts = time / av_q2d(_video_codec_ctx->time_base); + + + _seek_time = seek_pts; + _seek_request = YES; + [self videoFlush:NO]; + //[self audioFlush]; + } + +} + +-(void)stop +{ + _stop_request = YES; +} + +-(AVFrame *)consumeFrame:(int *)error_out +{ + + if (_video_done) + { + return NULL; + } + *error_out = 0; + + struct frame_message msg; + AVFrame *recv_frame; + if ((*error_out = av_thread_message_queue_recv(_video_message_queue, &msg, AV_THREAD_MESSAGE_NONBLOCK)) >= 0) + { + recv_frame = msg.frame; + } else { + if (*error_out == AVERROR_EOF) + { + _video_done = YES; + } + + if (self.is_draining) + { + self.is_ready = NO; + } + recv_frame = NULL; + } + return recv_frame; +} + + +//You should run this is a gcd queue/block +-(void)readAndDecodeVideoFrames:(int)frameCnt +{ + + int read_frames = 0; + AVFrame *output_frame = NULL; + AVPacket av_packet; + bool do_audio = YES; + bool do_video = YES; + struct frame_message msg; + + + + if (!_format_ctx) + { + return; + } + + + int pkt_cnt = 0; + + while (do_audio || do_video) + { + + if (_stop_request) + { + [self closeMedia]; + _stop_request = NO; + + return; + } + + if (_seek_request) + { + [self internal_seek:_seek_time]; + } + + + if (frameCnt == 0 && !self.is_ready) + { + + continue; + } + + output_frame = av_frame_alloc(); + int got_decoded_frame; + int read_ret = 0; + + if (!self.is_draining) + { + read_ret = av_read_frame(_format_ctx, &av_packet); + } else { + + if (do_video) + { + av_init_packet(&av_packet); + av_packet.stream_index = _video_stream_idx; + av_packet.size = 0; + av_packet.data = NULL; + + } else if (do_audio) { + av_init_packet(&av_packet); + av_packet.stream_index = _audio_stream_idx; + av_packet.size = 0; + av_packet.data = NULL; + } + } + + if (read_ret < 0) + { + self.is_draining = YES; + continue; + } + + + + if (do_video && (av_packet.stream_index == _video_stream_idx)) + { + + + //output_frame = av_frame_alloc(); + + if (_first_video_pts == 0 && av_packet.pts != AV_NOPTS_VALUE) + { + _first_video_pts = av_packet.pts; + } + + avcodec_decode_video2(_video_codec_ctx, output_frame, &got_decoded_frame, &av_packet); + if (got_decoded_frame) + { + int width = output_frame->width; + int height = output_frame->height; + + + + AVFrame* conv_frame = avcodec_alloc_frame(); + conv_frame->width = width; + conv_frame->height = height; + conv_frame->format = AV_PIX_FMT_YUV420P; + + int num_bytes = avpicture_get_size(AV_PIX_FMT_YUV420P, width, height); + uint8_t* conv_buffer = (uint8_t *)av_malloc(num_bytes); + avpicture_fill((AVPicture*)conv_frame, conv_buffer, AV_PIX_FMT_YUV420P, width, height); + sws_scale(_sws_ctx, output_frame->data, output_frame->linesize, 0, height, conv_frame->data, conv_frame->linesize); + conv_frame->pts = output_frame->pts; + conv_frame->pkt_dts = output_frame->pkt_dts; + if (output_frame->pkt_pts != AV_NOPTS_VALUE) + { + + conv_frame->pkt_pts = output_frame->pkt_pts; + } else { + conv_frame->pkt_pts = output_frame->pkt_dts; //I guess + } + + av_frame_free(&output_frame); + + read_frames++; + msg.frame = conv_frame; + msg.notused = 0; + av_thread_message_queue_send(_video_message_queue, &msg, 0); + av_free_packet(&av_packet); + + } else { + if (self.is_draining) + { + av_thread_message_queue_set_err_recv(_video_message_queue, AVERROR_EOF); + do_video = NO; + } + } + } else if (do_audio && (av_packet.stream_index == _audio_stream_idx)) { + + + void *orig_data; + size_t orig_size; + orig_size = av_packet.size; + orig_data = av_packet.data; + + if (_first_audio_pts == 0) + { + _first_audio_pts = av_packet.pts; + } + + int read_len; + while (av_packet.size > 0 || av_packet.data == NULL) + { + + read_len = avcodec_decode_audio4(_audio_codec_ctx, output_frame, &got_decoded_frame, &av_packet); + if (got_decoded_frame) + { + if (!output_frame->channel_layout) + { + output_frame->channel_layout = av_get_default_channel_layout(_audio_codec_ctx->channels); + } + AVFrame *cloned_frame = av_frame_clone(output_frame); + + msg.frame = cloned_frame; + msg.notused = 0; + av_thread_message_queue_send(_audio_message_queue, &msg, 0); + + } else { + if (self.is_draining) + { + do_audio = NO; + av_thread_message_queue_set_err_recv(_audio_message_queue, AVERROR_EOF); + break; + } + } + if (!self.is_draining) + { + if (read_len < 0) + { + av_packet.data = orig_data; + av_packet.size = orig_size; + break; + } else { + av_packet.data += read_len; + av_packet.size -= read_len; + } + } + } + av_free_packet(&av_packet); + } + av_frame_free(&output_frame); + if (frameCnt > 0 && read_frames >= frameCnt && !self.is_ready) + { + self.is_ready = YES; + return; + } + + } +} + + +-(void) closeMedia +{ + + struct frame_message msg; + + if (_video_message_queue) + { + while (av_thread_message_queue_recv(_video_message_queue, &msg, AV_THREAD_MESSAGE_NONBLOCK) >= 0) + { + if (msg.frame) + { + av_frame_free(&msg.frame); + } + } + + av_thread_message_queue_set_err_recv(_video_message_queue, AVERROR_EOF); + + } + + if (_audio_message_queue) + { + while (av_thread_message_queue_recv(_audio_message_queue, &msg, AV_THREAD_MESSAGE_NONBLOCK) >= 0) + { + if (msg.frame) + { + av_frame_free(&msg.frame); + } + } + av_thread_message_queue_set_err_recv(_audio_message_queue, AVERROR_EOF); + + } + + if (_video_codec_ctx) + { + avcodec_close(_video_codec_ctx); + } + + if (_audio_codec_ctx) + { + avcodec_close(_audio_codec_ctx); + } + + + if (_format_ctx) + { + avformat_close_input(&_format_ctx); + } + + _video_codec_ctx = NULL; + _audio_codec_ctx = NULL; + + _format_ctx = NULL; + if (_sws_ctx) + { + sws_freeContext(_sws_ctx); + _sws_ctx = NULL; + } + + if (_swr_ctx) + { + swr_free(&_swr_ctx); + } + + + self.duration = 0.0f; + + +} + +-(void)dealloc +{ + [self closeMedia]; + if (_video_message_queue) + { + av_thread_message_queue_free(&_video_message_queue); + _video_message_queue = NULL; + } + + if (_audio_message_queue) + { + av_thread_message_queue_free(&_audio_message_queue); + _audio_message_queue = NULL; + + } +} + +@end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h new file mode 100644 index 00000000..5e14ff7c --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h @@ -0,0 +1,64 @@ +// +// CSFFMpegPlayer.h +// CSFFMpegCapturePlugin +// +// Created by Zakk on 6/17/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CSFFMpegInput.h" +#import "CSPcmPlayer.h" + +@interface CSFFMpegPlayer : NSObject +{ + CFTimeInterval _first_frame_host_time; + AVFrame *_peek_frame; + CVPixelBufferRef _last_buf; + dispatch_queue_t _input_read_queue; + dispatch_queue_t _audio_queue; + bool _audio_done; + bool _video_done; + CVPixelBufferPoolRef *_cvpool; + NSSize _currentSize; + bool _nextFlag; + + +} + + + +@property (strong) NSMutableArray *inputQueue; +@property (strong) CSPcmPlayer *pcmPlayer; +@property (assign) bool paused; +@property (assign) bool playing; + +@property (strong) CSFFMpegInput *currentlyPlaying; +@property (assign) AudioStreamBasicDescription *asbd; + +@property (copy, nonatomic) void (^itemStarted)(CSFFMpegInput *); +@property (assign) double lastVideoTime; +@property (assign) double videoDuration; +@property (assign) bool muted; +@property (assign) bool seeking; +@property (assign) bool audio_needs_restart; + + + + + +-(void)nextItem; +-(void)enqueueItem:(CSFFMpegInput *)item; +-(void)play; +-(void)stop; +-(void)next; +-(void)seek:(double)toTime; +-(void)startAudio; + + + +-(CVPixelBufferRef)frameForMediaTime:(CFTimeInterval)mediaTime; + + + +@end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m new file mode 100644 index 00000000..bb09207a --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m @@ -0,0 +1,424 @@ +// +// CSFFMpegPlayer.m +// CSFFMpegCapturePlugin +// +// Created by Zakk on 6/17/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSFFMpegPlayer.h" + +@implementation CSFFMpegPlayer + + +-(instancetype) init +{ + if (self = [super init]) + { + _input_read_queue = dispatch_queue_create("FFMPEG PLAYER INPUT", DISPATCH_QUEUE_SERIAL); + _audio_queue = dispatch_queue_create("FFMPEG PLAYER AUDIO", DISPATCH_QUEUE_SERIAL); + _currentSize = NSZeroSize; + _inputQueue = [[NSMutableArray alloc] init]; + _nextFlag = NO; + _muted = NO; + + } + + return self; +} + + +-(void)removeObjectFromInputQueueAtIndex:(NSUInteger)index +{ + [_inputQueue removeObjectAtIndex:index]; +} + +-(void)insertObject:(NSObject *)object inInputQueueAtIndex:(NSUInteger)index +{ + [_inputQueue insertObject:object atIndex:index]; +} + + + +-(void)readThread +{ + if (self.currentlyPlaying) + { + [self.currentlyPlaying readAndDecodeVideoFrames:0]; + } +} + + +-(void)nextItem +{ + + CSFFMpegInput *useItem; + _nextFlag = NO; + @synchronized (self) { + useItem = self.currentlyPlaying; + self.currentlyPlaying = nil; + _audio_done = NO; + _video_done = NO; + _first_frame_host_time = 0; + } + + if (useItem) + { + if (self.pcmPlayer) + { + [self.pcmPlayer flush]; + } + } + + if (!self.playing) + { + return; + } + + CSFFMpegInput *nextItem = _inputQueue.firstObject; + if (nextItem) + { + [self playItem:nextItem]; + [self removeObjectFromInputQueueAtIndex:0]; + + } + +} + + +-(void)seek:(double)toTime +{ + if (self.currentlyPlaying) + { + [self.currentlyPlaying seek:toTime]; + _first_frame_host_time = CACurrentMediaTime(); + _peek_frame = NULL; + } +} + + +-(void)playItem:(CSFFMpegInput *)item +{ + dispatch_async(_input_read_queue, ^{ + + [item openMedia:15]; + + if (self.itemStarted) + { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ self.itemStarted(item);}); + } + + self.lastVideoTime = 0.0f; + self.videoDuration = item.duration; + + + @synchronized (self) { + self.currentlyPlaying = item; + self.playing = YES; + } + [self readThread]; + }); +} + + +-(void)enqueueItem:(CSFFMpegInput *)item +{ + [self insertObject:item inInputQueueAtIndex:self.inputQueue.count]; + +} + + +-(void)play +{ + self.playing = YES; + if (!self.currentlyPlaying) + { + + [self nextItem]; + + } +} + +-(void)next +{ + [self.currentlyPlaying stop]; + +} + +-(void)stop +{ + self.playing = NO; + [self.currentlyPlaying closeMedia]; +} + +-(void)startAudio +{ + dispatch_async(_audio_queue, ^{ + [self.pcmPlayer play]; + [self audioThread]; + }); +} + + + +-(void)audioThread +{ + int av_error = 0; + CAMultiAudioPCM *audioPCM = NULL; + CSFFMpegInput *useItem; + bool good_audio = NO; + + while (self.playing && (audioPCM = [self.currentlyPlaying consumeAudioFrame:self.asbd error_out:&av_error])) + { + + if (!self.playing) break; + if (av_error == AVERROR_EOF) + { + break; + } + + if (audioPCM.bufferCount == -1 && audioPCM.frameCount == -1) + { + if (good_audio) + { + //input needs us to flush the player, probably due to seek + [self.pcmPlayer flush]; + return; + } else { + continue; + } + } + + good_audio = YES; + + if (self.muted) + { + continue; + } + if (!self.playing) break; + + if (self.pcmPlayer.pendingFrames > 60) + { + usleep(10000); + } + + if (!self.playing) break; + [self.pcmPlayer playPcmBuffer:audioPCM]; + + if (!self.playing) break; + } + + _audio_done = YES; + [self inputDone]; +} + + + + +-(CVPixelBufferRef)frameForMediaTime:(CFTimeInterval)mediaTime +{ + CSFFMpegInput *_useInput; + + @synchronized (self) { + _useInput = self.currentlyPlaying; + } + + if (!_useInput) + { + return nil; + } + + /* + if (!self.playing) + { + return nil; + }*/ + + + AVFrame *use_frame = NULL; + CVPixelBufferRef ret = nil; + int64_t audio_pts = 0; + bool play_audio = YES; + + + int av_error = 0; + + if (_first_frame_host_time == 0) + { + + play_audio = NO; + + use_frame = [_useInput consumeFrame:&av_error]; + if (use_frame) + { + + _first_frame_host_time = mediaTime; + _peek_frame = NULL; + _last_buf = nil; + audio_pts = use_frame->pkt_pts; + [self startAudio]; + } + } else { + CFTimeInterval host_delta = mediaTime - _first_frame_host_time; + int64_t target_pts = host_delta / av_q2d(self.currentlyPlaying.videoTimeBase); + target_pts += self.currentlyPlaying.first_video_pts; + + audio_pts = target_pts; + + + + int consumed = 0; + use_frame = NULL; + bool do_consume = YES; + + if (_last_buf && _peek_frame) + { + + if (_peek_frame->pkt_pts > target_pts) + { + do_consume = NO; + } else { + use_frame = _peek_frame; + do_consume = YES; + } + } + + while (do_consume && (_peek_frame = [_useInput consumeFrame:&av_error]) && _peek_frame->pkt_pts < target_pts) + { + + if (use_frame) + { + av_frame_free(&use_frame); + use_frame = _peek_frame; + } + consumed++; + } + if (av_error == AVERROR_EOF) + { + _video_done = YES; + } + + consumed++; + } + if (use_frame && !_video_done) + { + if (self.audio_needs_restart) + { + [self startAudio]; + self.audio_needs_restart = NO; + } + + self.lastVideoTime = use_frame->pkt_pts * av_q2d(_useInput.videoTimeBase); + + ret = [self convertFrameToPixelBuffer:use_frame]; + av_frame_free(&use_frame); + CVPixelBufferRetain(ret); + if (_last_buf) + { + CVPixelBufferRelease(_last_buf); + } + _last_buf = ret; + } else { + CVPixelBufferRetain(_last_buf); + ret = _last_buf; + } + + [self inputDone]; + return ret; +} + +-(void)inputDone +{ + if (_audio_done && _video_done) + { + [self.currentlyPlaying stop]; + + [self nextItem]; + } +} + + +-(bool) createPixelBufferPoolForSize:(NSSize) size +{ + + NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; + [attributes setValue:[NSNumber numberWithInt:size.width] forKey:(NSString *)kCVPixelBufferWidthKey]; + [attributes setValue:[NSNumber numberWithInt:size.height] forKey:(NSString *)kCVPixelBufferHeightKey]; + [attributes setValue:@{(NSString *)kIOSurfaceIsGlobal: @NO} forKey:(NSString *)kCVPixelBufferIOSurfacePropertiesKey]; + [attributes setValue:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(NSString *)kCVPixelBufferPixelFormatTypeKey]; + + + + if (_cvpool) + { + CVPixelBufferPoolRelease(_cvpool); + } + + + + CVReturn result = CVPixelBufferPoolCreate(NULL, NULL, (__bridge CFDictionaryRef)(attributes), &_cvpool); + + if (result != kCVReturnSuccess) + { + return NO; + } + + return YES; + + +} + +-(CVPixelBufferRef) convertFrameToPixelBuffer:(AVFrame *)av_frame +{ + if (!av_frame || !av_frame->data[0]) + { + return nil; + } + + + if (av_frame->linesize[1] != av_frame->linesize[2]) + { + return nil; + } + + NSSize frameSize = NSMakeSize(av_frame->width, av_frame->height); + if (!NSEqualSizes(_currentSize, frameSize)) + { + _currentSize = frameSize; + [self createPixelBufferPoolForSize:frameSize]; + } + + + CVPixelBufferRef buf; + CVPixelBufferPoolCreatePixelBuffer(NULL, _cvpool, &buf); + + size_t plane_size = av_frame->linesize[1]*av_frame->height/2; + size_t dst_plane_size = plane_size*2; + uint8_t *dst_plane = malloc(dst_plane_size); + for (size_t i = 0; i < plane_size; i++) + { + dst_plane[2*i] = av_frame->data[1][i]; + dst_plane[2*i+1] = av_frame->data[2][i]; + } + + size_t bytePerRowY = CVPixelBufferGetBytesPerRowOfPlane(buf, 0); + size_t bytesPerRowUV = CVPixelBufferGetBytesPerRowOfPlane(buf, 1); + + CVPixelBufferLockBaseAddress(buf, 0); + + void* base = CVPixelBufferGetBaseAddressOfPlane(buf, 0); + memcpy(base, av_frame->data[0], bytePerRowY*av_frame->height); + + base = CVPixelBufferGetBaseAddressOfPlane(buf, 1); + memcpy(base, dst_plane, bytesPerRowUV*av_frame->height/2); + + + CVPixelBufferUnlockBaseAddress(buf, 0); + + free(dst_plane); + + return buf; +} + + +@end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/Info.plist b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/Info.plist new file mode 100644 index 00000000..43fde119 --- /dev/null +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSHumanReadableCopyright + Copyright © 2016 Zakk. All rights reserved. + NSPrincipalClass + CSFFMpegCapture + + diff --git a/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin/AVFCapture.m b/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin/AVFCapture.m index 118cdf7a..3c8f9f02 100644 --- a/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin/AVFCapture.m +++ b/CapturePlugins/CSAVFCapturePlugin/CSAVFCapturePlugin/AVFCapture.m @@ -233,6 +233,7 @@ [_capture_session registerOutput:self]; + self.captureName = newDev.captureName; self.videoFormats = _selectedVideoCaptureDevice.formats; diff --git a/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m b/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m index e1ebec2f..4fb9ac60 100644 --- a/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m +++ b/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m @@ -8,6 +8,8 @@ #import "MovieCapture.h" +extern void av_register_all(); + void tapInit(MTAudioProcessingTapRef tap, void *clientInfo, void **tapStorageOut) { *tapStorageOut = clientInfo; @@ -117,6 +119,8 @@ void tapProcess(MTAudioProcessingTapRef tap, CMItemCount numberFrames, MTAudioPr { if (self = [super init]) { + + self.repeat = kCSMovieRepeatNone; _currentMovieTime = 0.0f; @@ -140,6 +144,9 @@ void tapProcess(MTAudioProcessingTapRef tap, CMItemCount numberFrames, MTAudioPr } + + + -(void)frameTick { @@ -200,7 +207,7 @@ void tapProcess(MTAudioProcessingTapRef tap, CMItemCount numberFrames, MTAudioPr { AudioStreamBasicDescription asbd = _bufferPCM.pcmFormat; - [self registerPCMOutput:_bufferPCM.frameCount audioFormat:&asbd]; + [self registerPCMOutput:1024 audioFormat:&asbd]; } else { [self deregisterPCMOutput]; } diff --git a/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCaptureViewController.xib b/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCaptureViewController.xib index c54e3e6b..9c4fb79f 100644 --- a/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCaptureViewController.xib +++ b/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCaptureViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -71,12 +71,12 @@ - - + + - + @@ -108,9 +108,11 @@ @@ -162,8 +164,8 @@ - + @@ -201,8 +203,8 @@ - + diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index b13370e4..285ce939 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -67,6 +67,7 @@ 343644081B78F01D0069B8F2 /* CSAnimation.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3494616C1ABD399B00F28883 /* CSAnimation.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 343644091B78F01D0069B8F2 /* pluginbase.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = 34E983841B78B19D00F26F1E /* pluginbase.py */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 343692501B6243D4007EC2D9 /* CSShapeCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 3436922B1B62364E007EC2D9 /* CSShapeCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 343C79ED1D0C796E00B36EEC /* CSFFMpegCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 343C79CC1D0C763A00B36EEC /* CSFFMpegCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 343ED9421BCAC1C80061FC4B /* EditBuiltinLayoutView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 343ED9411BCAC1C80061FC4B /* EditBuiltinLayoutView.xib */; }; 3444D8E819A0CDE8000DC46B /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3444D8E719A0CDE8000DC46B /* Quartz.framework */; }; 344825D21B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344825D11B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib */; }; @@ -360,6 +361,13 @@ remoteGlobalIDString = 343692111B62364E007EC2D9; remoteInfo = CSShapeCapturePlugin; }; + 343C79CB1D0C763A00B36EEC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 343C79C31D0C763A00B36EEC /* CSFFMpegCapturePlugin.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 343C79BA1D0C763A00B36EEC; + remoteInfo = CSFFMpegCapturePlugin; + }; 34A7C1A019B9A41A00BC6882 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 34A7C19C19B9A41900BC6882 /* CSLayoutSwitcherExtraPlugin.xcodeproj */; @@ -553,6 +561,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( + 343C79ED1D0C796E00B36EEC /* CSFFMpegCapturePlugin.bundle in Copy Files */, 343692501B6243D4007EC2D9 /* CSShapeCapturePlugin.bundle in Copy Files */, 34F7C5871B2C9A5300345230 /* CSDeckLinkCapturePlugin.bundle in Copy Files */, 34FDA83E1A84C46500E7F65E /* CSTimeCapturePlugin.bundle in Copy Files */, @@ -657,6 +666,7 @@ 3435E399188B90900015CC01 /* passthrough.fgsh */ = {isa = PBXFileReference; lastKnownFileType = text; name = passthrough.fgsh; path = Shaders/passthrough.fgsh; sourceTree = ""; }; 3435E39A188B93150015CC01 /* passthrough.vtsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = passthrough.vtsh; path = Shaders/passthrough.vtsh; sourceTree = ""; }; 3436921B1B62364E007EC2D9 /* CSShapeCapturePlugin.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CSShapeCapturePlugin.xcodeproj; path = CapturePlugins/CSShapeCapturePlugin/CSShapeCapturePlugin.xcodeproj; sourceTree = ""; }; + 343C79C31D0C763A00B36EEC /* CSFFMpegCapturePlugin.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CSFFMpegCapturePlugin.xcodeproj; path = CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj; sourceTree = ""; }; 343DD65919AAD3060017232A /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; }; 343DD65C19AAD3060017232A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 343DD65E19AAD3060017232A /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; @@ -1272,6 +1282,14 @@ name = Products; sourceTree = ""; }; + 343C79C41D0C763A00B36EEC /* Products */ = { + isa = PBXGroup; + children = ( + 343C79CC1D0C763A00B36EEC /* CSFFMpegCapturePlugin.bundle */, + ); + name = Products; + sourceTree = ""; + }; 3441338C18667F280059B686 /* Compressor */ = { isa = PBXGroup; children = ( @@ -1507,6 +1525,7 @@ 34AFC24319B058800007C07B /* CapturePlugins */ = { isa = PBXGroup; children = ( + 343C79C31D0C763A00B36EEC /* CSFFMpegCapturePlugin.xcodeproj */, 3436921B1B62364E007EC2D9 /* CSShapeCapturePlugin.xcodeproj */, 34F7C55A1B2C908700345230 /* CSDeckLinkCapturePlugin.xcodeproj */, 34FDA8071A84BF9300E7F65E /* CSTimeCapturePlugin.xcodeproj */, @@ -1933,6 +1952,10 @@ ProductGroup = 34AFC24619B05ADA0007C07B /* Products */; ProjectRef = 34AFC24519B05ADA0007C07B /* CSDesktopCapturePlugin.xcodeproj */; }, + { + ProductGroup = 343C79C41D0C763A00B36EEC /* Products */; + ProjectRef = 343C79C31D0C763A00B36EEC /* CSFFMpegCapturePlugin.xcodeproj */; + }, { ProductGroup = 34AFC32C19B0AD500007C07B /* Products */; ProjectRef = 34AFC2E019B08C050007C07B /* CSFileStreamServicePlugin.xcodeproj */; @@ -2011,6 +2034,13 @@ remoteRef = 3436922A1B62364E007EC2D9 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 343C79CC1D0C763A00B36EEC /* CSFFMpegCapturePlugin.bundle */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CSFFMpegCapturePlugin.bundle; + remoteRef = 343C79CB1D0C763A00B36EEC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 34A7C1A119B9A41A00BC6882 /* CSLayoutSwitcherExtraPlugin.bundle */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; @@ -2567,6 +2597,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; @@ -2587,12 +2618,14 @@ "LIBRARY_SEARCH_PATHS[arch=*]" = ""; MACOSX_DEPLOYMENT_TARGET = 10.8; "OTHER_LDFLAGS[arch=*]" = ( + /usr/local/lib/libswresample.a, /usr/local/lib/libavutil.a, /usr/local/lib/libavformat.a, /usr/local/lib/libavcodec.a, /usr/local/lib/libmp3lame.a, /usr/local/lib/libswscale.a, /usr/local/lib/libx264.a, + "-all_load", ); PRODUCT_NAME = CocoaSplit; PROVISIONING_PROFILE = ""; @@ -2607,6 +2640,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; @@ -2628,6 +2662,7 @@ LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.8; "OTHER_LDFLAGS[arch=*]" = ( + /usr/local/lib/libswresample.a, /usr/local/lib/libavformat.a, /usr/local/lib/libavutil.a, /usr/local/lib/libavcodec.a, @@ -2635,6 +2670,7 @@ /usr/local/lib/libswscale.a, /usr/local/lib/libx264.a, "-flat_namespace", + "-all_load", ); PRODUCT_NAME = CocoaSplit; PROVISIONING_PROFILE = ""; diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m index 5a5b111e..29ed9589 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m @@ -441,6 +441,7 @@ OSStatus encoderRenderCallback( void *inRefCon, AudioUnitRenderActionFlags *ioAc [self.graph addNode:input]; [self attachInput:newConverter]; + [self.graph connectNode:input toNode:newConverter sampleRate:input.inputFormat->mSampleRate]; } diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioPCM.m b/CocoaSplit/CAMultiAudio/CAMultiAudioPCM.m index 1ced36d9..36988e65 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioPCM.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioPCM.m @@ -35,6 +35,7 @@ self.frameCount = _audioSlice->mNumberFrames; self.bufferCount = streamFormat->mChannelsPerFrame; + _alloced_buffers = NO; } @@ -91,6 +92,7 @@ } _audioSlice->mBufferList = _pcmData; memcpy(&_pcmFormat, streamFormat, sizeof(AudioStreamBasicDescription)); + _alloced_buffers = YES; } @@ -101,13 +103,14 @@ -(void)dealloc { - //You better not have freed this before - for (int i=0; i < self.bufferCount; i++) + if (_alloced_buffers) { - free(_audioSlice->mBufferList->mBuffers[i].mData); + for (int i=0; i < self.bufferCount; i++) + { + free(_audioSlice->mBufferList->mBuffers[i].mData); + } + free(_audioSlice->mBufferList); } - - free(_audioSlice->mBufferList); free(_audioSlice); } diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.h b/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.h index adc82968..30added0 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.h +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.h @@ -24,6 +24,8 @@ @property (weak) id converterNode; @property (assign) Float64 latestScheduledTime; @property (assign) AudioStreamBasicDescription *inputFormat; +@property (readonly) NSUInteger pendingFrames; +@property (nonatomic, copy) void (^completedBlock)(CAMultiAudioPCM *pcmBuffer); -(void)releasePCM:(CAMultiAudioPCM *)buffer; -(void)scheduleBuffer:(CMSampleBufferRef)sampleBuffer; @@ -32,6 +34,8 @@ -(void)play; +-(void)pause; +-(void)flush; diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m b/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m index 09125226..3d4f9849 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioPCMPlayer.m @@ -41,6 +41,10 @@ void BufferCompletedPlaying(void *userData, ScheduledAudioSlice *bufferList); [self playPcmBuffer:pcmBuffer]; } +-(NSUInteger)pendingFrames +{ + return _pendingBuffers.count; +} -(bool)playPcmBuffer:(CAMultiAudioPCM *)pcmBuffer { @@ -102,6 +106,7 @@ void BufferCompletedPlaying(void *userData, ScheduledAudioSlice *bufferList); + dispatch_async(_pendingQueue, ^{ [_pendingBuffers addObject:pcmBuffer]; @@ -217,6 +222,33 @@ void BufferCompletedPlaying(void *userData, ScheduledAudioSlice *bufferList); } } +-(void)pause +{ + if (self.audioUnit) + { + AudioTimeStamp ts = {0}; + + OSStatus err; + + + + + ts.mFlags = kAudioTimeStampSampleTimeValid; + ts.mSampleTime = MAXFLOAT; + err = AudioUnitSetProperty(self.audioUnit, kAudioUnitProperty_ScheduleStartTimeStamp, kAudioUnitScope_Global, 0, &ts, sizeof(ts)); + + } +} + + +-(void)flush +{ + if (self.audioUnit) + { + AudioUnitReset(self.audioUnit, kAudioUnitScope_Global, 0); + } +} + -(void)play { @@ -225,6 +257,7 @@ void BufferCompletedPlaying(void *userData, ScheduledAudioSlice *bufferList); OSStatus err; + ts.mFlags = kAudioTimeStampSampleTimeValid; ts.mSampleTime = -1; @@ -251,7 +284,14 @@ void BufferCompletedPlaying(void *userData, ScheduledAudioSlice *bufferList) //dispatch_async(dispatch_get_main_queue(), ^{ CAMultiAudioPCMPlayer *pplayer = pcmObj.player; //pplayer.latestScheduledTime = pcmObj.audioSlice->mTimeStamp.mSampleTime + pcmObj.audioSlice->mNumberFrames; + if (pplayer.completedBlock) + { + pplayer.completedBlock(pcmObj); + } + [pplayer releasePCM:pcmObj]; + + //}); diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index e0d89877..a5558eed 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -1576,11 +1576,6 @@ - dispatch_async(_main_capture_queue, ^{[self newFrameTimed];}); - - dispatch_async(_preview_queue, ^{ - [self newStagingFrameTimed]; - }); CSAacEncoder *audioEnc = [[CSAacEncoder alloc] init]; audioEnc.encodedReceiver = self; @@ -1596,6 +1591,11 @@ [self setupInstantRecorder]; } + dispatch_async(_main_capture_queue, ^{[self newFrameTimed];}); + + dispatch_async(_preview_queue, ^{ + [self newStagingFrameTimed]; + }); } diff --git a/CocoaSplit/PluginHeaders/CAMultiAudioPCM.h b/CocoaSplit/PluginHeaders/CAMultiAudioPCM.h index d01b92c3..15ce89f4 100644 --- a/CocoaSplit/PluginHeaders/CAMultiAudioPCM.h +++ b/CocoaSplit/PluginHeaders/CAMultiAudioPCM.h @@ -19,6 +19,7 @@ size_t _audioBufferListSize; size_t _audioBufferDataSize; AudioBufferList *_pcmData; + bool _alloced_buffers; } @property (assign) ScheduledAudioSlice *audioSlice; diff --git a/CocoaSplit/PluginHeaders/CSPcmPlayer.h b/CocoaSplit/PluginHeaders/CSPcmPlayer.h index 26ad7b6d..a1ac7bdc 100644 --- a/CocoaSplit/PluginHeaders/CSPcmPlayer.h +++ b/CocoaSplit/PluginHeaders/CSPcmPlayer.h @@ -18,9 +18,14 @@ @property (strong) NSString *name; @property (strong) NSString *nodeUID; +@property (readonly) NSUInteger pendingFrames; +@property (nonatomic, copy) void (^completedBlock)(CAMultiAudioPCM *pcmBuffer); -(void)scheduleBuffer:(CMSampleBufferRef)sampleBuffer; -(bool)playPcmBuffer:(CAMultiAudioPCM *)pcmBuffer; +-(void)play; +-(void)pause; +-(void)flush; @end diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 02dd4cf9..e017de20 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -307,7 +307,7 @@ - + @@ -383,6 +383,17 @@ + @@ -607,11 +618,11 @@ -
+ -
@@ -1550,11 +1561,11 @@ - + - + @@ -1586,7 +1597,7 @@ - + + + + + + + + + + + + - + @@ -132,7 +116,7 @@ - + @@ -140,29 +124,70 @@ - - - - + + + + + + + + + + + + + + + + + + + + - + + - + + + + @@ -175,4 +200,10 @@ + + + + + + diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h index 2dc473c9..ed356147 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h @@ -90,6 +90,7 @@ struct frame_message { @property (assign) NSSize dimensions; @property (assign) double duration; +@property (strong) NSString *shortName; -(AVFrame *)consumeFrame:(int *)error_out; diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m index 7075ddba..abd09af3 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m @@ -30,8 +30,6 @@ _seek_queue = dispatch_queue_create("SEEK QUEUE", DISPATCH_QUEUE_SERIAL); - av_thread_message_queue_alloc(&_video_message_queue, 300, sizeof(struct frame_message)); - av_thread_message_queue_alloc(&_audio_message_queue, 4096 , sizeof(struct frame_message)); } return self; } @@ -41,6 +39,7 @@ if (self = [self init]) { self.mediaPath = mediaPath; + self.shortName = [mediaPath lastPathComponent]; } return self; @@ -55,9 +54,28 @@ return NO; } - - - + + if (!_video_message_queue) + { + av_thread_message_queue_alloc(&_video_message_queue, 300, sizeof(struct frame_message)); + } + + if (!_audio_message_queue) + { + av_thread_message_queue_alloc(&_audio_message_queue, 4096 , sizeof(struct frame_message)); + } + + av_thread_message_queue_set_err_recv(_video_message_queue, 0); + av_thread_message_queue_set_err_recv(_audio_message_queue, 0); + av_thread_message_queue_set_err_send(_video_message_queue, 0); + av_thread_message_queue_set_err_send(_audio_message_queue, 0); + + + + + + + AVCodecContext *v_codec_ctx_orig = NULL; AVCodecContext *a_codec_ctx_orig = NULL; avformat_open_input(&_format_ctx, self.mediaPath.UTF8String, NULL, NULL); @@ -111,8 +129,17 @@ } + self.is_ready = NO; + _stop_request = NO; + self.is_draining = NO; + _video_done = NO; + _audio_done = NO; + + self.duration = _format_ctx->duration / (double)AV_TIME_BASE; + + [self readAndDecodeVideoFrames:bufferVideoFrames]; @@ -338,6 +365,12 @@ -(AVFrame *)consumeFrame:(int *)error_out { + if (!_video_message_queue) + { + return NULL; + } + + if (_video_done) { return NULL; @@ -366,6 +399,7 @@ //You should run this is a gcd queue/block + -(void)readAndDecodeVideoFrames:(int)frameCnt { @@ -389,12 +423,10 @@ while (do_audio || do_video) { - if (_stop_request) { [self closeMedia]; _stop_request = NO; - return; } @@ -602,6 +634,8 @@ return ret; } + + -(void) closeMedia { diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h index 2c5a7ef4..1c0de254 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h @@ -24,6 +24,8 @@ bool _nextFlag; int64_t _first_video_pts; bool _flushAudio; + int _doneDirection; + CSFFMpegInput *_forceNextInput; @@ -40,6 +42,8 @@ @property (assign) AudioStreamBasicDescription *asbd; @property (copy, nonatomic) void (^itemStarted)(CSFFMpegInput *); +@property (copy, nonatomic) void (^pauseStateChanged)(); + @property (assign) double lastVideoTime; @property (assign) double videoDuration; @property (assign) bool muted; @@ -51,11 +55,16 @@ -(void)nextItem; +-(void)previousItem; -(void)enqueueItem:(CSFFMpegInput *)item; -(void)play; -(void)stop; -(void)next; -(void)pause; +-(void)back; +-(void)playAndAddItem:(CSFFMpegInput *)item; + + -(void)seek:(double)toTime; -(void)startAudio; diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m index 8aad2418..7cb96cf7 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m @@ -23,6 +23,7 @@ _inputQueue = [[NSMutableArray alloc] init]; _nextFlag = NO; _muted = NO; + _doneDirection = 1; } @@ -67,9 +68,8 @@ } --(void)nextItem +-(CSFFMpegInput *)preChangeItem { - CSFFMpegInput *useItem; _nextFlag = NO; @synchronized (self) { @@ -89,22 +89,99 @@ } } + if (useItem) + { + [useItem closeMedia]; + } + + + return useItem; + +} + + +-(void)previousItem +{ + CSFFMpegInput *useItem = [self preChangeItem]; + + if (!self.playing) + { + return; + } + + NSInteger currentIdx = 0; + + currentIdx = [_inputQueue indexOfObject:useItem]; + + currentIdx--; + + if (currentIdx < 0) + { + currentIdx = _inputQueue.count-1; + } + + + + CSFFMpegInput *nextItem = [_inputQueue objectAtIndex:currentIdx]; + if (nextItem) + { + [self playItem:nextItem]; + //[self removeObjectFromInputQueueAtIndex:0]; + + } + +} + + +-(void)nextItem +{ + CSFFMpegInput *useItem = [self preChangeItem]; + if (!self.playing) { return; } - CSFFMpegInput *nextItem = _inputQueue.firstObject; + NSUInteger currentIdx = 0; + + currentIdx = [_inputQueue indexOfObject:useItem]; + + currentIdx++; + + if (currentIdx >= _inputQueue.count) + { + currentIdx = 0; + } + + CSFFMpegInput *nextItem = [_inputQueue objectAtIndex:currentIdx]; if (nextItem) { [self playItem:nextItem]; - [self removeObjectFromInputQueueAtIndex:0]; + //[self removeObjectFromInputQueueAtIndex:0]; } } +-(void)playAndAddItem:(CSFFMpegInput *)item; +{ + if ([_inputQueue indexOfObject:item] == NSNotFound) + { + [self enqueueItem:item]; + } + + if (!self.playing) + { + self.currentlyPlaying = item; + [self playItem:item]; + } else { + _forceNextInput = item; + [self.currentlyPlaying stop]; + } +} + + -(void)seek:(double)toTime { if (self.currentlyPlaying) @@ -155,17 +232,36 @@ { [self nextItem]; - + } else { + [self playItem:self.currentlyPlaying]; + } + + if (self.paused) + { + [self pause]; } } -(void)next { _flushAudio = YES; + _doneDirection = 1; [self.currentlyPlaying stop]; - } +-(void)back +{ + _flushAudio = YES; + if (self.lastVideoTime >= 1.5) + { + [self seek:0.0]; + } else { + _doneDirection = -1; + [self.currentlyPlaying stop]; + } +} + + -(void)stop { self.playing = NO; @@ -253,7 +349,6 @@ if (!self.playing) break; } - NSLog(@"OUT OF LOOP"); _audio_done = YES; [self inputDone]; } @@ -270,9 +365,15 @@ } else { self.paused = YES; } + + if (self.pauseStateChanged) + { + self.pauseStateChanged(); + } } + -(CVPixelBufferRef)frameForMediaTime:(CFTimeInterval)mediaTime { CSFFMpegInput *_useInput; @@ -286,12 +387,6 @@ return nil; } - /* - if (!self.playing) - { - return nil; - }*/ - AVFrame *use_frame = NULL; CVPixelBufferRef ret = nil; @@ -407,7 +502,17 @@ { [self.currentlyPlaying stop]; + if (_forceNextInput) + { + [self preChangeItem]; + [self playItem:_forceNextInput]; + _forceNextInput = nil; + } else if (_doneDirection > 0) { [self nextItem]; + } else if (_doneDirection < 0) { + [self previousItem]; + } + } } diff --git a/CSFFMpegCapturePlugin/Media.xcassets/Contents.json b/CSFFMpegCapturePlugin/Media.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/CSFFMpegCapturePlugin/Media.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/Contents.json b/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/Contents.json new file mode 100644 index 00000000..3c0493aa --- /dev/null +++ b/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "fastforward.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/fastforward.png b/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/fastforward.png new file mode 100644 index 0000000000000000000000000000000000000000..a64f2fa0acc18fe88f6bd77e4203877f5b235d18 GIT binary patch literal 1542 zcmY*Zdo+}39R6Hmgd9}Z_>@YRt8$mikfCxNg>~7P@!?}`&3x0~sF9k~b|jbDirlwF zVN8gTTf5bk$cmIpi8^sCX^o<^?Kj%X+3%e9`<>tWKF{xY-sg|^bfCYFHpUnO0D!hH z#VZ)CQRwp3P)GkUc2@pqQRRF3QZ>*oO(XUc+G}zt;d~T7q*zLxmIcY^rV-*DhJp{0ad`0sb1udxXp;g&g%KtM1TtwU5D%ma5QM|#gD```2Kf-e zP`^Hd0`(L?4*`{h33Hc>Q`X`^}ty5e;8tLSS&R2RUh0{ zPV6cLp9=9fcp{E~zdPBs3;-$vzFr>G`n7QbF)p%>C*|?F!nm+fz=7t*`?HvPDgj-(s#$U1xkBg~@H1u;y z-soWDFywB3R5wziuxihhlI@)&TAj#QuDYak3wW>ofLhM(%jy6=q-z)PojvS}ROVDn zT;r>Q@Keh(qTd*7J!DdEJonzdT~cvT$Df~EUJbhkq@TCpcVzC{Wu-FqX7Q$&y|Sfy zlxiN56u`C21b^rfX`yef2S&?V>cwRRhgm^eqg1p?K5=Of5e=hOsHzVIWrxtN662 ztK_P5LHe*}P;w%aGIckvv!-b@5S3FBR!?e{Z$w!lLbtZ|ShHH;{P73HbWi)CFM87= z*LspjDIk5e=wj#r=2Y(47QAKtP7O_6{i88~mM{>k(}r#!De#%=T0ibhs(*XLqqL$s zk=Gz7MS`+)+Hv`~%4c0q#Qk>~oPU)C%BWGl3!*HeuCh&4Y8`WWePv!zV@c?w>7R$5 z_0D)sAGhzy>+BIsk(#16_?b1pO%Z63R^cMiQae4@jLY9W5HVjpbmpVftk(MM)$}#( zX7ZSW_3d%%J5rOnLK@n7HXkY3_G$ZcUG_*qp1kYw6g2LrmYu!VOailM?~*g+<^>aa zNrU-1PWdLk>dBvLln8`easUB}$EQGp+O*&mlqB_jVR6i>L#`<(;z+4EFlT z8uH!r6DY%!viY^sF%uTj4U`viBQI5ouF=;=TYRo5DNcTyW9(y+YxjNV(pK)yA58R9 zwH%^0op%%CR*W4Uo7=0)gYw&}O{?cO-Vu{MznuJ|ZcJ=7I`eXQUEhK&xiQT!x-61b z+~?f0cCb1kS==!1em^p%uT{|oFJZa8#G6*~XcQQU$qs3gSR*5sN+Tf5qu{wSh_{ti zn;p4-kDXYQw_6|^VX!YfYL`7+J1E`Z@^mq#wOjq8$v88ec}QTrqVpj@He9J8%SP$5 z;_atGn)T)3#smviEap*;&i%0Bz#g(L(U#h6@Lbv{0~65DUV1i`va*6H801hb9|sdMHVoLkb?8%ucdHcXyWAS=TLI z^inN&^HvWM@TLVXl7k*Z=*5CZj|IhpXgw$uL{Q%*{?KCw-aO{L@4fGv?@n#;^61FK z2tsJII&UsPo`RT7r{LcH@TCXoXi%y)(r|91t=sS(_UBguz`sf2NGY><9f~JarKy%h zTSY`N6h%>%d#eE@KFbQ(+59{^0iaU}sKJ%PP|YDRleiTsCA4dT@8AKm+aT zzs9I=UGTiG!|%^n{SkeQNue9roWA|;`FG&pRdcRk-`sosWEdI8hhDtA+xvBPFZHv0 zZ0N#+=BJ&VxOZ{)+pFFEVBy?C{a!aysc&@0D`z&A#vf)5Q#et-pIv|ZBYg!(QMIyY JZk4Xy`VGv=<&*#b literal 0 HcmV?d00001 diff --git a/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/Contents.json b/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/Contents.json new file mode 100644 index 00000000..5f85e051 --- /dev/null +++ b/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "play.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/play.png b/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/play.png new file mode 100644 index 0000000000000000000000000000000000000000..3e22aaa8398b6fa53f1f48ad94b94b855fece3a0 GIT binary patch literal 1097 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 - + @@ -581,7 +581,7 @@ - - + @@ -630,7 +630,7 @@ - - - - - - - - + @@ -1558,14 +1558,14 @@ - + - + - + @@ -1597,7 +1597,7 @@ - + - + - + @@ -1676,7 +1676,7 @@ - + From 41f3c337abe7af2acdf66242b6e22ec4bf39ec95 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 27 Jun 2016 04:35:17 -0400 Subject: [PATCH 102/156] Renamed FFMPeg to 'Movie' and the old movie to 'AppleMovie' --- CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m | 2 +- .../CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m index 9d4771fb..e6cd1efc 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m @@ -99,7 +99,7 @@ +(NSString *)label { - return @"FFMPegPlayer"; + return @"Movie"; } diff --git a/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m b/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m index 4fb9ac60..8c89ab7a 100644 --- a/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m +++ b/CapturePlugins/CSMovieCapturePlugin/CSMovieCapturePlugin/MovieCapture.m @@ -598,7 +598,7 @@ void tapProcess(MTAudioProcessingTapRef tap, CMItemCount numberFrames, MTAudioPr +(NSString *)label { - return @"Movie"; + return @"AppleMovie"; } From bd17b49612af7eb10e5d400c4c2c0ab7fd44f00c Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 27 Jun 2016 06:04:35 -0400 Subject: [PATCH 103/156] Allow/cleanup manual adding of Movie source strings (paths or network urls) --- .../CSFFMpegCaptureViewController.h | 2 + .../CSFFMpegCaptureViewController.m | 10 +++ .../CSFFMpegCaptureViewController.xib | 75 +++++++++++-------- .../CSMovieCapturePlugin/MovieCapture.m | 2 + 4 files changed, 58 insertions(+), 31 deletions(-) diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h index 2f323e53..dcd0aa89 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h @@ -14,6 +14,7 @@ @property (weak) CSFFMpegCapture *captureObj; @property (weak) IBOutlet NSSegmentedControl *playlistControl; @property (strong) IBOutlet NSArrayController *queueArrayController; +@property (strong) NSString *stringItem; - (IBAction)queueTableDoubleClick:(NSTableView *)sender; @@ -24,5 +25,6 @@ - (IBAction)pauseAction:(id)sender; - (IBAction)tableControlAction:(NSSegmentedControl *)sender; +- (IBAction)manualAddItem:(id)sender; @end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m index 9dc31371..0e549347 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m @@ -85,6 +85,16 @@ } } +- (IBAction)manualAddItem:(id)sender +{ + if (self.stringItem) + { + [self.captureObj queuePath:self.stringItem]; + self.stringItem = nil; + } +} + + -(void)pauseStateChanged diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib index a6a15488..70e1b256 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib @@ -19,20 +19,23 @@ - - - + + + + + + - + - + @@ -45,8 +48,8 @@ - - + + @@ -57,9 +60,9 @@ - - - + + + @@ -94,9 +97,9 @@ - - - + + + @@ -105,9 +108,9 @@ - - - + + + @@ -116,8 +119,8 @@ - - + + @@ -147,25 +150,25 @@ - - - + + + - - - + + + - - - + + + @@ -173,11 +176,21 @@ - + + + - + diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h index b03c9645..13cf2d35 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h @@ -26,6 +26,9 @@ bool _flushAudio; int _doneDirection; CSFFMpegInput *_forceNextInput; + bool _seekRequest; + double _seekRequestTime; + diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m index 66c2a493..c3ba4923 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m @@ -72,6 +72,11 @@ { if (self.currentlyPlaying) { + if (_seekRequest) + { + [self seek:_seekRequestTime]; + } + [self.currentlyPlaying readAndDecodeVideoFrames:0]; } } @@ -207,13 +212,22 @@ -(void)seek:(double)toTime { - if (self.currentlyPlaying) + + if (_seekRequest) { [self.currentlyPlaying seek:toTime]; _first_frame_host_time = 0; _peek_frame = NULL; _first_video_pts = 0; + _seekRequest = NO; + _seekRequestTime = 0.0f; + + } else { + _seekRequest = YES; + _seekRequestTime = toTime; + } + } @@ -262,6 +276,12 @@ if (self.paused) { [self pause]; + } else { + + if (self.pauseStateChanged) + { + self.pauseStateChanged(); + } } } @@ -410,6 +430,11 @@ return nil; } + if (_seekRequest) + { + [self seek:_seekRequestTime]; + } + AVFrame *use_frame = NULL; CVPixelBufferRef ret = nil; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 6460fb56..ee526f2d 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1562,11 +1562,11 @@ - + - + @@ -1598,7 +1598,7 @@ - + - - - + + @@ -404,14 +402,11 @@ - - + + - + - - - @@ -421,7 +416,7 @@ - + @@ -429,11 +424,8 @@ - - + @@ -479,7 +471,7 @@ - + @@ -502,7 +494,7 @@ - + @@ -510,24 +502,21 @@ - + - - - - + - + @@ -542,7 +531,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - + + @@ -627,12 +588,9 @@ - - - - - - - - - + + + + + + @@ -1562,11 +1528,11 @@ - + - + @@ -1598,7 +1564,7 @@ - + @@ -1863,23 +1831,6 @@ - - - - - - - - - - - - - - - - - @@ -1962,15 +1913,7 @@ MgA3AEEARwBQAFcAXABkAHkAewB9AH8AgQCLAJAAlQCgAKMApQCnAKkArgC5AMIAygDNANYA2wDoAOwA - - - - - - - - - + From eef5f972b6a4cbaed6c2c07a83127e853d53cafa Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 4 Jul 2016 14:11:53 -0400 Subject: [PATCH 111/156] Set version to 2.0.8. Change FFMpeg movie source to deployment target 10.8 so assets work on 10.9 --- .../CSFFMpegCapturePlugin.xcodeproj/project.pbxproj | 6 ++++-- CocoaSplit/CocoaSplit-Info.plist | 4 ++-- CocoaSplit/Interface/InputPopupControllerViewController.xib | 6 +++--- CocoaSplit/en.lproj/MainMenu.xib | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj index 3c806db3..7b33ee82 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj @@ -12,7 +12,7 @@ 34BDCD651D10F4E100F51996 /* CSFFMpegCaptureViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34BDCD631D10F4E100F51996 /* CSFFMpegCaptureViewController.m */; }; 34BDCD661D10F4E100F51996 /* CSFFMpegCaptureViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34BDCD641D10F4E100F51996 /* CSFFMpegCaptureViewController.xib */; }; 34BDCD7D1D14178800F51996 /* CSFFMpegPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34BDCD7C1D14178800F51996 /* CSFFMpegPlayer.m */; }; - 34BDCD7F1D1FE4A700F51996 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 34BDCD7E1D1FE4A700F51996 /* Media.xcassets */; }; + 34EA820A1D2AB65300928A06 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 34BDCD7E1D1FE4A700F51996 /* Media.xcassets */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -166,7 +166,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 34BDCD7F1D1FE4A700F51996 /* Media.xcassets in Resources */, + 34EA820A1D2AB65300928A06 /* Media.xcassets in Resources */, 34BDCD661D10F4E100F51996 /* CSFFMpegCaptureViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -278,6 +278,7 @@ HEADER_SEARCH_PATHS = /usr/local/include; INFOPLIST_FILE = CSFFMpegCapturePlugin/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + MACOSX_DEPLOYMENT_TARGET = 10.8; OTHER_LDFLAGS = ( "-undefined", suppress, @@ -299,6 +300,7 @@ HEADER_SEARCH_PATHS = /usr/local/include; INFOPLIST_FILE = CSFFMpegCapturePlugin/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + MACOSX_DEPLOYMENT_TARGET = 10.8; OTHER_LDFLAGS = ( "-undefined", suppress, diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index 035933da..b7c3b0ad 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.7 + 2.0.8 CFBundleSignature ???? CFBundleVersion - 2.0.7 + 2.0.8 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion diff --git a/CocoaSplit/Interface/InputPopupControllerViewController.xib b/CocoaSplit/Interface/InputPopupControllerViewController.xib index 5412c810..ce488715 100644 --- a/CocoaSplit/Interface/InputPopupControllerViewController.xib +++ b/CocoaSplit/Interface/InputPopupControllerViewController.xib @@ -905,11 +905,11 @@ - + - + @@ -974,7 +974,7 @@ - +
- + @@ -689,7 +689,7 @@ - + @@ -1532,7 +1532,7 @@ - + diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin.xcodeproj/project.pbxproj b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin.xcodeproj/project.pbxproj index cb048096..c8ea719e 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin.xcodeproj/project.pbxproj +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin.xcodeproj/project.pbxproj @@ -12,6 +12,10 @@ 34AFC2E919B08C810007C07B /* FileStreamService.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC2E819B08C810007C07B /* FileStreamService.m */; }; 34AFC2ED19B08CA80007C07B /* FileStreamServiceViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC2EB19B08CA80007C07B /* FileStreamServiceViewController.m */; }; 34AFC2EE19B08CA80007C07B /* FileStreamServiceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34AFC2EC19B08CA80007C07B /* FileStreamServiceViewController.xib */; }; + 34EA82211D3A3B6900928A06 /* CSFileStreamServiceFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 34EA82201D3A3B6900928A06 /* CSFileStreamServiceFactory.m */; }; + 34EA82241D3A3C4E00928A06 /* CSFileStreamRTMPService.m in Sources */ = {isa = PBXBuildFile; fileRef = 34EA82231D3A3C4E00928A06 /* CSFileStreamRTMPService.m */; }; + 34EA82281D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34EA82261D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.m */; }; + 34EA82291D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34EA82271D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.xib */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -33,6 +37,13 @@ 34D6580C19B343290012E32B /* CSCaptureSourceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureSourceProtocol.h; path = PluginHeaders/CSCaptureSourceProtocol.h; sourceTree = ""; }; 34D6580D19B343290012E32B /* CSStreamServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSStreamServiceProtocol.h; path = PluginHeaders/CSStreamServiceProtocol.h; sourceTree = ""; }; 34D6580E19B343290012E32B /* CSPluginFactoryProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginFactoryProtocol.h; path = PluginHeaders/CSPluginFactoryProtocol.h; sourceTree = ""; }; + 34EA821F1D3A3B6900928A06 /* CSFileStreamServiceFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSFileStreamServiceFactory.h; sourceTree = ""; }; + 34EA82201D3A3B6900928A06 /* CSFileStreamServiceFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSFileStreamServiceFactory.m; sourceTree = ""; }; + 34EA82221D3A3C4E00928A06 /* CSFileStreamRTMPService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSFileStreamRTMPService.h; sourceTree = ""; }; + 34EA82231D3A3C4E00928A06 /* CSFileStreamRTMPService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSFileStreamRTMPService.m; sourceTree = ""; }; + 34EA82251D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSFileStreamRTMPServiceViewController.h; sourceTree = ""; }; + 34EA82261D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSFileStreamRTMPServiceViewController.m; sourceTree = ""; }; + 34EA82271D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CSFileStreamRTMPServiceViewController.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -93,6 +104,13 @@ 34AFC2EA19B08CA80007C07B /* FileStreamServiceViewController.h */, 34AFC2EB19B08CA80007C07B /* FileStreamServiceViewController.m */, 34AFC2EC19B08CA80007C07B /* FileStreamServiceViewController.xib */, + 34EA821F1D3A3B6900928A06 /* CSFileStreamServiceFactory.h */, + 34EA82201D3A3B6900928A06 /* CSFileStreamServiceFactory.m */, + 34EA82221D3A3C4E00928A06 /* CSFileStreamRTMPService.h */, + 34EA82231D3A3C4E00928A06 /* CSFileStreamRTMPService.m */, + 34EA82251D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.h */, + 34EA82261D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.m */, + 34EA82271D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.xib */, ); path = CSFileStreamServicePlugin; sourceTree = ""; @@ -171,6 +189,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 34EA82291D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.xib in Resources */, 34AFC2EE19B08CA80007C07B /* FileStreamServiceViewController.xib in Resources */, 34AFC2D919B08C050007C07B /* InfoPlist.strings in Resources */, ); @@ -184,7 +203,10 @@ buildActionMask = 2147483647; files = ( 34AFC2ED19B08CA80007C07B /* FileStreamServiceViewController.m in Sources */, + 34EA82281D3A3FF600928A06 /* CSFileStreamRTMPServiceViewController.m in Sources */, 34AFC2E919B08C810007C07B /* FileStreamService.m in Sources */, + 34EA82241D3A3C4E00928A06 /* CSFileStreamRTMPService.m in Sources */, + 34EA82211D3A3B6900928A06 /* CSFileStreamServiceFactory.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.h b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.h new file mode 100644 index 00000000..3a218707 --- /dev/null +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.h @@ -0,0 +1,25 @@ +// +// CSFileStreamRTMPService.h +// CSFileStreamServicePlugin +// +// Created by Zakk on 7/16/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CSStreamServiceProtocol.h" + +@interface CSFileStreamRTMPService : NSObject + + +@property bool isReady; +@property (strong) NSString *destinationURI; + + +-(NSViewController *)getConfigurationView; +-(NSString *)getServiceDestination; ++(NSString *)label; ++(NSString *)serviceDescription; + + +@end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.m b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.m new file mode 100644 index 00000000..0e3b945f --- /dev/null +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.m @@ -0,0 +1,80 @@ +// +// CSFileStreamRTMPService.m +// CSFileStreamServicePlugin +// +// Created by Zakk on 7/16/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSFileStreamRTMPService.h" +#import "CSFileStreamRTMPServiceViewController.h" + + +@implementation CSFileStreamRTMPService + +-(instancetype) init +{ + if(self = [super init]) + { + self.isReady = YES; + } + return self; +} + + +-(void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.destinationURI forKey:@"destinationURI"]; +} + + +-(instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [self init]) + { + self.destinationURI = [aDecoder decodeObjectForKey:@"destinationURI"]; + } + + return self; +} + + +-(NSViewController *)getConfigurationView +{ + + CSFileStreamRTMPServiceViewController *configViewController; + + configViewController = [[CSFileStreamRTMPServiceViewController alloc] initWithNibName:@"CSFileStreamRTMPServiceViewController" bundle:[NSBundle bundleForClass:self.class]]; + configViewController.serviceObj = self; + return configViewController; +} + + + +-(NSString *)getServiceFormat +{ + return @"FLV"; +} + + + +-(NSString *)getServiceDestination +{ + + return self.destinationURI; +} + + + ++(NSString *)label +{ + return @"RTMP"; +} + + ++(NSString *)serviceDescription +{ + return @"RTMP"; +} + +@end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPServiceViewController.h b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPServiceViewController.h new file mode 100644 index 00000000..9979cd48 --- /dev/null +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPServiceViewController.h @@ -0,0 +1,18 @@ +// +// CSFileStreamRTMPServiceViewController.h +// CSFileStreamServicePlugin +// +// Created by Zakk on 7/16/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CSFileStreamRTMPService.h" + +@interface CSFileStreamRTMPServiceViewController : NSViewController + +@property (weak) CSFileStreamRTMPService *serviceObj; +@property (strong) IBOutlet NSObjectController *fileStreamRTMPServiceController; + + +@end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPServiceViewController.m b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPServiceViewController.m new file mode 100644 index 00000000..80d4654e --- /dev/null +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPServiceViewController.m @@ -0,0 +1,22 @@ +// +// CSFileStreamRTMPServiceViewController.m +// CSFileStreamServicePlugin +// +// Created by Zakk on 7/16/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSFileStreamRTMPServiceViewController.h" + +@interface CSFileStreamRTMPServiceViewController () + +@end + +@implementation CSFileStreamRTMPServiceViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do view setup here. +} + +@end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPServiceViewController.xib b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPServiceViewController.xib new file mode 100644 index 00000000..db9bb091 --- /dev/null +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPServiceViewController.xib @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServiceFactory.h b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServiceFactory.h new file mode 100644 index 00000000..0b5b9f54 --- /dev/null +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServiceFactory.h @@ -0,0 +1,20 @@ +// +// CSFileStreamServiceFactory.h +// CSFileStreamServicePlugin +// +// Created by Zakk on 7/16/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CSPluginFactoryProtocol.h" +#import "FileStreamService.h" +#import "CSFileStreamRTMPService.h" + + +@interface CSFileStreamServiceFactory : NSObject ++(NSArray *)captureSourceClasses; ++(NSArray *)streamServiceClasses; ++(NSArray *)extraPluginClasses; + +@end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServiceFactory.m b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServiceFactory.m new file mode 100644 index 00000000..9377d20b --- /dev/null +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServiceFactory.m @@ -0,0 +1,29 @@ +// +// CSFileStreamServiceFactory.m +// CSFileStreamServicePlugin +// +// Created by Zakk on 7/16/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSFileStreamServiceFactory.h" + + +@implementation CSFileStreamServiceFactory ++(NSArray *)captureSourceClasses +{ + return @[[FileStreamService class], [CSFileStreamRTMPService class]];} + + ++(NSArray *)streamServiceClasses +{ + return nil; +} + ++(NSArray *)extraPluginClasses +{ + return nil; +} + + +@end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServicePlugin-Info.plist b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServicePlugin-Info.plist index bceb9c0e..85ee6a3e 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServicePlugin-Info.plist +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamServicePlugin-Info.plist @@ -25,6 +25,6 @@ NSHumanReadableCopyright Copyright © 2014 Zakk. All rights reserved. NSPrincipalClass - FileStreamService + CSFileStreamServiceFactory diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m index 181cbde2..a274a7a5 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m @@ -98,13 +98,13 @@ +(NSString *)label { - return @"File/RTMP"; + return @"File"; } +(NSString *)serviceDescription { - return @"File/RTMP"; + return @"File"; } @end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib index 964835da..cc9af50c 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamServiceViewController.xib @@ -1,8 +1,8 @@ - + - + diff --git a/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamServiceViewController.xib b/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamServiceViewController.xib index 7afdb021..f94d5a0f 100644 --- a/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamServiceViewController.xib +++ b/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamServiceViewController.xib @@ -1,7 +1,7 @@ - + - + @@ -19,7 +19,6 @@ - @@ -28,7 +27,6 @@ - @@ -37,7 +35,6 @@ - @@ -49,7 +46,6 @@ - @@ -64,7 +60,6 @@ - @@ -80,7 +75,6 @@ - - @@ -129,7 +120,6 @@ - diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj index 678c1bf7..7b8d4fff 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 34AFC32019B0A5DC0007C07B /* TwitchStreamService.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC31F19B0A5DC0007C07B /* TwitchStreamService.m */; }; 34AFC32419B0A5FD0007C07B /* TwitchStreamServiceViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC32219B0A5FD0007C07B /* TwitchStreamServiceViewController.m */; }; 34AFC32519B0A5FD0007C07B /* TwitchStreamServiceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34AFC32319B0A5FD0007C07B /* TwitchStreamServiceViewController.xib */; }; + 34EA822B1D3AC49600928A06 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34EA822A1D3AC49600928A06 /* WebKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -33,6 +34,7 @@ 34D6580619B343210012E32B /* CSCaptureSourceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureSourceProtocol.h; path = PluginHeaders/CSCaptureSourceProtocol.h; sourceTree = ""; }; 34D6580719B343210012E32B /* CSStreamServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSStreamServiceProtocol.h; path = PluginHeaders/CSStreamServiceProtocol.h; sourceTree = ""; }; 34D6580819B343210012E32B /* CSPluginFactoryProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginFactoryProtocol.h; path = PluginHeaders/CSPluginFactoryProtocol.h; sourceTree = ""; }; + 34EA822A1D3AC49600928A06 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -40,6 +42,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 34EA822B1D3AC49600928A06 /* WebKit.framework in Frameworks */, 34AFC30219B0A5800007C07B /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -73,6 +76,7 @@ 34AFC30019B0A5800007C07B /* Frameworks */ = { isa = PBXGroup; children = ( + 34EA822A1D3AC49600928A06 /* WebKit.framework */, 34AFC30119B0A5800007C07B /* Cocoa.framework */, 34AFC30319B0A5800007C07B /* Other Frameworks */, ); diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h index 2fd62ca5..d6e1efcb 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h @@ -18,13 +18,16 @@ @property (strong) NSArray *twitchServers; @property (strong) NSString *streamKey; @property (strong) NSString *selectedServer; +@property (strong) NSString *oAuthKey; -(NSViewController *)getConfigurationView; -(NSString *)getServiceDestination; +-(void)fetchTwitchStreamKey; +(NSString *)label; +(NSString *)serviceDescription; + @end diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m index a13f7971..439515ab 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m @@ -85,6 +85,37 @@ return @"TwitchTV"; } + +-(void)fetchTwitchStreamKey +{ + if (!self.oAuthKey) + { + return; + } + + NSString *apiString = @"https://api.twitch.tv/kraken/channel"; + + NSURL *apiURL = [NSURL URLWithString:apiString]; + + NSMutableURLRequest *apiRequest = [NSMutableURLRequest requestWithURL:apiURL]; + + [apiRequest setValue:[NSString stringWithFormat:@"OAuth %@", self.oAuthKey] forHTTPHeaderField:@"Authorization"]; + + [NSURLConnection sendAsynchronousRequest:apiRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *err) { + + NSError *jsonError; + NSDictionary *channel_response = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError]; + //Handle error + + + NSString *stream_key = [channel_response objectForKey:@"stream_key"]; + + dispatch_async(dispatch_get_main_queue(), ^{self.streamKey = stream_key; }); + return; + }]; +} + + -(void)loadTwitchIngest { diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h index 93759496..06e4d157 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h @@ -9,10 +9,14 @@ #import #import "TwitchStreamService.h" +#import -@interface TwitchStreamServiceViewController : NSViewController +@interface TwitchStreamServiceViewController : NSViewController @property (weak) TwitchStreamService *serviceObj; +@property (strong) NSWindow *authWindow; +@property (strong) WebView *authWebView; +- (IBAction)doTwitchAuth:(id)sender; @end diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m index 4ede11ae..11c13419 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m @@ -8,6 +8,7 @@ #import "TwitchStreamServiceViewController.h" + @interface TwitchStreamServiceViewController () @end @@ -23,4 +24,74 @@ return self; } + + +-(NSString *)extractAccessTokenFromURL:(NSURL *)url +{ + NSURLComponents *urlComp = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; + NSString *urlFragment = urlComp.percentEncodedFragment; + + NSURLComponents *fakeComponents = [NSURLComponents componentsWithString:[NSString stringWithFormat:@"http://localhost/blah?%@", urlFragment]]; + + NSArray *queryVars = fakeComponents.queryItems; + + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name=%@", @"access_token"]; + NSURLQueryItem *tokenItem = [queryVars filteredArrayUsingPredicate:predicate].firstObject; + + return tokenItem.value; +} + + +- (IBAction)doTwitchAuth:(id)sender +{ + + NSURL *authURL = [NSURL URLWithString:@"https://api.twitch.tv/kraken/oauth2/authorize?response_type=token&force_verify=true&client_id=p2onxyxk17dlngdgtj43kl9gaj2yb2a&redirect_uri=cocoasplit-twitch://cocoasplit.com/oauth/redirect&scope=channel_read"]; + + + NSRect winFrame = NSMakeRect(0, 0, 1000, 1000); + self.authWebView = [[WebView alloc] initWithFrame:winFrame frameName:nil groupName:nil]; + self.authWebView.policyDelegate = self; + + self.authWindow = [[NSWindow alloc] initWithContentRect:winFrame styleMask:NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask backing:NSBackingStoreBuffered defer:NO]; + + [self.authWindow center]; + [self.authWindow setContentView:self.authWebView]; + [self.authWindow makeKeyAndOrderFront:NSApp]; + [[self.authWebView mainFrame] loadRequest:[NSURLRequest requestWithURL:authURL]]; + +} + + +-(void)closeAuthWindow +{ + self.authWindow = nil; +} + + +-(void)receivedOAuth:(NSString *)oToken +{ + self.serviceObj.oAuthKey = oToken; + [self.serviceObj fetchTwitchStreamKey]; + +} + + +-(void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener +{ + NSURL *reqUrl = request.URL; + if (reqUrl) + { + if ([reqUrl.scheme isEqualToString:@"cocoasplit-twitch"]) + { + [listener ignore]; + NSString *accessToken = [self extractAccessTokenFromURL:reqUrl]; + [self receivedOAuth:accessToken]; + [self closeAuthWindow]; + + } + } + + [listener use]; +} + @end diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib index 2cbb1753..30db0c85 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -13,33 +13,30 @@ - + - - - - + + + - - - - + + + - - - + + - + @@ -56,10 +53,9 @@ - - - - + + + @@ -67,9 +63,18 @@ + - - + @@ -85,7 +90,6 @@ - From 31ffae27a895989a901c8b9224abb89f726e3c99 Mon Sep 17 00:00:00 2001 From: Zakk Date: Tue, 19 Jul 2016 05:36:20 -0400 Subject: [PATCH 115/156] Add plugin service for OAuth2 implicit grant flow. convert twitch stream key fetching to use oauth api. --- CocoaSplit.xcodeproj/project.pbxproj | 10 + CocoaSplit/CSOauth2Authenticator.m | 196 ++++++++++++++++++ CocoaSplit/CSPluginServices.m | 6 + .../PluginHeaders/CSOauth2Authenticator.h | 35 ++++ CocoaSplit/PluginHeaders/CSPluginServices.h | 2 + CocoaSplit/en.lproj/MainMenu.xib | 2 +- .../project.pbxproj | 54 +++-- .../CSTwitchStreamServicePlugin-Info.plist | 2 + .../TwitchStreamService.h | 6 + .../TwitchStreamService.m | 31 ++- .../TwitchStreamServiceViewController.m | 16 +- 11 files changed, 321 insertions(+), 39 deletions(-) create mode 100644 CocoaSplit/CSOauth2Authenticator.m create mode 100644 CocoaSplit/PluginHeaders/CSOauth2Authenticator.h diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 285ce939..57081c76 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -222,6 +222,8 @@ 34DF75581AA272F100DA9FDE /* LayoutRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DF75571AA272F100DA9FDE /* LayoutRenderer.m */; }; 34DF75591AA272F100DA9FDE /* LayoutRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DF75571AA272F100DA9FDE /* LayoutRenderer.m */; }; 34E983701B78AE9100F26F1E /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34E9836F1B78AE9100F26F1E /* Python.framework */; }; + 34EA822E1D3C568400928A06 /* CSOauth2Authenticator.m in Sources */ = {isa = PBXBuildFile; fileRef = 34EA822D1D3C568400928A06 /* CSOauth2Authenticator.m */; }; + 34EA824E1D3CBFCA00928A06 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34EA824D1D3CBFCA00928A06 /* WebKit.framework */; }; 34EAFB6F1A1A137600E12FBD /* CSMeterCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34EAFB6E1A1A137600E12FBD /* CSMeterCell.m */; }; 34EAFB801A1BA86800E12FBD /* CoreMediaIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34EAFB7F1A1BA86800E12FBD /* CoreMediaIO.framework */; }; 34EAFB811A1BA87000E12FBD /* CoreMediaIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34EAFB7F1A1BA86800E12FBD /* CoreMediaIO.framework */; }; @@ -837,6 +839,9 @@ 34DF75571AA272F100DA9FDE /* LayoutRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LayoutRenderer.m; sourceTree = ""; }; 34E9836F1B78AE9100F26F1E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = System/Library/Frameworks/Python.framework; sourceTree = SDKROOT; }; 34E983841B78B19D00F26F1E /* pluginbase.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pluginbase.py; sourceTree = ""; }; + 34EA822C1D3C568400928A06 /* CSOauth2Authenticator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSOauth2Authenticator.h; path = PluginHeaders/CSOauth2Authenticator.h; sourceTree = ""; }; + 34EA822D1D3C568400928A06 /* CSOauth2Authenticator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSOauth2Authenticator.m; sourceTree = ""; }; + 34EA824D1D3CBFCA00928A06 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 34EAFB6D1A1A137600E12FBD /* CSMeterCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSMeterCell.h; path = Interface/CSMeterCell.h; sourceTree = ""; }; 34EAFB6E1A1A137600E12FBD /* CSMeterCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSMeterCell.m; path = Interface/CSMeterCell.m; sourceTree = ""; }; 34EAFB7F1A1BA86800E12FBD /* CoreMediaIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMediaIO.framework; path = System/Library/Frameworks/CoreMediaIO.framework; sourceTree = SDKROOT; }; @@ -989,6 +994,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 34EA824E1D3CBFCA00928A06 /* WebKit.framework in Frameworks */, 34E983701B78AE9100F26F1E /* Python.framework in Frameworks */, 34ED8CB31B0737AC002C0674 /* CoreMIDI.framework in Frameworks */, 34EAFB801A1BA86800E12FBD /* CoreMediaIO.framework in Frameworks */, @@ -1086,6 +1092,7 @@ 340FE4A015F3417E00E4CE4E /* Frameworks */ = { isa = PBXGroup; children = ( + 34EA824D1D3CBFCA00928A06 /* WebKit.framework */, 341A2D5B1C7AB04700FF7566 /* Sparkle.framework */, 34E9836F1B78AE9100F26F1E /* Python.framework */, 34ED8CB11B0737A3002C0674 /* CoreMIDI.framework */, @@ -1205,6 +1212,7 @@ 3400A0611BD44DF0003E1828 /* CSInputLibraryItem.m */, 3434CB3A1CB09BC4001B3DF9 /* CSTimedOutputBuffer.h */, 3434CB3B1CB09BC4001B3DF9 /* CSTimedOutputBuffer.m */, + 34EA822D1D3C568400928A06 /* CSOauth2Authenticator.m */, ); path = CocoaSplit; sourceTree = ""; @@ -1418,6 +1426,7 @@ 34AFC2C119B08AF30007C07B /* CSStreamServiceProtocol.h */, 34D657F519B33DCF0012E32B /* CSPluginFactoryProtocol.h */, 34A7C17A19B98EA200BC6882 /* CSExtraPluginProtocol.h */, + 34EA822C1D3C568400928A06 /* CSOauth2Authenticator.h */, 3408234619BC50AD00CD1F5F /* CSNotifications.h */, ); name = PluginHeaders; @@ -2363,6 +2372,7 @@ 34ED8C651B07371C002C0674 /* MIKMIDIEvent.m in Sources */, 34ED8C7D1B07371C002C0674 /* MIKMIDIMetaKeySignatureEvent.m in Sources */, 348AC06B19B406910064F02D /* SourceLayout.m in Sources */, + 34EA822E1D3C568400928A06 /* CSOauth2Authenticator.m in Sources */, 345F8B751A17A785009A81E3 /* CAMultiAudioMixer.m in Sources */, 34ED8C951B07371C002C0674 /* MIKMIDIOutputPort.m in Sources */, 34ED8CA71B07371C002C0674 /* MIKMIDISystemMessageCommand.m in Sources */, diff --git a/CocoaSplit/CSOauth2Authenticator.m b/CocoaSplit/CSOauth2Authenticator.m new file mode 100644 index 00000000..bea8e6d3 --- /dev/null +++ b/CocoaSplit/CSOauth2Authenticator.m @@ -0,0 +1,196 @@ +// +// CSOauth2Authenticator.m +// CocoaSplit +// +// Created by Zakk on 7/17/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSOauth2Authenticator.h" + +@implementation CSOauth2Authenticator + + +-(instancetype) initWithServiceName:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify +{ + if (self = [self init]) + { + self.serviceName = + self.authLocation = auth_location; + self.clientID = client_id; + self.redirectURL = redirect_url; + self.authScopes = scopes; + self.forceVerify = force_verify; + + } + + return self; +} + + +-(void)buildAuthURL +{ + //NSQueryItems is 10.10+, so we can't use it :/ + + NSURLComponents *urlComponent = [NSURLComponents componentsWithString:self.authLocation]; + + NSMutableArray *paramParts = [[NSMutableArray alloc] init]; + + [paramParts addObject:@"response_type=token"]; + [paramParts addObject:[NSString stringWithFormat:@"client_id=%@", self.clientID]]; + [paramParts addObject:[NSString stringWithFormat:@"redirect_uri=%@", self.redirectURL]]; + + NSString *scopeValue = [self.authScopes componentsJoinedByString:@","]; + [paramParts addObject:[NSString stringWithFormat:@"scope=%@", scopeValue]]; + + NSString *paramString = [paramParts componentsJoinedByString:@"&"]; + + urlComponent.query = paramString; + + + self.authURL = urlComponent.URL; +} + + +-(void)authorize:(void (^)(bool success))authCallback +{ + + _authorizeCallback = authCallback; + if (!self.authURL) + { + [self buildAuthURL]; + } + + NSLog(@"AUTHORIZATION URL IS %@", self.authURL); + + NSRect winFrame = NSMakeRect(0, 0, 1000, 1000); + _authWebView = [[WebView alloc] initWithFrame:winFrame frameName:nil groupName:nil]; + _authWebView.policyDelegate = self; + + _authWindow = [[NSWindow alloc] initWithContentRect:winFrame styleMask:NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask backing:NSBackingStoreBuffered defer:NO]; + + [_authWindow center]; + [_authWindow setContentView:_authWebView]; + [_authWindow makeKeyAndOrderFront:NSApp]; + [[_authWebView mainFrame] loadRequest:[NSURLRequest requestWithURL:self.authURL]]; + +} + + +-(void)closeAuthWindow +{ + _authWindow = nil; +} + +-(NSString *)extractAccessTokenFromURL:(NSURL *)url +{ + NSURLComponents *urlComp = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; + NSString *urlFragment = urlComp.percentEncodedFragment; + + NSURLComponents *fakeComponents = [NSURLComponents componentsWithString:[NSString stringWithFormat:@"http://localhost/blah?%@", urlFragment]]; + + NSArray *queryVars = fakeComponents.queryItems; + + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name=%@", @"access_token"]; + NSURLQueryItem *tokenItem = [queryVars filteredArrayUsingPredicate:predicate].firstObject; + + return tokenItem.value; +} + + +-(bool)isURLRedirect:(NSURL *)testurl +{ + NSURLComponents *testComp = [NSURLComponents componentsWithURL:testurl resolvingAgainstBaseURL:NO]; + NSURLComponents *redirectComp = [NSURLComponents componentsWithString:self.redirectURL]; + + if (![testComp.scheme isEqualToString:redirectComp.scheme]) + { + return NO; + } + + if (![testComp.host isEqualToString:redirectComp.host]) + { + return NO; + } + + NSString *testPath = testComp.path; + NSString *rePath = redirectComp.path; + + if ([testPath isEqualToString:rePath]) + { + return YES; + } + + return NO; +} + + +-(void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener +{ + + NSURL *reqUrl = request.URL; + if (reqUrl && self.redirectURL) + { + + + + if ([self isURLRedirect:reqUrl]) + { + [listener ignore]; + self.accessToken = [self extractAccessTokenFromURL:reqUrl]; + [self closeAuthWindow]; + if (_authorizeCallback) + { + _authorizeCallback(!!self.accessToken); + } + } + } + + [listener use]; +} + + + + + +-(void)authorizedJsonRequest:(NSMutableURLRequest *)request completionHandler:(void (^)(id decodedData))handler +{ + //Set OAuth Bearer header + + + [request setValue:[NSString stringWithFormat:@"OAuth %@", self.accessToken] forHTTPHeaderField:@"Authorization"]; + + NSURLSession *urlSession = [NSURLSession sharedSession]; + + NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:request + completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { + NSError *jsonError; + id json_object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError]; + if (handler) + { + handler(json_object); + } + }]; + + [dataTask resume]; +} + +-(void)jsonRequest:(NSMutableURLRequest *)request completionHandler:(void (^)(id decodedData))handler +{ + if (!self.authURL) + { + [self authorize:^(bool success) { + if (success) + { + [self authorizedJsonRequest:request completionHandler:handler]; + } + + }]; + } else { + [self authorizedJsonRequest:request completionHandler:handler]; + + } +} + + +@end diff --git a/CocoaSplit/CSPluginServices.m b/CocoaSplit/CSPluginServices.m index fdbd5692..90df3479 100644 --- a/CocoaSplit/CSPluginServices.m +++ b/CocoaSplit/CSPluginServices.m @@ -103,4 +103,10 @@ } +-(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify +{ + + return [[CSOauth2Authenticator alloc] initWithServiceName:serviceName authLocation:auth_location clientID:client_id redirectURL:redirect_url authScopes:scopes forceVerify:force_verify]; +} + @end diff --git a/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h b/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h new file mode 100644 index 00000000..e5363493 --- /dev/null +++ b/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h @@ -0,0 +1,35 @@ +// +// CSOauth2Authenticator.h +// CocoaSplit +// +// Created by Zakk on 7/17/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import + +@interface CSOauth2Authenticator : NSObject +{ + NSWindow *_authWindow; + WebView *_authWebView; + void (^_authorizeCallback)(bool success); +} + + +@property (strong) NSString *authLocation; +@property (strong) NSString *redirectURL; +@property (strong) NSArray *authScopes; +@property (strong) NSString *clientID; +@property (assign) bool forceVerify; +@property (strong) NSURL *authURL; +@property (strong) NSString *serviceName; +@property (strong) NSString *accessToken; + + +-(instancetype) initWithServiceName:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify; + +-(void)jsonRequest:(NSMutableURLRequest *)request completionHandler:(void (^)(id decodedData))handler; + + +@end diff --git a/CocoaSplit/PluginHeaders/CSPluginServices.h b/CocoaSplit/PluginHeaders/CSPluginServices.h index b9005166..ad95be44 100644 --- a/CocoaSplit/PluginHeaders/CSPluginServices.h +++ b/CocoaSplit/PluginHeaders/CSPluginServices.h @@ -8,6 +8,7 @@ #import #import "CSPcmPlayer.h" +#import "CSOauth2Authenticator.h" @interface CSPluginServices : NSObject @@ -20,6 +21,7 @@ -(void)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile withBlock:(void(^)(Class))withBlock; -(Class)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile; +-(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify; @property (readonly) double currentFPS; @property (readonly) int audioSampleRate; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index b5cc6125..506f6d24 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1532,7 +1532,7 @@ - + diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj index 7b8d4fff..cf4f8153 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj @@ -12,7 +12,6 @@ 34AFC32019B0A5DC0007C07B /* TwitchStreamService.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC31F19B0A5DC0007C07B /* TwitchStreamService.m */; }; 34AFC32419B0A5FD0007C07B /* TwitchStreamServiceViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC32219B0A5FD0007C07B /* TwitchStreamServiceViewController.m */; }; 34AFC32519B0A5FD0007C07B /* TwitchStreamServiceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34AFC32319B0A5FD0007C07B /* TwitchStreamServiceViewController.xib */; }; - 34EA822B1D3AC49600928A06 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34EA822A1D3AC49600928A06 /* WebKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -29,12 +28,21 @@ 34AFC32119B0A5FD0007C07B /* TwitchStreamServiceViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwitchStreamServiceViewController.h; sourceTree = ""; }; 34AFC32219B0A5FD0007C07B /* TwitchStreamServiceViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitchStreamServiceViewController.m; sourceTree = ""; }; 34AFC32319B0A5FD0007C07B /* TwitchStreamServiceViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TwitchStreamServiceViewController.xib; sourceTree = ""; }; - 34D6580419B343210012E32B /* CSAbstractCaptureDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAbstractCaptureDevice.h; path = PluginHeaders/CSAbstractCaptureDevice.h; sourceTree = ""; }; - 34D6580519B343210012E32B /* CSCaptureBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureBase.h; path = PluginHeaders/CSCaptureBase.h; sourceTree = ""; }; - 34D6580619B343210012E32B /* CSCaptureSourceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureSourceProtocol.h; path = PluginHeaders/CSCaptureSourceProtocol.h; sourceTree = ""; }; - 34D6580719B343210012E32B /* CSStreamServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSStreamServiceProtocol.h; path = PluginHeaders/CSStreamServiceProtocol.h; sourceTree = ""; }; - 34D6580819B343210012E32B /* CSPluginFactoryProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginFactoryProtocol.h; path = PluginHeaders/CSPluginFactoryProtocol.h; sourceTree = ""; }; 34EA822A1D3AC49600928A06 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 34EA823E1D3CBD3600928A06 /* CSPluginServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginServices.h; path = PluginHeaders/CSPluginServices.h; sourceTree = ""; }; + 34EA823F1D3CBD3600928A06 /* CSIOSurfaceLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSIOSurfaceLayer.h; path = PluginHeaders/CSIOSurfaceLayer.h; sourceTree = ""; }; + 34EA82401D3CBD3600928A06 /* CSPcmPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPcmPlayer.h; path = PluginHeaders/CSPcmPlayer.h; sourceTree = ""; }; + 34EA82411D3CBD3600928A06 /* CAMultiAudioPCM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CAMultiAudioPCM.h; path = PluginHeaders/CAMultiAudioPCM.h; sourceTree = ""; }; + 34EA82421D3CBD3600928A06 /* CSAbstractCaptureDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAbstractCaptureDevice.h; path = PluginHeaders/CSAbstractCaptureDevice.h; sourceTree = ""; }; + 34EA82431D3CBD3600928A06 /* CSTextCaptureBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSTextCaptureBase.h; path = PluginHeaders/CSTextCaptureBase.h; sourceTree = ""; }; + 34EA82441D3CBD3600928A06 /* CSTextCaptureViewControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSTextCaptureViewControllerBase.h; path = PluginHeaders/CSTextCaptureViewControllerBase.h; sourceTree = ""; }; + 34EA82451D3CBD3600928A06 /* CSCaptureBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureBase.h; path = PluginHeaders/CSCaptureBase.h; sourceTree = ""; }; + 34EA82461D3CBD3600928A06 /* CSCaptureSourceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureSourceProtocol.h; path = PluginHeaders/CSCaptureSourceProtocol.h; sourceTree = ""; }; + 34EA82471D3CBD3600928A06 /* CSStreamServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSStreamServiceProtocol.h; path = PluginHeaders/CSStreamServiceProtocol.h; sourceTree = ""; }; + 34EA82481D3CBD3600928A06 /* CSPluginFactoryProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginFactoryProtocol.h; path = PluginHeaders/CSPluginFactoryProtocol.h; sourceTree = ""; }; + 34EA82491D3CBD3600928A06 /* CSExtraPluginProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSExtraPluginProtocol.h; path = PluginHeaders/CSExtraPluginProtocol.h; sourceTree = ""; }; + 34EA824A1D3CBD3600928A06 /* CSOauth2Authenticator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSOauth2Authenticator.h; path = PluginHeaders/CSOauth2Authenticator.h; sourceTree = ""; }; + 34EA824B1D3CBD3600928A06 /* CSNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSNotifications.h; path = PluginHeaders/CSNotifications.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -42,7 +50,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 34EA822B1D3AC49600928A06 /* WebKit.framework in Frameworks */, 34AFC30219B0A5800007C07B /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -53,7 +60,7 @@ 34AFC2F519B0A5800007C07B = { isa = PBXGroup; children = ( - 34D6580919B343210012E32B /* PluginHeaders */, + 34EA824C1D3CBD3600928A06 /* PluginHeaders */, 34AFC32119B0A5FD0007C07B /* TwitchStreamServiceViewController.h */, 34AFC32219B0A5FD0007C07B /* TwitchStreamServiceViewController.m */, 34AFC32319B0A5FD0007C07B /* TwitchStreamServiceViewController.xib */, @@ -111,14 +118,23 @@ name = "Supporting Files"; sourceTree = ""; }; - 34D6580919B343210012E32B /* PluginHeaders */ = { + 34EA824C1D3CBD3600928A06 /* PluginHeaders */ = { isa = PBXGroup; children = ( - 34D6580419B343210012E32B /* CSAbstractCaptureDevice.h */, - 34D6580519B343210012E32B /* CSCaptureBase.h */, - 34D6580619B343210012E32B /* CSCaptureSourceProtocol.h */, - 34D6580719B343210012E32B /* CSStreamServiceProtocol.h */, - 34D6580819B343210012E32B /* CSPluginFactoryProtocol.h */, + 34EA823E1D3CBD3600928A06 /* CSPluginServices.h */, + 34EA823F1D3CBD3600928A06 /* CSIOSurfaceLayer.h */, + 34EA82401D3CBD3600928A06 /* CSPcmPlayer.h */, + 34EA82411D3CBD3600928A06 /* CAMultiAudioPCM.h */, + 34EA82421D3CBD3600928A06 /* CSAbstractCaptureDevice.h */, + 34EA82431D3CBD3600928A06 /* CSTextCaptureBase.h */, + 34EA82441D3CBD3600928A06 /* CSTextCaptureViewControllerBase.h */, + 34EA82451D3CBD3600928A06 /* CSCaptureBase.h */, + 34EA82461D3CBD3600928A06 /* CSCaptureSourceProtocol.h */, + 34EA82471D3CBD3600928A06 /* CSStreamServiceProtocol.h */, + 34EA82481D3CBD3600928A06 /* CSPluginFactoryProtocol.h */, + 34EA82491D3CBD3600928A06 /* CSExtraPluginProtocol.h */, + 34EA824A1D3CBD3600928A06 /* CSOauth2Authenticator.h */, + 34EA824B1D3CBD3600928A06 /* CSNotifications.h */, ); name = PluginHeaders; path = ../../CocoaSplit; @@ -284,6 +300,11 @@ GCC_PREFIX_HEADER = "CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin-Prefix.pch"; INFOPLIST_FILE = "CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + OTHER_LDFLAGS = ( + "-undefined", + suppress, + "-flat_namespace", + ); PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = bundle; @@ -298,6 +319,11 @@ GCC_PREFIX_HEADER = "CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin-Prefix.pch"; INFOPLIST_FILE = "CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + OTHER_LDFLAGS = ( + "-undefined", + suppress, + "-flat_namespace", + ); PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = bundle; diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin-Info.plist b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin-Info.plist index 43cd85ad..79dbe386 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin-Info.plist +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin-Info.plist @@ -26,5 +26,7 @@ Copyright © 2014 Zakk. All rights reserved. NSPrincipalClass TwitchStreamService + TwitchAPIClientID + p2onxyxk17dlngdgtj43kl9gaj2yb2a diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h index d6e1efcb..20d42251 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h @@ -8,9 +8,14 @@ #import #import "CSStreamServiceProtocol.h" +#import "CSPluginServices.h" +#import "CSOauth2Authenticator.h" @interface TwitchStreamService : NSObject +{ + NSString *_oauth_client_id; +} @property bool isReady; @@ -19,6 +24,7 @@ @property (strong) NSString *streamKey; @property (strong) NSString *selectedServer; @property (strong) NSString *oAuthKey; +@property (strong) CSOauth2Authenticator *oauthObject; diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m index 439515ab..91c2e8e7 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m @@ -86,32 +86,43 @@ } + +-(void)authenticateUser +{ + +} -(void)fetchTwitchStreamKey { - if (!self.oAuthKey) + if (!self.oauthObject) { - return; + + if (!_oauth_client_id) + { + _oauth_client_id = [[NSBundle bundleForClass:[self class]] objectForInfoDictionaryKey:@"TwitchAPIClientID"]; + } + self.oauthObject = [[CSPluginServices sharedPluginServices] createOAuth2Authenticator:@"twitchkraken" authLocation:@"https://api.twitch.tv/kraken/oauth2/authorize" clientID:_oauth_client_id redirectURL:@"cocoasplit-twitch://cocoasplit.com/oauth/redirect" authScopes:@[@"channel_read"] forceVerify:NO]; } + + NSString *apiString = @"https://api.twitch.tv/kraken/channel"; NSURL *apiURL = [NSURL URLWithString:apiString]; + + NSMutableURLRequest *apiRequest = [NSMutableURLRequest requestWithURL:apiURL]; - [apiRequest setValue:[NSString stringWithFormat:@"OAuth %@", self.oAuthKey] forHTTPHeaderField:@"Authorization"]; - [NSURLConnection sendAsynchronousRequest:apiRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *err) { - - NSError *jsonError; - NSDictionary *channel_response = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError]; - //Handle error - + //[apiRequest setValue:[NSString stringWithFormat:@"OAuth %@", self.oAuthKey] forHTTPHeaderField:@"Authorization"]; + + [self.oauthObject jsonRequest:apiRequest completionHandler:^(id decodedData) { + NSLog(@"DECODED DATA %@", decodedData); + NSDictionary *channel_response = (NSDictionary *)decodedData; NSString *stream_key = [channel_response objectForKey:@"stream_key"]; dispatch_async(dispatch_get_main_queue(), ^{self.streamKey = stream_key; }); - return; }]; } diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m index 11c13419..ed0fb53a 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m @@ -44,21 +44,9 @@ - (IBAction)doTwitchAuth:(id)sender { - - NSURL *authURL = [NSURL URLWithString:@"https://api.twitch.tv/kraken/oauth2/authorize?response_type=token&force_verify=true&client_id=p2onxyxk17dlngdgtj43kl9gaj2yb2a&redirect_uri=cocoasplit-twitch://cocoasplit.com/oauth/redirect&scope=channel_read"]; - - - NSRect winFrame = NSMakeRect(0, 0, 1000, 1000); - self.authWebView = [[WebView alloc] initWithFrame:winFrame frameName:nil groupName:nil]; - self.authWebView.policyDelegate = self; - - self.authWindow = [[NSWindow alloc] initWithContentRect:winFrame styleMask:NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask backing:NSBackingStoreBuffered defer:NO]; - - [self.authWindow center]; - [self.authWindow setContentView:self.authWebView]; - [self.authWindow makeKeyAndOrderFront:NSApp]; - [[self.authWebView mainFrame] loadRequest:[NSURLRequest requestWithURL:authURL]]; + [self.serviceObj fetchTwitchStreamKey]; + } From 4152dc6c595c9dbaa230a0cffbcbe0b14d6ff3f0 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 23 Jul 2016 15:47:33 -0400 Subject: [PATCH 116/156] More work on OAuth2 service. change to stream service protocol and OutputDestination to support async/delayed fetching of output destination. Twitch output config allows re-auth to a different account and auto-fetching of the stream key when stream starts. --- .../CSFFMpegCapturePlugin/CSFFMpegInput.m | 9 +- CocoaSplit.xcodeproj/project.pbxproj | 4 + CocoaSplit/CSOauth2Authenticator.m | 171 ++++++++++++++++-- CocoaSplit/CSPluginServices.m | 4 +- CocoaSplit/OutputDestination.h | 2 + CocoaSplit/OutputDestination.m | 17 +- .../PluginHeaders/CSOauth2Authenticator.h | 11 +- CocoaSplit/PluginHeaders/CSPluginServices.h | 2 +- .../PluginHeaders/CSStreamServiceProtocol.h | 2 + .../CSFileStreamRTMPService.m | 6 + .../FileStreamService.m | 5 + .../HitboxStreamService.m | 5 + .../TwitchStreamService.h | 8 + .../TwitchStreamService.m | 89 ++++++++- .../TwitchStreamServiceViewController.h | 1 + .../TwitchStreamServiceViewController.m | 8 +- .../TwitchStreamServiceViewController.xib | 61 +++++-- 17 files changed, 358 insertions(+), 47 deletions(-) diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m index b5b0ea2a..8b54b53d 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m @@ -78,8 +78,13 @@ AVCodecContext *v_codec_ctx_orig = NULL; AVCodecContext *a_codec_ctx_orig = NULL; - avformat_open_input(&_format_ctx, self.mediaPath.UTF8String, NULL, NULL); - + int open_ret = avformat_open_input(&_format_ctx, self.mediaPath.UTF8String, NULL, NULL); + if (open_ret < 0) + { + return NO; + } + + avformat_find_stream_info(_format_ctx, NULL); //av_dump_format(_format_ctx, 0, self.mediaPath.UTF8String, 0); for (int i=0; i < _format_ctx->nb_streams; i++) diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 57081c76..49c80bff 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 3400A0841BD522A5003E1828 /* CSLibraryInputItemViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A0831BD522A5003E1828 /* CSLibraryInputItemViewController.m */; }; 3408235519BC677A00CD1F5F /* CSNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408235419BC530300CD1F5F /* CSNotifications.m */; }; 3408235619BC677C00CD1F5F /* CSNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408235419BC530300CD1F5F /* CSNotifications.m */; }; + 340C7FE91D43D22000B2FD7D /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340C7FE81D43D22000B2FD7D /* Security.framework */; }; 340D8C971959C7C100BE5144 /* CompressionSettingsPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 340D8C961959C7C100BE5144 /* CompressionSettingsPanel.xib */; }; 340DC734197CF6E9003A0BB3 /* CSCaptureBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 340DC733197CF6E9003A0BB3 /* CSCaptureBase.m */; }; 340DC735197CF6E9003A0BB3 /* CSCaptureBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 340DC733197CF6E9003A0BB3 /* CSCaptureBase.m */; }; @@ -599,6 +600,7 @@ 3400A0831BD522A5003E1828 /* CSLibraryInputItemViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSLibraryInputItemViewController.m; path = Interface/CSLibraryInputItemViewController.m; sourceTree = ""; }; 3408234619BC50AD00CD1F5F /* CSNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSNotifications.h; path = PluginHeaders/CSNotifications.h; sourceTree = ""; }; 3408235419BC530300CD1F5F /* CSNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSNotifications.m; path = ../CSNotifications.m; sourceTree = ""; }; + 340C7FE81D43D22000B2FD7D /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 340D8C961959C7C100BE5144 /* CompressionSettingsPanel.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CompressionSettingsPanel.xib; path = Interface/CompressionSettingsPanel.xib; sourceTree = ""; }; 340DC732197CF6E9003A0BB3 /* CSCaptureBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureBase.h; path = PluginHeaders/CSCaptureBase.h; sourceTree = ""; }; 340DC733197CF6E9003A0BB3 /* CSCaptureBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSCaptureBase.m; sourceTree = ""; }; @@ -994,6 +996,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 340C7FE91D43D22000B2FD7D /* Security.framework in Frameworks */, 34EA824E1D3CBFCA00928A06 /* WebKit.framework in Frameworks */, 34E983701B78AE9100F26F1E /* Python.framework in Frameworks */, 34ED8CB31B0737AC002C0674 /* CoreMIDI.framework in Frameworks */, @@ -1092,6 +1095,7 @@ 340FE4A015F3417E00E4CE4E /* Frameworks */ = { isa = PBXGroup; children = ( + 340C7FE81D43D22000B2FD7D /* Security.framework */, 34EA824D1D3CBFCA00928A06 /* WebKit.framework */, 341A2D5B1C7AB04700FF7566 /* Sparkle.framework */, 34E9836F1B78AE9100F26F1E /* Python.framework */, diff --git a/CocoaSplit/CSOauth2Authenticator.m b/CocoaSplit/CSOauth2Authenticator.m index bea8e6d3..cb858fc8 100644 --- a/CocoaSplit/CSOauth2Authenticator.m +++ b/CocoaSplit/CSOauth2Authenticator.m @@ -11,23 +11,107 @@ @implementation CSOauth2Authenticator --(instancetype) initWithServiceName:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify +-(instancetype) initWithServiceName:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify useKeychain:(bool)use_keychain { if (self = [self init]) { - self.serviceName = + self.serviceName = serviceName; self.authLocation = auth_location; self.clientID = client_id; self.redirectURL = redirect_url; self.authScopes = scopes; self.forceVerify = force_verify; - + self.useKeychain = use_keychain; } return self; } + +-(NSMutableDictionary *)buildKeychainQuery +{ + NSString *useServiceName = [NSString stringWithFormat:@"CocoaSplit-%@", self.serviceName]; + NSMutableDictionary *keyChainAttrs = [[NSMutableDictionary alloc] init]; + [keyChainAttrs setObject:(__bridge NSString *)kSecClassGenericPassword forKey:(__bridge NSString *)kSecClass]; + [keyChainAttrs setObject:useServiceName forKey:(__bridge NSString *)kSecAttrService]; + [keyChainAttrs setObject:self.accountName forKey:(__bridge NSString *)kSecAttrAccount]; + [keyChainAttrs setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlock forKey:(__bridge NSString *)kSecAttrAccessible]; + return keyChainAttrs; +} + +-(void)loadFromKeychain +{ + NSLog(@"ACCOUNT NAME %@", self.accountName); + + if (!self.useKeychain || !self.accountName || !self.serviceName) + { + return; + } + + NSMutableDictionary *keyChainAttrs = [self buildKeychainQuery]; + + [keyChainAttrs setObject:(id)kCFBooleanTrue forKey:(__bridge NSString *)kSecReturnData]; + [keyChainAttrs setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge NSString *)kSecMatchLimit]; + + NSLog(@"QUERY %@", keyChainAttrs); + + CFDataRef keyData = NULL; + + if (!SecItemCopyMatching((__bridge CFDictionaryRef)keyChainAttrs, (CFTypeRef *)&keyData)) + { + if (keyData) + { + NSDictionary *storedData = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; + NSLog(@"STORED DATA %@", storedData); + + if (storedData) + { + self.accessToken = storedData[@"accessToken"]; + } + CFRelease(keyData); + } + + } +} + + +-(void)saveToKeychain:(NSString *)accountName +{ + self.accountName = accountName; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + [self saveToKeychain]; + }); +} + + +-(void)saveToKeychain +{ + if (!self.useKeychain || !self.accountName) + { + return; + } + + NSMutableDictionary *keyChainAttrs = [self buildKeychainQuery]; + + NSDictionary *keyDataDict = @{@"accessToken": self.accessToken}; + + NSData *keyData = [NSKeyedArchiver archivedDataWithRootObject:keyDataDict]; + [keyChainAttrs setObject:keyData forKey:(__bridge NSString *)kSecValueData]; + + + OSStatus addRes = SecItemAdd((__bridge CFDictionaryRef)keyChainAttrs, NULL); + + if (addRes == errSecDuplicateItem) + { + SecItemDelete((__bridge CFDictionaryRef)keyChainAttrs); + SecItemAdd((__bridge CFDictionaryRef)keyChainAttrs, NULL); + + } +} + + + -(void)buildAuthURL { //NSQueryItems is 10.10+, so we can't use it :/ @@ -40,9 +124,19 @@ [paramParts addObject:[NSString stringWithFormat:@"client_id=%@", self.clientID]]; [paramParts addObject:[NSString stringWithFormat:@"redirect_uri=%@", self.redirectURL]]; - NSString *scopeValue = [self.authScopes componentsJoinedByString:@","]; + NSString *scopeValue = [self.authScopes componentsJoinedByString:@" "]; [paramParts addObject:[NSString stringWithFormat:@"scope=%@", scopeValue]]; + if (self.extraAuthParams) + { + for(NSString *key in self.extraAuthParams) + { + NSString *val = self.extraAuthParams[key]; + [paramParts addObject:[NSString stringWithFormat:@"%@=%@", key,val]]; + } + } + + NSString *paramString = [paramParts componentsJoinedByString:@"&"]; urlComponent.query = paramString; @@ -55,24 +149,55 @@ -(void)authorize:(void (^)(bool success))authCallback { - _authorizeCallback = authCallback; - if (!self.authURL) + bool doAuth = NO; + + if (!self.accessToken) { - [self buildAuthURL]; + + + if (!self.forceVerify) + { + [self loadFromKeychain]; + if (self.accessToken) + { + doAuth = NO; + } else { + doAuth = YES; + } + } } - NSLog(@"AUTHORIZATION URL IS %@", self.authURL); + if (self.forceVerify) + { + doAuth = YES; + } - NSRect winFrame = NSMakeRect(0, 0, 1000, 1000); - _authWebView = [[WebView alloc] initWithFrame:winFrame frameName:nil groupName:nil]; - _authWebView.policyDelegate = self; - - _authWindow = [[NSWindow alloc] initWithContentRect:winFrame styleMask:NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask backing:NSBackingStoreBuffered defer:NO]; - - [_authWindow center]; - [_authWindow setContentView:_authWebView]; - [_authWindow makeKeyAndOrderFront:NSApp]; - [[_authWebView mainFrame] loadRequest:[NSURLRequest requestWithURL:self.authURL]]; + _authorizeCallback = authCallback; + if (doAuth) + { + if (!self.authURL) + { + [self buildAuthURL]; + } + + NSLog(@"AUTHORIZATION URL IS %@", self.authURL); + + NSRect winFrame = NSMakeRect(0, 0, 1000, 1000); + _authWebView = [[WebView alloc] initWithFrame:winFrame frameName:nil groupName:nil]; + _authWebView.policyDelegate = self; + + _authWindow = [[NSWindow alloc] initWithContentRect:winFrame styleMask:NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask backing:NSBackingStoreBuffered defer:NO]; + + [_authWindow center]; + [_authWindow setContentView:_authWebView]; + [_authWindow makeKeyAndOrderFront:NSApp]; + [[_authWebView mainFrame] loadRequest:[NSURLRequest requestWithURL:self.authURL]]; + } else { + if (authCallback) + { + authCallback(!!self.accessToken); + } + } } @@ -142,6 +267,14 @@ if (_authorizeCallback) { _authorizeCallback(!!self.accessToken); + if (self.accountNameFetcher && self.useKeychain) + { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + + self.accountNameFetcher(self); + + }); + } } } } @@ -177,7 +310,7 @@ -(void)jsonRequest:(NSMutableURLRequest *)request completionHandler:(void (^)(id decodedData))handler { - if (!self.authURL) + if (!self.accessToken) { [self authorize:^(bool success) { if (success) diff --git a/CocoaSplit/CSPluginServices.m b/CocoaSplit/CSPluginServices.m index 90df3479..a0ef265a 100644 --- a/CocoaSplit/CSPluginServices.m +++ b/CocoaSplit/CSPluginServices.m @@ -103,10 +103,10 @@ } --(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify +-(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify useKeychain:(bool)use_keychain { - return [[CSOauth2Authenticator alloc] initWithServiceName:serviceName authLocation:auth_location clientID:client_id redirectURL:redirect_url authScopes:scopes forceVerify:force_verify]; + return [[CSOauth2Authenticator alloc] initWithServiceName:serviceName authLocation:auth_location clientID:client_id redirectURL:redirect_url authScopes:scopes forceVerify:force_verify useKeychain:use_keychain]; } @end diff --git a/CocoaSplit/OutputDestination.h b/CocoaSplit/OutputDestination.h index b4c65e7e..99d90937 100644 --- a/CocoaSplit/OutputDestination.h +++ b/CocoaSplit/OutputDestination.h @@ -34,6 +34,8 @@ int _pending_frame_count; int _consecutive_dropped_frames; BOOL _errored; + bool _output_prepared; + CFAbsoluteTime _input_frame_timestamp; diff --git a/CocoaSplit/OutputDestination.m b/CocoaSplit/OutputDestination.m index e0918277..e9ee9964 100644 --- a/CocoaSplit/OutputDestination.m +++ b/CocoaSplit/OutputDestination.m @@ -151,6 +151,8 @@ -(void) reset { + _output_prepared = NO; + self.buffer_draining = NO; [_delayBuffer removeAllObjects]; [self initStatsValues]; @@ -297,6 +299,19 @@ newout = self.ffmpeg_out; } + if (!_output_prepared) + { + [self.streamServiceObject prepareForStreamStart]; + _output_prepared = YES; + } + + NSString *destination = self.destination; + + if (!destination) + { + return; + } + /* if (self.stream_delay > 0) @@ -307,7 +322,7 @@ newout.video_codec_id = self.compressor.codec_id; newout.framerate = self.settingsController.captureFPS; - newout.stream_output = [self.destination stringByStandardizingPath]; + newout.stream_output = [destination stringByStandardizingPath]; newout.stream_format = self.output_format; newout.settingsController = self.settingsController; newout.samplerate = self.settingsController.audioSamplerate; diff --git a/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h b/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h index e5363493..87d7e8dc 100644 --- a/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h +++ b/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h @@ -25,11 +25,20 @@ @property (strong) NSURL *authURL; @property (strong) NSString *serviceName; @property (strong) NSString *accessToken; +@property (strong) NSString *accountName; +@property (assign) bool useKeychain; +@property (nonatomic, copy) void(^accountNameFetcher)(CSOauth2Authenticator *authenticator); +@property (strong) NSDictionary *extraAuthParams; --(instancetype) initWithServiceName:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify; + + +-(instancetype) initWithServiceName:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify useKeychain:(bool)use_keychain; -(void)jsonRequest:(NSMutableURLRequest *)request completionHandler:(void (^)(id decodedData))handler; +-(void)saveToKeychain:(NSString *)accountName; +-(void)authorize:(void (^)(bool success))authCallback; + @end diff --git a/CocoaSplit/PluginHeaders/CSPluginServices.h b/CocoaSplit/PluginHeaders/CSPluginServices.h index ad95be44..bdb6e955 100644 --- a/CocoaSplit/PluginHeaders/CSPluginServices.h +++ b/CocoaSplit/PluginHeaders/CSPluginServices.h @@ -21,7 +21,7 @@ -(void)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile withBlock:(void(^)(Class))withBlock; -(Class)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile; --(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify; +-(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify useKeychain:(bool)use_keychain; @property (readonly) double currentFPS; @property (readonly) int audioSampleRate; diff --git a/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h b/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h index acd74b40..0e822c4a 100644 --- a/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h +++ b/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h @@ -18,6 +18,8 @@ -(NSString *)getServiceFormat; +(NSString *)label; +(NSString *)serviceDescription; +-(void)prepareForStreamStart; + @end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.m b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.m index 0e3b945f..454a8adb 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.m +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/CSFileStreamRTMPService.m @@ -77,4 +77,10 @@ return @"RTMP"; } +-(void)prepareForStreamStart +{ + return; +} + + @end diff --git a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m index a274a7a5..45869e7c 100644 --- a/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m +++ b/StreamServicePlugins/CSFileStreamServicePlugin/CSFileStreamServicePlugin/FileStreamService.m @@ -107,4 +107,9 @@ return @"File"; } +-(void)prepareForStreamStart +{ + return; +} + @end diff --git a/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamService.m b/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamService.m index 3086fe71..36669792 100644 --- a/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamService.m +++ b/StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/HitboxStreamService.m @@ -149,5 +149,10 @@ }]; } +-(void)prepareForStreamStart +{ + return; +} + @end diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h index 20d42251..7f815220 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h @@ -15,6 +15,7 @@ @interface TwitchStreamService : NSObject { NSString *_oauth_client_id; + bool _key_fetch_pending; } @@ -25,6 +26,11 @@ @property (strong) NSString *selectedServer; @property (strong) NSString *oAuthKey; @property (strong) CSOauth2Authenticator *oauthObject; +@property (strong) NSString *accountName; +@property (assign) bool alwaysFetchKey; + + + @@ -33,6 +39,8 @@ -(void)fetchTwitchStreamKey; +(NSString *)label; +(NSString *)serviceDescription; +-(void)authenticateUser; + diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m index 91c2e8e7..47f192ec 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m @@ -26,6 +26,9 @@ { [aCoder encodeObject:self.selectedServer forKey:@"selectedServer"]; [aCoder encodeObject:self.streamKey forKey:@"streamKey"]; + [aCoder encodeObject:self.accountName forKey:@"accountName"]; + [aCoder encodeBool:self.alwaysFetchKey forKey:@"alwaysFetchKey"]; + } -(instancetype)initWithCoder:(NSCoder *)aDecoder @@ -34,6 +37,8 @@ { self.selectedServer = [aDecoder decodeObjectForKey:@"selectedServer"]; self.streamKey = [aDecoder decodeObjectForKey:@"streamKey"]; + self.accountName = [aDecoder decodeObjectForKey:@"accountName"]; + self.alwaysFetchKey = [aDecoder decodeBoolForKey:@"alwaysFetchKey"]; } return self; } @@ -58,10 +63,29 @@ } +-(void)prepareForStreamStart +{ + if (self.alwaysFetchKey && !_key_fetch_pending) + { + @synchronized (self) { + self.streamKey = nil; + _key_fetch_pending = YES; + } + + [self fetchTwitchStreamKey]; + + } +} + + -(NSString *)getServiceDestination { - + + if (!self.streamKey) + { + return nil; + } if (self.selectedServer) { @@ -87,11 +111,7 @@ --(void)authenticateUser -{ - -} --(void)fetchTwitchStreamKey +-(void)createAuthenticator { if (!self.oauthObject) { @@ -100,10 +120,62 @@ { _oauth_client_id = [[NSBundle bundleForClass:[self class]] objectForInfoDictionaryKey:@"TwitchAPIClientID"]; } - self.oauthObject = [[CSPluginServices sharedPluginServices] createOAuth2Authenticator:@"twitchkraken" authLocation:@"https://api.twitch.tv/kraken/oauth2/authorize" clientID:_oauth_client_id redirectURL:@"cocoasplit-twitch://cocoasplit.com/oauth/redirect" authScopes:@[@"channel_read"] forceVerify:NO]; + self.oauthObject = [[CSPluginServices sharedPluginServices] createOAuth2Authenticator:@"twitch" authLocation:@"https://api.twitch.tv/kraken/oauth2/authorize" clientID:_oauth_client_id redirectURL:@"cocoasplit-twitch://cocoasplit.com/oauth/redirect" authScopes:@[@"channel_read", @"user_read"] forceVerify:NO useKeychain:YES]; + self.oauthObject.accountName = self.accountName; + self.oauthObject.accountNameFetcher = ^void(CSOauth2Authenticator *authenticator) { + [self fetchAccountname:authenticator]; + }; + } +} + +-(void)authenticateUser +{ + [self createAuthenticator]; + self.oauthObject.forceVerify = YES; + self.oauthObject.extraAuthParams = @{@"force_verify": @"true"}; + [self fetchTwitchStreamKey]; + self.oauthObject.forceVerify = NO; + self.oauthObject.extraAuthParams = nil; +} + + + + +-(void)fetchAccountname:(CSOauth2Authenticator *)authenticator +{ + if (self.accountName) + { + [authenticator saveToKeychain:self.accountName]; + return; } + if (self.oauthObject && self.oauthObject.accessToken) + { + NSString *apiString = @"https://api.twitch.tv/kraken/channel"; + + NSURL *apiURL = [NSURL URLWithString:apiString]; + + + + NSMutableURLRequest *apiRequest = [NSMutableURLRequest requestWithURL:apiURL]; + + [self.oauthObject jsonRequest:apiRequest completionHandler:^(id decodedData) { + + NSDictionary *user_response = (NSDictionary *)decodedData; + NSString *account_name = [user_response objectForKey:@"name"]; + [authenticator saveToKeychain:account_name]; + + dispatch_async(dispatch_get_main_queue(), ^{self.accountName = account_name; }); + }]; + } +} + + + +-(void)fetchTwitchStreamKey +{ + [self createAuthenticator]; NSString *apiString = @"https://api.twitch.tv/kraken/channel"; @@ -117,12 +189,11 @@ //[apiRequest setValue:[NSString stringWithFormat:@"OAuth %@", self.oAuthKey] forHTTPHeaderField:@"Authorization"]; [self.oauthObject jsonRequest:apiRequest completionHandler:^(id decodedData) { - NSLog(@"DECODED DATA %@", decodedData); NSDictionary *channel_response = (NSDictionary *)decodedData; NSString *stream_key = [channel_response objectForKey:@"stream_key"]; - dispatch_async(dispatch_get_main_queue(), ^{self.streamKey = stream_key; }); + dispatch_async(dispatch_get_main_queue(), ^{self.streamKey = stream_key; _key_fetch_pending = NO;}); }]; } diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h index 06e4d157..83899c31 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h @@ -18,5 +18,6 @@ @property (strong) WebView *authWebView; - (IBAction)doTwitchAuth:(id)sender; +- (IBAction)doTwitchstreamkey:(id)sender; @end diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m index ed0fb53a..c963ec12 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m @@ -45,10 +45,16 @@ - (IBAction)doTwitchAuth:(id)sender { - [self.serviceObj fetchTwitchStreamKey]; + [self.serviceObj authenticateUser]; } +- (IBAction)doTwitchstreamkey:(id)sender +{ + [self.serviceObj fetchTwitchStreamKey]; + +} + -(void)closeAuthWindow { diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib index 30db0c85..72fd6d44 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib @@ -1,5 +1,5 @@ - + @@ -13,27 +13,27 @@ - + - - + + - - + + - + @@ -53,7 +53,7 @@ - + @@ -64,17 +64,56 @@ + + + + + + + + + + + + + + + + + + + + + - + From 1490e3a5bee5707ba92caf5f00a211b871e81e27 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 25 Jul 2016 06:02:48 -0400 Subject: [PATCH 117/156] Added Youtube output type. Allows selecting configured youtube live 'events' (plus the default live event) and will fetch the destination + stream key when the stream starts. Added authorization code flow to the OAuth provider. Added an API call for plugins to get the list of accounts stored in the keychain for a given service --- CocoaSplit.xcodeproj/project.pbxproj | 30 ++ CocoaSplit/CSOauth2Authenticator.m | 428 +++++++++++++++--- CocoaSplit/CSPluginServices.m | 33 +- .../PluginHeaders/CSOauth2Authenticator.h | 27 +- CocoaSplit/PluginHeaders/CSPluginServices.h | 5 +- .../project.pbxproj | 20 +- .../TwitchStreamService.m | 16 +- .../TwitchStreamServiceViewController.xib | 4 +- .../project.pbxproj | 317 +++++++++++++ .../CSYoutubeStreamService.h | 38 ++ .../CSYoutubeStreamService.m | 299 ++++++++++++ .../CSYoutubeStreamServiceViewController.h | 17 + .../CSYoutubeStreamServiceViewController.m | 41 ++ .../CSYoutubeStreamServiceViewController.xib | 84 ++++ .../CSYoutubeStreamServicePlugin/Info.plist | 32 ++ 15 files changed, 1305 insertions(+), 86 deletions(-) create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin.xcodeproj/project.pbxproj create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.h create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.m create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamServiceViewController.h create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamServiceViewController.m create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamServiceViewController.xib create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/Info.plist diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 49c80bff..b01ec68f 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ 3408235519BC677A00CD1F5F /* CSNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408235419BC530300CD1F5F /* CSNotifications.m */; }; 3408235619BC677C00CD1F5F /* CSNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408235419BC530300CD1F5F /* CSNotifications.m */; }; 340C7FE91D43D22000B2FD7D /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340C7FE81D43D22000B2FD7D /* Security.framework */; }; + 340C802D1D450A5100B2FD7D /* CSYoutubeStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 340C80151D44722100B2FD7D /* CSYoutubeStreamServicePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 340D8C971959C7C100BE5144 /* CompressionSettingsPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 340D8C961959C7C100BE5144 /* CompressionSettingsPanel.xib */; }; 340DC734197CF6E9003A0BB3 /* CSCaptureBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 340DC733197CF6E9003A0BB3 /* CSCaptureBase.m */; }; 340DC735197CF6E9003A0BB3 /* CSCaptureBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 340DC733197CF6E9003A0BB3 /* CSCaptureBase.m */; }; @@ -357,6 +358,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 340C80141D44722100B2FD7D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 340C80101D44722000B2FD7D /* CSYoutubeStreamServicePlugin.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 340C80071D44722000B2FD7D; + remoteInfo = CSYoutubeStreamServicePlugin; + }; 3436922A1B62364E007EC2D9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 3436921B1B62364E007EC2D9 /* CSShapeCapturePlugin.xcodeproj */; @@ -564,6 +572,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( + 340C802D1D450A5100B2FD7D /* CSYoutubeStreamServicePlugin.bundle in Copy Files */, 343C79ED1D0C796E00B36EEC /* CSFFMpegCapturePlugin.bundle in Copy Files */, 343692501B6243D4007EC2D9 /* CSShapeCapturePlugin.bundle in Copy Files */, 34F7C5871B2C9A5300345230 /* CSDeckLinkCapturePlugin.bundle in Copy Files */, @@ -601,6 +610,7 @@ 3408234619BC50AD00CD1F5F /* CSNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSNotifications.h; path = PluginHeaders/CSNotifications.h; sourceTree = ""; }; 3408235419BC530300CD1F5F /* CSNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSNotifications.m; path = ../CSNotifications.m; sourceTree = ""; }; 340C7FE81D43D22000B2FD7D /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + 340C80101D44722000B2FD7D /* CSYoutubeStreamServicePlugin.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CSYoutubeStreamServicePlugin.xcodeproj; path = StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin.xcodeproj; sourceTree = ""; }; 340D8C961959C7C100BE5144 /* CompressionSettingsPanel.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CompressionSettingsPanel.xib; path = Interface/CompressionSettingsPanel.xib; sourceTree = ""; }; 340DC732197CF6E9003A0BB3 /* CSCaptureBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureBase.h; path = PluginHeaders/CSCaptureBase.h; sourceTree = ""; }; 340DC733197CF6E9003A0BB3 /* CSCaptureBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSCaptureBase.m; sourceTree = ""; }; @@ -1063,6 +1073,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 340C80111D44722000B2FD7D /* Products */ = { + isa = PBXGroup; + children = ( + 340C80151D44722100B2FD7D /* CSYoutubeStreamServicePlugin.bundle */, + ); + name = Products; + sourceTree = ""; + }; 340FE49215F3417E00E4CE4E = { isa = PBXGroup; children = ( @@ -1647,6 +1665,7 @@ 34AFC2E619B08C1E0007C07B /* StreamServicePlugins */ = { isa = PBXGroup; children = ( + 340C80101D44722000B2FD7D /* CSYoutubeStreamServicePlugin.xcodeproj */, 34C67B731A2D7B690012DC1B /* CSHitboxStreamServicePlugin.xcodeproj */, 34AFC31319B0A5800007C07B /* CSTwitchStreamServicePlugin.xcodeproj */, 34AFC2E019B08C050007C07B /* CSFileStreamServicePlugin.xcodeproj */, @@ -2025,6 +2044,10 @@ ProductGroup = 34AFC25519B05B470007C07B /* Products */; ProjectRef = 34576C9819AFE6F7007BAD90 /* CSWindowCapturePlugin.xcodeproj */; }, + { + ProductGroup = 340C80111D44722000B2FD7D /* Products */; + ProjectRef = 340C80101D44722000B2FD7D /* CSYoutubeStreamServicePlugin.xcodeproj */; + }, { ProductGroup = 34AFC27319B05BF50007C07B /* Products */; ProjectRef = 34D43550198DCE3800266169 /* TextureWrapPlugin.xcodeproj */; @@ -2040,6 +2063,13 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ + 340C80151D44722100B2FD7D /* CSYoutubeStreamServicePlugin.bundle */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CSYoutubeStreamServicePlugin.bundle; + remoteRef = 340C80141D44722100B2FD7D /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 3436922B1B62364E007EC2D9 /* CSShapeCapturePlugin.bundle */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; diff --git a/CocoaSplit/CSOauth2Authenticator.m b/CocoaSplit/CSOauth2Authenticator.m index cb858fc8..b9dbd2f3 100644 --- a/CocoaSplit/CSOauth2Authenticator.m +++ b/CocoaSplit/CSOauth2Authenticator.m @@ -8,20 +8,50 @@ #import "CSOauth2Authenticator.h" +NSString *const kCSOauth2ConfigRedirectURL = @"CSOauth2ConfigRedirectURL"; +NSString *const kCSOauth2ConfigScopes = @"CSOauth2ConfigScopes"; +NSString *const kCSOauth2ConfigAuthURL = @"CSOauth2ConfigAuthURL"; +NSString *const kCSOauth2CodeFlow = @"CSOauth2CodeFlow"; +NSString *const kCSOauth2ImplicitGrantFlow = @"CSOauth2ImplicitGrantFlow"; +NSString *const kCSOauth2ExtraAuthParams = @"CSOauth2ExtraAuthParams"; +NSString *const kCSOauth2AccessTokenRequestURL = @"CSOauth2AccessTokenRequestURL"; +NSString *const kCSOauth2AccessRefreshURL = @"CSOauth2AccessRefreshURL"; +NSString *const kCSOauth2ClientSecret = @"CSOauth2ClientSecret"; + + + + + + +@interface CSOauth2Authenticator() +{ + NSMutableDictionary *_config_dict; +} + +@property (strong) NSString *refreshToken; +@property (strong) NSDate *expireDate; + +@end + + @implementation CSOauth2Authenticator - --(instancetype) initWithServiceName:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify useKeychain:(bool)use_keychain +-(instancetype) initWithServiceName:(NSString *)serviceName clientID:(NSString *)client_id flowType:(NSString *)flow_type config:(NSDictionary *)config_dict { if (self = [self init]) { self.serviceName = serviceName; - self.authLocation = auth_location; self.clientID = client_id; - self.redirectURL = redirect_url; - self.authScopes = scopes; - self.forceVerify = force_verify; - self.useKeychain = use_keychain; + self.forceVerify = NO; + self.useKeychain = YES; + self.flowType = flow_type; + + if (config_dict) + { + _config_dict = [config_dict mutableCopy]; + } else { + _config_dict = [[NSMutableDictionary alloc] init]; + } } return self; @@ -29,6 +59,25 @@ + +-(void)configurationVariableSet:(id)val forName:(NSString *)forName +{ + [_config_dict setObject:val forKey:forName]; +} + +-(id)configurationVariableGet:(NSString *)forName +{ + return [_config_dict objectForKey:forName]; +} + +-(id)configurationVariableRemove:(NSString *)forName +{ + id ret = [_config_dict objectForKey:forName]; + [_config_dict removeObjectForKey:forName]; + return ret; +} + + -(NSMutableDictionary *)buildKeychainQuery { NSString *useServiceName = [NSString stringWithFormat:@"CocoaSplit-%@", self.serviceName]; @@ -40,6 +89,7 @@ return keyChainAttrs; } + -(void)loadFromKeychain { NSLog(@"ACCOUNT NAME %@", self.accountName); @@ -68,6 +118,9 @@ if (storedData) { self.accessToken = storedData[@"accessToken"]; + self.refreshToken = storedData[@"refreshToken"]; + self.expireDate = storedData[@"expireDate"]; + } CFRelease(keyData); } @@ -94,7 +147,19 @@ NSMutableDictionary *keyChainAttrs = [self buildKeychainQuery]; - NSDictionary *keyDataDict = @{@"accessToken": self.accessToken}; + NSMutableDictionary *keyDataDict = [[NSMutableDictionary alloc] init]; + [keyDataDict setObject:self.accessToken forKey:@"accessToken"]; + if (self.refreshToken) + { + [keyDataDict setObject:self.refreshToken forKey:@"refreshToken"]; + + } + + if (self.expireDate) + { + [keyDataDict setObject:self.expireDate forKey:@"expireDate"]; + + } NSData *keyData = [NSKeyedArchiver archivedDataWithRootObject:keyDataDict]; [keyChainAttrs setObject:keyData forKey:(__bridge NSString *)kSecValueData]; @@ -112,26 +177,73 @@ +-(NSString *)buildQueryString:(NSDictionary *)params +{ + NSMutableArray *paramParts = [[NSMutableArray alloc] init]; + + for (NSString *pname in params) + { + NSString *pval = params[pname]; + NSString *equalString = [NSString stringWithFormat:@"%@=%@", pname, [pval stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + [paramParts addObject:equalString]; + } + + return [paramParts componentsJoinedByString:@"&"]; +} + + -(void)buildAuthURL { //NSQueryItems is 10.10+, so we can't use it :/ - NSURLComponents *urlComponent = [NSURLComponents componentsWithString:self.authLocation]; + NSString *authLocation = [self configurationVariableGet:kCSOauth2ConfigAuthURL]; + + if (!authLocation) + { + return; + } + + NSURLComponents *urlComponent = [NSURLComponents componentsWithString:authLocation]; NSMutableArray *paramParts = [[NSMutableArray alloc] init]; - [paramParts addObject:@"response_type=token"]; - [paramParts addObject:[NSString stringWithFormat:@"client_id=%@", self.clientID]]; - [paramParts addObject:[NSString stringWithFormat:@"redirect_uri=%@", self.redirectURL]]; + NSString *response_type = nil; - NSString *scopeValue = [self.authScopes componentsJoinedByString:@" "]; - [paramParts addObject:[NSString stringWithFormat:@"scope=%@", scopeValue]]; - - if (self.extraAuthParams) + if ([self.flowType isEqualToString:kCSOauth2CodeFlow]) { - for(NSString *key in self.extraAuthParams) + response_type = @"code"; + } else if ([self.flowType isEqualToString:kCSOauth2ImplicitGrantFlow]) { + response_type = @"token"; + } + + + [paramParts addObject:[NSString stringWithFormat:@"response_type=%@", response_type]]; + + [paramParts addObject:[NSString stringWithFormat:@"client_id=%@", self.clientID]]; + + NSString *redirectURL = [self configurationVariableGet:kCSOauth2ConfigRedirectURL]; + + if (redirectURL) + { + [paramParts addObject:[NSString stringWithFormat:@"redirect_uri=%@", redirectURL]]; + } + + + NSArray *authScopes = [self configurationVariableGet:kCSOauth2ConfigScopes]; + + if (authScopes) + { + NSString *scopeValue = [authScopes componentsJoinedByString:@" "]; + [paramParts addObject:[NSString stringWithFormat:@"scope=%@", scopeValue]]; + } + + NSDictionary *extraAuthParams = [self configurationVariableGet:kCSOauth2ExtraAuthParams]; + + if (extraAuthParams) + { + for(NSString *key in extraAuthParams) { - NSString *val = self.extraAuthParams[key]; + NSString *val = extraAuthParams[key]; [paramParts addObject:[NSString stringWithFormat:@"%@=%@", key,val]]; } } @@ -146,39 +258,59 @@ } +-(bool)doesTokenNeedRefresh +{ + + NSLog(@"EXPIRE DATE %@", self.expireDate); + + if (!self.expireDate) + { + return NO; + } + + NSDate *nowDate = [NSDate date]; + + NSLog(@"NOW DATE %@", nowDate); + + if ([nowDate compare:self.expireDate] == NSOrderedDescending) + { + return YES; + } + + return NO; +} + + -(void)authorize:(void (^)(bool success))authCallback { bool doAuth = NO; - if (!self.accessToken) + if (!self.forceVerify) { - - - if (!self.forceVerify) + [self loadFromKeychain]; + if ([self doesTokenNeedRefresh]) { - [self loadFromKeychain]; - if (self.accessToken) - { - doAuth = NO; - } else { - doAuth = YES; - } + _authorizeCallback = authCallback; + [self refreshAccessToken]; + return; } - } - - if (self.forceVerify) - { + + if (self.accessToken) + { + doAuth = NO; + } else { + doAuth = YES; + } + } else { doAuth = YES; } - _authorizeCallback = authCallback; if (doAuth) { - if (!self.authURL) - { - [self buildAuthURL]; - } + _authorizeCallback = authCallback; + + [self buildAuthURL]; NSLog(@"AUTHORIZATION URL IS %@", self.authURL); @@ -195,6 +327,7 @@ } else { if (authCallback) { + NSLog(@"CALLING AUTH CALLBACK FROM AUTHORIZE"); authCallback(!!self.accessToken); } } @@ -207,6 +340,147 @@ _authWindow = nil; } +-(void)refreshAccessToken +{ + NSString *refreshLocation = [self configurationVariableGet:kCSOauth2AccessRefreshURL]; + NSString *clientSecret = [self configurationVariableGet:kCSOauth2ClientSecret]; + NSString *redirectURL = [self configurationVariableGet:kCSOauth2ConfigRedirectURL]; + + + NSLog(@"DOING REFRESH LOC %@ SEC %@ REDIR %@ REFRESH %@", refreshLocation, clientSecret, redirectURL, self.refreshToken); + if (!refreshLocation || !clientSecret || !redirectURL || !self.refreshToken) + { + return; + } + + + NSURL *locationURL = [NSURL URLWithString:refreshLocation]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:locationURL]; + request.HTTPMethod = @"POST"; + + NSDictionary *queryDict = @{@"grant_type": @"refresh_token", + @"client_id": self.clientID, + @"refresh_token": self.refreshToken, + @"client_secret": clientSecret }; + + NSString *queryString = [self buildQueryString:queryDict]; + request.HTTPBody = [queryString dataUsingEncoding:NSUTF8StringEncoding]; + + NSURLSession *urlSession = [NSURLSession sharedSession]; + + NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:request + completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { + NSError *jsonError; + NSDictionary *tokenData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError]; + + self.accessToken = tokenData[@"access_token"]; + NSNumber *expire_seconds = tokenData[@"expires_in"]; + self.expireDate = [NSDate dateWithTimeIntervalSinceNow:expire_seconds.integerValue]; + if (_authorizeCallback) + { + _authorizeCallback(!!self.accessToken); + } + + + }]; + + [dataTask resume]; + + +} +-(void)requestAccessToken:(NSString *)forCode +{ + + NSLog(@"GET ACCESS TOKEN FOR %@", forCode); + + NSString *tokenLocation = [self configurationVariableGet:kCSOauth2AccessTokenRequestURL]; + NSString *clientSecret = [self configurationVariableGet:kCSOauth2ClientSecret]; + NSString *redirectURL = [self configurationVariableGet:kCSOauth2ConfigRedirectURL]; + + + if (!tokenLocation || !clientSecret || !redirectURL) + { + return; + } + + + NSURL *locationURL = [NSURL URLWithString:tokenLocation]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:locationURL]; + request.HTTPMethod = @"POST"; + + NSDictionary *queryDict = @{@"grant_type": @"authorization_code", + @"code": forCode, + @"redirect_uri": redirectURL, + @"client_id": self.clientID, + @"client_secret": clientSecret }; + + NSString *queryString = [self buildQueryString:queryDict]; + request.HTTPBody = [queryString dataUsingEncoding:NSUTF8StringEncoding]; + + NSURLSession *urlSession = [NSURLSession sharedSession]; + + NSLog(@"DOING ACCESS %@", request); + + NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:request + completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { + NSError *jsonError; + NSDictionary *tokenData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError]; + + NSLog(@"TOKEN DATA IS %@", tokenData); + + self.accessToken = tokenData[@"access_token"]; + self.refreshToken = tokenData[@"refresh_token"]; + NSNumber *expire_seconds = tokenData[@"expires_in"]; + self.expireDate = [NSDate dateWithTimeIntervalSinceNow:expire_seconds.integerValue]; + if (_authorizeCallback) + { + _authorizeCallback(!!self.accessToken); + if (self.accountNameFetcher && self.useKeychain) + { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + + self.accountNameFetcher(self); + + }); + } + } + + + }]; + + [dataTask resume]; + + + + + +} +-(NSString *)extractCodeFromURL:(NSURL *)url +{ + NSString *query = url.query; + + for (NSString *param in [query componentsSeparatedByString:@"&"]) + { + NSArray *pparts = [param componentsSeparatedByString:@"="]; + if (pparts.count < 2) + { + //what? + continue; + } + + NSString *pname = pparts.firstObject; + NSString *pvalue = pparts.lastObject; + + if ([pname isEqualToString:@"code"]) + { + return pvalue; + } + } + return nil; +} + + + -(NSString *)extractAccessTokenFromURL:(NSURL *)url { NSURLComponents *urlComp = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; @@ -225,8 +499,18 @@ -(bool)isURLRedirect:(NSURL *)testurl { + + + NSString *redirectURL = [self configurationVariableGet:kCSOauth2ConfigRedirectURL]; + + NSLog(@"TESTING REDIRECT %@ AGAINST %@", redirectURL, testurl); + if (!redirectURL) + { + return NO; + } + NSURLComponents *testComp = [NSURLComponents componentsWithURL:testurl resolvingAgainstBaseURL:NO]; - NSURLComponents *redirectComp = [NSURLComponents componentsWithString:self.redirectURL]; + NSURLComponents *redirectComp = [NSURLComponents componentsWithString:redirectURL]; if (![testComp.scheme isEqualToString:redirectComp.scheme]) { @@ -254,7 +538,9 @@ { NSURL *reqUrl = request.URL; - if (reqUrl && self.redirectURL) + NSString *redirectURL = [self configurationVariableGet:kCSOauth2ConfigRedirectURL]; + + if (reqUrl && redirectURL) { @@ -262,20 +548,28 @@ if ([self isURLRedirect:reqUrl]) { [listener ignore]; - self.accessToken = [self extractAccessTokenFromURL:reqUrl]; - [self closeAuthWindow]; - if (_authorizeCallback) + NSLog(@"REQ URL %@", reqUrl); + + if ([self.flowType isEqualToString:kCSOauth2ImplicitGrantFlow]) { - _authorizeCallback(!!self.accessToken); - if (self.accountNameFetcher && self.useKeychain) + self.accessToken = [self extractAccessTokenFromURL:reqUrl]; + if (_authorizeCallback) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - - self.accountNameFetcher(self); - - }); + _authorizeCallback(!!self.accessToken); + if (self.accountNameFetcher && self.useKeychain) + { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + + self.accountNameFetcher(self); + + }); + } } + } else if ([self.flowType isEqualToString:kCSOauth2CodeFlow]) { + NSString *flowCode = [self extractCodeFromURL:reqUrl]; + [self requestAccessToken:flowCode]; } + [self closeAuthWindow]; } } @@ -290,11 +584,23 @@ { //Set OAuth Bearer header + NSString *authType; - [request setValue:[NSString stringWithFormat:@"OAuth %@", self.accessToken] forHTTPHeaderField:@"Authorization"]; + if ([self.flowType isEqualToString:kCSOauth2ImplicitGrantFlow]) + { + authType = @"OAuth"; + } else if ([self.flowType isEqualToString:kCSOauth2CodeFlow]) { + authType = @"Bearer"; + } + + + + [request setValue:[NSString stringWithFormat:@"%@ %@", authType, self.accessToken] forHTTPHeaderField:@"Authorization"]; NSURLSession *urlSession = [NSURLSession sharedSession]; + NSLog(@"CALLING REQUEST %@", request); + NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSError *jsonError; @@ -310,19 +616,13 @@ -(void)jsonRequest:(NSMutableURLRequest *)request completionHandler:(void (^)(id decodedData))handler { - if (!self.accessToken) - { - [self authorize:^(bool success) { - if (success) - { - [self authorizedJsonRequest:request completionHandler:handler]; - } - - }]; - } else { - [self authorizedJsonRequest:request completionHandler:handler]; - - } + [self authorize:^(bool success) { + if (success) + { + [self authorizedJsonRequest:request completionHandler:handler]; + } + + }]; } diff --git a/CocoaSplit/CSPluginServices.m b/CocoaSplit/CSPluginServices.m index a0ef265a..a53d788d 100644 --- a/CocoaSplit/CSPluginServices.m +++ b/CocoaSplit/CSPluginServices.m @@ -33,6 +33,34 @@ +-(NSArray *)accountNamesForService:(NSString *)serviceName +{ + + NSString *useServiceName = [NSString stringWithFormat:@"CocoaSplit-%@", serviceName]; + NSMutableDictionary *keyChainAttrs = [[NSMutableDictionary alloc] init]; + + [keyChainAttrs setObject:(__bridge NSString *)kSecClassGenericPassword forKey:(__bridge NSString *)kSecClass]; + [keyChainAttrs setObject:useServiceName forKey:(__bridge NSString *)kSecAttrService]; + [keyChainAttrs setObject:(id)kCFBooleanTrue forKey:(__bridge NSString *)kSecReturnAttributes]; + [keyChainAttrs setObject:(__bridge id)kSecMatchLimitAll forKey:(__bridge NSString *)kSecMatchLimit]; + + CFArrayRef resultArray = NULL; + + NSMutableArray *retArr = [[NSMutableArray alloc] init]; + + SecItemCopyMatching((CFDictionaryRef)keyChainAttrs, (CFTypeRef *)&resultArray); + + + for (NSDictionary *itemDict in (__bridge NSArray *)resultArray) + { + NSString *accountName = itemDict[(__bridge NSString *)kSecAttrAccount]; + [retArr addObject:accountName]; + } + + return retArr; +} + + -(double) currentFPS { AppDelegate *myAppDelegate = [[NSApplication sharedApplication] delegate]; @@ -103,10 +131,11 @@ } --(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify useKeychain:(bool)use_keychain +-(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName clientID:(NSString *)client_id flowType:(NSString *)flow_type config:(NSDictionary *)config_dict; { - return [[CSOauth2Authenticator alloc] initWithServiceName:serviceName authLocation:auth_location clientID:client_id redirectURL:redirect_url authScopes:scopes forceVerify:force_verify useKeychain:use_keychain]; + return [[CSOauth2Authenticator alloc] initWithServiceName:serviceName clientID:client_id flowType:flow_type config:config_dict]; } + @end diff --git a/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h b/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h index 87d7e8dc..432b1c4f 100644 --- a/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h +++ b/CocoaSplit/PluginHeaders/CSOauth2Authenticator.h @@ -9,6 +9,21 @@ #import #import +extern NSString *const kCSOauth2ConfigRedirectURL; +extern NSString *const kCSOauth2ConfigScopes; +extern NSString *const kCSOauth2ConfigAuthURL; +extern NSString *const kCSOauth2AccessTokenRequestURL; +extern NSString *const kCSOauth2AccessRefreshURL; +extern NSString *const kCSOauth2CodeFlow; +extern NSString *const kCSOauth2ImplicitGrantFlow; +extern NSString *const kCSOauth2ExtraAuthParams; +extern NSString *const kCSOauth2ClientSecret; + + + + + + @interface CSOauth2Authenticator : NSObject { NSWindow *_authWindow; @@ -17,9 +32,6 @@ } -@property (strong) NSString *authLocation; -@property (strong) NSString *redirectURL; -@property (strong) NSArray *authScopes; @property (strong) NSString *clientID; @property (assign) bool forceVerify; @property (strong) NSURL *authURL; @@ -27,18 +39,25 @@ @property (strong) NSString *accessToken; @property (strong) NSString *accountName; @property (assign) bool useKeychain; +@property (strong) NSString *flowType; + @property (nonatomic, copy) void(^accountNameFetcher)(CSOauth2Authenticator *authenticator); @property (strong) NSDictionary *extraAuthParams; --(instancetype) initWithServiceName:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify useKeychain:(bool)use_keychain; +-(instancetype) initWithServiceName:(NSString *)serviceName clientID:(NSString *)client_id flowType:(NSString *)flow_type config:(NSDictionary *)config_dict; + -(void)jsonRequest:(NSMutableURLRequest *)request completionHandler:(void (^)(id decodedData))handler; -(void)saveToKeychain:(NSString *)accountName; -(void)authorize:(void (^)(bool success))authCallback; +-(void)configurationVariableSet:(id)val forName:(NSString *)forName; +-(id)configurationVariableGet:(NSString *)forName; +-(id)configurationVariableRemove:(NSString *)forName; + @end diff --git a/CocoaSplit/PluginHeaders/CSPluginServices.h b/CocoaSplit/PluginHeaders/CSPluginServices.h index bdb6e955..e800f5f9 100644 --- a/CocoaSplit/PluginHeaders/CSPluginServices.h +++ b/CocoaSplit/PluginHeaders/CSPluginServices.h @@ -21,7 +21,10 @@ -(void)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile withBlock:(void(^)(Class))withBlock; -(Class)loadPythonClass:(NSString *)pyClass fromFile:(NSString *)fromFile; --(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName authLocation:(NSString *)auth_location clientID:(NSString *)client_id redirectURL:(NSString *)redirect_url authScopes:(NSArray *)scopes forceVerify:(bool)force_verify useKeychain:(bool)use_keychain; + +-(CSOauth2Authenticator *) createOAuth2Authenticator:(NSString *)serviceName clientID:(NSString *)client_id flowType:(NSString *)flow_type config:(NSDictionary *)config_dict; +-(NSArray *)accountNamesForService:(NSString *)serviceName; + @property (readonly) double currentFPS; @property (readonly) int audioSampleRate; diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj index cf4f8153..0f3a3855 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin.xcodeproj/project.pbxproj @@ -23,11 +23,11 @@ 34AFC30919B0A5800007C07B /* CSTwitchStreamServicePlugin-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CSTwitchStreamServicePlugin-Info.plist"; sourceTree = ""; }; 34AFC30B19B0A5800007C07B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 34AFC30D19B0A5800007C07B /* CSTwitchStreamServicePlugin-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CSTwitchStreamServicePlugin-Prefix.pch"; sourceTree = ""; }; - 34AFC31E19B0A5DC0007C07B /* TwitchStreamService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwitchStreamService.h; sourceTree = ""; }; - 34AFC31F19B0A5DC0007C07B /* TwitchStreamService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitchStreamService.m; sourceTree = ""; }; - 34AFC32119B0A5FD0007C07B /* TwitchStreamServiceViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwitchStreamServiceViewController.h; sourceTree = ""; }; - 34AFC32219B0A5FD0007C07B /* TwitchStreamServiceViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitchStreamServiceViewController.m; sourceTree = ""; }; - 34AFC32319B0A5FD0007C07B /* TwitchStreamServiceViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TwitchStreamServiceViewController.xib; sourceTree = ""; }; + 34AFC31E19B0A5DC0007C07B /* TwitchStreamService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TwitchStreamService.h; path = ../TwitchStreamService.h; sourceTree = ""; }; + 34AFC31F19B0A5DC0007C07B /* TwitchStreamService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TwitchStreamService.m; path = ../TwitchStreamService.m; sourceTree = ""; }; + 34AFC32119B0A5FD0007C07B /* TwitchStreamServiceViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TwitchStreamServiceViewController.h; path = ../TwitchStreamServiceViewController.h; sourceTree = ""; }; + 34AFC32219B0A5FD0007C07B /* TwitchStreamServiceViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TwitchStreamServiceViewController.m; path = ../TwitchStreamServiceViewController.m; sourceTree = ""; }; + 34AFC32319B0A5FD0007C07B /* TwitchStreamServiceViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = TwitchStreamServiceViewController.xib; path = ../TwitchStreamServiceViewController.xib; sourceTree = ""; }; 34EA822A1D3AC49600928A06 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 34EA823E1D3CBD3600928A06 /* CSPluginServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginServices.h; path = PluginHeaders/CSPluginServices.h; sourceTree = ""; }; 34EA823F1D3CBD3600928A06 /* CSIOSurfaceLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSIOSurfaceLayer.h; path = PluginHeaders/CSIOSurfaceLayer.h; sourceTree = ""; }; @@ -61,11 +61,6 @@ isa = PBXGroup; children = ( 34EA824C1D3CBD3600928A06 /* PluginHeaders */, - 34AFC32119B0A5FD0007C07B /* TwitchStreamServiceViewController.h */, - 34AFC32219B0A5FD0007C07B /* TwitchStreamServiceViewController.m */, - 34AFC32319B0A5FD0007C07B /* TwitchStreamServiceViewController.xib */, - 34AFC31E19B0A5DC0007C07B /* TwitchStreamService.h */, - 34AFC31F19B0A5DC0007C07B /* TwitchStreamService.m */, 34AFC30719B0A5800007C07B /* CSTwitchStreamServicePlugin */, 34AFC30019B0A5800007C07B /* Frameworks */, 34AFC2FF19B0A5800007C07B /* Products */, @@ -103,6 +98,11 @@ 34AFC30719B0A5800007C07B /* CSTwitchStreamServicePlugin */ = { isa = PBXGroup; children = ( + 34AFC32119B0A5FD0007C07B /* TwitchStreamServiceViewController.h */, + 34AFC32219B0A5FD0007C07B /* TwitchStreamServiceViewController.m */, + 34AFC32319B0A5FD0007C07B /* TwitchStreamServiceViewController.xib */, + 34AFC31E19B0A5DC0007C07B /* TwitchStreamService.h */, + 34AFC31F19B0A5DC0007C07B /* TwitchStreamService.m */, 34AFC30819B0A5800007C07B /* Supporting Files */, ); path = CSTwitchStreamServicePlugin; diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m index 47f192ec..a102903e 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m @@ -120,7 +120,12 @@ { _oauth_client_id = [[NSBundle bundleForClass:[self class]] objectForInfoDictionaryKey:@"TwitchAPIClientID"]; } - self.oauthObject = [[CSPluginServices sharedPluginServices] createOAuth2Authenticator:@"twitch" authLocation:@"https://api.twitch.tv/kraken/oauth2/authorize" clientID:_oauth_client_id redirectURL:@"cocoasplit-twitch://cocoasplit.com/oauth/redirect" authScopes:@[@"channel_read", @"user_read"] forceVerify:NO useKeychain:YES]; + + NSDictionary *oconfig = @{kCSOauth2ConfigAuthURL:@"https://api.twitch.tv/kraken/oauth2/authorize", kCSOauth2ConfigRedirectURL:@"cocoasplit-twitch://cocoasplit.com/oauth/redirect", kCSOauth2ConfigScopes:@[@"channel_read", @"user_read"]}; + + self.oauthObject = [[CSPluginServices sharedPluginServices] createOAuth2Authenticator:@"twitch" clientID:_oauth_client_id flowType:kCSOauth2ImplicitGrantFlow config:oconfig]; + + self.oauthObject.accountName = self.accountName; self.oauthObject.accountNameFetcher = ^void(CSOauth2Authenticator *authenticator) { [self fetchAccountname:authenticator]; @@ -132,10 +137,12 @@ { [self createAuthenticator]; self.oauthObject.forceVerify = YES; - self.oauthObject.extraAuthParams = @{@"force_verify": @"true"}; + [self.oauthObject configurationVariableSet:@{@"force_verify": @"true"} forName:kCSOauth2ExtraAuthParams]; + [self fetchTwitchStreamKey]; self.oauthObject.forceVerify = NO; - self.oauthObject.extraAuthParams = nil; + [self.oauthObject configurationVariableRemove:kCSOauth2ExtraAuthParams]; + } @@ -193,6 +200,9 @@ NSDictionary *channel_response = (NSDictionary *)decodedData; NSString *stream_key = [channel_response objectForKey:@"stream_key"]; + NSLog(@"GOT CHANNEL RESPONSE %@", channel_response); + NSLog(@"STREAM KEY IS %@", stream_key); + dispatch_async(dispatch_get_main_queue(), ^{self.streamKey = stream_key; _key_fetch_pending = NO;}); }]; } diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib index 72fd6d44..29af1c85 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib @@ -54,13 +54,13 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/Info.plist b/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/Info.plist new file mode 100644 index 00000000..615726dc --- /dev/null +++ b/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSHumanReadableCopyright + Copyright © 2016 Zakk. All rights reserved. + NSPrincipalClass + CSYoutubeStreamService + YoutubeClientID + 997237227687-ubgm910gsivg6g0v00qgm0sgngq1o0oe.apps.googleusercontent.com + YoutubeClientSecret + xvgH6PQpQkVDCfxNGHvkJiim + + From a124628b506a61656dc12951d1e2d9837efa0f67 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 25 Jul 2016 08:30:13 -0400 Subject: [PATCH 118/156] Twitch and Youtube outputs display a list of known accounts. --- CocoaSplit/CSOauth2Authenticator.m | 5 +- .../TwitchStreamService.h | 1 + .../TwitchStreamService.m | 36 +++++++++++-- .../TwitchStreamServiceViewController.xib | 33 +++++++----- .../CSYoutubeStreamService.h | 1 + .../CSYoutubeStreamService.m | 50 +++++++++++++++++-- .../CSYoutubeStreamServiceViewController.xib | 49 ++++++++++-------- 7 files changed, 128 insertions(+), 47 deletions(-) diff --git a/CocoaSplit/CSOauth2Authenticator.m b/CocoaSplit/CSOauth2Authenticator.m index b9dbd2f3..34abe996 100644 --- a/CocoaSplit/CSOauth2Authenticator.m +++ b/CocoaSplit/CSOauth2Authenticator.m @@ -92,7 +92,6 @@ NSString *const kCSOauth2ClientSecret = @"CSOauth2ClientSecret"; -(void)loadFromKeychain { - NSLog(@"ACCOUNT NAME %@", self.accountName); if (!self.useKeychain || !self.accountName || !self.serviceName) { @@ -132,9 +131,7 @@ NSString *const kCSOauth2ClientSecret = @"CSOauth2ClientSecret"; -(void)saveToKeychain:(NSString *)accountName { self.accountName = accountName; - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - [self saveToKeychain]; - }); + [self saveToKeychain]; } diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h index 7f815220..1d8763d5 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.h @@ -28,6 +28,7 @@ @property (strong) CSOauth2Authenticator *oauthObject; @property (strong) NSString *accountName; @property (assign) bool alwaysFetchKey; +@property (strong) NSArray *knownAccounts; diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m index a102903e..97760815 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m @@ -12,12 +12,17 @@ @implementation TwitchStreamService +@synthesize accountName = _accountName; + -(instancetype) init { if(self = [super init]) { self.isReady = YES; + self.knownAccounts = [[CSPluginServices sharedPluginServices] accountNamesForService:@"twitch"]; } + + return self; } @@ -63,6 +68,18 @@ } +-(NSString *)accountName +{ + return _accountName; +} + +-(void)setAccountName:(NSString *)accountName +{ + _accountName = accountName; + self.oauthObject = nil; +} + + -(void)prepareForStreamStart { if (self.alwaysFetchKey && !_key_fetch_pending) @@ -135,6 +152,8 @@ -(void)authenticateUser { + self.accountName = nil; + [self createAuthenticator]; self.oauthObject.forceVerify = YES; [self.oauthObject configurationVariableSet:@{@"force_verify": @"true"} forName:kCSOauth2ExtraAuthParams]; @@ -153,6 +172,13 @@ if (self.accountName) { [authenticator saveToKeychain:self.accountName]; + + dispatch_async(dispatch_get_main_queue(), ^{ + + self.knownAccounts = [[CSPluginServices sharedPluginServices] accountNamesForService:@"twitch"]; + }); + + return; } @@ -172,7 +198,11 @@ NSString *account_name = [user_response objectForKey:@"name"]; [authenticator saveToKeychain:account_name]; - dispatch_async(dispatch_get_main_queue(), ^{self.accountName = account_name; }); + dispatch_async(dispatch_get_main_queue(), ^{ + + self.accountName = account_name; + self.knownAccounts = [[CSPluginServices sharedPluginServices] accountNamesForService:@"twitch"]; + }); }]; } } @@ -199,10 +229,6 @@ NSDictionary *channel_response = (NSDictionary *)decodedData; NSString *stream_key = [channel_response objectForKey:@"stream_key"]; - - NSLog(@"GOT CHANNEL RESPONSE %@", channel_response); - NSLog(@"STREAM KEY IS %@", stream_key); - dispatch_async(dispatch_get_main_queue(), ^{self.streamKey = stream_key; _key_fetch_pending = NO;}); }]; } diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib index 29af1c85..fdd89bf9 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib @@ -73,17 +73,6 @@ - - - - - - - - - - - @@ -103,8 +92,8 @@ + + + + + + + + + + + + + + + + + + diff --git a/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.h b/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.h index 443d3c58..362e4e3a 100644 --- a/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.h +++ b/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.h @@ -34,5 +34,6 @@ @property (strong) CSOauth2Authenticator *oauthObject; @property (strong) NSArray *liveStreams; @property (strong) NSDictionary *selectedLiveStream; +@property (strong) NSArray *knownAccounts; @end diff --git a/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.m b/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.m index 1305647b..b827bbcd 100644 --- a/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.m +++ b/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamService.m @@ -11,8 +11,24 @@ @implementation CSYoutubeStreamService +@synthesize accountName = _accountName; +-(instancetype) init +{ + if(self = [super init]) + { + self.knownAccounts = [[CSPluginServices sharedPluginServices] accountNamesForService:@"youtube"]; + if (self.knownAccounts.count == 1) + { + self.accountName = self.knownAccounts.firstObject; + } + } + + + return self; +} + -(void)encodeWithCoder:(NSCoder *)aCoder { @@ -41,6 +57,19 @@ +-(NSString *)accountName +{ + return _accountName; +} + +-(void)setAccountName:(NSString *)accountName +{ + _accountName = accountName; + self.oauthObject = nil; + [self fetchliveStreams]; +} + + +(NSString *)label { return @"Youtube"; @@ -190,7 +219,6 @@ NSURL *apiURL = [NSURL URLWithString:apiString]; - NSMutableURLRequest *apiRequest = [NSMutableURLRequest requestWithURL:apiURL]; @@ -199,8 +227,11 @@ [self.oauthObject jsonRequest:apiRequest completionHandler:^(id decodedData) { NSDictionary *livestream_response = (NSDictionary *)decodedData; - self.liveStreams = livestream_response[@"items"]; - [self selectStream]; + + dispatch_async(dispatch_get_main_queue(), ^{ + self.liveStreams = livestream_response[@"items"]; + [self selectStream]; + }); //dispatch_async(dispatch_get_main_queue(), ^{self.streamKey = stream_key; _key_fetch_pending = NO;}); }]; @@ -212,6 +243,12 @@ if (self.accountName) { [authenticator saveToKeychain:self.accountName]; + dispatch_async(dispatch_get_main_queue(), ^{ + + self.knownAccounts = [[CSPluginServices sharedPluginServices] accountNamesForService:@"twitch"]; + [self fetchliveStreams]; + }); + return; } @@ -231,7 +268,12 @@ NSString *account_name = [user_response objectForKey:@"email"]; [authenticator saveToKeychain:account_name]; - dispatch_async(dispatch_get_main_queue(), ^{self.accountName = account_name; }); + dispatch_async(dispatch_get_main_queue(), ^{ + + self.accountName = account_name; + self.knownAccounts = [[CSPluginServices sharedPluginServices] accountNamesForService:@"twitch"]; + //[self fetchliveStreams]; + }); }]; } } diff --git a/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamServiceViewController.xib b/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamServiceViewController.xib index 1b8bbaaf..1d8c77a5 100644 --- a/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamServiceViewController.xib +++ b/StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/CSYoutubeStreamServiceViewController.xib @@ -17,23 +17,13 @@ - - + + - @@ -43,7 +33,7 @@ - + @@ -61,17 +51,34 @@ - - - + + + + - - - + + + + + + + + - + + - + + From 17054d86c5e30b618659703ec22daddb441ca8f8 Mon Sep 17 00:00:00 2001 From: Zakk Date: Mon, 25 Jul 2016 08:56:52 -0400 Subject: [PATCH 119/156] Sort twitch ingest server list --- .../TwitchStreamServiceViewController.h | 1 + .../TwitchStreamServiceViewController.m | 2 ++ .../TwitchStreamServiceViewController.xib | 7 ++++--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h index 83899c31..34b8570d 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.h @@ -16,6 +16,7 @@ @property (weak) TwitchStreamService *serviceObj; @property (strong) NSWindow *authWindow; @property (strong) WebView *authWebView; +@property (strong) NSArray *serverSortDescriptors; - (IBAction)doTwitchAuth:(id)sender; - (IBAction)doTwitchstreamkey:(id)sender; diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m index c963ec12..23392132 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.m @@ -20,6 +20,8 @@ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Initialization code here. + self.serverSortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]]; + } return self; } diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib index fdd89bf9..721bf1b9 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib @@ -13,7 +13,7 @@ - + @@ -120,16 +120,17 @@ - + - + + From 6b09445d994a415746b1a1734bdbcc797a1eb9ca Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 30 Jul 2016 21:28:53 -0400 Subject: [PATCH 120/156] Removed switching output type via the create/edit dialog. type is now set on creation via a popover menu --- CocoaSplit.xcodeproj/project.pbxproj | 40 ++++ CocoaSplit/CaptureController.h | 8 +- CocoaSplit/CaptureController.m | 52 ++++- .../Interface/CSAddInputViewController.xib | 4 +- .../CSAddOutputPopupViewController.h | 26 +++ .../CSAddOutputPopupViewController.m | 117 +++++++++++ .../CSAddOutputPopupViewController.xib | 113 +++++++++++ .../Interface/CSInputLibraryItemView.xib | 2 +- .../Interface/CSNewOutputWindowController.xib | 58 ++---- CocoaSplit/Interface/LogWindow.xib | 4 +- CocoaSplit/en.lproj/MainMenu.xib | 192 ++++++++++++------ .../TwitchStreamServiceViewController.xib | 2 +- .../project.pbxproj | 57 ++++++ .../CSVaughnliveStreamServicePlugin.xcscheme | 80 ++++++++ .../xcschemes/xcschememanagement.plist | 22 ++ ...SVaughnliveStreamServiceViewController.xib | 4 +- 16 files changed, 673 insertions(+), 108 deletions(-) create mode 100644 CocoaSplit/Interface/CSAddOutputPopupViewController.h create mode 100644 CocoaSplit/Interface/CSAddOutputPopupViewController.m create mode 100644 CocoaSplit/Interface/CSAddOutputPopupViewController.xib create mode 100644 StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSVaughnliveStreamServicePlugin.xcscheme create mode 100644 StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index b01ec68f..928d653c 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -139,6 +139,9 @@ 346CF44D1A5C10C2008E5BFF /* CSInputLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 346CF44B1A5C10C2008E5BFF /* CSInputLayer.m */; }; 347277FD1A5A2758008801A9 /* CSIOSurfaceLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 347277FC1A5A2758008801A9 /* CSIOSurfaceLayer.m */; }; 347277FE1A5A2758008801A9 /* CSIOSurfaceLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 347277FC1A5A2758008801A9 /* CSIOSurfaceLayer.m */; }; + 3473D2871D4C359700842EEE /* CSVaughnliveStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 3473D27E1D4C349700842EEE /* CSVaughnliveStreamServicePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3473D29A1D4C3D0E00842EEE /* CSAddOutputPopupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3473D2981D4C3D0E00842EEE /* CSAddOutputPopupViewController.m */; }; + 3473D29B1D4C3D0E00842EEE /* CSAddOutputPopupViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3473D2991D4C3D0E00842EEE /* CSAddOutputPopupViewController.xib */; }; 34792AF616104AA70065A859 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34792AF516104AA70065A859 /* IOKit.framework */; }; 34792AFB1611A6B90065A859 /* IOSurface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34792AFA1611A6B90065A859 /* IOSurface.framework */; }; 3479A9971A9007DD00A524F0 /* CocoaSplit.sdef in Resources */ = {isa = PBXBuildFile; fileRef = 3479A9961A9007DD00A524F0 /* CocoaSplit.sdef */; }; @@ -379,6 +382,13 @@ remoteGlobalIDString = 343C79BA1D0C763A00B36EEC; remoteInfo = CSFFMpegCapturePlugin; }; + 3473D27D1D4C349700842EEE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3473D2791D4C349700842EEE /* CSVaughnliveStreamServicePlugin.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 34BD1E121B1B970C0015CBEC; + remoteInfo = CSVaughnliveStreamServicePlugin; + }; 34A7C1A019B9A41A00BC6882 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 34A7C19C19B9A41900BC6882 /* CSLayoutSwitcherExtraPlugin.xcodeproj */; @@ -572,6 +582,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( + 3473D2871D4C359700842EEE /* CSVaughnliveStreamServicePlugin.bundle in Copy Files */, 340C802D1D450A5100B2FD7D /* CSYoutubeStreamServicePlugin.bundle in Copy Files */, 343C79ED1D0C796E00B36EEC /* CSFFMpegCapturePlugin.bundle in Copy Files */, 343692501B6243D4007EC2D9 /* CSShapeCapturePlugin.bundle in Copy Files */, @@ -742,6 +753,10 @@ 346EAAF6197A7B28000892CF /* Capture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Capture.h; sourceTree = ""; }; 347277FB1A5A2758008801A9 /* CSIOSurfaceLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSIOSurfaceLayer.h; path = PluginHeaders/CSIOSurfaceLayer.h; sourceTree = ""; }; 347277FC1A5A2758008801A9 /* CSIOSurfaceLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSIOSurfaceLayer.m; sourceTree = ""; }; + 3473D2791D4C349700842EEE /* CSVaughnliveStreamServicePlugin.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CSVaughnliveStreamServicePlugin.xcodeproj; path = StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj; sourceTree = ""; }; + 3473D2971D4C3D0E00842EEE /* CSAddOutputPopupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAddOutputPopupViewController.h; path = Interface/CSAddOutputPopupViewController.h; sourceTree = ""; }; + 3473D2981D4C3D0E00842EEE /* CSAddOutputPopupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSAddOutputPopupViewController.m; path = Interface/CSAddOutputPopupViewController.m; sourceTree = ""; }; + 3473D2991D4C3D0E00842EEE /* CSAddOutputPopupViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CSAddOutputPopupViewController.xib; path = Interface/CSAddOutputPopupViewController.xib; sourceTree = ""; }; 34792AF516104AA70065A859 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 34792AFA1611A6B90065A859 /* IOSurface.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOSurface.framework; path = System/Library/Frameworks/IOSurface.framework; sourceTree = SDKROOT; }; 3479A9961A9007DD00A524F0 /* CocoaSplit.sdef */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CocoaSplit.sdef; sourceTree = ""; }; @@ -1409,6 +1424,9 @@ 34F04D9E1CE0381D0054663A /* CSAddInputViewController.xib */, 34F04DA61CE0BA470054663A /* CSScrollView.h */, 34F04DA71CE0BA470054663A /* CSScrollView.m */, + 3473D2971D4C3D0E00842EEE /* CSAddOutputPopupViewController.h */, + 3473D2981D4C3D0E00842EEE /* CSAddOutputPopupViewController.m */, + 3473D2991D4C3D0E00842EEE /* CSAddOutputPopupViewController.xib */, ); name = Interface; sourceTree = ""; @@ -1495,6 +1513,14 @@ path = AnimationSamples; sourceTree = ""; }; + 3473D27A1D4C349700842EEE /* Products */ = { + isa = PBXGroup; + children = ( + 3473D27E1D4C349700842EEE /* CSVaughnliveStreamServicePlugin.bundle */, + ); + name = Products; + sourceTree = ""; + }; 349461581AB420E600F28883 /* CSAnimationRunner */ = { isa = PBXGroup; children = ( @@ -1665,6 +1691,7 @@ 34AFC2E619B08C1E0007C07B /* StreamServicePlugins */ = { isa = PBXGroup; children = ( + 3473D2791D4C349700842EEE /* CSVaughnliveStreamServicePlugin.xcodeproj */, 340C80101D44722000B2FD7D /* CSYoutubeStreamServicePlugin.xcodeproj */, 34C67B731A2D7B690012DC1B /* CSHitboxStreamServicePlugin.xcodeproj */, 34AFC31319B0A5800007C07B /* CSTwitchStreamServicePlugin.xcodeproj */, @@ -2040,6 +2067,10 @@ ProductGroup = 34AFC32719B0AD360007C07B /* Products */; ProjectRef = 34AFC31319B0A5800007C07B /* CSTwitchStreamServicePlugin.xcodeproj */; }, + { + ProductGroup = 3473D27A1D4C349700842EEE /* Products */; + ProjectRef = 3473D2791D4C349700842EEE /* CSVaughnliveStreamServicePlugin.xcodeproj */; + }, { ProductGroup = 34AFC25519B05B470007C07B /* Products */; ProjectRef = 34576C9819AFE6F7007BAD90 /* CSWindowCapturePlugin.xcodeproj */; @@ -2084,6 +2115,13 @@ remoteRef = 343C79CB1D0C763A00B36EEC /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 3473D27E1D4C349700842EEE /* CSVaughnliveStreamServicePlugin.bundle */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CSVaughnliveStreamServicePlugin.bundle; + remoteRef = 3473D27D1D4C349700842EEE /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 34A7C1A119B9A41A00BC6882 /* CSLayoutSwitcherExtraPlugin.bundle */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; @@ -2247,6 +2285,7 @@ 3415CED31AE257DA002F11F5 /* CSTextCaptureBaseView.xib in Resources */, 342B33B3198073EC00492CB7 /* line.fgsh in Resources */, 344825D21B2536EA00AF9EAC /* CAMultiAudioMatrixView.xib in Resources */, + 3473D29B1D4C3D0E00842EEE /* CSAddOutputPopupViewController.xib in Resources */, 349461761AC49BB300F28883 /* CSAnimationChooserViewController.xib in Resources */, 349461451AAD73BC00F28883 /* TestView.xib in Resources */, 34F04DA01CE0381D0054663A /* CSAddInputViewController.xib in Resources */, @@ -2351,6 +2390,7 @@ 34ED8C9B1B07371C002C0674 /* MIKMIDIPrivateUtilities.m in Sources */, 345F8B391A15D850009A81E3 /* CAMultiAudioDefaultOutput.m in Sources */, 34ED8CA51B07371C002C0674 /* MIKMIDISystemExclusiveCommand.m in Sources */, + 3473D29A1D4C3D0E00842EEE /* CSAddOutputPopupViewController.m in Sources */, 34ED8C5D1B07371C002C0674 /* MIKMIDIEndpoint.m in Sources */, 34ED8C5F1B07371C002C0674 /* MIKMIDIEndpointSynthesizer.m in Sources */, 34ED8CA11B07371C002C0674 /* MIKMIDISequencer.m in Sources */, diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index e0365e1c..a5b275a4 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -34,6 +34,8 @@ #import "CSNewOutputWindowController.h" #import "CompressionSettingsPanelController.h" #import "AppleProResCompressor.h" +#import "CSAddOutputPopupViewController.h" + @class FFMpegTask; @protocol VideoCompressor; @@ -106,11 +108,15 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , NSPopover *_addInputpopOver; + NSPopover *_addOutputpopOver; + NSPopover *_layoutpopOver; NSPopover *_animatepopOver; NSMutableArray *_screensCache; NSMutableArray *_layoutWindows; + NSMutableArray *_outputWindows; + bool _needsIRReset; NSMutableArray *_audioBuffer; @@ -404,7 +410,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(void) resetInputTableHighlights; -- (IBAction)outputSegmentedAction:(NSSegmentedControl *)sender; +- (IBAction)outputSegmentedAction:(NSButton *)sender; @end diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 9929e61c..03c1fb56 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -99,6 +99,32 @@ } +-(void)openAddOutputPopover:(id)sender sourceRect:(NSRect)sourceRect +{ + CSAddOutputPopupViewController *vc; + if (!_addOutputpopOver) + { + _addOutputpopOver = [[NSPopover alloc] init]; + _addOutputpopOver.animates = YES; + _addOutputpopOver.behavior = NSPopoverBehaviorTransient; + } + + //if (!_addInputpopOver.contentViewController) + { + vc = [[CSAddOutputPopupViewController alloc] init]; + vc.addOutput = ^void(Class outputClass) { + [self outputPopupButtonAction:outputClass]; + }; + + _addOutputpopOver.contentViewController = vc; + vc.popover = _addOutputpopOver; + //_addInputpopOver.delegate = vc; + } + + [_addOutputpopOver showRelativeToRect:sourceRect ofView:sender preferredEdge:NSMaxXEdge]; +} + + -(void)openAddInputPopover:(id)sender sourceRect:(NSRect)sourceRect { CSAddInputViewController *vc; @@ -408,6 +434,18 @@ self.advancedPrefPanel = nil; } + +-(void)outputPopupButtonAction:(Class)outputClass +{ + + OutputDestination *newDest = [[OutputDestination alloc] initWithType:[outputClass label]]; + id serviceObj = [[outputClass alloc] init]; + newDest.streamServiceObject = serviceObj; + + [self openOutputSheet:newDest]; +} + + -(void)openOutputSheet:(OutputDestination *)toEdit { self.addOutputWindowController = [[CSNewOutputWindowController alloc] init]; @@ -424,9 +462,15 @@ if (newDest) { newDest.settingsController = self; + + NSInteger idx = NSNotFound; + if (toEdit) { - NSInteger idx = [self.captureDestinations indexOfObject:toEdit]; + idx = [self.captureDestinations indexOfObject:toEdit]; + } + if (idx != NSNotFound) + { [self replaceObjectInCaptureDestinationsAtIndex:idx withObject:newDest]; } else { [self insertObject:newDest inCaptureDestinationsAtIndex:self.captureDestinations.count]; @@ -2302,14 +2346,14 @@ } } -- (IBAction)outputSegmentedAction:(NSSegmentedControl *)sender +- (IBAction)outputSegmentedAction:(NSButton *)sender { - NSUInteger clicked = sender.selectedSegment; + NSUInteger clicked = sender.tag; switch (clicked) { case 0: - [self openCreateSheet:sender]; + [self openAddOutputPopover:sender sourceRect:sender.bounds]; break; case 1: [self removeDestination:sender]; diff --git a/CocoaSplit/Interface/CSAddInputViewController.xib b/CocoaSplit/Interface/CSAddInputViewController.xib index 9a7d4a64..73b3c874 100644 --- a/CocoaSplit/Interface/CSAddInputViewController.xib +++ b/CocoaSplit/Interface/CSAddInputViewController.xib @@ -1,5 +1,5 @@ - + @@ -128,7 +128,7 @@ - + diff --git a/CocoaSplit/Interface/CSAddOutputPopupViewController.h b/CocoaSplit/Interface/CSAddOutputPopupViewController.h new file mode 100644 index 00000000..ea0d660d --- /dev/null +++ b/CocoaSplit/Interface/CSAddOutputPopupViewController.h @@ -0,0 +1,26 @@ +// +// CSAddOutputPopupViewController.h +// CocoaSplit +// +// Created by Zakk on 7/29/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import "CSPluginLoader.h" + + +@interface CSAddOutputPopupViewController : NSViewController +{ + NSArray *_outputTypes; + +} +@property (weak) IBOutlet NSTableView *outputTypesTableView; +@property (readonly) NSArray *outputTypes; +@property (weak) NSPopover *popover; +@property (nonatomic,copy) void (^addOutput)(Class outputClass); + + +- (IBAction)inputTableButtonClicked:(id)sender; + +@end diff --git a/CocoaSplit/Interface/CSAddOutputPopupViewController.m b/CocoaSplit/Interface/CSAddOutputPopupViewController.m new file mode 100644 index 00000000..03b0f370 --- /dev/null +++ b/CocoaSplit/Interface/CSAddOutputPopupViewController.m @@ -0,0 +1,117 @@ +// +// CSAddOutputPopupViewController.m +// CocoaSplit +// +// Created by Zakk on 7/29/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSAddOutputPopupViewController.h" +#import "CSStreamServiceProtocol.h" +#import "NSView+NSLayoutConstraintFilter.h" + + + +@interface CSAddOutputPopupViewController () + +@end + +@implementation CSAddOutputPopupViewController + + +-(instancetype)init +{ + return [self initWithNibName:@"CSAddOutputPopupViewController" bundle:nil]; +} + + +- (void)viewDidLoad { + [super viewDidLoad]; + [self adjustTableHeight:self.outputTypesTableView]; + // Do view setup here. +} + + + +/* +-(void)switchToInitialView +{ + + NSRect lRect = [self.outputTypesTableView rectOfRow:self.outputTypesTableView.numberOfRows - 1]; + + + NSRect vRect = self.outputTypesTableView.frame; + NSSize newSize = NSMakeSize(vRect.size.width, lRect.origin.y+lRect.size.height+2); + + vRect.size = newSize; + vRect.origin.y = self.view.frame.size.height/2 - newSize.height/2; + [self.outputTypesTableView setFrame:vRect]; + [self.view.animator addSubview:self.initialView]; + self.popover.contentSize = newSize; + [self.initialView setFrameOrigin:NSMakePoint(0,0)]; + + +} +*/ + + +-(void)adjustTableHeight:(NSTableView *)table +{ + + + NSSize vSize = self.view.frame.size; + + vSize.height = table.numberOfRows * table.rowHeight + 3; + self.preferredContentSize = vSize; + + +} + + +-(BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row +{ + return NO; +} + + +- (IBAction)inputTableButtonClicked:(id)sender +{ + + Class clickedOutputclass; + clickedOutputclass = [_outputTypes objectAtIndex:[self.outputTypesTableView rowForView:sender]]; + if (clickedOutputclass && self.addOutput) + { + self.addOutput(clickedOutputclass); + } + +} + + +-(NSArray *)outputTypes +{ + + if (_outputTypes) + { + return _outputTypes; + } + + + NSMutableDictionary *pluginMap = [[CSPluginLoader sharedPluginLoader] streamServicePlugins]; + + NSArray *sortedKeys = [pluginMap.allKeys sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; + + + + NSMutableArray *ret = [[NSMutableArray alloc] init]; + for (NSString *key in sortedKeys) + { + Class streamClass = pluginMap[key]; + [ret addObject:streamClass]; + } + + _outputTypes = ret; + return ret; +} + + +@end diff --git a/CocoaSplit/Interface/CSAddOutputPopupViewController.xib b/CocoaSplit/Interface/CSAddOutputPopupViewController.xib new file mode 100644 index 00000000..88d9cad7 --- /dev/null +++ b/CocoaSplit/Interface/CSAddOutputPopupViewController.xib @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CSInputLibraryItemView.xib b/CocoaSplit/Interface/CSInputLibraryItemView.xib index 7250345e..37c3ca41 100644 --- a/CocoaSplit/Interface/CSInputLibraryItemView.xib +++ b/CocoaSplit/Interface/CSInputLibraryItemView.xib @@ -1,5 +1,5 @@ - + diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.xib b/CocoaSplit/Interface/CSNewOutputWindowController.xib index d51ef4b8..95761957 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.xib +++ b/CocoaSplit/Interface/CSNewOutputWindowController.xib @@ -1,5 +1,5 @@ - + @@ -23,33 +23,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -70,7 +43,7 @@ - + @@ -84,7 +57,7 @@ - + @@ -92,7 +65,7 @@ - + @@ -100,7 +73,7 @@ - + @@ -119,7 +92,7 @@ - + @@ -130,7 +103,7 @@ - + @@ -148,7 +121,7 @@ - + @@ -171,6 +144,17 @@ Gw + + + + + + + + + + + diff --git a/CocoaSplit/Interface/LogWindow.xib b/CocoaSplit/Interface/LogWindow.xib index 99b03d0a..e4c9cce2 100644 --- a/CocoaSplit/Interface/LogWindow.xib +++ b/CocoaSplit/Interface/LogWindow.xib @@ -1,5 +1,5 @@ - + @@ -20,7 +20,7 @@ - + diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 506f6d24..99493888 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1,8 +1,10 @@ - + + + @@ -405,8 +407,11 @@ - + + + + @@ -416,7 +421,7 @@ - + @@ -424,8 +429,11 @@ - - + @@ -471,7 +479,7 @@ - + @@ -494,7 +502,7 @@ - + @@ -502,21 +510,24 @@ - + + + + - - + + - + @@ -531,7 +542,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -600,7 +639,7 @@ - - - - - + + + - - - - - - + + + + + + + + + + + + + @@ -1532,7 +1610,7 @@ - + @@ -1593,10 +1671,10 @@ - + - + @@ -1643,7 +1721,7 @@ - + @@ -1686,15 +1764,13 @@ - + - - diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib index 721bf1b9..75ca7967 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamServiceViewController.xib @@ -115,8 +115,8 @@ - + diff --git a/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/project.pbxproj b/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/project.pbxproj index cc52e9e5..c779ffe7 100644 --- a/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/project.pbxproj +++ b/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/project.pbxproj @@ -6,7 +6,32 @@ objectVersion = 46; objects = { +/* Begin PBXBuildFile section */ + 3473D2841D4C34B500842EEE /* CSVaughnliveStreamService.m in Sources */ = {isa = PBXBuildFile; fileRef = 3473D2801D4C34B500842EEE /* CSVaughnliveStreamService.m */; }; + 3473D2851D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3473D2821D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.m */; }; + 3473D2861D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3473D2831D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.xib */; }; +/* End PBXBuildFile section */ + /* Begin PBXFileReference section */ + 3473D27F1D4C34B500842EEE /* CSVaughnliveStreamService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSVaughnliveStreamService.h; sourceTree = ""; }; + 3473D2801D4C34B500842EEE /* CSVaughnliveStreamService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSVaughnliveStreamService.m; sourceTree = ""; }; + 3473D2811D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSVaughnliveStreamServiceViewController.h; sourceTree = ""; }; + 3473D2821D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSVaughnliveStreamServiceViewController.m; sourceTree = ""; }; + 3473D2831D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CSVaughnliveStreamServiceViewController.xib; sourceTree = ""; }; + 3473D2881D4C35B900842EEE /* CSPluginServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginServices.h; path = PluginHeaders/CSPluginServices.h; sourceTree = ""; }; + 3473D2891D4C35B900842EEE /* CSIOSurfaceLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSIOSurfaceLayer.h; path = PluginHeaders/CSIOSurfaceLayer.h; sourceTree = ""; }; + 3473D28A1D4C35B900842EEE /* CSPcmPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPcmPlayer.h; path = PluginHeaders/CSPcmPlayer.h; sourceTree = ""; }; + 3473D28B1D4C35B900842EEE /* CAMultiAudioPCM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CAMultiAudioPCM.h; path = PluginHeaders/CAMultiAudioPCM.h; sourceTree = ""; }; + 3473D28C1D4C35B900842EEE /* CSAbstractCaptureDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSAbstractCaptureDevice.h; path = PluginHeaders/CSAbstractCaptureDevice.h; sourceTree = ""; }; + 3473D28D1D4C35B900842EEE /* CSTextCaptureBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSTextCaptureBase.h; path = PluginHeaders/CSTextCaptureBase.h; sourceTree = ""; }; + 3473D28E1D4C35B900842EEE /* CSTextCaptureViewControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSTextCaptureViewControllerBase.h; path = PluginHeaders/CSTextCaptureViewControllerBase.h; sourceTree = ""; }; + 3473D28F1D4C35B900842EEE /* CSCaptureBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureBase.h; path = PluginHeaders/CSCaptureBase.h; sourceTree = ""; }; + 3473D2901D4C35B900842EEE /* CSCaptureSourceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSCaptureSourceProtocol.h; path = PluginHeaders/CSCaptureSourceProtocol.h; sourceTree = ""; }; + 3473D2911D4C35B900842EEE /* CSStreamServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSStreamServiceProtocol.h; path = PluginHeaders/CSStreamServiceProtocol.h; sourceTree = ""; }; + 3473D2921D4C35B900842EEE /* CSPluginFactoryProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSPluginFactoryProtocol.h; path = PluginHeaders/CSPluginFactoryProtocol.h; sourceTree = ""; }; + 3473D2931D4C35B900842EEE /* CSExtraPluginProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSExtraPluginProtocol.h; path = PluginHeaders/CSExtraPluginProtocol.h; sourceTree = ""; }; + 3473D2941D4C35B900842EEE /* CSOauth2Authenticator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSOauth2Authenticator.h; path = PluginHeaders/CSOauth2Authenticator.h; sourceTree = ""; }; + 3473D2951D4C35B900842EEE /* CSNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSNotifications.h; path = PluginHeaders/CSNotifications.h; sourceTree = ""; }; 34BD1E121B1B970C0015CBEC /* CSVaughnliveStreamServicePlugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CSVaughnliveStreamServicePlugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 34BD1E161B1B970C0015CBEC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -22,6 +47,28 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 3473D2961D4C35B900842EEE /* PluginHeaders */ = { + isa = PBXGroup; + children = ( + 3473D2881D4C35B900842EEE /* CSPluginServices.h */, + 3473D2891D4C35B900842EEE /* CSIOSurfaceLayer.h */, + 3473D28A1D4C35B900842EEE /* CSPcmPlayer.h */, + 3473D28B1D4C35B900842EEE /* CAMultiAudioPCM.h */, + 3473D28C1D4C35B900842EEE /* CSAbstractCaptureDevice.h */, + 3473D28D1D4C35B900842EEE /* CSTextCaptureBase.h */, + 3473D28E1D4C35B900842EEE /* CSTextCaptureViewControllerBase.h */, + 3473D28F1D4C35B900842EEE /* CSCaptureBase.h */, + 3473D2901D4C35B900842EEE /* CSCaptureSourceProtocol.h */, + 3473D2911D4C35B900842EEE /* CSStreamServiceProtocol.h */, + 3473D2921D4C35B900842EEE /* CSPluginFactoryProtocol.h */, + 3473D2931D4C35B900842EEE /* CSExtraPluginProtocol.h */, + 3473D2941D4C35B900842EEE /* CSOauth2Authenticator.h */, + 3473D2951D4C35B900842EEE /* CSNotifications.h */, + ); + name = PluginHeaders; + path = ../../../CocoaSplit; + sourceTree = ""; + }; 34BD1E091B1B970C0015CBEC = { isa = PBXGroup; children = ( @@ -41,6 +88,12 @@ 34BD1E141B1B970C0015CBEC /* CSVaughnliveStreamServicePlugin */ = { isa = PBXGroup; children = ( + 3473D2961D4C35B900842EEE /* PluginHeaders */, + 3473D27F1D4C34B500842EEE /* CSVaughnliveStreamService.h */, + 3473D2801D4C34B500842EEE /* CSVaughnliveStreamService.m */, + 3473D2811D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.h */, + 3473D2821D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.m */, + 3473D2831D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.xib */, 34BD1E151B1B970C0015CBEC /* Supporting Files */, ); path = CSVaughnliveStreamServicePlugin; @@ -110,6 +163,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3473D2861D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -120,6 +174,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3473D2841D4C34B500842EEE /* CSVaughnliveStreamService.m in Sources */, + 3473D2851D4C34B500842EEE /* CSVaughnliveStreamServiceViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -246,6 +302,7 @@ 34BD1E1B1B1B970C0015CBEC /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSVaughnliveStreamServicePlugin.xcscheme b/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSVaughnliveStreamServicePlugin.xcscheme new file mode 100644 index 00000000..b508c0b3 --- /dev/null +++ b/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/CSVaughnliveStreamServicePlugin.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/xcschememanagement.plist b/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..d734ede8 --- /dev/null +++ b/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin.xcodeproj/xcuserdata/zakk.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + CSVaughnliveStreamServicePlugin.xcscheme + + orderHint + 26 + + + SuppressBuildableAutocreation + + 34BD1E111B1B970C0015CBEC + + primary + + + + + diff --git a/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServiceViewController.xib b/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServiceViewController.xib index 9a22ce36..dddc3b70 100644 --- a/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServiceViewController.xib +++ b/StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServiceViewController.xib @@ -1,7 +1,7 @@ - + - + From 642f228c34c380548aabd8a52c542077210ab4b5 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 30 Jul 2016 23:55:49 -0400 Subject: [PATCH 121/156] Output configuration and creation is now a window, not a modal dialog --- CocoaSplit/CaptureController.m | 33 +++++++++++++++---- .../Interface/CSNewOutputWindowController.h | 4 +++ .../Interface/CSNewOutputWindowController.m | 29 ++++++++++++++-- CocoaSplit/en.lproj/MainMenu.xib | 23 +++---------- 4 files changed, 61 insertions(+), 28 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 03c1fb56..9fa8421a 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -448,17 +448,30 @@ -(void)openOutputSheet:(OutputDestination *)toEdit { - self.addOutputWindowController = [[CSNewOutputWindowController alloc] init]; - self.addOutputWindowController.compressors = self.compressors; + + CSNewOutputWindowController *newController = nil; + + if (!_outputWindows) + { + _outputWindows = [[NSMutableArray alloc] init]; + } + + + + newController = [[CSNewOutputWindowController alloc] init]; + newController.compressors = self.compressors; if (toEdit) { - self.addOutputWindowController.outputDestination = toEdit; + newController.outputDestination = toEdit; } - [self.mainWindow beginSheet:self.addOutputWindowController.window completionHandler:^(NSModalResponse returnCode) { + + + newController.windowDone = ^void(NSModalResponse returnCode, CSNewOutputWindowController *window) { + if (returnCode == NSModalResponseOK) { - - OutputDestination *newDest = self.addOutputWindowController.outputDestination; + + OutputDestination *newDest = window.outputDestination; if (newDest) { newDest.settingsController = self; @@ -477,10 +490,16 @@ } } } - }]; + [_outputWindows removeObject:window]; + [window close]; + }; + [_outputWindows addObject:newController]; + [newController showWindow:nil]; } + + -(IBAction)openCreateSheet:(id)sender { [self openOutputSheet:nil]; diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.h b/CocoaSplit/Interface/CSNewOutputWindowController.h index a603a1a5..82bc212b 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.h +++ b/CocoaSplit/Interface/CSNewOutputWindowController.h @@ -31,4 +31,8 @@ @property (strong) CompressionSettingsPanelController *compressionPanelController; @property (strong) NSString *buttonLabel; +@property (nonatomic, copy) void (^windowDone)(NSModalResponse response, CSNewOutputWindowController *windowController); + + + @end diff --git a/CocoaSplit/Interface/CSNewOutputWindowController.m b/CocoaSplit/Interface/CSNewOutputWindowController.m index 5fae7e76..788a081f 100644 --- a/CocoaSplit/Interface/CSNewOutputWindowController.m +++ b/CocoaSplit/Interface/CSNewOutputWindowController.m @@ -36,13 +36,31 @@ { _outputDestination = outputDestination; self.buttonLabel = @"Save"; + + NSString *windowTitlePart = nil; + + if (outputDestination.name) + { + windowTitlePart = outputDestination.name; + } + if (outputDestination.streamServiceObject) { self.streamServiceObject = outputDestination.streamServiceObject; Class serviceClass = self.streamServiceObject.class; self.selectedOutputType = [serviceClass label]; + if (!windowTitlePart) + { + windowTitlePart = [self.streamServiceObject.class label]; + } } + if (windowTitlePart) + { + self.window.title = [NSString stringWithFormat:@"Output Configuration - %@", windowTitlePart]; + } + + if (self.outputDestination.compressor_name) { id oCompressor = self.compressors[self.outputDestination.compressor_name]; @@ -144,7 +162,10 @@ [self.outputObjectController discardEditing]; [self.pluginViewController discardEditing]; - [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseCancel]; + if (self.windowDone) + { + self.windowDone(NSModalResponseCancel, self); + } } - (IBAction)addButtonAction:(id)sender @@ -152,9 +173,13 @@ [self.outputObjectController commitEditing]; [self.pluginViewController commitEditing]; self.outputDestination.streamServiceObject = self.streamServiceObject; - [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseOK]; + if (self.windowDone) + { + self.windowDone(NSModalResponseOK, self); + } } + - (IBAction)openCompressorEdit:(id)sender { diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 99493888..faba78ef 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1342,21 +1342,8 @@ - - + - + - - - From 386a25a9fe9ecc89483aaec5107c1c560d02ec7b Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 31 Jul 2016 14:16:23 -0400 Subject: [PATCH 122/156] Add icons for stream service menu items --- .../CSAddOutputPopupViewController.xib | 9 ++++---- .../PluginHeaders/CSStreamServiceProtocol.h | 2 ++ CocoaSplit/en.lproj/MainMenu.xib | 6 ++--- .../CSFileStreamRTMPService.h | 2 ++ .../CSFileStreamRTMPService.m | 10 +++++++-- .../FileStreamService.h | 2 ++ .../FileStreamService.m | 6 +++++ .../project.pbxproj | 5 +++++ .../HitboxStreamService.h | 2 ++ .../HitboxStreamService.m | 6 +++++ .../Media.xcassets/Contents.json | 6 +++++ .../hitbox-icon-green.imageset/Contents.json | 21 ++++++++++++++++++ .../hitbox-icon-green.png | Bin 0 -> 30207 bytes .../project.pbxproj | 4 ++++ .../Media.xcassets/Contents.json | 6 +++++ .../Contents.json | 21 ++++++++++++++++++ .../GlitchIcon_PurpleonWhite.png | Bin 0 -> 3324 bytes .../TwitchStreamService.h | 1 + .../TwitchStreamService.m | 13 +++++++++-- .../project.pbxproj | 4 ++++ .../CSVaughnliveStreamService.h | 2 ++ .../CSVaughnliveStreamService.m | 4 ++++ .../Media.xcassets/Contents.json | 6 +++++ .../vaughnlive_icon.imageset/Contents.json | 21 ++++++++++++++++++ .../vaughnlive_icon.png | Bin 0 -> 753394 bytes .../project.pbxproj | 5 +++++ .../CSYoutubeStreamService.h | 2 ++ .../CSYoutubeStreamService.m | 8 +++++++ .../Media.xcassets/Contents.json | 6 +++++ .../Contents.json | 21 ++++++++++++++++++ .../YouTube-icon-full_color.png | Bin 0 -> 13530 bytes 31 files changed, 190 insertions(+), 11 deletions(-) create mode 100644 StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/Media.xcassets/Contents.json create mode 100644 StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/Media.xcassets/hitbox-icon-green.imageset/Contents.json create mode 100644 StreamServicePlugins/CSHitboxStreamServicePlugin/CSHitboxStreamServicePlugin/Media.xcassets/hitbox-icon-green.imageset/hitbox-icon-green.png create mode 100644 StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin/Media.xcassets/Contents.json create mode 100644 StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin/Media.xcassets/GlitchIcon_PurpleonWhite.imageset/Contents.json create mode 100644 StreamServicePlugins/CSTwitchStreamServicePlugin/CSTwitchStreamServicePlugin/Media.xcassets/GlitchIcon_PurpleonWhite.imageset/GlitchIcon_PurpleonWhite.png create mode 100644 StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin/Media.xcassets/Contents.json create mode 100644 StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin/Media.xcassets/vaughnlive_icon.imageset/Contents.json create mode 100644 StreamServicePlugins/CSVaughnliveStreamServicePlugin/CSVaughnliveStreamServicePlugin/Media.xcassets/vaughnlive_icon.imageset/vaughnlive_icon.png create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/Media.xcassets/Contents.json create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/Media.xcassets/YouTube-icon-full_color.imageset/Contents.json create mode 100644 StreamServicePlugins/CSYoutubeStreamServicePlugin/CSYoutubeStreamServicePlugin/Media.xcassets/YouTube-icon-full_color.imageset/YouTube-icon-full_color.png diff --git a/CocoaSplit/Interface/CSAddOutputPopupViewController.xib b/CocoaSplit/Interface/CSAddOutputPopupViewController.xib index 88d9cad7..e0634b7d 100644 --- a/CocoaSplit/Interface/CSAddOutputPopupViewController.xib +++ b/CocoaSplit/Interface/CSAddOutputPopupViewController.xib @@ -48,14 +48,15 @@ diff --git a/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h b/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h index 0e822c4a..bd1d02a6 100644 --- a/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h +++ b/CocoaSplit/PluginHeaders/CSStreamServiceProtocol.h @@ -18,6 +18,8 @@ -(NSString *)getServiceFormat; +(NSString *)label; +(NSString *)serviceDescription; ++(NSImage *)serviceImage; + -(void)prepareForStreamStart; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index faba78ef..81686283 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1591,11 +1591,11 @@ - + - + @@ -1627,7 +1627,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +YnBsaXN0MDDUAQIDBAUGJCVYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKkHCBES +EwsKGR9VJG51bGzUCQoLDA0ODxBWJGNsYXNzVHR5cGVXc3VidHlwZV8QEl9fQ0FDb2RpbmdDb250ZW50 +c4AIgAOAAoAEWWZyb21SaWdodFRwdXNo0hQJFRhaTlMub2JqZWN0c6IWF4AFgAaAB9IaGxwdWiRjbGFz +c25hbWVYJGNsYXNzZXNXTlNBcnJheaIcHlhOU09iamVjdNIaGyAhXENBVHJhbnNpdGlvbqMiIx5cQ0FU +cmFuc2l0aW9uW0NBQW5pbWF0aW9uXxAPTlNLZXllZEFyY2hpdmVy0SYnVHJvb3SAAQAIABEAGgAjAC0A +MgA3AEEARwBQAFcAXABkAHkAewB9AH8AgQCLAJAAlQCgAKMApQCnAKkArgC5AMIAygDNANYA2wDoAOwA ++QEFARcBGgEfAAAAAAAAAgEAAAAAAAAAKAAAAAAAAAAAAAAAAAAAASE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CocoaSplit/Interface/CSAudioLevelView.h b/CocoaSplit/Interface/CSAudioLevelView.h new file mode 100644 index 00000000..bb269409 --- /dev/null +++ b/CocoaSplit/Interface/CSAudioLevelView.h @@ -0,0 +1,23 @@ +// +// CSAudioLevelView.h +// CocoaSplit +// +// Created by Zakk on 8/6/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import +#import + +@interface CSAudioLevelView : NSView +{ + bool _isVertical; + CALayer *_maskLayer; +} + + +@property (assign) float level; +@property (assign) IBInspectable float startValue; +@property (assign) IBInspectable float endValue; + +@end diff --git a/CocoaSplit/Interface/CSAudioLevelView.m b/CocoaSplit/Interface/CSAudioLevelView.m new file mode 100644 index 00000000..bfaacf1f --- /dev/null +++ b/CocoaSplit/Interface/CSAudioLevelView.m @@ -0,0 +1,109 @@ +// +// CSAudioLevelView.m +// CocoaSplit +// +// Created by Zakk on 8/6/16. +// Copyright © 2016 Zakk. All rights reserved. +// + +#import "CSAudioLevelView.h" + +@implementation CSAudioLevelView +@synthesize level = _level; + +- (void)drawRect:(NSRect)dirtyRect { + [super drawRect:dirtyRect]; + + // Drawing code here. +} + + + +-(float)level +{ + return _level; +} + +-(void)setLevel:(float)level +{ + + float myRange = self.endValue - self.startValue; + CALayer *mLayer = _maskLayer; + + + + CGRect cFrame = self.frame; + CGRect nFrame = CGRectMake(0,0,cFrame.size.width, cFrame.size.height); + if (_isVertical) + { + nFrame.size.height = (level/myRange) * cFrame.size.height; + } else { + nFrame.size.width = (level/myRange) * cFrame.size.width; + } + + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + [mLayer setFrame:nFrame]; + [CATransaction commit]; +} + + +-(instancetype)initWithFrame:(NSRect)frameRect +{ + if (self = [super initWithFrame:frameRect]) + { + _isVertical = NO; + + if (frameRect.size.height > frameRect.size.width) + { + _isVertical = YES; + } + + CALayer *outerLayer = [CALayer layer]; + //outerLayer.borderWidth = 0.5f; + outerLayer.backgroundColor = [NSColor disabledControlTextColor].CGColor; + + CAGradientLayer *gLayer = [CAGradientLayer layer]; + NSArray *colors = [NSArray arrayWithObjects:(__bridge id)([NSColor greenColor].CGColor), (__bridge id)[NSColor yellowColor].CGColor, (__bridge id)[NSColor yellowColor].CGColor, (__bridge id)[NSColor redColor].CGColor, nil]; + gLayer.colors = colors; + + if (_isVertical) + { + gLayer.startPoint = CGPointMake(0.5, 0.0); + gLayer.endPoint = CGPointMake(0.5, 1.0); + + } else { + + gLayer.startPoint = CGPointMake(0.0, 0.5); + gLayer.endPoint = CGPointMake(1.0, 0.5); + } + + self.layer = outerLayer; + self.wantsLayer = YES; + + [outerLayer addSublayer:gLayer]; + + gLayer.frame = CGRectMake(0.0, 0.0, frameRect.size.width, frameRect.size.height); + _maskLayer = [CALayer layer]; + + + _maskLayer.backgroundColor = [NSColor blackColor].CGColor; + + + CGRect maskFrame = CGRectMake(0.0, 0.0, frameRect.size.width, frameRect.size.height); + if (_isVertical) + { + maskFrame.size.height = 0.0; + } else { + maskFrame.size.width = 0.0; + } + _maskLayer.frame = maskFrame; + gLayer.mask = _maskLayer; + + } + return self; +} + + + +@end diff --git a/CocoaSplit/Interface/CSLayoutCollectionItem.xib b/CocoaSplit/Interface/CSLayoutCollectionItem.xib index 2ceb014c..6be05886 100644 --- a/CocoaSplit/Interface/CSLayoutCollectionItem.xib +++ b/CocoaSplit/Interface/CSLayoutCollectionItem.xib @@ -1,5 +1,5 @@ - + @@ -19,7 +19,7 @@ - + @@ -480,7 +480,7 @@ - + @@ -503,7 +503,7 @@ - + @@ -511,7 +511,7 @@ - + @@ -522,13 +522,13 @@ - + - + @@ -543,7 +543,7 @@ + + + + + + + - + - + + + + + + + + - + + + + + @@ -1595,7 +1661,7 @@ - + @@ -1666,7 +1732,7 @@ - + @@ -1977,8 +2043,10 @@ MgA3AEEARwBQAFcAXABkAHkAewB9AH8AgQCLAJAAlQCgAKMApQCnAKkArgC5AMIAygDNANYA2wDoAOwA + + From 2610314e963fcff161cbad641b9eeecd980bf13d Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 6 Aug 2016 22:10:45 -0400 Subject: [PATCH 126/156] Remove Audio tab --- CocoaSplit/en.lproj/MainMenu.xib | 273 ------------------------------- 1 file changed, 273 deletions(-) diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 0c0e8a73..e885a96a 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -901,279 +901,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 7e23487670a31c508c04a0b6aa5d7c629254babe Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 7 Aug 2016 00:06:51 -0400 Subject: [PATCH 127/156] Don't switch tab view when streaming starts --- CocoaSplit/CaptureController.m | 5 +---- CocoaSplit/en.lproj/MainMenu.xib | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 15f7dd75..41be6a75 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -2016,17 +2016,14 @@ - if ([self startStream] == YES) + if ([self startStream] != YES) { - self.selectedTabIndex = 2; - } else { [sender setNextState]; } } else { - self.selectedTabIndex = 0; [self stopStream]; } diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index e885a96a..ec34b39a 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1384,11 +1384,11 @@ - + - + @@ -1420,7 +1420,7 @@ - +
- NSNegateBoolean +
- + @@ -128,7 +99,7 @@ - + @@ -136,7 +107,7 @@ - + @@ -147,7 +118,7 @@ - + @@ -155,7 +126,7 @@ - + @@ -166,33 +137,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -219,45 +163,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + + - + - + + - - + + + + - + + + + + - - - + + + + - - + - + + @@ -277,90 +313,15 @@
- - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - -YnBsaXN0MDDUAQIDBAUGJCVYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKkHCBES -EwsKGR9VJG51bGzUCQoLDA0ODxBWJGNsYXNzVHR5cGVXc3VidHlwZV8QEl9fQ0FDb2RpbmdDb250ZW50 -c4AIgAOAAoAEWWZyb21SaWdodFRwdXNo0hQJFRhaTlMub2JqZWN0c6IWF4AFgAaAB9IaGxwdWiRjbGFz -c25hbWVYJGNsYXNzZXNXTlNBcnJheaIcHlhOU09iamVjdNIaGyAhXENBVHJhbnNpdGlvbqMiIx5cQ0FU -cmFuc2l0aW9uW0NBQW5pbWF0aW9uXxAPTlNLZXllZEFyY2hpdmVy0SYnVHJvb3SAAQAIABEAGgAjAC0A -MgA3AEEARwBQAFcAXABkAHkAewB9AH8AgQCLAJAAlQCgAKMApQCnAKkArgC5AMIAygDNANYA2wDoAOwA -+QEFARcBGgEfAAAAAAAAAgEAAAAAAAAAKAAAAAAAAAAAAAAAAAAAASE - - - - - - - - - - - - - - - - - - - - - - - - -
- + +
diff --git a/CocoaSplit/Interface/CSAudioLevelView.m b/CocoaSplit/Interface/CSAudioLevelView.m index bfaacf1f..315d65c6 100644 --- a/CocoaSplit/Interface/CSAudioLevelView.m +++ b/CocoaSplit/Interface/CSAudioLevelView.m @@ -41,69 +41,88 @@ nFrame.size.width = (level/myRange) * cFrame.size.width; } - [CATransaction begin]; + [CATransaction begin]; [CATransaction setDisableActions:YES]; [mLayer setFrame:nFrame]; [CATransaction commit]; } - +/* -(instancetype)initWithFrame:(NSRect)frameRect { if (self = [super initWithFrame:frameRect]) { - _isVertical = NO; - - if (frameRect.size.height > frameRect.size.width) - { - _isVertical = YES; - } - - CALayer *outerLayer = [CALayer layer]; - //outerLayer.borderWidth = 0.5f; - outerLayer.backgroundColor = [NSColor disabledControlTextColor].CGColor; - - CAGradientLayer *gLayer = [CAGradientLayer layer]; - NSArray *colors = [NSArray arrayWithObjects:(__bridge id)([NSColor greenColor].CGColor), (__bridge id)[NSColor yellowColor].CGColor, (__bridge id)[NSColor yellowColor].CGColor, (__bridge id)[NSColor redColor].CGColor, nil]; - gLayer.colors = colors; - - if (_isVertical) - { - gLayer.startPoint = CGPointMake(0.5, 0.0); - gLayer.endPoint = CGPointMake(0.5, 1.0); - - } else { - - gLayer.startPoint = CGPointMake(0.0, 0.5); - gLayer.endPoint = CGPointMake(1.0, 0.5); - } - - self.layer = outerLayer; - self.wantsLayer = YES; - - [outerLayer addSublayer:gLayer]; - - gLayer.frame = CGRectMake(0.0, 0.0, frameRect.size.width, frameRect.size.height); - _maskLayer = [CALayer layer]; - - - _maskLayer.backgroundColor = [NSColor blackColor].CGColor; - - - CGRect maskFrame = CGRectMake(0.0, 0.0, frameRect.size.width, frameRect.size.height); - if (_isVertical) - { - maskFrame.size.height = 0.0; - } else { - maskFrame.size.width = 0.0; - } - _maskLayer.frame = maskFrame; - gLayer.mask = _maskLayer; - + [self setupLayers]; } + return self; } + */ + +-(void)awakeFromNib +{ + [super awakeFromNib]; + [self setupLayers]; +} + +-(void)setupLayers +{ + if (_maskLayer) + { + return; + } + + _isVertical = NO; + + if (self.frame.size.height > self.frame.size.width) + { + _isVertical = YES; + } + + CALayer *outerLayer = [CALayer layer]; + //outerLayer.borderWidth = 0.5f; + outerLayer.backgroundColor = [NSColor disabledControlTextColor].CGColor; + + CAGradientLayer *gLayer = [CAGradientLayer layer]; + NSArray *colors = [NSArray arrayWithObjects:(__bridge id)([NSColor greenColor].CGColor), (__bridge id)[NSColor yellowColor].CGColor, (__bridge id)[NSColor yellowColor].CGColor, (__bridge id)[NSColor redColor].CGColor, nil]; + gLayer.colors = colors; + + if (_isVertical) + { + gLayer.startPoint = CGPointMake(0.5, 0.0); + gLayer.endPoint = CGPointMake(0.5, 1.0); + + } else { + + gLayer.startPoint = CGPointMake(0.0, 0.5); + gLayer.endPoint = CGPointMake(1.0, 0.5); + } + + self.layer = outerLayer; + self.wantsLayer = YES; + + [outerLayer addSublayer:gLayer]; + + gLayer.frame = CGRectMake(0.0, 0.0, self.frame.size.width, self.frame.size.height); + _maskLayer = [CALayer layer]; + + + _maskLayer.backgroundColor = [NSColor blackColor].CGColor; + + + CGRect maskFrame = CGRectMake(0.0, 0.0, self.frame.size.width, self.frame.size.height); + if (_isVertical) + { + maskFrame.size.height = 0.0; + } else { + maskFrame.size.width = 0.0; + } + _maskLayer.frame = maskFrame; + gLayer.mask = _maskLayer; + +} + @end diff --git a/CocoaSplit/Interface/InputPopupControllerViewController.xib b/CocoaSplit/Interface/InputPopupControllerViewController.xib index ce488715..e36b66a2 100644 --- a/CocoaSplit/Interface/InputPopupControllerViewController.xib +++ b/CocoaSplit/Interface/InputPopupControllerViewController.xib @@ -1,5 +1,5 @@ - + @@ -905,11 +905,11 @@ - + - + @@ -974,7 +974,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSIsNotNil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSIsNotNil + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -808,12 +964,13 @@ + + - + - @@ -825,13 +982,16 @@ - + + + + @@ -839,6 +999,7 @@ + From a7136782f73aadc23ab6a12532dfedaeef260302 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 13 Aug 2016 17:32:57 -0400 Subject: [PATCH 136/156] Disable stream! button unless there are active outputs configured --- CocoaSplit/CaptureController.h | 1 + CocoaSplit/CaptureController.m | 8 +++++--- CocoaSplit/en.lproj/MainMenu.xib | 7 ++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index dcabc1a7..6dfb9beb 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -216,6 +216,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (strong) NSString *transitionDirection; @property (strong) CIFilter *transitionFilter; @property (assign) bool transitionFullScene; +@property (assign) NSInteger active_output_count; @property (strong) NSWindow *transitionFilterWindow; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 19822148..fcc07793 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -882,8 +882,11 @@ - self.outputStatsString = [NSString stringWithFormat:@"Active Outputs: %d Errored %d", total_outputs, errored_outputs]; - self.renderStatsString = [NSString stringWithFormat:@"Render min/max/avg: %f/%f/%f", _min_render_time, _max_render_time, _render_time_total / _renderedFrames]; + dispatch_async(dispatch_get_main_queue(), ^{ + self.outputStatsString = [NSString stringWithFormat:@"Active Outputs: %d Errored %d", total_outputs, errored_outputs]; + self.renderStatsString = [NSString stringWithFormat:@"Render min/max/avg: %f/%f/%f", _min_render_time, _max_render_time, _render_time_total / _renderedFrames]; + self.active_output_count = total_outputs; + }); _renderedFrames = 0; _render_time_total = 0.0f; @@ -1831,7 +1834,6 @@ -(void) setTransitionName:(NSString *)transitionName { - NSLog(@"SETTING TRANSITION %@", transitionName); _transitionName = transitionName; if ([transitionName hasPrefix:@"CI"]) diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 56291977..e2941924 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -374,6 +374,7 @@ +
- - - - + + + + + + + + + + + + + + + + @@ -907,8 +920,8 @@ diff --git a/CocoaSplit/Interface/CSLibraryInputItemViewController.h b/CocoaSplit/Interface/CSLibraryInputItemViewController.h index 544f8e1b..aa800cad 100644 --- a/CocoaSplit/Interface/CSLibraryInputItemViewController.h +++ b/CocoaSplit/Interface/CSLibraryInputItemViewController.h @@ -13,4 +13,5 @@ @property (strong) CSInputLibraryItem *item; + @end diff --git a/CocoaSplit/PluginHeaders/CAMultiAudioPCM.h b/CocoaSplit/PluginHeaders/CAMultiAudioPCM.h index 15ce89f4..71c1b47e 100644 --- a/CocoaSplit/PluginHeaders/CAMultiAudioPCM.h +++ b/CocoaSplit/PluginHeaders/CAMultiAudioPCM.h @@ -18,7 +18,6 @@ { size_t _audioBufferListSize; size_t _audioBufferDataSize; - AudioBufferList *_pcmData; bool _alloced_buffers; } @@ -27,6 +26,10 @@ @property (assign) int frameCount; @property (weak) id player; @property (assign) AudioStreamBasicDescription pcmFormat; +@property (assign) AudioBufferList *pcmData; +@property (assign) bool handleFreeBuffer; + + -(instancetype)initWithAudioBufferList:(AudioBufferList *)bufferList streamFormat:(const AudioStreamBasicDescription *)streamFormat; -(instancetype)initWithDescription:(const AudioStreamBasicDescription *)streamFormat forFrameCount:(int)forFrameCount; diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index f4e4c7f9..21981468 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -120,6 +120,8 @@ -(void)clearSourceList; -(void)setupMIDI; -(void)updateCanvasWidth:(int)width height:(int)height; +-(CSAnimationItem *)animationForUUID:(NSString *)uuid; + diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 76475f36..4fdee2e3 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -621,12 +621,15 @@ NSMutableArray *runAnimations = [[NSMutableArray alloc] init]; - for (CSAnimationItem *anim in layout.animationList) + if (!self.in_staging) { - if (![self animationForUUID:anim.uuid] && anim.onLive) + for (CSAnimationItem *anim in layout.animationList) { - [runAnimations addObject:anim.uuid]; - + if (![self animationForUUID:anim.uuid] && anim.onLive) + { + [runAnimations addObject:anim.uuid]; + + } } } @@ -729,7 +732,7 @@ self.addLayoutBlock(toMerge); } - if (mergedAnim) + if (mergedAnim && !self.in_staging) { for (CSAnimationItem *anim in mergedAnim) { @@ -1633,6 +1636,11 @@ -(void)didBecomeVisible { + if (self.in_staging) + { + return; + } + for (CSAnimationItem *anim in self.animationList) { if (anim.onLive) diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 7f21cda6..44591451 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -632,7 +632,7 @@ - + @@ -867,25 +867,25 @@ - + - + + NSIsNotNil - @@ -958,6 +958,39 @@ + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + From 1a35a3cd537acd90f180fdd15502c8148f90a1d6 Mon Sep 17 00:00:00 2001 From: Zakk Date: Tue, 23 Aug 2016 08:55:28 -0400 Subject: [PATCH 145/156] Fixed weird bug that caused input source saved data to differ if the constraintMap was directly encoded --- CocoaSplit/CaptureController.h | 2 + CocoaSplit/CaptureController.m | 78 +++++++++++++++- CocoaSplit/InputSource.m | 33 +++++-- .../Interface/CSLayoutEditWindowController.h | 1 + .../CSLayoutEditWindowController.xib | 63 ++++++++++--- CocoaSplit/SourceLayout.h | 5 + CocoaSplit/SourceLayout.m | 92 +++++++++++++++++-- CocoaSplit/en.lproj/MainMenu.xib | 47 +++++++--- 8 files changed, 277 insertions(+), 44 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 8bb8be3c..0c701396 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -418,6 +418,7 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(void) resetInputTableHighlights; +- (IBAction)removePendingAnimations:(id)sender; - (IBAction)outputSegmentedAction:(NSButton *)sender; @@ -427,5 +428,6 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , -(void) removeObjectFromCaptureDestinationsAtIndex:(NSUInteger)index; -(void)openAddOutputPopover:(id)sender sourceRect:(NSRect)sourceRect; +- (IBAction)previewAnimations:(id)sender; @end diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 4ee732a6..18976df4 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -125,6 +125,52 @@ [_addOutputpopOver showRelativeToRect:sourceRect ofView:sender preferredEdge:NSMaxXEdge]; } +- (IBAction)previewAnimations:(id)sender +{ + + if (self.stagingHidden) + { + return; + } + + //save and copy both live and staging + //set staging layout to copy of live + //apply transition settings to staging + //replace staging with copy of 'old' staging + //when done, delay 1.5 seconds and then restore old staging + + [self.selectedLayout saveSourceList]; + [self.stagingLayout saveSourceList]; + + SourceLayout *stagingSave = self.activePreviewView.sourceLayout; + + SourceLayout *liveCopy = [self.selectedLayout copy]; + SourceLayout *stagingCopy = [self.stagingLayout copy]; + NSLog(@"SWITCH TO LIVE COPY"); + + [liveCopy restoreSourceList:liveCopy.savedSourceListData]; + + self.activePreviewView.sourceLayout = liveCopy; + + liveCopy.in_staging = NO; + + [self applyTransitionSettings:liveCopy]; + NSLog(@"REPLACE WITH SOURCE LAYOUT"); + dispatch_time_t delay_dispatch = dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC); + dispatch_after(delay_dispatch, dispatch_get_main_queue(), ^{ + [liveCopy replaceWithSourceLayout:stagingCopy withCompletionBlock:^{ + + self.activePreviewView.sourceLayout.in_staging = YES; + NSLog(@"DONE REPLACE"); + }]; + + }); + + +} + + + -(void)openAddInputPopover:(id)sender sourceRect:(NSRect)sourceRect { @@ -1646,6 +1692,7 @@ //[self.stagingLayout mergeSourceLayout:tmpLayout withLayer:nil]; } + [self changePendingAnimations]; self.inputLibrary = [saveRoot valueForKey:@"inputLibrary"]; if (!self.inputLibrary) { @@ -1678,6 +1725,7 @@ dispatch_async(_preview_queue, ^{ [self newStagingFrameTimed]; }); + } @@ -2383,6 +2431,17 @@ } } +- (IBAction)removePendingAnimations:(id)sender +{ + if (!self.stagingHidden) + { + [self.activePreviewView.sourceLayout clearAnimations]; + [self changePendingAnimations]; + } +} + + + - (IBAction)outputSegmentedAction:(NSButton *)sender { NSUInteger clicked = sender.tag; @@ -3624,11 +3683,28 @@ [self applyTransitionSettings:self.livePreviewView.sourceLayout]; + /* + InputSource *src1 = [[InputSource alloc] init]; + InputSource *src2 = src1.copy; + src2.uuid = src1.uuid; + + + bool diffInp = [src1 isDifferentInput:src2]; + + + NSLog(@"DIFFERENT INPUT %d", diffInp); + + */ + + if (self.stagingLayout) { [self stagingSave:sender]; - [self.selectedLayout replaceWithSourceLayout:self.stagingLayout]; + [self.selectedLayout replaceWithSourceLayout:self.stagingLayout withCompletionBlock:^{ + + + }]; [self changePendingAnimations]; } } diff --git a/CocoaSplit/InputSource.m b/CocoaSplit/InputSource.m index 9901c8a8..b5e26830 100644 --- a/CocoaSplit/InputSource.m +++ b/CocoaSplit/InputSource.m @@ -126,12 +126,14 @@ static NSArray *_sourceTypes = nil; [aCoder encodeFloat:self.rotationAngleY forKey:@"rotationAngleY"]; [aCoder encodeFloat:self.opacity forKey:@"opacity"]; + [aCoder encodeObject:_editedName forKey:@"name"]; [aCoder encodeFloat:self.depth forKey:@"CAdepth"]; [aCoder encodeFloat:self.crop_top forKey:@"CAcrop_top"]; [aCoder encodeFloat:self.crop_bottom forKey:@"CAcrop_bottom"]; [aCoder encodeFloat:self.crop_left forKey:@"CAcrop_left"]; [aCoder encodeFloat:self.crop_right forKey:@"CAcrop_right"]; + [aCoder encodeObject:self.selectedVideoType forKey:@"selectedVideoType"]; [aCoder encodeObject:self.uuid forKey:@"uuid"]; @@ -139,7 +141,6 @@ static NSArray *_sourceTypes = nil; [aCoder encodeFloat:self.scrollYSpeed forKey:@"scrollYSpeed"]; [aCoder encodeInt:self.rotateStyle forKey:@"rotateStyle"]; - if (self.videoInput) { [aCoder encodeObject:self.videoInput forKey:@"videoInput"]; @@ -162,13 +163,13 @@ static NSArray *_sourceTypes = nil; [aCoder encodeObject:self.videoSources forKey:@"videoSources"]; [aCoder encodeObject:self.currentEffects forKey:@"currentEffects"]; [aCoder encodeFloat:self.changeInterval forKey:@"changeInterval"]; - [aCoder encodeFloat:self.layer.position.x forKey:@"CAx_pos"]; [aCoder encodeFloat:self.layer.position.y forKey:@"CAy_pos"]; [aCoder encodeFloat:self.layer.bounds.size.width forKey:@"CAdisplay_width"]; [aCoder encodeFloat:self.layer.bounds.size.height forKey:@"CAdisplay_height"]; + [aCoder encodeFloat:self.borderWidth forKey:@"borderWidth"]; [aCoder encodeObject:self.borderColor forKey:@"borderColor"]; [aCoder encodeFloat:self.cornerRadius forKey:@"cornerRadius"]; @@ -178,13 +179,16 @@ static NSArray *_sourceTypes = nil; [aCoder encodeFloat:self.transitionDuration forKey:@"transitionDuration"]; [aCoder encodeObject:self.advancedTransition forKey:@"advancedTransition"]; - [aCoder encodeObject:self.parentInput forKey:@"parentInput"]; + //if we directly encode constraintMap the resulting NSData is not equal to an 'equal' InputSource, so double encode? - [aCoder encodeObject:self.constraintMap forKey:@"constraintMap"]; + NSData *constraintData = [NSKeyedArchiver archivedDataWithRootObject:self.constraintMap]; + + [aCoder encodeObject:constraintData forKey:@"constraintMapData"]; + //[aCoder encodeObject:self.constraintMap forKey:@"constraintMap"]; [aCoder encodeObject:self.startColor forKey:@"gradientStartColor"]; [aCoder encodeObject:self.stopColor forKey:@"gradientStopColor"]; @@ -196,7 +200,6 @@ static NSArray *_sourceTypes = nil; [aCoder encodeObject:self.layer.filters forKey:@"layerFilters"]; - if (_userBackground) { [aCoder encodeObject:self.backgroundColor forKey:@"backgroundColor"]; @@ -243,6 +246,7 @@ static NSArray *_sourceTypes = nil; if (!_userBackground) { self.backgroundColor = nil; + _userBackground = NO; } } @@ -293,8 +297,13 @@ static NSArray *_sourceTypes = nil; if (constraintData) { self.constraintMap = constraintData; + } else if ((constraintData = [aDecoder decodeObjectForKey:@"constraintMapData"])) { + self.constraintMap = [NSKeyedUnarchiver unarchiveObjectWithData:constraintData]; } + + + _rotationAngle = [aDecoder decodeFloatForKey:@"rotationAngle"]; _rotationAngleX = [aDecoder decodeFloatForKey:@"rotationAngleX"]; _rotationAngleY = [aDecoder decodeFloatForKey:@"rotationAngleY"]; @@ -554,6 +563,7 @@ static NSArray *_sourceTypes = nil; self.constraintMap = [NSMutableDictionary dictionary]; + _constraintAttributeMap = @{@"LeftEdge": @(kCAConstraintMinX), @"RightEdge": @(kCAConstraintMaxX), @"TopEdge": @(kCAConstraintMaxY), @@ -714,7 +724,10 @@ static NSArray *_sourceTypes = nil; for (NSString *base in baseKeys) { - [dict setObject:[NSMutableDictionary dictionaryWithDictionary:@{@"attr": [NSNull null], @"offset": @0}] forKey:base]; + NSMutableDictionary *valDict = [[NSMutableDictionary alloc] init]; + [valDict setObject:[NSNumber numberWithInt:0] forKey:@"attr"]; + [valDict setObject:[NSNumber numberWithInt:0] forKey:@"offset"]; + [dict setObject:valDict forKey:base]; } } @@ -2141,6 +2154,7 @@ static NSArray *_sourceTypes = nil; { NSMutableData *saveData = [NSMutableData data]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:saveData]; + [archiver encodeObject:self forKey:@"root"]; [archiver finishEncoding]; return saveData; @@ -2156,6 +2170,7 @@ static NSArray *_sourceTypes = nil; NSData *myData = [self saveData]; NSData *fromData = [from saveData]; + if ([myData isEqualToData:fromData]) { return NO; @@ -2718,7 +2733,6 @@ static NSArray *_sourceTypes = nil; [super setValue:value forKeyPath:keyPath]; } - -(void) setCrop_bottom:(float)crop_bottom { if (crop_bottom < 0) @@ -2842,7 +2856,6 @@ static NSArray *_sourceTypes = nil; -(void) buildLayerConstraints { - NSMutableArray *constraints = [NSMutableArray array]; for (NSString *key in self.constraintMap) @@ -2879,6 +2892,10 @@ static NSArray *_sourceTypes = nil; } CAConstraintAttribute parentAttrib = [parentVal intValue]; + if (!parentAttrib) + { + continue; + } [constraints addObject:[CAConstraint constraintWithAttribute:toConstrain relativeTo:@"superlayer" attribute:parentAttrib scale:1 offset:offsetFloat]]; } diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.h b/CocoaSplit/Interface/CSLayoutEditWindowController.h index 323c2651..a9b960b7 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.h +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.h @@ -34,5 +34,6 @@ - (IBAction)inputTableControlClick:(NSButton *)sender; @property (weak) IBOutlet NSOutlineView *inputOutlineView; +@property (assign) bool previewOnly; @end diff --git a/CocoaSplit/Interface/CSLayoutEditWindowController.xib b/CocoaSplit/Interface/CSLayoutEditWindowController.xib index 9452f70a..fd53de7e 100644 --- a/CocoaSplit/Interface/CSLayoutEditWindowController.xib +++ b/CocoaSplit/Interface/CSLayoutEditWindowController.xib @@ -76,6 +76,11 @@ Gw + + + NSNegateBoolean + + @@ -98,6 +103,11 @@ Gw + + + NSNegateBoolean + + @@ -120,6 +130,11 @@ Gw + + + NSNegateBoolean + + @@ -131,6 +146,11 @@ Gw + + + NSNegateBoolean + + @@ -181,11 +201,11 @@ Gw - + - + @@ -240,8 +260,8 @@ Gw -
From cc110a5691aca37fa924367d8441936987811fbf Mon Sep 17 00:00:00 2001 From: Zakk Date: Tue, 23 Aug 2016 23:48:35 -0400 Subject: [PATCH 146/156] replacing a source layout with another now resets all input and animation refcounts to 1, since there is no need to track multiple references unless a merge is being done. Fixes various weird issues with go live not properly reflecting the actual state of the staging layout --- CocoaSplit/SourceLayout.h | 2 ++ CocoaSplit/SourceLayout.m | 31 ++++++++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/CocoaSplit/SourceLayout.h b/CocoaSplit/SourceLayout.h index 64b4c0c5..bb572e69 100644 --- a/CocoaSplit/SourceLayout.h +++ b/CocoaSplit/SourceLayout.h @@ -28,6 +28,8 @@ NSMutableDictionary *_uuidMap; bool _noSceneTransactions; NSMutableArray *_topLevelSourceArray; + bool _skipRefCounting; + diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index dd5543c0..6e6bf06d 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -517,6 +517,22 @@ } + +-(void) resetAllRefCounts +{ + for (InputSource *src in self.sourceList) + { + src.refCount = 1; + } + + for (CSAnimationItem *item in self.animationList) + { + item.refCount = 1; + } +} + + + -(NSInteger) incrementAnimationRef:(CSAnimationItem *)anim { anim.refCount++; @@ -526,7 +542,9 @@ -(NSInteger)decrementAnimationRef:(CSAnimationItem *)anim { + anim.refCount--; + if (anim.refCount < 0) { anim.refCount = 0; @@ -546,7 +564,9 @@ -(NSInteger)decrementInputRef:(InputSource *)input { + input.refCount--; + if (input.refCount < 0) { input.refCount = 0; @@ -706,11 +726,11 @@ } } else { [rList addObject:src]; + } } - [self removeSourceInputs:rList withLayer:nil]; @@ -763,6 +783,7 @@ _noSceneTransactions = NO; [self updateCanvasWidth:layout.canvas_width height:layout.canvas_height]; self.frameRate = layout.frameRate; + [self resetAllRefCounts]; } @@ -869,20 +890,17 @@ for(InputSource *src in inputs) { - NSLog(@"TESTING %@", src); src.sourceLayout = self; src.is_live = self.isActive; InputSource *eSrc = [self inputForUUID:src.uuid]; bool isDifferent = YES; - NSLog(@"ESRC %@", eSrc); if (eSrc) { isDifferent = [eSrc isDifferentInput:src]; if (!isDifferent) { - NSLog(@"INCREMENT ESRC"); [self incrementInputRef:eSrc]; continue; @@ -894,7 +912,6 @@ { [eSrc.layer.superlayer addSublayer:src.layer]; } - NSLog(@"HIDDING ESRC"); eSrc.layer.hidden = YES; [undoSources addObject:eSrc]; eSrc.refCount = 0; @@ -920,7 +937,6 @@ if (undoSources.count > 0) { - NSLog(@"UNDO SOURCES HAVE STUFF"); [CATransaction setCompletionBlock:^{ for (InputSource *dInput in undoSources) { @@ -1190,8 +1206,9 @@ if (eSrc) { - NSInteger refCnt = [self decrementInputRef:eSrc]; + + if (refCnt != 0) { continue; From 29051f4034034d76be338ccf6391b2968b8fcef2 Mon Sep 17 00:00:00 2001 From: Zakk Date: Fri, 26 Aug 2016 09:59:44 -0400 Subject: [PATCH 147/156] Bounce some animations through the main thread since that makes them work for some reason. --- CocoaSplit/CaptureController.h | 3 +++ CocoaSplit/CaptureController.m | 18 +++++++++++++----- CocoaSplit/SourceLayout.m | 28 ++++++++++++++++++++++------ CocoaSplit/en.lproj/MainMenu.xib | 10 ++++++++-- 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/CocoaSplit/CaptureController.h b/CocoaSplit/CaptureController.h index 0c701396..3aa35f7a 100644 --- a/CocoaSplit/CaptureController.h +++ b/CocoaSplit/CaptureController.h @@ -349,6 +349,9 @@ void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , @property (weak) IBOutlet NSArrayController *activeInputsArrayController; +@property (assign) bool inLayoutTransition; + + - (IBAction)openAnimatePopover:(NSButton *)sender; diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index 18976df4..fea68d4f 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -146,22 +146,26 @@ SourceLayout *liveCopy = [self.selectedLayout copy]; SourceLayout *stagingCopy = [self.stagingLayout copy]; - NSLog(@"SWITCH TO LIVE COPY"); + [liveCopy restoreSourceList:liveCopy.savedSourceListData]; - self.activePreviewView.sourceLayout = liveCopy; + [stagingCopy restoreSourceList:stagingCopy.savedSourceListData]; + self.activePreviewView.sourceLayout = liveCopy; liveCopy.in_staging = NO; [self applyTransitionSettings:liveCopy]; - NSLog(@"REPLACE WITH SOURCE LAYOUT"); dispatch_time_t delay_dispatch = dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC); dispatch_after(delay_dispatch, dispatch_get_main_queue(), ^{ [liveCopy replaceWithSourceLayout:stagingCopy withCompletionBlock:^{ self.activePreviewView.sourceLayout.in_staging = YES; - NSLog(@"DONE REPLACE"); + dispatch_time_t inner_dispatch = dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC); + dispatch_after(inner_dispatch, dispatch_get_main_queue(), ^{ + self.activePreviewView.sourceLayout = stagingSave; + }); + }]; }); @@ -3701,8 +3705,12 @@ { [self stagingSave:sender]; + self.inLayoutTransition = YES; [self.selectedLayout replaceWithSourceLayout:self.stagingLayout withCompletionBlock:^{ - + dispatch_async(dispatch_get_main_queue(), ^{ + NSLog(@"COMPLETED"); + self.inLayoutTransition = NO; + }); }]; [self changePendingAnimations]; diff --git a/CocoaSplit/SourceLayout.m b/CocoaSplit/SourceLayout.m index 6e6bf06d..6ebbf420 100644 --- a/CocoaSplit/SourceLayout.m +++ b/CocoaSplit/SourceLayout.m @@ -645,7 +645,7 @@ } }; - _noSceneTransactions = YES; + //_noSceneTransactions = YES; CATransition *rTrans = nil; [CATransaction begin]; @@ -695,6 +695,7 @@ { for (CSAnimationItem *anim in layout.animationList) { + if (![self animationForUUID:anim.uuid] && anim.onLive) { [runAnimations addObject:anim.uuid]; @@ -758,7 +759,7 @@ { if (rTrans) { - [self.rootLayer addAnimation:rTrans forKey:nil]; + //[self.rootLayer addAnimation:rTrans forKey:kCATransition]; } } @@ -1028,29 +1029,44 @@ [CATransaction commit]; [undoSources addObject:eSrc]; } else { - + [CATransaction begin]; + if (eSrc && !isDifferent) { [self incrementInputRef:eSrc]; continue; } - src.layer.hidden = YES; + if (!src.layer.superlayer) { [self.rootLayer addSublayer:src.layer]; } - [CATransaction flush]; + + src.layer.hidden = YES; + + [CATransaction commit]; + dispatch_async(dispatch_get_main_queue(), ^{ [CATransaction begin]; + if (rTrans) { + [src.layer addAnimation:rTrans forKey:nil]; } - + + src.layer.hidden = NO; + + + + [CATransaction commit]; + }); + + } [NSApp registerMIDIResponder:src]; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 9b3456e7..97bc55ec 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -397,12 +397,12 @@ - + NSNegateBoolean - + @@ -966,6 +966,12 @@ + + + NSNegateBoolean + + + From cb449e5bc2a64d61f43eb26169493c0c76a6fe94 Mon Sep 17 00:00:00 2001 From: Zakk Date: Wed, 31 Aug 2016 06:30:43 -0400 Subject: [PATCH 148/156] Some updates for Sierra, hack for the stupid individual transition add+effect. Remove dependency on SyphonInject extra menu --- .../CSFFMpegCapturePlugin/CSFFMpegPlayer.h | 2 ++ CocoaSplit.xcodeproj/project.pbxproj | 12 +++----- CocoaSplit/AppDelegate.h | 1 - CocoaSplit/CaptureController.m | 3 ++ .../Interface/CSAddInputViewController.xib | 29 +++++++++++-------- CocoaSplit/SourceLayout.m | 18 ++++++++++-- .../xcschemes/xcschememanagement.plist | 2 +- 7 files changed, 43 insertions(+), 24 deletions(-) diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h index 13cf2d35..4f64c050 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h @@ -7,6 +7,8 @@ // #import +#import + #import "CSFFMpegInput.h" #import "CSPcmPlayer.h" diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 71146a3c..7c7d06dd 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -198,7 +198,6 @@ 34AFC27C19B05C4E0007C07B /* CSWindowCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC25919B05B470007C07B /* CSWindowCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 34AFC27D19B05C4E0007C07B /* CSImageCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC24F19B05B0A0007C07B /* CSImageCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 34AFC27E19B05C4E0007C07B /* CSTextCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC26319B05B6B0007C07B /* CSTextCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - 34AFC27F19B05C4E0007C07B /* CSSyphonCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC26819B05B7C0007C07B /* CSSyphonCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 34AFC28019B05C4E0007C07B /* CSAVFCapturePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34AFC26D19B05B930007C07B /* CSAVFCapturePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 34AFC33319B19CD00007C07B /* SourceCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC33219B19CD00007C07B /* SourceCache.m */; }; 34AFC33419B19CD00007C07B /* SourceCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AFC33219B19CD00007C07B /* SourceCache.m */; }; @@ -215,7 +214,6 @@ 34C19053189EE60400AB2430 /* CapturedFrameData.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C19052189EE60400AB2430 /* CapturedFrameData.m */; }; 34C19054189EE60400AB2430 /* CapturedFrameData.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C19052189EE60400AB2430 /* CapturedFrameData.m */; }; 34C67B8E1A2E69F60012DC1B /* CSHitboxStreamServicePlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34C67B781A2D7B6A0012DC1B /* CSHitboxStreamServicePlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 34C680A119DD06E800413468 /* CSSyphonInjectExtraPlugin.bundle in Copy Files */ = {isa = PBXBuildFile; fileRef = 34C6808C19DD01C400413468 /* CSSyphonInjectExtraPlugin.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 34C6C3BF15FB5B440018A18B /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34C6C3BE15FB5B440018A18B /* OpenGL.framework */; }; 34CFE4A018F154DD00092C6A /* AVFChannelManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CFE49F18F154DD00092C6A /* AVFChannelManager.m */; }; 34CFE4A118F154DD00092C6A /* AVFChannelManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CFE49F18F154DD00092C6A /* AVFChannelManager.m */; }; @@ -599,7 +597,6 @@ 34FDA83E1A84C46500E7F65E /* CSTimeCapturePlugin.bundle in Copy Files */, 34D2D5B41A548B68001004E5 /* CSNowPlayingPlugin.bundle in Copy Files */, 34C67B8E1A2E69F60012DC1B /* CSHitboxStreamServicePlugin.bundle in Copy Files */, - 34C680A119DD06E800413468 /* CSSyphonInjectExtraPlugin.bundle in Copy Files */, 34A7C1AD19B9A57600BC6882 /* CSLayoutSwitcherExtraPlugin.bundle in Copy Files */, 34D6580319B342E70012E32B /* CSFileStreamServicePlugin.bundle in Copy Files */, 34D6580219B342E00012E32B /* CSTwitchStreamServicePlugin.bundle in Copy Files */, @@ -610,7 +607,6 @@ 34AFC27C19B05C4E0007C07B /* CSWindowCapturePlugin.bundle in Copy Files */, 34AFC27D19B05C4E0007C07B /* CSImageCapturePlugin.bundle in Copy Files */, 34AFC27E19B05C4E0007C07B /* CSTextCapturePlugin.bundle in Copy Files */, - 34AFC27F19B05C4E0007C07B /* CSSyphonCapturePlugin.bundle in Copy Files */, 34AFC28019B05C4E0007C07B /* CSAVFCapturePlugin.bundle in Copy Files */, ); name = "Copy Files"; @@ -2728,8 +2724,8 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; - CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; + CODE_SIGN_IDENTITY = "Mac Developer"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -2771,8 +2767,8 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_ENTITLEMENTS = ""; - CODE_SIGN_IDENTITY = "Developer ID Application: Zachary Girouard (L3JLUY4S5E)"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; + CODE_SIGN_IDENTITY = "Mac Developer"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/CocoaSplit/AppDelegate.h b/CocoaSplit/AppDelegate.h index da1aa8ec..e7fbe5c0 100644 --- a/CocoaSplit/AppDelegate.h +++ b/CocoaSplit/AppDelegate.h @@ -7,7 +7,6 @@ // #import -#import #import "CaptureController.h" diff --git a/CocoaSplit/CaptureController.m b/CocoaSplit/CaptureController.m index fea68d4f..b5c91c5a 100644 --- a/CocoaSplit/CaptureController.m +++ b/CocoaSplit/CaptureController.m @@ -3713,7 +3713,10 @@ }); }]; + + [self changePendingAnimations]; + } } diff --git a/CocoaSplit/Interface/CSAddInputViewController.xib b/CocoaSplit/Interface/CSAddInputViewController.xib index 73b3c874..478e5165 100644 --- a/CocoaSplit/Interface/CSAddInputViewController.xib +++ b/CocoaSplit/Interface/CSAddInputViewController.xib @@ -1,8 +1,8 @@ - - + + - + @@ -27,9 +27,9 @@ - + - + @@ -70,9 +70,9 @@ - - - + + + @@ -84,7 +84,6 @@ - - + - + @@ -63,7 +63,7 @@ - + - + @@ -119,6 +119,7 @@ + @@ -143,37 +144,38 @@ - + - + - + - + + - + - + @@ -198,10 +200,10 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -413,8 +325,8 @@ - + @@ -424,8 +336,8 @@ - + From 3df9ce53c8cd42a8ade5b8533c169656043bede8 Mon Sep 17 00:00:00 2001 From: Zakk Date: Wed, 14 Sep 2016 20:48:40 -0400 Subject: [PATCH 152/156] Changes to Twitch ingest fetching to fulfill their new client-id requirement --- CocoaSplit/Interface/CSAnimationWindowController.xib | 6 +++--- .../CSTwitchStreamServicePlugin/TwitchStreamService.m | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CocoaSplit/Interface/CSAnimationWindowController.xib b/CocoaSplit/Interface/CSAnimationWindowController.xib index 71ebbdf4..789928f8 100644 --- a/CocoaSplit/Interface/CSAnimationWindowController.xib +++ b/CocoaSplit/Interface/CSAnimationWindowController.xib @@ -147,7 +147,7 @@ - + @@ -245,11 +245,11 @@ - + - + diff --git a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m index 5598ca7b..e950680c 100644 --- a/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m +++ b/StreamServicePlugins/CSTwitchStreamServicePlugin/TwitchStreamService.m @@ -252,6 +252,12 @@ NSMutableURLRequest *apiRequest = [NSMutableURLRequest requestWithURL:apiURL]; + if (!_oauth_client_id) + { + _oauth_client_id = [[NSBundle bundleForClass:[self class]] objectForInfoDictionaryKey:@"TwitchAPIClientID"]; + } + + [apiRequest setValue:_oauth_client_id forHTTPHeaderField:@"Client-ID"]; [NSURLConnection sendAsynchronousRequest:apiRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *err) { NSError *jsonError; From 68cd2fd2a2fa086171d34b0b1896fe5af59ef4b1 Mon Sep 17 00:00:00 2001 From: Zakk Date: Wed, 14 Sep 2016 20:49:25 -0400 Subject: [PATCH 153/156] Bump version to 2.0.12 --- CocoaSplit/CocoaSplit-Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index e927f920..85ca8768 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.11 + 2.0.12 CFBundleSignature ???? CFBundleVersion - 2.0.11 + 2.0.12 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion From 8a6d2c8ac95ca7a9845ab5e1e2b9349b971904d1 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 19 Nov 2016 05:41:59 -0500 Subject: [PATCH 154/156] Update constraints to allow for vertical resizing of the window when in single view mode --- CocoaSplit.xcodeproj/project.pbxproj | 6 +++-- CocoaSplit/en.lproj/MainMenu.xib | 39 +++++++++++++++++----------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/CocoaSplit.xcodeproj/project.pbxproj b/CocoaSplit.xcodeproj/project.pbxproj index 0e95768c..69756f9a 100644 --- a/CocoaSplit.xcodeproj/project.pbxproj +++ b/CocoaSplit.xcodeproj/project.pbxproj @@ -2729,6 +2729,7 @@ CODE_SIGN_IDENTITY = "Mac Developer"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = L3JLUY4S5E; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)", @@ -2755,7 +2756,7 @@ ); PRODUCT_NAME = CocoaSplit; PROVISIONING_PROFILE = ""; - SDKROOT = macosx10.11; + SDKROOT = macosx; STRIP_STYLE = debugging; WRAPPER_EXTENSION = app; }; @@ -2773,6 +2774,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = L3JLUY4S5E; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)", @@ -2800,7 +2802,7 @@ ); PRODUCT_NAME = CocoaSplit; PROVISIONING_PROFILE = ""; - SDKROOT = macosx10.11; + SDKROOT = macosx; STRIP_STYLE = debugging; WRAPPER_EXTENSION = app; }; diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index 50b0cc6a..e0d66b3a 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -1,8 +1,9 @@ - - + + - + + @@ -322,7 +323,7 @@ - + @@ -514,7 +515,7 @@ - + @@ -567,7 +568,6 @@ - - - - @@ -969,9 +999,8 @@ - - + - + + + @@ -1008,9 +1039,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - @@ -1108,12 +1143,10 @@ - - - - - - + + + + From d2383b949318d2217fdb0d190505420a5cd0e087 Mon Sep 17 00:00:00 2001 From: Zakk Date: Sat, 19 Nov 2016 10:18:58 -0500 Subject: [PATCH 156/156] Bump version to 2.0.13 --- CocoaSplit/CocoaSplit-Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CocoaSplit/CocoaSplit-Info.plist b/CocoaSplit/CocoaSplit-Info.plist index 85ca8768..223bc001 100644 --- a/CocoaSplit/CocoaSplit-Info.plist +++ b/CocoaSplit/CocoaSplit-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.12 + 2.0.13 CFBundleSignature ???? CFBundleVersion - 2.0.12 + 2.0.13 LSApplicationCategoryType public.app-category.video LSMinimumSystemVersion