Beralih ke Audio HDMI saat HDMI dicolokkan ke laptop (14.04)

12

Saya mencoba membuat laptop saya untuk mengganti audio ke HDMI saat dicolokkan, dan kembali ke analog standar saat dilepas.

Saya membuat aturan udev untuk memicu skrip untuk melakukan peralihan, namun saya mengalami masalah saat menjalankannya:

  • Tampaknya sampai saya memilih output Audio HDMI di Pengaturan Suara, itu tidak dikenali sebagai wastafel yang tersedia, juga setelah output Audio HDMI dipilih, output analog tidak lagi terdaftar.

Lihat di bawah ini:

# 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

Script yang saya gunakan toggle output adalah sebagai berikut:

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

Script memberikan kesalahan tentang tidak ada wastafel seperti itu ketika saya memicu sebelum saya memilih HDMI dalam pengaturan suara.

Kingamajick
sumber

Jawaban:

9
  1. Periksa kartu & profil yang tersedia

    pactl list cards
    
  2. Tambahkan perintah berikut ke skrip untuk mengubah profil sebelum mengatur bak default & stream bergerak

    pactl [options] set-card-profile  CARD PROFILE
    

(Jadi tidak perlu beralih secara manual dari Pengaturan Suara)

Referensi:

pactl -h & man pactl

user.dz
sumber
9

Berbasis di ini Link dan ini Link ... i diuji dan bekerja dengan baik ubuntu 14.04

Anda harus membuat aturan di /etc/udev/rules.d/100-hdmi_sound.rules

dengan konten ini

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

lalu buat

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

dengan konten Anda

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

Saya harap dapat membantu .. maaf untuk bahasa inggris saya saya berbicara bahasa spanyol

Sk.
sumber
4

Saya mengalami sedikit kesulitan untuk mengikuti ini. Saya menyalin naskah asli dan memodifikasinya seperti yang disarankan dan sekarang berfungsi.

Saya memasukkannya di sini untuk memudahkan orang lain menggunakannya.

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

Sekarang, saya hanya ingin memicunya dengan udev, tapi saya tidak tahu bagaimana melakukannya.

Joe
sumber
1
Ini tidak berfungsi di 16.04. Saya sedang mengerjakannya lagi.
Joe
3

Skrip yang disediakan tidak berfungsi untuk saya dengan udev di luar kotak pada Ubuntu 14.04, saya harus menambahkan:

export DISPLAY=:0

di awal, konversikan dua perintah pacmd ke pactl dan akhirnya jalankan skrip menggunakan sudo -s -u (pengguna) dari aturan 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
Ken
sumber
2

Ya, semua skrip yang disediakan tidak berfungsi untuk saya (Ubuntu 16.04), tetapi saya menemukan indikator aplikasi ini yang memungkinkan Anda untuk mengubah output suara hanya dalam satu klik:

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

(catatan: Anda perlu menginstal paket appindicator pertama: sudo apt-get install python-appindicator)

Hanya berpikir saya akan meninggalkan ini di sini untuk orang lain yang mungkin berada dalam situasi yang sama dengan saya, meskipun ini merupakan solusi alternatif ... tapi itu membuatnya sangat mudah dan itu terpisah ;-)

Nat Azodnem
sumber
0

Sekali lagi solusi lain (diuji bekerja pada 16,04) berdasarkan sebelumnya tetapi dengan beberapa perbaikan yang berfungsi menggunakan pactlmenunjuk tepat ke server yang tepat (dapat ditingkatkan untuk secara otomatis mendapatkan nama kartu dan profil, merujuk ke pactl listatau pactl infountuk saat ini).

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

Intisari terkait ada di sini .

Treviño
sumber
Saya memiliki skrip serupa yang berfungsi menggunakan card0tetapi suatu hari beralih ke card1jadi saya mengubah skrip kemudian hari berikutnya berubah kembali ke card0. Pada akhirnya saya mengubah kode card*dan semuanya baik-baik saja sejak itu. Hanya kepala jika sesuatu yang serupa terjadi pada Anda.
WinEunuuchs2Unix
0

Skrip Udev dijalankan sebagai root, tetapi Anda juga harus tahu pengelola tampilan mana yang Anda gunakan. Skrip ini harus berfungsi, tetapi Anda harus mengesahkan manajer tampilan untuk melakukannya.

Temukan DM yang Anda gunakan:

pgrep -a Xorg

Lihat opsi -auth, itu akan menampilkan manajer tampilan. Ini bisa berupa sddm atau lightdm dalam rilis Ubuntu terbaru.

Baris ini harus diekspor sebagai variabel XAUTHORITY, seperti ini:

ls /car/run/sddm*

misalnya, ini bisa menjadi output yang valid:

/var/lib/mdm/*.Xauth (Ini akan digunakan oleh skrip)

Seperti inilah bentuk skrip Anda:

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

Ini akan memungkinkan manajer display Anda untuk mengubah output HDMI. Ikuti petunjuk untuk membuat file aturan udev dan membuat skrip dapat dieksekusi.

LinuxHelper
sumber