11import { useState , useEffect , useRef } from 'react' ;
2+ import { useState , useMemo } from 'react' ;
23import Display from './Display' ;
34
45/**
@@ -96,6 +97,53 @@ function EQ({ wasmModule, width, height, freqs: liveFreqs, eq, setEq }) {
9697 />
9798 </ div >
9899 ) ;
100+ const processedFreqs = useMemo ( ( ) => {
101+ if ( ! wasmModule || ! liveFreqs ) return [ ] ;
102+
103+ let nodesVec , curvesVec , freqsVec ;
104+ try {
105+ // Manually convert JS arrays to the Embind Vector types.
106+ nodesVec = new wasmModule . VectorNode ( ) ;
107+ nodes . forEach ( node => nodesVec . push_back ( node ) ) ;
108+
109+ curvesVec = new wasmModule . VectorDouble ( ) ;
110+ curves . forEach ( curve => curvesVec . push_back ( curve ) ) ;
111+
112+ freqsVec = new wasmModule . VectorVectorDouble ( ) ;
113+ ( liveFreqs || [ ] ) . forEach ( freqPair => {
114+ const pair = new wasmModule . VectorDouble ( ) ;
115+ pair . push_back ( freqPair [ 0 ] ) ;
116+ pair . push_back ( freqPair [ 1 ] ) ;
117+ freqsVec . push_back ( pair ) ;
118+ pair . delete ( ) ;
119+ } ) ;
120+
121+ return wasmModule . applyEnvelope ( nodesVec , curvesVec , freqsVec ) ;
122+ } finally {
123+ // Ensure memory is always freed, even if an error occurs.
124+ if ( nodesVec ) nodesVec . delete ( ) ;
125+ if ( curvesVec ) curvesVec . delete ( ) ;
126+ if ( freqsVec ) freqsVec . delete ( ) ;
127+ }
128+ } , [ wasmModule , nodes , curves , liveFreqs ] ) ;
129+
130+ return (
131+ < div className = 'EQ' >
132+ < h3 > Frequency EQ</ h3 >
133+ < Display
134+ width = { width }
135+ height = { height }
136+ nodes = { nodes }
137+ xRange = { xRange }
138+ curves = { curves }
139+ onNodesChange = { setNodes }
140+ onCurvesChange = { setCurves }
141+ freqs = { processedFreqs }
142+ isLogarithmic = { true }
143+ wasmModule = { wasmModule }
144+ />
145+ </ div >
146+ ) ;
99147}
100148
101149export default EQ ;
0 commit comments