node-pulseaudio-control/main.js

71 lines
1.7 KiB
JavaScript

const nativeCode = require('bindings')('miccontrol.node');
const {promisify} = require("util");
let connectionStarted = false;
let connected = false;
let queuedRequests = [];
let aAddon = [
"connectToPulse",
//"getSources"
].reduce((obj, fn) => {
obj[fn] = promisify(nativeCode[fn]);
return obj;
}, {});
module.exports = () => {
console.log("Starting connection");
if(!connectionStarted) {
nativeCode.connectToPulse((e) => {
console.log("CONNECTED!");
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 () => {
if(await aAddon.isSourceMuted(id)) {
return aAddon.unmuteSource(id);
}
return aAddon.muteSource(id);
}
};
});
res(sourceControllers)
});
}
};
return miccontrol;
}