UNPKG

@ng-web-apis/audio

Version:

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

64 lines 9.17 kB
import { Directive, inject, Input } from '@angular/core'; import { of, Subject, switchMap } from 'rxjs'; import { AudioBufferService } from '../services/audio-buffer.service'; 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 * as i0 from "@angular/core"; class WebAudioConvolver extends ConvolverNode { buffer$; constructor() { const audioBufferService = inject(AudioBufferService); const context = inject(AUDIO_CONTEXT); const node = inject(AUDIO_NODE, { skipSelf: true }); const modern = inject(CONSTRUCTOR_SUPPORT); if (modern) { super(context); WebAudioConvolver.init(this, node, audioBufferService); } else { const result = context.createConvolver(); Object.setPrototypeOf(result, WebAudioConvolver.prototype); WebAudioConvolver.init(result, node, audioBufferService); return result; } } static init(that, node, audioBufferService) { connect(node, that); that.buffer$ = new Subject(); that.buffer$ .pipe( // eslint-disable-next-line @typescript-eslint/promise-function-async switchMap((source) => typeof source === 'string' ? audioBufferService.fetch(source) : of(source))) .subscribe((buffer) => { that.buffer = buffer; }); } set bufferSetter(source) { this.buffer$.next(source); } ngOnDestroy() { this.buffer$.complete(); this.disconnect(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioConvolver, deps: [], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: WebAudioConvolver, isStandalone: true, selector: "[waConvolverNode]", inputs: { normalize: "normalize", channelCount: "channelCount", channelCountMode: "channelCountMode", channelInterpretation: "channelInterpretation", bufferSetter: ["buffer", "bufferSetter"] }, providers: [asAudioNode(WebAudioConvolver)], exportAs: ["AudioNode"], usesInheritance: true, ngImport: i0 }); } export { WebAudioConvolver }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioConvolver, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[waConvolverNode]', inputs: ['normalize', 'channelCount', 'channelCountMode', 'channelInterpretation'], providers: [asAudioNode(WebAudioConvolver)], exportAs: 'AudioNode', }] }], ctorParameters: function () { return []; }, propDecorators: { bufferSetter: [{ type: Input, args: ['buffer'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy9hdWRpby9zcmMvbm9kZXMvY29udm9sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFNUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxXQUFXLEVBQUUsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGtCQUFrQixDQUFDOztBQUV6QyxNQU9hLGlCQUFrQixTQUFRLGFBQWE7SUFDdEMsT0FBTyxDQUF3QztJQUV6RDtRQUNJLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUUzQyxJQUFJLE1BQU0sRUFBRTtZQUNSLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNmLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7U0FDMUQ7YUFBTTtZQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQXVCLENBQUM7WUFFOUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0QsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUV6RCxPQUFPLE1BQU0sQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFUyxNQUFNLENBQUMsSUFBSSxDQUNqQixJQUF1QixFQUN2QixJQUFzQixFQUN0QixrQkFBc0M7UUFFdEMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxFQUErQixDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPO2FBQ1AsSUFBSTtRQUNELHFFQUFxRTtRQUNyRSxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNqQixPQUFPLE1BQU0sS0FBSyxRQUFRO1lBQ3RCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQ25CLENBQ0o7YUFDQSxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxJQUNXLFlBQVksQ0FBQyxNQUFtQztRQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sV0FBVztRQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7d0dBbkRRLGlCQUFpQjs0RkFBakIsaUJBQWlCLGtRQUhmLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7O1NBR2xDLGlCQUFpQjs0RkFBakIsaUJBQWlCO2tCQVA3QixTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixNQUFNLEVBQUUsQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixDQUFDO29CQUNsRixTQUFTLEVBQUUsQ0FBQyxXQUFXLG1CQUFtQixDQUFDO29CQUMzQyxRQUFRLEVBQUUsV0FBVztpQkFDeEI7MEVBNkNjLFlBQVk7c0JBRHRCLEtBQUs7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIGluamVjdCwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtvZiwgU3ViamVjdCwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBdWRpb0J1ZmZlclNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL2F1ZGlvLWJ1ZmZlci5zZXJ2aWNlJztcbmltcG9ydCB7QVVESU9fQ09OVEVYVH0gZnJvbSAnLi4vdG9rZW5zL2F1ZGlvLWNvbnRleHQnO1xuaW1wb3J0IHthc0F1ZGlvTm9kZSwgQVVESU9fTk9ERX0gZnJvbSAnLi4vdG9rZW5zL2F1ZGlvLW5vZGUnO1xuaW1wb3J0IHtDT05TVFJVQ1RPUl9TVVBQT1JUfSBmcm9tICcuLi90b2tlbnMvY29uc3RydWN0b3Itc3VwcG9ydCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJy4uL3V0aWxzL2Nvbm5lY3QnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnW3dhQ29udm9sdmVyTm9kZV0nLFxuICAgIGlucHV0czogWydub3JtYWxpemUnLCAnY2hhbm5lbENvdW50JywgJ2NoYW5uZWxDb3VudE1vZGUnLCAnY2hhbm5lbEludGVycHJldGF0aW9uJ10sXG4gICAgcHJvdmlkZXJzOiBbYXNBdWRpb05vZGUoV2ViQXVkaW9Db252b2x2ZXIpXSxcbiAgICBleHBvcnRBczogJ0F1ZGlvTm9kZScsXG59KVxuZXhwb3J0IGNsYXNzIFdlYkF1ZGlvQ29udm9sdmVyIGV4dGVuZHMgQ29udm9sdmVyTm9kZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJvdGVjdGVkIGJ1ZmZlciQhOiBTdWJqZWN0PEF1ZGlvQnVmZmVyIHwgc3RyaW5nIHwgbnVsbD47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgYXVkaW9CdWZmZXJTZXJ2aWNlID0gaW5qZWN0KEF1ZGlvQnVmZmVyU2VydmljZSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBpbmplY3QoQVVESU9fQ09OVEVYVCk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBpbmplY3QoQVVESU9fTk9ERSwge3NraXBTZWxmOiB0cnVlfSk7XG4gICAgICAgIGNvbnN0IG1vZGVybiA9IGluamVjdChDT05TVFJVQ1RPUl9TVVBQT1JUKTtcblxuICAgICAgICBpZiAobW9kZXJuKSB7XG4gICAgICAgICAgICBzdXBlcihjb250ZXh0KTtcbiAgICAgICAgICAgIFdlYkF1ZGlvQ29udm9sdmVyLmluaXQodGhpcywgbm9kZSwgYXVkaW9CdWZmZXJTZXJ2aWNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuY3JlYXRlQ29udm9sdmVyKCkgYXMgV2ViQXVkaW9Db252b2x2ZXI7XG5cbiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihyZXN1bHQsIFdlYkF1ZGlvQ29udm9sdmVyLnByb3RvdHlwZSk7XG4gICAgICAgICAgICBXZWJBdWRpb0NvbnZvbHZlci5pbml0KHJlc3VsdCwgbm9kZSwgYXVkaW9CdWZmZXJTZXJ2aWNlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5pdChcbiAgICAgICAgdGhhdDogV2ViQXVkaW9Db252b2x2ZXIsXG4gICAgICAgIG5vZGU6IEF1ZGlvTm9kZSB8IG51bGwsXG4gICAgICAgIGF1ZGlvQnVmZmVyU2VydmljZTogQXVkaW9CdWZmZXJTZXJ2aWNlLFxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25uZWN0KG5vZGUsIHRoYXQpO1xuICAgICAgICB0aGF0LmJ1ZmZlciQgPSBuZXcgU3ViamVjdDxBdWRpb0J1ZmZlciB8IHN0cmluZyB8IG51bGw+KCk7XG4gICAgICAgIHRoYXQuYnVmZmVyJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcm9taXNlLWZ1bmN0aW9uLWFzeW5jXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChzb3VyY2UpID0+XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGF1ZGlvQnVmZmVyU2VydmljZS5mZXRjaChzb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9mKHNvdXJjZSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoYXQuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCdidWZmZXInKVxuICAgIHB1YmxpYyBzZXQgYnVmZmVyU2V0dGVyKHNvdXJjZTogQXVkaW9CdWZmZXIgfCBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyJC5uZXh0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJ1ZmZlciQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxufVxuIl19