react-native-audio-api
Version:
react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification
83 lines (82 loc) • 2.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.AudioFileSourceNode = void 0;
var _events = require("../events");
var _AudioScheduledSourceNode = _interopRequireDefault(require("../core/AudioScheduledSourceNode"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const MAX_PLAYBACK_RATE = 4;
class AudioFileSourceNode extends _AudioScheduledSourceNode.default {
emitter = new _events.AudioEventEmitter(globalThis.AudioEventEmitter);
attach(options) {
this.resetNodeAndSubscriptions();
const sub = this.emitter.addAudioEventListener('ended', _event => {
options.onEnded();
});
this.node.onEnded = sub.subscriptionId;
return {
duration: this.node.duration
};
}
dispose() {
this.resetNodeAndSubscriptions();
}
play() {
this.node.start(this.context.currentTime);
}
pause() {
this.node.pause();
}
seekToTime(seconds) {
this.node.seekToTime(seconds);
}
setVolume(value) {
this.node.volume = value;
}
setLoop(value) {
this.node.loop = value;
}
setPlaybackRate(value) {
if (!Number.isFinite(value) || value < 0 || value > MAX_PLAYBACK_RATE) {
throw new Error(`AudioFileSourceNode: playbackRate must be a non-negative number, less than or equal to ${MAX_PLAYBACK_RATE}.`);
}
this.node.playbackRate = value;
}
setPreservesPitch(value) {
this.node.preservesPitch = value;
}
getFileSourceNode() {
return this.node;
}
getDuration() {
return this.node.duration;
}
getCurrentTime() {
return this.node.currentTime;
}
startPositionTracking(onTime) {
if (!this.node) {
return;
}
this.stopPositionTracking();
const sub = this.emitter.addAudioEventListener('positionChanged', event => {
onTime(event.value);
});
this.node.onPositionChanged = sub.subscriptionId;
}
stopPositionTracking() {
if (this.node) {
this.node.onPositionChanged = '0';
}
}
resetNodeAndSubscriptions() {
if (this.node) {
this.node.onPositionChanged = '0';
this.node.onEnded = '0';
this.node.disconnect(undefined);
}
}
}
exports.AudioFileSourceNode = AudioFileSourceNode;
//# sourceMappingURL=AudioFileSourceNode.js.map