From c396966fb9d903e8c2601587488821d2c395fb06 Mon Sep 17 00:00:00 2001 From: Rickard Holmberg Date: Tue, 1 Sep 2020 14:57:45 +0200 Subject: [PATCH] Added ISO Speed menu --- Camera Live/Base.lproj/MainMenu.xib | 10 ++++ Camera Live/SyPAppDelegate.h | 1 + Camera Live/SyPAppDelegate.m | 29 ++++++++++++ Camera Live/SyPCamera.h | 3 ++ Camera Live/SyPCamera.m | 10 ++++ Camera Live/SyPCanonDSLR.h | 1 + Camera Live/SyPCanonDSLR.m | 72 +++++++++++++++++++++++++++++ 7 files changed, 126 insertions(+) diff --git a/Camera Live/Base.lproj/MainMenu.xib b/Camera Live/Base.lproj/MainMenu.xib index b6b7e4c..ba0b2b0 100644 --- a/Camera Live/Base.lproj/MainMenu.xib +++ b/Camera Live/Base.lproj/MainMenu.xib @@ -331,6 +331,16 @@ + + + + + + + + + + diff --git a/Camera Live/SyPAppDelegate.h b/Camera Live/SyPAppDelegate.h index 0e42575..1d25c8e 100644 --- a/Camera Live/SyPAppDelegate.h +++ b/Camera Live/SyPAppDelegate.h @@ -61,5 +61,6 @@ @property (readwrite, retain) NSArray *selectedCameras; @property (assign) IBOutlet NSArrayController *camerasArrayController; @property (assign) IBOutlet SyPToolbarDelegate *toolbarDelegate; +- (IBAction)setIso:(NSMenuItem *)sender; - (IBAction)goToWebIssues:(id)sender; @end diff --git a/Camera Live/SyPAppDelegate.m b/Camera Live/SyPAppDelegate.m index b005a80..b58e681 100644 --- a/Camera Live/SyPAppDelegate.m +++ b/Camera Live/SyPAppDelegate.m @@ -205,6 +205,7 @@ - (void)setActiveCamera:(SyPCamera *)activeCamera { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ self.toolbarDelegate.status = @"Active"; + [self updateIsoMenuItemStates]; }]; _started = YES; } @@ -269,11 +270,18 @@ - (void)setActiveCamera:(SyPCamera *)activeCamera status = @"Starting"; } self.toolbarDelegate.status = status; + + [self.isoMenu.submenu removeAllItems]; + for(id isoId in activeCamera.getIsoNumbers) { + [self.isoMenu.submenu addItemWithTitle:(NSString*)isoId action:@selector (setIso:) keyEquivalent:@""]; + } + [self updateIsoMenuItemStates]; } else { if ([self.cameras count]) self.toolbarDelegate.status = @"Ready"; else self.toolbarDelegate.status = @"No Camera"; + [self.isoMenu.submenu removeAllItems]; if (_noSleepAssertion) { IOPMAssertionRelease(_noSleepAssertion); @@ -295,6 +303,27 @@ - (IBAction)goToWebIssues:(id)sender [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://github.com/v002/v002-Camera-Live/issues"]]; } +- (NSMenuItem*) isoMenu { + return [[self.window.menu itemWithTitle:@"Camera"].submenu itemWithTitle:@"ISO Speed"]; +} + +- (void)updateIsoMenuItemStates +{ + NSString* currentIso = [self.activeCamera getIso]; + for(NSMenuItem* menuItem in self.isoMenu.submenu.itemArray) { + if([menuItem.title isEqual:currentIso]) + menuItem.state = NSControlStateValueOn; + else + menuItem.state = NSControlStateValueOff; + } +} + +- (IBAction)setIso:(NSMenuItem *)sender +{ + [self.activeCamera setIso:(sender.title)]; + [self updateIsoMenuItemStates]; +} + // swizzle -[ICCameraDevice registerForImageCaptureEventNotifications:] to prevent ImageCapture stuff from crashing on 10.13. // TODO: avoid this if we can diff --git a/Camera Live/SyPCamera.h b/Camera Live/SyPCamera.h index 0424702..63d4a3f 100644 --- a/Camera Live/SyPCamera.h +++ b/Camera Live/SyPCamera.h @@ -48,6 +48,9 @@ typedef void(^SyPCameraImageHandler)(SyPImageBuffer *image, NSError *error); - (void)startLiveViewOnQueue:(dispatch_queue_t)queue withHandler:(SyPCameraImageHandler)handler; - (void)stopLiveView; @property (readonly) BOOL isInLiveView; +- (NSArray*)getIsoNumbers; +- (NSString*)getIso; +- (void)setIso:(NSString*)isoNumber; @end @interface SyPCamera (Subclassing) diff --git a/Camera Live/SyPCamera.m b/Camera Live/SyPCamera.m index 6106a06..86580fb 100644 --- a/Camera Live/SyPCamera.m +++ b/Camera Live/SyPCamera.m @@ -107,4 +107,14 @@ - (BOOL)isInLiveView { return _isInLiveView; } + +- (NSString*)getIso { + return @""; +} + +- (void)setIso:(NSString*)isoNumber +{ + NSLog(@"setIso:%@", isoNumber); +} + @end diff --git a/Camera Live/SyPCanonDSLR.h b/Camera Live/SyPCanonDSLR.h index d6afc9e..3520db7 100644 --- a/Camera Live/SyPCanonDSLR.h +++ b/Camera Live/SyPCanonDSLR.h @@ -51,5 +51,6 @@ SyPImageBuffer *_pendingImage; NSError *_pendingError; NSTimeInterval _lastSession; + NSDictionary *_isoMap; } @end diff --git a/Camera Live/SyPCanonDSLR.m b/Camera Live/SyPCanonDSLR.m index 9cc7c2e..6413a33 100644 --- a/Camera Live/SyPCanonDSLR.m +++ b/Camera Live/SyPCanonDSLR.m @@ -197,6 +197,48 @@ - (id)initWithCanonCameraRef:(EdsCameraRef)ref [self release]; return nil; } + + self->_isoMap = [[NSDictionary alloc] initWithDictionary:@{ + @"Auto": [NSNumber numberWithInt:0x00] , + @"6": [NSNumber numberWithInt:0x28] , + @"12" : [NSNumber numberWithInt:0x30] , + @"25" : [NSNumber numberWithInt:0x38] , + @"50" : [NSNumber numberWithInt:0x40] , + @"100" : [NSNumber numberWithInt:0x48] , + @"125" : [NSNumber numberWithInt:0x4b] , + @"160" : [NSNumber numberWithInt:0x4d] , + @"200" : [NSNumber numberWithInt:0x50] , + @"250" : [NSNumber numberWithInt:0x53] , + @"320" : [NSNumber numberWithInt:0x55] , + @"400" : [NSNumber numberWithInt:0x58] , + @"500" : [NSNumber numberWithInt:0x5b] , + @"640" : [NSNumber numberWithInt:0x5d] , + @"800" : [NSNumber numberWithInt:0x60] , + @"1000" : [NSNumber numberWithInt:0x63] , + @"1250" : [NSNumber numberWithInt:0x65] , + @"1600" : [NSNumber numberWithInt:0x68] , + @"2000" : [NSNumber numberWithInt:0x6b] , + @"2500" : [NSNumber numberWithInt:0x6d] , + @"3200" : [NSNumber numberWithInt:0x70] , + @"4000" : [NSNumber numberWithInt:0x73] , + @"5000" : [NSNumber numberWithInt:0x75] , + @"6400" : [NSNumber numberWithInt:0x78] , + @"8000" : [NSNumber numberWithInt:0x7b] , + @"10000" : [NSNumber numberWithInt:0x7d] , + @"12800" : [NSNumber numberWithInt:0x80] , + @"16000" : [NSNumber numberWithInt:0x83] , + @"20000" : [NSNumber numberWithInt:0x85] , + @"25600" : [NSNumber numberWithInt:0x88] , + @"32000" : [NSNumber numberWithInt:0x8b] , + @"40000" : [NSNumber numberWithInt:0x8d] , + @"51200" : [NSNumber numberWithInt:0x90] , + @"64000" : [NSNumber numberWithInt:0x93] , + @"80000" : [NSNumber numberWithInt:0x95] , + @"102400" : [NSNumber numberWithInt:0x98] , + @"204800" : [NSNumber numberWithInt:0xa0] , + @"409600" : [NSNumber numberWithInt:0xa8] , + @"819200" : [NSNumber numberWithInt:0xb0] + } copyItems:TRUE]; } return self; } @@ -484,6 +526,7 @@ - (NSError *)startSessionOnQueue error = [NSError errorWithDomain:@"SyPErrorDomain" code:1 userInfo:nil]; } } + return error; } @@ -553,4 +596,33 @@ - (SyPImageBuffer *)newLiveViewImageOnQueueWithError:(NSError **)error return image; } +- (NSArray*)getIsoNumbers +{ + NSArray *sortedArrayOfString = [self->_isoMap.allKeys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { + return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch]; + }]; + return sortedArrayOfString; +} + +- (void)setIso:(NSString*)isoNumber +{ + EdsUInt32 isoId = ((NSNumber*)_isoMap[isoNumber]).intValue; + EdsSetPropertyData(_camera, kEdsPropID_ISOSpeed, 0 , sizeof(isoId), &isoId); +} + +- (NSString*)getIso +{ + EdsError error = EDS_ERR_OK; + EdsUInt32 isoId; + error = EdsGetPropertyData(_camera, kEdsPropID_ISOSpeed, 0, sizeof(isoId), &isoId); + if(error != EDS_ERR_OK) + return @""; + NSArray* isoStrings = [_isoMap allKeysForObject:[NSNumber numberWithInt:isoId]]; + if(isoStrings.count == 1){ + return (NSString*)isoStrings[0]; + } else { + return @""; + } +} + @end