Chuyển sang HDMI Audio khi HDMI được cắm vào máy tính xách tay (14.04)


12

Tôi đang cố gắng để máy tính xách tay của mình chuyển âm thanh sang HDMI khi được cắm và trở lại tín hiệu tương tự tiêu chuẩn khi bị loại bỏ.

Tôi đã thiết lập quy tắc udev để kích hoạt tập lệnh để thực hiện chuyển đổi, tuy nhiên tôi đang gặp vấn đề khiến nó hoạt động:

  • Dường như cho đến khi tôi chọn đầu ra Âm thanh HDMI trong Cài đặt âm thanh, nó sẽ không được nhận dạng là mức chìm có sẵn, cũng như khi đầu ra Âm thanh HDMI được chọn, đầu ra analog không còn được liệt kê.

Xem dưới đây:

# HDMI plugged in, not selected in Sound settings.
$ pactl list short sinks 
5   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI selected in sound settings    
$ pactl list short sinks 
7   alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI removed
$ pactl list short sinks 
9   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED

Kịch bản tôi đang sử dụng để chuyển đổi đầu ra như sau:

#!/bin/bash
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done-server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

Kịch bản đưa ra lỗi về việc không có bồn rửa như vậy khi tôi kích hoạt nó trước khi tôi chọn HDMI trong cài đặt âm thanh.


Câu trả lời:


9
  1. Kiểm tra thẻ và hồ sơ có sẵn

    pactl list cards
    
  2. Thêm lệnh sau vào tập lệnh để thay đổi cấu hình trước khi đặt luồng chìm và di chuyển mặc định

    pactl [options] set-card-profile  CARD PROFILE
    

(Vì vậy, không cần phải chuyển đổi thủ công từ Cài đặt âm thanh)

Tài liệu tham khảo:

pactl -h & man pactl


9

Có trụ sở tại này liên kết và điều này liên kết ... tôi thử nghiệm và hoạt động tốt Ubuntu 14.04

bạn nên tạo một quy tắc trong /etc/udev/rules.d/100-hdmi_sound.rules

với nội dung này

SUBSYSTEM=="drm", ACTION=="change", RUN+="/lib/udev/hdmi_sound_toggle.sh"

sau đó tạo

sudo -H gedit /lib/udev/hdmi_sound_toggle.sh

với nội dung của bạn

#!/bin/bash

HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

Tôi hy vọng có thể giúp .. xin lỗi cho tiếng Anh của tôi, tôi đã nói tiếng Tây Ban Nha


4

Tôi đã có một chút rắc rối sau việc này. Tôi đã sao chép tập lệnh gốc và sửa đổi nó theo đề xuất và bây giờ nó hoạt động.

Tôi bao gồm nó ở đây để giúp người khác sử dụng dễ dàng hơn.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

Bây giờ, tôi chỉ muốn kích hoạt nó với udev, nhưng tôi không biết làm thế nào để làm điều đó.


1
Điều này không hoạt động trong 16.04. Tôi đang làm việc trên nó một lần nữa.
Joe

3

Các tập lệnh được cung cấp không hoạt động với tôi với udev ngoài hộp trên Ubuntu 14.04, tôi phải thêm:

export DISPLAY=:0

lúc đầu, chuyển đổi hai lệnh pacmd thành pactl và cuối cùng chạy tập lệnh bằng sudo -s -u (người dùng) từ quy tắc udev.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

export DISPLAY=:0

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pactl list sink-inputs | grep Input | awk '{print $3}' | sed -r 's/^.{1}//')

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

2

Chà, tất cả các tập lệnh được cung cấp không hoạt động với tôi (Ubuntu 16.04), nhưng tôi đã tìm thấy chỉ báo ứng dụng này cho phép bạn thay đổi âm thanh phát ra chỉ bằng một cú nhấp chuột:

https://github.com/lkettenb/sound-output-switcher

(lưu ý: bạn cần phải cài đặt gói appindicator đầu tiên: sudo apt-get install python-appindicator)

