import React, { useMemo, useEffect, useState } from 'react'; import { audioBufferToMp3, blobFromAudioBuffer, cleanupFilename, delay, } from '../utils/utils'; interface AudioPlayerProps { audioBuffer: AudioBuffer; title: string; } export const AudioPlayer: React.FC = ({ audioBuffer, title, }) => { const [isConverting, setIsConverting] = useState(false); const [mp3Buffer, setMp3Buffer] = useState(null); const blobUrl = useMemo(() => { const wavBlob = blobFromAudioBuffer(audioBuffer); return URL.createObjectURL(wavBlob); }, [audioBuffer]); const downloadWavUrl = useMemo(() => { const wavBlob = blobFromAudioBuffer(audioBuffer); return URL.createObjectURL(wavBlob); }, [audioBuffer]); const downloadMp3Url = useMemo(() => { if (!mp3Buffer) return ''; const mp3Blob = new Blob([mp3Buffer], { type: 'audio/mp3' }); return URL.createObjectURL(mp3Blob); }, [audioBuffer]); // Clean up the object URL when the component unmounts or audioBuffer changes. useEffect(() => { return () => URL.revokeObjectURL(blobUrl); }, [blobUrl]); useEffect(() => { return () => URL.revokeObjectURL(downloadWavUrl); }, [downloadWavUrl]); useEffect(() => { return () => URL.revokeObjectURL(downloadMp3Url); }, [downloadMp3Url]); const convertToMp3 = async () => { setIsConverting(true); await delay(10); // wait a bit for the button to be rendered setMp3Buffer(audioBufferToMp3(audioBuffer)); setIsConverting(false); }; return (
Download WAV {mp3Buffer ? ( Download MP3 ) : ( )}
); };