-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAVAudioRecorder+Convenience.m
160 lines (114 loc) · 4.9 KB
/
AVAudioRecorder+Convenience.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//
// AVAudioRecorder+Convenience.m
// Crowd Guard
//
// Created by Alexander Ivanov on 10.05.17.
// Copyright © 2017 Alexander Ivanov. All rights reserved.
//
#import "AVAudioRecorder+Convenience.h"
@implementation AVAudioSession (Convenience)
- (NSNumber *)recordPermissionGranted {
return self.recordPermission == AVAudioSessionRecordPermissionGranted ? @YES : self.recordPermission == AVAudioSessionRecordPermissionDenied ? @NO : Nil;
}
#if TARGET_OS_IOS
- (void)requestRecordPermissionIfNeeded:(void (^)(NSNumber *granted))completionHandler {
/* if (self.recordPermissionGranted.boolValue) {
if (completionHandler)
completionHandler(@YES);
} else*/ if (/*self.recordPermissionGranted*/self.recordPermission == AVAudioSessionRecordPermissionDenied) {
[UIApplication openSettings];
if (completionHandler)
completionHandler(Nil);
} else {
[self requestRecordPermission:^(BOOL granted) {
if (completionHandler)
completionHandler(@(granted));
}];
}
}
#endif
- (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options {
NSError *error = Nil;
BOOL success = [self setActive:YES withOptions:options error:&error];
[error log:@"setCategory:mode:options:error:"];
return success;
}
- (BOOL)setCategory:(NSString *)category mode:(NSString *)mode options:(AVAudioSessionCategoryOptions)options {
NSError *error = Nil;
BOOL success = [self setCategory:category mode:mode options:options error:&error];
[error log:@"setCategory:mode:options:error:"];
return success;
}
@end
@implementation AVAudioRecorder (Convenience)
+ (instancetype)audioRecorderWithURL:(NSURL *)url settings:(NSDictionary<NSString *,id> *)settings {
if ([AVAudioSession sharedInstance].recordPermission != AVAudioSessionRecordPermissionGranted)
return Nil;
NSError *error = Nil;
AVAudioRecorder *recorder = [[self alloc] initWithURL:url settings:settings error:&error];
[error log:@"audioRecorderWithURL:settings:"];
if (![recorder prepareToRecord])
NSLog(@"prepareToRecord: NO");
return recorder;
}
+ (instancetype)audioRecorderWithURL:(NSURL *)url format:(AVAudioFormat *)format {
if ([AVAudioSession sharedInstance].recordPermission != AVAudioSessionRecordPermissionGranted)
return Nil;
NSError *error = Nil;
AVAudioRecorder *recorder = [[self alloc] initWithURL:url format:format error:&error];
[error log:@"audioRecorderWithURL:format:"];
if (![recorder prepareToRecord])
NSLog(@"prepareToRecord: NO");
return recorder;
}
- (BOOL)recordInTime:(NSTimeInterval)time forDuration:(NSTimeInterval)duration {
if (time > 0.0 && duration > 0.0)
return [self recordAtTime:self.deviceCurrentTime + time forDuration:duration];
else if (time > 0.0)
return [self recordAtTime:self.deviceCurrentTime + time];
else if (duration > 0.0)
return [self recordForDuration:duration];
else
return [self record];
}
+ (instancetype)recordInTime:(NSTimeInterval)time forDuration:(NSTimeInterval)duration url:(NSURL *)url settings:(NSDictionary<NSString *,id> *)settings {
AVAudioRecorder *recorder = [self audioRecorderWithURL:url settings:settings];
return [recorder recordInTime:time forDuration:duration] ? recorder : Nil;
}
+ (instancetype)recordInTime:(NSTimeInterval)time forDuration:(NSTimeInterval)duration url:(NSURL *)url format:(AVAudioFormat *)format {
AVAudioRecorder *recorder = [self audioRecorderWithURL:url format:format];
return [recorder recordInTime:time forDuration:duration] ? recorder : Nil;
}
@end
@interface AVAudioRecorderSingleton () <AVAudioRecorderDelegate>
@property (copy, nonatomic) void (^completion)(NSURL *, BOOL);
@end
@implementation AVAudioRecorderSingleton
static AVAudioRecorder *_instance;
+ (AVAudioRecorder *)instance {
return _instance;
}
+ (void)recordInTime:(NSTimeInterval)time forDuration:(NSTimeInterval)duration url:(NSURL *)url settings:(NSDictionary<NSString *,id> *)settings completion:(void (^)(NSURL *, BOOL))completion {
AVAudioRecorderSingleton *recorder = [self audioRecorderWithURL:url settings:settings];
recorder.completion = completion;
recorder.delegate = recorder;
_instance = [recorder recordInTime:time forDuration:duration] ? recorder : Nil;
}
+ (void)recordInTime:(NSTimeInterval)time forDuration:(NSTimeInterval)duration url:(NSURL *)url format:(AVAudioFormat *)format completion:(void (^)(NSURL *, BOOL))completion {
AVAudioRecorderSingleton *recorder = [self audioRecorderWithURL:url format:format];
recorder.completion = completion;
recorder.delegate = recorder;
_instance = [recorder recordInTime:time forDuration:duration] ? recorder : Nil;
}
- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error {
if (self.completion)
self.completion(recorder.url, NO);
[error log:@"audioRecorderEncodeErrorDidOccur:"];
_instance = Nil;
}
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag {
if (self.completion)
self.completion(recorder.url, flag);
_instance = Nil;
}
@end