node-pulseaudio-control/main.js

81 lines
1.8 KiB
JavaScript

const nativeCode = require('bindings')(miccontrol.node);=
let connectionStarted = false;
let connected = false;
let queuedRequests = [];
let aAddon = [
"connectToPulse",
"getSources"
].reduce((obj, fn) => {
obj[fn] = asyncify(nativeCode[fn]);
return obj;
}, {});
module.exports = () => {
if(!connectionStarted) {
aAddon.connectToPulse().then((e) => {
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;
}
function asyncify(fn) {
return async function(...args) {
return new Promise((res, rej) => {
fn(...args, (e, value) => {
if(e) {
return rej(e);
}
return res(value);
});;
});
};
}