@infinityfx/lively
Version:
Feature complete, lightweight react animation library.
4 lines (3 loc) • 1.31 kB
JavaScript
"use client";
import{useRef as e,useEffect as n}from"react";import t from"./use-link.js";let r;function o({bands:o=8,minFrequency:a=100,maxFrequency:i=2e3,smoothing:c=.7}={}){const u=e(new Float32Array(1024)),s=e(void 0),l=e(void 0),d=e(null),m=t(new Array(8).fill(0));let f;function g(){if(!s.current)return;s.current.getFloatFrequencyData(u.current);const e=m(),n=Math.floor(a/24e3*1024),t=Math.floor(i/24e3*1024);for(let r=0;r<o;r++){const a=n+(t-n)/o*r,i=Math.floor(a),c=Math.ceil(a),s=a-i,l=u.current[i]*(1-s)+u.current[c]*s;e[r]=Math.max(0,(100+l)/70)}m.set(e),f=requestAnimationFrame(g)}function A(){cancelAnimationFrame(f),m.set(new Array(o).fill(0),{duration:.3})}return n((()=>{const e=d.current,n=new AbortController;if(e)return r||(r=new AudioContext),s.current||(s.current=new AnalyserNode(r,{fftSize:2048,smoothingTimeConstant:c})),l.current||(l.current=r.createMediaElementSource(e)),s.current.connect(r.destination),l.current.connect(s.current),e.addEventListener("play",(()=>{"suspended"===r.state&&r.resume(),f=requestAnimationFrame(g)}),{signal:n.signal}),e.addEventListener("pause",A,{signal:n.signal}),e.addEventListener("ended",A,{signal:n.signal}),()=>{n.abort(),s.current?.disconnect(),l.current?.disconnect()}}),[]),[d,m]}export{o as default};
//# sourceMappingURL=use-audio.js.map