Z korzyścią dla ludzi, którzy natkną się na to pytanie - rozwiązanie Salem prawie dla mnie zadziałało w 13.04, skończyło się na zbieraniu kawałków z całej sieci, myślę, że przełomem dla mnie był brak zmiennej środowiskowej PULSE_SERVER
Oto moje pełne rozwiązanie, które w zasadzie powtarza rozwiązanie Salema z kilkoma brakującymi elementami. Zredagowałem go również jako skrypt powłoki (pomimo mojej miłości do Pythona), ponieważ początkowo obawiałem się, że mój skrypt w Pythonie ma problemy ze ścieżką importu:
(to samo co odpowiedź Salema) Utwórz plik /etc/udev/rules.d/hdmi_sound.rules
jako root z zawartością:
SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"
Utwórz plik /usr/local/bin/hdmi_sound_toggle
jako root z zawartością:
#!/bin/sh
USER_NAME=`who | grep "(:0)" | cut -f 1 -d ' '`
USER_ID=`id -u $USER_NAME`
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
export PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native"
if [ $HDMI_STATUS = "connected" ]
then
sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi
Następnie uczyń go wykonywalnym za pomocą chmod 0755 /usr/local/bin/hdmi_sound_toggle
Próbowałem uczynić ten skrypt tak ogólnym, jak to możliwe, ale nadal może być konieczna zmiana niektórych wierszy, takich jak ścieżka pliku HDMI_STATUS lub użyte profile. Możesz zobaczyć listę profili, uruchamiając pactl list cards
i przeglądając profile.
Zauważ, że skrypt nie powiódł się, gdy usunąłem słowo kluczowe „eksport” podczas ustawiania PULSE_SERVER, myślę, że pactl szuka zmiennej env
Nie zapomnij załadować ponownie reguł udev: sudo udevadm control --reload-rules
Zaktualizuj ten skrypt został zaktualizowany do wersji 14.04. Wcześniej wszędzie używałbyś USER_NAME zamiast USER_ID