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