diff --git a/impl/linux.js b/impl/linux.js index 56e50a5..5e0dd4e 100644 --- a/impl/linux.js +++ b/impl/linux.js @@ -1,22 +1,39 @@ -var spawn = require('child_process').spawn; +var childProcess = require('child_process'); -var amixer = function (args, cb) { +var isUbuntu = function (cb) { + childProcess.exec('uname -a', (err, stdout, stderr) => { + if (err) return cb(err); + return cb(null, stdout.toLowerCase().indexOf('ubuntu') > -1); + }); +}; + +var amixer = function (args, cb) { var ret = ''; var err = null; - var p = spawn('amixer', args); + + isUbuntu((err, ubuntu) => { + if (err) return cb(err); - p.stdout.on('data', function (data) { - ret += data; - }); - - p.stderr.on('data', function (data) { - err = new Error('Alsa Mixer Error: ' + data); - }); + if (ubuntu) { + args.unshift('pulse'); + args.unshift('-D'); + } + + var p = childProcess.spawn('amixer', args); + p.stdout.on('data', function (data) { + ret += data; + }); + + p.stderr.on('data', function (data) { + err = new Error('Alsa Mixer Error: ' + data); + }); + + p.on('close', function () { + cb(err, ret.trim()); + }); - p.on('close', function () { - cb(err, ret.trim()); }); }; @@ -101,7 +118,13 @@ module.exports.getMuted = function (cb) { }; module.exports.setMuted = function (val, cb) { - amixer(['set', 'PCM', (val?'mute':'unmute')], function (err) { - cb(err); + defaultDevice(function (err, dev) { + if (err) { + cb(err); + } else { + amixer(['set', dev, (val?'mute':'unmute')], function (err) { + cb(err); + }); + } }); }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3b3c647 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,160 @@ +{ + "name": "loudness", + "version": "0.2.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + } + } +} diff --git a/test/basics.js b/test/basics.js index a34fff4..cd25f81 100644 --- a/test/basics.js +++ b/test/basics.js @@ -37,14 +37,35 @@ describe('loudness', function () { }); it('should set and get the volume', function (done) { - loudness.setVolume(15, function (err) { + // test all options - from 0% to 100% + var indexes = Array.apply(null, {length: 101}).map(Number.call, Number); + async.eachSeries(indexes, function (index, next) { + loudness.setVolume(index, function (err) { + + assert.ifError(err); + + loudness.getVolume(function (err, vol) { + + assert.ifError(err); + assert.equal(vol, index); + + next(); + }); + }); + }, function () { + done(); + }); + }).timeout(5000); + + it('should mute the volume', function (done) { + loudness.setMuted(true, function (err) { assert.ifError(err); - loudness.getVolume(function (err, vol) { + loudness.getMuted(function (err, mute) { assert.ifError(err); - assert.equal(vol, 15); + assert.equal(mute, true); done(); }); @@ -52,15 +73,15 @@ describe('loudness', function () { }); }); - it('should set and get the mute state', function (done) { - loudness.setMuted(true, function (err) { + it('should unmute the volume', function (done) { + loudness.setMuted(false, function (err) { assert.ifError(err); loudness.getMuted(function (err, mute) { assert.ifError(err); - assert.equal(mute, true); + assert.equal(mute, false); done(); });