UNPKG

@ng-web-apis/audio

Version:

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

114 lines 14.4 kB
import { __decorate } from "tslib"; import { Attribute, Directive, EventEmitter, inject, Input, Output } from '@angular/core'; import { of, Subject, switchMap } from 'rxjs'; import { audioParam } from '../decorators/audio-param'; import { AudioBufferService } from '../services/audio-buffer.service'; import { AUDIO_CONTEXT } from '../tokens/audio-context'; import { asAudioNode } from '../tokens/audio-node'; import { CONSTRUCTOR_SUPPORT } from '../tokens/constructor-support'; import { parse } from '../utils/parse'; import * as i0 from "@angular/core"; class WebAudioBufferSource extends AudioBufferSourceNode { buffer$; detuneParam; playbackRateParam; ended; constructor(autoplay, detuneArg, playbackRateArg) { const audioBufferService = inject(AudioBufferService); const context = inject(AUDIO_CONTEXT); const modern = inject(CONSTRUCTOR_SUPPORT); const detune = parse(detuneArg, 0); const playbackRate = parse(playbackRateArg, 1); if (modern) { super(context, { detune, playbackRate }); WebAudioBufferSource.init(this, null, autoplay, audioBufferService); } else { const result = context.createBufferSource(); Object.setPrototypeOf(WebAudioBufferSource.prototype, Object.getPrototypeOf(result)); Object.setPrototypeOf(result, WebAudioBufferSource.prototype); result.playbackRate.value = playbackRate; WebAudioBufferSource.init(result, null, autoplay, audioBufferService); return result; } } // eslint-disable-next-line @typescript-eslint/max-params static init(that, _node, autoplay, audioBufferService) { if (autoplay !== null) { that.start(); } const ended = new EventEmitter(); that.ended = ended; that.onended = () => ended.emit(); 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(); try { this.stop(); } catch { // noop } this.disconnect(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioBufferSource, deps: [{ token: 'autoplay', attribute: true }, { token: 'detune', attribute: true }, { token: 'playbackRate', attribute: true }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: WebAudioBufferSource, isStandalone: true, selector: "[waAudioBufferSourceNode]", inputs: { loop: "loop", loopStart: "loopStart", loopEnd: "loopEnd", channelCount: "channelCount", channelCountMode: "channelCountMode", channelInterpretation: "channelInterpretation", detuneParam: ["detune", "detuneParam"], playbackRateParam: ["playbackRate", "playbackRateParam"], bufferSetter: ["buffer", "bufferSetter"] }, outputs: { ended: "ended" }, providers: [asAudioNode(WebAudioBufferSource)], exportAs: ["AudioNode"], usesInheritance: true, ngImport: i0 }); } __decorate([ audioParam('detune') ], WebAudioBufferSource.prototype, "detuneParam", void 0); __decorate([ audioParam('playbackRate') ], WebAudioBufferSource.prototype, "playbackRateParam", void 0); export { WebAudioBufferSource }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WebAudioBufferSource, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[waAudioBufferSourceNode]', inputs: [ 'loop', 'loopStart', 'loopEnd', 'channelCount', 'channelCountMode', 'channelInterpretation', ], providers: [asAudioNode(WebAudioBufferSource)], exportAs: 'AudioNode', }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Attribute, args: ['autoplay'] }] }, { type: undefined, decorators: [{ type: Attribute, args: ['detune'] }] }, { type: undefined, decorators: [{ type: Attribute, args: ['playbackRate'] }] }]; }, propDecorators: { detuneParam: [{ type: Input, args: ['detune'] }], playbackRateParam: [{ type: Input, args: ['playbackRate'] }], ended: [{ type: Output }], bufferSetter: [{ type: Input, args: ['buffer'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyLXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvYXVkaW8vc3JjL3NvdXJjZXMvYnVmZmVyLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU1QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXJDLE1BY2Esb0JBQXFCLFNBQVEscUJBQXFCO0lBQ2pELE9BQU8sQ0FBd0M7SUFJbEQsV0FBVyxDQUFtQjtJQUk5QixpQkFBaUIsQ0FBbUI7SUFHcEMsS0FBSyxDQUFzQjtJQUVsQyxZQUMyQixRQUF1QixFQUN6QixTQUF3QixFQUNsQixlQUE4QjtRQUV6RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFD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QWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQix1QkFBdUI7cUJBQzFCO29CQUNELFNBQVMsRUFBRSxDQUFDLFdBQVcsc0JBQXNCLENBQUM7b0JBQzlDLFFBQVEsRUFBRSxXQUFXO2lCQUN4Qjs7MEJBZ0JRLFNBQVM7MkJBQUMsVUFBVTs7MEJBQ3BCLFNBQVM7MkJBQUMsUUFBUTs7MEJBQ2xCLFNBQVM7MkJBQUMsY0FBYzs0Q0FadEIsV0FBVztzQkFGakIsS0FBSzt1QkFBQyxRQUFRO2dCQU1SLGlCQUFpQjtzQkFGdkIsS0FBSzt1QkFBQyxjQUFjO2dCQUtkLEtBQUs7c0JBRFgsTUFBTTtnQkFnRUksWUFBWTtzQkFEdEIsS0FBSzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge09uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0F0dHJpYnV0ZSwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge29mLCBTdWJqZWN0LCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge2F1ZGlvUGFyYW19IGZyb20gJy4uL2RlY29yYXRvcnMvYXVkaW8tcGFyYW0nO1xuaW1wb3J0IHtBdWRpb0J1ZmZlclNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL2F1ZGlvLWJ1ZmZlci5zZXJ2aWNlJztcbmltcG9ydCB7QVVESU9fQ09OVEVYVH0gZnJvbSAnLi4vdG9rZW5zL2F1ZGlvLWNvbnRleHQnO1xuaW1wb3J0IHthc0F1ZGlvTm9kZX0gZnJvbSAnLi4vdG9rZW5zL2F1ZGlvLW5vZGUnO1xuaW1wb3J0IHtDT05TVFJVQ1RPUl9TVVBQT1JUfSBmcm9tICcuLi90b2tlbnMvY29uc3RydWN0b3Itc3VwcG9ydCc7XG5pbXBvcnQgdHlwZSB7QXVkaW9QYXJhbUlucHV0fSBmcm9tICcuLi90eXBlcy9hdWRpby1wYXJhbS1pbnB1dCc7XG5pbXBvcnQge3BhcnNlfSBmcm9tICcuLi91dGlscy9wYXJzZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdbd2FBdWRpb0J1ZmZlclNvdXJjZU5vZGVdJyxcbiAgICBpbnB1dHM6IFtcbiAgICAgICAgJ2xvb3AnLFxuICAgICAgICAnbG9vcFN0YXJ0JyxcbiAgICAgICAgJ2xvb3BFbmQnLFxuICAgICAgICAnY2hhbm5lbENvdW50JyxcbiAgICAgICAgJ2NoYW5uZWxDb3VudE1vZGUnLFxuICAgICAgICAnY2hhbm5lbEludGVycHJldGF0aW9uJyxcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW2FzQXVkaW9Ob2RlKFdlYkF1ZGlvQnVmZmVyU291cmNlKV0sXG4gICAgZXhwb3J0QXM6ICdBdWRpb05vZGUnLFxufSlcbmV4cG9ydCBjbGFzcyBXZWJBdWRpb0J1ZmZlclNvdXJjZSBleHRlbmRzIEF1ZGlvQnVmZmVyU291cmNlTm9kZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJvdGVjdGVkIGJ1ZmZlciQhOiBTdWJqZWN0PEF1ZGlvQnVmZmVyIHwgc3RyaW5nIHwgbnVsbD47XG5cbiAgICBASW5wdXQoJ2RldHVuZScpXG4gICAgQGF1ZGlvUGFyYW0oJ2RldHVuZScpXG4gICAgcHVibGljIGRldHVuZVBhcmFtPzogQXVkaW9QYXJhbUlucHV0O1xuXG4gICAgQElucHV0KCdwbGF5YmFja1JhdGUnKVxuICAgIEBhdWRpb1BhcmFtKCdwbGF5YmFja1JhdGUnKVxuICAgIHB1YmxpYyBwbGF5YmFja1JhdGVQYXJhbT86IEF1ZGlvUGFyYW1JbnB1dDtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBlbmRlZD86IEV2ZW50RW1pdHRlcjx2b2lkPjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAQXR0cmlidXRlKCdhdXRvcGxheScpIGF1dG9wbGF5OiBzdHJpbmcgfCBudWxsLFxuICAgICAgICBAQXR0cmlidXRlKCdkZXR1bmUnKSBkZXR1bmVBcmc6IHN0cmluZyB8IG51bGwsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3BsYXliYWNrUmF0ZScpIHBsYXliYWNrUmF0ZUFyZzogc3RyaW5nIHwgbnVsbCxcbiAgICApIHtcbiAgICAgICAgY29uc3QgYXVkaW9CdWZmZXJTZXJ2aWNlID0gaW5qZWN0KEF1ZGlvQnVmZmVyU2VydmljZSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBpbmplY3QoQVVESU9fQ09OVEVYVCk7XG4gICAgICAgIGNvbnN0IG1vZGVybiA9IGluamVjdChDT05TVFJVQ1RPUl9TVVBQT1JUKTtcbiAgICAgICAgY29uc3QgZGV0dW5lID0gcGFyc2UoZGV0dW5lQXJnLCAwKTtcbiAgICAgICAgY29uc3QgcGxheWJhY2tSYXRlID0gcGFyc2UocGxheWJhY2tSYXRlQXJnLCAxKTtcblxuICAgICAgICBpZiAobW9kZXJuKSB7XG4gICAgICAgICAgICBzdXBlcihjb250ZXh0LCB7ZGV0dW5lLCBwbGF5YmFja1JhdGV9KTtcbiAgICAgICAgICAgIFdlYkF1ZGlvQnVmZmVyU291cmNlLmluaXQodGhpcywgbnVsbCwgYXV0b3BsYXksIGF1ZGlvQnVmZmVyU2VydmljZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpIGFzIFdlYkF1ZGlvQnVmZmVyU291cmNlO1xuXG4gICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoXG4gICAgICAgICAgICAgICAgV2ViQXVkaW9CdWZmZXJTb3VyY2UucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihyZXN1bHQpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihyZXN1bHQsIFdlYkF1ZGlvQnVmZmVyU291cmNlLnByb3RvdHlwZSk7XG5cbiAgICAgICAgICAgIHJlc3VsdC5wbGF5YmFja1JhdGUudmFsdWUgPSBwbGF5YmFja1JhdGU7XG4gICAgICAgICAgICBXZWJBdWRpb0J1ZmZlclNvdXJjZS5pbml0KHJlc3VsdCwgbnVsbCwgYXV0b3BsYXksIGF1ZGlvQnVmZmVyU2VydmljZSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21heC1wYXJhbXNcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluaXQoXG4gICAgICAgIHRoYXQ6IFdlYkF1ZGlvQnVmZmVyU291cmNlLFxuICAgICAgICBfbm9kZTogQXVkaW9Ob2RlIHwgbnVsbCxcbiAgICAgICAgYXV0b3BsYXk6IHN0cmluZyB8IG51bGwsXG4gICAgICAgIGF1ZGlvQnVmZmVyU2VydmljZTogQXVkaW9CdWZmZXJTZXJ2aWNlLFxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAoYXV0b3BsYXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoYXQuc3RhcnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgICAgIHRoYXQuZW5kZWQgPSBlbmRlZDtcbiAgICAgICAgdGhhdC5vbmVuZGVkID0gKCkgPT4gZW5kZWQuZW1pdCgpO1xuICAgICAgICB0aGF0LmJ1ZmZlciQgPSBuZXcgU3ViamVjdDxBdWRpb0J1ZmZlciB8IHN0cmluZyB8IG51bGw+KCk7XG4gICAgICAgIHRoYXQuYnVmZmVyJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcm9taXNlLWZ1bmN0aW9uLWFzeW5jXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChzb3VyY2UpID0+XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGF1ZGlvQnVmZmVyU2VydmljZS5mZXRjaChzb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9mKHNvdXJjZSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoYXQuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCdidWZmZXInKVxuICAgIHB1YmxpYyBzZXQgYnVmZmVyU2V0dGVyKHNvdXJjZTogQXVkaW9CdWZmZXIgfCBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyJC5uZXh0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJ1ZmZlciQuY29tcGxldGUoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gbm9vcFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxufVxuIl19