2017-04-09 15:52:37 +00:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
// TODO: These should really be their own individual classes. Are
|
|
|
|
// there enough commonalities to warrant a base class?
|
|
|
|
|
2017-04-09 13:41:17 +00:00
|
|
|
const spawn = require('child_process').spawn;
|
|
|
|
|
|
|
|
const EventEmitter = require('events').EventEmitter;
|
|
|
|
|
|
|
|
const TAGREADER = 'tagreader';
|
|
|
|
const MP3PLAYER = 'mpg321';
|
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
class ChildEmitter extends EventEmitter {
|
|
|
|
constructor(process) {
|
|
|
|
super();
|
2017-04-09 13:41:17 +00:00
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
this.childProcess = process;
|
2017-04-09 13:41:17 +00:00
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
this.childProcess.on('error', function(err) {
|
|
|
|
this.emit('process_error', err);
|
|
|
|
});
|
2017-04-09 13:41:17 +00:00
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
this.childProcess.on('close', function(code, signal) {
|
|
|
|
this.emit('close', code, signal);
|
|
|
|
});
|
2017-04-09 13:41:17 +00:00
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
this.childProcess.stdout.on('data', (data) => {
|
|
|
|
var s = data.toString(), lines = s.split(/\n/g);
|
|
|
|
for (var i = 0, l = lines.length; i < l; i++) {
|
|
|
|
this.emit('message', lines[i]);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
this.childProcess.stderr.on('data', (data) => {
|
|
|
|
this.emit('error', data);
|
|
|
|
});
|
|
|
|
}
|
2017-04-09 13:41:17 +00:00
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
kill() {
|
|
|
|
this.childProcess.kill();
|
|
|
|
}
|
2017-04-09 13:41:17 +00:00
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
send(message) {
|
|
|
|
this.childProcess.stdin.write(message);
|
|
|
|
}
|
|
|
|
}
|
2017-04-09 13:41:17 +00:00
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
function launchChild(name, command) {
|
|
|
|
var cmd = command[0],
|
|
|
|
args = command.slice(1);
|
2017-04-09 13:41:17 +00:00
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
return spawn(cmd, args);
|
2017-04-09 13:41:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
exports.init = function(config) {
|
|
|
|
// Set up tag reader
|
|
|
|
var tagreader = launchChild(TAGREADER, config.tag_reader);
|
2017-04-09 15:52:37 +00:00
|
|
|
exports.tagreader = new ChildEmitter(tagreader);
|
2017-04-09 13:41:17 +00:00
|
|
|
|
|
|
|
// set up mp3 player
|
|
|
|
var mp3player = launchChild(MP3PLAYER, config.mpg321);
|
2017-04-09 15:52:37 +00:00
|
|
|
exports.mp3player = new ChildEmitter(mp3player);
|
2017-04-09 13:41:17 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
exports.exitHandler = function(options, err) {
|
|
|
|
console.log('[player] closing children');
|
|
|
|
if (err) console.log(err.stack);
|
|
|
|
|
2017-04-09 15:52:37 +00:00
|
|
|
module.exports.tagreader.kill();
|
|
|
|
module.exports.mp3player.kill();
|
2017-04-09 13:41:17 +00:00
|
|
|
|
|
|
|
if (options.exit) {
|
|
|
|
process.exit();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// vim:set ts=2 sw=2 et:
|