0 votos

¿Cómo utilizar DDC/CI para cambiar la entrada de mi Mac cuando se le conecta un dispositivo USB?

Tengo un único monitor Dell con un Mac Studio conectado a él mediante USB-C y un portátil que ejecuta Ubuntu conectado mediante HDMI. También tengo un KVM pero solo lo uso para dispositivos de entrada, no para vídeo porque el KVM está basado en HDMI y quiero usar MonitorControl para controlar el brillo de la pantalla y eso requiere usar DP Alt Mode sobre USB-C (creo que es una limitación del M1 que no funciona bien con DDC/CI sobre HDMI por lo que he leído). Así que quiero usar DDC/CI para cambiar la entrada de vídeo de la pantalla cuando cambio el KVM.

0voto

nee123 Puntos 1

Después de trastear un poco he encontrado la solución, así que la expongo aquí por si a alguien más le sirve de ayuda:

Parece que hay varias aplicaciones de línea de comandos para el envío de comandos DDC / IC, pero el único que pude encontrar que trabajó en un mac M1 fue m1ddc .

Para activar esto en la conexión del hub usb del KVM usé launchd (el sistema de MacOS para lanzar programas basados en ciertas condiciones o eventos). Desafortunadamente si usas launchd para disparar un script de shell directamente ese script se ejecutará múltiples veces cuando se conecte el dispositivo porque launchd espera que el programa ejecutado registre que ha consumido el evento disparador. Para lidiar con esto usé esta pequeña y fantástica utilidad, xpc_set_event_stream_handler que proporciona un sencillo programa de arranque que marcará el evento como consumido y luego llamará a cualquier programa o script que desee.

xpc_set_event_stream_handler debe estar compilado (probablemente necesitarás xcode o las herramientas de línea de comandos xcode instaladas si no lo estás ya). Yo lo hice con:

cd /tmp
git clone https://github.com/snosrap/xpc_set_event_stream_handler
cd xpc_set_event_stream_handler/xpc_set_event_stream_handler
gcc -framework Foundation -o xpc_set_event_stream_handler main.m
sudo mv xpc_set_event_stream_handler /usr/local/bin/

Luego creé un script con mi comando m1ddc deseado para cambiar de pantalla y lo guardé en /usr/local/bin/kvm-switch-attached :

#!/bin/bash
/usr/local/bin/m1ddc display 1 set input 27

Luego lo marqué como ejecutable con chmod +x /usr/local/bin/kvm-switch-attached

A continuación he creado mi plist launchd en /Library/LaunchDaemons/com.kvm-switch-attached.plist :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.KVMSwitchAttached</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/xpc_set_event_stream_handler</string>
        <string>/usr/local/bin/kvm-switch-attached</string>
    </array>
    <key>LaunchEvents</key>
    <dict>
        <key>com.apple.iokit.matching</key>
        <dict>
            <key>com.KVMSwitchAttached.Event</key>
            <dict>
                <key>idVendor</key>
                <integer>8523</integer>
                <key>idProduct</key>
                <integer>29264</integer>
                <key>IOProviderClass</key>
                <string>IOUSBDevice</string>
                <key>IOMatchLaunchStream</key>
                <true/>
            </dict>
        </dict>
    </dict>
</dict>
</plist>

Obtuve los valores idVendor e idProduct de System Infomation y los convertí de su representación hexadecimal a decimal utilizando un conversor en línea.

He registrado el plist launchd con sudo launchctl load /Library/LaunchDaemons/com.kvm-switch-attached.plist .

No pude encontrar una buena manera de desencadenar una desconexión script del hub usb del KVM. Así que en lugar de eso hice algo similar en mi portátil Ubuntu y conseguí que cambiara de entrada cuando el hub estuviera conectado. Usé Solución de u/MortimerErnest aunque como se puede ver en mi comentario Lo he simplificado un poco.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X