UNPKG

@ng-web-apis/audio

Version:

This is a library for declarative use of Web Audio API with Angular

119 lines 17.5 kB
import { Attribute, Directive, inject, Output } from '@angular/core'; import { animationFrameScheduler, interval, map, share } from 'rxjs'; import { AUDIO_CONTEXT } from '../tokens/audio-context'; import { asAudioNode, AUDIO_NODE } from '../tokens/audio-node'; import { CONSTRUCTOR_SUPPORT } from '../tokens/constructor-support'; import { connect } from '../utils/connect'; import { parse } from '../utils/parse'; import * as i0 from "@angular/core"; class WebAudioAnalyser extends AnalyserNode { // '!' because it is actually set in constructor frequencyByte$; frequencyFloat$; timeByte$; timeFloat$; // eslint-disable-next-line @typescript-eslint/max-params constructor(fftSizeArg, maxDecibelsArg, minDecibelsArg, smoothingTimeConstantArg) { const context = inject(AUDIO_CONTEXT); const node = inject(AUDIO_NODE, { skipSelf: true }); const modern = inject(CONSTRUCTOR_SUPPORT); const fftSize = parse(fftSizeArg, 2048); const maxDecibels = parse(maxDecibelsArg, -30); const minDecibels = parse(minDecibelsArg, -100); const smoothingTimeConstant = parse(smoothingTimeConstantArg, 0.8); if (modern) { super(context, { fftSize, maxDecibels, minDecibels, smoothingTimeConstant }); WebAudioAnalyser.init(this, node); } else { const result = context.createAnalyser(); Object.setPrototypeOf(result, WebAudioAnalyser.prototype); WebAudioAnalyser.init(result, node); result.fftSize = fftSize; result.maxDecibels = maxDecibels; result.minDecibels = minDecibels; result.smoothingTimeConstant = smoothingTimeConstant; return result; } } static init(that, node) { connect(node, that); let freqByte = new Uint8Array(that.frequencyBinCount); let freqFloat = new Float32Array(that.frequencyBinCount); let timeByte = new Uint8Array(that.fftSize); let timeFloat = new Float32Array(that.fftSize); that.frequencyByte$ = interval(0, animationFrameScheduler).pipe(map(() => { if (freqByte.length !== that.frequencyBinCount) { freqByte = new Uint8Array(that.frequencyBinCount); } that.getByteFrequencyData(freqByte); return freqByte; }), share()); that.frequencyFloat$ = interval(0, animationFrameScheduler).pipe(map(() => { if (freqFloat.length !== that.frequencyBinCount) { freqFloat = new Float32Array(that.frequencyBinCount); } that.getFloatFrequencyData(freqFloat); return freqFloat; }), share()); that.timeByte$ = interval(0, animationFrameScheduler).pipe(map(() => { if (timeByte.length !== that.fftSize) { timeByte = new Uint8Array(that.frequencyBinCount); } that.getByteTimeDomainData(timeByte); return timeByte; }), share()); that.timeFloat$ = interval(0, animationFrameScheduler).pipe(map(() => { if (timeFloat.length !== that.fftSize) { timeFloat = new Float32Array(that.frequencyBinCount); } that.getFloatTimeDomainData(timeFloat); return timeFloat; }), share()); } ngOnDestroy() { this.disconnect(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioAnalyser, deps: [{ token: 'fftSize', attribute: true }, { token: 'maxDecibels', attribute: true }, { token: 'minDecibels', attribute: true }, { token: 'smoothingTimeConstant', attribute: true }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: WebAudioAnalyser, isStandalone: true, selector: "[waAnalyserNode]", inputs: { fftSize: "fftSize", minDecibels: "minDecibels", maxDecibels: "maxDecibels", smoothingTimeConstant: "smoothingTimeConstant", channelCount: "channelCount", channelCountMode: "channelCountMode", channelInterpretation: "channelInterpretation" }, outputs: { frequencyByte$: "frequencyByte$", frequencyFloat$: "frequencyFloat$", timeByte$: "timeByte$", timeFloat$: "timeFloat$" }, providers: [asAudioNode(WebAudioAnalyser)], exportAs: ["AudioNode"], usesInheritance: true, ngImport: i0 }); } export { WebAudioAnalyser }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioAnalyser, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[waAnalyserNode]', inputs: [ 'fftSize', 'minDecibels', 'maxDecibels', 'smoothingTimeConstant', 'channelCount', 'channelCountMode', 'channelInterpretation', ], providers: [asAudioNode(WebAudioAnalyser)], exportAs: 'AudioNode', }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Attribute, args: ['fftSize'] }] }, { type: undefined, decorators: [{ type: Attribute, args: ['maxDecibels'] }] }, { type: undefined, decorators: [{ type: Attribute, args: ['minDecibels'] }] }, { type: undefined, decorators: [{ type: Attribute, args: ['smoothingTimeConstant'] }] }]; }, propDecorators: { frequencyByte$: [{ type: Output }], frequencyFloat$: [{ type: Output }], timeByte$: [{ type: Output }], timeFloat$: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHlzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2F1ZGlvL3NyYy9ub2Rlcy9hbmFseXNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRW5FLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVuRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGdCQUFnQixDQUFDOztBQUVyQyxNQWVhLGdCQUFpQixTQUFRLFlBQVk7SUFDOUMsZ0RBQWdEO0lBRXpDLGNBQWMsQ0FBMEI7SUFHeEMsZUFBZSxDQUE0QjtJQUczQyxTQUFTLENBQTBCO0lBR25DLFVBQVUsQ0FBNEI7SUFFN0MseURBQXlEO0lBQ3pELFlBQzBCLFVBQXlCLEVBQ3JCLGNBQTZCLEVBQzdCLGNBQTZCLEVBQ25CLHdCQUF1QztRQUUzRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFD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QkFDMUMsUUFBUSxFQUFFLFdBQVc7aUJBQ3hCOzswQkFpQlEsU0FBUzsyQkFBQyxTQUFTOzswQkFDbkIsU0FBUzsyQkFBQyxhQUFhOzswQkFDdkIsU0FBUzsyQkFBQyxhQUFhOzswQkFDdkIsU0FBUzsyQkFBQyx1QkFBdUI7NENBaEIvQixjQUFjO3NCQURwQixNQUFNO2dCQUlBLGVBQWU7c0JBRHJCLE1BQU07Z0JBSUEsU0FBUztzQkFEZixNQUFNO2dCQUlBLFVBQVU7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7T25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QXR0cmlidXRlLCBEaXJlY3RpdmUsIGluamVjdCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7YW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsIGludGVydmFsLCBtYXAsIHNoYXJlfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBVURJT19DT05URVhUfSBmcm9tICcuLi90b2tlbnMvYXVkaW8tY29udGV4dCc7XG5pbXBvcnQge2FzQXVkaW9Ob2RlLCBBVURJT19OT0RFfSBmcm9tICcuLi90b2tlbnMvYXVkaW8tbm9kZSc7XG5pbXBvcnQge0NPTlNUUlVDVE9SX1NVUFBPUlR9IGZyb20gJy4uL3Rva2Vucy9jb25zdHJ1Y3Rvci1zdXBwb3J0JztcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAnLi4vdXRpbHMvY29ubmVjdCc7XG5pbXBvcnQge3BhcnNlfSBmcm9tICcuLi91dGlscy9wYXJzZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdbd2FBbmFseXNlck5vZGVdJyxcbiAgICBpbnB1dHM6IFtcbiAgICAgICAgJ2ZmdFNpemUnLFxuICAgICAgICAnbWluRGVjaWJlbHMnLFxuICAgICAgICAnbWF4RGVjaWJlbHMnLFxuICAgICAgICAnc21vb3RoaW5nVGltZUNvbnN0YW50JyxcbiAgICAgICAgJ2NoYW5uZWxDb3VudCcsXG4gICAgICAgICdjaGFubmVsQ291bnRNb2RlJyxcbiAgICAgICAgJ2NoYW5uZWxJbnRlcnByZXRhdGlvbicsXG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFthc0F1ZGlvTm9kZShXZWJBdWRpb0FuYWx5c2VyKV0sXG4gICAgZXhwb3J0QXM6ICdBdWRpb05vZGUnLFxufSlcbmV4cG9ydCBjbGFzcyBXZWJBdWRpb0FuYWx5c2VyIGV4dGVuZHMgQW5hbHlzZXJOb2RlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICAvLyAnIScgYmVjYXVzZSBpdCBpcyBhY3R1YWxseSBzZXQgaW4gY29uc3RydWN0b3JcbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZnJlcXVlbmN5Qnl0ZSQhOiBPYnNlcnZhYmxlPFVpbnQ4QXJyYXk+O1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZyZXF1ZW5jeUZsb2F0JCE6IE9ic2VydmFibGU8RmxvYXQzMkFycmF5PjtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB0aW1lQnl0ZSQhOiBPYnNlcnZhYmxlPFVpbnQ4QXJyYXk+O1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHRpbWVGbG9hdCQhOiBPYnNlcnZhYmxlPEZsb2F0MzJBcnJheT47XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21heC1wYXJhbXNcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEF0dHJpYnV0ZSgnZmZ0U2l6ZScpIGZmdFNpemVBcmc6IHN0cmluZyB8IG51bGwsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ21heERlY2liZWxzJykgbWF4RGVjaWJlbHNBcmc6IHN0cmluZyB8IG51bGwsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ21pbkRlY2liZWxzJykgbWluRGVjaWJlbHNBcmc6IHN0cmluZyB8IG51bGwsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3Ntb290aGluZ1RpbWVDb25zdGFudCcpIHNtb290aGluZ1RpbWVDb25zdGFudEFyZzogc3RyaW5nIHwgbnVsbCxcbiAgICApIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGluamVjdChBVURJT19DT05URVhUKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGluamVjdChBVURJT19OT0RFLCB7c2tpcFNlbGY6IHRydWV9KTtcbiAgICAgICAgY29uc3QgbW9kZXJuID0gaW5qZWN0KENPTlNUUlVDVE9SX1NVUFBPUlQpO1xuICAgICAgICBjb25zdCBmZnRTaXplID0gcGFyc2UoZmZ0U2l6ZUFyZywgMjA0OCk7XG4gICAgICAgIGNvbnN0IG1heERlY2liZWxzID0gcGFyc2UobWF4RGVjaWJlbHNBcmcsIC0zMCk7XG4gICAgICAgIGNvbnN0IG1pbkRlY2liZWxzID0gcGFyc2UobWluRGVjaWJlbHNBcmcsIC0xMDApO1xuICAgICAgICBjb25zdCBzbW9vdGhpbmdUaW1lQ29uc3RhbnQgPSBwYXJzZShzbW9vdGhpbmdUaW1lQ29uc3RhbnRBcmcsIDAuOCk7XG5cbiAgICAgICAgaWYgKG1vZGVybikge1xuICAgICAgICAgICAgc3VwZXIoY29udGV4dCwge2ZmdFNpemUsIG1heERlY2liZWxzLCBtaW5EZWNpYmVscywgc21vb3RoaW5nVGltZUNvbnN0YW50fSk7XG4gICAgICAgICAgICBXZWJBdWRpb0FuYWx5c2VyLmluaXQodGhpcywgbm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCkgYXMgV2ViQXVkaW9BbmFseXNlcjtcblxuICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlc3VsdCwgV2ViQXVkaW9BbmFseXNlci5wcm90b3R5cGUpO1xuICAgICAgICAgICAgV2ViQXVkaW9BbmFseXNlci5pbml0KHJlc3VsdCwgbm9kZSk7XG5cbiAgICAgICAgICAgIHJlc3VsdC5mZnRTaXplID0gZmZ0U2l6ZTtcbiAgICAgICAgICAgIHJlc3VsdC5tYXhEZWNpYmVscyA9IG1heERlY2liZWxzO1xuICAgICAgICAgICAgcmVzdWx0Lm1pbkRlY2liZWxzID0gbWluRGVjaWJlbHM7XG4gICAgICAgICAgICByZXN1bHQuc21vb3RoaW5nVGltZUNvbnN0YW50ID0gc21vb3RoaW5nVGltZUNvbnN0YW50O1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBpbml0KHRoYXQ6IFdlYkF1ZGlvQW5hbHlzZXIsIG5vZGU6IEF1ZGlvTm9kZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgY29ubmVjdChub2RlLCB0aGF0KTtcblxuICAgICAgICBsZXQgZnJlcUJ5dGUgPSBuZXcgVWludDhBcnJheSh0aGF0LmZyZXF1ZW5jeUJpbkNvdW50KTtcbiAgICAgICAgbGV0IGZyZXFGbG9hdCA9IG5ldyBGbG9hdDMyQXJyYXkodGhhdC5mcmVxdWVuY3lCaW5Db3VudCk7XG4gICAgICAgIGxldCB0aW1lQnl0ZSA9IG5ldyBVaW50OEFycmF5KHRoYXQuZmZ0U2l6ZSk7XG4gICAgICAgIGxldCB0aW1lRmxvYXQgPSBuZXcgRmxvYXQzMkFycmF5KHRoYXQuZmZ0U2l6ZSk7XG5cbiAgICAgICAgdGhhdC5mcmVxdWVuY3lCeXRlJCA9IGludGVydmFsKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKS5waXBlKFxuICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZnJlcUJ5dGUubGVuZ3RoICE9PSB0aGF0LmZyZXF1ZW5jeUJpbkNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGZyZXFCeXRlID0gbmV3IFVpbnQ4QXJyYXkodGhhdC5mcmVxdWVuY3lCaW5Db3VudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhhdC5nZXRCeXRlRnJlcXVlbmN5RGF0YShmcmVxQnl0ZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZnJlcUJ5dGU7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhhdC5mcmVxdWVuY3lGbG9hdCQgPSBpbnRlcnZhbCgwLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlcikucGlwZShcbiAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZyZXFGbG9hdC5sZW5ndGggIT09IHRoYXQuZnJlcXVlbmN5QmluQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJlcUZsb2F0ID0gbmV3IEZsb2F0MzJBcnJheSh0aGF0LmZyZXF1ZW5jeUJpbkNvdW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGF0LmdldEZsb2F0RnJlcXVlbmN5RGF0YShmcmVxRmxvYXQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZyZXFGbG9hdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2hhcmUoKSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGF0LnRpbWVCeXRlJCA9IGludGVydmFsKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKS5waXBlKFxuICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGltZUJ5dGUubGVuZ3RoICE9PSB0aGF0LmZmdFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZUJ5dGUgPSBuZXcgVWludDhBcnJheSh0aGF0LmZyZXF1ZW5jeUJpbkNvdW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGF0LmdldEJ5dGVUaW1lRG9tYWluRGF0YSh0aW1lQnl0ZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGltZUJ5dGU7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhhdC50aW1lRmxvYXQkID0gaW50ZXJ2YWwoMCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aW1lRmxvYXQubGVuZ3RoICE9PSB0aGF0LmZmdFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZUZsb2F0ID0gbmV3IEZsb2F0MzJBcnJheSh0aGF0LmZyZXF1ZW5jeUJpbkNvdW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGF0LmdldEZsb2F0VGltZURvbWFpbkRhdGEodGltZUZsb2F0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aW1lRmxvYXQ7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlKCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG59XG4iXX0=