UNPKG

raspi-io-server-utils

Version:

Utilities for interacting with Raspberry IOs and Raspbian

160 lines 9.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const av_player_factory_1 = require("./av-player-factory"); const EventEmitter = require('events'); /** * # Audio/Video player * * This player checks the availability of some common players (mplayer, vlc, omxplayer) and uses what is available * to play given media. * * ## Events * * ### `ready` * * Emitted when the AV player is ready and has checked the available players. * * ### `start` * * Video has been started. * * ### `stop` * * Video has been stopped. * * ### `error` * * Some kind of error has occurred. Must be handled, otherwise the process exit(1)s. */ class AvPlayer extends EventEmitter { /** * @param preferredPlayers Defines the order of preferred audio/video players. The first existing is used. * See {@link AvPlayerFactory} for a list of valid players. */ constructor(preferredPlayers) { super(); this._factory = new av_player_factory_1.AvPlayerFactory(); this._factory.init(preferredPlayers).then(() => this.emit('ready')); this._volume = 100; this._loop = false; this._activePlayer = undefined; this._file = undefined; } /** * Stops the player *and* disables looping. */ stop() { this.loop = false; return this._stop(); } /** * Play back the specified file. * If playback is already active, it is stopped and then the new file is played back. * * Note: Do not forget to handle the error event. * * @return Promise which resolves as soon as playback has started. */ play(file) { this._file = file; return this._stop().then(() => this._play(file)); } /** * Set the audio volume. This does not affect the current playback as it is passed as command-line argument. * @param volume Volume, between 0 and 100 */ set volume(volume) { volume = Number(volume); if (isNaN(volume) || volume < 0 || volume > 100) throw new Error('volume must be a number between 0 and 100'); this._volume = volume; } /** * @param loop When `true`, the file is looped. */ set loop(loop) { this._loop = loop; } get volume() { return this._volume; } /** * Returns the file that is currently loaded */ get file() { return this._file; } /** * Returns the elapsed time in milliseconds since playback started. */ get elapsed() { return this._startedAt && (Date.now() - this._startedAt); } get status() { return { volume: this._volume, file: this._file, running: this.running, activePlayer: this._activePlayer ? this._activePlayer.status : 'No active player', }; } get running() { return this._activePlayer && this._activePlayer.running; } /** * @return Resolves when playback starts or when an error occurs */ _play(file) { return new Promise((resolve) => { if (this._activePlayer) this._activePlayer.removeAllListeners('error'); this._activePlayer = this._factory.createPlayer(file); this._activePlayer.once('start', () => { this._started(); resolve(); }); this._activePlayer.once('stop', () => this._stopped()); this._activePlayer.on('error', (err) => { this._error(err); }); this._activePlayer.volume = this._volume; this._activePlayer.start(); }); } _stop() { return new Promise((resolve) => { if (this._activePlayer && this._activePlayer.running) { this._activePlayer.once('stop', () => { resolve(); }); this._activePlayer.stop(); } else { resolve(); } }); } _started() { this._startedAt = Date.now(); setImmediate(() => this.emit('start')); } _stopped() { this._startedAt = undefined; setImmediate(() => this.emit('stop')); if (this._loop) { console.log('Loop: Restarting audio file'); this.play(this._file) .catch((err) => this.emit('error', err)); } else { console.log('Not restarting.', this._loop); } } _error(err) { this._startedAt = undefined; setImmediate(() => this.emit('error', err)); console.error('Player error: ' + err); } } exports.AvPlayer = AvPlayer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXYtcGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F2cGxheWVyL2F2LXBsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJEQUF1RTtBQUd2RSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUUsUUFBUSxDQUFFLENBQUM7QUFFekM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBYSxRQUFTLFNBQVEsWUFBWTtJQVV0Qzs7O09BR0c7SUFDSCxZQUFhLGdCQUFxQztRQUM5QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxtQ0FBZSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUUsZ0JBQWdCLENBQUUsQ0FBQyxJQUFJLENBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBRSxPQUFPLENBQUUsQ0FBRSxDQUFDO1FBRTFFLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7UUFDQSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FBRSxJQUFhO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUUsSUFBSSxDQUFFLENBQUUsQ0FBQztJQUN6RCxDQUFDO0lB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