81 lines
1.8 KiB
JavaScript
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);
|
|
});;
|
|
});
|
|
};
|
|
}
|
|
|