airtunes2
Version:
an AirTunes v2 implementation: stream wirelessly to audio devices.
58 lines (49 loc) • 1.67 kB
JavaScript
var airtunes = require('../lib/'),
spawn = require('child_process').spawn,
argv = require('optimist')
.usage('Usage: $0 --host [host] --port [num] --ffmpeg [path] --file [path] --volume [num] --password [string]')
.default('port', 5002)
.default('volume', 50)
.default('ffmpeg', '/usr/local/bin/ffmpeg')
.default('file', './wakeup.mp3')
.demand(['host'])
.argv;
console.log('adding device: ' + argv.host + ':' + argv.port);
var device = airtunes.add(argv.host, argv);
// when the device is online, spawn ffmpeg to transcode the file
device.on('status', function(status) {
console.log('status: ' + status);
if(status !== 'ready')
return;
var ffmpeg = spawn(argv.ffmpeg, [
'-i', argv.file,
'-f', 's16le', // PCM 16bits, little-endian
'-ar', '44100', // Sampling rate
'-ac', 2, // Stereo
'pipe:1' // Output on stdout
]);
// pipe data to AirTunes
ffmpeg.stdout.pipe(airtunes);
// detect if ffmpeg was not spawned correctly
ffmpeg.stderr.setEncoding('utf8');
ffmpeg.stderr.on('data', function(data) {
if(/^execvp\(\)/.test(data)) {
console.log('failed to start ' + argv.ffmpeg);
process.exit(1);
}
});
});
// monitor buffer events
airtunes.on('buffer', function(status) {
console.log('buffer ' + status);
// after the playback ends, give some time to AirTunes devices
if(status === 'end') {
console.log('playback ended, waiting for AirTunes devices');
setTimeout(function() {
airtunes.stopAll(function() {
console.log('end');
process.exit();
});
}, 2000);
}
});