Fix: send messages to mp3 player
Also reworking the structure of the child processes: they are now subclasses of EventEmitter, wrapping some process-specific functionality. The next logical step here would be be distinct modules for the MP3Player and TagReader children.
This commit is contained in:
parent
8f72c4ecf9
commit
12529aeae8
@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
while read line ; do
|
while read line ; do
|
||||||
echo "OK"
|
echo "running $line"
|
||||||
done
|
done
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
// TODO: These should really be their own individual classes. Are
|
||||||
|
// there enough commonalities to warrant a base class?
|
||||||
|
|
||||||
const spawn = require('child_process').spawn;
|
const spawn = require('child_process').spawn;
|
||||||
|
|
||||||
const EventEmitter = require('events').EventEmitter;
|
const EventEmitter = require('events').EventEmitter;
|
||||||
@ -5,7 +10,40 @@ const EventEmitter = require('events').EventEmitter;
|
|||||||
const TAGREADER = 'tagreader';
|
const TAGREADER = 'tagreader';
|
||||||
const MP3PLAYER = 'mpg321';
|
const MP3PLAYER = 'mpg321';
|
||||||
|
|
||||||
const child_processes = new Map();
|
class ChildEmitter extends EventEmitter {
|
||||||
|
constructor(process) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.childProcess = process;
|
||||||
|
|
||||||
|
this.childProcess.on('error', function(err) {
|
||||||
|
this.emit('process_error', err);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.childProcess.on('close', function(code, signal) {
|
||||||
|
this.emit('close', code, signal);
|
||||||
|
});
|
||||||
|
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
kill() {
|
||||||
|
this.childProcess.kill();
|
||||||
|
}
|
||||||
|
|
||||||
|
send(message) {
|
||||||
|
this.childProcess.stdin.write(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function launchChild(name, command) {
|
function launchChild(name, command) {
|
||||||
var cmd = command[0],
|
var cmd = command[0],
|
||||||
@ -14,56 +52,22 @@ function launchChild(name, command) {
|
|||||||
return spawn(cmd, args);
|
return spawn(cmd, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupEmitter(name, emitter, child) {
|
|
||||||
exports[name] = emitter;
|
|
||||||
|
|
||||||
child.on('error', function(err) {
|
|
||||||
emitter.emit('process_error', err);
|
|
||||||
});
|
|
||||||
|
|
||||||
child.on('close', function(code, signal) {
|
|
||||||
emitter.emit('close', code, signal);
|
|
||||||
});
|
|
||||||
|
|
||||||
child.stdout.on('data', (data) => {
|
|
||||||
var s = data.toString(), lines = s.split(/\n/g);
|
|
||||||
for (var i = 0, l = lines.length; i < l; i++) {
|
|
||||||
emitter.emit('message', lines[i]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
child.stderr.on('data', (data) => {
|
|
||||||
emitter.emit('error', data);
|
|
||||||
});
|
|
||||||
|
|
||||||
return emitter;
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.init = function(config) {
|
exports.init = function(config) {
|
||||||
// Set up tag reader
|
// Set up tag reader
|
||||||
var tagreader = launchChild(TAGREADER, config.tag_reader);
|
var tagreader = launchChild(TAGREADER, config.tag_reader);
|
||||||
var tagreader_emitter = new EventEmitter();
|
exports.tagreader = new ChildEmitter(tagreader);
|
||||||
setupEmitter(TAGREADER, tagreader_emitter, tagreader);
|
|
||||||
|
|
||||||
child_processes.set(TAGREADER, tagreader);
|
|
||||||
exports.tagreader = tagreader_emitter;
|
|
||||||
|
|
||||||
// set up mp3 player
|
// set up mp3 player
|
||||||
var mp3player = launchChild(MP3PLAYER, config.mpg321);
|
var mp3player = launchChild(MP3PLAYER, config.mpg321);
|
||||||
var mp3player_emitter = new EventEmitter();
|
exports.mp3player = new ChildEmitter(mp3player);
|
||||||
setupEmitter(MP3PLAYER, mp3player_emitter, mp3player);
|
|
||||||
|
|
||||||
child_processes.set(MP3PLAYER, mp3player);
|
|
||||||
exports.mp3player = mp3player_emitter;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.exitHandler = function(options, err) {
|
exports.exitHandler = function(options, err) {
|
||||||
console.log('[player] closing children');
|
console.log('[player] closing children');
|
||||||
if (err) console.log(err.stack);
|
if (err) console.log(err.stack);
|
||||||
|
|
||||||
child_processes.forEach((p) => {
|
module.exports.tagreader.kill();
|
||||||
p.kill();
|
module.exports.mp3player.kill();
|
||||||
});
|
|
||||||
|
|
||||||
if (options.exit) {
|
if (options.exit) {
|
||||||
process.exit();
|
process.exit();
|
||||||
|
@ -46,6 +46,12 @@ children.tagreader.on('message', (data) => {
|
|||||||
processLine(data);
|
processLine(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (config.debug) {
|
||||||
|
children.mp3player.on('message', (data) => {
|
||||||
|
console.log(`[mp3player] stdout: ${data}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
var last_tag = null;
|
var last_tag = null;
|
||||||
var debounce_until = 0;
|
var debounce_until = 0;
|
||||||
|
|
||||||
@ -97,7 +103,7 @@ function processLine(data) {
|
|||||||
debounce_until = Date.now() / 1000 + wait_sec;
|
debounce_until = Date.now() / 1000 + wait_sec;
|
||||||
if (action) {
|
if (action) {
|
||||||
console.log(`[action] [${action}] for [${last_tag}]`);
|
console.log(`[action] [${action}] for [${last_tag}]`);
|
||||||
player.stdin.write(action + "\n");
|
children.mp3player.send(action + "\n");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user