Skip to content

Commit 3f31e64

Browse files
Merge pull request #75 from SimformSolutionsPvtLtd/fix/UNT-T28557_Audio_play_from_seek_position_on_stop_to_play_mode
fix(UNT-T28557): Audio play from seek position on stop to play mode
2 parents 4447aee + c6e2b7e commit 3f31e64

File tree

7 files changed

+24
-6
lines changed

7 files changed

+24
-6
lines changed

android/src/main/java/com/audiowaveform/AudioPlayer.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ class AudioPlayer(
2525
private var updateFrequency = UpdateFrequency.Low
2626
private lateinit var audioPlaybackListener: CountDownTimer
2727

28-
fun preparePlayer(path: String?, volume: Int?, frequency: UpdateFrequency, promise: Promise) {
28+
fun preparePlayer(
29+
path: String?,
30+
volume: Int?,
31+
frequency: UpdateFrequency,
32+
progress: Long,
33+
promise: Promise
34+
) {
2935
if (path != null) {
3036
isPlayerPrepared = false
3137
updateFrequency = frequency
@@ -42,6 +48,7 @@ class AudioPlayer(
4248
if (!isPlayerPrepared) {
4349
if (state == Player.STATE_READY) {
4450
player.volume = (volume ?: 1).toFloat()
51+
player.seekTo(progress)
4552
isPlayerPrepared = true
4653
val duration = player.duration
4754
promise.resolve(duration.toString())

android/src/main/java/com/audiowaveform/AudioWaveformModule.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,19 @@ class AudioWaveformModule(context: ReactApplicationContext): ReactContextBaseJav
109109
val key = obj.getString(Constants.playerKey)
110110
val frequency = obj.getInt(Constants.updateFrequency)
111111
val volume = obj.getInt(Constants.volume)
112+
val progress = if (!obj.hasKey(Constants.progress) || obj.isNull(Constants.progress)) {
113+
0 // Set default progress to zero if null, undefined, or missing
114+
} else {
115+
obj.getInt(Constants.progress).toLong()
116+
}
117+
112118
if (key != null) {
113119
initPlayer(key)
114120
audioPlayers[key]?.preparePlayer(
115121
path,
116122
volume,
117123
getUpdateFrequency(frequency),
124+
progress,
118125
promise
119126
)
120127
} else {

example/src/App.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import { generateAudioList, type ListItem } from './constants';
3535
import stylesheet from './styles';
3636
import { Colors } from './theme';
3737

38-
const ListItem = React.memo(
38+
const RenderListItem = React.memo(
3939
({
4040
item,
4141
currentPlaying,
@@ -244,7 +244,7 @@ const AppContainer = () => {
244244
</View>
245245
<ScrollView scrollEnabled={shouldScroll}>
246246
{list.map(item => (
247-
<ListItem
247+
<RenderListItem
248248
key={item.path}
249249
currentPlaying={currentPlaying}
250250
setCurrentPlaying={setCurrentPlaying}

ios/AudioPlayer.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate {
2727
super.init()
2828
}
2929

30-
func preparePlayer(_ path: String?, volume: Double?, updateFrequency: UpdateFrequency, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
30+
func preparePlayer(_ path: String?, volume: Double?, updateFrequency: UpdateFrequency, time: Double, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
3131
if(!(path ?? "").isEmpty) {
3232
self.updateFrequency = updateFrequency
3333
let audioUrl = URL.init(string: path!)
@@ -40,6 +40,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate {
4040
player = try AVAudioPlayer(contentsOf: audioUrl!)
4141
player?.prepareToPlay()
4242
player?.volume = Float(volume ?? 100.0)
43+
player?.currentTime = Double(time / 1000)
4344
resolve(true)
4445
} catch let error as NSError {
4546
reject(Constants.audioWaveforms, error.localizedDescription, error)

ios/AudioWaveform.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ class AudioWaveform: RCTEventEmitter {
142142
audioPlayers[key!]?.preparePlayer(args?[Constants.path] as? String,
143143
volume: args?[Constants.volume] as? Double,
144144
updateFrequency: UpdateFrequency(rawValue: (args?[Constants.updateFrequency]) as? Double ?? 0) ?? UpdateFrequency.medium,
145+
time: args?[Constants.progress] as? Double ?? 0,
145146
resolver: resolve,
146147
rejecter: reject)
147148
} else {

src/components/Waveform/Waveform.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,15 @@ export const Waveform = forwardRef<IWaveformRef, IWaveform>((props, ref) => {
9090

9191
const { checkHasAudioRecorderPermission } = useAudioPermission();
9292

93-
const preparePlayerForPath = async () => {
93+
const preparePlayerForPath = async (progress?: number) => {
9494
if (!isNil(path) && !isEmpty(path)) {
9595
try {
9696
const prepare = await preparePlayer({
9797
path,
9898
playerKey: `PlayerFor${path}`,
9999
updateFrequency: UpdateFrequency.medium,
100100
volume: volume,
101+
progress,
101102
});
102103
return Promise.resolve(prepare);
103104
} catch (err) {
@@ -205,7 +206,7 @@ export const Waveform = forwardRef<IWaveformRef, IWaveform>((props, ref) => {
205206
if (mode === 'static') {
206207
try {
207208
if (playerState === PlayerState.stopped) {
208-
await preparePlayerForPath();
209+
await preparePlayerForPath(currentProgress);
209210
}
210211

211212
const play = await playPlayer({

src/types/AudioWaveformTypes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export interface IExtractWaveform extends IPlayerKey, IPlayerPath {
2929
export interface IPreparePlayer extends IPlayerKey, IPlayerPath {
3030
updateFrequency?: UpdateFrequency;
3131
volume?: number;
32+
progress?: number;
3233
}
3334

3435
export interface IStartPlayer extends IPlayerKey {

0 commit comments

Comments
 (0)