Skip to content

Commit 8bbc51a

Browse files
committed
feat(hook): added audioDuration return value for useWaveform
1 parent f701d91 commit 8bbc51a

2 files changed

Lines changed: 17 additions & 6 deletions

File tree

example/src/components/visualizaion/EchoWaveform.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,16 @@ import { useEffect } from 'react'
1010
import { Play, Square, Pause, Repeat, VolumeX } from 'lucide-react'
1111

1212
export const EchoWaveform = () => {
13-
const url = 'https://codeacme17.github.io/1llest-waveform-vue/audios/loop-6.mp3'
13+
const url = 'https://codeacme17.github.io/1llest-waveform-vue/audios/loop-3.mp3'
1414

1515
const { pending, error, audioBuffer, fetchAudio } = useFetchAudio({ url })
16-
const { data } = useWaveform({ audioBuffer })
16+
const { data, audioDuration } = useWaveform({ audioBuffer })
1717
const {
1818
isReady,
1919
isPlaying,
2020
loop,
2121
mute,
2222
percentage,
23-
audioDuration,
2423
init,
2524
setMute,
2625
setLoop,
@@ -62,7 +61,6 @@ export const EchoWaveform = () => {
6261
percentage={percentage}
6362
onClick={handleClick}
6463
waveHeight={100}
65-
hideCursorLabel
6664
className="w-full"
6765
/>
6866

packages/hooks/useWaveform.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from 'react'
1+
import { useEffect, useRef, useState } from 'react'
22
import { logger } from '../lib/log'
33

44
export interface UseWaveformProps {
@@ -32,18 +32,31 @@ export const useWaveform = (props: UseWaveformProps) => {
3232
const { audioBuffer, channel = CHANNEL, samples = SAMPLES } = props
3333

3434
const [data, setData] = useState<number[][] | number[]>([])
35+
const audioDuration = useRef(0)
3536
const [error, setError] = useState(false)
3637
const [errorMessage, setErrorMessage] = useState('')
3738

3839
useEffect(() => {
3940
if (data.length) return
4041
loadAndDecodeAudio()
42+
getAudioDuration()
4143
}, [channel, samples, audioBuffer])
4244

4345
useEffect(() => {
4446
if (error) logger.error(errorMessage)
4547
}, [error])
4648

49+
const getAudioDuration = () => {
50+
if (error || !audioBuffer) return
51+
52+
try {
53+
audioDuration.current = audioBuffer.duration
54+
} catch (err) {
55+
setError(true)
56+
setErrorMessage(err as string)
57+
}
58+
}
59+
4760
const loadAndDecodeAudio = async () => {
4861
if (error || !audioBuffer) return
4962

@@ -80,5 +93,5 @@ export const useWaveform = (props: UseWaveformProps) => {
8093
}
8194
}
8295

83-
return { data, error, errorMessage }
96+
return { data, audioDuration, error, errorMessage }
8497
}

0 commit comments

Comments
 (0)