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