node-pulseaudio-control/main.js

71 lines
1.7 KiB
JavaScript
Raw Permalink Normal View History

2018-04-20 04:01:34 +00:00
const nativeCode = require('bindings')('miccontrol.node');
2018-04-20 17:29:09 +00:00
const {promisify} = require("util");
2018-04-16 23:42:55 +00:00
let connectionStarted = false;
let connected = false;
let queuedRequests = [];
2018-04-20 17:29:09 +00:00
2018-04-16 23:42:55 +00:00
let aAddon = [
"connectToPulse",
2018-04-20 17:29:09 +00:00
//"getSources"
2018-04-16 23:42:55 +00:00
].reduce((obj, fn) => {
2018-04-20 17:29:09 +00:00
obj[fn] = promisify(nativeCode[fn]);
2018-04-16 23:42:55 +00:00
return obj;
}, {});
module.exports = () => {
2018-04-20 17:29:09 +00:00
console.log("Starting connection");
2018-04-16 23:42:55 +00:00
if(!connectionStarted) {
2018-04-20 17:29:09 +00:00
nativeCode.connectToPulse((e) => {
console.log("CONNECTED!");
2018-04-16 23:42:55 +00:00
if(e) {
connectionStarted = false;
} else {
connected = true;
}
queuedRequests.forEach(f => f(e));
queuedRequests = [];
});
connectionStarted = true;
}
const miccontrol = {
getSources: () => {
return new Promise(async (res, rej) => {
if(!connected) {
return queuedRequests.push(e => e ? rej(e) : res(miccontrol.getSources()));
}
const sources = await aAddon.getSources();
const sourceControllers = sources.map((source) => {
let {id, description, isDefault} = source;
return {
id,
description,
isDefault,
mute: async () => {
return aAddon.muteSource(id);
},
unmute: async () => {
return aAddon.unmuteSource(id);
},
isMuted: async () => {
return aAddon.isSourceMuted(id);
},
toggleMute: async () => {
2018-04-20 04:01:34 +00:00
if(await aAddon.isSourceMuted(id)) {
2018-04-16 23:42:55 +00:00
return aAddon.unmuteSource(id);
}
return aAddon.muteSource(id);
}
};
});
res(sourceControllers)
});
}
};
return miccontrol;
}