@ng-web-apis/audio
Version:
This is a library for declarative use of Web Audio API with Angular
64 lines • 9.17 kB
JavaScript
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