Files
orion-visor/orion-ops-ui/src/utils/bell.ts
2024-01-13 02:49:25 +08:00

34 lines
1.1 KiB
TypeScript

/**
* 钟鸣
* @param frequency 蜂鸣器频率Hz
* @param duration 持续时间
*/
export const playBell = (frequency: number = 400, duration: number = .15) => {
try {
// 创建 AudioContext 对象
const audioCtx = new (window.AudioContext)();
const buffer = audioCtx.createBuffer(1, audioCtx.sampleRate, audioCtx.sampleRate);
const channelData = buffer.getChannelData(0);
// 获取正弦波形数据
const sampleRate = audioCtx.sampleRate;
const numSamples = Math.floor(duration * sampleRate);
const sineWaveData = [];
for (let i = 0; i < numSamples; ++i) {
const time = i / sampleRate;
// 计算当前样本点的值
const value = Math.sin(2 * Math.PI * frequency * time);
// 将值转换为-1到+1之间的范围内
sineWaveData[i] = value > 0 ? value : -value;
}
// 复制正弦波形数据到buffer中
for (let i = 0; i < sineWaveData.length; ++i) {
channelData[i] = sineWaveData[i];
}
const source = audioCtx.createBufferSource();
source.buffer = buffer;
source.connect(audioCtx.destination);
source.start();
} catch (e) {
}
};