Uso de Apple Script para administrar la selección de salida de sonido

Soy nuevo aquí y tengo una aclaración adicional o necesito ayuda adicional para un problema de este hilo: Applescript: "no se puede obtener el grupo de pestañas 1 de la ventana" (El Capitán)

En mi panel de preferencias, además de los auriculares y la salida digital, también tengo 2 monitores Apple y me gustaría tener la opción de seleccionar uno de ellos como salida (es decir, el primero de la lista).

Básicamente, necesito ayuda para ajustar su solución para poder seleccionar la tercera fila o el primer monitor como salida de sonido. O una forma de lograr esto sin saber cómo editar AppleScript para una configuración diferente.

Bienvenido a Preguntar Diferente. He vinculado esto a la otra pregunta. ¿Podrías editar tu publicación para mostrar lo que tienes? Tal vez agregando una imagen de pantalla del panel de preferencias. Agregaré una respuesta que no requiere ningún tipo de aprendizaje de AppleScript si ese es el problema.

Respuestas (5)

Con un poco de experimentación con el guión de Arthur Hammer, descubrí que las líneas set deviceselected to "xyz"parecen ser solo comentarios visuales mientras estoy en el Editor de guiones y no parecen ser parte de la funcionalidad real.

El cambio real parece ser solo entre 2 líneas elegidas en el Panel de control; entonces, si solo necesita cambiar entre 2 salidas, puede usar los números de fila.

En este ejemplo, los eliminé para que fueran variables, por lo que no necesita profundizar en el script para cambiar las líneas requeridas...

Como tiene más de 2 salidas, la primera vez que cambie no necesariamente irá desde/hacia el dispositivo correcto, pero lo hará después de eso.
Por ejemplo, si desea cambiar entre las salidas 3 y 4, pero actualmente se seleccionó 2, el primer cambio sería de "no 3" en lugar de "es 3" [espero que comprenda esa complicada explicación]

(*
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.

Tal vez una pequeña aclaración pictórica: al usar el script anterior con salida A = 3 y salida B = 4, ahora puedo cambiar entre Digital Out y TonePort UX2.

Una nota más: los números de línea no tienen que ser consecutivos, podría cambiar fácilmente entre parlantes internos y TonePort usando las líneas 1 y 4.

ingrese la descripción de la imagen aquí

Tenga en cuenta que si desea seleccionar dispositivos AirPlay, la línea de separación cuenta como un elemento.
Funcionó maravillosamente. Usé el flujo de trabajo de Alfred con una tecla de método abreviado de Shift + Ctrl + Cmd + S. ¡Muchas gracias!

@Tetsujin: gracias por esta solución. Funciona perfectamente. Lo estoy usando para cambiar entre mi audio incorporado (para cuando estoy codificando para el trabajo) y mi tarjeta Universal Audio Apollo (para cuando estoy haciendo producción musical). Dado que el dispositivo UAudio también ofrece una opción de micrófono de entrada superior, también agregué el interruptor de entrada obvio después de la sección "Salida":

    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

En Mojave, por lo general cambio manualmente el dispositivo de salida desde el Control de volumen en el menú, así que automatizo lo mismo usando el AppleScript a continuación, que cambia según lo que está marcado/desmarcado.

Si usa esto con algunos lanzadores, entonces este enfoque no necesita permisos para las Preferencias.

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

No puedo adivinar un AppleScript general, pero me gusta y uso Automator para registrar los pasos necesarios.

Abra esa herramienta y cree un nuevo flujo de trabajo. Luego presione el botón de grabar. Luego puede grabar la secuencia utilizada para abrir las Preferencias del sistema, seleccionar el panel que desee, seleccionar el audio que desea y luego finalizar la grabación.

Por lo general, puede revisar las acciones y recortarlas o agregar demoras si es necesario usando Automator y no necesitará saber cómo programar las filas y los elementos en Applescript.

Lo he intentado varias veces sin éxito. No parece funcionar bajo El Capitán. La solución AppleScript del otro hilo funciona muy bien, pero parece enfocada solo para las 2 opciones de Auriculares o Salida digital. Estoy seguro de que hay una revisión relativamente simple del guión para que funcione.
Todavía necesito una resolución y no tengo forma de contactar a Arthur Hammer, quien tuvo una solución maravillosa en el hilo al que se hace referencia. Sr. Arthur Hammer, ¡espero que encuentre esto y pueda ayudar!
@bmike: modifiqué el script de Arthur para brindar una solución viable para n salidas. Es un poco manual pero bastante simple de modificar.

¡tipo! Ese script a continuación fue preparado por mí y no le importa cuántos dispositivos tiene realmente. Funcionará en cualquier caso:

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"
Uh... tal vez un poco más de descripción de lo que significa "funcionará". ¿Qué toma e ingresa exactamente este script? que accion realiza? ¡gracias!
Gracias por tu pregunta. Simplemente abre las opciones de Sonido en las Preferencias del Sistema, luego cuenta cuántos dispositivos de salida tienes. Después, selecciona el siguiente dispositivo. Si el dispositivo seleccionado fue el último, se elegirá el primero. Entonces, así es como podemos iterar sobre cualquier cantidad de dispositivos, y no preocuparnos por cuántos de ellos tenemos.
En otras palabras, le dará la opción de seleccionar el siguiente dispositivo de salida por iteración. Todos los ejemplos que encontré solo seleccionan un dispositivo con una identificación específica. En caso de que cambie la cantidad de dispositivos (solo conecte los auriculares Bluetooth, por ejemplo), mi script seguirá funcionando, otros no
¡Exactamente! Tengo una secuencia de comandos que seleccionará el dispositivo de salida n-th como se muestra en la lista, pero falla si la lista cambia. Quiero una secuencia de comandos que seleccione el nombre del dispositivo "AirPod Max" sin importar dónde aparezca este elemento en la lista. Pero no puedo averiguar dónde ingresar "AirPods Max" en su secuencia de comandos. ¡De hecho, no puedo decir cómo su secuencia de comandos sabe en qué fila detenerse! ¿Sigues llamando a tu script y revisando el portapapeles? ¡Simplemente no entiendo!