Использование Apple Script для управления выбором вывода звука

Я новичок здесь, и у меня есть дополнительное разъяснение или мне нужна дополнительная помощь по проблеме из этой темы - Applescript: «не удается получить группу вкладок 1 окна» (El Capitan)

В моей панели предпочтений, в дополнение к наушникам и цифровому выходу, у меня также есть 2 монитора Apple, и я хотел бы выбрать один из них в качестве выхода (а именно, первый в списке).

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

Добро пожаловать в Ask Different. Я связал это с другим вопросом. Не могли бы вы отредактировать свой пост, чтобы показать, что у вас есть? Возможно добавление изображения экрана панели настроек. Я добавлю ответ, который не требует какого-либо изучения AppleScript, если это проблема.

Ответы (5)

Немного поэкспериментировав со сценарием Артура Хаммера, я обнаружил, что строки set deviceselected to "xyz"представляют собой просто визуальную обратную связь в редакторе сценариев и, похоже, не являются частью реальной функциональности.

Фактическое переключение происходит только между двумя выбранными строками в панели управления; поэтому, если вам просто нужно переключаться между любыми двумя выходами, вы можете просто использовать номера строк.

В этом примере я выделил их как переменные, поэтому вам не нужно копаться в скрипте, чтобы изменить нужные строки…

Поскольку у вас более 2 выходов, при первом переключении он не обязательно будет идти с/на правильное устройство, но после этого.
Например, если вы хотите переключиться между выходами 3 и 4, но в данный момент выбран 2, первое изменение будет с «не 3», а не «равно 3» [надеюсь, вы понимаете это запутанное объяснение]

(*
Applescript to toggle between two sound outputs by Line number, ¬
as they appear in the Sound Control Panel. Based on code by ¬
Arthur Hammer http://apple.stackexchange.com/a/209434/85275
*)

set outputA to 3 --change this to the actual 'line number' of your first desired output
set outputB to 4 --change this to the actual 'line number' of your second desired output
--the rest of the script will use these vales as a switch

tell application "System Preferences"
    activate
    set current pane to pane "com.apple.preference.sound"
end tell


tell application "System Events"
    tell application process "System Preferences"
        repeat until exists tab group 1 of window "Sound"
        end repeat
        tell tab group 1 of window "Sound"
            click radio button "Output"
            if (selected of row outputA of table 1 of scroll area 1) then
                set selected of row outputB of table 1 of scroll area 1 to true
            else
                set selected of row outputA of table 1 of scroll area 1 to true
            end if
        end tell
    end tell
end tell
--tell application "System Preferences" to quit
--remove the comment '--' tag above to make the control panel quit afterwards, leave for testing.

Возможно, небольшое графическое пояснение — используя приведенный выше сценарий с outputA = 3 и outputB = 4, теперь я могу переключаться между цифровым выходом и TonePort UX2.

Еще одно замечание: номера строк не обязательно должны быть последовательными, я мог бы так же легко переключаться между внутренними динамиками и TonePort, используя строки 1 и 4.

введите описание изображения здесь

Обратите внимание, что если вы хотите выбрать устройства AirPlay, разделительная линия считается одним элементом.
Красиво работал. Я использовал рабочий процесс Альфреда с помощью сочетания клавиш Shift + Ctrl + Cmd + S. Большое спасибо!

@Tetsujin - спасибо за это решение. Работает отлично. Я использую его для переключения между моим встроенным звуком (когда я кодирую для работы) и моей картой Universal Audio Apollo (когда я занимаюсь созданием музыки). Поскольку устройство UAudio также предоставляет превосходную опцию входного микрофона, я также добавил очевидный переключатель входа после вашего раздела «Выход»:

    click radio button "Input"
    if (selected of row outputA of table 1 of scroll area 1) then
       set selected of row outputB of table 1 of scroll area 1 to true
    else
       set selected of row outputA of table 1 of scroll area 1 to true
    end if

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

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

