toggle-audio.ts
parent
445b8171a6
commit
47761dbaa7
|
|
@ -0,0 +1,95 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
import { execSync } from 'child_process';
|
||||||
|
|
||||||
|
const HDMI_OUTPUT = 'alsa_output.pci-0000_01_00.1.hdmi-stereo';
|
||||||
|
const ANALOG_OUTPUT = 'alsa_output.pci-0000_08_00.6.analog-stereo';
|
||||||
|
|
||||||
|
interface AudioDevice {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCurrentActiveSink(): AudioDevice | null {
|
||||||
|
try {
|
||||||
|
const output = execSync('wpctl status -n', { encoding: 'utf8' });
|
||||||
|
const lines = output.split('\n');
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
if (line.includes('*') && (line.includes(HDMI_OUTPUT) || line.includes(ANALOG_OUTPUT))) {
|
||||||
|
// Извлекаем ID (число после звездочки и точки)
|
||||||
|
const match = line.match(/\*\s+(\d+)\./);
|
||||||
|
if (match) {
|
||||||
|
const id = match[1];
|
||||||
|
if (line.includes(HDMI_OUTPUT)) {
|
||||||
|
return { id, name: HDMI_OUTPUT };
|
||||||
|
} else if (line.includes(ANALOG_OUTPUT)) {
|
||||||
|
return { id, name: ANALOG_OUTPUT };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Ошибка при получении текущего аудио устройства:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDeviceId(deviceName: string): string | null {
|
||||||
|
try {
|
||||||
|
const output = execSync('wpctl status -n', { encoding: 'utf8' });
|
||||||
|
const lines = output.split('\n');
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
if (line.includes(deviceName)) {
|
||||||
|
// Извлекаем ID (число после пробелов и точки)
|
||||||
|
const match = line.match(/\s+(\d+)\./);
|
||||||
|
if (match) {
|
||||||
|
return match[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Ошибка при поиске ID устройства:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDefaultSink(deviceName: string): void {
|
||||||
|
const deviceId = getDeviceId(deviceName);
|
||||||
|
if (!deviceId) {
|
||||||
|
console.error(`Не удалось найти ID для устройства: ${deviceName}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
execSync(`wpctl set-default ${deviceId}`, { stdio: 'inherit' });
|
||||||
|
console.log(`Переключен аудио выход на: ${deviceName} (ID: ${deviceId})`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Ошибка при переключении аудио устройства:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function main(): void {
|
||||||
|
const currentSink = getCurrentActiveSink();
|
||||||
|
|
||||||
|
if (!currentSink) {
|
||||||
|
// Если ни один из целевых sink'ов не активен, выбираем аналоговый
|
||||||
|
console.log('Ни один из целевых аудио выходов не активен. Переключаемся на аналоговый.');
|
||||||
|
setDefaultSink(ANALOG_OUTPUT);
|
||||||
|
} else if (currentSink.name === HDMI_OUTPUT) {
|
||||||
|
// Если активен HDMI, переключаемся на аналоговый
|
||||||
|
console.log('Активен HDMI выход. Переключаемся на аналоговый.');
|
||||||
|
setDefaultSink(ANALOG_OUTPUT);
|
||||||
|
} else if (currentSink.name === ANALOG_OUTPUT) {
|
||||||
|
// Если активен аналоговый, переключаемся на HDMI
|
||||||
|
console.log('Активен аналоговый выход. Переключаемся на HDMI.');
|
||||||
|
setDefaultSink(HDMI_OUTPUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
Loading…
Reference in New Issue