Add Linux support with application mute handling and startup script

This commit is contained in:
Robert Chery
2026-07-08 21:28:21 -04:00
parent 4b45c031e0
commit 5ff2e15571
3 changed files with 99 additions and 7 deletions

View File

@@ -148,6 +148,10 @@ async function connectToPico() {
}, 1000);
});
serialPort.on('error', (err) => {
console.error('Serial port error: ', err.message);
});
parser = serialPort.pipe(new ReadlineParser({ delimiter: '\n' }));
parser.on('data', async (line) => {
@@ -193,10 +197,46 @@ async function connectToPico() {
});
} else if (btn.actionType === "mute_app" && btn.cmd) {
console.log(`Toggling mute for: ${btn.cmd}`);
const svvPath = path.join(__dirname, 'SoundVolumeView.exe');
exec(`"${svvPath}" /Switch "${btn.cmd}"`, (error, stdout, stderr) => {
if (error) console.error(`Mute error: ${error}\n${stderr}`);
});
if (process.platform === 'win32') {
const svvPath = path.join(__dirname, 'SoundVolumeView.exe');
exec(`"${svvPath}" /Switch "${btn.cmd}"`, (error, stdout, stderr) => {
if (error) console.error(`Mute error: ${error}\n${stderr}`);
});
} else if (process.platform === 'linux') {
const cleanAppName = btn.cmd.replace(/\.exe$/i, '').toLowerCase();
exec('pactl list sink-inputs', (error, stdout, stderr) => {
if (error) {
console.error(`pactl error: ${error}\n${stderr}`);
return;
}
const blocks = stdout.split(/Sink Input #/i);
let found = false;
for (const block of blocks) {
if (!block.trim()) continue;
const lines = block.split('\n');
const index = parseInt(lines[0].trim());
if (isNaN(index)) continue;
const blockLower = block.toLowerCase();
const hasAppName = blockLower.includes(`application.name = "${cleanAppName}"`) ||
blockLower.includes(`application.name = '${cleanAppName}'`) ||
blockLower.includes(`application.process.binary = "${cleanAppName}"`) ||
blockLower.includes(`application.process.binary = '${cleanAppName}'`) ||
blockLower.includes(`media.name = "${cleanAppName}"`);
if (hasAppName) {
found = true;
console.log(`Found stream index ${index} for ${cleanAppName}, toggling mute...`);
exec(`pactl set-sink-input-mute ${index} toggle`, (err) => {
if (err) console.error(`Failed to mute sink input ${index}: ${err}`);
});
}
}
if (!found) {
console.log(`Application '${cleanAppName}' not found in active audio streams.`);
}
});
} else {
console.warn(`mute_app is not supported on platform: ${process.platform}`);
}
}
} else if (line.startsWith("R,")) {