สลับเป็นเสียง HDMI เมื่อต่อ HDMI กับแล็ปท็อป (14.04)


12

ฉันพยายามให้แล็ปท็อปเปลี่ยนเสียงเป็น HDMI เมื่อเสียบปลั๊กและกลับไปเป็นอะนาล็อกมาตรฐานเมื่อถอดออก

ฉันตั้งค่ากฎ udev เพื่อเรียกสคริปต์เพื่อทำการสลับ แต่ฉันมีปัญหาในการทำให้มันทำงาน:

  • ปรากฏว่าจนกว่าฉันจะเลือกสัญญาณเสียง HDMI ในการตั้งค่าเสียงจะไม่ได้รับการยอมรับว่าเป็นอ่างล้างมือที่มีอยู่เช่นกันเมื่อเลือกสัญญาณเสียง HDMI แล้วสัญญาณอะนาล็อกจะไม่ปรากฏอีกต่อไป

ดูด้านล่าง:

# 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

สคริปต์ที่ฉันใช้สลับผลลัพธ์เป็นดังนี้:

#!/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

สคริปต์ให้ข้อผิดพลาดเกี่ยวกับการไม่จมเมื่อฉันเรียกใช้ก่อนที่ฉันจะเลือก HDMI ในการตั้งค่าเสียง


2
มีหัวข้อ similair ว่าเวลาที่ผ่านมาเป็นhttp://askubuntu.com/questions/317762/is-it-possible-to-automatically-switch-to-hdmi-sound-output-13-04 reffering เพื่อการสนทนาที่นี่: http : //lists.freedesktop.org/archives/pulseaudio-discuss/2012-March/013009.html
pgr

คำตอบ:


9
  1. ตรวจสอบการ์ดและโปรไฟล์ที่มีอยู่

    pactl list cards
    
  2. เพิ่มคำสั่งต่อไปนี้ลงในสคริปต์เพื่อเปลี่ยนโปรไฟล์ก่อนที่จะตั้งค่า sink และสตรีมแบบเริ่มต้น

    pactl [options] set-card-profile  CARD PROFILE
    

(ไม่จำเป็นต้องสลับด้วยตนเองจากการตั้งค่าเสียง)

อ้างอิง:

pactl -h & man pactl


9

อยู่ในนี้การเชื่อมโยงและการเชื่อมโยง ... ฉันผ่านการทดสอบและปรับการทำงาน Ubuntu 14.04

คุณควรสร้างกฎ /etc/udev/rules.d/100-hdmi_sound.rules

ซึ่งเนื้อหานี้

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

จากนั้นสร้าง

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

whith เนื้อหาของคุณ

#!/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

ฉันหวังว่าสามารถช่วย .. ขอโทษสำหรับภาษาอังกฤษของฉันฉันพูดภาษาสเปน


4

ฉันมีปัญหาเล็กน้อยในการติดตามสิ่งนี้ ฉันคัดลอกสคริปต์ดั้งเดิมและแก้ไขตามที่แนะนำและตอนนี้ก็ใช้ได้

ฉันรวมมันไว้ที่นี่เพื่อทำให้คนอื่นใช้ง่ายขึ้น

#!/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

ตอนนี้ฉันแค่อยากจะเรียกมันด้วย udev แต่ฉันไม่รู้จะทำยังไง


1
สิ่งนี้ใช้ไม่ได้ใน 16.04 ฉันกำลังทำงานอีกครั้ง
Joe

3

สคริปต์ที่ให้มาไม่ได้ทำงานสำหรับฉันด้วย udev จากกล่องบน Ubuntu 14.04 ฉันต้องเพิ่ม:

export DISPLAY=:0

ที่จุดเริ่มต้นแปลงคำสั่ง pacmd สองคำสั่งเป็น pactl และในที่สุดก็รันสคริปต์โดยใช้ sudo -s -u (ผู้ใช้) จากกฎ 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

สคริปต์ที่ให้มาทั้งหมดนั้นใช้งานไม่ได้สำหรับฉัน (Ubuntu 16.04) แต่ฉันพบตัวบ่งชี้แอพนี้ที่ให้คุณเปลี่ยนเสียงได้ด้วยคลิกเดียว:

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

(หมายเหตุ: คุณต้องติดตั้งแพคเกจ appindicator แรก: sudo apt-get install python-appindicator)

แค่คิดว่าฉันจะออกจากที่นี่เพื่อคนอื่นที่อาจตกอยู่ในสถานการณ์เดียวกับฉันแม้ว่ามันจะเป็นทางเลือกอื่น ... แต่มันทำให้มันง่ายและมันก็ไม่ต่อเนื่อง ;-)


0

อีกวิธีแก้ปัญหาอื่น (ทดสอบการทำงานใน 16.04) ตามก่อนหน้านี้ แต่มีการปรับปรุงบางอย่างที่ทำงานโดยใช้การpactlชี้ไปยังเซิร์ฟเวอร์ที่เหมาะสม (สามารถปรับปรุงเพื่อรับชื่อการ์ดและโปรไฟล์โดยอัตโนมัติอ้างอิงpactl listหรือpactl infoตอนนี้)

#!/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

ที่เกี่ยวข้องสรุปสาระสำคัญอยู่ที่นี่


ฉันมีสคริปต์ที่คล้ายกันที่ทำงานโดยใช้card0แต่วันหนึ่งมันเปลี่ยนไปดังนั้นผมจึงเปลี่ยนสคริปต์แล้ววันต่อมามันเปลี่ยนกลับไปเป็นcard1 card0ในที่สุดฉันเปลี่ยนรหัสเป็นcard*และทั้งหมดเป็นอย่างดีตั้งแต่นั้นมา เพียงแค่หัวขึ้นหากสิ่งที่คล้ายกันเกิดขึ้นกับคุณ
WinEunuuchs2Unix

0

สคริปต์ Udev ทำงานเป็นรูท แต่คุณต้องรู้ว่าผู้จัดการดิสเพลย์ใดที่คุณใช้อยู่ สคริปต์นี้ควรใช้งานได้ แต่คุณต้องอนุญาตให้ตัวจัดการการแสดงผลทำงานได้

ค้นหา DM ที่คุณใช้:

pgrep -a Xorg

ดูตัวเลือก -auth มันจะแสดงตัวจัดการการแสดงผลให้คุณ มันอาจเป็น sddm ou lightdm ใน Ubuntu รุ่นล่าสุด

บรรทัดนี้จะต้องส่งออกเป็นตัวแปร XAUTHORITY เช่นนี้

ls /car/run/sddm*

เช่นนี้อาจเป็นผลลัพธ์ที่ถูกต้อง:

/var/lib/mdm/==.Xauth (สคริปต์นี้จะใช้)

นี่คือลักษณะของสคริปต์ของคุณ:

#!/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

สิ่งนี้จะทำให้ตัวจัดการหน้าจอของคุณเปลี่ยนเอาต์พุต HDMI ติดตาม insctuctions เพื่อสร้างไฟล์กฎ udev และเพื่อให้สคริปต์เรียกทำงานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.