ignoring application responses
    tell application "System Events" to tell process "SystemUIServer"
        click menu bar item 5 of menu bar 1 -- May need to change the index as needed
    end tell
end ignoring

-- Optional, but just to avoid the 5-6sec delay
delay 0.25
do shell script "killall System\\ Events"

tell application "System Events" to tell process "SystemUIServer"
    tell menu bar item 5 of menu bar 1
        set device1 to menu item "Name of Device 1" of menu 1
        set device2 to menu item "Name of Device 2" of menu 1

    if (value of attribute "AXMenuItemMarkChar" of device1) as string is "✓" then
        click device2
    else
        click device1
    end if

    end tell
end tell

Я не могу угадать общий AppleScript, но мне нравится и я использую Automator для записи необходимых шагов.

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

Обычно вы можете просматривать действия и обрезать их или добавлять задержки, если это необходимо, с помощью Automator, и вам не нужно знать, как программировать строки и элементы в Applescript.

Я пробовал это несколько раз без успеха. Кажется, не работает под Эль-Капитаном. Решение AppleScript из другого потока работает очень хорошо, но, кажется, ориентировано только на 2 варианта наушников или цифрового выхода. Я уверен, что есть относительно простая версия сценария, чтобы заставить его работать.
Мне все еще нужна решимость, и у меня нет возможности связаться с Артуром Хаммером, у которого было замечательное решение в упомянутой ветке. Г-н Артур Хаммер, надеюсь, вы наткнетесь на это и сможете помочь!
@bmike - я изменил сценарий Артура, чтобы дать работоспособное решение для n выходов. Это немного вручную, но довольно просто настроить.

ребята! Сценарий ниже был подготовлен мной, и ему не важно, сколько у вас на самом деле устройств. Это сработает в любом случае:

tell application "System Preferences" to ¬
    reveal anchor "output" of pane id "com.apple.preference.sound"

tell application "System Events"
    tell application process "System Preferences"
        repeat until exists tab group 1 of window "Sound"
            delay 0.1
        end repeat
        
        tell tab group 1 of window "Sound"
            set DevicesCount to count rows of table 1 of scroll area 1
            repeat with n from 0 to DevicesCount
                if (selected of row n of table 1 of scroll area 1) then
                    set SelectedDevice to n
                end if
            end repeat
            if (SelectedDevice < DevicesCount) then
                set NewDevice to SelectedDevice + 1
                set selected of row NewDevice of table 1 of scroll area 1 to true
            else
                set selected of row 1 of table 1 of scroll area 1 to true
            end if
            
        end tell
    end tell
end tell

quit application "System Preferences"
Э... возможно, немного больше описания того, что означает "это сработает". Что именно этот скрипт принимает и вводит? какое действие выполняет? Спасибо!
Спасибо за ваш вопрос. Он просто открывает параметры звука в Системных настройках, а затем подсчитывает, сколько у вас устройств вывода. После этого выбирается следующее устройство. Если выбранное устройство было последним, будет выбрано первое. Таким образом, мы можем просто перебирать любое количество устройств, не заботясь о том, сколько из них у нас есть.
Другими словами, это даст вам возможность выбрать следующее устройство вывода по итерации. Все примеры, которые я нашел, просто выбирают устройство с определенным идентификатором. В случае, если количество устройств изменится (например, просто подключите Bluetooth-гарнитуру), мой скрипт все равно будет работать, другие нет.
Точно! У меня есть сценарий, который выберет n-е устройство вывода из списка, но произойдет сбой, если список изменится. Мне нужен скрипт, который выбирает имя устройства «AirPod Max» независимо от того, где этот элемент находится в списке. Но я не могу понять, где ввести «AirPods Max» в ваш скрипт. В самом деле, я не могу сказать, как ваш сценарий знает, на какой строке остановиться! Вы продолжаете вызывать свой сценарий и проверять буфер обмена? Я просто не понимаю!