Skip to content

Commit 146a6e2

Browse files
slycoderzmxv
authored andcommitted
Fix release()-ing of items from the callback pool (#476)
* Fix release()-ing of items from the callback pool These were being removed according to the wrong key. * Fix race condition looking up key * Add more synchronization
1 parent f3b0183 commit 146a6e2

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

RNSound/RNSound.m

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ -(NSString *) getDirectory:(int)directory {
6767

6868
-(void) audioPlayerDidFinishPlaying:(AVAudioPlayer*)player
6969
successfully:(BOOL)flag {
70-
NSNumber* key = [self keyForPlayer:player];
71-
if (key == nil) return;
70+
@synchronized(self) {
71+
NSNumber* key = [self keyForPlayer:player];
72+
if (key == nil) return;
7273

73-
@synchronized(key) {
7474
[self setOnPlay:NO forPlayerKey:key];
7575
RCTResponseSenderBlock callback = [self callbackForKey:key];
7676
if (callback) {
@@ -199,12 +199,14 @@ -(NSDictionary *)constantsToExport {
199199
}
200200

201201
if (player) {
202-
player.delegate = self;
203-
player.enableRate = YES;
204-
[player prepareToPlay];
205-
[[self playerPool] setObject:player forKey:key];
206-
callback(@[[NSNull null], @{@"duration": @(player.duration),
207-
@"numberOfChannels": @(player.numberOfChannels)}]);
202+
@synchronized(self) {
203+
player.delegate = self;
204+
player.enableRate = YES;
205+
[player prepareToPlay];
206+
[[self playerPool] setObject:player forKey:key];
207+
callback(@[[NSNull null], @{@"duration": @(player.duration),
208+
@"numberOfChannels": @(player.numberOfChannels)}]);
209+
}
208210
} else {
209211
callback(@[RCTJSErrorFromNSError(error)]);
210212
}
@@ -240,13 +242,15 @@ -(NSDictionary *)constantsToExport {
240242
}
241243

242244
RCT_EXPORT_METHOD(release:(nonnull NSNumber*)key) {
243-
AVAudioPlayer* player = [self playerForKey:key];
244-
if (player) {
245-
[player stop];
246-
[[self callbackPool] removeObjectForKey:player];
247-
[[self playerPool] removeObjectForKey:key];
248-
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
249-
[notificationCenter removeObserver:self];
245+
@synchronized(self) {
246+
AVAudioPlayer* player = [self playerForKey:key];
247+
if (player) {
248+
[player stop];
249+
[[self callbackPool] removeObjectForKey:key];
250+
[[self playerPool] removeObjectForKey:key];
251+
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
252+
[notificationCenter removeObserver:self];
253+
}
250254
}
251255
}
252256

0 commit comments

Comments
 (0)