const EventEmitter = require('events'); const AudioBuffer = require('./AudioBuffer.js'); class Player extends EventEmitter { constructor() { super(); this.events = []; } async prepare(stream, settings) { logger.debug('preparing audio player...'); this.#reset(); this.audiobuffer = new AudioBuffer(stream, settings); this.audiobuffer.on(constants.THRESHOLD, () => { this.#setState(constants.READY); }); this.audiobuffer.on('close', () => { this.#setState(constants.STOPPED); }); this.audiobuffer.on('play', () => { this.#setState(constants.PLAYING); }); this.audiobuffer.on('pause', () => { this.#setState(constants.PAUSED); }) } play() { this.audiobuffer.resume(); } pause() { this.audiobuffer.pause(); } async stop() { this.audiobuffer.stop(); this.#reset(); this.#setState(constants.STOPPED); } isReady() { return this.state === constants.READY; } isPlaying() { return this.state === constants.PLAYING; } isPaused() { return this.state === constants.PAUSED; } isFinished() { return this.state === constants.STOPPED; } hasError() { return this.state === constants.ERROR; } getProgress() { return this.audiobuffer?.getProgress(); } #setState(state, data) { if (this.state === state) { return; } this.state = state; logger.debug('setting state of audio player to \'' + state + '\'...'); if (this.events.includes(state)) { return; } logger.debug('emitting state \'' + state + '\' of audio player...'); this.emit(this.state, { data: data }); this.emit(constants.STATECHANGE, { state: this.state, progress: this.getProgress() }); this.events.push(state); } #reset() { this.events = []; } } module.exports = Player;