Ограничение громкости только в наушниках

Big Sur был выпущен вчера, и даже с его новым блестящим пользовательским интерфейсом для управления громкостью Apple снова не смогла добавить возможность его ограничения.

Теперь, когда мы знаем, что в ближайшее время мы не получим собственный контроль ограничения громкости, мы можем немного улучшить сценарий.

Мое текущее решение, которое я подробно описал в моем предыдущем посте, далеко от совершенства, но оно хорошо сработало для меня и некоторых других людей.

У него даже есть некоторые варианты использования, которые я не учел, когда писал сценарий. Хлоя Чассани пользуется этим, чтобы использовать пару сломанных наушников EarPods.

Обнаружение наушников

Ранхиру Джуд Курей улучшил скрипт, чтобы использовать SwitchAudioSource для определения того, подключены ли ваши наушники.

Вы можете ознакомиться с полным решением в его сообщении в блоге. Короче говоря, вам нужно установить SwitchAudioCore с помощью homebrew, а затем запустить установленную программу как сценарий оболочки. Вот этот бит, извлеченный из кода Ранхиру:

this.app.doShellScript(‘/usr/local/bin/SwitchAudioSource -c’)

Если подключены стандартные наушники, это должно выводить «Внешние наушники».

К сожалению, это решение не работает для меня. В моем случае SwitchAudioSource не возвращает разные значения при подключении наушников или использовании внутренних динамиков. Он просто постоянно говорит «Встроенный вывод».

Похоже, есть открытая проблема, связанная с этой проблемой: SwitchAudioSource не будет работать стабильно в версиях Mac OS.

Использование system_profiler

Проблема, о которой мы говорили, связана с потоком StackOverflow, где пользователь jordan314 предложил использовать system_profiler для проверки источника звука следующим образом:

Приведенный выше сценарий просто ищет строку «Наушники» с помощью grep на выходеsystem_profiler SPAudioDataType.

Это отлично работает, если вы используете только проводные наушники, но не работает при использовании наборов Bluetooth. В моем случае, когда у меня ничего не подключено, скрипт возвращает:

И когда я подключаю свои проводные наушники, он просто меняет «Встроенный выход» следующим образом:

Built-in Output:
 Default Output Device: Yes
 Default System Output Device: Yes
 Manufacturer: Apple Inc.
 Output Channels: 2
 Current SampleRate: 44100
 Transport: Built-in
 Output Source: Headphones

Проверка всех видов наушников

Моя первая попытка состояла в том, чтобы использовать это регулярное выражение, которое соответствует любому имени источника вывода в записи, содержащей строку Устройство вывода по умолчанию: Да.

Но это не работает, когда я использую наушники Bluetooth. В этом случае вывод добавляет два дополнительных устройства (ввод и вывод) и перемещает Default Output Device: Yes в новую запись с бесполезным значением По умолчанию в разделе Источник вывода.

Jabra Elite Active 65t:
 Default Output Device: Yes
 Default System Output Device: Yes
 Manufacturer: 67
 Output Channels: 2
 Current SampleRate: 48000
 Transport: Bluetooth
 Output Source: Default

Итак, в конце концов, я решил просто определить, когда мои внутренние динамики не являются устройством вывода по умолчанию, поскольку у меня нет внешних динамиков Bluetooth, это должно сработать для меня. Вы можете проверить регулярное выражение, которое я использую для этого, здесь.

У вас могут быть другие потребности, возможно, у вас есть колонки Bluetooth или какая-то другая установка. Если это ваш случай, вам нужно будет адаптировать сценарий к вашим потребностям. Просто поиграйте с выводом system_profiler и проверьте желаемые условия.

Адаптация нашего скрипта PurrfectVolume

Наше оригинальное приложение PurrfectVolume было просто AppleScript, написанным на Javascript. Чтобы выполнить обнаружение устройства вывода, подробно описанное в предыдущем разделе, нам просто нужно выполнить system_profiler как сценарий оболочки и сопоставить его вывод с созданным нами регулярным выражением. Код выглядит так:

Мы использовали обработчик idle() AppleScript для проверки громкости каждые полсекунды. Теперь мы также будем проверять, подключены ли наши наушники или нет, каждые полсекунды.

Теперь наш скрипт будет автоматически ограничивать громкость только тогда, когда это необходимо, и, надеюсь, позволит нам включить музыку в колонки, когда мы будем праздновать конец эры COVID.

Наш окончательный сценарий выглядит так:

Обратите внимание: это не сработает, если вы не сохраните сценарий как приложение, поскольку это единственный сценарий, в котором работает наш idle() обработчик. Если приложение-скрипт с открытым кодом включает обработчик простоя, Applescript периодически отправляет приложению команды простоя каждые X секунд, где X - значение, возвращаемое самим обработчиком (или 30 по умолчанию).

Скрипт также будет показывать уведомление каждый раз, когда мы подключаем или отключаем наши наушники, предупреждая пользователя о наличии / отсутствии ограничения громкости.

Вы можете скачать обновленное приложение здесь. Инструкции по созданию собственного приложения или его адаптации вы можете найти в моем предыдущем посте. Вы можете найти код в том же репозитории.

Подведение итогов

Печально, что Apple пока не предлагает интегрированного решения для ограничения громкости. Даже недавно выпущенный обновленный центр управления Big Sur с настройками громкости, похоже, не исправляет этого.

У вас могут быть разные потребности, и вы просто хотите проверить, подключено ли ваше конкретное устройство, или избежать затемнения некоторых динамиков Bluetooth. В этом случае вы можете просто поиграть с выводом system_profiler.

Если после прочтения этого поста у вас по-прежнему возникают проблемы с адаптацией скрипта, вы всегда можете оставить комментарий, я буду рад вам помочь.

Престижность Ранхиру за первоначальную версию для проверки наушников и за то, что поделился ею со всеми.