Skip to content

Commit f31895b

Browse files
ndbroadbentbenvium
authored andcommitted
Fix callback crashes - Guarantee that the RN callback is only ever called once (#168)
* Make sure the RN callback is only ever called once * Fix callback crash on Windows
1 parent 31132db commit f31895b

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

RNSound/RNSound.m

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,13 @@ -(NSString *) getDirectory:(int)directory {
4444
-(void) audioPlayerDidFinishPlaying:(AVAudioPlayer*)player
4545
successfully:(BOOL)flag {
4646
NSNumber* key = [self keyForPlayer:player];
47-
if (key != nil) {
48-
@synchronized(key) {
49-
RCTResponseSenderBlock callback = [self callbackForKey:key];
50-
if (callback) {
51-
callback(@[@(flag)]);
52-
}
47+
if (key == nil) return;
48+
49+
@synchronized(key) {
50+
RCTResponseSenderBlock callback = [self callbackForKey:key];
51+
if (callback) {
52+
callback(@[@(flag)]);
53+
[[self callbackPool] removeObjectForKey:key];
5354
}
5455
}
5556
}

android/src/main/java/com/zmxv/RNSound/RNSoundModule.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,24 @@ public void play(final Integer key, final Callback callback) {
8787
return;
8888
}
8989
player.setOnCompletionListener(new OnCompletionListener() {
90+
boolean callbackWasCalled = false;
91+
9092
@Override
9193
public synchronized void onCompletion(MediaPlayer mp) {
9294
if (!mp.isLooping()) {
95+
if (callbackWasCalled) return;
96+
callbackWasCalled = true;
9397
callback.invoke(true);
9498
}
9599
}
96100
});
97101
player.setOnErrorListener(new OnErrorListener() {
102+
boolean callbackWasCalled = false;
103+
98104
@Override
99105
public synchronized boolean onError(MediaPlayer mp, int what, int extra) {
106+
if (callbackWasCalled) return true;
107+
callbackWasCalled = true;
100108
callback.invoke(false);
101109
return true;
102110
}

windows/RNSoundModule/RNSoundModule/RNSound.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPrio
142142
[ReactMethod]
143143
public void play(int key, ICallback callback)
144144
{
145+
Boolean callbackWasCalled = false;
145146
MediaPlayer player = null;
146147
Debug.WriteLine("play()");
147148

@@ -167,6 +168,8 @@ public void play(int key, ICallback callback)
167168
player.MediaEnded +=
168169
delegate
169170
{
171+
if (callbackWasCalled) return;
172+
callbackWasCalled = true;
170173
Debug.WriteLine("Media Ended");
171174
callback.Invoke(true);
172175
};

0 commit comments

Comments
 (0)