Files
prism/test/vectorscope-native.test.mjs
T

56 lines
2.0 KiB
JavaScript

import assert from 'node:assert/strict'
import { createRequire } from 'node:module'
import test from 'node:test'
const require = createRequire(import.meta.url)
const { vectorscope } = require('../native/build/Release/visualizer_dsp.node')
function createHighFrequencyStereo(frequencyHz, sampleRate, length) {
const left = new Float32Array(length)
const right = new Float32Array(length)
for (let index = 0; index < length; index += 1) {
const phase = 2 * Math.PI * frequencyHz * index / sampleRate
left[index] = 0.75 * Math.sin(phase)
right[index] = -0.4 * Math.cos(phase)
}
return { left, right }
}
function assertArrayAlmostEqual(actual, expected, tolerance, message) {
assert.equal(actual.length, expected.length, `${message} length`)
for (let index = 0; index < expected.length; index += 1) {
assert.ok(
Math.abs(actual[index] - expected[index]) <= tolerance,
`${message} sample ${index}: expected ${expected[index]} +/- ${tolerance}, got ${actual[index]}`,
)
}
}
test('native vectorscope preserves full-band channel samples above the former 8 kHz cutoff', () => {
const length = 512
for (const sampleRate of [44100, 48000, 96000]) {
const frequencyHz = 12000
const { left, right } = createHighFrequencyStereo(frequencyHz, sampleRate, length)
vectorscope.setSampleRate(sampleRate)
vectorscope.reset()
vectorscope.pushSamples(left, right)
const result = vectorscope.getPoints(length)
assert.equal(result.count, length)
assertArrayAlmostEqual(result.x, right, 1e-7, `${sampleRate}Hz right/X`)
assertArrayAlmostEqual(result.y, left, 1e-7, `${sampleRate}Hz left/Y`)
}
})
test('native vectorscope legacy process keeps the renderer-facing X/Y channel shape', () => {
const { left, right } = createHighFrequencyStereo(15000, 48000, 256)
vectorscope.setSampleRate(48000)
vectorscope.reset()
const result = vectorscope.process(left, right)
assertArrayAlmostEqual(result.x, right, 1e-7, 'legacy right/X')
assertArrayAlmostEqual(result.y, left, 1e-7, 'legacy left/Y')
})