Source-SCCamera/ManagedCapturer/AVCaptureDevice+Configurati...

48 lines
1.5 KiB
Objective-C

//
// AVCaptureDevice+ConfigurationLock.m
// Snapchat
//
// Created by Derek Peirce on 4/19/17.
// Copyright © 2017 Snapchat, Inc. All rights reserved.
//
#import "AVCaptureDevice+ConfigurationLock.h"
#import "SCLogger+Camera.h"
#import <SCFoundation/SCAssertWrapper.h>
#import <SCFoundation/SCLog.h>
#import <SCLogger/SCLogger.h>
@implementation AVCaptureDevice (ConfigurationLock)
- (BOOL)runTask:(NSString *)taskName withLockedConfiguration:(void (^)(void))task
{
return [self runTask:taskName withLockedConfiguration:task retry:0];
}
- (BOOL)runTask:(NSString *)taskName withLockedConfiguration:(void (^)(void))task retry:(NSUInteger)retryTimes
{
SCAssert(taskName, @"camera logger taskString should not be empty");
SCAssert(retryTimes <= 2 && retryTimes >= 0, @"retry times should be equal to or below 2.");
NSError *error = nil;
BOOL deviceLockSuccess = NO;
NSUInteger retryCounter = 0;
while (retryCounter <= retryTimes && !deviceLockSuccess) {
deviceLockSuccess = [self lockForConfiguration:&error];
retryCounter++;
}
if (deviceLockSuccess) {
task();
[self unlockForConfiguration];
SCLogCoreCameraInfo(@"AVCapture Device setting success, task:%@ tryCount:%zu", taskName,
(unsigned long)retryCounter);
} else {
SCLogCoreCameraError(@"AVCapture Device Encountered error when %@ %@", taskName, error);
[[SCLogger sharedInstance] logManagedCapturerSettingFailure:taskName error:error];
}
return deviceLockSuccess;
}
@end