@ng-web-apis/audio
Version:
This is a library for declarative use of Web Audio API with Angular
52 lines • 8.28 kB
JavaScript
import { Directive, inject, Output } from '@angular/core';
import { debounceTime, distinctUntilChanged, filter, interval, map, skipWhile, tap, } from 'rxjs';
import { POLLING_TIME } from '../constants/polling-time';
import { AUDIO_CONTEXT } from '../tokens/audio-context';
import { AUDIO_NODE } from '../tokens/audio-node';
import { CONSTRUCTOR_SUPPORT } from '../tokens/constructor-support';
import { connect } from '../utils/connect';
import * as i0 from "@angular/core";
class WebAudioDestination extends AnalyserNode {
quiet;
constructor() {
const context = inject(AUDIO_CONTEXT);
const node = inject(AUDIO_NODE);
const modern = inject(CONSTRUCTOR_SUPPORT);
if (modern) {
super(context);
WebAudioDestination.init(this, node);
}
else {
const result = context.createAnalyser();
Object.setPrototypeOf(result, WebAudioDestination.prototype);
WebAudioDestination.init(result, node);
return result;
}
}
static init(that, node) {
connect(node, that);
that.fftSize = 256;
that.connect(that.context.destination);
that.quiet = interval(POLLING_TIME).pipe(map(() => new Float32Array(that.fftSize)), tap((array) => that.getFloatTimeDomainData(array)), map((array) => that.isSilent(array)), distinctUntilChanged(), skipWhile((isSilent) => isSilent), debounceTime(5000), filter((isSilent) => isSilent));
}
ngOnDestroy() {
this.disconnect();
}
isSilent(array) {
return Math.abs(array.reduce((acc, cur) => acc + cur, 0)) < 0.001;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioDestination, deps: [], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: WebAudioDestination, isStandalone: true, selector: "[waAudioDestinationNode]", outputs: { quiet: "quiet" }, exportAs: ["AudioNode"], usesInheritance: true, ngImport: i0 });
}
export { WebAudioDestination };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioDestination, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: '[waAudioDestinationNode]',
exportAs: 'AudioNode',
}]
}], ctorParameters: function () { return []; }, propDecorators: { quiet: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzdGluYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2F1ZGlvL3NyYy9kaXJlY3RpdmVzL2Rlc3RpbmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV4RCxPQUFPLEVBQ0gsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sUUFBUSxFQUNSLEdBQUcsRUFDSCxTQUFTLEVBQ1QsR0FBRyxHQUNOLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGtCQUFrQixDQUFDOztBQUV6QyxNQUthLG1CQUFvQixTQUFRLFlBQVk7SUFFMUMsS0FBSyxDQUF1QjtJQUVuQztRQUNJLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFM0MsSUFBSSxNQUFNLEVBQUU7WUFDUixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDZixtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3hDO2FBQU07WUFDSCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxFQUF5QixDQUFDO1lBRS9ELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdELG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFdkMsT0FBTyxNQUFNLENBQUM7U0FDakI7SUFDTCxDQUFDO0lBRVMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUF5QixFQUFFLElBQXNCO1FBQ25FLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FDcEMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUN6QyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNsRCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDcEMsb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFDakMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUNsQixNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUNqQyxDQUFDO0lBQ04sQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVPLFFBQVEsQ0FBQyxLQUFtQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEUsQ0FBQzt3R0EzQ1EsbUJBQW1COzRGQUFuQixtQkFBbUI7O1NBQW5CLG1CQUFtQjs0RkFBbkIsbUJBQW1CO2tCQUwvQixTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsMEJBQTBCO29CQUNwQyxRQUFRLEVBQUUsV0FBVztpQkFDeEI7MEVBR1UsS0FBSztzQkFEWCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge09uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RpcmVjdGl2ZSwgaW5qZWN0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICBkZWJvdW5jZVRpbWUsXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gICAgZmlsdGVyLFxuICAgIGludGVydmFsLFxuICAgIG1hcCxcbiAgICBza2lwV2hpbGUsXG4gICAgdGFwLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtQT0xMSU5HX1RJTUV9IGZyb20gJy4uL2NvbnN0YW50cy9wb2xsaW5nLXRpbWUnO1xuaW1wb3J0IHtBVURJT19DT05URVhUfSBmcm9tICcuLi90b2tlbnMvYXVkaW8tY29udGV4dCc7XG5pbXBvcnQge0FVRElPX05PREV9IGZyb20gJy4uL3Rva2Vucy9hdWRpby1ub2RlJztcbmltcG9ydCB7Q09OU1RSVUNUT1JfU1VQUE9SVH0gZnJvbSAnLi4vdG9rZW5zL2NvbnN0cnVjdG9yLXN1cHBvcnQnO1xuaW1wb3J0IHtjb25uZWN0fSBmcm9tICcuLi91dGlscy9jb25uZWN0JztcblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ1t3YUF1ZGlvRGVzdGluYXRpb25Ob2RlXScsXG4gICAgZXhwb3J0QXM6ICdBdWRpb05vZGUnLFxufSlcbmV4cG9ydCBjbGFzcyBXZWJBdWRpb0Rlc3RpbmF0aW9uIGV4dGVuZHMgQW5hbHlzZXJOb2RlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcXVpZXQhOiBPYnNlcnZhYmxlPHVua25vd24+O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBpbmplY3QoQVVESU9fQ09OVEVYVCk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBpbmplY3QoQVVESU9fTk9ERSk7XG4gICAgICAgIGNvbnN0IG1vZGVybiA9IGluamVjdChDT05TVFJVQ1RPUl9TVVBQT1JUKTtcblxuICAgICAgICBpZiAobW9kZXJuKSB7XG4gICAgICAgICAgICBzdXBlcihjb250ZXh0KTtcbiAgICAgICAgICAgIFdlYkF1ZGlvRGVzdGluYXRpb24uaW5pdCh0aGlzLCBub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKSBhcyBXZWJBdWRpb0Rlc3RpbmF0aW9uO1xuXG4gICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVzdWx0LCBXZWJBdWRpb0Rlc3RpbmF0aW9uLnByb3RvdHlwZSk7XG4gICAgICAgICAgICBXZWJBdWRpb0Rlc3RpbmF0aW9uLmluaXQocmVzdWx0LCBub2RlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5pdCh0aGF0OiBXZWJBdWRpb0Rlc3RpbmF0aW9uLCBub2RlOiBBdWRpb05vZGUgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGNvbm5lY3Qobm9kZSwgdGhhdCk7XG4gICAgICAgIHRoYXQuZmZ0U2l6ZSA9IDI1NjtcbiAgICAgICAgdGhhdC5jb25uZWN0KHRoYXQuY29udGV4dC5kZXN0aW5hdGlvbik7XG4gICAgICAgIHRoYXQucXVpZXQgPSBpbnRlcnZhbChQT0xMSU5HX1RJTUUpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKCkgPT4gbmV3IEZsb2F0MzJBcnJheSh0aGF0LmZmdFNpemUpKSxcbiAgICAgICAgICAgIHRhcCgoYXJyYXkpID0+IHRoYXQuZ2V0RmxvYXRUaW1lRG9tYWluRGF0YShhcnJheSkpLFxuICAgICAgICAgICAgbWFwKChhcnJheSkgPT4gdGhhdC5pc1NpbGVudChhcnJheSkpLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIHNraXBXaGlsZSgoaXNTaWxlbnQpID0+IGlzU2lsZW50KSxcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSg1MDAwKSxcbiAgICAgICAgICAgIGZpbHRlcigoaXNTaWxlbnQpID0+IGlzU2lsZW50KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTaWxlbnQoYXJyYXk6IEZsb2F0MzJBcnJheSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoYXJyYXkucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICsgY3VyLCAwKSkgPCAwLjAwMTtcbiAgICB9XG59XG4iXX0=