nosnia-audio-recorder 0.9.15 → 0.9.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/nosniaaudiorecorder/NosniaAudioPlayerModule.kt +237 -237
- package/ios/NosniaAudioPlayer.h +6 -6
- package/ios/NosniaAudioPlayer.mm +254 -254
- package/ios/Pods/Pods.xcodeproj/xcuserdata/nosnia.xcuserdatad/xcschemes/xcschememanagement.plist +10 -0
- package/lib/module/AudioPlayer.js.map +1 -1
- package/lib/module/NativeNosniaAudioPlayer.js.map +1 -1
- package/lib/module/NativeNosniaAudioRecorder.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/package.json +174 -174
package/ios/NosniaAudioPlayer.mm
CHANGED
|
@@ -1,254 +1,254 @@
|
|
|
1
|
-
#import "NosniaAudioPlayer.h"
|
|
2
|
-
#import <AVFoundation/AVFoundation.h>
|
|
3
|
-
#import <React/RCTBridgeModule.h>
|
|
4
|
-
#import <React/RCTEventEmitter.h>
|
|
5
|
-
|
|
6
|
-
@interface NosniaAudioPlayer () <AVAudioPlayerDelegate>
|
|
7
|
-
@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
|
|
8
|
-
@property (nonatomic, assign) BOOL isPlaying;
|
|
9
|
-
@property (nonatomic, strong) NSTimer *progressTimer;
|
|
10
|
-
@property (nonatomic, strong) NSString *currentFilePath;
|
|
11
|
-
@end
|
|
12
|
-
|
|
13
|
-
@implementation NosniaAudioPlayer {
|
|
14
|
-
AVAudioPlayer *_audioPlayer;
|
|
15
|
-
BOOL _isPlaying;
|
|
16
|
-
NSTimer *_progressTimer;
|
|
17
|
-
NSString *_currentFilePath;
|
|
18
|
-
BOOL _hasListeners;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
RCT_EXPORT_MODULE(NosniaAudioPlayer)
|
|
22
|
-
|
|
23
|
-
- (instancetype)init {
|
|
24
|
-
self = [super init];
|
|
25
|
-
if (self) {
|
|
26
|
-
_isPlaying = NO;
|
|
27
|
-
_hasListeners = NO;
|
|
28
|
-
}
|
|
29
|
-
return self;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
- (NSArray<NSString *> *)supportedEvents {
|
|
33
|
-
return @[@"onPlaybackProgress", @"onPlaybackComplete"];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
- (void)startObserving {
|
|
37
|
-
_hasListeners = YES;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
- (void)stopObserving {
|
|
41
|
-
_hasListeners = NO;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
- (void)startProgressTimer {
|
|
45
|
-
if (_progressTimer) {
|
|
46
|
-
[_progressTimer invalidate];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
_progressTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
|
|
50
|
-
repeats:YES
|
|
51
|
-
block:^(NSTimer * _Nonnull timer) {
|
|
52
|
-
if (self->_hasListeners && self->_audioPlayer && self->_isPlaying) {
|
|
53
|
-
NSTimeInterval currentTime = self->_audioPlayer.currentTime;
|
|
54
|
-
NSTimeInterval duration = self->_audioPlayer.duration;
|
|
55
|
-
[self sendEventWithName:@"onPlaybackProgress"
|
|
56
|
-
body:@{
|
|
57
|
-
@"currentTime": @(currentTime * 1000),
|
|
58
|
-
@"duration": @(duration * 1000),
|
|
59
|
-
@"isPlaying": @(self->_audioPlayer.isPlaying)
|
|
60
|
-
}];
|
|
61
|
-
}
|
|
62
|
-
}];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
- (void)stopProgressTimer {
|
|
66
|
-
if (_progressTimer) {
|
|
67
|
-
[_progressTimer invalidate];
|
|
68
|
-
_progressTimer = nil;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
- (void)startPlaying:(NSDictionary *)options
|
|
73
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
74
|
-
reject:(RCTPromiseRejectBlock)reject {
|
|
75
|
-
@try {
|
|
76
|
-
NSString *filePath = options[@"filePath"];
|
|
77
|
-
if (!filePath) {
|
|
78
|
-
reject(@"INVALID_PATH", @"File path is required", nil);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
NSNumber *volume = options[@"volume"] ?: @(1.0);
|
|
83
|
-
NSNumber *loop = options[@"loop"] ?: @(NO);
|
|
84
|
-
|
|
85
|
-
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
|
|
86
|
-
NSError *error = nil;
|
|
87
|
-
|
|
88
|
-
// Setup audio session for playback
|
|
89
|
-
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
|
|
90
|
-
[audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
|
|
91
|
-
if (error) {
|
|
92
|
-
reject(@"AUDIO_SESSION_ERROR", error.description, error);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
[audioSession setActive:YES error:&error];
|
|
96
|
-
if (error) {
|
|
97
|
-
reject(@"AUDIO_SESSION_ERROR", error.description, error);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
|
|
102
|
-
if (error) {
|
|
103
|
-
reject(@"INIT_PLAYER_ERROR", error.description, error);
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
_audioPlayer.delegate = self;
|
|
108
|
-
_audioPlayer.volume = [volume floatValue];
|
|
109
|
-
_audioPlayer.numberOfLoops = [loop boolValue] ? -1 : 0;
|
|
110
|
-
|
|
111
|
-
if (![_audioPlayer prepareToPlay]) {
|
|
112
|
-
reject(@"PREPARE_ERROR", @"Failed to prepare audio player", nil);
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (![_audioPlayer play]) {
|
|
117
|
-
reject(@"START_PLAYING_ERROR", @"Failed to start playing", nil);
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
_isPlaying = YES;
|
|
122
|
-
_currentFilePath = filePath;
|
|
123
|
-
[self startProgressTimer];
|
|
124
|
-
resolve(nil);
|
|
125
|
-
} @catch (NSException *exception) {
|
|
126
|
-
reject(@"START_PLAYING_ERROR", exception.reason, nil);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
- (void)stopPlaying:(RCTPromiseResolveBlock)resolve
|
|
131
|
-
reject:(RCTPromiseRejectBlock)reject {
|
|
132
|
-
@try {
|
|
133
|
-
[self stopProgressTimer];
|
|
134
|
-
|
|
135
|
-
if (_audioPlayer) {
|
|
136
|
-
[_audioPlayer stop];
|
|
137
|
-
_audioPlayer = nil;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
_isPlaying = NO;
|
|
141
|
-
_currentFilePath = nil;
|
|
142
|
-
resolve(nil);
|
|
143
|
-
} @catch (NSException *exception) {
|
|
144
|
-
reject(@"STOP_PLAYING_ERROR", exception.reason, nil);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
- (void)pausePlaying:(RCTPromiseResolveBlock)resolve
|
|
149
|
-
reject:(RCTPromiseRejectBlock)reject {
|
|
150
|
-
@try {
|
|
151
|
-
if (!_isPlaying || !_audioPlayer) {
|
|
152
|
-
reject(@"NOT_PLAYING", @"No playback in progress", nil);
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
[_audioPlayer pause];
|
|
157
|
-
_isPlaying = NO;
|
|
158
|
-
resolve(nil);
|
|
159
|
-
} @catch (NSException *exception) {
|
|
160
|
-
reject(@"PAUSE_ERROR", exception.reason, nil);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
- (void)resumePlaying:(RCTPromiseResolveBlock)resolve
|
|
165
|
-
reject:(RCTPromiseRejectBlock)reject {
|
|
166
|
-
@try {
|
|
167
|
-
if (!_audioPlayer || _isPlaying) {
|
|
168
|
-
reject(@"NOT_PAUSED", @"Playback is not paused", nil);
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
[_audioPlayer play];
|
|
173
|
-
_isPlaying = YES;
|
|
174
|
-
resolve(nil);
|
|
175
|
-
} @catch (NSException *exception) {
|
|
176
|
-
reject(@"RESUME_ERROR", exception.reason, nil);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
- (void)seekToTime:(double)time
|
|
181
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
182
|
-
reject:(RCTPromiseRejectBlock)reject {
|
|
183
|
-
@try {
|
|
184
|
-
if (!_audioPlayer) {
|
|
185
|
-
reject(@"NO_PLAYER", @"No audio player initialized", nil);
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
_audioPlayer.currentTime = time;
|
|
190
|
-
resolve(nil);
|
|
191
|
-
} @catch (NSException *exception) {
|
|
192
|
-
reject(@"SEEK_ERROR", exception.reason, nil);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
- (void)setVolume:(double)volume
|
|
197
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
198
|
-
reject:(RCTPromiseRejectBlock)reject {
|
|
199
|
-
@try {
|
|
200
|
-
if (!_audioPlayer) {
|
|
201
|
-
reject(@"NO_PLAYER", @"No audio player initialized", nil);
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
_audioPlayer.volume = volume;
|
|
206
|
-
resolve(nil);
|
|
207
|
-
} @catch (NSException *exception) {
|
|
208
|
-
reject(@"SET_VOLUME_ERROR", exception.reason, nil);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
- (void)getPlayerStatus:(RCTPromiseResolveBlock)resolve
|
|
213
|
-
reject:(RCTPromiseRejectBlock)reject {
|
|
214
|
-
@try {
|
|
215
|
-
NSMutableDictionary *status = [NSMutableDictionary dictionary];
|
|
216
|
-
status[@"isPlaying"] = @(_isPlaying);
|
|
217
|
-
|
|
218
|
-
if (_audioPlayer) {
|
|
219
|
-
status[@"duration"] = @(_audioPlayer.duration * 1000);
|
|
220
|
-
status[@"currentTime"] = @(_audioPlayer.currentTime * 1000);
|
|
221
|
-
} else {
|
|
222
|
-
status[@"duration"] = @(0);
|
|
223
|
-
status[@"currentTime"] = @(0);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
if (_currentFilePath) {
|
|
227
|
-
status[@"currentFilePath"] = _currentFilePath;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
resolve(status);
|
|
231
|
-
} @catch (NSException *exception) {
|
|
232
|
-
reject(@"STATUS_ERROR", exception.reason, nil);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
#pragma mark - AVAudioPlayerDelegate
|
|
237
|
-
|
|
238
|
-
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player
|
|
239
|
-
successfully:(BOOL)flag {
|
|
240
|
-
_isPlaying = NO;
|
|
241
|
-
[self stopProgressTimer];
|
|
242
|
-
|
|
243
|
-
if (_hasListeners) {
|
|
244
|
-
[self sendEventWithName:@"onPlaybackComplete" body:@{}];
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player
|
|
249
|
-
error:(NSError *)error {
|
|
250
|
-
_isPlaying = NO;
|
|
251
|
-
[self stopProgressTimer];
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
@end
|
|
1
|
+
#import "NosniaAudioPlayer.h"
|
|
2
|
+
#import <AVFoundation/AVFoundation.h>
|
|
3
|
+
#import <React/RCTBridgeModule.h>
|
|
4
|
+
#import <React/RCTEventEmitter.h>
|
|
5
|
+
|
|
6
|
+
@interface NosniaAudioPlayer () <AVAudioPlayerDelegate>
|
|
7
|
+
@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
|
|
8
|
+
@property (nonatomic, assign) BOOL isPlaying;
|
|
9
|
+
@property (nonatomic, strong) NSTimer *progressTimer;
|
|
10
|
+
@property (nonatomic, strong) NSString *currentFilePath;
|
|
11
|
+
@end
|
|
12
|
+
|
|
13
|
+
@implementation NosniaAudioPlayer {
|
|
14
|
+
AVAudioPlayer *_audioPlayer;
|
|
15
|
+
BOOL _isPlaying;
|
|
16
|
+
NSTimer *_progressTimer;
|
|
17
|
+
NSString *_currentFilePath;
|
|
18
|
+
BOOL _hasListeners;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
RCT_EXPORT_MODULE(NosniaAudioPlayer)
|
|
22
|
+
|
|
23
|
+
- (instancetype)init {
|
|
24
|
+
self = [super init];
|
|
25
|
+
if (self) {
|
|
26
|
+
_isPlaying = NO;
|
|
27
|
+
_hasListeners = NO;
|
|
28
|
+
}
|
|
29
|
+
return self;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
- (NSArray<NSString *> *)supportedEvents {
|
|
33
|
+
return @[@"onPlaybackProgress", @"onPlaybackComplete"];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
- (void)startObserving {
|
|
37
|
+
_hasListeners = YES;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
- (void)stopObserving {
|
|
41
|
+
_hasListeners = NO;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
- (void)startProgressTimer {
|
|
45
|
+
if (_progressTimer) {
|
|
46
|
+
[_progressTimer invalidate];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
_progressTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
|
|
50
|
+
repeats:YES
|
|
51
|
+
block:^(NSTimer * _Nonnull timer) {
|
|
52
|
+
if (self->_hasListeners && self->_audioPlayer && self->_isPlaying) {
|
|
53
|
+
NSTimeInterval currentTime = self->_audioPlayer.currentTime;
|
|
54
|
+
NSTimeInterval duration = self->_audioPlayer.duration;
|
|
55
|
+
[self sendEventWithName:@"onPlaybackProgress"
|
|
56
|
+
body:@{
|
|
57
|
+
@"currentTime": @(currentTime * 1000),
|
|
58
|
+
@"duration": @(duration * 1000),
|
|
59
|
+
@"isPlaying": @(self->_audioPlayer.isPlaying)
|
|
60
|
+
}];
|
|
61
|
+
}
|
|
62
|
+
}];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
- (void)stopProgressTimer {
|
|
66
|
+
if (_progressTimer) {
|
|
67
|
+
[_progressTimer invalidate];
|
|
68
|
+
_progressTimer = nil;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
- (void)startPlaying:(NSDictionary *)options
|
|
73
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
74
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
75
|
+
@try {
|
|
76
|
+
NSString *filePath = options[@"filePath"];
|
|
77
|
+
if (!filePath) {
|
|
78
|
+
reject(@"INVALID_PATH", @"File path is required", nil);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
NSNumber *volume = options[@"volume"] ?: @(1.0);
|
|
83
|
+
NSNumber *loop = options[@"loop"] ?: @(NO);
|
|
84
|
+
|
|
85
|
+
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
|
|
86
|
+
NSError *error = nil;
|
|
87
|
+
|
|
88
|
+
// Setup audio session for playback
|
|
89
|
+
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
|
|
90
|
+
[audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
|
|
91
|
+
if (error) {
|
|
92
|
+
reject(@"AUDIO_SESSION_ERROR", error.description, error);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
[audioSession setActive:YES error:&error];
|
|
96
|
+
if (error) {
|
|
97
|
+
reject(@"AUDIO_SESSION_ERROR", error.description, error);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
|
|
102
|
+
if (error) {
|
|
103
|
+
reject(@"INIT_PLAYER_ERROR", error.description, error);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
_audioPlayer.delegate = self;
|
|
108
|
+
_audioPlayer.volume = [volume floatValue];
|
|
109
|
+
_audioPlayer.numberOfLoops = [loop boolValue] ? -1 : 0;
|
|
110
|
+
|
|
111
|
+
if (![_audioPlayer prepareToPlay]) {
|
|
112
|
+
reject(@"PREPARE_ERROR", @"Failed to prepare audio player", nil);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (![_audioPlayer play]) {
|
|
117
|
+
reject(@"START_PLAYING_ERROR", @"Failed to start playing", nil);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
_isPlaying = YES;
|
|
122
|
+
_currentFilePath = filePath;
|
|
123
|
+
[self startProgressTimer];
|
|
124
|
+
resolve(nil);
|
|
125
|
+
} @catch (NSException *exception) {
|
|
126
|
+
reject(@"START_PLAYING_ERROR", exception.reason, nil);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
- (void)stopPlaying:(RCTPromiseResolveBlock)resolve
|
|
131
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
132
|
+
@try {
|
|
133
|
+
[self stopProgressTimer];
|
|
134
|
+
|
|
135
|
+
if (_audioPlayer) {
|
|
136
|
+
[_audioPlayer stop];
|
|
137
|
+
_audioPlayer = nil;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
_isPlaying = NO;
|
|
141
|
+
_currentFilePath = nil;
|
|
142
|
+
resolve(nil);
|
|
143
|
+
} @catch (NSException *exception) {
|
|
144
|
+
reject(@"STOP_PLAYING_ERROR", exception.reason, nil);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
- (void)pausePlaying:(RCTPromiseResolveBlock)resolve
|
|
149
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
150
|
+
@try {
|
|
151
|
+
if (!_isPlaying || !_audioPlayer) {
|
|
152
|
+
reject(@"NOT_PLAYING", @"No playback in progress", nil);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
[_audioPlayer pause];
|
|
157
|
+
_isPlaying = NO;
|
|
158
|
+
resolve(nil);
|
|
159
|
+
} @catch (NSException *exception) {
|
|
160
|
+
reject(@"PAUSE_ERROR", exception.reason, nil);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
- (void)resumePlaying:(RCTPromiseResolveBlock)resolve
|
|
165
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
166
|
+
@try {
|
|
167
|
+
if (!_audioPlayer || _isPlaying) {
|
|
168
|
+
reject(@"NOT_PAUSED", @"Playback is not paused", nil);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
[_audioPlayer play];
|
|
173
|
+
_isPlaying = YES;
|
|
174
|
+
resolve(nil);
|
|
175
|
+
} @catch (NSException *exception) {
|
|
176
|
+
reject(@"RESUME_ERROR", exception.reason, nil);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
- (void)seekToTime:(double)time
|
|
181
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
182
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
183
|
+
@try {
|
|
184
|
+
if (!_audioPlayer) {
|
|
185
|
+
reject(@"NO_PLAYER", @"No audio player initialized", nil);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
_audioPlayer.currentTime = time;
|
|
190
|
+
resolve(nil);
|
|
191
|
+
} @catch (NSException *exception) {
|
|
192
|
+
reject(@"SEEK_ERROR", exception.reason, nil);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
- (void)setVolume:(double)volume
|
|
197
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
198
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
199
|
+
@try {
|
|
200
|
+
if (!_audioPlayer) {
|
|
201
|
+
reject(@"NO_PLAYER", @"No audio player initialized", nil);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
_audioPlayer.volume = volume;
|
|
206
|
+
resolve(nil);
|
|
207
|
+
} @catch (NSException *exception) {
|
|
208
|
+
reject(@"SET_VOLUME_ERROR", exception.reason, nil);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
- (void)getPlayerStatus:(RCTPromiseResolveBlock)resolve
|
|
213
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
214
|
+
@try {
|
|
215
|
+
NSMutableDictionary *status = [NSMutableDictionary dictionary];
|
|
216
|
+
status[@"isPlaying"] = @(_isPlaying);
|
|
217
|
+
|
|
218
|
+
if (_audioPlayer) {
|
|
219
|
+
status[@"duration"] = @(_audioPlayer.duration * 1000);
|
|
220
|
+
status[@"currentTime"] = @(_audioPlayer.currentTime * 1000);
|
|
221
|
+
} else {
|
|
222
|
+
status[@"duration"] = @(0);
|
|
223
|
+
status[@"currentTime"] = @(0);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (_currentFilePath) {
|
|
227
|
+
status[@"currentFilePath"] = _currentFilePath;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
resolve(status);
|
|
231
|
+
} @catch (NSException *exception) {
|
|
232
|
+
reject(@"STATUS_ERROR", exception.reason, nil);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
#pragma mark - AVAudioPlayerDelegate
|
|
237
|
+
|
|
238
|
+
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player
|
|
239
|
+
successfully:(BOOL)flag {
|
|
240
|
+
_isPlaying = NO;
|
|
241
|
+
[self stopProgressTimer];
|
|
242
|
+
|
|
243
|
+
if (_hasListeners) {
|
|
244
|
+
[self sendEventWithName:@"onPlaybackComplete" body:@{}];
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player
|
|
249
|
+
error:(NSError *)error {
|
|
250
|
+
_isPlaying = NO;
|
|
251
|
+
[self stopProgressTimer];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
@end
|
package/ios/Pods/Pods.xcodeproj/xcuserdata/nosnia.xcuserdatad/xcschemes/xcschememanagement.plist
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>SchemeUserState</key>
|
|
6
|
+
<dict/>
|
|
7
|
+
<key>SuppressBuildableAutocreation</key>
|
|
8
|
+
<dict/>
|
|
9
|
+
</dict>
|
|
10
|
+
</plist>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeEventEmitter","NativeModules","NativeModule","AudioPlayer","instance","progressListener","completeListener","constructor","eventEmitter","NosniaAudioPlayer","getInstance","addPlaybackProgressListener","callback","remove","addListener","data","removePlaybackProgressListener","addPlaybackCompleteListener","removePlaybackCompleteListener","startPlaying","options","config","volume","loop","error","console","stopPlaying","pausePlaying","resumePlaying","seekToTime","time","setVolume","clampedVolume","Math","max","min","getStatus","getPlayerStatus"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","NativeModules","NativeModule","AudioPlayer","instance","progressListener","completeListener","constructor","eventEmitter","NosniaAudioPlayer","getInstance","addPlaybackProgressListener","callback","remove","addListener","data","removePlaybackProgressListener","addPlaybackCompleteListener","removePlaybackCompleteListener","startPlaying","options","config","volume","loop","error","console","stopPlaying","pausePlaying","resumePlaying","seekToTime","time","setVolume","clampedVolume","Math","max","min","getStatus","getPlayerStatus"],"sourceRoot":"../../src","sources":["AudioPlayer.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeNosniaAudioPlayer.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAyBpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,mBAAmB,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeNosniaAudioRecorder.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAkCpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,qBAAqB,CAAC","ignoreList":[]}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeEventEmitter","NativeModules","NativeModule","AudioRecorder","instance","progressListener","constructor","console","log","nativeModule","NosniaAudioRecorder","Error","eventEmitter","getInstance","addRecordingProgressListener","callback","remove","addListener","data","error","removeRecordingProgressListener","requestPermission","requestAudioPermission","checkPermission","checkAudioPermission","startRecording","options","hasPermission","config","bitrate","channels","sampleRate","stopRecording","pauseRecording","resumeRecording","cancelRecording","getStatus","getRecorderStatus","testEventEmitter","debugInfo","info","NosniaAudioPlayer"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","NativeModules","NativeModule","AudioRecorder","instance","progressListener","constructor","console","log","nativeModule","NosniaAudioRecorder","Error","eventEmitter","getInstance","addRecordingProgressListener","callback","remove","addListener","data","error","removeRecordingProgressListener","requestPermission","requestAudioPermission","checkPermission","checkAudioPermission","startRecording","options","hasPermission","config","bitrate","channels","sampleRate","stopRecording","pauseRecording","resumeRecording","cancelRecording","getStatus","getRecorderStatus","testEventEmitter","debugInfo","info","NosniaAudioPlayer"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|