Skip to content

[iOS] Added setSpeed method for controlling playback speed #173

@asRizvi888

Description

@asRizvi888

Hi! 👋

Firstly, thanks for your work on this project! 🙂

Today I used patch-package to patch [email protected] for the project I'm working on.

Here is the diff that solved my problem:

diff --git a/node_modules/react-native-sound-player/android/src/main/java/com/johnsonsu/rnsoundplayer/RNSoundPlayerModule.java b/node_modules/react-native-sound-player/android/src/main/java/com/johnsonsu/rnsoundplayer/RNSoundPlayerModule.java
index f8c4f2a..d6432c4 100644
--- a/node_modules/react-native-sound-player/android/src/main/java/com/johnsonsu/rnsoundplayer/RNSoundPlayerModule.java
+++ b/node_modules/react-native-sound-player/android/src/main/java/com/johnsonsu/rnsoundplayer/RNSoundPlayerModule.java
@@ -36,6 +36,7 @@ public class RNSoundPlayerModule extends ReactContextBaseJavaModule implements L
   private MediaPlayer mediaPlayer;
   private float volume;
   private AudioManager audioManager;
+  private float speed = 1.0f;
 
   public RNSoundPlayerModule(ReactApplicationContext reactContext) {
     super(reactContext);
@@ -103,10 +104,19 @@ public class RNSoundPlayerModule extends ReactContextBaseJavaModule implements L
     }
   }
 
+  // @ReactMethod
+  // public void resume() throws IOException, IllegalStateException {
+  //   if (this.mediaPlayer != null) {
+  //     this.setVolume(this.volume);
+  //     this.mediaPlayer.start();
+  //   }
+  // }
+
   @ReactMethod
   public void resume() throws IOException, IllegalStateException {
     if (this.mediaPlayer != null) {
       this.setVolume(this.volume);
+      this.setSpeed(this.speed);
       this.mediaPlayer.start();
     }
   }
@@ -133,6 +143,14 @@ public class RNSoundPlayerModule extends ReactContextBaseJavaModule implements L
     }
   }
 
+  @ReactMethod
+  public void setSpeed(float speed) throws IOException {
+    this.speed = speed;
+    if (this.mediaPlayer != null) {
+      this.mediaPlayer.setPlaybackParams(mediaPlayer.getPlaybackParams().setSpeed(speed));
+    }
+  }
+
   @ReactMethod
   public void getInfo(
           Promise promise) {
diff --git a/node_modules/react-native-sound-player/index.d.ts b/node_modules/react-native-sound-player/index.d.ts
index 5b72f4c..c7fc782 100644
--- a/node_modules/react-native-sound-player/index.d.ts
+++ b/node_modules/react-native-sound-player/index.d.ts
@@ -50,6 +50,8 @@ declare module "react-native-sound-player" {
     setMixAudio: (on: boolean) => void;
     /** IOS only. Set the number of loops. A negative value will loop indefinitely until the stop() command is called. */
     setNumberOfLoops: (loops: number) => void;
+    /**Set playback speed, Default is set to 1 */
+    setSpeed: (speed: number) => void;
     /** Get the currentTime and duration of the currently mounted audio media. This function returns a promise which resolves to an Object containing currentTime and duration properties. */
     getInfo: () => Promise<{ currentTime: number; duration: number }>;
     /** @deprecated Please use addEventListener and remove your own listener by calling yourSubscriptionObject.remove(). */
diff --git a/node_modules/react-native-sound-player/index.js b/node_modules/react-native-sound-player/index.js
index f15fdb3..c983151 100644
--- a/node_modules/react-native-sound-player/index.js
+++ b/node_modules/react-native-sound-player/index.js
@@ -123,6 +123,10 @@ export default {
     }
   },
 
+  setSpeed: (volume: number) => {
+     RNSoundPlayer.setSpeed(volume);
+  },
+
   getInfo: async () => RNSoundPlayer.getInfo(),
 
   unmount: () => {
diff --git a/node_modules/react-native-sound-player/ios/RNSoundPlayer.m b/node_modules/react-native-sound-player/ios/RNSoundPlayer.m
index bef6d87..478521d 100644
--- a/node_modules/react-native-sound-player/ios/RNSoundPlayer.m
+++ b/node_modules/react-native-sound-player/ios/RNSoundPlayer.m
@@ -168,6 +168,16 @@ -(void)stopObserving {
     }
 }
 
+RCT_EXPORT_METHOD(setSpeed:(float)speed) {
+    if (self.player != nil) {
+        self.player.enableRate = YES;
+        self.player.rate = speed;
+    } 
+    if (self.avPlayer != nil) {
+        self.avPlayer.rate = speed;
+    }
+}
+
 RCT_REMAP_METHOD(getInfo,
                  getInfoWithResolver:(RCTPromiseResolveBlock)resolve
                  rejecter:(RCTPromiseRejectBlock)reject) {

This issue body was partially generated by patch-package.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions