Skip to content

Commit 8edc646

Browse files
committed
fix: avoid memory leak
1 parent 5cd8479 commit 8edc646

6 files changed

Lines changed: 36 additions & 7 deletions

File tree

example/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ const main = async () => {
7676
spectrogram.setData(ring.toArray());
7777
await new Promise((resolve) => setTimeout(resolve, 100));
7878
}
79+
80+
spectrogram.destroy();
7981
};
8082

8183
main();

src/core/DataChunk.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,8 @@ export class ChunkProcessor {
115115

116116
return imgData;
117117
}
118+
119+
dispose() {
120+
this.fft.dispose();
121+
}
118122
}

src/core/SpectrogramModel.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export type TimestampedData = Array<[number, number]>; // [timestamp, value]
2222
export class SpectrogramModel {
2323
config: SpectrogramConfig;
2424
data: SpectrogramData | null = null;
25+
26+
showRealTimeScale: boolean = false;
2527
startTime: number = 0;
2628

2729
// Derived properties
@@ -36,7 +38,10 @@ export class SpectrogramModel {
3638
}
3739

3840
setData(data: SpectrogramData | TimestampedData) {
39-
if (this.isTimestamped(data)) {
41+
const isTimestamped = this.isTimestamped(data);
42+
this.showRealTimeScale = isTimestamped;
43+
44+
if (isTimestamped) {
4045
if (data.length === 0) {
4146
this.data = new Float32Array(0);
4247
return;

src/render/AxisRenderer.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,16 @@ export class AxisRenderer {
7777

7878
// Draw Label
7979
const totalSeconds = startTimeStamp + timeRel * 1000;
80-
const date = new Date(totalSeconds);
81-
82-
const hh = date.getHours().toString().padStart(2, '0');
83-
const mm = date.getMinutes().toString().padStart(2, '0');
84-
const ss = date.getSeconds().toString().padStart(2, '0');
85-
const label = `${hh}:${mm}:${ss}`;
80+
let label = '';
81+
if (this.model.showRealTimeScale) {
82+
const date = new Date(totalSeconds);
83+
const hh = date.getHours().toString().padStart(2, '0');
84+
const mm = date.getMinutes().toString().padStart(2, '0');
85+
const ss = date.getSeconds().toString().padStart(2, '0');
86+
label = `${hh}:${mm}:${ss}`;
87+
} else if (totalSeconds >= 0) {
88+
label = `${Math.floor(tEnd - totalSeconds / 1000)}s`;
89+
}
8690

8791
// Adjust label position
8892
ctx.textAlign = 'center';

src/render/CanvasRenderer.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ export class CanvasRenderer {
4444
this.offscreenHelpers.clear();
4545
}
4646

47+
dispose() {
48+
this.clearCache();
49+
50+
this.offscreenCanvas = null;
51+
this.offscreenCtx = null;
52+
this.ctx = null;
53+
54+
this.processor.dispose();
55+
}
56+
4757
setupHiDPICanvas(canvas: HTMLCanvasElement, cssWidth: number, cssHeight: number) {
4858
const dpr = window.devicePixelRatio || 1;
4959

src/spectrogram.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ export class Spectrogram {
2424
this.renderer.clearCache();
2525
}
2626

27+
destroy() {
28+
this.renderer.dispose();
29+
}
30+
2731
render(options: Omit<RenderOptions, 'freqRange'> & { freqRange?: [number, number] }) {
2832
// Default freq range to [0, Nyquist] if not provided
2933
const nyquist = this.model.config.sampleRate / 2;

0 commit comments

Comments
 (0)