Введение
История проблемы, которую я создал, чтобы ее решить, берется из того, что я работаю PM, а значит около 80% моего рабочего времени – это созвоны, конференции, синки, стендапы и прочие малоприятные вещи, а также из проблемы с концентрацией вне рамок коммуникации. Для того чтобы сконцентрироваться, я использую фоновый звук (дождь, ветер, море), но при этом в эти моменты я предпочитаю сидеть без наушников, чтобы, так сказать, дышало. Но меня долгое время бесило то, что чтобы переключить аудио устройство в macOS, необходимо тянуться курсором в правый угол, открывать центр управления, выбирать раздел звук и из обширного списка выбирать нужное устройство. Казалось бы, ничего сложного, однако бывают случаются внезапные и срочные созвоны, задержка подключения к которым может вызвать вопросики.
Стоит также отметить, что я не обладаю какими-то глубокими навыками и познаниями в разработке, в написании скриптов и т.д., но имею внезапно появившееся желание сделать свое рабочее пространство удобнее.
Итак, положив эту проблему в одну руку, а гугл в другую, я занялся поиском, задавался ли кто-то решением этой проблемы. Разведка конкретных результатов не дала, и этот факт впоследствии и стал основной причиной написания этого текста, поскольку вдруг он поможет какому-нибудь такому же бедолаге решить надуманную проблему. В этом месте стоит оговориться, что я призывал себе в помощь ChatGPT, чтобы она дала мне основное направление, а впоследствии, чтобы помогла с написанием скриптов.
1. Проработка вариантов
Сперва, мне хотелось решить это, не прибегая к установке внешних компонентов, и я стал копать под Automator и AppleScript. Найдя информацию, по всей видимости подходящую для старых версий ОС (а выполнял я все это на актуальной на момент написания macOS 15.01), я понял, что мне может помочь следующий скрипт:
tell application "System Preferences"
reveal pane id "com.apple.preference.sound"
end tell
tell application "System Events"
tell process "System Preferences"
click the radio button "Output" of tab group 1 of window "Sound"
select (row 1 of table 1 of scroll area 1 of tab group 1 of window "Sound")
end tell
end tell
quit application "System Preferences"
в котором row 1 необходимо заменить на нужную строку из раздела «Звук» системных настроек.
Сделав несколько попыток, на каждую получил следующую реакцию системы:
error "Получена ошибка от «System Settings»: Не удается получить pane id \"com.apple.preference.sound\"." number -1728 from pane id "com.apple.preference.sound"
И я снова углубился в поиски и разговоры с GPT. Стало ясно, что начиная с macOS Ventura изменился идентификатор панели и (вероятно!) AppleScript не может получить доступ к настройкам так, как это происходило раньше. Решил изменить подход и все-таки прибегнуть к помощи стороннего ПО.
2. Установка SwitchAudioSource
В процессе поиска я обнаружил упоминания утилиты switchaudio-osx, которая устанавливается через Homebrew. Она позволяет переключать аудиоустройства через терминал и отлично интегрируется с AppleScript и Automator.
Алгоритм установки, проверки и получения данных не слишком сложен:
Открываем терминал и вводим следующую команду:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2. Терминал попросит ввести пароль от системы (не стоит пугаться, что пароль не отображается в терминале). Если все прошло корректно, перед вами должна быть такая картина:
3. Теперь необходимо установить switchaudio-osx. Для этого в терминал вводим следующую строку::
brew install switchaudio-osx
Привожу скриншот, который я сделал при написании, но на нем система говорит, что данный компонент уже установлен. В любом случае, система должна сообщить, что все установлено.
4. Теперь для проверки корректности установки необходимо ввести команду:
SwitchAudioSource -a
И если все было выполнено корректно, в терминале отобразится перечень всех аудиоустройств:
Копируем этот список куда-нибудь «на всякий случай», однако меня в данном случае интересовало ровно два устройства: Динамики MacBook Air и JBL Quantum 600 Game.
5. Получение пути установки SwitchAudioSource.
На следующем шаге нам пригодится точный путь, куда установлена утилита. Для этого в терминал вводим команду:
which SwitchAudioSource
терминал возвращает нам необходимый путь. Его также целесообразно скопировать куда-нибудь на потом.
Подготовка скриптов на AppleScript
Далее необходимо опробовать, работают ли скрипты с тем, что у нас есть.
Открываем приложение «Редактор скриптов». В верхнем меню нажимаем «Файл» - «Новый» и вводим в поле следующий скрипт:
do shell script "/opt/homebrew/bin/SwitchAudioSource -s 'JBL Quantum 600 Game'"
Вместо «JBL Quantum 600 Game» указываем необходимое устройство из списка, полученного ранее. Запускаем его кнопкой «Запустить скрипт» (треугольник, аналогичный Play во всех плейерах). В результате мы должны увидеть следующее:
Для того, чтобы удостовериться, что устройство действительно переключилось, можно проверить это в системных настройках, или же, что более наглядно, перед переключением запустить, например, музыку.
Аналогичный скрипт готовим для второго аудиоустройства.
Сохраняем эти скрипты с понятным и узнаваемым названием, например «SwitchToLaptopSpeakers» и «SwitchToHeadphones», и форматом файла «Программа».
4. Автоматизация и Automator
Чтобы не приходилось каждый раз искать файлы скриптов, а также тыкать какие-то кнопки на экране (иначе чем все это отличается, от способа предлагаемого macOS?), необходимо этот процесс автоматизировать.
Запускаем приложение Automator, в верхней панели нажимаем «Файл» - «Новый». В открывшемся окне выбираем «Быстрое действие» (оно же в системе называется «Службы»):
В появившемся окне вверху указываем, что процесс не получает входных данных в любой программе, а в среднем столбце ищем «Запустить программу» и перетаскиваем в правое поле. В этом блоке выбираем один из ранее подготовленных скриптов-программ.
И сохраняем нашу службу под понятным названием, например, Switch to Laptop Speakers.
Аналогичные действия выполняем для второго устройства.
Итак, на данный момент у нас подготовлены две службы, которые переключают аудиоустройства. Теперь перейдем непосредственно к их быстрому запуску.
5. Настройка горячих клавиш
Чтобы запускать переключение сочетанием клавиш, заходим в «Системные настройки» – «Клавиатура» – «Сочетания клавиш». В появившемся окне слева выбираем «Службы» и раскрываем список «Основные».
Щелкаем дважды на одну из наших служб и вводим комбинацию из трех клавиш. Я выбрал для своих [Shift] [Command] [8] и [Shift] [Command] [9].
Все. Теперь при нажатии этих комбинаций будет происходить переключение звука.
6. Уведомления
В процессе тестового использования стало понятно, что не хватает какого-то визуального сигнала, что устройство переключено. Здесь нам на помощь также могут прийти скрипты и системные уведомления (которые выскакивают в правом верхнем углу экрана). Всего лишь необходимо дополнить наши скрипты одной строкой, чтобы они выглядели следующим образом:
do shell script "/opt/homebrew/bin/SwitchAudioSource -s 'JBL Quantum 600 Game'"
display notification "Переключено на JBL Quantum 600 Game" with title "Аудио устройство переключено"
Вторая строка, собственно, и вызывает системное уведомление с указанным текстом и заголовком. Вот как это выглядит:
Теперь этим можно пользоваться, но моя душа пожелала большего. Я задумался о макропаде.
7. Макропад и запуск скриптов через него
Я для себя решил, что для того, чтобы выполнять переключение устройств быстро, одним движением, мне нужен макропад (плюс, это возможность для экспериментов в будущем). Я перебрал кучу ноунеймов от китайских производителей, некоторые кастомные сборки и дорогие стриммерские. Но остановил свой выбор на GeekBoards Macropad 2 по следующим причинам:
Поддержка VIA (VIA — это платформы для кастомизации макропадов и клавиатур. Использование VIA упрощает настройку макросов через графический интерфейс, без необходимости в прошивке устройства);
Качество сборки. Поскольку geekboards довольно известен среди пользователей механических клавиатур, решил довериться их производству;
Поддержка macOS. Как мне стало понятно, далеко не для каждого макроапда есть ПО на macOS, а морочиться с виртуалками мне не хотелось.
Есть обширное комьюнити VIA.
С мыслью «хочу» я поехал в шоурум geekboards, где меня расстроили тем, что макропад временно (временно ли?) снят с производства и в наличии его нет. Но мне повезло. Я нашел чуть ли не единственное объявление на авито и тут же заказал его за половину цены нового.
Итак. Макропад передо мной, и я начинаю изучать документацию. Что нам нужно для настройки? Всего лишь одна утилита – VIA. Найти можно на сайте geekboards, либо на сайте сообщества VIA.
Подключаем наш макропад к компьютеру, запускаем установленную VIA, и нас встречает приятный интерфейс.
Далее я опишу только те инструменты, которые необходимы для моего случая.
Поскольку я шел путем использования сочетания клавиш, то именно это мы и будем привязывать к клавишам макропада.
В нижней левой части программы выбираем солярный знак, названный «MACROS» и попадаем в редактор макросов.
Теперь необходимо переключиться в режим ручного ввода макросов, нажав на кнопку, выделенную на скриншоте красным прямоугольником. Здесь нас встречает текстовое поле и подсказка как необходимо указывать ключи клавиш.
Поскольку мы используем сочетание клавиш, нам необходимо ввести его в формате Chord. На этой же странице есть ссылка на страницу QMK Firmware с кодами клавиш.
В нашем случае вводим для макроса М0 сочетание {KC_LGUI,KC_LSFT,KC_9}, а для М1 {KC_LGUI,KC_LSFT,KC_8}. Не забываем сохранить. Если вернуться обратно к графическому отображению макросов, то можно увидеть, что именно мы ввели. То есть, видим «нажатие» сочетания клавиш и их «отжатие».
Теперь снова возвращаемся на первоначальную страницу «KEYMAP» и выбираем категорию MACRO. Перед нами будет графическое изображение макропада и 16 доступных ячеек макросов от М0 до М15.
Нажимаем на графическом изображении макропада кнопку, к которой хотим привязать необходимое действие (кнопка начинает моргать), и нажимаем на одну из использованных нами ранее ячеек макросов. В моем случае – М0 и М1. Аналогично действуем со второй кнопкой. Если на кнопках появились соответствующие надписи, значит все получилось.
Теперь можно проверять, как это работает и бесконечно переключать устройства.
Заключение
Достиг ли я желаемого результата? Да, поскольку теперь при внезапном звонке я давлю одну кнопку, мгновенно переключая устройство. Это сделало мое рабочее место удобнее. Ну и вообще, это прикольно.
Также хочу напомнить, что все это я проделал, не имея никаких знаний по AppleScripts и Automator, а также никогда не слышав ранее про SwitchAudioSource. На всем пути я просто задавал интересующие меня вопросы ChatGPT, и мы вместе искали пути решения возникающих задач. Что это значит? Это значит, что в наше время любой, кто просто захочет попробовать что-то сделать, может сделать это с нулем знаний на входе, а в процессе наметит себе путь для развития.
Также, вот несколько мыслей для развития моего решения:
Добавление изображения в уведомление о переключении (возможно, с использованием terminal-notifier);
Исключение из процесса создания приложения на AppleScript, либо отказ от использования прописанного сочетания клавиш;
Переключение на сразу два устройства (например физические наушники и виртуальное устройства для записи).
Sazonov
Не совсем по теме, но может подскажете в какую сторону копать? При созвонах через zoom упорно используется первый аудиовыход на моей внешней звуковой карте. Хотя по умолчанию стоит третий (через коаксиал) и во всех остальных приложениях это работает. Как это можно исправить?
Lepazhpol Автор
Не подскажете ОС и модель звуковой?
Sazonov
macOS 15 (но и в предыдущих так же было), Komplete Audio 6
Lepazhpol Автор
Навскидку могу предположить, что это может быть связано с тем, как Zoom выбирает аудиовыход (он также и прописывает в системе виртуальное аудиоустройство). Попробуйте в настройках клиента (Настройка - Аудио) и выберете нужный аудиовыход вручную. Часто Zoom игнорирует системные настройки и применяет свои.
Ну и также стандартное: проверьте последние ли драйверы звуковой установлены, сбросьте и переустановите Zoom.
И вариант из гугла, который проверить не могу. На macOS в приложении Audio MIDI Setup (Настройка MIDI) можно назначить каналы звуковой карте. Попробуйте создать конфигурацию, где третий аудиовыход будет основным, или задать агрегацию звуковых каналов, чтобы третий выход стал по умолчанию для всех приложений.
Sazonov
Да я всё это давно перепробовал. Увы. Я в сторону виртуальных устройств смотрел, но тоже не получилось с ходу завезти.
Lepazhpol Автор
Видел еще не вполне внятные упоминания Loopback и Soundflower. Вроде как можно как раз создать виртуальный аудиовыход.
Ну или же писать в сапорт зума и производителя карты
Lepazhpol Автор
Еще могу предложить попробовать утилиту, про которую пишет voooz в комментарии ниже
Sazonov
Спасибо. Увы не могу плюсануть, на днях кто-то слил карму :)
Lepazhpol Автор
Да не ради кармы же живем)