Chỉ cần nghĩ rằng tôi để điều này ở đây cho những người khác có thể ở trong hoàn cảnh tương tự như tôi, mặc dù đó là một giải pháp thay thế ... nhưng nó làm cho nó khá dễ dàng và nó rời rạc ;-)


0

Một lần nữa, một giải pháp khác (đã được thử nghiệm trong 16.04) dựa trên trước đó nhưng với một số cải tiến hoạt động bằng cách sử dụng đúng pactltrỏ đến đúng máy chủ (có thể được cải thiện để tự động lấy tên của thẻ và hồ sơ, tham khảo pactl listhoặc pactl infongay bây giờ).

#!/bin/bash

USER_NAME=$(who | grep tty$(sudo fgconsole) | cut -f1 -d' ')
USER_ID=$(id -u "$USER_NAME")
HDMI_STATUS=$(</sys/class/drm/card0/*HDMI*/status)

HDMI_CARD="pci-0000_00_03.0"
HDMI_PROFILE="hdmi-stereo-extra1"

INTERNAL_CARD="pci-0000_00_1b.0"
INTERNAL_PROFILE="analog-stereo"

export LANG=C
export PULSE_SERVER="unix:/run/user/$USER_ID/pulse/native"

function pactl_cmd() {
  sudo -u $USER_NAME pactl --server $PULSE_SERVER $*
}

if [ "$HDMI_STATUS" = "connected" ]; then
  CARD=$HDMI_CARD
  OUTPUT=$HDMI_PROFILE
else
  CARD=$INTERNAL_CARD
  OUTPUT=$INTERNAL_PROFILE
fi

pactl_cmd set-default-sink alsa_output.$CARD.$OUTPUT
pactl_cmd set-card-profile alsa_card.$CARD output:$OUTPUT

INPUTS=($(pactl_cmd list sink-inputs | grep "^Sink Input #"|cut -d# -f2))
for i in ${INPUTS[*]}; do
  pactl_cmd move-sink-input $i alsa_output.$CARD.$OUTPUT
done

Ý chính liên quan là ở đây .


Tôi đã có kịch bản tương tự hoạt động bằng cách sử dụng card0nhưng một ngày nó chuyển sang card1vì vậy tôi đã thay đổi tập lệnh và ngày hôm sau nó đổi lại card0. Cuối cùng, tôi đã thay đổi mã thành card*và tất cả đều ổn kể từ đó. Chỉ cần ngẩng cao đầu nếu có điều gì đó tương tự xảy ra với bạn.
WinEunuuchs2Unix

0

Các tập lệnh Udev chạy bằng root, nhưng bạn cũng phải biết trình quản lý hiển thị nào bạn đang sử dụng. Kịch bản này sẽ hoạt động, nhưng bạn phải ủy quyền cho trình quản lý hiển thị của nó để thực hiện.

Tìm DM bạn đang sử dụng:

pgrep -a Xorg

Xem tùy chọn -auth, nó sẽ hiển thị cho bạn trình quản lý hiển thị. Nó có thể là sddm ou lightdm trong các bản phát hành Ubuntu mới nhất.

Dòng này phải được xuất dưới dạng biến XAUTHORITY, như thế này:

ls /car/run/sddm*

ví dụ, đây có thể là một đầu ra hợp lệ:

/var/lib/mdm/ 0.Xauth (Điều này sẽ được sử dụng bởi tập lệnh)

Đây là cách kịch bản của bạn phải trông như thế nào:

#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=`ls /var/run/sddm*`
HDMI_STATUS="$(cat /sys/class/drm/card0-HDMI-A-1/status)"
USER=`whoami`
export XAUTHORITY=/home/$USER/.Xauthority
export DISPLAY=:0

if [ "$HDMI_STATUS" = connected ];
then
    sudo -u $USER pactl set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
    sudo -u $USER pactl set-card-profile 0 output:analog-stereo+input:analog-stereo
fi
exit 0

Điều này sẽ cho phép trình quản lý hiển thị của bạn thay đổi đầu ra HDMI. Thực hiện theo các nội dung để tạo các tệp quy tắc udev và để thực thi tập lệnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.