UNPKG

@ng-web-apis/audio

Version:

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

69 lines 9.44 kB
import { Attribute, Directive, inject, Input } from '@angular/core'; import { AUDIO_CONTEXT } from '../tokens/audio-context'; import { asAudioNode, AUDIO_NODE } from '../tokens/audio-node'; import { connect } from '../utils/connect'; import { fallbackAudioParam } from '../utils/fallback-audio-param'; import { parse } from '../utils/parse'; import { processAudioParam } from '../utils/process-audio-param'; import * as i0 from "@angular/core"; class WebAudioStereoPanner extends StereoPannerNode { constructor(panArg) { const context = inject(AUDIO_CONTEXT); const node = inject(AUDIO_NODE, { skipSelf: true }); const pan = parse(panArg, 0); try { // eslint-disable-next-line new StereoPannerNode(context); } catch { const result = context.createPanner(); Object.setPrototypeOf(result, WebAudioStereoPanner.prototype); result.fallbackToPannerNode(fallbackAudioParam(pan)); connect(node, result); return result; } super(context, { pan }); connect(node, this); } set panParam(pan) { if ('setPosition' in this) { /** fallback for browsers not supporting {@link StereoPannerNode} */ // @ts-ignore this.fallbackToPannerNode(fallbackAudioParam(pan)); } else { processAudioParam(this.pan, pan, this.context.currentTime); } } ngOnDestroy() { this.disconnect(); } fallbackToPannerNode(pan) { const xDeg = pan * 100; const zDeg = xDeg > 0 ? 270 - xDeg : xDeg + 90; const x = Math.sin(xDeg * (Math.PI / 180)); const z = Math.sin(zDeg * (Math.PI / 180)); // @ts-ignore this.setPosition(x, 0, z); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioStereoPanner, deps: [{ token: 'pan', attribute: true }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: WebAudioStereoPanner, isStandalone: true, selector: "[waStereoPannerNode]", inputs: { channelCount: "channelCount", channelCountMode: "channelCountMode", channelInterpretation: "channelInterpretation", panParam: ["pan", "panParam"] }, providers: [asAudioNode(WebAudioStereoPanner)], exportAs: ["AudioNode"], usesInheritance: true, ngImport: i0 }); } export { WebAudioStereoPanner }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioStereoPanner, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[waStereoPannerNode]', inputs: ['channelCount', 'channelCountMode', 'channelInterpretation'], providers: [asAudioNode(WebAudioStereoPanner)], exportAs: 'AudioNode', }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Attribute, args: ['pan'] }] }]; }, propDecorators: { panParam: [{ type: Input, args: ['pan'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcmVvLXBhbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvYXVkaW8vc3JjL25vZGVzL3N0ZXJlby1wYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVsRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDOztBQUUvRCxNQU9hLG9CQUFxQixTQUFRLGdCQUFnQjtJQUN0RCxZQUE4QixNQUFxQjtRQUMvQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFN0IsSUFBSTtZQUNBLDJCQUEyQjtZQUMzQixJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDO1FBQUMsTUFBTTtZQUNKLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQXFDLENBQUM7WUFFekUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckQsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV0QixPQUFPLE1BQU0sQ0FBQztTQUNqQjtRQUVELEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQ1csUUFBUSxDQUFDLEdBQW9CO1FBQ3BDLElBQUksYUFBYSxJQUFJLElBQUksRUFBRTtZQUN2QixvRUFBb0U7WUFDcEUsYUFBYTtZQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3REO2FBQU07WUFDSCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzlEO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEdBQVc7UUFDcEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTNDLGFBQWE7UUFDYixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQzt3R0E5Q1Esb0JBQW9CLGtCQUNOLEtBQUs7NEZBRG5CLG9CQUFvQixrT0FIbEIsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQzs7U0FHckMsb0JBQW9COzRGQUFwQixvQkFBb0I7a0JBUGhDLFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLE1BQU0sRUFBRSxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsQ0FBQztvQkFDckUsU0FBUyxFQUFFLENBQUMsV0FBVyxzQkFBc0IsQ0FBQztvQkFDOUMsUUFBUSxFQUFFLFdBQVc7aUJBQ3hCOzswQkFFZ0IsU0FBUzsyQkFBQyxLQUFLOzRDQXVCakIsUUFBUTtzQkFEbEIsS0FBSzt1QkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge09uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0F0dHJpYnV0ZSwgRGlyZWN0aXZlLCBpbmplY3QsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtBVURJT19DT05URVhUfSBmcm9tICcuLi90b2tlbnMvYXVkaW8tY29udGV4dCc7XG5pbXBvcnQge2FzQXVkaW9Ob2RlLCBBVURJT19OT0RFfSBmcm9tICcuLi90b2tlbnMvYXVkaW8tbm9kZSc7XG5pbXBvcnQgdHlwZSB7QXVkaW9QYXJhbUlucHV0fSBmcm9tICcuLi90eXBlcy9hdWRpby1wYXJhbS1pbnB1dCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJy4uL3V0aWxzL2Nvbm5lY3QnO1xuaW1wb3J0IHtmYWxsYmFja0F1ZGlvUGFyYW19IGZyb20gJy4uL3V0aWxzL2ZhbGxiYWNrLWF1ZGlvLXBhcmFtJztcbmltcG9ydCB7cGFyc2V9IGZyb20gJy4uL3V0aWxzL3BhcnNlJztcbmltcG9ydCB7cHJvY2Vzc0F1ZGlvUGFyYW19IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MtYXVkaW8tcGFyYW0nO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnW3dhU3RlcmVvUGFubmVyTm9kZV0nLFxuICAgIGlucHV0czogWydjaGFubmVsQ291bnQnLCAnY2hhbm5lbENvdW50TW9kZScsICdjaGFubmVsSW50ZXJwcmV0YXRpb24nXSxcbiAgICBwcm92aWRlcnM6IFthc0F1ZGlvTm9kZShXZWJBdWRpb1N0ZXJlb1Bhbm5lcildLFxuICAgIGV4cG9ydEFzOiAnQXVkaW9Ob2RlJyxcbn0pXG5leHBvcnQgY2xhc3MgV2ViQXVkaW9TdGVyZW9QYW5uZXIgZXh0ZW5kcyBTdGVyZW9QYW5uZXJOb2RlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBjb25zdHJ1Y3RvcihAQXR0cmlidXRlKCdwYW4nKSBwYW5Bcmc6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGluamVjdChBVURJT19DT05URVhUKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGluamVjdChBVURJT19OT0RFLCB7c2tpcFNlbGY6IHRydWV9KTtcbiAgICAgICAgY29uc3QgcGFuID0gcGFyc2UocGFuQXJnLCAwKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICBuZXcgU3RlcmVvUGFubmVyTm9kZShjb250ZXh0KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmNyZWF0ZVBhbm5lcigpIGFzIHVua25vd24gYXMgV2ViQXVkaW9TdGVyZW9QYW5uZXI7XG5cbiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihyZXN1bHQsIFdlYkF1ZGlvU3RlcmVvUGFubmVyLnByb3RvdHlwZSk7XG4gICAgICAgICAgICByZXN1bHQuZmFsbGJhY2tUb1Bhbm5lck5vZGUoZmFsbGJhY2tBdWRpb1BhcmFtKHBhbikpO1xuICAgICAgICAgICAgY29ubmVjdChub2RlLCByZXN1bHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIoY29udGV4dCwge3Bhbn0pO1xuICAgICAgICBjb25uZWN0KG5vZGUsIHRoaXMpO1xuICAgIH1cblxuICAgIEBJbnB1dCgncGFuJylcbiAgICBwdWJsaWMgc2V0IHBhblBhcmFtKHBhbjogQXVkaW9QYXJhbUlucHV0KSB7XG4gICAgICAgIGlmICgnc2V0UG9zaXRpb24nIGluIHRoaXMpIHtcbiAgICAgICAgICAgIC8qKiBmYWxsYmFjayBmb3IgYnJvd3NlcnMgbm90IHN1cHBvcnRpbmcge0BsaW5rIFN0ZXJlb1Bhbm5lck5vZGV9ICovXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLmZhbGxiYWNrVG9QYW5uZXJOb2RlKGZhbGxiYWNrQXVkaW9QYXJhbShwYW4pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb2Nlc3NBdWRpb1BhcmFtKHRoaXMucGFuLCBwYW4sIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmFsbGJhY2tUb1Bhbm5lck5vZGUocGFuOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeERlZyA9IHBhbiAqIDEwMDtcbiAgICAgICAgY29uc3QgekRlZyA9IHhEZWcgPiAwID8gMjcwIC0geERlZyA6IHhEZWcgKyA5MDtcbiAgICAgICAgY29uc3QgeCA9IE1hdGguc2luKHhEZWcgKiAoTWF0aC5QSSAvIDE4MCkpO1xuICAgICAgICBjb25zdCB6ID0gTWF0aC5zaW4oekRlZyAqIChNYXRoLlBJIC8gMTgwKSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIDAsIHopO1xuICAgIH1cbn1cbiJdfQ==