@infinityfx/lively
Version:
Feature complete, lightweight react animation library.
4 lines (3 loc) • 1.38 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:c=2e3,smoothing:i=.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 v(){if(!s.current)return;s.current.getFloatFrequencyData(u.current);const e=m(),n=Math.floor(a/24e3*1024),t=Math.floor(c/24e3*1024);for(let r=0;r<o;r++){const a=n+(t-n)/o*r,c=Math.floor(a),i=Math.ceil(a),s=a-c,l=u.current[c]*(1-s)+u.current[i]*s;e[r]=Math.max(0,(100+l)/70)}m.set(e),f=requestAnimationFrame(v)}function y(){"suspended"===r.state&&r.resume(),f=requestAnimationFrame(v)}function p(){cancelAnimationFrame(f),m.set(new Array(o).fill(0),{duration:.3})}return n((()=>{const e=d.current;if(e)return r||(r=new AudioContext),s.current||(s.current=new AnalyserNode(r,{fftSize:2048,smoothingTimeConstant:i})),l.current||(l.current=r.createMediaElementSource(e)),s.current.connect(r.destination),l.current.connect(s.current),e.addEventListener("play",y),e.addEventListener("pause",p),e.addEventListener("ended",p),()=>{var n,t;null===(n=s.current)||void 0===n||n.disconnect(),null===(t=l.current)||void 0===t||t.disconnect(),e.removeEventListener("play",y),e.removeEventListener("pause",p),e.removeEventListener("ended",p)}}),[]),[d,m]}export{o as default};
//# sourceMappingURL=use-audio.js.map