From 47761dbaa769b60759924d1edd4d1e71aa275531 Mon Sep 17 00:00:00 2001 From: Grief Date: Fri, 19 Sep 2025 15:13:42 +0100 Subject: [PATCH] toggle-audio.ts --- bin/toggle-audio.ts | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 bin/toggle-audio.ts diff --git a/bin/toggle-audio.ts b/bin/toggle-audio.ts new file mode 100755 index 0000000..9d649b0 --- /dev/null +++ b/bin/toggle-audio.ts @@ -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();